]> Dogcows Code - chaz/tar/blobdiff - src/tar.c
(extract_volhdr): New function
[chaz/tar] / src / tar.c
index c8eeaa4fb84c7393bd4a4f736ab537475fcc5385..300fa71f41ea16a24695f5b74be299985826e0e3 100644 (file)
--- a/src/tar.c
+++ b/src/tar.c
@@ -22,7 +22,9 @@
 #include <system.h>
 
 #include <fnmatch.h>
+#include <getline.h>
 #include <argp.h>
+#include <argp-namefrob.h>
 
 #include <signal.h>
 #if ! defined SIGCHLD && defined SIGCLD
@@ -37,6 +39,8 @@
 #include "common.h"
 
 #include <argmatch.h>
+#include <closeout.h>
+#include <exitfail.h>
 #include <getdate.h>
 #include <localedir.h>
 #include <rmt.h>
@@ -233,7 +237,7 @@ tar_set_quoting_style (char *arg)
        return;
       }
   FATAL_ERROR ((0, 0,
-               _("Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."), arg));
+               _("Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."), arg, program_invocation_short_name));
 }
 
 \f
@@ -366,7 +370,7 @@ static struct argp_option options[] = {
   {"delete", DELETE_OPTION, 0, 0,
    N_("delete from the archive (not on mag tapes!)"), GRID+1 },
   {"test-label", TEST_LABEL_OPTION, NULL, 0,
-   N_("Test archive volume label and exit"), GRID+1 },
+   N_("test the archive volume label and exit"), GRID+1 },
 #undef GRID
 
 #define GRID 20
@@ -382,7 +386,11 @@ static struct argp_option options[] = {
   {"ignore-failed-read", IGNORE_FAILED_READ_OPTION, 0, 0,
    N_("do not exit with nonzero on unreadable files"), GRID+1 },
   {"occurrence", OCCURRENCE_OPTION, N_("NUMBER"), OPTION_ARG_OPTIONAL,
-   N_("process only the NUMBERth occurrence of each file in the archive. This option is valid only in conjunction with one of the subcommands --delete, --diff, --extract or --list and when a list of files is given either on the command line or via -T option. NUMBER defaults to 1."), GRID+1 },
+   N_("process only the NUMBERth occurrence of each file in the archive;"
+      " this option is valid only in conjunction with one of the subcommands"
+      " --delete, --diff, --extract or --list and when a list of files"
+      " is given either on the command line or via the -T option;"
+      " NUMBER defaults to 1"), GRID+1 },
   {"seek", 'n', NULL, 0,
    N_("archive is seekable"), GRID+1 },
 #undef GRID
@@ -458,9 +466,10 @@ static struct argp_option options[] = {
   {"preserve", PRESERVE_OPTION, 0, 0,
    N_("same as both -p and -s"), GRID+1 },
   {"delay-directory-restore", DELAY_DIRECTORY_RESTORE_OPTION, 0, 0,
-   N_("Delay setting modification times and permissions of extracted directories until the end of extraction."), GRID+1 },
+   N_("delay setting modification times and permissions of extracted"
+      " directories until the end of extraction"), GRID+1 },
   {"no-delay-directory-restore", NO_DELAY_DIRECTORY_RESTORE_OPTION, 0, 0,
-   N_("Cancel the effect of --delay-directory-restore option."), GRID+1 },
+   N_("cancel the effect of --delay-directory-restore option"), GRID+1 },
 #undef GRID
 
 #define GRID 60
@@ -521,7 +530,7 @@ static struct argp_option options[] = {
    N_("Archive format selection:"), GRID },
 
   {"format", 'H', N_("FORMAT"), 0,
-   N_("create archive of the given format."), GRID+1 },
+   N_("create archive of the given format"), GRID+1 },
 
   {NULL, 0, NULL, 0, N_("FORMAT is one of the following:"), GRID+2 },
   {"  v7", 0, NULL, OPTION_DOC|OPTION_NO_TRANS, N_("old V7 tar format"),
@@ -541,10 +550,10 @@ static struct argp_option options[] = {
   {"portability", 0, 0, OPTION_ALIAS, NULL, GRID+8 },
   {"posix", POSIX_OPTION, 0, 0,
    N_("same as --format=posix"), GRID+8 },
-  {"pax-option", PAX_OPTION, N_("keyword[[:]=value][,keyword[[:]=value], ...]"), 0,
+  {"pax-option", PAX_OPTION, N_("keyword[[:]=value][,keyword[[:]=value]]..."), 0,
    N_("control pax keywords"), GRID+8 },
   {"label", 'V', N_("TEXT"), 0,
-   N_("create archive with volume name TEXT. At list/extract time, use TEXT as a globbing pattern for volume name"), GRID+8 },
+   N_("create archive with volume name TEXT; at list/extract time, use TEXT as a globbing pattern for volume name"), GRID+8 },
   {"bzip2", 'j', 0, 0,
    N_("filter the archive through bzip2"), GRID+8 },
   {"gzip", 'z', 0, 0,
@@ -645,18 +654,18 @@ static struct argp_option options[] = {
    N_("ask for confirmation for every action"), GRID+1 },
   {"confirmation", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
   {"show-defaults", SHOW_DEFAULTS_OPTION, 0, 0,
-   N_("Show tar defaults"), GRID+1 },
+   N_("show tar defaults"), GRID+1 },
   {"show-omitted-dirs", SHOW_OMITTED_DIRS_OPTION, 0, 0,
-   N_("When listing or extracting, list each directory that does not match search criteria"), GRID+1 },
+   N_("when listing or extracting, list each directory that does not match search criteria"), GRID+1 },
   {"show-stored-names", SHOW_STORED_NAMES_OPTION, 0, 0,
-   N_("When creating archive in verbose mode, list member names as stored in the archive"),
+   N_("when creating archive in verbose mode, list member names as stored in the archive"),
    GRID+1 },
   {"quoting-style", QUOTING_STYLE_OPTION, N_("STYLE"), 0,
-   N_("Set name quoting style. See below for valid STYLE values."), GRID+1 },
+   N_("set name quoting style; see below for valid STYLE values"), GRID+1 },
   {"quote-chars", QUOTE_CHARS_OPTION, N_("STRING"), 0,
-   N_("Additionally quote characters from STRING"), GRID+1 },
+   N_("additionally quote characters from STRING"), GRID+1 },
   {"no-quote-chars", NO_QUOTE_CHARS_OPTION, N_("STRING"), 0,
-   N_("Disable quoting for characters from STRING"), GRID+1 },
+   N_("disable quoting for characters from STRING"), GRID+1 },
 #undef GRID
 
 #define GRID 110
@@ -664,7 +673,7 @@ static struct argp_option options[] = {
    N_("Compatibility options:"), GRID },
 
   {NULL, 'o', 0, 0,
-   N_("when creating, same as --old-archive. When extracting, same as --no-same-owner"), GRID+1 },
+   N_("when creating, same as --old-archive; when extracting, same as --no-same-owner"), GRID+1 },
 #undef GRID
 
 #define GRID 120
@@ -672,15 +681,15 @@ static struct argp_option options[] = {
    N_("Other options:"), GRID },
 
   {"restrict", RESTRICT_OPTION, 0, 0,
-   N_("Restrict use of some potentially harmful options"), -1 },
+   N_("disable use of some potentially harmful options"), -1 },
 
-  {"help",  '?', 0, 0,  N_("Give this help list"), -1},
-  {"usage", USAGE_OPTION, 0, 0,  N_("Give a short usage message"), -1},
-  {"version", VERSION_OPTION, 0, 0,  N_("Print program version"), -1},
+  {"help",  '?', 0, 0,  N_("give this help list"), -1},
+  {"usage", USAGE_OPTION, 0, 0,  N_("give a short usage message"), -1},
+  {"version", VERSION_OPTION, 0, 0,  N_("print program version"), -1},
   /* FIXME -V (--label) conflicts with the default short option for
      --version */
   {"HANG",       HANG_OPTION,    "SECS", OPTION_ARG_OPTIONAL | OPTION_HIDDEN,
-   N_("Hang for SECS seconds (default 3600)"), 0},
+   N_("hang for SECS seconds (default 3600)"), 0},
 #undef GRID
 
   {0, 0, 0, 0, 0, 0}
@@ -1441,7 +1450,8 @@ parse_opt (int key, char *arg, struct argp_state *state)
 
     case SHOW_DEFAULTS_OPTION:
       show_default_settings (stdout);
-      exit(0);
+      close_stdout ();
+      exit (0);
 
     case STRIP_COMPONENTS_OPTION:
       {
@@ -1605,16 +1615,18 @@ parse_opt (int key, char *arg, struct argp_state *state)
       fprintf (state->out_stream, "\n");
       fprintf (state->out_stream, _("Report bugs to %s.\n"),
               argp_program_bug_address);
+      close_stdout ();
       exit (0);
 
     case USAGE_OPTION:
-      argp_state_help (state, state->out_stream,
-                      ARGP_HELP_USAGE | ARGP_HELP_EXIT_OK);
-      break;
+      argp_state_help (state, state->out_stream, ARGP_HELP_USAGE);
+      close_stdout ();
+      exit (0);
 
     case VERSION_OPTION:
       version_etc (state->out_stream, "tar", PACKAGE_NAME, VERSION,
                   "John Gilmore", "Jay Fenlason", (char *) NULL);
+      close_stdout ();
       exit (0);
 
     case HANG_OPTION:
@@ -1643,6 +1655,7 @@ void
 usage (int status)
 {
   argp_help (&argp, stderr, ARGP_HELP_SEE, (char*) program_name);
+  close_stdout ();
   exit (status);
 }
 
@@ -1753,7 +1766,7 @@ decode_options (int argc, char **argv)
 
   if (argp_parse (&argp, argc, argv, ARGP_IN_ORDER|ARGP_NO_HELP,
                  &index, &args))
-    exit (1);
+    exit (TAREXIT_FAILURE);
 
 
   /* Special handling for 'o' option:
@@ -2003,6 +2016,7 @@ main (int argc, char **argv)
   bindtextdomain (PACKAGE, LOCALEDIR);
   textdomain (PACKAGE);
 
+  exit_failure = TAREXIT_FAILURE;
   exit_status = TAREXIT_SUCCESS;
   filename_terminator = '\n';
   set_quoting_style (0, DEFAULT_QUOTING_STYLE);
@@ -2089,8 +2103,9 @@ main (int argc, char **argv)
   free (archive_name_array);
   name_term ();
 
-  if (stdlis != stderr && (ferror (stdlis) || fclose (stdlis) != 0))
-    FATAL_ERROR ((0, 0, _("Error in writing to standard output")));
+  if (stdlis == stdout)
+    close_stdout ();
+
   if (exit_status == TAREXIT_FAILURE)
     error (0, 0, _("Error exit delayed from previous errors"));
   if (ferror (stderr) || fclose (stderr) != 0)
This page took 0.027967 seconds and 4 git commands to generate.