New command -extract_boot_images
This commit is contained in:
@ -2792,7 +2792,7 @@ int Xorriso_check_interval(struct XorrisO *xorriso, struct SpotlisT *spotlist,
|
||||
{
|
||||
int i, j, ret, total_count= 0, sectors= -1, sector_size= -1, skip_reading;
|
||||
int prev_quality= -1, quality= -1, retry= 0, profile_no, is_cd= 0;
|
||||
int eccb_size= 16, us_corr = 0;
|
||||
int eccb_size= 16, us_corr = 0, data_skip;
|
||||
int start_sec, end_sec, first_value, fret, suspect_tao_end= 0;
|
||||
char profile_name[80];
|
||||
int start_lba= 0;
|
||||
@ -2800,7 +2800,7 @@ int Xorriso_check_interval(struct XorrisO *xorriso, struct SpotlisT *spotlist,
|
||||
struct burn_drive_info *dinfo;
|
||||
char *data= NULL, *data_pt;
|
||||
off_t data_count, to_read, read_count= 0, write_amount, skipped_to_read;
|
||||
off_t slowdown_count= 0;
|
||||
off_t slowdown_count= 0, seek_adr;
|
||||
struct timeval prev_time;
|
||||
double pre_read_time, post_read_time, time_diff, total_time_diff= 0;
|
||||
double last_abort_file_time= 0;
|
||||
@ -2823,6 +2823,7 @@ int Xorriso_check_interval(struct XorrisO *xorriso, struct SpotlisT *spotlist,
|
||||
else if(read_chunk < 1)
|
||||
read_chunk= 1;
|
||||
|
||||
data_skip= job->data_to_skip;
|
||||
num_chunks= job->async_chunks;
|
||||
if(((off_t) num_chunks) * ((off_t) read_chunk) > chunks_limit)
|
||||
num_chunks= chunks_limit / read_chunk;
|
||||
@ -2923,6 +2924,8 @@ int Xorriso_check_interval(struct XorrisO *xorriso, struct SpotlisT *spotlist,
|
||||
to_read= read_chunk;
|
||||
post_read_time= Sfile_microtime(0);
|
||||
for(i= 0; i < block_count; i+= to_read) {
|
||||
if(i != 0)
|
||||
data_skip= 0;
|
||||
skip_reading= 0;
|
||||
ret= Xorriso_check_for_abort(xorriso, job->abort_file_path, post_read_time,
|
||||
&last_abort_file_time, 0);
|
||||
@ -3069,9 +3072,9 @@ abort_check:;
|
||||
}
|
||||
}
|
||||
|
||||
write_amount= data_count;
|
||||
write_amount= data_count - data_skip;
|
||||
if(data_count > 0) {
|
||||
read_count+= data_count;
|
||||
read_count+= data_count - data_skip;
|
||||
if(job->data_to_limit >= 0 && read_count > job->data_to_limit)
|
||||
write_amount-= (read_count - job->data_to_limit);
|
||||
}
|
||||
@ -3086,21 +3089,22 @@ abort_check:;
|
||||
}
|
||||
if(write_amount > 0) {
|
||||
if(job->data_to_fd >= 0) {
|
||||
ret= 0;
|
||||
if(strcmp(job->data_to_path, "-") != 0)
|
||||
ret= lseek(job->data_to_fd,
|
||||
((off_t) (i + from_lba)) * (off_t) 2048 + job->data_to_offset,
|
||||
SEEK_SET);
|
||||
if(ret == -1) {
|
||||
seek_adr= ((off_t) (i + from_lba)) * (off_t) 2048 +
|
||||
job->data_to_skip + job->data_to_offset;
|
||||
if(strcmp(job->data_to_path, "-") != 0) {
|
||||
ret= lseek(job->data_to_fd, seek_adr, SEEK_SET);
|
||||
if(ret == -1) {
|
||||
failed_to_write:;
|
||||
sprintf(xorriso->info_text, "Cannot write %d bytes to lba %d of ",
|
||||
(int) data_count, i + from_lba);
|
||||
Text_shellsafe(job->data_to_path, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, errno,
|
||||
"FAILURE", 0);
|
||||
{ret= 0; goto ex;}
|
||||
sprintf(xorriso->info_text,
|
||||
"Cannot write %d bytes to position %.f in ",
|
||||
(int) data_count, (double) seek_adr);
|
||||
Text_shellsafe(job->data_to_path, xorriso->info_text, 1);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, errno,
|
||||
"FAILURE", 0);
|
||||
{ret= 0; goto ex;}
|
||||
}
|
||||
}
|
||||
ret= write(job->data_to_fd, data_pt, write_amount);
|
||||
ret= write(job->data_to_fd, data_pt + data_skip, write_amount);
|
||||
if(ret == -1)
|
||||
goto failed_to_write;
|
||||
}
|
||||
@ -3580,3 +3584,27 @@ int Xorriso_use_immed_bit(struct XorrisO *xorriso, int flag)
|
||||
}
|
||||
|
||||
|
||||
int Xorriso_obtain_indev_readsize(struct XorrisO *xorriso, uint32_t *blocks,
|
||||
int flag)
|
||||
{
|
||||
int ret, num_data;
|
||||
struct burn_drive_info *dinfo;
|
||||
struct burn_drive *drive;
|
||||
enum burn_disc_status s;
|
||||
|
||||
*blocks= 0;
|
||||
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
|
||||
"on attempt to determine readable size", 0);
|
||||
if(ret <= 0)
|
||||
return(0);
|
||||
s= isoburn_disc_get_status(drive);
|
||||
if(s == BURN_DISC_BLANK)
|
||||
return(1);
|
||||
ret= burn_get_read_capacity(drive, &num_data, 0);
|
||||
if(ret <= 0)
|
||||
return(0);
|
||||
*blocks= num_data;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user