X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Ftar.c;h=716c361290b37fb112580a99908c061cda54e3a3;hb=3030a247b1e0d4ab25261107bed5ff4afb644b84;hp=5b960ac54d8a5893ea4cb9d56dbc49d50b2c3395;hpb=b58452bdbd7433cbbc5e5c0887ce846a2fa92f05;p=chaz%2Ftar diff --git a/src/tar.c b/src/tar.c index 5b960ac..716c361 100644 --- a/src/tar.c +++ b/src/tar.c @@ -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; } @@ -194,6 +191,7 @@ enum IGNORE_CASE_OPTION, IGNORE_FAILED_READ_OPTION, INDEX_FILE_OPTION, + KEEP_NEWER_FILES_OPTION, MODE_OPTION, NEWER_MTIME_OPTION, NO_ANCHORED_OPTION, @@ -213,11 +211,13 @@ enum RECURSIVE_UNLINK_OPTION, REMOVE_FILES_OPTION, RSH_COMMAND_OPTION, + SHOW_DEFAULTS_OPTION, SHOW_OMITTED_DIRS_OPTION, STRIP_PATH_OPTION, SUFFIX_OPTION, TOTALS_OPTION, USE_COMPRESS_PROGRAM_OPTION, + UTC_OPTION, VOLNO_FILE_OPTION, WILDCARDS_OPTION, WILDCARDS_MATCH_SLASH_OPTION @@ -273,6 +273,7 @@ static struct option long_options[] = {"index-file", required_argument, 0, INDEX_FILE_OPTION}, {"info-script", required_argument, 0, 'F'}, {"interactive", no_argument, 0, 'w'}, + {"keep-newer-files", no_argument, 0, KEEP_NEWER_FILES_OPTION}, {"keep-old-files", no_argument, 0, 'k'}, {"label", required_argument, 0, 'V'}, {"list", no_argument, 0, 't'}, @@ -313,6 +314,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'}, @@ -326,6 +328,7 @@ static struct option long_options[] = {"ungzip", no_argument, 0, 'z'}, {"unlink-first", no_argument, 0, 'U'}, {"update", no_argument, 0, 'u'}, + {"utc", no_argument, 0, UTC_OPTION }, {"use-compress-program", required_argument, 0, USE_COMPRESS_PROGRAM_OPTION}, {"verbose", no_argument, 0, 'v'}, {"verify", no_argument, 0, 'W'}, @@ -381,6 +384,8 @@ Operation modifiers:\n\ -W, --verify attempt to verify the archive after writing it\n\ --remove-files remove files after adding them to the archive\n\ -k, --keep-old-files don't replace existing files when extracting\n\ + --keep-newer-files don't replace existing files that are newer\n\ + than their archive copies\n\ --overwrite overwrite existing files when extracting\n\ --no-overwrite-dir preserve metadata of existing directories\n\ -U, --unlink-first remove each file prior to extracting over it\n\ @@ -504,6 +509,7 @@ Informative output:\n\ --check-links print a message if not all links are dumped\n\ --totals print total bytes written while creating archive\n\ --index-file=FILE send verbose output to FILE\n\ + --utc print file modification dates in UTC\n\ -R, --block-number show block number within archive with each message\n\ -w, --interactive ask for confirmation for every action\n\ --confirmation same as -w\n"), @@ -581,7 +587,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; @@ -903,6 +910,10 @@ decode_options (int argc, char **argv) old_files_option = UNLINK_FIRST_OLD_FILES; break; + case UTC_OPTION: + utc_option = true; + break; + case 'v': verbose_option++; break; @@ -993,6 +1004,10 @@ decode_options (int argc, char **argv) ignore_failed_read_option = true; break; + case KEEP_NEWER_FILES_OPTION: + old_files_option = KEEP_NEWER_FILES; + break; + case GROUP_OPTION: if (! (strlen (optarg) < GNAME_FIELD_SIZE && gname_to_gid (optarg, &group_option))) @@ -1078,6 +1093,7 @@ decode_options (int argc, char **argv) break; case PAX_OPTION: + pax_option++; xheader_set_option (optarg); break; @@ -1117,6 +1133,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; @@ -1281,16 +1303,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 (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) assert_format (FORMAT_MASK (OLDGNU_FORMAT) | FORMAT_MASK (GNU_FORMAT)); - if (sparse_option) assert_format (FORMAT_MASK (OLDGNU_FORMAT) | FORMAT_MASK (GNU_FORMAT) @@ -1366,6 +1393,17 @@ see the file named COPYING for details.")); 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)