New -check_media sub options bad_limit=, slow_limit=, chunk_size=

This commit is contained in:
2009-09-30 09:25:34 +00:00
parent dec92c32cc
commit 2c43e3ae76
5 changed files with 161 additions and 52 deletions

View File

@ -4193,8 +4193,9 @@ int Spotlist_add_item(struct SpotlisT *o, int start_lba, int blocks,
(o->list_count)++;
if(debug_verbous) {char quality_name[80];
fprintf(stderr, "debug: lba %10d , size %10d , quality %s\n",
start_lba, blocks, Spotlist__quality_name(quality, quality_name, 0));
fprintf(stderr, "debug: lba %10d , size %10d , quality '%s'\n",
start_lba, blocks, Spotlist__quality_name(quality, quality_name,
Xorriso_read_quality_invaliD, 0) + 2);
}
return(1);
@ -4262,32 +4263,41 @@ int Spotlist_get_item(struct SpotlisT *o, int idx,
}
char *Spotlist__quality_name(int quality, char name[80], int flag)
char *Spotlist__quality_name(int quality, char name[80], int bad_limit,
int flag)
{
if(quality == Xorriso_read_quality_gooD)
strcpy(name, "+ good");
else if(quality == Xorriso_read_quality_md5_matcH)
strcpy(name, "+ md5_match");
else if(quality == Xorriso_read_quality_sloW)
strcpy(name, "+ slow");
else if(quality == Xorriso_read_quality_partiaL)
strcpy(name, "+ partial");
else if(quality == Xorriso_read_quality_valiD)
strcpy(name, "+ valid");
else if(quality == Xorriso_read_quality_untesteD)
strcpy(name, "0 untested");
else if(quality == Xorriso_read_quality_invaliD)
strcpy(name, "- invalid");
else if(quality == Xorriso_read_quality_tao_enD)
strcpy(name, "0 tao end");
else if(quality == Xorriso_read_quality_off_tracK)
strcpy(name, "0 off track");
else if(quality == Xorriso_read_quality_md5_mismatcH)
strcpy(name, "- md5_mismatch");
else if(quality == Xorriso_read_quality_unreadablE)
strcpy(name, "- unreadable");
if(quality == Xorriso_read_quality_untesteD ||
quality == Xorriso_read_quality_tao_enD ||
quality == Xorriso_read_quality_off_tracK)
strcpy(name, "0 ");
else if(quality <= bad_limit)
strcpy(name, "- ");
else
sprintf(name, "0x%8.8X", (unsigned) quality);
strcpy(name, "+ ");
if(quality == Xorriso_read_quality_gooD)
strcat(name, "good");
else if(quality == Xorriso_read_quality_md5_matcH)
strcat(name, "md5_match");
else if(quality == Xorriso_read_quality_sloW)
strcat(name, "slow");
else if(quality == Xorriso_read_quality_partiaL)
strcat(name, "partial");
else if(quality == Xorriso_read_quality_valiD)
strcat(name, "valid");
else if(quality == Xorriso_read_quality_untesteD)
strcat(name, "untested");
else if(quality == Xorriso_read_quality_invaliD)
strcat(name, "invalid");
else if(quality == Xorriso_read_quality_tao_enD)
strcat(name, "tao_end");
else if(quality == Xorriso_read_quality_off_tracK)
strcat(name, "off_track");
else if(quality == Xorriso_read_quality_md5_mismatcH)
strcat(name, "md5_mismatch");
else if(quality == Xorriso_read_quality_unreadablE)
strcat(name, "unreadable");
else
sprintf(name, "0 0x%8.8X", (unsigned int) quality);
return(name);
}
@ -4625,7 +4635,7 @@ int Checkmediajob_new(struct CheckmediajoB **o, int flag)
m->use_dev= 0;
m->min_lba= -1;
m->max_lba= -1;
m->min_block_size= 16;
m->min_block_size= 0;
m->mode= 0;
m->start_time= time(NULL);
m->time_limit= 28800;
@ -4643,6 +4653,8 @@ int Checkmediajob_new(struct CheckmediajoB **o, int flag)
m->retry= 0;
m->report_mode= 0;
strcpy(m->event_severity, "ALL");
m->slow_threshold_seq= 1.0;
m->untested_valid= 0;
return(1);
}
@ -4683,6 +4695,8 @@ int Checkmediajob_copy(struct CheckmediajoB *from, struct CheckmediajoB *to,
to->retry= from->retry;
to->report_mode= from->report_mode;
strcpy(to->event_severity, from->event_severity);
to->slow_threshold_seq= from->slow_threshold_seq;
to->untested_valid= from->untested_valid;
return(1);
}
@ -4788,6 +4802,7 @@ int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag)
m->no_volset_present= 0;
m->in_sector_map= NULL;
m->check_media_default= NULL;
m->check_media_bad_limit= Xorriso_read_quality_invaliD;
m->outdev[0]= 0;
m->out_drive_handle= NULL;
m->out_charset= NULL;
@ -6360,10 +6375,41 @@ int Xorriso_check_media_setup_job(struct XorrisO *xorriso,
ret= Sfile_str(job->abort_file_path, argv[i] + 11, 0);
if(ret <= 0)
goto ex;
} else if(strncmp(argv[i], "bad_limit=", 10) == 0) {
if(strcmp(argv[i] + 10, "good") == 0)
xorriso->check_media_bad_limit= Xorriso_read_quality_gooD;
else if(strcmp(argv[i] + 10, "md5_match") == 0)
xorriso->check_media_bad_limit= Xorriso_read_quality_md5_matcH;
else if(strcmp(argv[i] + 10, "slow") == 0)
xorriso->check_media_bad_limit= Xorriso_read_quality_sloW;
else if(strcmp(argv[i] + 10, "partial") == 0)
xorriso->check_media_bad_limit= Xorriso_read_quality_partiaL;
else if(strcmp(argv[i] + 10, "valid") == 0)
xorriso->check_media_bad_limit= Xorriso_read_quality_valiD;
else if(strcmp(argv[i] + 10, "untested") == 0)
xorriso->check_media_bad_limit= Xorriso_read_quality_untesteD;
else if(strcmp(argv[i] + 10, "invalid") == 0)
xorriso->check_media_bad_limit= Xorriso_read_quality_invaliD;
else if(strcmp(argv[i] + 10, "tao_end") == 0)
xorriso->check_media_bad_limit= Xorriso_read_quality_tao_enD;
else if(strcmp(argv[i] + 10, "off_track") == 0)
xorriso->check_media_bad_limit= Xorriso_read_quality_off_tracK;
else if(strcmp(argv[i] + 10, "md5_mismatch") == 0)
xorriso->check_media_bad_limit= Xorriso_read_quality_md5_mismatcH;
else if(strcmp(argv[i] + 10, "unreadable") == 0)
xorriso->check_media_bad_limit= Xorriso_read_quality_unreadablE;
else
goto unknown_value;
} else if(strncmp(argv[i], "data_to=", 8) == 0) {
ret= Sfile_str(job->data_to_path, argv[i] + 8, 0);
if(ret <= 0)
goto ex;
} else if(strncmp(argv[i], "chunk_size=", 11) == 0) {
num= Scanf_io_size(argv[i] + 11, 1);
if(num >= 2048 || num == 0)
job->min_block_size= num / 2048;
else
goto unknown_value;
} else if(strncmp(argv[i], "event=", 6) == 0) {
strncpy(sev_text, argv[i] + 6, 19);
sev_text[19]= 0;
@ -6429,6 +6475,7 @@ int Xorriso_check_media_setup_job(struct XorrisO *xorriso,
}
Checkmediajob_copy(default_job, job, 0);
Checkmediajob_destroy(&default_job, 0);
xorriso->check_media_bad_limit= Xorriso_read_quality_invaliD;
} else if(strncmp(argv[i], "retry=", 6) == 0) {
if(strcmp(argv[i] + 6, "on") == 0)
job->retry= 1;
@ -6442,6 +6489,8 @@ int Xorriso_check_media_setup_job(struct XorrisO *xorriso,
ret= Sfile_str(job->sector_map_path, argv[i] + 11, 0);
if(ret <= 0)
goto ex;
} else if(strncmp(argv[i], "slow_limit=", 11) == 0) {
sscanf(argv[i] + 11, "%lf", &(job->slow_threshold_seq));
} else if(strncmp(argv[i], "time_limit=", 11) == 0 ||
strncmp(argv[i], "item_limit=", 11) == 0 ) {
num= -1;
@ -6452,6 +6501,18 @@ int Xorriso_check_media_setup_job(struct XorrisO *xorriso,
job->time_limit= num;
else
job->item_limit= num;
#ifdef NIX
} else if(strncmp(argv[i], "untested=", 9) == 0) {
if(strcmp(argv[i] + 9, "damaged") == 0)
job->untested_valid= 0;
if(strcmp(argv[i] + 9, "undamaged") == 0 ||
strcmp(argv[i] + 9, "ok") == 0)
job->untested_valid= 1;
else
goto unknown_value;
#endif
} else if(strncmp(argv[i], "use=", 4) == 0) {
if(strcmp(argv[i] + 4, "outdev") == 0)
job->use_dev= 1;
@ -6494,7 +6555,7 @@ int Xorriso_check_media_list_job(struct XorrisO *xorriso,
char *report, int flag)
{
int all, ret;
char default_report[161];
char default_report[161], quality_name[80];
struct CheckmediajoB *dflt= NULL;
all= !(flag&1);
@ -6557,6 +6618,14 @@ int Xorriso_check_media_list_job(struct XorrisO *xorriso,
sprintf(report + strlen(report), " report=%s",
job->report_mode == 0 ? "blocks" :
job->report_mode == 1 ? "files" : "blocks_files");
if(all || job->slow_threshold_seq != dflt->slow_threshold_seq)
sprintf(report + strlen(report), " slow_limit=%f", job->slow_threshold_seq);
if(all || xorriso->check_media_bad_limit != Xorriso_read_quality_invaliD)
sprintf(report + strlen(report), " bad_limit=%s",
Spotlist__quality_name(xorriso->check_media_bad_limit, quality_name,
Xorriso_read_quality_invaliD, 0) + 2);
if(all || job->min_block_size != dflt->min_block_size)
sprintf(report + strlen(report), " chunk_size=%ds", job->min_block_size);
if(all || strcmp(job->event_severity, "ALL") != 0)
sprintf(report + strlen(report), " event=%s", job->event_severity);
if(strlen(report) > 4 * SfileadrL)
@ -11833,7 +11902,7 @@ int Xorriso_spotlist_to_sectormap(struct XorrisO *xorriso,
int flag)
{
struct SectorbitmaP *m;
int map_sectors= -1, map_sector_size= -1;
int map_sectors= -1, map_sector_size= -1, valid;
int list_sectors, list_blocks, sector_size, sector_blocks;
int replace_map= 0, count, i, lba, blocks, quality, ret, pass;
@ -11875,20 +11944,21 @@ int Xorriso_spotlist_to_sectormap(struct XorrisO *xorriso,
}
count= Spotlist_count(spotlist, 0);
/* first set good bits, then eventueally override by bad bits */
/* first set good bits, then eventually override by bad bits */
for(pass= 0; pass < 2; pass++) {
for(i= 0; i < count; i++) {
ret= Spotlist_get_item(spotlist, i, &lba, &blocks, &quality, 0);
if(ret <= 0)
continue;
if(quality == Xorriso_read_quality_untesteD && !(flag & 1))
valid= quality > xorriso->check_media_bad_limit;
if(quality == Xorriso_read_quality_untesteD && (flag & 1))
valid= 1;
else if(pass == 0 && !valid)
continue;
if(pass == 0 && quality < Xorriso_read_quality_untesteD)
continue;
else if(pass == 1 && quality >= Xorriso_read_quality_untesteD)
else if(pass == 1 && valid)
continue;
Sectorbitmap_set_range(m, lba / sector_blocks, blocks / sector_blocks,
quality >= Xorriso_read_quality_untesteD);
valid);
}
}
if(replace_map) {
@ -13905,7 +13975,8 @@ int Xorriso_option_check_media(struct XorrisO *xorriso,
continue;
sprintf(xorriso->result_line, "%s: %10d , %10d , %s\n",
pass == 0 ? "Media region " : "MD5 tag range",
lba, blocks, Spotlist__quality_name(quality, quality_name, 0));
lba, blocks, Spotlist__quality_name(quality, quality_name,
xorriso->check_media_bad_limit, 0));
Xorriso_result(xorriso,0);
}
}
@ -14437,7 +14508,7 @@ int Xorriso_option_cpx(struct XorrisO *xorriso, int argc, char **argv,
/* only allow directories if they actually represent split data files */
ret= 0;
if(xorriso->do_concat_split)
ret= Xorriso_is_split(xorriso, eff_origin, NULL, 2);
ret= Xorriso_is_split(xorriso, eff_origin, NULL, 0);
if(ret<0)
goto problem_handler;
if(ret==0) {
@ -16147,7 +16218,8 @@ int Xorriso_option_help(struct XorrisO *xorriso, int flag)
" retry=on|off|default , data_to=filepath ,",
" sector_map=filepath , map_with_volid=on|off ,",
" patch_lba0=on|off|force|blockadr[:force] ,",
" report=blocks|files|blocks_files event=severity",
" report=blocks|files|blocks_files event=severity ,",
" bad_limit=quality , slow_limit=seconds , chunk_size=bytes",
" -check_media_defaults [options] --",
" Preset options for runs of -check_media and -extract_cut.",
"",
@ -19836,10 +19908,6 @@ next_command:;
} else if(strcmp(cmd,"test")==0) { /* This option does not exist. */
/* install temporary test code here */;
(*idx)++;
fprintf(stderr, "xorriso_DEBUG: Xorriso_is_split(%s)= %d\n",
arg1, Xorriso_is_split(xorriso, arg1, NULL, 2));
} else if(strcmp(cmd,"toc")==0) {
Xorriso_option_toc(xorriso, 0);