New -find action report_lba
This commit is contained in:
parent
552911da11
commit
96121a70dc
@ -147,6 +147,26 @@ and vice versa:
|
|||||||
| less
|
| less
|
||||||
|
|
||||||
|
|
||||||
|
File Formats
|
||||||
|
|
||||||
|
Currently there is only one file format peculiar to xorriso : sector maps
|
||||||
|
which describe the valid and invalid blocks on a media or a disk copy of
|
||||||
|
a media. xorriso creates and reads these file with its option -check_media.
|
||||||
|
|
||||||
|
The file begins with 32 bytes of cleartext of which the last one is a
|
||||||
|
newline character. The first 25 say "xorriso sector bitmap v2 ", the
|
||||||
|
remaining six characters give the size of the info text as decimal number.
|
||||||
|
This number of bytes follows the first 32 and will not be interpreted
|
||||||
|
by xorriso. They are rather to inform a human reader about the media type
|
||||||
|
and its track layout.
|
||||||
|
After the info text there are two 4 byte signed integers, most significant
|
||||||
|
byte first. The first one, N, gives the number of bits in the following bitmap
|
||||||
|
and the second number S gives the number of 2 KiB blocks governed by a single
|
||||||
|
bit in the map. Then come the bits in form of 8-bit bytes.
|
||||||
|
Media block M is covered by bit B=M/S in the map, bit number B is stored in
|
||||||
|
byte B/8 as bit B%8. A valid readable data block has its bit set to 1.
|
||||||
|
|
||||||
|
|
||||||
libisoburn
|
libisoburn
|
||||||
|
|
||||||
xorriso is based on libisofs which does ISO 9600 filesystem aspects and on
|
xorriso is based on libisofs which does ISO 9600 filesystem aspects and on
|
||||||
|
@ -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 17, 2008"
|
.TH XORRISO 1 "Aug 18, 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:
|
||||||
@ -936,6 +936,15 @@ E.g.:
|
|||||||
.br
|
.br
|
||||||
-find / -damaged -exec report_damage
|
-find / -damaged -exec report_damage
|
||||||
.br
|
.br
|
||||||
|
"report_lba" prints files which are associated to image data blocks.
|
||||||
|
It tells the logical block address, the block number, the byte size,
|
||||||
|
and the path of each file. In future there may be reported more than one
|
||||||
|
line per file if thie file is very large.
|
||||||
|
.br
|
||||||
|
E.g.:
|
||||||
|
.br
|
||||||
|
-find / -lba_range 302000 50000 -exec report_lba
|
||||||
|
.br
|
||||||
"find" performs another run of -find on the matching file address. It accepts
|
"find" performs another run of -find on the matching file address. It accepts
|
||||||
the same params as -find, except iso_rr_path.
|
the same params as -find, except iso_rr_path.
|
||||||
E.g.:
|
E.g.:
|
||||||
|
@ -1 +1 @@
|
|||||||
#define Xorriso_timestamP "2008.08.17.221350"
|
#define Xorriso_timestamP "2008.08.18.134140"
|
||||||
|
@ -5599,6 +5599,26 @@ int Xorriso_file_eval_damage(struct XorrisO *xorriso, IsoNode *node,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int Xorriso_report_lba(struct XorrisO *xorriso, char *show_path,
|
||||||
|
IsoNode *node, int flag)
|
||||||
|
{
|
||||||
|
int ret, start_lba, end_lba;
|
||||||
|
off_t size;
|
||||||
|
char sfe[5*SfileadrL];
|
||||||
|
|
||||||
|
ret= Xorriso_start_end_lba(xorriso, node, &start_lba, &end_lba, &size, 0);
|
||||||
|
if(ret < 0)
|
||||||
|
return(ret);
|
||||||
|
if(ret == 0)
|
||||||
|
return(1); /* it is ok to ignore other types */
|
||||||
|
sprintf(xorriso->result_line, "File data lba: %2d , %8d , %8d , %8.f , %s\n",
|
||||||
|
0, start_lba, end_lba + 1 - start_lba, (double) size,
|
||||||
|
Text_shellsafe(show_path, sfe, 0));
|
||||||
|
Xorriso_result(xorriso, 0);
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int Xorriso_report_damage(struct XorrisO *xorriso, char *show_path,
|
int Xorriso_report_damage(struct XorrisO *xorriso, char *show_path,
|
||||||
IsoNode *node, int flag)
|
IsoNode *node, int flag)
|
||||||
{
|
{
|
||||||
@ -5626,76 +5646,6 @@ int Xorriso_report_damage(struct XorrisO *xorriso, char *show_path,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* <<< shall be replaced by tests and -exec report_damage
|
|
||||||
#define Xorriso_check_find_as_exeC 1
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef Xorriso_check_find_as_exeC
|
|
||||||
|
|
||||||
/* @param flag bit0= report about undamaged files
|
|
||||||
*/
|
|
||||||
int Xorriso_file_vs_bitmap(struct XorrisO *xorriso, char *show_path,
|
|
||||||
IsoNode *node, int flag)
|
|
||||||
{
|
|
||||||
uint32_t start_lba;
|
|
||||||
int end_lba, i, sectors, sector_size, damaged= 0, ret;
|
|
||||||
int next_good_lba, first_bad_lba= -1;
|
|
||||||
off_t size= 0, damage_start, damage_count;
|
|
||||||
struct SectorbitmaP *map;
|
|
||||||
char sfe[5*SfileadrL];
|
|
||||||
|
|
||||||
ret= iso_node_get_old_image_lba(node, &start_lba, 0);
|
|
||||||
if(ret < 0)
|
|
||||||
return(0);
|
|
||||||
if(ret == 0) {
|
|
||||||
if(flag & 1)
|
|
||||||
goto undamaged;
|
|
||||||
return(2);
|
|
||||||
}
|
|
||||||
map= xorriso->in_sector_map;
|
|
||||||
if(map == NULL) {
|
|
||||||
if(flag & 1)
|
|
||||||
goto undamaged;
|
|
||||||
return(2);
|
|
||||||
}
|
|
||||||
if(LIBISO_ISREG(node))
|
|
||||||
size= iso_file_get_size((IsoFile *) node);
|
|
||||||
end_lba= start_lba + size / 2048;
|
|
||||||
if(size % 2048)
|
|
||||||
end_lba++;
|
|
||||||
|
|
||||||
Sectorbitmap_get_layout(map, §ors, §or_size, 0);
|
|
||||||
sector_size/= 2048;
|
|
||||||
for(i= start_lba; i < end_lba; i+= sector_size)
|
|
||||||
if(Sectorbitmap_is_set(map, i / sector_size, 0) == 0) {
|
|
||||||
damaged= 1;
|
|
||||||
if(first_bad_lba < 0)
|
|
||||||
first_bad_lba= i;
|
|
||||||
next_good_lba= (i / sector_size + 1) * sector_size;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(damaged && !(flag & 1)) {
|
|
||||||
damage_start= (first_bad_lba - start_lba) * 2048;
|
|
||||||
damage_count= (next_good_lba - start_lba) * 2048;
|
|
||||||
if(damage_count > size)
|
|
||||||
damage_count= size;
|
|
||||||
damage_count-= damage_start;
|
|
||||||
sprintf(xorriso->result_line, "File damage : %13.f , %13.f , %13.f , %s\n",
|
|
||||||
(double) damage_start, (double) damage_count, (double) size,
|
|
||||||
Text_shellsafe(show_path, sfe, 0));
|
|
||||||
Xorriso_result(xorriso, 0);
|
|
||||||
} else if((flag & 1) && !damaged) {
|
|
||||||
undamaged:;
|
|
||||||
sprintf(xorriso->result_line, "File seems ok: %s\n",
|
|
||||||
Text_shellsafe(show_path, sfe, 0));
|
|
||||||
Xorriso_result(xorriso, 0);
|
|
||||||
}
|
|
||||||
return(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* Xorriso_check_find_as_exeC */
|
|
||||||
|
|
||||||
|
|
||||||
/* @param flag bit0= not a command parameter (directory iteration or recursion)
|
/* @param flag bit0= not a command parameter (directory iteration or recursion)
|
||||||
bit1= do not count deleted files with rm and rm_r
|
bit1= do not count deleted files with rm and rm_r
|
||||||
@return <=0 error,
|
@return <=0 error,
|
||||||
@ -5764,24 +5714,10 @@ int Xorriso_findi_action(struct XorrisO *xorriso, struct FindjoB *job,
|
|||||||
ret= 1;
|
ret= 1;
|
||||||
} else if(action==16 || action==18) { /* not_in_iso , add_missing */
|
} else if(action==16 || action==18) { /* not_in_iso , add_missing */
|
||||||
;
|
;
|
||||||
|
|
||||||
#ifdef Xorriso_check_find_as_exeC
|
|
||||||
|
|
||||||
} else if(action == 21) { /* is_damaged */
|
|
||||||
ret= Xorriso_file_vs_bitmap(xorriso, show_path, node, 0);
|
|
||||||
} else if(action == 22) { /* is_undamaged */
|
|
||||||
ret= Xorriso_file_vs_bitmap(xorriso, show_path, node, 1);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
} else if(action == 21) { /* report_damage */
|
} else if(action == 21) { /* report_damage */
|
||||||
ret= Xorriso_report_damage(xorriso, show_path, node, 0);
|
ret= Xorriso_report_damage(xorriso, show_path, node, 0);
|
||||||
} else if(action == 22) {
|
} else if(action == 22) {
|
||||||
/* >>> report_lba */;
|
ret= Xorriso_report_lba(xorriso, show_path, node, 0);
|
||||||
|
|
||||||
#endif /* ! Xorriso_check_find_as_exeC */
|
|
||||||
|
|
||||||
|
|
||||||
} else { /* includes : 15 in_iso */
|
} else { /* includes : 15 in_iso */
|
||||||
sprintf(xorriso->result_line, "%s\n", Text_shellsafe(show_path, sfe, 0));
|
sprintf(xorriso->result_line, "%s\n", Text_shellsafe(show_path, sfe, 0));
|
||||||
Xorriso_result(xorriso, 0);
|
Xorriso_result(xorriso, 0);
|
||||||
@ -5865,10 +5801,17 @@ int Xorriso_findi(struct XorrisO *xorriso, struct FindjoB *job,
|
|||||||
action= Findjob_get_action(job, 0);
|
action= Findjob_get_action(job, 0);
|
||||||
if(action<0)
|
if(action<0)
|
||||||
action= 0;
|
action= 0;
|
||||||
if(action == 21 && !(flag & 1)) {
|
if(!(flag & 1)) {
|
||||||
|
if(action == 21) {
|
||||||
sprintf(xorriso->result_line, "Report layout: %8s , %8s , %8s , %s\n",
|
sprintf(xorriso->result_line, "Report layout: %8s , %8s , %8s , %s\n",
|
||||||
"at byte", "range", "filesize", "ISO image path");
|
"at byte", "Range", "Filesize", "ISO image path");
|
||||||
Xorriso_result(xorriso, 0);
|
Xorriso_result(xorriso, 0);
|
||||||
|
} else if(action == 22) {
|
||||||
|
sprintf(xorriso->result_line,
|
||||||
|
"Report layout: %2s , %8s , %8s , %8s , %s\n",
|
||||||
|
"xt", "Startlba", "Blocks", "Filesize", "ISO image path");
|
||||||
|
Xorriso_result(xorriso, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dir_node= (IsoDir *) dir_node_generic;
|
dir_node= (IsoDir *) dir_node_generic;
|
||||||
@ -5893,17 +5836,8 @@ int Xorriso_findi(struct XorrisO *xorriso, struct FindjoB *job,
|
|||||||
else
|
else
|
||||||
name++;
|
name++;
|
||||||
|
|
||||||
#ifdef Xorriso_check_find_as_exeC
|
|
||||||
|
|
||||||
ret= Findjob_test(job, name, NULL, dir_stbuf, depth, 0);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
ret= Xorriso_findi_test(xorriso, job, iso_node, name, NULL, dir_stbuf,
|
ret= Xorriso_findi_test(xorriso, job, iso_node, name, NULL, dir_stbuf,
|
||||||
depth, 0);
|
depth, 0);
|
||||||
|
|
||||||
#endif /* ! Xorriso_check_find_as_exeC */
|
|
||||||
|
|
||||||
if(ret<0)
|
if(ret<0)
|
||||||
goto ex;
|
goto ex;
|
||||||
if(ret>0) {
|
if(ret>0) {
|
||||||
@ -5971,17 +5905,8 @@ int Xorriso_findi(struct XorrisO *xorriso, struct FindjoB *job,
|
|||||||
handling of the find start path with mount points. Dangerous to change.
|
handling of the find start path with mount points. Dangerous to change.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef Xorriso_check_find_as_exeC
|
|
||||||
|
|
||||||
ret= Findjob_test(job, name, dir_stbuf, &stbuf, depth, 0);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
ret= Xorriso_findi_test(xorriso, job, node, name, dir_stbuf, &stbuf,
|
ret= Xorriso_findi_test(xorriso, job, node, name, dir_stbuf, &stbuf,
|
||||||
depth, 0);
|
depth, 0);
|
||||||
|
|
||||||
#endif /* ! Xorriso_check_find_as_exeC */
|
|
||||||
|
|
||||||
if(ret<0)
|
if(ret<0)
|
||||||
goto ex;
|
goto ex;
|
||||||
if(ret>0) {
|
if(ret>0) {
|
||||||
|
Loading…
Reference in New Issue
Block a user