From 28d68a79a52c1598c3100e201efee36584d4d225 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Sat, 3 May 2008 22:32:51 +0000 Subject: [PATCH] Working towards exclusion of user defined absolute paths and leaf patterns --- xorriso/xorriso.c | 100 +++++++++++++++++++++++++++--------- xorriso/xorriso_private.h | 4 +- xorriso/xorriso_timestamp.h | 2 +- xorriso/xorrisoburn.c | 3 ++ 4 files changed, 82 insertions(+), 27 deletions(-) diff --git a/xorriso/xorriso.c b/xorriso/xorriso.c index 53ef267a..60dce153 100644 --- a/xorriso/xorriso.c +++ b/xorriso/xorriso.c @@ -2680,19 +2680,29 @@ int Exclusions_add_not_leafs(struct ExclusionS *o, char *not_leafs_descr, } -/* @return 0=no match , 1=not_paths , 2=not_leafs, <0=error +/* @param flag bit0= whole subtree is banned with -not_paths + @return 0=no match , 1=not_paths , 2=not_leafs, <0=error */ int Exclusions_match(struct ExclusionS *o, char *abs_path, int flag) { struct LstrinG *s; char leaf[SfileadrL], *leaf_pt; regmatch_t match[1]; - int ret, was_non_slash; + int ret, was_non_slash, l; /* test abs_paths */ - for(s= o->not_paths; s!=NULL; s= s->next) - if(strcmp(abs_path, s->text)==0) - return(1); + if(flag&1) { + for(s= o->not_paths; s!=NULL; s= s->next) { + l= strlen(s->text); + if(strncmp(abs_path, s->text, l)==0) + if(abs_path[l]=='/' || abs_path[l]==0) + return(1); + } + } else { + for(s= o->not_paths; s!=NULL; s= s->next) + if(strcmp(abs_path, s->text)==0) + return(1); + } /* determine leafname */ was_non_slash= 0; @@ -3962,10 +3972,11 @@ int Xorriso_status(struct XorrisO *xorriso, char *filter, FILE *fp, int flag) } is_default= (xorriso->disk_excl_mode==1); - sprintf(line, "-not_mgt %s:%s:%s\n", + sprintf(line, "-not_mgt %s:%s:%s:%s\n", (xorriso->disk_excl_mode&1 ? "on" : "off"), (xorriso->disk_excl_mode&2 ? "param_on" : "param_off"), - (xorriso->disk_excl_mode&4 ? "subtree_on" : "subtree_off")); + (xorriso->disk_excl_mode&4 ? "subtree_on" : "subtree_off"), + (xorriso->disk_excl_mode&8 ? "ignore_on" : "ignore_off")); if(!(is_default && no_defaults)) Xorriso_status_result(xorriso,filter,fp,flag&2); @@ -4429,6 +4440,7 @@ cannot_address:; bit1= compare ctime bit2= check only existence of both file objects count one or both missing as "difference" + bit27= for Xorriso_path_is_excluded(): bit0 bit28= examine eventual disk_path link target rather than link bit29= do not issue pacifier messages bit30= omit adr_common_tail in report messages @@ -4453,19 +4465,37 @@ int Xorriso_compare_2_files(struct XorrisO *xorriso, char *disk_adr, *result= 0; respt= xorriso->result_line; - if(flag&(1<<28)) - ret= stat(disk_adr, &s1); - else - ret= lstat(disk_adr, &s1); - if(ret==-1) { - sprintf(respt , "? %s (DISK) : cannot lstat() : %s\n", - Text_shellsafe(disk_adr, sfe, 0), strerror(errno)); - if(!(flag&(1<<31))) - Xorriso_result(xorriso,0); - missing= 1; - (*result)|= 1; + + if(!(xorriso->disk_excl_mode&8)) { + ret= Xorriso_path_is_excluded(xorriso, disk_adr, 2 | !!(flag&(1<<27))); + if(ret>0) { + sprintf(respt , "? %s (DISK) : exluded by %s\n", + Text_shellsafe(disk_adr, sfe, 0), + (ret==1 ? "-not_paths" : "-not_leaf")); + if(!(flag&(1<<31))) + Xorriso_result(xorriso,0); + missing= 1; + (*result)|= 1; + } } - strcpy(a, Ftypetxt(s1.st_mode, 1)); + if(!missing) { + if(flag&(1<<28)) + ret= stat(disk_adr, &s1); + else + ret= lstat(disk_adr, &s1); + if(ret==-1) { + sprintf(respt , "? %s (DISK) : cannot lstat() : %s\n", + Text_shellsafe(disk_adr, sfe, 0), strerror(errno)); + if(!(flag&(1<<31))) + Xorriso_result(xorriso,0); + missing= 1; + (*result)|= 1; + } + } + if(missing) + strcpy(a, "?"); + else + strcpy(a, Ftypetxt(s1.st_mode, 1)); strcat(a, " "); if(adr_common_tail[0]) strcat(a, Text_shellsafe(adr_common_tail, sfe, 0)); @@ -4664,7 +4694,10 @@ int Xorriso_find_compare(struct XorrisO *xorriso, void *boss_iter, return(ret); /* compare exclusions against disk_path resp. leaf name */ - ret= Xorriso_path_is_excluded(xorriso, disk_path, !(flag&2)); + if(xorriso->disk_excl_mode&8) + ret= Xorriso_path_is_excluded(xorriso, disk_path, !(flag&2)); + else + ret= 0; if(ret<0) return(ret); if(ret>0) @@ -4673,7 +4706,7 @@ int Xorriso_find_compare(struct XorrisO *xorriso, void *boss_iter, 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|follow_links|((!(flag&1))<<29)|((flag&1)<<31)); + 2 | follow_links | ((!(flag&2))<<27) | ((!(flag&1))<<29) | ((flag&1)<<31)); if(retfind_compare_result) xorriso->find_compare_result= ret; if(flag&1) { @@ -7470,7 +7503,8 @@ int Xorriso_path_is_excluded(struct XorrisO *xorriso, char *path, int flag) return(0); if((flag&1) && !(xorriso->disk_excl_mode&2)) /* params are exempted */ return(0); - ret= Exclusions_match(xorriso->disk_exclusions, path, 0); + ret= Exclusions_match(xorriso->disk_exclusions, path, + !!(xorriso->disk_excl_mode&4)); if(ret<0) { sprintf(xorriso->info_text, "Error during disk file exclusion decision"); @@ -8203,7 +8237,10 @@ int Xorriso_option_compare(struct XorrisO *xorriso, char *disk_path, if(ipth[0]==0) ipth= disk_path; - ret= Xorriso_path_is_excluded(xorriso, disk_path, 1); + if(xorriso->disk_excl_mode&8) + ret= Xorriso_path_is_excluded(xorriso, disk_path, 1); + else + ret= 0; if(ret!=0) goto report_outcome; if(!(flag&2)) { @@ -9082,7 +9119,7 @@ int Xorriso_option_help(struct XorrisO *xorriso, int flag) " iso_rr_path a matching copy of disk_path.", " -update_r disk_path iso_rr_path", " Like -update but affecting all files below directories.", -" -cpr disk_path [...] iso_rr_path", +" -cpr disk_path [***] iso_rr_path", " Insert the given files or directory trees from filesystem", " into the ISO image.", " -cut_out disk_path byte_offset byte_count iso_rr_path", @@ -9131,6 +9168,12 @@ int Xorriso_option_help(struct XorrisO *xorriso, int flag) " Delete empty directories.", " -- Mark end of particular action argument list.", "", +" -not_paths disk_path [***]", +" Add the given paths to the list of excluded absolute paths.", +" -not_leaf pattern", +" Add the given pattern to the list of leafname exclusions.", +" -not_mgt \"reset\"|\"on\"|\"off\"|\"param_on\"|\"subtree_on\"|\"ignore_on\"", +" Control effect of exclusion lists.", " -follow \"on\"|\"pattern:param:link:mount:limit=#\"|\"default\"|\"off\"", " Follow symbolic links and mount points within disk_path.", " -overwrite \"on\"|\"nondir\"|\"off\"", @@ -9756,6 +9799,10 @@ int Xorriso_option_not_mgt(struct XorrisO *xorriso, char *setting, int flag) xorriso->disk_excl_mode|= 4; } else if(strcmp(what, "subtree_off")==0) { xorriso->disk_excl_mode&= ~4; + } else if(strcmp(what, "ignore_on")==0) { + xorriso->disk_excl_mode|= 8; + } else if(strcmp(what, "ignore_off")==0) { + xorriso->disk_excl_mode&= ~8; } else { sprintf(xorriso->info_text, "-not_mgt: unknown setting '%s'", what); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0); @@ -10573,7 +10620,10 @@ int Xorriso_option_update(struct XorrisO *xorriso, char *disk_path, Text_shellsafe(ipth, sfe, 0)); Xorriso_info(xorriso,0); } - ret= Xorriso_path_is_excluded(xorriso, disk_path, 1); + if(xorriso->disk_excl_mode&8) + ret= Xorriso_path_is_excluded(xorriso, disk_path, 1); + else + ret= 0; if(ret!=0) goto report_outcome; if(flag&8) { diff --git a/xorriso/xorriso_private.h b/xorriso/xorriso_private.h index f6f04f3f..816c5c3d 100644 --- a/xorriso/xorriso_private.h +++ b/xorriso/xorriso_private.h @@ -169,7 +169,9 @@ struct XorrisO { /* the global context of xorriso */ struct ExclusionS *disk_exclusions; int disk_excl_mode; /* bit0= on (else off) bit1= parameter too (else rekursion only) - >>> bit2= whole subtree banned (else only exact path) + bit2= whole subtree banned (else only exact path) + bit3= when comparing ignore excluded files rather + than to treat them as truely missing on disk */ int use_stdin; /* use raw stdin even if readline support is compiled */ diff --git a/xorriso/xorriso_timestamp.h b/xorriso/xorriso_timestamp.h index 8b12c624..56c62de9 100644 --- a/xorriso/xorriso_timestamp.h +++ b/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2008.05.03.151106" +#define Xorriso_timestamP "2008.05.03.223204" diff --git a/xorriso/xorrisoburn.c b/xorriso/xorrisoburn.c index 8a5212f9..5d591301 100644 --- a/xorriso/xorrisoburn.c +++ b/xorriso/xorrisoburn.c @@ -2126,6 +2126,9 @@ int Xorriso_cut_out(struct XorrisO *xorriso, char *disk_path, 2|4); if(ret<=0) return(ret); + ret= Xorriso_path_is_excluded(xorriso, disk_path, !(flag&1)); + if(ret!=0) + return(0); if(lstat(eff_source, &stbuf)==-1) { Xorriso_msgs_submit(xorriso, 0, eff_source, 0, "ERRFILE", 0);