Took into respect ACL and xattr with -compare and -update
This commit is contained in:
@ -1013,6 +1013,132 @@ int Sort_argv(int argc, char **argv, int flag)
|
||||
}
|
||||
|
||||
|
||||
static int Text_to_argv(char *text, int *argc, char ***argv, int flag)
|
||||
{
|
||||
char *npt, *cpt;
|
||||
int pass;
|
||||
|
||||
*argv= NULL;
|
||||
*argc= 0;
|
||||
for(pass= 0; pass < 2; pass++) {
|
||||
if(pass) {
|
||||
if(*argc == 0)
|
||||
return(1);
|
||||
(*argv)= calloc(*argc, sizeof(char *));
|
||||
if(*argv == NULL) {
|
||||
*argc= 0;
|
||||
return(-1);
|
||||
}
|
||||
*argc= 0;
|
||||
}
|
||||
for(npt= cpt= text; npt != NULL; cpt= npt + 1) {
|
||||
npt= strchr(cpt, '\n');
|
||||
if(pass) {
|
||||
if(npt != NULL)
|
||||
*npt= 0;
|
||||
(*argv)[*argc]= cpt;
|
||||
}
|
||||
(*argc)++;
|
||||
}
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
static int Count_diffs(int argc1, char **argv1, int argc2, char **argv2,
|
||||
int flag)
|
||||
{
|
||||
int count= 0, i1= 0, i2= 0, cmp, end_corr= 0;
|
||||
|
||||
Sort_argv(argc1, argv1, 0);
|
||||
Sort_argv(argc2, argv2, 0);
|
||||
|
||||
while(1) {
|
||||
if(i1 >= argc1) {
|
||||
count+= argc2 - i2 - end_corr;
|
||||
break;
|
||||
}
|
||||
if(i2 >= argc2) {
|
||||
count+= argc1 - i1 - end_corr;
|
||||
break;
|
||||
}
|
||||
cmp= strcmp(argv1[i1], argv2[i2]);
|
||||
if(cmp == 0) {
|
||||
end_corr= 0;
|
||||
i1++;
|
||||
i2++;
|
||||
} else if(cmp > 0) {
|
||||
count++;
|
||||
end_corr= 1;
|
||||
i2++;
|
||||
if(i2 < argc2 && i1 < argc1 - 1)
|
||||
if(strcmp(argv1[i1 + 1], argv2[i2]) == 0) {
|
||||
i1++;
|
||||
end_corr= 0;
|
||||
}
|
||||
} else {
|
||||
count++;
|
||||
end_corr= 1;
|
||||
i1++;
|
||||
if(i1 < argc1 && i2 < argc2 - 1)
|
||||
if(strcmp(argv2[i2 + 1], argv1[i1]) == 0) {
|
||||
i2++;
|
||||
end_corr= 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
return(count);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
@flag bit0= do not initialize *diff_count
|
||||
@return <0 error , 0 = mismatch , 1 = match
|
||||
*/
|
||||
static int Compare_text_lines(char *text1, char *text2, int *diff_count,
|
||||
int flag)
|
||||
{
|
||||
int ret, argc1= 0, argc2= 0;
|
||||
char **argv1= NULL, **argv2= NULL, *copy1= NULL, *copy2= NULL;
|
||||
|
||||
if(!(flag & 1))
|
||||
*diff_count= 0;
|
||||
if(text1 == NULL && text2 == NULL)
|
||||
return(1);
|
||||
if(text1 != NULL) {
|
||||
copy1= strdup(text1);
|
||||
if(copy1 == NULL)
|
||||
{ret= -1; goto ex;}
|
||||
ret= Text_to_argv(copy1, &argc1, &argv1, 0);
|
||||
if(ret <= 0)
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
if(text2 != NULL) {
|
||||
copy2= strdup(text2);
|
||||
if(copy2 == NULL)
|
||||
{ret= -1; goto ex;}
|
||||
ret= Text_to_argv(copy2, &argc2, &argv2, 0);
|
||||
if(ret <= 0)
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
ret= Count_diffs(argc1, argv1, argc2, argv2, 1);
|
||||
if(ret < 0)
|
||||
goto ex;
|
||||
*diff_count+= ret;
|
||||
ret= (*diff_count == 0);
|
||||
ex:;
|
||||
if(argv1 != NULL)
|
||||
free(argv1);
|
||||
if(argv2 != NULL)
|
||||
free(argv2);
|
||||
if(copy1 != NULL)
|
||||
free(copy1);
|
||||
if(copy2 != NULL)
|
||||
free(copy2);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/** Convert a text into a number of type double and multiply it by unit code
|
||||
[kmgtpe] (2^10 to 2^60) or [s] (2048). (Also accepts capital letters.)
|
||||
@param text Input like "42", "2k", "3.14m" or "-1g"
|
||||
@ -6570,6 +6696,9 @@ cannot_address:;
|
||||
bit16= symbolic link on disk pointing to dir, dir in iso
|
||||
bit17= file chunks detected and compared
|
||||
bit18= incomplete chunk collection encountered
|
||||
bit19= ACL differs (this condition sets also bit2)
|
||||
bit20= xattr differ
|
||||
>>> bit21= mismatch of recorded dev,inode
|
||||
@param flag bit0= compare atime
|
||||
bit1= compare ctime
|
||||
bit2= check only existence of both file objects
|
||||
@ -6586,10 +6715,12 @@ int Xorriso_compare_2_files(struct XorrisO *xorriso, char *disk_adr,
|
||||
int *result, int flag)
|
||||
{
|
||||
struct stat s1, s2, stbuf;
|
||||
int ret, missing= 0, is_split= 0, i, was_error= 0;
|
||||
int ret, missing= 0, is_split= 0, i, was_error= 0, diff_count= 0;
|
||||
char *respt;
|
||||
char a[5*SfileadrL], sfe[5*SfileadrL];
|
||||
char ttx1[40], ttx2[40];
|
||||
char *a1_acl= NULL, *a2_acl= NULL, *d1_acl= NULL, *d2_acl= NULL;
|
||||
char *attrlist1= NULL, *attrlist2= NULL;
|
||||
struct SplitparT *split_parts= NULL;
|
||||
int split_count= 0;
|
||||
|
||||
@ -6677,6 +6808,7 @@ int Xorriso_compare_2_files(struct XorrisO *xorriso, char *disk_adr,
|
||||
Xorriso_result(xorriso,0);
|
||||
(*result)|= 4;
|
||||
}
|
||||
|
||||
if((s1.st_mode&S_IFMT)!=(s2.st_mode&S_IFMT)) {
|
||||
sprintf(respt, "%s type : %s <> %s\n",
|
||||
a, Ftypetxt(s1.st_mode, 0), Ftypetxt(s2.st_mode, 0));
|
||||
@ -6692,6 +6824,60 @@ int Xorriso_compare_2_files(struct XorrisO *xorriso, char *disk_adr,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* ACL */
|
||||
if(xorriso->do_aaip & 3) {
|
||||
Xorriso_local_getfacl(xorriso, disk_adr, &a1_acl,
|
||||
16 | ((flag & (1 << 28)) >> 23));
|
||||
if(S_ISDIR(s1.st_mode))
|
||||
Xorriso_local_getfacl(xorriso, disk_adr, &d1_acl, 1);
|
||||
ret= Xorriso_getfacl(xorriso, NULL, iso_adr, &a2_acl, 1 | 4 | 16);
|
||||
if(ret < 0)
|
||||
goto ex;
|
||||
if(S_ISDIR(s1.st_mode)) {
|
||||
ret= Xorriso_getfacl(xorriso, NULL, iso_adr, &d2_acl, 1 | 8);
|
||||
if(ret < 0)
|
||||
goto ex;
|
||||
}
|
||||
ret= Compare_text_lines(a1_acl, a2_acl, &diff_count, 0);
|
||||
if(ret < 0)
|
||||
goto ex;
|
||||
if(ret == 0)
|
||||
(*result)|= 4 | (1 << 19);
|
||||
ret= Compare_text_lines(d1_acl, d2_acl, &diff_count, 1);
|
||||
if(ret < 0)
|
||||
goto ex;
|
||||
if(ret == 0)
|
||||
(*result)|= 4 | (1 << 19);
|
||||
if((*result) & (1 << 19)) {
|
||||
sprintf(respt, "%s ACL : %d difference%s\n",
|
||||
a, diff_count, diff_count == 1 ? "" : "s");
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
}
|
||||
}
|
||||
|
||||
/* xattr */
|
||||
if(xorriso->do_aaip & 12) {
|
||||
ret= Xorriso_getfattr(xorriso, NULL, disk_adr, &attrlist1,
|
||||
1 | 2 | ((flag & (1 << 28)) >> 23));
|
||||
if(ret < 0)
|
||||
goto ex;
|
||||
ret= Xorriso_getfattr(xorriso, NULL, iso_adr, &attrlist2, 1);
|
||||
if(ret < 0)
|
||||
goto ex;
|
||||
ret= Compare_text_lines(attrlist1, attrlist2, &diff_count, 0);
|
||||
if(ret < 0)
|
||||
goto ex;
|
||||
if(ret == 0) {
|
||||
(*result)|= (1 << 20);
|
||||
sprintf(respt, "%s xattr : %d difference%s\n",
|
||||
a, diff_count, diff_count == 1 ? "" : "s");
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
}
|
||||
}
|
||||
|
||||
if(s1.st_uid != s2.st_uid) {
|
||||
sprintf(respt, "%s st_uid : %d <> %d\n", a, s1.st_uid, s2.st_uid);
|
||||
if(!(flag&(1<<31)))
|
||||
@ -6754,6 +6940,11 @@ int Xorriso_compare_2_files(struct XorrisO *xorriso, char *disk_adr,
|
||||
(*result)|= 1024;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* >>> dev,inode comparison. Eventually skip content comparison */
|
||||
|
||||
|
||||
if(S_ISREG(s1.st_mode) && S_ISREG(s2.st_mode)) {
|
||||
/* Content */
|
||||
if(is_split) {
|
||||
@ -6801,6 +6992,12 @@ int Xorriso_compare_2_files(struct XorrisO *xorriso, char *disk_adr,
|
||||
ex:;
|
||||
if(split_parts!=NULL)
|
||||
Splitparts_destroy(&split_parts, split_count, 0);
|
||||
Xorriso_local_getfacl(xorriso, disk_adr, &a1_acl, 1 << 15);
|
||||
Xorriso_local_getfacl(xorriso, disk_adr, &d1_acl, 1 << 15);
|
||||
if(a2_acl != NULL)
|
||||
free(a2_acl);
|
||||
if(d2_acl != NULL)
|
||||
free(d2_acl);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
@ -10166,8 +10363,8 @@ delete:;
|
||||
}
|
||||
sprintf(xorriso->info_text, "Added/overwrote ");
|
||||
|
||||
} else if(compare_result&(4|16|32|256|512|1024)) {
|
||||
/* access permissions, user id, group id, mtime, atime, ctime */
|
||||
} else if(compare_result&(4|16|32|256|512|1024|(1<<19)|(1<<20))) {
|
||||
/* access permissions, user id, group id, mtime, atime, ctime, ACL, xattr */
|
||||
|
||||
if(is_split) {
|
||||
ret= Xorriso_identify_split(xorriso, iso_rr_path, NULL,
|
||||
@ -13539,7 +13736,7 @@ int Xorriso_option_getfacli(struct XorrisO *xorriso,
|
||||
Findjob_destroy(&job, 0);
|
||||
} else {
|
||||
if(flag & 2)
|
||||
ret= Xorriso_getfattr(xorriso, NULL, optv[i], 0);
|
||||
ret= Xorriso_getfattr(xorriso, NULL, optv[i], NULL, 0);
|
||||
else
|
||||
ret= Xorriso_getfacl(xorriso, NULL, optv[i], NULL, 0);
|
||||
}
|
||||
|
Reference in New Issue
Block a user