Took into respect ACL and xattr with -compare and -update

This commit is contained in:
2009-02-16 08:26:53 +00:00
parent ef8333effe
commit 1251c6e135
5 changed files with 486 additions and 111 deletions

View File

@ -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);
}