X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Ftar.c;h=928cfddd44a86220ab444844cac61c10da6495aa;hb=3913675640f65bb4774429d369681957b528996e;hp=223de2cdf531137d07c2ddbdbfe705f9af1fa764;hpb=fbc54fa3378b6ee5bbf9ad735dce47eee606317c;p=chaz%2Ftar diff --git a/src/tar.c b/src/tar.c index 223de2c..928cfdd 100644 --- a/src/tar.c +++ b/src/tar.c @@ -43,7 +43,7 @@ #include #include #include -#include +#include #include #include #include @@ -1014,7 +1014,7 @@ get_date_or_file (struct tar_args *args, const char *option, || *str == '.') { struct stat st; - if (deref_stat (dereference_option, str, &st) != 0) + if (stat (str, &st) != 0) { stat_error (str); USAGE_ERROR ((0, 0, _("Date sample file not found"))); @@ -1023,7 +1023,7 @@ get_date_or_file (struct tar_args *args, const char *option, } else { - if (! get_date (ts, str, NULL)) + if (! parse_datetime (ts, str, NULL)) { WARN ((0, 0, _("Substituting %s for unknown date format %s"), tartime (*ts, false), quote (str))); @@ -1142,6 +1142,20 @@ add_file_id (const char *filename) file_id_list = p; } +/* Default density numbers for [0-9][lmh] device specifications */ + +#ifndef LOW_DENSITY_NUM +# define LOW_DENSITY_NUM 0 +#endif + +#ifndef MID_DENSITY_NUM +# define MID_DENSITY_NUM 8 +#endif + +#ifndef HIGH_DENSITY_NUM +# define HIGH_DENSITY_NUM 16 +#endif + static void update_argv (const char *filename, struct argp_state *state) { @@ -2451,6 +2465,18 @@ decode_options (int argc, char **argv) if (recursive_unlink_option) old_files_option = UNLINK_FIRST_OLD_FILES; + /* Flags for accessing files to be read from or copied into. POSIX says + O_NONBLOCK has unspecified effect on most types of files, but in + practice it never harms and sometimes helps. */ + { + int base_open_flags = + (O_BINARY | O_CLOEXEC | O_NOCTTY | O_NONBLOCK + | (dereference_option ? 0 : O_NOFOLLOW) + | (atime_preserve_option == system_atime_preserve ? O_NOATIME : 0)); + open_read_flags = O_RDONLY | base_open_flags; + open_searchdir_flags = O_SEARCH | O_DIRECTORY | base_open_flags; + } + fstatat_flags = dereference_option ? 0 : AT_SYMLINK_NOFOLLOW; if (subcommand_option == TEST_LABEL_SUBCOMMAND) { @@ -2662,9 +2688,31 @@ tar_stat_init (struct tar_stat_info *st) memset (st, 0, sizeof (*st)); } +/* Close the stream or file descriptor associated with ST, and remove + all traces of it from ST. Return true if successful, false (with a + diagnostic) otherwise. */ +bool +tar_stat_close (struct tar_stat_info *st) +{ + int status = (st->dirstream ? closedir (st->dirstream) + : 0 < st->fd ? close (st->fd) + : 0); + st->dirstream = 0; + st->fd = 0; + + if (status == 0) + return true; + else + { + close_diag (st->orig_file_name); + return false; + } +} + void tar_stat_destroy (struct tar_stat_info *st) { + tar_stat_close (st); free (st->orig_file_name); free (st->file_name); free (st->link_name);