X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Ftar.c;h=359d345bbb5889f00bace73f9c5eb5ed66c1a471;hb=ee6aa2bea8b4a011cf071b4264a49f85783de511;hp=a2ee37b179eea3e926ec038e42d9e52017bed048;hpb=f193c4c04a7d038085bbe7717477b143feeab913;p=chaz%2Ftar diff --git a/src/tar.c b/src/tar.c index a2ee37b..359d345 100644 --- a/src/tar.c +++ b/src/tar.c @@ -56,7 +56,7 @@ # define DEFAULT_BLOCKING 20 #endif -static void usage (int) __attribute__ ((noreturn)); +void usage (int) __attribute__ ((noreturn)); /* Miscellaneous. */ @@ -142,9 +142,6 @@ set_archive_format (char const *name) USAGE_ERROR ((0, 0, _("%s: Invalid archive format"), quotearg_colon (name))); - if (archive_format != DEFAULT_FORMAT && archive_format != p->fmt) - USAGE_ERROR ((0, 0, _("Conflicting archive format options"))); - archive_format = p->fmt; } @@ -206,12 +203,14 @@ enum OCCURRENCE_OPTION, OVERWRITE_OPTION, OWNER_OPTION, + PAX_OPTION, POSIX_OPTION, PRESERVE_OPTION, RECORD_SIZE_OPTION, RECURSIVE_UNLINK_OPTION, REMOVE_FILES_OPTION, RSH_COMMAND_OPTION, + SHOW_DEFAULTS_OPTION, SHOW_OMITTED_DIRS_OPTION, STRIP_PATH_OPTION, SUFFIX_OPTION, @@ -296,6 +295,7 @@ static struct option long_options[] = {"one-file-system", no_argument, 0, 'l'}, {"overwrite", no_argument, 0, OVERWRITE_OPTION}, {"owner", required_argument, 0, OWNER_OPTION}, + {"pax-option", required_argument, 0, PAX_OPTION}, {"portability", no_argument, 0, 'o'}, {"posix", no_argument, 0, POSIX_OPTION}, {"preserve", no_argument, 0, PRESERVE_OPTION}, @@ -311,6 +311,7 @@ static struct option long_options[] = {"same-order", no_argument, 0, 's'}, {"same-owner", no_argument, &same_owner_option, 1}, {"same-permissions", no_argument, 0, 'p'}, + {"show-defaults", no_argument, 0, SHOW_DEFAULTS_OPTION}, {"show-omitted-dirs", no_argument, 0, SHOW_OMITTED_DIRS_OPTION}, {"sparse", no_argument, 0, 'S'}, {"starting-file", required_argument, 0, 'K'}, @@ -336,7 +337,7 @@ static struct option long_options[] = }; /* Print a usage message and exit with STATUS. */ -static void +void usage (int status) { if (status != TAREXIT_SUCCESS) @@ -443,11 +444,13 @@ Archive format selection:\n\ FMTNAME is one of the following:\n\ v7 old V7 tar format\n\ oldgnu GNU format as per tar <= 1.12\n\ + gnu GNU tar 1.13 format\n\ ustar POSIX 1003.1-1988 (ustar) format\n\ posix POSIX 1003.1-2001 (pax) format\n\ - gnu GNU format\n\ --old-archive, --portability same as --format=v7\n\ --posix same as --format=posix\n\ + --pax-option keyword[[:]=value][,keyword[[:]=value], ...]\n\ + control pax keywords\n\ -V, --label=NAME create archive with volume name NAME\n\ PATTERN at list/extract time, a globbing PATTERN\n\ -j, --bzip2 filter the archive through bzip2\n\ @@ -577,7 +580,8 @@ decode_options (int argc, char **argv) char const *version_control_string = 0; int exclude_options = EXCLUDE_WILDCARDS; bool o_option = 0; - + int pax_option = 0; + /* Set some default option values. */ subcommand_option = UNKNOWN_SUBCOMMAND; @@ -1073,6 +1077,11 @@ decode_options (int argc, char **argv) } break; + case PAX_OPTION: + pax_option++; + xheader_set_option (optarg); + break; + case POSIX_OPTION: set_archive_format ("posix"); break; @@ -1109,6 +1118,12 @@ decode_options (int argc, char **argv) rsh_command_option = optarg; break; + case SHOW_DEFAULTS_OPTION: + printf ("--format=%s -f%s -b%d\n", + archive_format_string (DEFAULT_ARCHIVE_FORMAT), + DEFAULT_ARCHIVE, DEFAULT_BLOCKING); + exit(0); + case STRIP_PATH_OPTION: { uintmax_t u; @@ -1273,18 +1288,21 @@ see the file named COPYING for details.")); /* Derive option values and check option consistency. */ if (archive_format == DEFAULT_FORMAT) - archive_format = DEFAULT_ARCHIVE_FORMAT; - - if (archive_format == GNU_FORMAT && getenv ("POSIXLY_CORRECT")) - archive_format = POSIX_FORMAT; /*FIXME?*/ - + { + if (pax_option) + archive_format = POSIX_FORMAT; + else + archive_format = DEFAULT_ARCHIVE_FORMAT; + } + if (volume_label_option && subcommand_option == CREATE_SUBCOMMAND) assert_format (FORMAT_MASK (OLDGNU_FORMAT) | FORMAT_MASK (GNU_FORMAT)); - if (incremental_option - || multi_volume_option - || sparse_option) + if (incremental_option || multi_volume_option) + assert_format (FORMAT_MASK (OLDGNU_FORMAT) | FORMAT_MASK (GNU_FORMAT)); + + if (sparse_option) assert_format (FORMAT_MASK (OLDGNU_FORMAT) | FORMAT_MASK (GNU_FORMAT) | FORMAT_MASK (POSIX_FORMAT)); @@ -1293,7 +1311,7 @@ see the file named COPYING for details.")); { if (!input_files && !files_from_option) USAGE_ERROR ((0, 0, - _("--occurrence is meaningless without file list"))); + _("--occurrence is meaningless without a file list"))); if (subcommand_option != DELETE_SUBCOMMAND && subcommand_option != DIFF_SUBCOMMAND && subcommand_option != EXTRACT_SUBCOMMAND @@ -1301,7 +1319,7 @@ see the file named COPYING for details.")); USAGE_ERROR ((0, 0, _("--occurrence cannot be used in the requested operation mode"))); } - + if (archive_names == 0) { /* If no archive file name given, try TAPE from the environment, or @@ -1317,7 +1335,7 @@ see the file named COPYING for details.")); if (archive_names > 1 && !multi_volume_option) USAGE_ERROR ((0, 0, - _("Multiple archive files requires `-M' option"))); + _("Multiple archive files require `-M' option"))); if (listed_incremental_option && newer_mtime_option != TYPE_MINIMUM (time_t)) @@ -1344,6 +1362,33 @@ see the file named COPYING for details.")); (unsigned long) volume_label_max_len)); } + if (verify_option) + { + if (multi_volume_option) + USAGE_ERROR ((0, 0, _("Cannot verify multi-volume archives"))); + if (use_compress_program_option) + USAGE_ERROR ((0, 0, _("Cannot verify compressed archives"))); + } + + if (use_compress_program_option) + { + if (multi_volume_option) + USAGE_ERROR ((0, 0, _("Cannot use multi-volume compressed archives"))); + if (subcommand_option == UPDATE_SUBCOMMAND) + USAGE_ERROR ((0, 0, _("Cannot update compressed archives"))); + } + + /* It is no harm to use --pax-option on non-pax archives in archive + reading mode. It may even be useful, since it allows to override + file attributes from tar headers. Therefore I allow such usage. + --gray */ + if (pax_option + && archive_format != POSIX_FORMAT + && (subcommand_option != EXTRACT_SUBCOMMAND + || subcommand_option != DIFF_SUBCOMMAND + || subcommand_option != LIST_SUBCOMMAND)) + USAGE_ERROR ((0, 0, _("--pax-option can be used only on POSIX archives"))); + /* If ready to unlink hierarchies, so we are for simpler files. */ if (recursive_unlink_option) old_files_option = UNLINK_FIRST_OLD_FILES;