#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
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);
archive_format = DEFAULT_FORMAT;
blocking_factor = DEFAULT_BLOCKING;
record_size = DEFAULT_BLOCKING * BLOCKSIZE;
+ excluded = new_exclude ();
+ newer_mtime_option = TYPE_MINIMUM (time_t);
owner_option = -1;
group_option = -1;
case 'b':
{
- long l;
- if (! (xstrtol (optarg, (char **) 0, 10, &l, "") == LONGINT_OK
- && l == (blocking_factor = l)
+ uintmax_t u;
+ if (! (xstrtoumax (optarg, (char **) 0, 10, &u, "") == LONGINT_OK
+ && u == (blocking_factor = u)
&& 0 < blocking_factor
- && l == (record_size = l * (size_t) BLOCKSIZE) / BLOCKSIZE))
+ && u == (record_size = u * (size_t) BLOCKSIZE) / BLOCKSIZE))
USAGE_ERROR ((0, 0, _("Invalid blocking factor")));
}
break;
case 'L':
{
- unsigned long u;
- if (xstrtoul (optarg, (char **) 0, 10, &u, "") != LONG_MAX)
+ uintmax_t u;
+ if (xstrtoumax (optarg, (char **) 0, 10, &u, "") != LONG_MAX)
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;
break;
case 'X':
- exclude_option = 1;
- add_exclude_file (optarg);
+ if (add_exclude_file (excluded, optarg, '\n') != 0)
+ FATAL_ERROR ((0, errno, "%s", optarg));
break;
case 'z':
break;
case EXCLUDE_OPTION:
- exclude_option = 1;
- add_exclude (optarg);
+ add_exclude (excluded, optarg);
break;
case GROUP_OPTION:
&& 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:
&& 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;
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 ();