diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2010-11-22 22:50:58 -0800 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2010-11-22 22:51:29 -0800 |
commit | 065cf0958c39600f2062cbeeb5b76929d03c207b (patch) | |
tree | 8db5de58bac9fdaca4affcc8d89a5ea951f6a47d | |
parent | 2a55b4b0373eef2e879408f9df6638bb03e16170 (diff) | |
download | tar-065cf0958c39600f2062cbeeb5b76929d03c207b.tar.gz |
* src/names.c: tar: fix bug with --one-file-system --listed-incremental
Problem (and idea for fix) reported by Martin Weigel
<http://lists.gnu.org/archive/html/bug-tar/2010-11/msg00071.html>.
* src/common.h (is_individual_file): Remove decl.
* src/create.c (dump_file0): Replace "is_individual_file (p)"
with "top_level".
* src/incremen.c (procdir): Replace "!is_individual_file
(name_buffer)" with "st->parent". Fix bug with --one-file-system
and --listed-incremental.
* src/names.c (individual_file_table, register_individual_file):
(is_individual_file): Remove. All uses removed.
-rw-r--r-- | src/common.h | 1 | ||||
-rw-r--r-- | src/create.c | 4 | ||||
-rw-r--r-- | src/incremen.c | 8 | ||||
-rw-r--r-- | src/names.c | 26 |
4 files changed, 4 insertions, 35 deletions
diff --git a/src/common.h b/src/common.h index 35e056ed..9444fd7f 100644 --- a/src/common.h +++ b/src/common.h @@ -680,7 +680,6 @@ bool excluded_name (char const *name); void add_avoided_name (char const *name); bool is_avoided_name (char const *name); -bool is_individual_file (char const *name); bool contains_dot_dot (char const *name); diff --git a/src/create.c b/src/create.c index a1e90a33..e8de6b92 100644 --- a/src/create.c +++ b/src/create.c @@ -1678,9 +1678,9 @@ dump_file0 (struct tar_stat_info *st, char const *name, char const *p) put in the archive. This check is omitted if incremental_option is set *and* the - requested file is not explicitely listed in the command line. */ + requested file is not explicitly listed in the command line. */ - if (!(incremental_option && !is_individual_file (p)) + if (! (incremental_option && ! top_level) && !S_ISDIR (st->stat.st_mode) && OLDER_TAR_STAT_TIME (*st, m) && (!after_date_option || OLDER_TAR_STAT_TIME (*st, c))) diff --git a/src/incremen.c b/src/incremen.c index 628ff296..2b33c5d1 100644 --- a/src/incremen.c +++ b/src/incremen.c @@ -426,7 +426,6 @@ procdir (const char *name_buffer, struct tar_stat_info *st, { struct directory *directory; struct stat *stat_data = &st->stat; - dev_t device = st->parent ? st->parent->stat.st_dev : 0; bool nfs = NFS_FILE_STAT (*stat_data); if ((directory = find_directory (name_buffer)) != NULL) @@ -540,11 +539,8 @@ procdir (const char *name_buffer, struct tar_stat_info *st, } } - /* If the directory is on another device and --one-file-system was given, - omit it... */ - if (one_file_system_option && device != stat_data->st_dev - /* ... except if it was explicitely given in the command line */ - && !is_individual_file (name_buffer)) + if (one_file_system_option && st->parent + && stat_data->st_dev != st->parent->stat.st_dev) /* FIXME: WARNOPT (WARN_XDEV, (0, 0, diff --git a/src/names.c b/src/names.c index 6e214bfa..ba4d509e 100644 --- a/src/names.c +++ b/src/names.c @@ -47,8 +47,6 @@ static char *cached_no_such_gname; static uid_t cached_no_such_uid; static gid_t cached_no_such_gid; -static void register_individual_file (char const *name); - /* Given UID, find the corresponding UNAME. */ void uid_to_uname (uid_t uid, char **uname) @@ -360,8 +358,6 @@ name_next_elt (int change_dirs) { if (unquote_option) unquote_string (name_buffer); - if (incremental_option) - register_individual_file (name_buffer); entry.type = ep->type; entry.v.name = name_buffer; return &entry; @@ -1152,28 +1148,6 @@ excluded_name (char const *name) return excluded_file_name (excluded, name + FILE_SYSTEM_PREFIX_LEN (name)); } -static Hash_table *individual_file_table; - -static void -register_individual_file (char const *name) -{ - struct stat st; - - if (deref_stat (name, &st) != 0) - return; /* Will be complained about later */ - if (S_ISDIR (st.st_mode)) - return; - - hash_string_insert (&individual_file_table, name); -} - -bool -is_individual_file (char const *name) -{ - return hash_string_lookup (individual_file_table, name); -} - - /* Return the size of the prefix of FILE_NAME that is removed after stripping NUM leading file name components. NUM must be |