Hi Jean-Louis, > --files-from do not recursively extract since tar-1.27
Thanks for reporting. Please try the attached patch. Regards, Sergey
>From 890a81d753b506d6dfd2031d6633d3f5be38a966 Mon Sep 17 00:00:00 2001 From: Sergey Poznyakoff <[email protected]> Date: Thu, 18 Sep 2014 18:06:40 +0300 Subject: [PATCH] Bugfix: entries read from the -T file did not get proper matching_flag. * src/common.h (name_add_file): Change signature. * src/names.c (name_elt.file) <matching_flags>: New member. (name_add_file): Take matching flags as third argument. (read_next_name): Set matching_flags and recursion_option after opening the file. * src/tar.c (parse_opt): Pass matching_flags to name_add_file. --- src/common.h | 2 +- src/names.c | 16 ++++++++++++---- src/tar.c | 2 +- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/common.h b/src/common.h index edf787c..3cc2011 100644 --- a/src/common.h +++ b/src/common.h @@ -725,7 +725,7 @@ int uname_to_uid (char const *uname, uid_t *puid); void name_init (void); void name_add_name (const char *name, int matching_flags); void name_add_dir (const char *name); -void name_add_file (const char *name, int term); +void name_add_file (const char *name, int term, int matching_flags); void name_term (void); const char *name_next (int change_dirs); void name_gather (void); diff --git a/src/names.c b/src/names.c index 594e7fd..7e920df 100644 --- a/src/names.c +++ b/src/names.c @@ -229,6 +229,7 @@ struct name_elt /* A name_array element. */ const char *name;/* File name */ int term; /* File name terminator in the list */ FILE *fp; + int matching_flags; /* fnmatch options */ } file; } v; }; @@ -305,13 +306,14 @@ name_add_dir (const char *name) } void -name_add_file (const char *name, int term) +name_add_file (const char *name, int term, int matching_flags) { struct name_elt *ep = name_elt_alloc (); ep->type = NELT_FILE; ep->v.file.name = name; ep->v.file.term = term; ep->v.file.fp = NULL; + ep->v.file.matching_flags = matching_flags; } /* Names from external name file. */ @@ -456,6 +458,8 @@ handle_option (const char *str) return 0; } +static int matching_flags; /* exclude_fnmatch options */ + static int read_next_name (struct name_elt *ent, struct name_elt *ret) { @@ -476,6 +480,8 @@ read_next_name (struct name_elt *ent, struct name_elt *ret) if ((ent->v.file.fp = fopen (ent->v.file.name, "r")) == NULL) open_fatal (ent->v.file.name); } + matching_flags = ent->v.file.matching_flags; + recursion_option = matching_flags & FNM_LEADING_DIR; } while (1) @@ -544,8 +550,6 @@ copy_name (struct name_elt *ep) } -static int matching_flags; /* exclude_fnmatch options */ - /* Get the next NELT_NAME element from name_array. Result is in static storage and can't be relied upon across two calls. @@ -553,7 +557,11 @@ static int matching_flags; /* exclude_fnmatch options */ the request to change to the given directory. Entries of type NELT_FMASK cause updates of the matching_flags - value. */ + value. + + Entries of type NELT_FILE cause updates of the matching_flags + once, before opening the file. +*/ static struct name_elt * name_next_elt (int change_dirs) { diff --git a/src/tar.c b/src/tar.c index cd32379..225c624 100644 --- a/src/tar.c +++ b/src/tar.c @@ -1641,7 +1641,7 @@ parse_opt (int key, char *arg, struct argp_state *state) break; case 'T': - name_add_file (arg, filename_terminator); + name_add_file (arg, filename_terminator, MAKE_INCL_OPTIONS (args)); /* Indicate we've been given -T option. This is for backward compatibility only, so that `tar cfT archive /dev/null will succeed */ -- 1.7.12.1
