[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Bug-tar] --files-from and recursive extract (behavior change in 1.2
From: |
Sergey Poznyakoff |
Subject: |
Re: [Bug-tar] --files-from and recursive extract (behavior change in 1.27) |
Date: |
Thu, 18 Sep 2014 18:02:48 +0300 |
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 <address@hidden>
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