]> Dogcows Code - chaz/tar/blobdiff - src/extract.c
(gnu_restore): Renamed to purge_directory().
[chaz/tar] / src / extract.c
index 0cb3e205b63c6f8a95d897a1c1ec90d526d4e90c..65b9a359e45bc3a1974ef20ff3556dcad9ae90a3 100644 (file)
@@ -115,6 +115,19 @@ extr_init (void)
   same_owner_option += we_are_root;
   xalloc_fail_func = extract_finish;
 
+  /* Save 'root device' to avoid purging mount points.
+     FIXME: Should the same be done after handling -C option ? */
+  if (one_file_system_option)
+    {
+      struct stat st;      
+      char *dir = xgetcwd ();
+
+      if (deref_stat (true, dir, &st))
+       stat_diag (dir);
+      else
+       root_device = st.st_dev;
+    }
+  
   /* Option -p clears the kernel umask, so it does not affect proper
      restoration of file permissions.  New intermediate directories will
      comply with umask at start of program.  */
@@ -315,7 +328,7 @@ delay_set_stat (char const *file_name, struct stat const *stat_info,
 }
 
 /* Update the delayed_set_stat info for an intermediate directory
-   created on the path to DIR.  The intermediate directory turned
+   created within the file name of DIR.  The intermediate directory turned
    out to be the same as this directory, e.g. due to ".." or symbolic
    links.  *DIR_STAT_INFO is the status of the directory.  */
 static void
@@ -355,7 +368,7 @@ static int
 make_directories (char *file_name)
 {
   char *cursor0 = file_name + FILESYSTEM_PREFIX_LEN (file_name);
-  char *cursor;                        /* points into path */
+  char *cursor;                        /* points into the file name */
   int did_something = 0;       /* did we do anything yet? */
   int mode;
   int invert_permissions;
@@ -372,7 +385,7 @@ make_directories (char *file_name)
       if (cursor == cursor0 || ISSLASH (cursor[-1]))
        continue;
 
-      /* Avoid mkdir where last part of path is "." or "..".  */
+      /* Avoid mkdir where last part of file name is "." or "..".  */
 
       if (cursor[-1] == '.'
          && (cursor == cursor0 + 1 || ISSLASH (cursor[-2])
@@ -380,7 +393,7 @@ make_directories (char *file_name)
                  && (cursor == cursor0 + 2 || ISSLASH (cursor[-3])))))
        continue;
 
-      *cursor = '\0';          /* truncate the path there */
+      *cursor = '\0';          /* truncate the name there */
       mode = MODE_RWX & ~ newdir_umask;
       invert_permissions = we_are_root ? 0 : MODE_WXUSR & ~ mode;
       status = mkdir (file_name, mode ^ invert_permissions);
@@ -1012,7 +1025,7 @@ extract_archive (void)
          /* Read the entry and delete files that aren't listed in the
             archive.  */
 
-         gnu_restore (file_name);
+         purge_directory (file_name);
        }
       else if (typeflag == GNUTYPE_DUMPDIR)
        skip_member ();
This page took 0.021259 seconds and 4 git commands to generate.