X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Ftar.c;h=04ad22a2cb0a22260d5f388bf876c82c25cfb3ab;hb=be4c265a8d26361c843c46ace0e88c14062a4213;hp=9b73de3cce8c23b9570356fd95a481de9b4fa88d;hpb=6f1783ad432c0d2625d1232463987594414089fe;p=chaz%2Ftar diff --git a/src/tar.c b/src/tar.c index 9b73de3..04ad22a 100644 --- a/src/tar.c +++ b/src/tar.c @@ -20,6 +20,11 @@ #include +#include +#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 @@ -395,7 +400,7 @@ or a device. *This* `tar' defaults to `-f%s -b%d'.\n"), DEFAULT_ARCHIVE, DEFAULT_BLOCKING); fputs (_("\ \n\ -Report bugs to .\n"), +Report bugs to .\n"), stdout); } exit (status); @@ -447,6 +452,8 @@ decode_options (int argc, char *const *argv) 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; @@ -544,11 +551,11 @@ decode_options (int argc, char *const *argv) 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; @@ -647,12 +654,10 @@ decode_options (int argc, char *const *argv) 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; @@ -778,8 +783,8 @@ decode_options (int argc, char *const *argv) 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': @@ -805,8 +810,7 @@ decode_options (int argc, char *const *argv) break; case EXCLUDE_OPTION: - exclude_option = 1; - add_exclude (optarg); + add_exclude (excluded, optarg); break; case GROUP_OPTION: @@ -1116,6 +1120,11 @@ main (int argc, char *const *argv) 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. */ @@ -1145,9 +1154,6 @@ main (int argc, char *const *argv) break; case CREATE_SUBCOMMAND: - if (totals_option) - init_total_written (); - create_archive (); name_close ();