]> Dogcows Code - chaz/tar/blobdiff - src/misc.c
Rewrite update algorithm.
[chaz/tar] / src / misc.c
index 116eb9673a615e7144b1e110ab5ff580e648435d..cdb2608aa45511cee77721445d4bca2a6e4fa880 100644 (file)
@@ -750,9 +750,12 @@ 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)));
+    {
+      WARNOPT (WARN_FILE_REMOVED,
+              (0, 0, _("%s: File removed before we read it"),
+               quotearg_colon (name)));
+      set_exit_status (TAREXIT_DIFFERS);
+    }      
   else
     diagfn (name);
 }
@@ -766,8 +769,7 @@ dir_removed_diag (const char *name, bool top_level,
       WARNOPT (WARN_FILE_REMOVED,
               (0, 0, _("%s: Directory removed before we read it"),
                quotearg_colon (name)));
-      if (exit_status == TAREXIT_SUCCESS)
-       exit_status = TAREXIT_DIFFERS;
+      set_exit_status (TAREXIT_DIFFERS);
     }
   else
     diagfn (name);
@@ -825,3 +827,44 @@ page_aligned_alloc (void **ptr, size_t size)
   return ptr_align (*ptr, alignment);
 }
 
+\f
+
+struct namebuf
+{
+  char *buffer;                /* directory, `/', and directory member */
+  size_t buffer_size;  /* allocated size of name_buffer */
+  size_t dir_length;   /* length of directory part in buffer */
+};
+
+namebuf_t
+namebuf_create (const char *dir)
+{
+  namebuf_t buf = xmalloc (sizeof (*buf));
+  buf->buffer_size = strlen (dir) + 2;
+  buf->buffer = xmalloc (buf->buffer_size);
+  strcpy (buf->buffer, dir);
+  buf->dir_length = strlen (buf->buffer);
+  if (!ISSLASH (buf->buffer[buf->dir_length - 1]))
+    buf->buffer[buf->dir_length++] = DIRECTORY_SEPARATOR;
+  return buf;
+}
+
+void
+namebuf_free (namebuf_t buf)
+{
+  free (buf->buffer);
+  free (buf);
+}
+
+char *
+namebuf_name (namebuf_t buf, const char *name)
+{
+  size_t len = strlen (name);
+  while (buf->dir_length + len + 1 >= buf->buffer_size)
+    buf->buffer = x2realloc (buf->buffer, &buf->buffer_size);
+  strcpy (buf->buffer + buf->dir_length, name);
+  return buf->buffer;
+}
+
+
+  
This page took 0.022726 seconds and 4 git commands to generate.