/* A tar (tape archiver) program.
- Copyright (C) 1988, 92,93,94,95,96,97, 1999 Free Software Foundation, Inc.
+ Copyright 1988, 92,93,94,95,96,97, 1999 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
#include <getopt.h>
+#include <signal.h>
+#if ! defined SIGCHLD && defined SIGCLD
+# define SIGCHLD SIGCLD
+#endif
+
/* The following causes "common.h" to produce definitions of all the global
variables, rather than just "extern" declarations of them. GNU tar does
depend on the system loader to preset all GLOBAL variables to neutral (or
- zero) values, explicit initialisation is usually not done. */
+ zero) values; explicit initialization is usually not done. */
#define GLOBAL
#include "common.h"
`----------------------------------------------*/
/* Name of option using stdin. */
-static const char *stdin_used_by = NULL;
+static const char *stdin_used_by;
void
request_stdin (const char *option)
int
confirm (const char *message_action, const char *message_name)
{
- static FILE *confirm_file = NULL;
+ static FILE *confirm_file;
if (!confirm_file)
{
do it. For the others, we share the code for the equivalent short
named option, the name of which is stored in the otherwise-unused `val'
field of the `struct option'; for long options that have no equivalent
- short option, we use nongraphic characters as pseudo short option
- characters, starting at 2 and going upwards. */
-
-#define BACKUP_OPTION 2
-#define DELETE_OPTION 3
-#define EXCLUDE_OPTION 4
-#define GROUP_OPTION 5
-#define MODE_OPTION 6
-#define NEWER_MTIME_OPTION 7
-#define NO_RECURSE_OPTION 8
-#define NULL_OPTION 9
-#define OWNER_OPTION 10
-#define POSIX_OPTION 11
-#define PRESERVE_OPTION 12
-#define RECORD_SIZE_OPTION 13
-#define RSH_COMMAND_OPTION 14
-#define SUFFIX_OPTION 15
-#define USE_COMPRESS_PROGRAM_OPTION 16
-#define VOLNO_FILE_OPTION 17
-
-/* Some cleanup is being made in GNU tar long options. Using old names is
- allowed for a while, but will also send a warning to stderr. Take old
- names out in 1.14, or in summer 1997, whichever happens last. We use
- nongraphic characters as pseudo short option characters, starting at 31
- and going downwards. */
-
-#define OBSOLETE_ABSOLUTE_NAMES 31
-#define OBSOLETE_BLOCK_COMPRESS 30
-#define OBSOLETE_BLOCKING_FACTOR 29
-#define OBSOLETE_BLOCK_NUMBER 28
-#define OBSOLETE_READ_FULL_RECORDS 27
-#define OBSOLETE_TOUCH 26
-#define OBSOLETE_VERSION_CONTROL 25
+ short option, we use non-characters as pseudo short options,
+ starting at CHAR_MAX + 1 and going upwards. */
+
+enum
+{
+ BACKUP_OPTION = CHAR_MAX + 1,
+ DELETE_OPTION,
+ EXCLUDE_OPTION,
+ GROUP_OPTION,
+ MODE_OPTION,
+ NEWER_MTIME_OPTION,
+ NO_RECURSE_OPTION,
+ NULL_OPTION,
+ OWNER_OPTION,
+ POSIX_OPTION,
+ PRESERVE_OPTION,
+ RECORD_SIZE_OPTION,
+ RSH_COMMAND_OPTION,
+ SUFFIX_OPTION,
+ USE_COMPRESS_PROGRAM_OPTION,
+ VOLNO_FILE_OPTION,
+
+ /* Some cleanup is being made in GNU tar long options. Using old names is
+ allowed for a while, but will also send a warning to stderr. Take old
+ names out in 1.14, or in summer 1997, whichever happens last. */
+
+ OBSOLETE_ABSOLUTE_NAMES,
+ OBSOLETE_BLOCK_COMPRESS,
+ OBSOLETE_BLOCKING_FACTOR,
+ OBSOLETE_BLOCK_NUMBER,
+ OBSOLETE_READ_FULL_RECORDS,
+ OBSOLETE_TOUCH,
+ OBSOLETE_VERSION_CONTROL
+};
/* If nonzero, display usage information and exit. */
-static int show_help = 0;
+static int show_help;
/* If nonzero, print the version on standard output and exit. */
-static int show_version = 0;
+static int show_version;
struct option long_options[] =
{
- {"absolute-names", no_argument, NULL, 'P'},
- {"absolute-paths", no_argument, NULL, OBSOLETE_ABSOLUTE_NAMES},
- {"after-date", required_argument, NULL, 'N'},
- {"append", no_argument, NULL, 'r'},
+ {"absolute-names", no_argument, 0, 'P'},
+ {"absolute-paths", no_argument, 0, OBSOLETE_ABSOLUTE_NAMES},
+ {"after-date", required_argument, 0, 'N'},
+ {"append", no_argument, 0, 'r'},
{"atime-preserve", no_argument, &atime_preserve_option, 1},
- {"backup", optional_argument, NULL, BACKUP_OPTION},
- {"block-compress", no_argument, NULL, OBSOLETE_BLOCK_COMPRESS},
- {"block-number", no_argument, NULL, 'R'},
- {"block-size", required_argument, NULL, OBSOLETE_BLOCKING_FACTOR},
- {"blocking-factor", required_argument, NULL, 'b'},
- {"catenate", no_argument, NULL, 'A'},
+ {"backup", optional_argument, 0, BACKUP_OPTION},
+ {"block-compress", no_argument, 0, OBSOLETE_BLOCK_COMPRESS},
+ {"block-number", no_argument, 0, 'R'},
+ {"block-size", required_argument, 0, OBSOLETE_BLOCKING_FACTOR},
+ {"blocking-factor", required_argument, 0, 'b'},
+ {"bzip2", no_argument, 0, 'I'},
+ {"catenate", no_argument, 0, 'A'},
{"checkpoint", no_argument, &checkpoint_option, 1},
- {"compare", no_argument, NULL, 'd'},
- {"compress", no_argument, NULL, 'Z'},
- {"concatenate", no_argument, NULL, 'A'},
- {"confirmation", no_argument, NULL, 'w'},
+ {"compare", no_argument, 0, 'd'},
+ {"compress", no_argument, 0, 'Z'},
+ {"concatenate", no_argument, 0, 'A'},
+ {"confirmation", no_argument, 0, 'w'},
/* FIXME: --selective as a synonym for --confirmation? */
- {"create", no_argument, NULL, 'c'},
- {"delete", no_argument, NULL, DELETE_OPTION},
- {"dereference", no_argument, NULL, 'h'},
- {"diff", no_argument, NULL, 'd'},
- {"directory", required_argument, NULL, 'C'},
- {"ending-file", required_argument, NULL, 'E'},
- {"exclude", required_argument, NULL, EXCLUDE_OPTION},
- {"exclude-from", required_argument, NULL, 'X'},
- {"extract", no_argument, NULL, 'x'},
- {"file", required_argument, NULL, 'f'},
- {"files-from", required_argument, NULL, 'T'},
+ {"create", no_argument, 0, 'c'},
+ {"delete", no_argument, 0, DELETE_OPTION},
+ {"dereference", no_argument, 0, 'h'},
+ {"diff", no_argument, 0, 'd'},
+ {"directory", required_argument, 0, 'C'},
+ {"exclude", required_argument, 0, EXCLUDE_OPTION},
+ {"exclude-from", required_argument, 0, 'X'},
+ {"extract", no_argument, 0, 'x'},
+ {"file", required_argument, 0, 'f'},
+ {"files-from", required_argument, 0, 'T'},
{"force-local", no_argument, &force_local_option, 1},
- {"get", no_argument, NULL, 'x'},
- {"group", required_argument, NULL, GROUP_OPTION},
- {"gunzip", no_argument, NULL, 'z'},
- {"gzip", no_argument, NULL, 'z'},
+ {"get", no_argument, 0, 'x'},
+ {"group", required_argument, 0, GROUP_OPTION},
+ {"gunzip", no_argument, 0, 'z'},
+ {"gzip", no_argument, 0, 'z'},
{"help", no_argument, &show_help, 1},
{"ignore-failed-read", no_argument, &ignore_failed_read_option, 1},
- {"ignore-zeros", no_argument, NULL, 'i'},
+ {"ignore-zeros", no_argument, 0, 'i'},
/* FIXME: --ignore-end as a new name for --ignore-zeros? */
- {"incremental", no_argument, NULL, 'G'},
- {"info-script", required_argument, NULL, 'F'},
- {"interactive", no_argument, NULL, 'w'},
- {"keep-old-files", no_argument, NULL, 'k'},
- {"label", required_argument, NULL, 'V'},
- {"list", no_argument, NULL, 't'},
- {"listed-incremental", required_argument, NULL, 'g'},
- {"mode", required_argument, NULL, MODE_OPTION},
- {"modification-time", no_argument, NULL, OBSOLETE_TOUCH},
- {"multi-volume", no_argument, NULL, 'M'},
- {"new-volume-script", required_argument, NULL, 'F'},
- {"newer", required_argument, NULL, 'N'},
- {"newer-mtime", required_argument, NULL, NEWER_MTIME_OPTION},
- {"null", no_argument, NULL, NULL_OPTION},
- {"no-recursion", no_argument, NULL, NO_RECURSE_OPTION},
+ {"incremental", no_argument, 0, 'G'},
+ {"info-script", required_argument, 0, 'F'},
+ {"interactive", no_argument, 0, 'w'},
+ {"keep-old-files", no_argument, 0, 'k'},
+ {"label", required_argument, 0, 'V'},
+ {"list", no_argument, 0, 't'},
+ {"listed-incremental", required_argument, 0, 'g'},
+ {"mode", required_argument, 0, MODE_OPTION},
+ {"modification-time", no_argument, 0, OBSOLETE_TOUCH},
+ {"multi-volume", no_argument, 0, 'M'},
+ {"new-volume-script", required_argument, 0, 'F'},
+ {"newer", required_argument, 0, 'N'},
+ {"newer-mtime", required_argument, 0, NEWER_MTIME_OPTION},
+ {"null", no_argument, 0, NULL_OPTION},
+ {"no-recursion", no_argument, 0, NO_RECURSE_OPTION},
{"numeric-owner", no_argument, &numeric_owner_option, 1},
- {"old-archive", no_argument, NULL, 'o'},
- {"one-file-system", no_argument, NULL, 'l'},
- {"owner", required_argument, NULL, OWNER_OPTION},
- {"portability", no_argument, NULL, 'o'},
- {"posix", no_argument, NULL, POSIX_OPTION},
- {"preserve", no_argument, NULL, PRESERVE_OPTION},
- {"preserve-order", no_argument, NULL, 's'},
- {"preserve-permissions", no_argument, NULL, 'p'},
+ {"old-archive", no_argument, 0, 'o'},
+ {"one-file-system", no_argument, 0, 'l'},
+ {"owner", required_argument, 0, OWNER_OPTION},
+ {"portability", no_argument, 0, 'o'},
+ {"posix", no_argument, 0, POSIX_OPTION},
+ {"preserve", no_argument, 0, PRESERVE_OPTION},
+ {"preserve-order", no_argument, 0, 's'},
+ {"preserve-permissions", no_argument, 0, 'p'},
{"recursive-unlink", no_argument, &recursive_unlink_option, 1},
- {"read-full-blocks", no_argument, NULL, OBSOLETE_READ_FULL_RECORDS},
- {"read-full-records", no_argument, NULL, 'B'},
+ {"read-full-blocks", no_argument, 0, OBSOLETE_READ_FULL_RECORDS},
+ {"read-full-records", no_argument, 0, 'B'},
/* FIXME: --partial-blocks might be a synonym for --read-full-records? */
- {"record-number", no_argument, NULL, OBSOLETE_BLOCK_NUMBER},
- {"record-size", required_argument, NULL, RECORD_SIZE_OPTION},
+ {"record-number", no_argument, 0, OBSOLETE_BLOCK_NUMBER},
+ {"record-size", required_argument, 0, RECORD_SIZE_OPTION},
{"remove-files", no_argument, &remove_files_option, 1},
- {"rsh-command", required_argument, NULL, RSH_COMMAND_OPTION},
- {"same-order", no_argument, NULL, 's'},
+ {"rsh-command", required_argument, 0, RSH_COMMAND_OPTION},
+ {"same-order", no_argument, 0, 's'},
{"same-owner", no_argument, &same_owner_option, 1},
- {"same-permissions", no_argument, NULL, 'p'},
+ {"same-permissions", no_argument, 0, 'p'},
{"show-omitted-dirs", no_argument, &show_omitted_dirs_option, 1},
- {"sparse", no_argument, NULL, 'S'},
- {"starting-file", required_argument, NULL, 'K'},
- {"suffix", required_argument, NULL, SUFFIX_OPTION},
- {"tape-length", required_argument, NULL, 'L'},
- {"to-stdout", no_argument, NULL, 'O'},
+ {"sparse", no_argument, 0, 'S'},
+ {"starting-file", required_argument, 0, 'K'},
+ {"suffix", required_argument, 0, SUFFIX_OPTION},
+ {"tape-length", required_argument, 0, 'L'},
+ {"to-stdout", no_argument, 0, 'O'},
{"totals", no_argument, &totals_option, 1},
- {"touch", no_argument, NULL, 'm'},
- {"uncompress", no_argument, NULL, 'Z'},
- {"ungzip", no_argument, NULL, 'z'},
- {"unlink-first", no_argument, NULL, 'U'},
- {"update", no_argument, NULL, 'u'},
- {"use-compress-program", required_argument, NULL, USE_COMPRESS_PROGRAM_OPTION},
- {"verbose", no_argument, NULL, 'v'},
- {"verify", no_argument, NULL, 'W'},
+ {"touch", no_argument, 0, 'm'},
+ {"uncompress", no_argument, 0, 'Z'},
+ {"ungzip", no_argument, 0, 'z'},
+ {"unlink-first", no_argument, 0, 'U'},
+ {"update", no_argument, 0, 'u'},
+ {"use-compress-program", required_argument, 0, USE_COMPRESS_PROGRAM_OPTION},
+ {"verbose", no_argument, 0, 'v'},
+ {"verify", no_argument, 0, 'W'},
{"version", no_argument, &show_version, 1},
- {"version-control", required_argument, NULL, OBSOLETE_VERSION_CONTROL},
- {"volno-file", required_argument, NULL, VOLNO_FILE_OPTION},
+ {"version-control", required_argument, 0, OBSOLETE_VERSION_CONTROL},
+ {"volno-file", required_argument, 0, VOLNO_FILE_OPTION},
{0, 0, 0, 0}
};
-V, --label=NAME create archive with volume name NAME\n\
PATTERN at list/extract time, a globbing PATTERN\n\
-o, --old-archive, --portability write a V7 format archive\n\
- --posix write a POSIX conformant archive\n\
+ --posix write a POSIX format archive\n\
+ -I, --bzip2 filter the archive through bzip2\n\
-z, --gzip, --ungzip filter the archive through gzip\n\
-Z, --compress, --uncompress filter the archive through compress\n\
--use-compress-program=PROG filter through PROG (must accept -d)\n"),
-h, --dereference dump instead the files symlinks point to\n\
--no-recursion avoid descending automatically in directories\n\
-l, --one-file-system stay in local file system when creating archive\n\
- -E, --ending-file=NAME end reading the archive before file NAME\n\
-K, --starting-file=NAME begin at file NAME in the archive\n"),
stdout);
#if !MSDOS
#endif
fputs (_("\
--backup[=CONTROL] backup before removal, choose version control\n\
- --suffix=SUFFIX backup before removel, override usual suffix\n"),
+ --suffix=SUFFIX backup before removal, override usual suffix\n"),
stdout);
fputs (_("\
\n\
DEFAULT_ARCHIVE, DEFAULT_BLOCKING);
fputs (_("\
\n\
-Report bugs to <tar-bugs@gnu.org>.\n"),
+Report bugs to <bug-tar@gnu.org>.\n"),
stdout);
}
exit (status);
| Parse the options for tar. |
`----------------------------*/
-/* Available option letters are DHIJQY and aejnqy. Some are reserved:
+/* Available option letters are DEHJQY and aejnqy. Some are reserved:
y per-file gzip compression
Y per-block gzip compression */
#define OPTION_STRING \
- "-01234567ABC:E:F:GK:L:MN:OPRST:UV:WX:Zb:cdf:g:hiklmoprstuvwxz"
+ "-01234567ABC:F:GIK:L:MN:OPRST:UV:WX:Zb:cdf:g:hiklmoprstuvwxz"
static void
set_subcommand_option (enum subcommand subcommand)
use_compress_program_option = string;
}
+/* Ignore DUMMY (which will always be null in practice), and add
+ PATTERN to the proper set of patterns to be excluded -- either
+ patterns with slashes, or patterns without. */
+static void
+add_filtered_exclude (struct exclude *dummy, char const *pattern)
+{
+ add_exclude ((strchr (pattern, '/')
+ ? excluded_with_slash
+ : excluded_without_slash),
+ pattern);
+}
+
static void
decode_options (int argc, char *const *argv)
{
int optchar; /* option letter */
int input_files; /* number of input files */
const char *backup_suffix_string;
- const char *version_control_string = NULL;
+ const char *version_control_string = 0;
/* Set some default option values. */
archive_format = DEFAULT_FORMAT;
blocking_factor = DEFAULT_BLOCKING;
record_size = DEFAULT_BLOCKING * BLOCKSIZE;
+ excluded_with_slash = new_exclude ();
+ excluded_without_slash = new_exclude ();
+ newer_mtime_option = TYPE_MINIMUM (time_t);
owner_option = -1;
group_option = -1;
/* Allocate a new argument array, and copy program name in it. */
new_argc = argc - 1 + strlen (argv[1]);
- new_argv = (char **) xmalloc (new_argc * sizeof (char *));
+ new_argv = xmalloc (new_argc * sizeof (char *));
in = argv;
out = new_argv;
*out++ = *in++;
input_files = 0;
- while (optchar = getopt_long (argc, argv, OPTION_STRING, long_options, NULL),
- optchar != EOF)
+ while (optchar = getopt_long (argc, argv, OPTION_STRING, long_options, 0),
+ optchar != -1)
switch (optchar)
{
case '?':
case 1:
/* File name or non-parsed option, because of RETURN_IN_ORDER
- ordering triggerred by the leading dash in OPTION_STRING. */
+ ordering triggered by the leading dash in OPTION_STRING. */
name_add (optarg);
input_files++;
case 'b':
{
- long l;
- if (! (xstrtol (optarg, (char **) 0, 10, &l, "") == LONGINT_OK
- && l == (blocking_factor = l)
+ uintmax_t u;
+ if (! (xstrtoumax (optarg, 0, 10, &u, "") == LONGINT_OK
+ && u == (blocking_factor = u)
&& 0 < blocking_factor
- && l == (record_size = l * (size_t) BLOCKSIZE) / BLOCKSIZE))
+ && u == (record_size = u * BLOCKSIZE) / BLOCKSIZE))
USAGE_ERROR ((0, 0, _("Invalid blocking factor")));
}
break;
set_subcommand_option (DIFF_SUBCOMMAND);
break;
- case 'E':
- ending_file_option = optarg;
- break;
-
case 'f':
if (archive_names == allocated_archive_names)
{
allocated_archive_names *= 2;
- archive_name_array = (const char **)
+ archive_name_array =
xrealloc (archive_name_array,
sizeof (const char *) * allocated_archive_names);
}
case 'g':
listed_incremental_option = optarg;
+ after_date_option = 1;
/* Fall through. */
case 'G':
ignore_zeros_option = 1;
break;
+ case 'I':
+ set_use_compress_program_option ("bzip2");
+ break;
+
case 'k':
/* Don't overwrite existing files. */
case 'K':
starting_file_option = 1;
- addname (optarg);
+ addname (optarg, 0);
break;
case 'l':
case 'L':
{
- unsigned long u;
- if (xstrtoul (optarg, (char **) 0, 10, &u, "") != LONG_MAX)
+ uintmax_t u;
+ if (xstrtoumax (optarg, 0, 10, &u, "") != LONGINT_OK)
USAGE_ERROR ((0, 0, _("Invalid tape length")));
- clear_tarlong (tape_length_option);
- add_to_tarlong (tape_length_option, u);
- mult_tarlong (tape_length_option, 1024);
+ tape_length_option = 1024 * (tarlong) u;
multi_volume_option = 1;
}
break;
/* Fall through. */
case NEWER_MTIME_OPTION:
- if (newer_mtime_option)
+ if (newer_mtime_option != TYPE_MINIMUM (time_t))
USAGE_ERROR ((0, 0, _("More than one threshold date")));
- newer_mtime_option = get_date (optarg, (voidstar) 0);
+ newer_mtime_option = get_date (optarg, 0);
if (newer_mtime_option == (time_t) -1)
USAGE_ERROR ((0, 0, _("Invalid date format `%s'"), optarg));
break;
case 'X':
- exclude_option = 1;
- add_exclude_file (optarg);
+ if (add_exclude_file (add_filtered_exclude, 0, optarg, '\n') != 0)
+ FATAL_ERROR ((0, errno, "%s", optarg));
break;
case 'z':
break;
case EXCLUDE_OPTION:
- exclude_option = 1;
- add_exclude (optarg);
+ add_filtered_exclude (0, optarg);
break;
case GROUP_OPTION:
&& gname_to_gid (optarg, &group_option)))
{
uintmax_t g;
- if (xstrtoumax (optarg, (char **) 0, 10, &g, "") == LONGINT_OK
+ if (xstrtoumax (optarg, 0, 10, &g, "") == LONGINT_OK
&& g == (gid_t) g)
group_option = g;
else
- ERROR ((TAREXIT_FAILURE, 0, _("Invalid group given on option")));
+ FATAL_ERROR ((0, 0, _("Invalid group given on option")));
}
break;
= mode_compile (optarg,
MODE_MASK_EQUALS | MODE_MASK_PLUS | MODE_MASK_MINUS);
if (mode_option == MODE_INVALID)
- ERROR ((TAREXIT_FAILURE, 0, _("Invalid mode given on option")));
+ FATAL_ERROR ((0, 0, _("Invalid mode given on option")));
if (mode_option == MODE_MEMORY_EXHAUSTED)
- ERROR ((TAREXIT_FAILURE, 0, _("Memory exhausted")));
+ FATAL_ERROR ((0, 0, _("Memory exhausted")));
break;
case NO_RECURSE_OPTION:
&& uname_to_uid (optarg, &owner_option)))
{
uintmax_t u;
- if (xstrtoumax (optarg, (char **) 0, 10, &u, "") == LONGINT_OK
+ if (xstrtoumax (optarg, 0, 10, &u, "") == LONGINT_OK
&& u == (uid_t) u)
owner_option = u;
else
- ERROR ((TAREXIT_FAILURE, 0, _("Invalid owner given on option")));
+ FATAL_ERROR ((0, 0, _("Invalid owner given on option")));
}
break;
case RECORD_SIZE_OPTION:
{
uintmax_t u;
- if (! (xstrtoumax (optarg, (char **) 0, 10, &u, "") == LONG_MAX
+ if (! (xstrtoumax (optarg, 0, 10, &u, "") == LONGINT_OK
&& u == (size_t) u))
USAGE_ERROR ((0, 0, _("Invalid record size")));
record_size = u;
static char buf[sizeof DEVICE_PREFIX + 10];
char *cursor;
- density = getopt_long (argc, argv, "lmh", NULL, NULL);
+ density = getopt_long (argc, argv, "lmh", 0, 0);
strcpy (buf, DEVICE_PREFIX);
cursor = buf + strlen (buf);
if (archive_names == allocated_archive_names)
{
allocated_archive_names *= 2;
- archive_name_array = (const char **)
+ archive_name_array =
xrealloc (archive_name_array,
sizeof (const char *) * allocated_archive_names);
}
#endif /* not DEVICE_PREFIX */
}
+ /* Handle operands after any "--" argument. */
+ for (; optind < argc; optind++)
+ {
+ name_add (argv[optind]);
+ input_files++;
+ }
+
/* Process trivial options. */
if (show_version)
printf ("tar (GNU %s) %s\n", PACKAGE, VERSION);
fputs (_("\
\n\
-Copyright (C) 1988, 92,93,94,95,96,97,98, 1999 Free Software Foundation, Inc.\n"),
+Copyright 1988, 92,93,94,95,96,97,98, 1999 Free Software Foundation, Inc.\n"),
stdout);
fputs (_("\
This is free software; see the source for copying conditions. There is NO\n\
if (archive_format == GNU_FORMAT && getenv ("POSIXLY_CORRECT"))
archive_format = POSIX_FORMAT;
- if ((volume_label_option != NULL
+ if ((volume_label_option
|| incremental_option || multi_volume_option || sparse_option)
&& archive_format != OLDGNU_FORMAT && archive_format != GNU_FORMAT)
USAGE_ERROR ((0, 0,
archive_names = 1;
archive_name_array[0] = getenv ("TAPE");
- if (archive_name_array[0] == NULL)
+ if (! archive_name_array[0])
archive_name_array[0] = DEFAULT_ARCHIVE;
}
USAGE_ERROR ((0, 0,
_("Multiple archive files requires `-M' option")));
+ if (listed_incremental_option
+ && newer_mtime_option != TYPE_MINIMUM (time_t))
+ USAGE_ERROR ((0, 0,
+ _("Cannot combine --listed-incremental with --newer")));
+
/* If ready to unlink hierarchies, so we are for simpler files. */
if (recursive_unlink_option)
unlink_first_option = 1;
/* Pre-allocate a few structures. */
allocated_archive_names = 10;
- archive_name_array = (const char **)
+ archive_name_array =
xmalloc (sizeof (const char *) * allocated_archive_names);
archive_names = 0;
+#ifdef SIGCHLD
+ /* System V fork+wait does not work if SIGCHLD is ignored. */
+ signal (SIGCHLD, SIG_DFL);
+#endif
+
init_names ();
/* Decode options. */
break;
case CREATE_SUBCOMMAND:
- if (totals_option)
- init_total_written ();
-
create_archive ();
name_close ();
free (archive_name_array);
name_term ();
+ if (stdlis == stdout && (ferror (stdout) || fclose (stdout) != 0))
+ FATAL_ERROR ((0, 0, _("Error in writing to standard output")));
if (exit_status == TAREXIT_FAILURE)
error (0, 0, _("Error exit delayed from previous errors"));
exit (exit_status);