]> Dogcows Code - chaz/tar/blobdiff - src/tar.c
Do not attempt to close stderr after call to close_stdout.
[chaz/tar] / src / tar.c
index 3ef89ba931a7513ebb5b0ccdc50b18fce7521457..e0b8ad02bddcd221d080fe71db4707e810b74e6f 100644 (file)
--- a/src/tar.c
+++ b/src/tar.c
@@ -301,6 +301,7 @@ enum
   SHOW_DEFAULTS_OPTION,
   SHOW_OMITTED_DIRS_OPTION,
   SHOW_TRANSFORMED_NAMES_OPTION,
+  SPARSE_VERSION_OPTION,
   STRIP_COMPONENTS_OPTION,
   SUFFIX_OPTION,
   TEST_LABEL_OPTION,
@@ -319,13 +320,16 @@ enum
 
 const char *argp_program_version = "tar (" PACKAGE_NAME ") " VERSION;
 const char *argp_program_bug_address = "<" PACKAGE_BUGREPORT ">";
-static char doc[] = N_("GNU `tar' saves many files together into a single tape or disk archive, and can restore individual files from the archive.\n\
+static char const doc[] = N_("\
+GNU `tar' saves many files together into a single tape or disk archive, \
+and can restore individual files from the archive.\n\
 \n\
 Examples:\n\
   tar -cf archive.tar foo bar  # Create archive.tar from files foo and bar.\n\
   tar -tvf archive.tar         # List all files in archive.tar verbosely.\n\
-  tar -xf archive.tar          # Extract all files from archive.tar.\n\
-\vThe backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
+  tar -xf archive.tar          # Extract all files from archive.tar.\n")
+"\v"
+N_("The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
 The version control may be set with --backup or VERSION_CONTROL, values are:\n\n\
   none, off       never make backups\n\
   t, numbered     make numbered backups\n\
@@ -382,6 +386,8 @@ static struct argp_option options[] = {
 
   {"sparse", 'S', 0, 0,
    N_("handle sparse files efficiently"), GRID+1 },
+  {"sparse-version", SPARSE_VERSION_OPTION, N_("MAJOR[.MINOR]"), 0,
+   N_("set version of the sparse format to use (implies --sparse)"), GRID+1},
   {"incremental", 'G', 0, 0,
    N_("handle old GNU-format incremental backup"), GRID+1 },
   {"listed-incremental", 'g', N_("FILE"), 0,
@@ -400,7 +406,7 @@ static struct argp_option options[] = {
 
 #define GRID 30
   {NULL, 0, NULL, 0,
-   N_("Overwrite control:\n"), GRID+1 },
+   N_("Overwrite control:"), GRID+1 },
 
   {"verify", 'W', 0, 0,
    N_("attempt to verify the archive after writing it"), GRID+1 },
@@ -627,10 +633,10 @@ static struct argp_option options[] = {
    N_("strip NUMBER leading components from file names on extraction"),
    GRID+1 },
   {"transform", TRANSFORM_OPTION, N_("EXPRESSION"), 0,
-   N_("Use sed replace EXPRESSION to transform file names"), GRID+1 },
+   N_("use sed replace EXPRESSION to transform file names"), GRID+1 },
 #undef GRID
 
-#define GRID 95  
+#define GRID 95
   {NULL, 0, NULL, 0,
    N_("File name matching options (affect both exclude and include patterns):"),
    GRID },
@@ -651,7 +657,7 @@ static struct argp_option options[] = {
   {"wildcards-match-slash", WILDCARDS_MATCH_SLASH_OPTION, 0, 0,
    N_("wildcards match `/' (default for exclusion)"), GRID+1 },
 #undef GRID
-  
+
 #define GRID 100
   {NULL, 0, NULL, 0,
    N_("Informative output:"), GRID },
@@ -771,7 +777,7 @@ struct tar_args        /* Variables used during option parsing */
   | (args)->matching_flags \
   | recursion_option)
 
-#ifdef REMOTE_SHELL                                                       
+#ifdef REMOTE_SHELL
 # define DECL_SHOW_DEFAULT_SETTINGS(stream, printer)                      \
 {                                                                         \
   printer (stream,                                                        \
@@ -799,7 +805,7 @@ struct tar_args        /* Variables used during option parsing */
 static void
 show_default_settings (FILE *fp)
      DECL_SHOW_DEFAULT_SETTINGS(fp, fprintf)
-     
+
 static void
 show_default_settings_fs (argp_fmtstream_t fs)
      DECL_SHOW_DEFAULT_SETTINGS(fs, argp_fmtstream_printf)
@@ -869,7 +875,7 @@ set_stat_signal (const char *name)
     { "QUIT", SIGQUIT }
   };
   struct sigtab *p;
-  
+
   for (p = sigtab; p < sigtab + sizeof (sigtab) / sizeof (sigtab[0]); p++)
     if (strcmp (p->name, name) == 0)
       {
@@ -1119,11 +1125,11 @@ tar_help (struct argp_state *state)
                   ARGP_HELP_STD_HELP & ~ARGP_HELP_BUG_ADDR);
   /* FIXME: use struct uparams.rmargin (from argp-help.c) instead of 79 */
   fs = argp_make_fmtstream (state->out_stream, 0, 79, 0);
-  
+
   argp_fmtstream_printf (fs, "\n%s\n\n",
                       _("Valid arguments for --quoting-style options are:"));
   tar_list_quoting_styles (fs, "  ");
-       
+
   argp_fmtstream_puts (fs, _("\n*This* tar defaults to:\n"));
   show_default_settings_fs (fs);
   argp_fmtstream_putc (fs, '\n');
@@ -1283,7 +1289,7 @@ parse_opt (int key, char *arg, struct argp_state *state)
       get_date_or_file (args, "--mtime", arg, &mtime_option);
       set_mtime_option = true;
       break;
-      
+
     case 'n':
       seekable_archive = true;
       break;
@@ -1324,7 +1330,7 @@ parse_opt (int key, char *arg, struct argp_state *state)
       /* Print block numbers for debugging bad tar archives.  */
 
       /* It would surely make sense to exchange -B and -R, but it seems
-        that -B has been used for a long while in Sun tar ans most
+        that -B has been used for a long while in Sun tar and most
         BSD-derived systems.  This is a consequence of the block/record
         terminology confusion.  */
 
@@ -1332,7 +1338,7 @@ parse_opt (int key, char *arg, struct argp_state *state)
       break;
 
     case 's':
-      /* Names to extr are sorted.  */
+      /* Names to extract are sorted.  */
 
       same_order_option = true;
       break;
@@ -1341,6 +1347,22 @@ parse_opt (int key, char *arg, struct argp_state *state)
       sparse_option = true;
       break;
 
+    case SPARSE_VERSION_OPTION:
+      sparse_option = true;
+      {
+       char *p;
+       tar_sparse_major = strtoul (arg, &p, 10);
+       if (*p)
+         {
+           if (*p != '.')
+             USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
+           tar_sparse_minor = strtoul (p + 1, &p, 10);
+           if (*p)
+             USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
+         }
+      }
+      break;
+
     case 't':
       set_subcommand_option (LIST_SUBCOMMAND);
       verbose_option++;
@@ -1698,7 +1720,7 @@ parse_opt (int key, char *arg, struct argp_state *state)
     case TRANSFORM_OPTION:
       set_transform_expr (arg);
       break;
-      
+
     case USE_COMPRESS_PROGRAM_OPTION:
       set_use_compress_program_option (arg);
       break;
@@ -1895,6 +1917,8 @@ decode_options (int argc, char **argv)
   newer_mtime_option.tv_nsec = -1;
   recursion_option = FNM_LEADING_DIR;
   unquote_option = true;
+  tar_sparse_major = 1;
+  tar_sparse_minor = 0;
 
   owner_option = -1;
   group_option = -1;
@@ -1998,7 +2022,7 @@ decode_options (int argc, char **argv)
   /* Warn about implicit use of the wildcards in command line arguments.
      See TODO */
   warn_regex_usage = args.wildcards == default_wildcards;
-  
+
   /* Derive option values and check option consistency.  */
 
   if (archive_format == DEFAULT_FORMAT)
@@ -2017,13 +2041,6 @@ decode_options (int argc, char **argv)
                   | FORMAT_MASK (GNU_FORMAT)
                   | FORMAT_MASK (POSIX_FORMAT));
 
-  if (multi_volume_option
-      && archive_format == POSIX_FORMAT
-      && subcommand_option == CREATE_SUBCOMMAND
-      && !tape_length_option)
-    USAGE_ERROR ((0, 0,
-                 _("creating multi-volume archives in posix format requires using --tape-length (-L) option")));
-
   if (occurrence_option)
     {
       if (!args.input_files)
@@ -2177,6 +2194,16 @@ decode_options (int argc, char **argv)
       break;
     }
 
+  /* Initialize stdlis */
+  if (index_file_name)
+    {
+      stdlis = fopen (index_file_name, "w");
+      if (! stdlis)
+       open_error (index_file_name);
+    }
+  else
+    stdlis = to_stdout_option ? stderr : stdout;
+
   archive_name_cursor = archive_name_array;
 
   /* Prepare for generating backup names.  */
@@ -2219,6 +2246,9 @@ main (int argc, char **argv)
   /* Make sure we have first three descriptors available */
   stdopen ();
 
+  /* Close all inherited open descriptors, except for the first three */
+  closeopen ();
+
   /* Pre-allocate a few structures.  */
 
   allocated_archive_names = 10;
@@ -2297,13 +2327,14 @@ main (int argc, char **argv)
   free (archive_name_array);
   name_term ();
 
-  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)
+
+  if (stdlis == stdout)
+    close_stdout ();
+  else if (ferror (stderr) || fclose (stderr) != 0) 
     exit_status = TAREXIT_FAILURE;
+
   return exit_status;
 }
 
This page took 0.032035 seconds and 4 git commands to generate.