X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Ftar.c;h=7605b1f302331bf8372e3df0b9132ab0cce57962;hb=0e3b1c9291a9ed7156e66cae694fdcceacdc4ed3;hp=787d37c2145e13935a73e5514e341b577d52ad8c;hpb=88ea940c0e3db80904f2405b01f1a3d01c522859;p=chaz%2Ftar diff --git a/src/tar.c b/src/tar.c index 787d37c..7605b1f 100644 --- a/src/tar.c +++ b/src/tar.c @@ -1,5 +1,5 @@ /* A tar (tape archiver) program. - Copyright (C) 1988, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc. + Copyright (C) 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 @@ -205,6 +205,8 @@ struct option long_options[] = {"block-number", no_argument, NULL, 'R'}, {"block-size", required_argument, NULL, OBSOLETE_BLOCKING_FACTOR}, {"blocking-factor", required_argument, NULL, 'b'}, + {"bunzip2", no_argument, NULL, 'y'}, + {"bzip2", no_argument, NULL, 'y'}, {"catenate", no_argument, NULL, 'A'}, {"checkpoint", no_argument, &checkpoint_option, 1}, {"compare", no_argument, NULL, 'd'}, @@ -217,6 +219,7 @@ struct option long_options[] = {"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'}, @@ -275,6 +278,7 @@ struct option long_options[] = {"totals", no_argument, &totals_option, 1}, {"touch", no_argument, NULL, 'm'}, {"uncompress", no_argument, NULL, 'Z'}, + {"unbzip2", no_argument, NULL, 'y'}, {"ungzip", no_argument, NULL, 'z'}, {"unlink-first", no_argument, NULL, 'U'}, {"update", no_argument, NULL, 'u'}, @@ -381,6 +385,7 @@ Archive format selection:\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\ + -y, --bzip2, --unbzip2 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"), @@ -397,6 +402,7 @@ Local file selection:\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 @@ -451,13 +457,13 @@ Report bugs to .\n"), | Parse the options for tar. | `----------------------------*/ -/* Available option letters are DEHIJQY and aejnqy. Some are reserved: +/* Available option letters are DHIJQY and aejnqy. Some are reserved: y per-file gzip compression Y per-block gzip compression */ #define OPTION_STRING \ - "-01234567ABC:F:GK:L:MN:OPRST:UV:WX:Zb:cdf:g:hiklmoprstuvwxz" + "-01234567ABC:E:F:GK:L:MN:OPRST:UV:WX:Zb:cdf:g:hiklmoprstuvwxyz" static void set_subcommand_option (enum subcommand subcommand) @@ -535,11 +541,13 @@ decode_options (int argc, char *const *argv) *out++ = xstrdup (buffer); cursor = strchr (OPTION_STRING, *letter); if (cursor && cursor[1] == ':') - if (in < argv + argc) - *out++ = *in++; - else - USAGE_ERROR ((0, 0, _("Old option `%c' requires an argument."), - *letter)); + { + if (in < argv + argc) + *out++ = *in++; + else + USAGE_ERROR ((0, 0, _("Old option `%c' requires an argument."), + *letter)); + } } /* Copy all remaining options. */ @@ -621,6 +629,10 @@ decode_options (int argc, char *const *argv) set_subcommand_option (DIFF_SUBCOMMAND); break; + case 'E': + ending_file_option = optarg; + break; + case 'f': if (archive_names == allocated_archive_names) { @@ -816,6 +828,10 @@ decode_options (int argc, char *const *argv) add_exclude_file (optarg); break; + case 'y': + set_use_compress_program_option ("bzip2"); + break; + case 'z': set_use_compress_program_option ("gzip"); break; @@ -844,7 +860,8 @@ decode_options (int argc, char *const *argv) break; case GROUP_OPTION: - if (!gname_to_gid (optarg, &group_option)) + if (! (strlen (optarg) < GNAME_FIELD_SIZE + && gname_to_gid (optarg, &group_option))) { uintmax_t g; if (!check_decimal (optarg, &g) || g != (gid_t) g) @@ -873,7 +890,8 @@ decode_options (int argc, char *const *argv) break; case OWNER_OPTION: - if (!uname_to_uid (optarg, &owner_option)) + if (! (strlen (optarg) < UNAME_FIELD_SIZE + && uname_to_uid (optarg, &owner_option))) { uintmax_t u; if (!check_decimal (optarg, &u) || u != (uid_t) u) @@ -1013,7 +1031,7 @@ decode_options (int argc, char *const *argv) printf ("tar (GNU %s) %s\n", PACKAGE, VERSION); fputs (_("\ \n\ -Copyright (C) 1988, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc.\n"), +Copyright (C) 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\