Enabled printing of sector bitmaps by use=sector_map

This commit is contained in:
Thomas Schmitt 2008-08-15 15:55:35 +00:00
parent ffb0dc8e54
commit 633ecc7131
5 changed files with 137 additions and 36 deletions

View File

@ -2,7 +2,7 @@
.\" First parameter, NAME, should be all caps .\" First parameter, NAME, should be all caps
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
.\" other parameters are allowed: see man(7), man(1) .\" other parameters are allowed: see man(7), man(1)
.TH XORRISO 1 "Aug 14, 2008" .TH XORRISO 1 "Aug 15, 2008"
.\" Please adjust this date whenever revising the manpage. .\" Please adjust this date whenever revising the manpage.
.\" .\"
.\" Some roff macros, for reference: .\" Some roff macros, for reference:
@ -1667,7 +1667,7 @@ An option consists of a keyword, a "=" character, and a value.
Default is: Default is:
.br .br
use=indev what=tracks min_lba=-1 max_lba=-1 retry=default use=indev what=tracks min_lba=-1 max_lba=-1 retry=default
time_limit=-1 item_limit=-1 time_limit=28800 item_limit=100000
.br .br
abort_file=/var/opt/xorriso/do_abort_check_media abort_file=/var/opt/xorriso/do_abort_check_media
.br .br
@ -1676,7 +1676,7 @@ data_to= sector_map= map_with_volid=off
Non-default settings: Non-default settings:
.br .br
"use=outdev" reads from the output drive instead of the input drive. This "use=outdev" reads from the output drive instead of the input drive. This
avoids reading of the ISO image tree from media. avoids loading the ISO image tree from media.
.br .br
"what=disc" scans the payload range of a media without respecting track gaps. "what=disc" scans the payload range of a media without respecting track gaps.
.br .br
@ -1698,21 +1698,30 @@ blocks and go on with running xorriso.
aborted. This is useful for unattended scanning of media which may else aborted. This is useful for unattended scanning of media which may else
overwork the drive in its effort to squeeze out some readable blocks. overwork the drive in its effort to squeeze out some readable blocks.
Abort may be delayed by the drive gnawing on the last single read operation. Abort may be delayed by the drive gnawing on the last single read operation.
Value -1 means unlimited time.
.br .br
"item_limit=" gives the number of report list items after which to abort. "item_limit=" gives the number of report list items after which to abort.
Value -1 means unlimited item number.
.br .br
"data_to=" copies the valid blocks to the file which is given as option value. "data_to=" copies the valid blocks to the file which is given as option value.
.br .br
"sector_map=" tries to read the file given by option value as "sector_map=" tries to read the file given by option value as
"xorriso sector bitmap" and to store such a map file after the scan run. sector bitmap and to store such a map file after the scan run.
The bitmap tells which blocks have been read successfully in previous runs. The bitmap tells which blocks have been read successfully in previous runs.
It allows to do several scans on the same media, eventually with intermediate It allows to do several scans on the same media, eventually with intermediate
eject, in order to collect readable blocks whenever the drive is lucky enough eject, in order to collect readable blocks whenever the drive is lucky enough
to produce them. The stored file also contains a human readable TOC of tracks to produce them. The stored file contains a human readable TOC of tracks
and their start block addresses. and their start block addresses, followed by binary bitmap data.
.br .br
"map_with_volid=on" examines tracks whether they are ISO images and eventually "map_with_volid=on" examines tracks whether they are ISO images and eventually
prints their volume ids into the human readable TOC of sector_map=. prints their volume ids into the human readable TOC of sector_map=.
.br
"use=sector_map" does not read any media but loads the file given by option
sector_map= and processes this virtual outcome.
.br
The result list tells intervals of 2 KiB blocks with start address, number
of blocks and quality. Qualities which begin with "+" are
supposed to be valid readable data. Qualities with "-" are no valid data.
.TP .TP
.B osirrox restore options: .B osirrox restore options:
.PP .PP

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) char *Spotlist__quality_name(int quality, char name[80], int flag)
{ {
if(quality == Xorriso_read_quality_gooD) if(quality == Xorriso_read_quality_gooD)
strcpy(name, "good"); strcpy(name, "+ good");
else if(quality == Xorriso_read_quality_sloW) else if(quality == Xorriso_read_quality_sloW)
strcpy(name, "slow"); strcpy(name, "+ slow");
else if(quality == Xorriso_read_quality_partiaL) else if(quality == Xorriso_read_quality_partiaL)
strcpy(name, "partial"); strcpy(name, "+ partial");
else if(quality == Xorriso_read_quality_valiD) else if(quality == Xorriso_read_quality_valiD)
strcpy(name, "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");
else if(quality == Xorriso_read_quality_untesteD) 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) else if(quality == Xorriso_read_quality_unreadablE)
strcpy(name, "unreadable"); strcpy(name, "- unreadable");
else else
sprintf(name, "0x%8.8X", (unsigned) quality); sprintf(name, "0x%8.8X", (unsigned) quality);
return(name); return(name);
@ -3118,14 +3118,14 @@ int Checkmediajob_new(struct CheckmediajoB **o, int flag)
if(m==NULL) if(m==NULL)
return(-1); return(-1);
*o= m; *o= m;
m->use_outdev= 0; m->use_dev= 0;
m->min_lba= -1; m->min_lba= -1;
m->max_lba= -1; m->max_lba= -1;
m->min_block_size= 16; m->min_block_size= 16;
m->mode= 0; m->mode= 0;
m->start_time= time(NULL); m->start_time= time(NULL);
m->time_limit= -1; m->time_limit= 28800;
m->item_limit= -1; m->item_limit= 100000;
strcpy(m->abort_file_path, "/var/opt/xorriso/do_abort_check_media"); strcpy(m->abort_file_path, "/var/opt/xorriso/do_abort_check_media");
m->data_to_path[0]= 0; m->data_to_path[0]= 0;
m->data_to_fd= -1; 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, int Xorriso_afile_fopen(struct XorrisO *xorriso,
char *filename, char *mode, FILE **ret_fp, int flag) 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 argc, char **argv, int *idx, int flag)
{ {
int ret, i, count, lba, blocks, quality; int ret, i, count, lba, blocks, quality;
int end_idx, old_idx; int end_idx, old_idx, os_errno;
char quality_name[80]; char quality_name[80];
double num; double num;
struct SpotlisT *spotlist= NULL; struct SpotlisT *spotlist= NULL;
@ -9467,9 +9531,11 @@ int Xorriso_option_check_media(struct XorrisO *xorriso,
job->item_limit= num; job->item_limit= num;
} else if(strncmp(argv[i], "use=", 4) == 0) { } else if(strncmp(argv[i], "use=", 4) == 0) {
if(strcmp(argv[i] + 4, "outdev") == 0) if(strcmp(argv[i] + 4, "outdev") == 0)
job->use_outdev= 1; job->use_dev= 1;
else if(strcmp(argv[i] + 4, "indev") == 0) 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 else
goto unknown_value; goto unknown_value;
} else if(strncmp(argv[i], "what=", 5) == 0) { } else if(strncmp(argv[i], "what=", 5) == 0) {
@ -9490,9 +9556,30 @@ unknown_value:;
ret= 0; goto ex; 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); ret= Xorriso_check_media(xorriso, &spotlist, job, 0);
if(ret <= 0) if(ret <= 0)
goto ex; goto ex;
}
sprintf(xorriso->result_line, sprintf(xorriso->result_line,
"MCL layout : lba , size , quality\n"); "MCL layout : lba , size , quality\n");

View File

@ -1 +1 @@
#define Xorriso_timestamP "2008.08.15.102849" #define Xorriso_timestamP "2008.08.15.155421"

View File

@ -6578,7 +6578,7 @@ int Xorriso_check_interval(struct XorrisO *xorriso, struct SpotlisT *spotlist,
int flag) int flag)
{ {
int i, j, ret, total_count= 0, sectors= -1, sector_size= -1, skip_reading; 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; int prev_quality= -1, quality= -1, retry= 0, profile_no, is_cd= 0;
int start_sec, end_sec, first_value, fret; int start_sec, end_sec, first_value, fret;
char profile_name[80]; char profile_name[80];
int start_lba= 0; int start_lba= 0;
@ -6592,7 +6592,7 @@ int Xorriso_check_interval(struct XorrisO *xorriso, struct SpotlisT *spotlist,
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive, ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
"on attempt to check media readability", "on attempt to check media readability",
!!job->use_outdev); !!job->use_dev);
if(ret<=0) if(ret<=0)
goto ex; goto ex;
ret= burn_disc_get_profile(drive, &profile_no, profile_name); ret= burn_disc_get_profile(drive, &profile_no, profile_name);
@ -6812,7 +6812,7 @@ int Xorriso_check_media(struct XorrisO *xorriso, struct SpotlisT **spotlist,
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive, ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
"on attempt to check media readability", "on attempt to check media readability",
!!job->use_outdev); !!job->use_dev);
if(ret<=0) if(ret<=0)
goto ex; goto ex;
@ -6854,10 +6854,15 @@ int Xorriso_check_media(struct XorrisO *xorriso, struct SpotlisT **spotlist,
Xorriso_pacifier_reset(xorriso, 0); Xorriso_pacifier_reset(xorriso, 0);
job->start_time= time(NULL); job->start_time= time(NULL);
mode= job->mode; mode= job->mode;
if(job->min_lba >= 0) if(job->min_lba >= 0) {
start_lba= job->min_lba; start_lba= job->min_lba;
ret= Spotlist_add_item(*spotlist, 0, job->min_lba,
Xorriso_read_quality_untesteD, 0);
if(ret <= 0)
goto ex;
}
if(job->max_lba >= 0) { if(job->max_lba >= 0) {
blocks= job->max_lba - start_lba; blocks= job->max_lba + 1 - start_lba;
xorriso->pacifier_total= blocks; xorriso->pacifier_total= blocks;
ret= Xorriso_check_interval(xorriso, *spotlist, job, start_lba, blocks, ret= Xorriso_check_interval(xorriso, *spotlist, job, start_lba, blocks,
read_chunk, 0); read_chunk, 0);
@ -6969,7 +6974,7 @@ ex:;
} }
if(toc_info != NULL) if(toc_info != NULL)
free(toc_info); free(toc_info);
if(ret < 0) if(ret <= 0)
Spotlist_destroy(spotlist, 0); Spotlist_destroy(spotlist, 0);
return(ret); return(ret);
} }

View File

@ -279,7 +279,7 @@ int Xorriso_msinfo(struct XorrisO *xorriso, int *msc1, int *msc2, int flag);
struct CheckmediajoB { struct CheckmediajoB {
int use_outdev; /* 0= use indev , 1= use outdev */ int use_dev; /* 0= use indev , 1= use outdev , 2= use sector map*/
int min_lba; /* if >=0 : begin checking at this address */ int min_lba; /* if >=0 : begin checking at this address */
int max_lba; /* if >=0 : read up to this address, else use mode */ int max_lba; /* if >=0 : read up to this address, else use mode */