]> Dogcows Code - chaz/tar/blobdiff - src/extract.c
Update
[chaz/tar] / src / extract.c
index 408208392ab64a69afd7a116c4c12960117ba5f2..f16baadc62fcb7fd88c2262c5d30bfdbfb2ca411 100644 (file)
@@ -392,13 +392,12 @@ static int
 make_directories (char *file_name)
 {
   char *cursor0 = file_name + FILE_SYSTEM_PREFIX_LEN (file_name);
-  char *cursor;                        /* points into the file name */
+  char *cursor;                        /* points into the file name */
   int did_something = 0;       /* did we do anything yet? */
   int mode;
   int invert_permissions;
   int status;
 
-
   for (cursor = cursor0; *cursor; cursor++)
     {
       if (! ISSLASH (*cursor))
@@ -1031,6 +1030,13 @@ extract_mangle_wrapper (char *file_name, int typeflag)
   return 0;
 }
 
+static int
+extract_volhdr (char *file_name, int typeflag)
+{
+  if (verbose_option)
+    fprintf (stdlis, _("Reading %s\n"), quote (current_stat_info.file_name));
+  skip_member ();
+}
 
 static int
 extract_failure (char *file_name, int typeflag)
@@ -1111,9 +1117,7 @@ prepare_to_extract (char const *file_name, int typeflag, tar_extractor_t *fun)
       break;
 
     case GNUTYPE_VOLHDR:
-      if (verbose_option)
-       fprintf (stdlis, _("Reading %s\n"), quote (current_stat_info.file_name));
-      *fun = NULL;
+      *fun = extract_volhdr;
       break;
 
     case GNUTYPE_NAMES:
@@ -1323,6 +1327,39 @@ extract_finish (void)
   apply_nonancestor_delayed_set_stat ("", 1);
 }
 
+bool
+rename_directory (char *src, char *dst)
+{
+  if (rename (src, dst))
+    {
+      int e = errno;
+
+      switch (e)
+       {
+       case ENOENT:
+         if (make_directories (dst))
+           {
+             if (rename (src, dst) == 0)
+               return true;
+             e = errno;
+           }
+         break;
+                   
+       case EXDEV:
+         /* FIXME: Fall back to recursive copying */
+         
+       default:
+         break;
+       }
+
+      ERROR ((0, e, _("Cannot rename %s to %s"),
+             quote_n (0, src),
+             quote_n (1, dst)));
+      return false;
+    }
+  return true;
+}
+      
 void
 fatal_exit (void)
 {
This page took 0.023124 seconds and 4 git commands to generate.