diff --git a/xorriso/base_obj.c b/xorriso/base_obj.c index 9a0c4239..1fa90b3f 100644 --- a/xorriso/base_obj.c +++ b/xorriso/base_obj.c @@ -324,6 +324,7 @@ int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag) m->last_update_time= 0.0; m->find_compare_result= 1; m->find_check_md5_result= 0; + m->last_abort_file_time= 0.0; m->node_counter= 0; m->node_array_size= 0; diff --git a/xorriso/drive_mgt.c b/xorriso/drive_mgt.c index d531a61f..5cc3844d 100644 --- a/xorriso/drive_mgt.c +++ b/xorriso/drive_mgt.c @@ -1536,6 +1536,7 @@ int Xorriso_scsi_log(struct XorrisO *xorriso, int flag) return(1); } + int Xorriso_check_md5_range(struct XorrisO *xorriso, off_t start_lba, off_t end_lba, char md5[16], int flag) { @@ -1615,7 +1616,31 @@ int Xorriso_check_session_md5(struct XorrisO *xorriso, char *severity, md5, 0); return(ret); } + +int Xorriso_check_for_abort(struct XorrisO *xorriso, + char *abort_file_path, + double post_read_time, + double *last_abort_file_time, int flag) +{ + struct stat stbuf; + + if(abort_file_path[0] == 0) + return(0); + if(post_read_time - *last_abort_file_time >= 0.1) { + if(stat(abort_file_path, &stbuf) != -1) { + if(stbuf.st_mtime >= xorriso->start_time) { + sprintf(xorriso->info_text, + "-check_media: Found fresh abort_file=%s", abort_file_path); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0); + return(1); + } + } + *last_abort_file_time= post_read_time; + } + return(0); +} + /* @param flag bit0= this is a follow-up session (i.e. on CD: TAO) bit1= no pacifier messages @@ -1638,7 +1663,6 @@ int Xorriso_check_interval(struct XorrisO *xorriso, struct SpotlisT *spotlist, off_t data_count, to_read, read_count= 0, write_amount; double pre_read_time, post_read_time, time_diff, total_time_diff= 0; double last_abort_file_time= 0; - struct stat stbuf; void *ctx= NULL, *cloned_ctx= NULL; char md5[16], tag_md5[16]; uint32_t pos, range_start, range_size, next_tag= 0, lba, md5_spot_lba= 0; @@ -1679,21 +1703,10 @@ int Xorriso_check_interval(struct XorrisO *xorriso, struct SpotlisT *spotlist, post_read_time= Sfile_microtime(0); for(i= 0; i < block_count; i+= to_read) { skip_reading= 0; - - if(job->abort_file_path[0]) { - if(post_read_time - last_abort_file_time >= 0.1) { - if(stat(job->abort_file_path, &stbuf) != -1) { - if(stbuf.st_mtime >= xorriso->start_time) { - sprintf(xorriso->info_text, - "-check_media: Found fresh abort_file=%s", - job->abort_file_path); - Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0); - goto abort_check; - } - } - last_abort_file_time= post_read_time; - } - } + ret= Xorriso_check_for_abort(xorriso, job->abort_file_path, post_read_time, + &last_abort_file_time, 0); + if(ret == 1) + goto abort_check; if(job->item_limit > 0 && Spotlist_count(spotlist, 0) + 2 >= job->item_limit) { sprintf(xorriso->info_text, "-check_media: Reached item_limit=%d", diff --git a/xorriso/drive_mgt.h b/xorriso/drive_mgt.h index a0f2db6d..c165d495 100644 --- a/xorriso/drive_mgt.h +++ b/xorriso/drive_mgt.h @@ -33,5 +33,10 @@ int Xorriso_get_drive_handles(struct XorrisO *xorriso, struct burn_drive **drive, char *attempt, int flag); +int Xorriso_check_for_abort(struct XorrisO *xorriso, + char *abort_file_path, + double post_read_time, + double *last_abort_file_time, int flag); + #endif /* ! Xorriso_pvt_drive_mgt_includeD */ diff --git a/xorriso/findjob.c b/xorriso/findjob.c index 7e4f4644..4770538e 100644 --- a/xorriso/findjob.c +++ b/xorriso/findjob.c @@ -378,6 +378,8 @@ int Findjob_new(struct FindjoB **o, char *start_path, int flag) goto failed; m->found_path= NULL; m->subjob= NULL; + m->errmsg[0]= 0; + m->errn= 0; ret= Exprnode_new(&(m->test_tree), m, NULL, "-find", (m->use_shortcuts)<<1); if(ret<=0) diff --git a/xorriso/read_run.c b/xorriso/read_run.c index 73c80602..ba4b0301 100644 --- a/xorriso/read_run.c +++ b/xorriso/read_run.c @@ -1975,6 +1975,14 @@ int Xorriso_check_md5(struct XorrisO *xorriso, void *in_node, char *path, xorriso->pacifier_byte_count+= rret; Xorriso_pacifier_callback(xorriso, "content bytes read", xorriso->pacifier_count, 0, "", 0); + ret= Xorriso_check_for_abort( + xorriso, + xorriso->check_media_default != NULL + ? xorriso->check_media_default->abort_file_path + : "/var/opt/xorriso/do_abort_check_media", + Sfile_microtime(0), &xorriso->last_abort_file_time, 0); + if(ret == 1) + {ret= -2; goto ex;} } ret= iso_md5_end(&ctx, data_md5); if(ret < 0) @@ -2004,11 +2012,16 @@ ex:; if(ctx != NULL) iso_md5_end(&ctx, data_md5); if(ret < 0) { - sprintf(xorriso->result_line, "NOT READABLE: "); + if(ret == -2) + sprintf(xorriso->result_line, "Aborted at: "); + else + sprintf(xorriso->result_line, "NOT READABLE: "); Text_shellsafe(path, xorriso->result_line, 1); strcat(xorriso->result_line, "\n"); if(!(flag & 1)) Xorriso_result(xorriso,0); + if(ret == -2) + xorriso->request_to_abort= 1; } return(ret); } diff --git a/xorriso/xorriso_private.h b/xorriso/xorriso_private.h index 9d21c4d0..2403a68d 100644 --- a/xorriso/xorriso_private.h +++ b/xorriso/xorriso_private.h @@ -508,6 +508,8 @@ struct XorrisO { /* the global context of xorriso */ bit3= seen match */ + double last_abort_file_time; /* most recent check for aborting -check_md5 */ + /* Tree node collection and LBA sorting facility */ int node_counter; int node_array_size; diff --git a/xorriso/xorriso_timestamp.h b/xorriso/xorriso_timestamp.h index 5e9a73fb..4090b908 100644 --- a/xorriso/xorriso_timestamp.h +++ b/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2010.11.01.191542" +#define Xorriso_timestamP "2010.11.03.081124"