Enabled printing of sector bitmaps by use=sector_map

This commit is contained in:
2008-08-15 15:55:35 +00:00
parent afc27f89fe
commit c6c82c8333
5 changed files with 137 additions and 36 deletions

View File

@ -2792,23 +2792,23 @@ int Spotlist_get_item(struct SpotlisT *o, int idx,
char *Spotlist__quality_name(int quality, char name[80], int flag)
{
if(quality == Xorriso_read_quality_gooD)
strcpy(name, "good");
strcpy(name, "+ good");
else if(quality == Xorriso_read_quality_sloW)
strcpy(name, "slow");
strcpy(name, "+ slow");
else if(quality == Xorriso_read_quality_partiaL)
strcpy(name, "partial");
strcpy(name, "+ partial");
else if(quality == Xorriso_read_quality_valiD)
strcpy(name, "valid");
else if(quality == Xorriso_read_quality_invaliD)
strcpy(name, "invalid");
else if(quality == Xorriso_read_quality_tao_enD)
strcpy(name, "tao end");
else if(quality == Xorriso_read_quality_off_tracK)
strcpy(name, "off track");
strcpy(name, "+ valid");
else if(quality == Xorriso_read_quality_untesteD)
strcpy(name, "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, "- tao end");
else if(quality == Xorriso_read_quality_off_tracK)
strcpy(name, "- off track");
else if(quality == Xorriso_read_quality_unreadablE)
strcpy(name, "unreadable");
strcpy(name, "- unreadable");
else
sprintf(name, "0x%8.8X", (unsigned) quality);
return(name);
@ -3118,14 +3118,14 @@ int Checkmediajob_new(struct CheckmediajoB **o, int flag)
if(m==NULL)
return(-1);
*o= m;
m->use_outdev= 0;
m->use_dev= 0;
m->min_lba= -1;
m->max_lba= -1;
m->min_block_size= 16;
m->mode= 0;
m->start_time= time(NULL);
m->time_limit= -1;
m->item_limit= -1;
m->time_limit= 28800;
m->item_limit= 100000;
strcpy(m->abort_file_path, "/var/opt/xorriso/do_abort_check_media");
m->data_to_path[0]= 0;
m->data_to_fd= -1;
@ -8818,6 +8818,70 @@ int Xorriso_spotlist_to_sectormap(struct XorrisO *xorriso,
}
int Xorriso_sectormap_to_spotlist(struct XorrisO *xorriso,
struct CheckmediajoB *job,
struct SpotlisT **spotlist,
int flag)
{
struct SectorbitmaP *map;
int ret, i, sectors, sector_size, value, old_value= -1, old_start= -1;
map= job->sector_map;
if(map == NULL)
return(-1);
ret= Spotlist_new(spotlist, 0);
if(ret <= 0)
{ret= -1; goto ex;}
Sectorbitmap_get_layout(map, &sectors, &sector_size, 0);
sector_size/= 2048;
if(job->max_lba >= 0)
sectors= (job->max_lba + 1) / sector_size;
i= 0;
if(job->min_lba >= 0)
i= job->min_lba / sector_size;
for(; i < sectors; i++) {
value= Sectorbitmap_is_set(map, i, 0);
if(value == old_value)
continue;
if(old_value >= 0) {
ret= Spotlist_add_item(*spotlist, old_start, i * sector_size - old_start,
(old_value ? Xorriso_read_quality_valiD :
Xorriso_read_quality_invaliD), 0);
if(ret <= 0)
goto ex;
if(job->item_limit > 0 &&
Spotlist_count(*spotlist, 0) + 1 >= job->item_limit) {
sprintf(xorriso->info_text, "-check_media: Reached item_limit=%d",
job->item_limit);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
if(sectors - i > 1) {
ret= Spotlist_add_item(*spotlist, i * sector_size,
(sectors - i - 1) * sector_size,
Xorriso_read_quality_untesteD, 0);
if(ret <= 0)
goto ex;
}
ret= 2; goto ex;
}
}
old_value= value;
old_start= i * sector_size;
}
if(old_value >= 0) {
ret= Spotlist_add_item(*spotlist, old_start, i * sector_size - old_start,
(old_value ? Xorriso_read_quality_valiD :
Xorriso_read_quality_invaliD), 0);
if(ret <= 0)
goto ex;
}
ret= 1;
ex:;
if(ret <= 0)
Spotlist_destroy(spotlist, 0);
return(ret);
}
int Xorriso_afile_fopen(struct XorrisO *xorriso,
char *filename, char *mode, FILE **ret_fp, int flag)
/*
@ -9402,7 +9466,7 @@ int Xorriso_option_check_media(struct XorrisO *xorriso,
int argc, char **argv, int *idx, int flag)
{
int ret, i, count, lba, blocks, quality;
int end_idx, old_idx;
int end_idx, old_idx, os_errno;
char quality_name[80];
double num;
struct SpotlisT *spotlist= NULL;
@ -9467,9 +9531,11 @@ int Xorriso_option_check_media(struct XorrisO *xorriso,
job->item_limit= num;
} else if(strncmp(argv[i], "use=", 4) == 0) {
if(strcmp(argv[i] + 4, "outdev") == 0)
job->use_outdev= 1;
job->use_dev= 1;
else if(strcmp(argv[i] + 4, "indev") == 0)
job->use_outdev= 0;
job->use_dev= 0;
else if(strcmp(argv[i] + 4, "sector_map") == 0)
job->use_dev= 2;
else
goto unknown_value;
} else if(strncmp(argv[i], "what=", 5) == 0) {
@ -9490,9 +9556,30 @@ unknown_value:;
ret= 0; goto ex;
}
}
ret= Xorriso_check_media(xorriso, &spotlist, job, 0);
if(ret <= 0)
goto ex;
if(job->use_dev == 2) {
if(job->sector_map_path[0] == 0) {
sprintf(xorriso->info_text,
"-check_media: option use=sector_map but sector_map=''");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
ret= 0; goto ex;
}
ret= Sectorbitmap_from_file(&(job->sector_map), job->sector_map_path,
xorriso->info_text, &os_errno, 0);
if(ret <= 0) {
if(xorriso->info_text[0])
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, os_errno,
"FAILURE", 0);
goto ex;
}
ret= Xorriso_sectormap_to_spotlist(xorriso, job, &spotlist, 0);
if(ret <= 0)
goto ex;
} else {
ret= Xorriso_check_media(xorriso, &spotlist, job, 0);
if(ret <= 0)
goto ex;
}
sprintf(xorriso->result_line,
"MCL layout : lba , size , quality\n");