Evaluating readability of media

This commit is contained in:
2008-08-09 16:14:16 +00:00
parent 8bb8a24b29
commit ff8bfdaf4c
5 changed files with 512 additions and 2 deletions

View File

@ -2800,6 +2800,198 @@ int Permstack_pop(struct PermiteM **o, struct PermiteM *stopper,
/* ---------------------------- End PermstacK ----------------------------- */
/* ------------------------------ SpotlisT -------------------------------- */
struct SpotlistiteM {
int start_lba;
int blocks;
int quality;
struct SpotlistiteM *next;
};
int Spotlistitem_new(struct SpotlistiteM **o, int start_lba, int blocks,
int quality, int flag)
{
struct SpotlistiteM *m;
m= TSOB_FELD(struct SpotlistiteM,1);
if(m==NULL)
return(-1);
*o= m;
m->start_lba= start_lba;
m->blocks= blocks;
m->quality= quality;
m->next= NULL;
return(1);
}
int Spotlistitem_destroy(struct SpotlistiteM **o, int flag)
{
if((*o) == NULL)
return(0);
free((char *) *o);
*o= NULL;
return(1);
}
struct SpotlisT {
struct SpotlistiteM *list_start;
struct SpotlistiteM *list_end;
int list_count;
struct SpotlistiteM *current_item;
int current_idx;
};
int Spotlist_new(struct SpotlisT **o, int flag)
{
struct SpotlisT *m;
m= TSOB_FELD(struct SpotlisT,1);
if(m==NULL)
return(-1);
*o= m;
m->list_start= NULL;
m->list_end= NULL;
m->list_count= 0;
m->current_item= NULL;
m->current_idx= -1;
return(1);
}
int Spotlist_destroy(struct SpotlisT **o, int flag)
{
struct SpotlisT *m;
struct SpotlistiteM *li, *next_li;
if((*o) == NULL)
return(0);
m= *o;
for(li= m->list_start; li != NULL; li= next_li) {
next_li= li->next;
Spotlistitem_destroy(&li, 0);
}
free((char *) *o);
*o= NULL;
return(1);
}
int Spotlist_add_item(struct SpotlisT *o, int start_lba, int blocks,
int quality, int flag)
{
int ret;
struct SpotlistiteM *li;
ret= Spotlistitem_new(&li, start_lba, blocks, quality, 0);
if(ret <= 0)
return(ret);
if(o->list_end != NULL)
o->list_end->next= li;
o->list_end= li;
if(o->list_start == NULL)
o->list_start= li;
(o->list_count)++;
/* <<< */
{char quality_name[80];
fprintf(stderr, "debug: lba %10d , size %10d , quality %s\n",
start_lba, blocks, Spotlist__quality_name(quality, quality_name, 0));
}
return(1);
}
int Spotlist_count(struct SpotlisT *o, int flag)
{
return o->list_count;
}
int Spotlist_get_item(struct SpotlisT *o, int idx,
int *start_lba, int *blocks, int *quality, int flag)
{
int i;
struct SpotlistiteM *li;
if(idx < 0 || idx > o->list_count)
return(0);
if(idx == o->current_idx)
li= o->current_item;
else if(idx == o->current_idx) {
li= o->current_item->next;
} else {
li= o->list_start;
for(i= 0; i < idx; i++)
li= li->next;
}
o->current_item= li;
o->current_idx= idx;
*start_lba= li->start_lba;
*blocks= li->blocks;
*quality= li->quality;
return(1);
}
char *Spotlist__quality_name(int quality, char name[80], int flag)
{
if(quality == Xorriso_read_quality_gooD)
strcpy(name, "good");
else if(quality == Xorriso_read_quality_sloW)
strcpy(name, "slow");
else if(quality == Xorriso_read_quality_off_tracK)
strcpy(name, "off track");
else if(quality == Xorriso_read_quality_untesteD)
strcpy(name, "untested");
else if(quality == Xorriso_read_quality_unreadablE)
strcpy(name, "unreadable");
else
sprintf(name, "0x%8.8X\n", (unsigned) quality);
return(name);
}
/* ---------------------------- End SpotlisT ------------------------------ */
/* ---------------------------- CheckmediajoB ----------------------------- */
int Checkmediajob_new(struct CheckmediajoB **o, int flag)
{
struct CheckmediajoB *m;
m= TSOB_FELD(struct CheckmediajoB,1);
if(m==NULL)
return(-1);
*o= m;
m->min_lba= -1;
m->max_lba= -1;
m->min_block_size= 16;
m->mode= 1;
m->start_time= time(NULL);
m->time_limit= -1;
m->item_limit= -1;
return(1);
}
int Checkmediajob_destroy(struct CheckmediajoB **o, int flag)
{
if((*o) == NULL)
return(0);
free((char *) *o);
*o= NULL;
return(1);
}
/* -------------------------- End CheckmediajoB --------------------------- */
/* ------------------------------- Xorriso -------------------------------- */
@ -8684,6 +8876,78 @@ int Xorriso_option_cdx(struct XorrisO *xorriso, char *disk_path, int flag)
}
/* Option -check_media */
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;
char quality_name[80];
double num;
struct SpotlisT *spotlist= NULL;
struct CheckmediajoB *job= NULL;
old_idx= *idx;
end_idx= Xorriso_end_idx(xorriso, argc, argv, *idx, 1);
(*idx)= end_idx;
ret= Checkmediajob_new(&job, 0);
if(ret <= 0)
goto ex;
for(i= old_idx; i < end_idx; i++) {
if(strncmp(argv[i], "max_lba=", 8) == 0 ||
strncmp(argv[i], "min_lba=", 8) == 0) {
num= -1;
sscanf(argv[i] + 8, "%lf", &num);
if(num > 0x7fffffff || num < 0)
num= -1;
if(strncmp(argv[i], "max_lba=", 8) == 0)
job->max_lba= num;
else
job->min_lba= num;
} else if(strncmp(argv[i], "time_limit=", 11) == 0 ||
strncmp(argv[i], "item_limit=", 11) == 0 ) {
num= -1;
sscanf(argv[i] + 11, "%lf", &num);
if(num > 0x7fffffff || num < 0)
num= -1;
if(strncmp(argv[i], "time_limit=", 11) == 0)
job->time_limit= num;
else
job->item_limit= num;
} else {
sprintf(xorriso->info_text, "-check_media: Unknown option %s", argv[i]);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
ret= 0; goto ex;
}
}
ret= Xorriso_check_media(xorriso, &spotlist, job, 0);
if(ret <= 0)
goto ex;
sprintf(xorriso->result_line,
"MCL layout : lba , size , quality\n");
Xorriso_result(xorriso,0);
count= Spotlist_count(spotlist, 0);
for(i= 0; i < count; i++) {
ret= Spotlist_get_item(spotlist, i, &lba, &blocks, &quality, 0);
if(ret <= 0)
continue;
sprintf(xorriso->result_line, "MCL item : %10d , %10d , %s\n",
lba, blocks, Spotlist__quality_name(quality, quality_name, 0));
Xorriso_result(xorriso,0);
}
ret= 1;
ex:;
Spotlist_destroy(&spotlist, 0);
Checkmediajob_destroy(&job, 0);
return(ret);
}
/* Option -chgrp alias -chgrpi , chgrp_r alias chgrpi */
/* @param flag bit0=recursive (-chgrp_r)
*/
@ -10181,6 +10445,12 @@ int Xorriso_option_help(struct XorrisO *xorriso, int flag)
" -paste_in iso_rr_path disk_path byte_offset byte_count",
" Copy ISO file content into a byte interval of a disk file.",
"",
"Evaluation of readability:",
" -check_media [options] --",
" Try to read data blocks from media and report about the",
" outcome. Several options modify the behavior:",
" min_lba= , max_lba= , time_limit= , item_limit=",
"",
"Compatibility emulation (argument list may be ended by --):",
" -as mkisofs [-help|-version|-o|-R|-J|-V|-P|-f|-m|-exclude-list|-no-pad|",
" -M|-C|-graft-points|-path-list|pathspecs]",
@ -12233,7 +12503,8 @@ int Xorriso_count_args(struct XorrisO *xorriso, int argc, char **argv,
""
};
static char argn_commands[][40]= {
"add","as","chgrp","chgrpi","chgrp_r","chgrp_ri","chmod","chmodi",
"add","as",
"check_media","chgrp","chgrpi","chgrp_r","chgrp_ri","chmod","chmodi",
"chmod_r","chmod_ri","chown","chowni","chown_r","chown_ri",
"compare_l","cpr","cpri","cp_rax","cp_rx","cpax","cpx",
"du","dui","dus","dusi","dux","dusx","extract_l","find","findi","findx",
@ -12398,6 +12669,9 @@ next_command:;
(*idx)++;
ret= Xorriso_option_cdx(xorriso, arg1, 0);
} else if(strcmp(cmd,"check_media")==0) {
ret= Xorriso_option_check_media(xorriso, argc, argv, idx, 0);
} else if(strcmp(cmd,"chgrp")==0 || strcmp(cmd,"chgrpi")==0) {
(*idx)+= 1;
ret= Xorriso_option_chgrpi(xorriso, arg1, argc, argv, idx, 0);