]> git.cworth.org Git - tar/blobdiff - src/extract.c
Preserve timestamp of symlinks when extracting (if utimensat available)
[tar] / src / extract.c
index 6d703980c3235b9b4244ecb825bad70460b97486..5ca192de3a90000c73bf0db898418a5955fcb1c4 100644 (file)
@@ -239,43 +239,40 @@ set_stat (char const *file_name,
          mode_t invert_permissions, enum permstatus permstatus,
          char typeflag)
 {
-  if (typeflag != SYMTYPE)
+  /* We do the utime before the chmod because some versions of utime are
+     broken and trash the modes of the file.  */
+
+  if (! touch_option && permstatus != INTERDIR_PERMSTATUS)
     {
-      /* We do the utime before the chmod because some versions of utime are
-        broken and trash the modes of the file.  */
+      /* We set the accessed time to `now', which is really the time we
+        started extracting files, unless incremental_option is used, in
+        which case .st_atime is used.  */
 
-      if (! touch_option && permstatus != INTERDIR_PERMSTATUS)
-       {
-         /* We set the accessed time to `now', which is really the time we
-            started extracting files, unless incremental_option is used, in
-            which case .st_atime is used.  */
-
-         /* FIXME: incremental_option should set ctime too, but how?  */
-
-         struct timespec ts[2];
-         if (incremental_option)
-           ts[0] = st->atime;
-         else
-           ts[0] = start_time;
-         ts[1] = st->mtime;
-
-         if (utimens (file_name, ts) != 0)
-           utime_error (file_name);
-         else
-           {
-             check_time (file_name, ts[0]);
-             check_time (file_name, ts[1]);
-           }
-       }
+      /* FIXME: incremental_option should set ctime too, but how?  */
 
-      /* Some systems allow non-root users to give files away.  Once this
-        done, it is not possible anymore to change file permissions.
-        However, setting file permissions now would be incorrect, since
-        they would apply to the wrong user, and there would be a race
-        condition.  So, don't use systems that allow non-root users to
-        give files away.  */
+      struct timespec ts[2];
+      if (incremental_option)
+       ts[0] = st->atime;
+      else
+       ts[0] = start_time;
+      ts[1] = st->mtime;
+
+      if (utimens (file_name, ts, typeflag == SYMTYPE) != 0)
+       utime_error (file_name);
+      else
+      {
+       check_time (file_name, ts[0]);
+       check_time (file_name, ts[1]);
+      }
     }
 
+  /* Some systems allow non-root users to give files away.  Once this
+     done, it is not possible anymore to change file permissions.
+     However, setting file permissions now would be incorrect, since
+     they would apply to the wrong user, and there would be a race
+     condition.  So, don't use systems that allow non-root users to
+     give files away.  */
+
   if (0 < same_owner_option && permstatus != INTERDIR_PERMSTATUS)
     {
       /* When lchown exists, it should be used to change the attributes of