static void
append_file (char *file_name)
{
- int handle = open (file_name, O_RDONLY | O_BINARY);
+ int handle = openat (chdir_fd, file_name, O_RDONLY | O_BINARY);
struct stat stat_data;
if (handle < 0)
if (S_ISDIR (s.st_mode))
{
char *p, *dirp;
- dirp = savedir (name->name);
- if (!dirp)
+ DIR *stream;
+ int fd = openat (chdir_fd, name->name,
+ open_read_flags | O_DIRECTORY);
+ if (fd < 0)
+ open_error (name->name);
+ else if (! ((stream = fdopendir (fd))
+ && (dirp = streamsavedir (stream))))
savedir_error (name->name);
else
{
remname (name);
}
+
+ if (stream
+ ? closedir (stream) != 0
+ : 0 <= fd && close (fd) != 0)
+ savedir_error (name->name);
}
else if (tar_timespec_cmp (get_stat_mtime (&s),
current_stat_info.mtime)
if (subcommand_option == CAT_SUBCOMMAND)
append_file (file_name);
else
- dump_file (file_name, 1, (dev_t) 0);
+ dump_file (0, file_name, file_name);
}
}
write_eot ();
close_archive ();
+ finish_deferred_unlinks ();
names_notfound ();
}