diff --git a/xorriso/xorriso.1 b/xorriso/xorriso.1 index e8d561e8..35315d5c 100644 --- a/xorriso/xorriso.1 +++ b/xorriso/xorriso.1 @@ -1325,6 +1325,12 @@ exist in the ISO image. E.g. .br -find /home/thomas -exec add_missing /thomas_on_cd +.br +"is_full_in_iso" iso_rr_path_start reports if the counterpart in the ISO image +contains files. To be used with -type "m" to report mount points. +.br +"empty_iso_dir" iso_rr_path_start deletes all files from the counterpart +in the ISO image. To be used with -type "m" to truncate mount points. .TP \fB\-compare\fR disk_path iso_rr_path Compare attributes and eventual data file content of a fileobject in the diff --git a/xorriso/xorriso.c b/xorriso/xorriso.c index 838a4b16..29c8580b 100644 --- a/xorriso/xorriso.c +++ b/xorriso/xorriso.c @@ -2405,7 +2405,8 @@ struct FindjoB { 16= not_in_iso 17= update 18= add_missing ->>>19= empty_iso_dir + 19= empty_iso_dir + 20= is_full_in_iso */ int action; char *target; @@ -6143,7 +6144,7 @@ int Xorriso_findx_action(struct XorrisO *xorriso, struct FindjoB *job, action= 0; if(action<0) action= 0; - if(action==15 || action==16 || action==18 || action==19) { + if(action==15 || action==16 || action==18 || action==19 || action==20) { /* in_iso , not_in_iso, add_missing */ Findjob_get_start_path(job, &disk_prefix, 0); if(strncmp(abs_path, disk_prefix, strlen(disk_prefix))!=0) @@ -6197,6 +6198,23 @@ int Xorriso_findx_action(struct XorrisO *xorriso, struct FindjoB *job, Text_shellsafe(iso_path, sfe, 0)); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "UPDATE", 0); } + } else if(action==20) { /* is_full_in_iso */ + ret= Xorriso_iso_lstat(xorriso, iso_path, &stbuf, 0); + if(ret==-1) + return(1); + if(!S_ISDIR(stbuf.st_mode)) + return(1); + strcpy(sfe, xorriso->wdi); + strcpy(xorriso->wdi, iso_path); + ret= Xorriso_ls(xorriso, 4|8); + strcpy(xorriso->wdi, sfe); + if(ret>0) { + sprintf(xorriso->result_line, + "d %s (ISO) : non-empty directory (would not match mount point)\n", + Text_shellsafe(iso_path, sfe, 0)); + Xorriso_result(xorriso,0); + } + return(1); } else { sprintf(xorriso->result_line, "%s\n", Text_shellsafe(show_path, sfe, 0)); Xorriso_result(xorriso, 0); @@ -7925,7 +7943,7 @@ int Xorriso_option_compare(struct XorrisO *xorriso, char *disk_path, { int ret, mem_pci, zero= 0, result, follow_links; double mem_lut= 0.0; - char *ipth, *argv[4]; + char *ipth, *argv[6]; ipth= iso_path; if(ipth[0]==0) @@ -7953,6 +7971,16 @@ int Xorriso_option_compare(struct XorrisO *xorriso, char *disk_path, argv[3]= ipth; zero= 0; ret= Xorriso_option_find(xorriso, 4, argv, &zero, 1|2); /* -findx */ + if(ret>0 && !xorriso->do_follow_mount) { + argv[0]= disk_path; + argv[1]= "-type"; + argv[2]= "m"; + argv[3]= "-exec"; + argv[4]= "is_full_in_iso"; + argv[5]= ipth; + zero= 0; + ret= Xorriso_option_find(xorriso, 6, argv, &zero, 1|2); /* -findx */ + } if(ret>0) ret= xorriso->find_compare_result; else @@ -8561,7 +8589,8 @@ not_enough_arguments:; } else if(strcmp(cpt, "in_iso")==0 || strcmp(cpt, "not_in_iso")==0 || strcmp(cpt, "add_missing")==0 || - strcmp(cpt, "empty_iso_dir")==0) { + strcmp(cpt, "empty_iso_dir")==0 || + strcmp(cpt, "is_full_in_iso")==0) { if(i+1>=end_idx) goto not_enough_arguments; i++; @@ -8575,6 +8604,8 @@ not_enough_arguments:; action= 18; else if(strcmp(cpt, "empty_iso_dir")==0) action= 19; + else if(strcmp(cpt, "is_full_in_iso")==0) + action= 20; else action= 16; Findjob_set_action_target(job, action, other_path_start, 0); @@ -10046,7 +10077,7 @@ int Xorriso_option_update(struct XorrisO *xorriso, char *disk_path, { int ret, mem_pci, zero= 0, result, uret, follow_links; double mem_lut= 0.0, start_time; - char *ipth, *argv[4]; + char *ipth, *argv[6]; struct stat stbuf; start_time= Sfile_microtime(0); @@ -10083,6 +10114,16 @@ int Xorriso_option_update(struct XorrisO *xorriso, char *disk_path, argv[3]= ipth; zero= 0; ret= Xorriso_option_find(xorriso, 4, argv, &zero, 1|2); /* -findx */ + if(ret>0 && !xorriso->do_follow_mount) { + argv[0]= disk_path; + argv[1]= "-type"; + argv[2]= "m"; + argv[3]= "-exec"; + argv[4]= "empty_iso_dir"; + argv[5]= ipth; + zero= 0; + ret= Xorriso_option_find(xorriso, 6, argv, &zero, 1|2); /* -findx */ + } if(ret>0) ret= xorriso->find_compare_result; else diff --git a/xorriso/xorriso_timestamp.h b/xorriso/xorriso_timestamp.h index 545895cb..245cf3a2 100644 --- a/xorriso/xorriso_timestamp.h +++ b/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2008.03.07.182411" +#define Xorriso_timestamP "2008.03.07.220442" diff --git a/xorriso/xorrisoburn.c b/xorriso/xorrisoburn.c index 96114593..92f34694 100644 --- a/xorriso/xorrisoburn.c +++ b/xorriso/xorrisoburn.c @@ -3414,6 +3414,7 @@ int Xorriso_ls_filev(struct XorrisO *xorriso, char *wd, @param flag bit0= long format bit1= only check for directory existence bit2= do not apply search pattern but accept any file + bit3= just count nodes and return number */ int Xorriso_ls(struct XorrisO *xorriso, int flag) { @@ -3468,7 +3469,8 @@ cannot_create_iter:; iso_dir_iter_free(iter); iter= NULL; Xorriso_process_msg_queues(xorriso,0); - + if(flag&8) + {ret= filec; goto ex;} sprintf(xorriso->info_text, "Valid ISO nodes found: %d\n", filec); Xorriso_info(xorriso,1); @@ -3530,7 +3532,7 @@ ex:; Xorriso_process_msg_queues(xorriso,0); if(node_array!=NULL) free((char *) node_array); - return(1); + return(ret); } /* @param boss_iter Opaque handle to be forwarded to actions in ISO image diff --git a/xorriso/xorrisoburn.h b/xorriso/xorrisoburn.h index f9f0fc42..7ce4aa56 100644 --- a/xorriso/xorrisoburn.h +++ b/xorriso/xorrisoburn.h @@ -94,6 +94,7 @@ int Xorriso_ls_filev(struct XorrisO *xorriso, char *wd, @param flag bit0= long format bit1= only check for directory existence bit2= do not apply search pattern but accept any file + bit3= just count nodes and return number */ int Xorriso_ls(struct XorrisO *xorriso, int flag);