From 10a8ce35e876f2060db7c69cad0fffa6b47aaab1 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Wed, 5 Mar 2008 17:34:06 +0000 Subject: [PATCH] Made -compare* and -update* obey -follow links (-follow mount still not correct) --- xorriso/xorriso.c | 64 +++++++++++++++++++++---------------- xorriso/xorriso_timestamp.h | 2 +- xorriso/xorrisoburn.c | 49 +++++++++++++++++++++------- 3 files changed, 75 insertions(+), 40 deletions(-) diff --git a/xorriso/xorriso.c b/xorriso/xorriso.c index 0dd0b958..ae4732a4 100644 --- a/xorriso/xorriso.c +++ b/xorriso/xorriso.c @@ -4177,11 +4177,12 @@ int Xorriso_make_abs_adr(struct XorrisO *xorriso, char *wd, char *name, if(strlen(wd)+1>=SfileadrL) goto much_too_long; strcpy(adr, wd); - if(Sfile_add_to_path(adr, name, 0)<=0) { + if(name[0]) + if(Sfile_add_to_path(adr, name, 0)<=0) { much_too_long:; - Xorriso_much_too_long(xorriso, (int) (strlen(adr)+strlen(name)+1), 2); - return(0); - } + Xorriso_much_too_long(xorriso, (int) (strlen(adr)+strlen(name)+1), 2); + return(0); + } } else { if(strlen(name)+1>=SfileadrL) goto much_too_long; @@ -4484,12 +4485,13 @@ I thought to have seen a libisofs bug here but it seems that it was an illusion /* @param boss_iter Opaque handle to be forwarded to actions in ISO image Set to NULL if calling this function from outside ISO world @param flag bit0= update rather than compare + bit1= find[ix] is in recursion */ int Xorriso_find_compare(struct XorrisO *xorriso, void *boss_iter, char *iso_path, char *iso_prefix, char *disk_prefix, int flag) { - int ret, result, uret; + int ret, result, uret, follow_links; char disk_path[SfileadrL], adrc[SfileadrL]; if(strncmp(iso_path, iso_prefix, strlen(iso_prefix))!=0) @@ -4505,14 +4507,16 @@ int Xorriso_find_compare(struct XorrisO *xorriso, void *boss_iter, if(ret<=0) return(ret); + follow_links= (xorriso->do_follow_links || + (xorriso->do_follow_param && !(flag&2))) <<28; ret= Xorriso_compare_2_files(xorriso, disk_path, iso_path, adrc, &result, - 2|(1<<29)); + 2|follow_links|(1<<29)); if(retfind_compare_result) xorriso->find_compare_result= ret; if(flag&1) { if(ret==0) { - uret= Xorriso_update_interpreter(xorriso, boss_iter, - result, disk_path, iso_path, 0); + uret= Xorriso_update_interpreter(xorriso, boss_iter, result, + disk_path, iso_path, (flag&2)<<1); if(uret<=0) ret= 0; } @@ -6092,6 +6096,8 @@ int Xorriso_lsx_filev(struct XorrisO *xorriso, char *wd, } +/* @param flag bit0= recursion +*/ int Xorriso_findx_action(struct XorrisO *xorriso, struct FindjoB *job, char *abs_path, char *show_path, int depth, int flag) { @@ -6146,7 +6152,7 @@ int Xorriso_findx_action(struct XorrisO *xorriso, struct FindjoB *job, xorriso->find_compare_result= ret; if(ret==0) { uret= Xorriso_update_interpreter(xorriso, NULL, compare_result, - abs_path, iso_path, 0); + abs_path, iso_path, (flag&1)<<2); if(uret<=0) ret= 0; } @@ -6224,7 +6230,8 @@ int Xorriso_findx(struct XorrisO *xorriso, struct FindjoB *job, 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); + ret= Xorriso_findx_action(xorriso, job, abs_dir_path, dir_path, depth, + flag&1); if(ret<=0) { if(Xorriso_eval_problem_status(xorriso, ret, 1|2)<0) goto ex; @@ -6277,18 +6284,11 @@ 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); + ret= Xorriso_findx_action(xorriso, job, abs_path, path, depth, flag&1); 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; @@ -7081,6 +7081,7 @@ ex:; /* @param boss_iter Opaque handle to be forwarded to actions in ISO image Set to NULL if calling this function from outside ISO world + @param flag bit2= -follow: this is not a command parameter */ int Xorriso_update_interpreter(struct XorrisO *xorriso, void *boss_iter, int compare_result, char *disk_path, @@ -7099,14 +7100,20 @@ int Xorriso_update_interpreter(struct XorrisO *xorriso, void *boss_iter, } xorriso->info_text[0]= 0; +#ifdef NIX if((compare_result&(8|64)) && !(compare_result&(1<<16)) ) { - /* file type, minor+major with device file */ /* <<< tolerate for now: disk_path being softlink to dir, iso being dir */ /* <<< to be obsoleted by proper link handling in compare_2_files */ - - ret= Xorriso_rmi(xorriso, boss_iter, iso_rr_path, 1); + /* file type, minor+major with device file */ +#else + if(compare_result&(8|64)) { + /* file type, minor+major with device file */ +#endif /* NIX */ + + ret= Xorriso_rmi(xorriso, boss_iter, iso_rr_path, 1); /* rm_r */ if(ret>0) - ret= Xorriso_graft_in(xorriso, boss_iter, disk_path, iso_rr_path, 2); + ret= Xorriso_graft_in(xorriso, boss_iter, disk_path, iso_rr_path, + 2|(flag&4)); sprintf(xorriso->info_text, "Deleted and re-added "); } else if(compare_result&(1)) { @@ -7117,7 +7124,8 @@ int Xorriso_update_interpreter(struct XorrisO *xorriso, void *boss_iter, } else if(compare_result&(2|128|(1<<12)|(1<<14)|(1<<15))) { /* iso_adr not existing, size, cannot open iso file, early eof of iso file content bytes differ */ - ret= Xorriso_graft_in(xorriso, boss_iter, disk_path, iso_rr_path, 2); + ret= Xorriso_graft_in(xorriso, boss_iter, disk_path, iso_rr_path, + 2|(flag&4)); sprintf(xorriso->info_text, "Added/overwrote "); } else if(compare_result&(4|16|32|256|512|1024)) { @@ -7881,7 +7889,7 @@ int Xorriso_option_commit_eject(struct XorrisO *xorriso, char *which, int flag) int Xorriso_option_compare(struct XorrisO *xorriso, char *disk_path, char *iso_path, int flag) { - int ret, mem_pci, zero= 0, result; + int ret, mem_pci, zero= 0, result, follow_links; double mem_lut= 0.0; char *ipth, *argv[4]; @@ -7918,8 +7926,9 @@ int Xorriso_option_compare(struct XorrisO *xorriso, char *disk_path, } else ret= -1; } else { + follow_links= (xorriso->do_follow_links || xorriso->do_follow_param) << 28; ret= Xorriso_compare_2_files(xorriso, disk_path, ipth, "", &result, - 2| (1<<30) | ((flag&4)<<27)); + 2 | follow_links | ((flag&4)<<27) | (1<<30)); } xorriso->pacifier_interval= mem_pci; @@ -9991,7 +10000,7 @@ int Xorriso_option_uid(struct XorrisO *xorriso, char *uid, int flag) int Xorriso_option_update(struct XorrisO *xorriso, char *disk_path, char *iso_path, int flag) { - int ret, mem_pci, zero= 0, result, uret; + int ret, mem_pci, zero= 0, result, uret, follow_links; double mem_lut= 0.0, start_time; char *ipth, *argv[4]; struct stat stbuf; @@ -10039,8 +10048,9 @@ int Xorriso_option_update(struct XorrisO *xorriso, char *disk_path, ret= -1; } else { /* compare ctime too, no filename reporting, eventually silent */ + follow_links= (xorriso->do_follow_links || xorriso->do_follow_param) <<28; ret= Xorriso_compare_2_files(xorriso, disk_path, ipth, "", &result, - 2| (1<<30) | ((flag&4)<<27)); + 2 | follow_links | ((flag&4)<<27) | (1<<30)); if(ret==0) { uret= Xorriso_update_interpreter(xorriso, NULL, result, disk_path, ipth, 0); diff --git a/xorriso/xorriso_timestamp.h b/xorriso/xorriso_timestamp.h index 3b5eee23..3fe44ebf 100644 --- a/xorriso/xorriso_timestamp.h +++ b/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2008.03.05.125118" +#define Xorriso_timestamP "2008.03.05.173329" diff --git a/xorriso/xorrisoburn.c b/xorriso/xorrisoburn.c index 5f726fca..8868c853 100644 --- a/xorriso/xorrisoburn.c +++ b/xorriso/xorrisoburn.c @@ -1780,6 +1780,7 @@ int Xorriso_copy_properties(struct XorrisO *xorriso, Set to NULL if calling this function from outside ISO world @param flag bit0= mkdir: graft in as empty directory, not as copy from disk bit1= do not report added files + bit2= -follow: this is not a command parameter @return <=0 = error , 1 = added simple node , 2 = added directory */ int Xorriso_graft_in(struct XorrisO *xorriso, void *boss_iter, @@ -1787,9 +1788,10 @@ int Xorriso_graft_in(struct XorrisO *xorriso, void *boss_iter, { IsoImage *volume; char path[SfileadrL], *apt, *npt, *cpt, sfe[5*SfileadrL], sfe2[5*SfileadrL]; + char *disk_path_pt, resolved_disk_path[SfileadrL]; IsoDir *dir, *hdir; IsoNode *node; - int done= 0, is_dir= 0, l, ret, target_is_dir, source_is_dir; + int done= 0, is_dir= 0, l, ret, target_is_dir, source_is_dir, resolve_link= 0; struct stat stbuf; for(cpt= img_path; 1; cpt++) { @@ -1824,10 +1826,21 @@ int Xorriso_graft_in(struct XorrisO *xorriso, void *boss_iter, apt= npt= path; if(!(flag&1)) { - if(xorriso->do_follow_links || xorriso->do_follow_param) - ret= stat(disk_path, &stbuf); - else - ret= lstat(disk_path, &stbuf); + ret= lstat(disk_path, &stbuf); + if(ret!=-1) { + if(S_ISDIR(stbuf.st_mode)) + is_dir= 1; + else if((stbuf.st_mode&S_IFMT)==S_IFLNK && + (xorriso->do_follow_links || + (xorriso->do_follow_param && !(flag&4)))) { + resolve_link= 1; + ret= stat(disk_path, &stbuf); + if(ret!=-1) { + if(S_ISDIR(stbuf.st_mode)) + is_dir= 1; + } + } + } if(ret == -1) { Xorriso_process_msg_queues(xorriso,0); Xorriso_msgs_submit(xorriso, 0, disk_path, 0, "ERRFILE", 0); @@ -1962,7 +1975,14 @@ attach_source:; return(ret); } else { - ret= iso_tree_add_node(volume, dir, disk_path, &node); + if(resolve_link) { + ret= Xorriso_resolve_link(xorriso, disk_path, resolved_disk_path, 0); + if(ret<=0) + return(ret); + disk_path_pt= resolved_disk_path; + } else + disk_path_pt= disk_path; + ret= iso_tree_add_node(volume, dir, disk_path_pt, &node); if(ret<0) { Xorriso_process_msg_queues(xorriso,0); Xorriso_msgs_submit(xorriso, 0, disk_path, 0, "ERRFILE", 0); @@ -3761,6 +3781,8 @@ int Xorriso_set_time(struct XorrisO *xorriso, char *in_path, time_t t, } +/* @param flag bit0= not a command parameter (directory iteration or recursion) +*/ int Xorriso_findi_action(struct XorrisO *xorriso, struct FindjoB *job, IsoDirIter *boss_iter, off_t boss_mem, char *abs_path, char *show_path, @@ -3803,11 +3825,11 @@ int Xorriso_findi_action(struct XorrisO *xorriso, struct FindjoB *job, } else if(action>=9 && action<=13) { /* actions which have own findjobs */ Findjob_set_start_path(subjob, abs_path, 0); ret= Xorriso_findi(xorriso, subjob, boss_iter, boss_mem, NULL, - abs_path, &dir_stbuf, depth, 0); + abs_path, &dir_stbuf, depth, 1); } else if(action==14 || action==17) { /* compare , update */ Findjob_get_start_path(job, &iso_prefix, 0); - ret= Xorriso_find_compare(xorriso, (void *) boss_iter, abs_path, iso_prefix, target, - (action==17)); + ret= Xorriso_find_compare(xorriso, (void *) boss_iter, abs_path, + iso_prefix, target, (action==17)|((flag&1)<<1)); if(ret>=0) ret= 1; } else if(action==16 || action==18) { /* not_in_iso , add_missing */ @@ -3943,6 +3965,8 @@ cannot_iter:; } +/* @param flag bit0= recursion +*/ int Xorriso_findi(struct XorrisO *xorriso, struct FindjoB *job, void *boss_iter, off_t boss_mem, void *dir_node_generic, char *dir_path, @@ -4008,7 +4032,8 @@ int Xorriso_findi(struct XorrisO *xorriso, struct FindjoB *job, if(ret>0) { ret= Xorriso_findi_action(xorriso, job, (IsoDirIter *) boss_iter, boss_mem, - path, dir_path, (IsoNode *) dir_node, depth, 0); + path, dir_path, (IsoNode *) dir_node, depth, + flag&1); if(ret<=0) goto ex; } @@ -4061,7 +4086,7 @@ int Xorriso_findi(struct XorrisO *xorriso, struct FindjoB *job, if(ret<=0) goto ex; ret= Xorriso_findi_action(xorriso, job, iter, mem, - abs_path, path, node, depth, 0); + abs_path, path, node, depth, 1); if(ret<=0) { if(Xorriso_eval_problem_status(xorriso, ret, 1|2)<0) goto ex; @@ -4070,7 +4095,7 @@ int Xorriso_findi(struct XorrisO *xorriso, struct FindjoB *job, if(S_ISDIR(stbuf.st_mode)) { ret= Xorriso_findi(xorriso, job, (void *) iter, mem, - (void *) node, path, &stbuf, depth+1, flag); + (void *) node, path, &stbuf, depth+1, flag|1); if(ret<0) goto ex; }