]> Dogcows Code - chaz/tar/blobdiff - src/names.c
Started merging with cpio into paxutils.
[chaz/tar] / src / names.c
index 7a50acc5229f9a6a3aff5a5b3175464ee59d2a65..a5f2f7e70f346ff1c24e757501fb63790fdfad46 100644 (file)
@@ -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 <system.h>
 
 #include <fnmatch.h>
 #include <hash.h>
@@ -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);
 }
+
+\f
+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);
+}
+
 \f
+
+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';
This page took 0.023277 seconds and 4 git commands to generate.