X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Ftar.c;h=5415bbee8e950e30655a2e1b2d2afb1053cbf6c6;hb=73266a46f3861d780d1e5e870e56fd73648af707;hp=379b05a0113dec80129672dd31aa5201cfe77213;hpb=cf4065dfe9a5fe2bf7238f58ae33d2f3365344bc;p=chaz%2Ftar diff --git a/src/tar.c b/src/tar.c index 379b05a..5415bbe 100644 --- a/src/tar.c +++ b/src/tar.c @@ -1,5 +1,5 @@ /* A tar (tape archiver) program. - Copyright 1988, 92,93,94,95,96,97, 1999 Free Software Foundation, Inc. + Copyright 1988, 92,93,94,95,96,97,99, 2000 Free Software Foundation, Inc. Written by John Gilmore, starting 1985-08-25. This program is free software; you can redistribute it and/or modify it @@ -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}, @@ -278,7 +282,13 @@ usage (int status) GNU `tar' saves many files together into a single tape or disk archive, and\n\ can restore individual files from the archive.\n"), stdout); - printf (_("\nUsage: %s [OPTION]... [FILE]...\n"), program_name); + printf (_("\nUsage: %s [OPTION]... [FILE]...\n\ +\n\ +Examples:\n\ + %s -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n\ + %s -tvf archive.tar # List all files in archive.tar verbosely.\n\ + %s -xf archive.tar # Extract all files from archive.tar.\n"), + program_name, program_name, program_name, program_name); fputs (_("\ \n\ If a long option shows an argument as mandatory, then it is mandatory\n\ @@ -302,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\ @@ -417,10 +428,7 @@ Support for POSIX is only partially implemented, don't count on it yet.\n\ ARCHIVE may be FILE, HOST:FILE or USER@HOST:FILE; and FILE may be a file\n\ or a device. *This* `tar' defaults to `-f%s -b%d'.\n"), DEFAULT_ARCHIVE, DEFAULT_BLOCKING); - fputs (_("\ -\n\ -Report bugs to .\n"), - stdout); + fputs (_("\nReport bugs to .\n"), stdout); } exit (status); } @@ -672,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': @@ -725,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 */ @@ -797,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': @@ -822,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': @@ -871,7 +881,7 @@ decode_options (int argc, char *const *argv) if (mode_option == MODE_INVALID) FATAL_ERROR ((0, 0, _("Invalid mode given on option"))); if (mode_option == MODE_MEMORY_EXHAUSTED) - FATAL_ERROR ((0, 0, _("Memory exhausted"))); + xalloc_die (); break; case NO_RECURSE_OPTION: @@ -882,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))) @@ -1036,7 +1050,7 @@ decode_options (int argc, char *const *argv) if (show_version) { printf ("tar (GNU %s) %s\n%s\n%s\n%s\n", PACKAGE, VERSION, - "Copyright 1999 Free Software Foundation, Inc.", + "Copyright 2000 Free Software Foundation, Inc.", _("\ This program comes with NO WARRANTY, to the extent permitted by law.\n\ You may redistribute it under the terms of the GNU General Public License;\n\ @@ -1092,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. */ @@ -1118,12 +1132,13 @@ see the file named COPYING for details."), case CAT_SUBCOMMAND: case UPDATE_SUBCOMMAND: case APPEND_SUBCOMMAND: + case DELETE_SUBCOMMAND: for (archive_name_cursor = archive_name_array; archive_name_cursor < archive_name_array + archive_names; archive_name_cursor++) if (!strcmp (*archive_name_cursor, "-")) USAGE_ERROR ((0, 0, - _("Options `-Aru' are incompatible with `-f -'"))); + _("Options `-Aru' and `--delete' are incompatible with `-f -'"))); default: break; @@ -1160,6 +1175,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. */