X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fnames.c;h=a5f2f7e70f346ff1c24e757501fb63790fdfad46;hb=2433f6813ec6a0c00e6c49b8f38725cd4a78c66c;hp=7a50acc5229f9a6a3aff5a5b3175464ee59d2a65;hpb=c4e054673b8fe8b84a4ac1fb8af14334f6a75f6b;p=chaz%2Ftar diff --git a/src/names.c b/src/names.c index 7a50acc..a5f2f7e 100644 --- a/src/names.c +++ b/src/names.c @@ -17,7 +17,7 @@ with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include "system.h" +#include #include #include @@ -56,6 +56,8 @@ 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) @@ -358,6 +360,8 @@ name_next (int change_dirs) else { unquote_string (name_buffer); + if (incremental_option) + register_individual_file (name_buffer); return name_buffer; } } @@ -1001,7 +1005,44 @@ is_avoided_name (char const *name) { return hash_string_lookup (avoided_name_table, name); } + + +static Hash_table *individual_file_table; + +static void +register_individual_file (char const *name) +{ + struct stat st; + + if (deref_stat (dereference_option, 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); +} + + +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, @@ -1041,7 +1082,6 @@ safer_name_suffix (char const *file_name, bool link_target) if (prefix_len) { - static Hash_table *prefix_table[2]; char *prefix = alloca (prefix_len + 1); memcpy (prefix, file_name, prefix_len); prefix[prefix_len] = '\0';