X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fnames.c;h=e6082d856af00b1532edca3c2fe133652b5dc9d7;hb=737b0251de867074882619e7304be721749fcfd9;hp=f86582d7ebbc8fb93a33275e3a2a2da36aedc1a7;hpb=9b7c6df82bf95ade05148c59441e2e189515a11f;p=chaz%2Ftar diff --git a/src/names.c b/src/names.c index f86582d..e6082d8 100644 --- a/src/names.c +++ b/src/names.c @@ -1,7 +1,7 @@ /* Various processing of names. Copyright (C) 1988, 1992, 1994, 1996, 1997, 1998, 1999, 2000, 2001, - 2003, 2004 Free Software Foundation, Inc. + 2003, 2004, 2005 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the @@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., - 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include @@ -538,6 +538,8 @@ 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); @@ -861,54 +863,7 @@ new_name (const char *file_name, const char *name) bool excluded_name (char const *name) { - return excluded_filename (excluded, name + FILE_SYSTEM_PREFIX_LEN (name)); -} - -/* Hash tables of strings. */ - -/* Calculate the hash of a string. */ -static size_t -hash_string_hasher (void const *name, size_t n_buckets) -{ - return hash_string (name, n_buckets); -} - -/* Compare two strings for equality. */ -static bool -hash_string_compare (void const *name1, void const *name2) -{ - return strcmp (name1, name2) == 0; -} - -/* Return zero if TABLE contains a copy of STRING; otherwise, insert a - copy of STRING to TABLE and return 1. */ -static bool -hash_string_insert (Hash_table **table, char const *string) -{ - Hash_table *t = *table; - char *s = xstrdup (string); - char *e; - - if (! ((t - || (*table = t = hash_initialize (0, 0, hash_string_hasher, - hash_string_compare, 0))) - && (e = hash_insert (t, s)))) - xalloc_die (); - - if (e == s) - return 1; - else - { - free (s); - return 0; - } -} - -/* Return 1 if TABLE contains STRING. */ -static bool -hash_string_lookup (Hash_table const *table, char const *string) -{ - return table && hash_lookup (table, string); + return excluded_file_name (excluded, name + FILE_SYSTEM_PREFIX_LEN (name)); } /* Names to avoid dumping. */ @@ -952,92 +907,6 @@ is_individual_file (char const *name) -static Hash_table *prefix_table[2]; - -/* Return true if file names of some members in the archive were stripped off - their leading components. We could have used - return prefix_table[0] || prefix_table[1] - but the following seems to be safer: */ -bool -removed_prefixes_p (void) -{ - return (prefix_table[0] && hash_get_n_entries (prefix_table[0]) != 0) - || (prefix_table[1] && hash_get_n_entries (prefix_table[1]) != 0); -} - -/* Return a safer suffix of FILE_NAME, or "." if it has no safer - suffix. Check for fully specified file names and other atrocities. - Warn the user if we do not return NAME. If LINK_TARGET is 1, - FILE_NAME is the target of a hard link, not a member name. */ - -char * -safer_name_suffix (char const *file_name, bool link_target) -{ - char const *p; - - if (absolute_names_option) - p = file_name; - else - { - /* Skip file system prefixes, leading file name components that contain - "..", and leading slashes. */ - - size_t prefix_len = FILE_SYSTEM_PREFIX_LEN (file_name); - - for (p = file_name + prefix_len; *p; ) - { - if (p[0] == '.' && p[1] == '.' && (ISSLASH (p[2]) || !p[2])) - prefix_len = p + 2 - file_name; - - do - { - char c = *p++; - if (ISSLASH (c)) - break; - } - while (*p); - } - - for (p = file_name + prefix_len; ISSLASH (*p); p++) - continue; - prefix_len = p - file_name; - - if (prefix_len) - { - char *prefix = alloca (prefix_len + 1); - memcpy (prefix, file_name, prefix_len); - prefix[prefix_len] = '\0'; - - if (hash_string_insert (&prefix_table[link_target], prefix)) - { - static char const *const diagnostic[] = - { - N_("Removing leading `%s' from member names"), - N_("Removing leading `%s' from hard link targets") - }; - WARN ((0, 0, _(diagnostic[link_target]), prefix)); - } - } - } - - if (! *p) - { - if (p == file_name) - { - static char const *const diagnostic[] = - { - N_("Substituting `.' for empty member name"), - N_("Substituting `.' for empty hard link target") - }; - WARN ((0, 0, "%s", _(diagnostic[link_target]))); - } - - p = "."; - } - - return (char *) p; -} - /* Return the size of the prefix of FILE_NAME that is removed after stripping NUM leading file name components. NUM must be positive. */