X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Fcommon.h;h=ac488c787b117f1dda3554b5ebf8a91517244a3b;hb=b085ca30976ec26256344bd3532205d440e69309;hp=9ec6e3f0cbcbb8ab0103d3c9c4c8fe56f0664be1;hpb=c4d396f8d1214dbad6bbae753a07b9e63a89148c;p=chaz%2Ftar diff --git a/src/common.h b/src/common.h index 9ec6e3f..ac488c7 100644 --- a/src/common.h +++ b/src/common.h @@ -176,6 +176,9 @@ GLOBAL const char *info_script_option; GLOBAL bool interactive_option; +/* If nonzero, extract only Nth occurrence of each named file */ +GLOBAL uintmax_t occurrence_option; + enum old_files { DEFAULT_OLD_FILES, /* default */ @@ -230,6 +233,10 @@ GLOBAL int same_owner_option; /* If positive, preserve permissions when extracting. */ GLOBAL int same_permissions_option; +/* When set, strip the given number of path elements from the file name + before extracting */ +GLOBAL size_t strip_path_elements; + GLOBAL bool show_omitted_dirs_option; GLOBAL bool sparse_option; @@ -291,7 +298,9 @@ struct name { struct name *next; size_t length; /* cached strlen(name) */ - char found; /* a matching file has been found */ + uintmax_t found_count; /* number of times a matching file has + been found */ + int isdir; char firstch; /* first char is literally matched */ char regexp; /* this name is a regexp, not literal */ int change_dir; /* set with the -C option */ @@ -563,6 +572,8 @@ char *name_from_list (void); void blank_name_list (void); char *new_name (const char *, const char *); char *safer_name_suffix (char const *, bool); +size_t stripped_path_len (char const *file_name, size_t num); +bool all_names_found (struct tar_stat_info *); bool excluded_name (char const *); @@ -571,6 +582,11 @@ bool is_avoided_name (char const *); bool contains_dot_dot (char const *); +#define ISFOUND(c) ((occurrence_option == 0) ? (c)->found_count : \ + (c)->found_count == occurrence_option) +#define WASFOUND(c) ((occurrence_option == 0) ? (c)->found_count : \ + (c)->found_count >= occurrence_option) + /* Module tar.c. */ int confirm (const char *, const char *);