X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Fcreate.c;h=a1e90a33679f12b0119953cbf465d64bd1e21eb5;hb=777042e024d4bf7357ffd060ad05763d463fe441;hp=0d22e9601d07164ebbef67923a6090b738d5ffe6;hpb=d9458886432a92230e432e8e8492703c7afb8272;p=chaz%2Ftar diff --git a/src/create.c b/src/create.c index 0d22e96..a1e90a3 100644 --- a/src/create.c +++ b/src/create.c @@ -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: @@ -1345,7 +1347,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 +1552,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 +1583,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 @@ -1615,7 +1619,7 @@ dump_file0 (struct tar_stat_info *st, char const *name, char const *p) 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)) @@ -1723,7 +1727,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 { @@ -1793,9 +1797,7 @@ 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, parentfd, name, - st->atime, fstatat_flags) - != 0)) + && set_file_atime (fd, parentfd, name, st->atime) != 0) utime_error (p); }