|
|
|
@ -2827,6 +2827,7 @@ int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag)
|
|
|
|
|
m->pacifier_fifo= NULL;
|
|
|
|
|
m->start_time= 0.0;
|
|
|
|
|
m->last_update_time= 0.0;
|
|
|
|
|
m->find_compare_result= 1;
|
|
|
|
|
m->result_line[0]= 0;
|
|
|
|
|
m->result_line_counter= 0;
|
|
|
|
|
m->result_page_counter= 0;
|
|
|
|
@ -4197,6 +4198,8 @@ much_too_long:;
|
|
|
|
|
|
|
|
|
|
/* @param flag bit0= compare atime
|
|
|
|
|
bit1= compare ctime
|
|
|
|
|
bit2= check only existence of both file objects
|
|
|
|
|
count one or both missing as "difference"
|
|
|
|
|
bit29= do not issue pacifier messages
|
|
|
|
|
bit30= omit adr_common_tail in report messages
|
|
|
|
|
bit31= do not issue result messages
|
|
|
|
@ -4206,7 +4209,7 @@ int Xorriso_compare_2_files(struct XorrisO *xorriso, char *disk_adr,
|
|
|
|
|
char *iso_adr, char *adr_common_tail, int flag)
|
|
|
|
|
{
|
|
|
|
|
struct stat s1, s2;
|
|
|
|
|
int ret, differs= 0, r1, r2, fd1= -1, i, done, wanted;
|
|
|
|
|
int ret, differs= 0, r1, r2, fd1= -1, i, done, wanted, missing= 0;
|
|
|
|
|
void *stream2= NULL;
|
|
|
|
|
char *respt;
|
|
|
|
|
char buf1[32*1024], buf2[32*1024], a[5*SfileadrL], sfe[5*SfileadrL];
|
|
|
|
@ -4216,11 +4219,13 @@ int Xorriso_compare_2_files(struct XorrisO *xorriso, char *disk_adr,
|
|
|
|
|
respt= xorriso->result_line;
|
|
|
|
|
ret= lstat(disk_adr, &s1);
|
|
|
|
|
if(ret==-1) {
|
|
|
|
|
sprintf(respt , "? %s : cannot lstat() : %s\n",
|
|
|
|
|
sprintf(respt , "? %s (DISK) : cannot lstat() : %s\n",
|
|
|
|
|
Text_shellsafe(disk_adr, sfe, 0), strerror(errno));
|
|
|
|
|
if(!(flag&(1<<31)))
|
|
|
|
|
Xorriso_result(xorriso,0);
|
|
|
|
|
return(0);
|
|
|
|
|
missing= 1;
|
|
|
|
|
if(!(flag&4))
|
|
|
|
|
return(0);
|
|
|
|
|
}
|
|
|
|
|
strcpy(a, Ftypetxt(s1.st_mode, 1));
|
|
|
|
|
strcat(a, " ");
|
|
|
|
@ -4238,9 +4243,14 @@ int Xorriso_compare_2_files(struct XorrisO *xorriso, char *disk_adr,
|
|
|
|
|
Text_shellsafe(iso_adr, sfe, 0));
|
|
|
|
|
if(!(flag&(1<<31)))
|
|
|
|
|
Xorriso_result(xorriso,0);
|
|
|
|
|
return(0);
|
|
|
|
|
missing= 1;
|
|
|
|
|
if(!(flag&4))
|
|
|
|
|
return(0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(flag&4)
|
|
|
|
|
return(!missing);
|
|
|
|
|
|
|
|
|
|
/* Attributes */
|
|
|
|
|
if(s1.st_mode != s2.st_mode) {
|
|
|
|
|
if((s1.st_mode&~S_IFMT)!=(s2.st_mode&~S_IFMT)) {
|
|
|
|
@ -4346,11 +4356,12 @@ int Xorriso_compare_2_files(struct XorrisO *xorriso, char *disk_adr,
|
|
|
|
|
|
|
|
|
|
wanted= sizeof(buf2);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
/* ts A80228
|
|
|
|
|
I thought to have seen a libisofs bug here but it seems that it was an illusion
|
|
|
|
|
*/
|
|
|
|
|
#define Libisofs_data_read_as_posiX yes
|
|
|
|
|
#ifndef Libisofs_data_read_as_posiX
|
|
|
|
|
/* This functions guarantees to deliver full buffers but fails on
|
|
|
|
|
/* Workaround for the case that iso_stream_read() fails on
|
|
|
|
|
oversized read requests. */
|
|
|
|
|
if(r2count+wanted>s2.st_size)
|
|
|
|
|
wanted= s2.st_size-r2count;
|
|
|
|
@ -4442,8 +4453,11 @@ int Xorriso_find_compare(struct XorrisO *xorriso, char *iso_path,
|
|
|
|
|
if(strlen(disk_prefix)+strlen(iso_path)-strlen(iso_prefix)>=SfileadrL)
|
|
|
|
|
return(-1);
|
|
|
|
|
strcpy(adrc, iso_path+strlen(iso_prefix));
|
|
|
|
|
sprintf(disk_path, "%s%s%s", disk_prefix, (adrc[0]=='/' ? "" : "/"), adrc);
|
|
|
|
|
sprintf(disk_path, "%s%s%s",
|
|
|
|
|
disk_prefix, (adrc[0]=='/' || adrc[0]==0 ? "" : "/"), adrc);
|
|
|
|
|
ret= Xorriso_compare_2_files(xorriso, disk_path, iso_path, adrc, 2|(1<<29));
|
|
|
|
|
if(ret<xorriso->find_compare_result)
|
|
|
|
|
xorriso->find_compare_result= ret;
|
|
|
|
|
return(ret);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -6019,6 +6033,57 @@ int Xorriso_lsx_filev(struct XorrisO *xorriso, char *wd,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int Xorriso_findx_action(struct XorrisO *xorriso, struct FindjoB *job,
|
|
|
|
|
char *abs_path, char *show_path, int depth, int flag)
|
|
|
|
|
{
|
|
|
|
|
int ret= 0, type, action= 0, dpl;
|
|
|
|
|
uid_t user= 0;
|
|
|
|
|
gid_t group= 0;
|
|
|
|
|
time_t date= 0;
|
|
|
|
|
mode_t mode_or= 0, mode_and= ~1;
|
|
|
|
|
char *target, sfe[5*SfileadrL], *disk_prefix, iso_path[SfileadrL];
|
|
|
|
|
struct FindjoB *subjob;
|
|
|
|
|
struct stat stbuf;
|
|
|
|
|
|
|
|
|
|
action= Findjob_get_action_parms(job, &target, &user, &group,
|
|
|
|
|
&mode_and, &mode_or, &type, &date, &subjob, 0);
|
|
|
|
|
if(action<0)
|
|
|
|
|
action= 0;
|
|
|
|
|
if(action<0)
|
|
|
|
|
action= 0;
|
|
|
|
|
if(action==15 || action==16) { /* in_iso , not_in_iso */
|
|
|
|
|
Findjob_get_start_path(job, &disk_prefix, 0);
|
|
|
|
|
if(strncmp(abs_path, disk_prefix, strlen(disk_prefix))!=0)
|
|
|
|
|
return(-1);
|
|
|
|
|
dpl= strlen(disk_prefix);
|
|
|
|
|
if(strlen(target)+strlen(abs_path)-dpl >= SfileadrL)
|
|
|
|
|
return(-1);
|
|
|
|
|
sprintf(iso_path, "%s%s%s",
|
|
|
|
|
target, (abs_path[dpl] =='/' || abs_path[dpl]==0 ? "" : "/"),
|
|
|
|
|
abs_path+dpl);
|
|
|
|
|
}
|
|
|
|
|
if(action==15) {
|
|
|
|
|
ret= Xorriso_iso_lstat(xorriso, iso_path, &stbuf, 0);
|
|
|
|
|
if(ret==-1)
|
|
|
|
|
return(1);
|
|
|
|
|
sprintf(xorriso->result_line, "%s\n", Text_shellsafe(show_path, sfe, 0));
|
|
|
|
|
Xorriso_result(xorriso, 0);
|
|
|
|
|
ret= 1;
|
|
|
|
|
} else if(action==16) {
|
|
|
|
|
ret= Xorriso_compare_2_files(xorriso, abs_path, iso_path, abs_path+dpl, 4);
|
|
|
|
|
if(ret<xorriso->find_compare_result)
|
|
|
|
|
xorriso->find_compare_result= ret;
|
|
|
|
|
if(ret>=0)
|
|
|
|
|
ret= 1;
|
|
|
|
|
} else {
|
|
|
|
|
sprintf(xorriso->result_line, "%s\n", Text_shellsafe(show_path, sfe, 0));
|
|
|
|
|
Xorriso_result(xorriso, 0);
|
|
|
|
|
ret= 1;
|
|
|
|
|
}
|
|
|
|
|
return(ret);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* @param flag bit0=recursion
|
|
|
|
|
*/
|
|
|
|
|
int Xorriso_findx(struct XorrisO *xorriso, struct FindjoB *job,
|
|
|
|
@ -6078,8 +6143,16 @@ int Xorriso_findx(struct XorrisO *xorriso, struct FindjoB *job,
|
|
|
|
|
if(ret<0)
|
|
|
|
|
goto ex;
|
|
|
|
|
if(ret>0) {
|
|
|
|
|
#ifdef NIX
|
|
|
|
|
sprintf(xorriso->result_line, "%s\n", Text_shellsafe(dir_path, sfe, 0));
|
|
|
|
|
Xorriso_result(xorriso, 0);
|
|
|
|
|
#else
|
|
|
|
|
ret= Xorriso_findx_action(xorriso, job, abs_dir_path, dir_path, depth, 0);
|
|
|
|
|
if(ret<=0) {
|
|
|
|
|
if(Xorriso_eval_problem_status(xorriso, ret, 1|2)<0)
|
|
|
|
|
goto ex;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if(!S_ISDIR(dir_stbuf->st_mode))
|
|
|
|
@ -6127,8 +6200,18 @@ int Xorriso_findx(struct XorrisO *xorriso, struct FindjoB *job,
|
|
|
|
|
if(ret<0)
|
|
|
|
|
goto ex;
|
|
|
|
|
if(ret>0) {
|
|
|
|
|
|
|
|
|
|
#ifdef NIX
|
|
|
|
|
sprintf(xorriso->result_line, "%s\n", Text_shellsafe(path, sfe, 0));
|
|
|
|
|
Xorriso_result(xorriso, 0);
|
|
|
|
|
#else
|
|
|
|
|
ret= Xorriso_findx_action(xorriso, job, abs_path, path, depth, 0);
|
|
|
|
|
if(ret<=0) {
|
|
|
|
|
if(Xorriso_eval_problem_status(xorriso, ret, 1|2)<0)
|
|
|
|
|
goto ex;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
if(!S_ISDIR(stbuf.st_mode))
|
|
|
|
|
no_dive= 1;
|
|
|
|
@ -7656,13 +7739,14 @@ int Xorriso_option_commit_eject(struct XorrisO *xorriso, char *which, int flag)
|
|
|
|
|
@param flag bit0= issue summary message
|
|
|
|
|
bit1= do not reset pacifier, no final pacifier message
|
|
|
|
|
bit2= do not issue pacifier messages at all
|
|
|
|
|
bit3= recursive: -compare_r
|
|
|
|
|
*/
|
|
|
|
|
int Xorriso_option_compare(struct XorrisO *xorriso, char *disk_path,
|
|
|
|
|
char *iso_path, int flag)
|
|
|
|
|
{
|
|
|
|
|
int ret, mem_pci;
|
|
|
|
|
int ret, mem_pci, zero= 0;
|
|
|
|
|
double mem_lut;
|
|
|
|
|
char *ipth;
|
|
|
|
|
char *ipth, *argv[4];
|
|
|
|
|
|
|
|
|
|
ipth= iso_path;
|
|
|
|
|
if(ipth[0]==0)
|
|
|
|
@ -7674,15 +7758,40 @@ int Xorriso_option_compare(struct XorrisO *xorriso, char *disk_path,
|
|
|
|
|
}
|
|
|
|
|
mem_pci= xorriso->pacifier_interval;
|
|
|
|
|
xorriso->pacifier_interval= 5.0;
|
|
|
|
|
ret= Xorriso_compare_2_files(xorriso, disk_path, ipth, "",
|
|
|
|
|
2| (1<<30) | ((flag&4)<<27));
|
|
|
|
|
|
|
|
|
|
if(flag&8) {
|
|
|
|
|
xorriso->find_compare_result= 1;
|
|
|
|
|
argv[0]= ipth;
|
|
|
|
|
argv[1]= "-exec";
|
|
|
|
|
argv[2]= "compare";
|
|
|
|
|
argv[3]= disk_path;
|
|
|
|
|
zero= 0;
|
|
|
|
|
ret= Xorriso_option_find(xorriso, 4, argv, &zero, 2); /* -findi */
|
|
|
|
|
if(ret>0) {
|
|
|
|
|
argv[0]= disk_path;
|
|
|
|
|
argv[1]= "-exec";
|
|
|
|
|
argv[2]= "not_in_iso";
|
|
|
|
|
argv[3]= ipth;
|
|
|
|
|
zero= 0;
|
|
|
|
|
ret= Xorriso_option_find(xorriso, 4, argv, &zero, 1|2); /* -findx */
|
|
|
|
|
if(ret>0)
|
|
|
|
|
ret= xorriso->find_compare_result;
|
|
|
|
|
else
|
|
|
|
|
ret= -1;
|
|
|
|
|
} else
|
|
|
|
|
ret= -1;
|
|
|
|
|
} else {
|
|
|
|
|
ret= Xorriso_compare_2_files(xorriso, disk_path, ipth, "",
|
|
|
|
|
2| (1<<30) | ((flag&4)<<27));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
xorriso->pacifier_interval= mem_pci;
|
|
|
|
|
if(mem_lut!=xorriso->last_update_time && !(flag&2))
|
|
|
|
|
Xorriso_pacifier_callback(xorriso, "content bytes read",
|
|
|
|
|
xorriso->pacifier_count, 0, "", 1);
|
|
|
|
|
if(ret>0) {
|
|
|
|
|
sprintf(xorriso->result_line,
|
|
|
|
|
"Ok. Both files match as far as expectable.\n");
|
|
|
|
|
"Ok. Both file objects match as far as expectable.\n");
|
|
|
|
|
} else if(ret==0) {
|
|
|
|
|
sprintf(xorriso->result_line, "Not ok. Differences detected.\n");
|
|
|
|
|
} else {
|
|
|
|
@ -8117,13 +8226,15 @@ sorry_ex:
|
|
|
|
|
|
|
|
|
|
/* Option -find alias -findi, and -findx */
|
|
|
|
|
/* @param flag bit0= -findx rather than -findi
|
|
|
|
|
bit1= do not reset pacifier, no final pacifier message
|
|
|
|
|
do not reset find_compare_result
|
|
|
|
|
*/
|
|
|
|
|
int Xorriso_option_find(struct XorrisO *xorriso, int argc, char **argv,
|
|
|
|
|
int *idx, int flag)
|
|
|
|
|
{
|
|
|
|
|
int ret, i, end_idx, type= 0;
|
|
|
|
|
int ret, i, end_idx, type= 0, action;
|
|
|
|
|
struct FindjoB *job, *first_job= NULL, *new_job;
|
|
|
|
|
char *start_path, sfe[5*SfileadrL], *cpt, disk_path_start[SfileadrL];
|
|
|
|
|
char *start_path, sfe[5*SfileadrL], *cpt, other_path_start[SfileadrL];
|
|
|
|
|
struct stat dir_stbuf;
|
|
|
|
|
uid_t user= 0;
|
|
|
|
|
gid_t group= 0;
|
|
|
|
@ -8141,7 +8252,8 @@ int Xorriso_option_find(struct XorrisO *xorriso, int argc, char **argv,
|
|
|
|
|
{ret= -1; goto ex;}
|
|
|
|
|
}
|
|
|
|
|
job= first_job;
|
|
|
|
|
|
|
|
|
|
if(!(flag&2))
|
|
|
|
|
xorriso->find_compare_result= 1;
|
|
|
|
|
for(i= *idx+1; i<end_idx; i++) {
|
|
|
|
|
if(strcmp(argv[i], "-name")==0) {
|
|
|
|
|
if(i+1>=end_idx) {
|
|
|
|
@ -8247,17 +8359,37 @@ not_enough_arguments:;
|
|
|
|
|
if(i+1>=end_idx)
|
|
|
|
|
goto not_enough_arguments;
|
|
|
|
|
i++;
|
|
|
|
|
ret= Xorriso_make_abs_adr(xorriso, xorriso->wdi, argv[i],
|
|
|
|
|
disk_path_start, 1|2|4);
|
|
|
|
|
ret= Xorriso_make_abs_adr(xorriso, xorriso->wdx, argv[i],
|
|
|
|
|
other_path_start, 1|2|4|8);
|
|
|
|
|
if(ret<=0)
|
|
|
|
|
goto ex;
|
|
|
|
|
Findjob_set_action_target(job, 14, disk_path_start, 0);
|
|
|
|
|
Findjob_set_action_target(job, 14, other_path_start, 0);
|
|
|
|
|
ret= Xorriso_make_abs_adr(xorriso, xorriso->wdi, start_path,sfe, 1|2|4);
|
|
|
|
|
if(ret<=0)
|
|
|
|
|
goto ex;
|
|
|
|
|
Findjob_set_start_path(job, sfe, 0);
|
|
|
|
|
Xorriso_pacifier_reset(xorriso, 0);
|
|
|
|
|
mem_lut= xorriso->last_update_time;
|
|
|
|
|
if(!(flag&2)) {
|
|
|
|
|
Xorriso_pacifier_reset(xorriso, 0);
|
|
|
|
|
mem_lut= xorriso->last_update_time;
|
|
|
|
|
}
|
|
|
|
|
} else if(strcmp(cpt, "in_iso")==0 || strcmp(cpt, "not_in_iso")==0) {
|
|
|
|
|
if(i+1>=end_idx)
|
|
|
|
|
goto not_enough_arguments;
|
|
|
|
|
i++;
|
|
|
|
|
ret= Xorriso_make_abs_adr(xorriso, xorriso->wdi, argv[i],
|
|
|
|
|
other_path_start, 1|2|4);
|
|
|
|
|
if(ret<=0)
|
|
|
|
|
goto ex;
|
|
|
|
|
if(strcmp(cpt, "in_iso")==0)
|
|
|
|
|
action= 15;
|
|
|
|
|
else
|
|
|
|
|
action= 16;
|
|
|
|
|
Findjob_set_action_target(job, action, other_path_start, 0);
|
|
|
|
|
ret= Xorriso_make_abs_adr(xorriso, xorriso->wdx, start_path, sfe,
|
|
|
|
|
1|2|4|8);
|
|
|
|
|
if(ret<=0)
|
|
|
|
|
goto ex;
|
|
|
|
|
Findjob_set_start_path(job, sfe, 0);
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
sprintf(xorriso->info_text, "-find -exec: unknown action %s",
|
|
|
|
@ -8287,7 +8419,7 @@ sorry_ex:;
|
|
|
|
|
else
|
|
|
|
|
ret= Xorriso_findi(xorriso, first_job, NULL, start_path, &dir_stbuf, 0, 0);
|
|
|
|
|
ex:;
|
|
|
|
|
if(mem_lut!=xorriso->last_update_time && mem_lut!=0.0)
|
|
|
|
|
if(mem_lut!=xorriso->last_update_time && mem_lut!=0.0 && !(flag&2))
|
|
|
|
|
Xorriso_pacifier_callback(xorriso, "content bytes read",
|
|
|
|
|
xorriso->pacifier_count, 0, "", 1);
|
|
|
|
|
Findjob_destroy(&first_job, 0);
|
|
|
|
@ -9910,6 +10042,10 @@ next_command:;
|
|
|
|
|
(*idx)+= 2;
|
|
|
|
|
ret= Xorriso_option_compare(xorriso, arg1, arg2, 1);
|
|
|
|
|
|
|
|
|
|
} else if(strcmp(cmd,"compare_r")==0) {
|
|
|
|
|
(*idx)+= 2;
|
|
|
|
|
ret= Xorriso_option_compare(xorriso, arg1, arg2, 1|8);
|
|
|
|
|
|
|
|
|
|
} else if(strcmp(cmd,"cpr")==0 || strcmp(cmd,"cpri")==0) {
|
|
|
|
|
ret= Xorriso_option_cpri(xorriso, argc, argv, idx, 0);
|
|
|
|
|
|
|
|
|
|