]> Dogcows Code - chaz/tar/commitdiff
(extract_archive): When marking a directory to be updated after
authorPaul Eggert <eggert@cs.ucla.edu>
Sat, 22 Sep 2001 00:47:09 +0000 (00:47 +0000)
committerPaul Eggert <eggert@cs.ucla.edu>
Sat, 22 Sep 2001 00:47:09 +0000 (00:47 +0000)
symlinks, stat all directories after it in the delayed-set-stat
list too, since they will be checked after symlinks.
Add support for --overwrite-dir.

src/extract.c

index 7f4628f93a2d9ac5aebf3a4722f20963d2cd3f47..3c35d80cec8630c14bd3299c6c4384fcb8f71830 100644 (file)
@@ -972,15 +972,19 @@ extract_archive (void)
                  && (base_name (CURRENT_FILE_NAME)
                      == CURRENT_FILE_NAME + h->file_name_len + 1))
                {
-                 h->after_symlinks = 1;
-
-                 if (stat (h->file_name, &st) != 0)
-                   stat_error (h->file_name);
-                 else
+                 do
                    {
-                     h->stat_info.st_dev = st.st_dev;
-                     h->stat_info.st_ino = st.st_ino;
+                     h->after_symlinks = 1;
+
+                     if (stat (h->file_name, &st) != 0)
+                       stat_error (h->file_name);
+                     else
+                       {
+                         h->stat_info.st_dev = st.st_dev;
+                         h->stat_info.st_ino = st.st_ino;
+                       }
                    }
+                 while ((h = h->next) && ! h->after_symlinks);
                }
 
              status = 0;
@@ -1144,7 +1148,9 @@ extract_archive (void)
       if (status != 0)
        {
          if (errno == EEXIST
-             && (interdir_made || old_files_option == OVERWRITE_OLD_FILES))
+             && (interdir_made
+                 || old_files_option == OVERWRITE_OLD_DIRS
+                 || old_files_option == OVERWRITE_OLD_FILES))
            {
              struct stat st;
              if (stat (CURRENT_FILE_NAME, &st) == 0)
@@ -1177,6 +1183,7 @@ extract_archive (void)
 
     directory_exists:
       if (status == 0
+         || old_files_option == OVERWRITE_OLD_DIRS
          || old_files_option == OVERWRITE_OLD_FILES)
        delay_set_stat (CURRENT_FILE_NAME, &current_stat,
                        MODE_RWX & (mode ^ current_stat.st_mode),
This page took 0.028285 seconds and 4 git commands to generate.