]> Dogcows Code - chaz/tar/blobdiff - src/misc.c
Fix handling of files removed during incremental dumps.
[chaz/tar] / src / misc.c
index b56a916b1557a87175c5ea57e308a186c3259b67..b11b20eb67142a084f4783af28c3d1601e22768b 100644 (file)
@@ -236,6 +236,25 @@ normalize_filename (const char *name)
   return zap_slashes (canonicalize_filename_mode (name, CAN_MISSING));
 }
 
+\f
+void
+replace_prefix (char **pname, const char *samp, size_t slen,
+               const char *repl, size_t rlen)
+{
+  char *name = *pname;
+  size_t nlen = strlen (name);
+  if (nlen > slen && memcmp (name, samp, slen) == 0 && ISSLASH (name[slen]))
+    {
+      if (rlen > slen)
+       {
+         name = xrealloc (name, nlen - slen + rlen + 1);
+         *pname = name;
+       }
+      memmove (name + rlen, name + slen, nlen - slen + 1);
+      memcpy (name, repl, rlen);
+    }
+}
+
 \f
 /* Handling numbers.  */
 
@@ -726,6 +745,30 @@ stat_diag (char const *name)
     stat_error (name);
 }
 
+void
+file_removed_diag (const char *name, bool top_level,
+                  void (*diagfn) (char const *name))
+{
+  if (!top_level && errno == ENOENT)
+    WARNOPT (WARN_FILE_REMOVED,
+            (0, 0, _("%s: File removed before we read it"),
+             quotearg_colon (name)));
+  else
+    diagfn (name);
+}
+
+void
+dir_removed_diag (const char *name, bool top_level,
+                  void (*diagfn) (char const *name))
+{
+  if (!top_level && errno == ENOENT)
+    WARNOPT (WARN_FILE_REMOVED,
+            (0, 0, _("%s: Directory removed before we read it"),
+             quotearg_colon (name)));
+  else
+    diagfn (name);
+}
+
 void
 write_fatal_details (char const *name, ssize_t status, size_t size)
 {
@@ -777,3 +820,4 @@ page_aligned_alloc (void **ptr, size_t size)
   *ptr = xmalloc (size1);
   return ptr_align (*ptr, alignment);
 }
+
This page took 0.021905 seconds and 4 git commands to generate.