X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Fnames.c;h=a3c6f58a899d387278c4ee648b8cd6d6cb2e41fd;hb=40dea1ae7fc892a54eae2efd30ddd8559c697525;hp=16566bb57aeee8f4ce5700f14f6a653eb98f20bf;hpb=51aee274e892923a3f8fdb774e4f6b90bce47437;p=chaz%2Ftar diff --git a/src/names.c b/src/names.c index 16566bb..a3c6f58 100644 --- a/src/names.c +++ b/src/names.c @@ -205,7 +205,7 @@ free_name (struct name *p) /* Names from the command call. */ static struct name *namelist; /* first name in list, if any */ -static struct name **nametail = &namelist; /* end of name list */ +static struct name *nametail; /* end of name list */ /* File name arguments are processed in two stages: first a name_array (see below) is filled, then the names from it @@ -422,8 +422,7 @@ name_gather (void) buffer->parent = NULL; buffer->cmdline = true; - namelist = buffer; - nametail = &namelist->next; + namelist = nametail = buffer; } else if (change_dir) addname (0, change_dir, false, NULL); @@ -457,7 +456,7 @@ addname (char const *string, int change_dir, bool cmdline, struct name *parent) { struct name *name = make_name (string); - name->prev = *nametail; + name->prev = nametail; name->next = NULL; name->found_count = 0; name->matching_flags = matching_flags; @@ -465,9 +464,12 @@ addname (char const *string, int change_dir, bool cmdline, struct name *parent) name->directory = NULL; name->parent = parent; name->cmdline = cmdline; - - *nametail = name; - nametail = &name->next; + + if (nametail) + nametail->next = name; + else + namelist = name; + nametail = name; return name; } @@ -501,7 +503,7 @@ remname (struct name *name) if ((p = name->next) != NULL) p->prev = name->prev; else - nametail = &name->prev; + nametail = name->prev; } /* Return true if and only if name FILE_NAME (from an archive) matches any @@ -521,8 +523,8 @@ name_match (const char *file_name) if (cursor->name[0] == 0) { chdir_do (cursor->change_dir); - namelist = 0; - nametail = &namelist; + namelist = NULL; + nametail = NULL; return true; } @@ -535,8 +537,8 @@ name_match (const char *file_name) if (starting_file_option) { free (namelist); - namelist = 0; - nametail = &namelist; + namelist = NULL; + nametail = NULL; } chdir_do (cursor->change_dir); @@ -575,8 +577,6 @@ all_names_found (struct tar_stat_info *p) struct name const *cursor; size_t len; - if (test_label_option) - return true; if (!p->file_name || occurrence_option == 0 || p->had_trailing_slash) return false; len = strlen (p->file_name); @@ -589,29 +589,21 @@ all_names_found (struct tar_stat_info *p) return true; } -static inline int -is_pattern (const char *string) -{ - return strchr (string, '*') || strchr (string, '[') || strchr (string, '?'); -} - -static void +static int regex_usage_warning (const char *name) { static int warned_once = 0; - if (warn_regex_usage && is_pattern (name)) + if (warn_regex_usage && fnmatch_pattern_has_wildcards (name, 0)) { warned_once = 1; WARN ((0, 0, - /* TRANSLATORS: The following three msgids form a single sentence. - */ - _("Pattern matching characters used in file names. Please,"))); - WARN ((0, 0, - _("use --wildcards to enable pattern matching, or --no-wildcards to"))); + _("Pattern matching characters used in file names"))); WARN ((0, 0, - _("suppress this warning."))); + _("Use --wildcards to enable pattern matching," + " or --no-wildcards to suppress this warning"))); } + return warned_once; } /* Print the names of things in the namelist that were not matched. */ @@ -624,17 +616,16 @@ names_notfound (void) if (!WASFOUND (cursor) && cursor->name[0]) { regex_usage_warning (cursor->name); - if (cursor->found_count == 0) - ERROR ((0, 0, _("%s: Not found in archive"), - quotearg_colon (cursor->name))); - else - ERROR ((0, 0, _("%s: Required occurrence not found in archive"), - quotearg_colon (cursor->name))); + ERROR ((0, 0, + (cursor->found_count == 0) ? + _("%s: Not found in archive") : + _("%s: Required occurrence not found in archive"), + quotearg_colon (cursor->name))); } /* Don't bother freeing the name list; we're about to exit. */ - namelist = 0; - nametail = &namelist; + namelist = NULL; + nametail = NULL; if (same_order_option) { @@ -648,6 +639,42 @@ names_notfound (void) } } } + +void +label_notfound (void) +{ + struct name const *cursor; + + if (!namelist) + return; + + for (cursor = namelist; cursor; cursor = cursor->next) + if (WASFOUND (cursor)) + return; + + if (verbose_option) + error (0, 0, _("Archive label mismatch")); + set_exit_status (TAREXIT_DIFFERS); + + for (cursor = namelist; cursor; cursor = cursor->next) + { + if (regex_usage_warning (cursor->name)) + break; + } + + /* Don't bother freeing the name list; we're about to exit. */ + namelist = NULL; + nametail = NULL; + + if (same_order_option) + { + const char *name; + + while ((name = name_next (1)) != NULL + && regex_usage_warning (name) == 0) + ; + } +} /* Sorting name lists. */ @@ -880,7 +907,7 @@ void collect_and_sort_names (void) { struct name *name; - struct name *next_name, *prev_name; + struct name *next_name, *prev_name = NULL; int num_names; struct stat statbuf; Hash_table *nametab; @@ -909,7 +936,7 @@ collect_and_sort_names (void) _("Only one -C option is allowed with " "--listed-incremental"))); } - chdir_do (namelist->change_dir); + read_directory_file (); } @@ -959,6 +986,7 @@ collect_and_sort_names (void) { if (p->child) rebase_child_list (p->child, name); + hash_delete (nametab, name); /* FIXME: remove_directory (p->caname); ? */ remname (p); free_name (p); @@ -981,7 +1009,7 @@ collect_and_sort_names (void) prev_name = name; num_names++; } - nametail = &prev_name; + nametail = prev_name; hash_free (nametab); namelist = merge_sort (namelist, num_names, compare_names_found); @@ -1080,24 +1108,6 @@ excluded_name (char const *name) { return excluded_file_name (excluded, name + FILE_SYSTEM_PREFIX_LEN (name)); } - -/* Names to avoid dumping. */ -static Hash_table *avoided_name_table; - -/* Remember to not archive NAME. */ -void -add_avoided_name (char const *name) -{ - hash_string_insert (&avoided_name_table, name); -} - -/* Should NAME be avoided when archiving? */ -bool -is_avoided_name (char const *name) -{ - return hash_string_lookup (avoided_name_table, name); -} - static Hash_table *individual_file_table;