]> Dogcows Code - chaz/tar/blobdiff - src/create.c
tar: --owner and --group names and numbers
[chaz/tar] / src / create.c
index 9dc928d347839ad4c8bc63f59cd790c5d0fef341..9839e1fdc81a2d0e5a4a08e978c96f3540fa6566 100644 (file)
@@ -562,7 +562,8 @@ write_gnu_long_link (struct tar_stat_info *st, const char *p, char type)
   GNAME_TO_CHARS (tmpname, header->header.gname);
   free (tmpname);
 
-  strcpy (header->header.magic, OLDGNU_MAGIC);
+  strcpy (header->buffer + offsetof (struct posix_header, magic),
+         OLDGNU_MAGIC);
   header->header.typeflag = type;
   finish_header (st, header, -1);
 
@@ -899,7 +900,8 @@ start_header (struct tar_stat_info *st)
     case OLDGNU_FORMAT:
     case GNU_FORMAT:   /*FIXME?*/
       /* Overwrite header->header.magic and header.version in one blow.  */
-      strcpy (header->header.magic, OLDGNU_MAGIC);
+      strcpy (header->buffer + offsetof (struct posix_header, magic),
+             OLDGNU_MAGIC);
       break;
 
     case POSIX_FORMAT:
@@ -918,8 +920,15 @@ start_header (struct tar_stat_info *st)
     }
   else
     {
-      uid_to_uname (st->stat.st_uid, &st->uname);
-      gid_to_gname (st->stat.st_gid, &st->gname);
+      if (owner_name_option)
+       st->uname = xstrdup (owner_name_option);
+      else
+       uid_to_uname (st->stat.st_uid, &st->uname);
+
+      if (group_name_option)
+       st->gname = xstrdup (group_name_option);
+      else
+       gid_to_gname (st->stat.st_gid, &st->gname);
 
       if (archive_format == POSIX_FORMAT
          && (strlen (st->uname) > UNAME_FIELD_SIZE
@@ -1345,7 +1354,8 @@ create_archive (void)
                    {
                      if (! st.orig_file_name)
                        {
-                         int fd = open (p->name, open_searchdir_flags);
+                         int fd = openat (chdir_fd, p->name,
+                                          open_searchdir_flags);
                          if (fd < 0)
                            {
                              open_diag (p->name);
@@ -1549,7 +1559,7 @@ subfile_open (struct tar_stat_info const *dir, char const *file, int flags)
       gettext ("");
     }
 
-  while ((fd = openat (dir ? dir->fd : AT_FDCWD, file, flags)) < 0
+  while ((fd = openat (dir ? dir->fd : chdir_fd, file, flags)) < 0
         && open_failure_recover (dir))
     continue;
   return fd;
@@ -1580,7 +1590,8 @@ restore_parent_fd (struct tar_stat_info const *st)
 
       if (parentfd < 0)
        {
-         int origfd = open (parent->orig_file_name, open_searchdir_flags);
+         int origfd = openat (chdir_fd, parent->orig_file_name,
+                              open_searchdir_flags);
          if (0 <= origfd)
            {
              if (fstat (parentfd, &parentstat) == 0
@@ -1610,13 +1621,12 @@ dump_file0 (struct tar_stat_info *st, char const *name, char const *p)
   char type;
   off_t original_size;
   struct timespec original_ctime;
-  struct timespec restore_times[2];
   off_t block_ordinal = -1;
   int fd = 0;
   bool is_dir;
   struct tar_stat_info const *parent = st->parent;
   bool top_level = ! parent;
-  int parentfd = top_level ? AT_FDCWD : parent->fd;
+  int parentfd = top_level ? chdir_fd : parent->fd;
   void (*diag) (char const *) = 0;
 
   if (interactive_option && !confirm ("add", p))
@@ -1654,8 +1664,8 @@ dump_file0 (struct tar_stat_info *st, char const *name, char const *p)
     }
 
   st->archive_file_size = original_size = st->stat.st_size;
-  st->atime = restore_times[0] = get_stat_atime (&st->stat);
-  st->mtime = restore_times[1] = get_stat_mtime (&st->stat);
+  st->atime = get_stat_atime (&st->stat);
+  st->mtime = get_stat_mtime (&st->stat);
   st->ctime = original_ctime = get_stat_ctime (&st->stat);
 
 #ifdef S_ISHIDDEN
@@ -1675,9 +1685,9 @@ dump_file0 (struct tar_stat_info *st, char const *name, char const *p)
      put in the archive.
 
      This check is omitted if incremental_option is set *and* the
-     requested file is not explicitely listed in the command line. */
+     requested file is not explicitly listed in the command line.  */
 
-  if (!(incremental_option && !is_individual_file (p))
+  if (! (incremental_option && ! top_level)
       && !S_ISDIR (st->stat.st_mode)
       && OLDER_TAR_STAT_TIME (*st, m)
       && (!after_date_option || OLDER_TAR_STAT_TIME (*st, c)))
@@ -1724,7 +1734,7 @@ dump_file0 (struct tar_stat_info *st, char const *name, char const *p)
          ok = dump_dir (st);
 
          fd = st->fd;
-         parentfd = top_level ? AT_FDCWD : parent->fd;
+         parentfd = top_level ? chdir_fd : parent->fd;
        }
       else
        {
@@ -1794,7 +1804,8 @@ dump_file0 (struct tar_stat_info *st, char const *name, char const *p)
              set_exit_status (TAREXIT_DIFFERS);
            }
          else if (atime_preserve_option == replace_atime_preserve
-                  && set_file_atime (fd, p, restore_times) != 0)
+                  && fd && (is_dir || original_size != 0)
+                  && set_file_atime (fd, parentfd, name, st->atime) != 0)
            utime_error (p);
        }
 
This page took 0.024311 seconds and 4 git commands to generate.