From: Paul Eggert Date: Mon, 13 Dec 1999 05:11:05 +0000 (+0000) Subject: ("quotearg.h"): New include. X-Git-Url: https://git.dogcows.com/gitweb?a=commitdiff_plain;h=c6720c5a8bf56135fcbaa551ffba3fcc8f0348b7;p=chaz%2Ftar ("quotearg.h"): New include. (usage): Now has __attribute__ ((noreturn)). (confirm): Report errno if we can't open tty. (confirm, decode_options): Quote arbitrary strings in diagnostics. (OVERWRITE_OPTION): New constant. (long_options, usage, decode_options): New --overwrite option. (decode_options): --keep-old-files, --overwrite, and --unlink-first are now mutually exclusive. Don't assume that gettext preserves errno. (main): Set default quoting style to escape_quoting_style. --- diff --git a/src/tar.c b/src/tar.c index dfbeca8..0bc0b09 100644 --- a/src/tar.c +++ b/src/tar.c @@ -37,6 +37,7 @@ time_t time (); #define GLOBAL #include "common.h" +#include "quotearg.h" #include "xstrtol.h" time_t get_date (); @@ -51,7 +52,7 @@ time_t get_date (); # define DEFAULT_BLOCKING 20 #endif -static void usage PARAMS ((int)); +static void usage PARAMS ((int)) __attribute__ ((noreturn)); /* Miscellaneous. */ @@ -85,18 +86,19 @@ confirm (const char *message_action, const char *message_name) if (!confirm_file) { if (archive == 0 || stdin_used_by) - confirm_file = fopen (TTY_NAME, "r"); + { + confirm_file = fopen (TTY_NAME, "r"); + if (! confirm_file) + open_fatal (TTY_NAME); + } else { request_stdin ("-w"); confirm_file = stdin; } - - if (!confirm_file) - FATAL_ERROR ((0, 0, _("Cannot read confirmation from user"))); } - fprintf (stdlis, "%s %s?", message_action, message_name); + fprintf (stdlis, "%s %s?", message_action, quote (message_name)); fflush (stdlis); { @@ -136,6 +138,7 @@ enum NEWER_MTIME_OPTION, NO_RECURSE_OPTION, NULL_OPTION, + OVERWRITE_OPTION, OWNER_OPTION, POSIX_OPTION, PRESERVE_OPTION, @@ -223,6 +226,7 @@ struct option long_options[] = {"numeric-owner", no_argument, &numeric_owner_option, 1}, {"old-archive", no_argument, 0, 'o'}, {"one-file-system", no_argument, 0, 'l'}, + {"overwrite", no_argument, 0, OVERWRITE_OPTION}, {"owner", required_argument, 0, OWNER_OPTION}, {"portability", no_argument, 0, 'o'}, {"posix", no_argument, 0, POSIX_OPTION}, @@ -308,7 +312,8 @@ Main operation mode:\n\ Operation modifiers:\n\ -W, --verify attempt to verify the archive after writing it\n\ --remove-files remove files after adding them to the archive\n\ - -k, --keep-old-files don't overwrite existing files when extracting\n\ + -k, --keep-old-files don't replace existing files when extracting\n\ + --overwrite overwrite existing files when extracting\n\ -U, --unlink-first remove each file prior to extracting over it\n\ --recursive-unlink empty hierarchies prior to extracting directory\n\ -S, --sparse handle sparse files efficiently\n\ @@ -675,9 +680,8 @@ decode_options (int argc, char *const *argv) break; case 'k': - /* Don't overwrite existing files. */ - - keep_old_files_option = 1; + /* Don't replace existing files. */ + old_files_option = KEEP_OLD_FILES; break; case 'K': @@ -728,8 +732,8 @@ decode_options (int argc, char *const *argv) newer_mtime_option = get_date (optarg, 0); if (newer_mtime_option == (time_t) -1) - WARN ((0, 0, _("Substituting %s for unknown date format `%s'"), - tartime (newer_mtime_option), optarg)); + WARN ((0, 0, _("Substituting %s for unknown date format %s"), + tartime (newer_mtime_option), quote (optarg))); break; #endif /* not MSDOS */ @@ -800,7 +804,7 @@ decode_options (int argc, char *const *argv) break; case 'U': - unlink_first_option = 1; + old_files_option = UNLINK_FIRST_OLD_FILES; break; case 'v': @@ -825,7 +829,10 @@ decode_options (int argc, char *const *argv) case 'X': if (add_exclude_file (add_filtered_exclude, 0, optarg, '\n') != 0) - FATAL_ERROR ((0, errno, "%s", optarg)); + { + int e = errno; + FATAL_ERROR ((0, e, "%s", quotearg_colon (optarg))); + } break; case 'z': @@ -885,6 +892,10 @@ decode_options (int argc, char *const *argv) filename_terminator = '\0'; break; + case OVERWRITE_OPTION: + old_files_option = OVERWRITE_OLD_FILES; + break; + case OWNER_OPTION: if (! (strlen (optarg) < UNAME_FIELD_SIZE && uname_to_uid (optarg, &owner_option))) @@ -1095,7 +1106,7 @@ see the file named COPYING for details."), /* If ready to unlink hierarchies, so we are for simpler files. */ if (recursive_unlink_option) - unlink_first_option = 1; + old_files_option = UNLINK_FIRST_OLD_FILES; /* Forbid using -c with no input files whatsoever. Check that `-f -', explicit or implied, is used correctly. */ @@ -1163,6 +1174,7 @@ main (int argc, char *const *argv) exit_status = TAREXIT_SUCCESS; filename_terminator = '\n'; + set_quoting_style (0, escape_quoting_style); /* Pre-allocate a few structures. */