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);
. . . . . . . . . 9 = Omron UNIOS-B 4.3BSD 1.60Beta
. = works
- # = ``impossible file type''
+ # = "impossible file type"
- The following mask for old archive removes the `#'s in column 4
+ The following mask for old archive removes the '#'s in column 4
above, thus making GNU tar both a universal donor and a universal
acceptor for Paul's test. */
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:
}
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
memset (blk->buffer + size_left, 0, BLOCKSIZE - count);
}
- count = (fd <= 0) ? bufsize : safe_read (fd, blk->buffer, bufsize);
+ count = (fd <= 0) ? bufsize : blocking_read (fd, blk->buffer, bufsize);
if (count == SAFE_READ_ERROR)
{
read_diag_details (st->orig_file_name,
{
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);
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;
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
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))
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)))
ok = dump_dir (st);
fd = st->fd;
- parentfd = top_level ? AT_FDCWD : parent->fd;
+ parentfd = top_level ? chdir_fd : parent->fd;
}
else
{
set_exit_status (TAREXIT_DIFFERS);
}
else if (atime_preserve_option == replace_atime_preserve
- && (set_file_atime (fd, parentfd, name,
- st->atime, fstatat_flags)
- != 0))
+ && fd && (is_dir || original_size != 0)
+ && set_file_atime (fd, parentfd, name, st->atime) != 0)
utime_error (p);
}