Fixed a potential blind spot of 1 second in -disk_dev_ino comparison
This commit is contained in:
parent
6f41c04293
commit
ba7985f18a
@ -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 "Apr 02, 2009"
|
.TH XORRISO 1 "Apr 03, 2009"
|
||||||
.\" 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:
|
||||||
@ -684,7 +684,9 @@ See also options -getfattr, -setfattr and above paragraph about xattr.
|
|||||||
\fB\-disk_dev_ino\fR "on"|"ino_only"|"off"
|
\fB\-disk_dev_ino\fR "on"|"ino_only"|"off"
|
||||||
Enable or disable processing of recorded file identification numbers
|
Enable or disable processing of recorded file identification numbers
|
||||||
(dev_t and ino_t). They are eventually stored as xattr "isofs.di" and allow
|
(dev_t and ino_t). They are eventually stored as xattr "isofs.di" and allow
|
||||||
to substantially accelerate file comparison.
|
to substantially accelerate file comparison. The root node gets a global start
|
||||||
|
timestamp in "isofs.st". If during comparison a file with younger timestamps
|
||||||
|
is found in the ISO image, then it is suspected to have inconsistent content.
|
||||||
.br
|
.br
|
||||||
If device numbers and inode numbers of the disk filesystems are persistent
|
If device numbers and inode numbers of the disk filesystems are persistent
|
||||||
and if no irregular alterations of timestamps or system clock happen,
|
and if no irregular alterations of timestamps or system clock happen,
|
||||||
|
@ -1572,6 +1572,7 @@ completed:;
|
|||||||
0= ls -l format
|
0= ls -l format
|
||||||
1= timestamp format YYYY.MM.DD.hhmmss
|
1= timestamp format YYYY.MM.DD.hhmmss
|
||||||
2= Wdy Mon Day hh:mm:ss Year
|
2= Wdy Mon Day hh:mm:ss Year
|
||||||
|
3= Mon Day hh:mm:ss Year
|
||||||
*/
|
*/
|
||||||
char *Ftimetxt(time_t t, char timetext[40], int flag)
|
char *Ftimetxt(time_t t, char timetext[40], int flag)
|
||||||
{
|
{
|
||||||
@ -1596,6 +1597,10 @@ char *Ftimetxt(time_t t, char timetext[40], int flag)
|
|||||||
sprintf(rpt+strlen(rpt), "%s %s %2.2d %2.2d:%2.2d:%2.2d %4.4d",
|
sprintf(rpt+strlen(rpt), "%s %s %2.2d %2.2d:%2.2d:%2.2d %4.4d",
|
||||||
days[tms.tm_wday], months[tms.tm_mon], tms.tm_mday,
|
days[tms.tm_wday], months[tms.tm_mon], tms.tm_mday,
|
||||||
tms.tm_hour, tms.tm_min, tms.tm_sec, 1900+tms.tm_year);
|
tms.tm_hour, tms.tm_min, tms.tm_sec, 1900+tms.tm_year);
|
||||||
|
else if (form==3)
|
||||||
|
sprintf(rpt+strlen(rpt), "%s %2.2d %2.2d:%2.2d:%2.2d %4.4d",
|
||||||
|
months[tms.tm_mon], tms.tm_mday,
|
||||||
|
tms.tm_hour, tms.tm_min, tms.tm_sec, 1900+tms.tm_year);
|
||||||
else if (flag&1)
|
else if (flag&1)
|
||||||
sprintf(rpt+strlen(rpt), "%2d %3s %4.4d %2.2d:%2.2d:%2.2d",
|
sprintf(rpt+strlen(rpt), "%2d %3s %4.4d %2.2d:%2.2d:%2.2d",
|
||||||
tms.tm_mday, months[tms.tm_mon], 1900+tms.tm_year,
|
tms.tm_mday, months[tms.tm_mon], 1900+tms.tm_year,
|
||||||
@ -4103,6 +4108,8 @@ int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag)
|
|||||||
m->in_drive_handle= NULL;
|
m->in_drive_handle= NULL;
|
||||||
m->in_volset_handle= NULL;
|
m->in_volset_handle= NULL;
|
||||||
m->in_charset= NULL;
|
m->in_charset= NULL;
|
||||||
|
m->isofs_st_out= time(0) - 1;
|
||||||
|
m->isofs_st_in= 0;
|
||||||
m->volset_change_pending= 0;
|
m->volset_change_pending= 0;
|
||||||
m->no_volset_present= 0;
|
m->no_volset_present= 0;
|
||||||
m->in_sector_map= NULL;
|
m->in_sector_map= NULL;
|
||||||
@ -6772,6 +6779,7 @@ cannot_address:;
|
|||||||
bit20= xattr differ
|
bit20= xattr differ
|
||||||
bit21= mismatch of recorded dev,inode
|
bit21= mismatch of recorded dev,inode
|
||||||
bit22= no recorded dev,inode found in node
|
bit22= no recorded dev,inode found in node
|
||||||
|
bit23= timestamps younger than xorriso->isofs_st_in
|
||||||
@param flag bit0= compare atime
|
@param flag bit0= compare atime
|
||||||
bit1= compare ctime
|
bit1= compare ctime
|
||||||
bit2= check only existence of both file objects
|
bit2= check only existence of both file objects
|
||||||
@ -6797,6 +6805,7 @@ int Xorriso_compare_2_files(struct XorrisO *xorriso, char *disk_adr,
|
|||||||
char *attrlist1= NULL, *attrlist2= NULL;
|
char *attrlist1= NULL, *attrlist2= NULL;
|
||||||
struct SplitparT *split_parts= NULL;
|
struct SplitparT *split_parts= NULL;
|
||||||
int split_count= 0;
|
int split_count= 0;
|
||||||
|
time_t stamp;
|
||||||
|
|
||||||
char part_path[SfileadrL], *part_name;
|
char part_path[SfileadrL], *part_name;
|
||||||
int partno, total_parts= 0;
|
int partno, total_parts= 0;
|
||||||
@ -7016,6 +7025,11 @@ int Xorriso_compare_2_files(struct XorrisO *xorriso, char *disk_adr,
|
|||||||
(*result)|= 1024;
|
(*result)|= 1024;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(xorriso->isofs_st_in > 0 &&
|
||||||
|
(xorriso->isofs_st_in <= s2.st_mtime ||
|
||||||
|
((flag & 1) && xorriso->isofs_st_in <= s2.st_atime) ||
|
||||||
|
((flag & 2) && xorriso->isofs_st_in <= s2.st_ctime)))
|
||||||
|
(*result)|= 1 << 23;
|
||||||
|
|
||||||
if(xorriso->do_aaip & 32) {
|
if(xorriso->do_aaip & 32) {
|
||||||
/* dev,inode comparison. Eventually skip content comparison */
|
/* dev,inode comparison. Eventually skip content comparison */
|
||||||
@ -7026,8 +7040,26 @@ int Xorriso_compare_2_files(struct XorrisO *xorriso, char *disk_adr,
|
|||||||
} else if(ret == 0) { /* match */
|
} else if(ret == 0) { /* match */
|
||||||
if((xorriso->do_aaip & 64) && S_ISREG(s1.st_mode) && S_ISREG(s2.st_mode)){
|
if((xorriso->do_aaip & 64) && S_ISREG(s1.st_mode) && S_ISREG(s2.st_mode)){
|
||||||
content_shortcut= 1;
|
content_shortcut= 1;
|
||||||
if((*result) & (8 | 128 | 256 | 512 | 1024)) {
|
if((*result) & (8 | 128 | 256 | 512 | 1024 | (1 << 23))) {
|
||||||
(*result)|= (1 << 15); /* content bytes differ */
|
(*result)|= (1 << 15); /* content bytes differ */
|
||||||
|
if(((*result) & (1 << 23)) &&
|
||||||
|
!((*result) & (8 | 128 | 256 | 512 | 1024))) {
|
||||||
|
sprintf(respt,
|
||||||
|
"%s content : node timestamp younger than image timestamp\n", a);
|
||||||
|
if(!(flag&(1<<31)))
|
||||||
|
Xorriso_result(xorriso,0);
|
||||||
|
stamp= s2.st_mtime;
|
||||||
|
if((flag & 1) && s2.st_atime >= stamp)
|
||||||
|
stamp= s2.st_atime;
|
||||||
|
if((flag & 2) && s2.st_ctime >= stamp)
|
||||||
|
stamp= s2.st_ctime;
|
||||||
|
sprintf(respt, "%s content : %s > %s diff= %.f s\n",
|
||||||
|
a, Ftimetxt(stamp, ttx1, 3 << 1),
|
||||||
|
Ftimetxt(xorriso->isofs_st_in, ttx2, 3 << 1),
|
||||||
|
((double) stamp) - (double) xorriso->isofs_st_in);
|
||||||
|
if(!(flag&(1<<31)))
|
||||||
|
Xorriso_result(xorriso,0);
|
||||||
|
}
|
||||||
sprintf(respt,
|
sprintf(respt,
|
||||||
"%s content : assuming inequality due to size or timestamps\n", a);
|
"%s content : assuming inequality due to size or timestamps\n", a);
|
||||||
if(!(flag&(1<<31)))
|
if(!(flag&(1<<31)))
|
||||||
|
@ -101,9 +101,13 @@ struct XorrisO { /* the global context of xorriso */
|
|||||||
|
|
||||||
int do_joliet;
|
int do_joliet;
|
||||||
|
|
||||||
int do_aaip; /* bit0= ACL in , bit1= ACL out , bit2= EA in , bit3= EA out
|
int do_aaip; /* bit0= ACL in
|
||||||
bit4= record dev,inode , bit5= check dev,inode
|
bit1= ACL out
|
||||||
bit6= omit content check if dev,inode check is conclusive
|
bit2= EA in
|
||||||
|
bit3= EA out
|
||||||
|
bit4= record dev,inode per node, isofs_st_out in root
|
||||||
|
bit5= check dev,inode,isofs_st_in
|
||||||
|
bit6= omit content check if bit5 check is conclusive
|
||||||
bit7= omit dev check with bit5
|
bit7= omit dev check with bit5
|
||||||
bit8= store output charset in xattr "isofs.cs"
|
bit8= store output charset in xattr "isofs.cs"
|
||||||
bit9= allow to set input charset from xattr "isofs.cs"
|
bit9= allow to set input charset from xattr "isofs.cs"
|
||||||
@ -174,6 +178,11 @@ struct XorrisO { /* the global context of xorriso */
|
|||||||
void *in_drive_handle; /* interpreted only by xorrisoburn.c */
|
void *in_drive_handle; /* interpreted only by xorrisoburn.c */
|
||||||
void *in_volset_handle; /* interpreted only by xorrisoburn.c */
|
void *in_volset_handle; /* interpreted only by xorrisoburn.c */
|
||||||
char *in_charset; /* The charset to interpret the filename bytes */
|
char *in_charset; /* The charset to interpret the filename bytes */
|
||||||
|
time_t isofs_st_out; /* A time point at least 1 second before image
|
||||||
|
composition began. To be stored with image as
|
||||||
|
xattr "isofs.st". */
|
||||||
|
time_t isofs_st_in; /* That time point as read from "isofs.st" of the
|
||||||
|
loaded image. */
|
||||||
|
|
||||||
int volset_change_pending; /* whether -commit would make sense */
|
int volset_change_pending; /* whether -commit would make sense */
|
||||||
int no_volset_present; /* set to 1 on first failure */
|
int no_volset_present; /* set to 1 on first failure */
|
||||||
|
@ -1 +1 @@
|
|||||||
#define Xorriso_timestamP "2009.04.02.162530"
|
#define Xorriso_timestamP "2009.04.03.172034"
|
||||||
|
@ -527,8 +527,12 @@ int Xorriso_aquire_drive(struct XorrisO *xorriso, char *adr, int flag)
|
|||||||
struct burn_drive *drive, *out_drive, *in_drive;
|
struct burn_drive *drive, *out_drive, *in_drive;
|
||||||
enum burn_disc_status state;
|
enum burn_disc_status state;
|
||||||
IsoImage *volset = NULL;
|
IsoImage *volset = NULL;
|
||||||
|
IsoNode *root_node;
|
||||||
struct isoburn_read_opts *ropts= NULL;
|
struct isoburn_read_opts *ropts= NULL;
|
||||||
char libburn_adr[SfileadrL], *boot_fate, *sev;
|
char libburn_adr[SfileadrL], *boot_fate, *sev;
|
||||||
|
size_t value_length;
|
||||||
|
char *value= NULL;
|
||||||
|
double num;
|
||||||
|
|
||||||
static int no_rr_or_joliet= 0;
|
static int no_rr_or_joliet= 0;
|
||||||
|
|
||||||
@ -541,6 +545,8 @@ int Xorriso_aquire_drive(struct XorrisO *xorriso, char *adr, int flag)
|
|||||||
ret= Xorriso_give_up_drive(xorriso, (flag&3)|8);
|
ret= Xorriso_give_up_drive(xorriso, (flag&3)|8);
|
||||||
if(ret<=0)
|
if(ret<=0)
|
||||||
return(ret);
|
return(ret);
|
||||||
|
if(flag & 1)
|
||||||
|
xorriso->isofs_st_out= time(0) - 1;
|
||||||
|
|
||||||
ret= Xorriso_auto_driveadr(xorriso, adr, libburn_adr, 0);
|
ret= Xorriso_auto_driveadr(xorriso, adr, libburn_adr, 0);
|
||||||
if(ret <= 0)
|
if(ret <= 0)
|
||||||
@ -778,6 +784,21 @@ int Xorriso_aquire_drive(struct XorrisO *xorriso, char *adr, int flag)
|
|||||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
|
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
|
||||||
Xorriso_record_boot_info(xorriso, 0);
|
Xorriso_record_boot_info(xorriso, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(flag & 1) {
|
||||||
|
/* Look for isofs.st and put it into xorriso->isofs_st_in */;
|
||||||
|
root_node= (IsoNode *) iso_image_get_root(volset);
|
||||||
|
ret= iso_node_lookup_attr(root_node, "isofs.st", &value_length, &value, 0);
|
||||||
|
if(ret > 0) {
|
||||||
|
if(value_length > 0) {
|
||||||
|
sscanf(value, "%lf", &num);
|
||||||
|
if(num > 0)
|
||||||
|
xorriso->isofs_st_in= num;
|
||||||
|
}
|
||||||
|
free(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(!(flag&32)) {
|
if(!(flag&32)) {
|
||||||
Xorriso_toc(xorriso, 1 | 8);
|
Xorriso_toc(xorriso, 1 | 8);
|
||||||
if(xorriso->loaded_volid[0]!=0) {
|
if(xorriso->loaded_volid[0]!=0) {
|
||||||
@ -845,6 +866,8 @@ int Xorriso_give_up_drive(struct XorrisO *xorriso, int flag)
|
|||||||
xorriso->in_volset_handle= NULL;
|
xorriso->in_volset_handle= NULL;
|
||||||
Sectorbitmap_destroy(&(xorriso->in_sector_map), 0);
|
Sectorbitmap_destroy(&(xorriso->in_sector_map), 0);
|
||||||
xorriso->loaded_volid[0]= 0;
|
xorriso->loaded_volid[0]= 0;
|
||||||
|
xorriso->isofs_st_out= time(0) - 1;
|
||||||
|
xorriso->isofs_st_in= 0;
|
||||||
xorriso->volset_change_pending= 0;
|
xorriso->volset_change_pending= 0;
|
||||||
xorriso->no_volset_present= 0;
|
xorriso->no_volset_present= 0;
|
||||||
xorriso->loaded_boot_bin_lba= 0;
|
xorriso->loaded_boot_bin_lba= 0;
|
||||||
@ -1314,6 +1337,19 @@ int Xorriso_write_session(struct XorrisO *xorriso, int flag)
|
|||||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
|
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(xorriso->do_aaip & 16) {
|
||||||
|
/* Overwrite isofs.st of root node by xorriso->isofs_st_out */
|
||||||
|
char *name= "isofs.st";
|
||||||
|
char timestamp[16], *value= timestamp;
|
||||||
|
size_t value_length;
|
||||||
|
|
||||||
|
sprintf(timestamp, "%.f", (double) xorriso->isofs_st_out);
|
||||||
|
value_length= strlen(timestamp);
|
||||||
|
Xorriso_setfattr(xorriso, NULL, "/", (size_t) 1, &name,
|
||||||
|
&value_length, &value, 2 | 8);
|
||||||
|
}
|
||||||
|
|
||||||
isoburn_igopt_set_level(sopts, 3);
|
isoburn_igopt_set_level(sopts, 3);
|
||||||
isoburn_igopt_set_extensions(sopts, 1 | ((!!xorriso->do_joliet)<<1) |
|
isoburn_igopt_set_extensions(sopts, 1 | ((!!xorriso->do_joliet)<<1) |
|
||||||
((!!(xorriso->do_aaip & (2 | 8 | 16 | 256))) << 5));
|
((!!(xorriso->do_aaip & (2 | 8 | 16 | 256))) << 5));
|
||||||
|
Loading…
Reference in New Issue
Block a user