X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Ftar.c;h=979bf59de73428240b53b571197bb64c7756db45;hb=f5048215892c1bf6cf602c41146c556f60a63a51;hp=9d20fa0fa142bb40e66cde768dd8afcb38aadde4;hpb=0ea6e68655350556ab5c7b69ef41f6bac95683f8;p=chaz%2Ftar diff --git a/src/tar.c b/src/tar.c index 9d20fa0..979bf59 100644 --- a/src/tar.c +++ b/src/tar.c @@ -286,6 +286,7 @@ enum IGNORE_COMMAND_ERROR_OPTION, IGNORE_FAILED_READ_OPTION, INDEX_FILE_OPTION, + KEEP_DIRECTORY_SYMLINK_OPTION, KEEP_NEWER_FILES_OPTION, LEVEL_OPTION, LZIP_OPTION, @@ -337,6 +338,7 @@ enum SELINUX_CONTEXT_OPTION, SHOW_DEFAULTS_OPTION, SHOW_OMITTED_DIRS_OPTION, + SHOW_SNAPSHOT_FIELD_RANGES_OPTION, SHOW_TRANSFORMED_NAMES_OPTION, SKIP_OLD_FILES_OPTION, SPARSE_VERSION_OPTION, @@ -484,6 +486,9 @@ static struct argp_option options[] = { {"overwrite-dir", OVERWRITE_DIR_OPTION, 0, 0, N_("overwrite metadata of existing directories when extracting (default)"), GRID+1 }, + {"keep-directory-symlink", KEEP_DIRECTORY_SYMLINK_OPTION, 0, 0, + N_("preserve existing symlinks to directories when extracting"), + GRID+1 }, #undef GRID #define GRID 40 @@ -532,7 +537,8 @@ static struct argp_option options[] = { {"no-same-permissions", NO_SAME_PERMISSIONS_OPTION, 0, 0, N_("apply the user's umask when extracting permissions from the archive (default for ordinary users)"), GRID+1 }, {"preserve-order", 's', 0, 0, - N_("sort names to extract to match archive"), GRID+1 }, + N_("member arguments are listed in the same order as the " + "files in the archive"), GRID+1 }, {"same-order", 0, 0, OPTION_ALIAS, NULL, GRID+1 }, {"preserve", PRESERVE_OPTION, 0, 0, N_("same as both -p and -s"), GRID+1 }, @@ -726,7 +732,7 @@ static struct argp_option options[] = { {"hard-dereference", HARD_DEREFERENCE_OPTION, 0, 0, N_("follow hard links; archive and dump the files they refer to"), GRID+1 }, {"starting-file", 'K', N_("MEMBER-NAME"), 0, - N_("begin at member MEMBER-NAME in the archive"), GRID+1 }, + N_("begin at member MEMBER-NAME when reading the archive"), GRID+1 }, {"newer", 'N', N_("DATE-OR-FILE"), 0, N_("only store files newer than DATE-OR-FILE"), GRID+1 }, {"after-date", 0, 0, OPTION_ALIAS, NULL, GRID+1 }, @@ -805,6 +811,8 @@ static struct argp_option options[] = { {"confirmation", 0, 0, OPTION_ALIAS, NULL, GRID+1 }, {"show-defaults", SHOW_DEFAULTS_OPTION, 0, 0, N_("show tar defaults"), GRID+1 }, + {"show-snapshot-field-ranges", SHOW_SNAPSHOT_FIELD_RANGES_OPTION, 0, 0, + N_("show valid ranges for snapshot-file fields"), GRID+1 }, {"show-omitted-dirs", SHOW_OMITTED_DIRS_OPTION, 0, 0, N_("when listing or extracting, list each directory that does not match search criteria"), GRID+1 }, {"show-transformed-names", SHOW_TRANSFORMED_NAMES_OPTION, 0, 0, @@ -967,7 +975,7 @@ set_subcommand_option (enum subcommand subcommand) if (subcommand_option != UNKNOWN_SUBCOMMAND && subcommand_option != subcommand) USAGE_ERROR ((0, 0, - _("You may not specify more than one '-Acdtrux' or '--test-label' option"))); + _("You may not specify more than one '-Acdtrux', '--delete' or '--test-label' option"))); subcommand_option = subcommand; } @@ -982,7 +990,7 @@ set_use_compress_program_option (const char *string) use_compress_program_option = string; } -static RETSIGTYPE +static void sigstat (int signo) { compute_duration (); @@ -1159,6 +1167,9 @@ tar_help_filter (int key, const char *text, void *input) s = xasprintf (_("filter the archive through %s"), LZMA_PROGRAM); break; + case LZOP_OPTION: + s = xasprintf (_("filter the archive through %s"), LZOP_PROGRAM); + case 'J': s = xasprintf (_("filter the archive through %s"), XZ_PROGRAM); break; @@ -1764,6 +1775,10 @@ parse_opt (int key, char *arg, struct argp_state *state) ignore_failed_read_option = true; break; + case KEEP_DIRECTORY_SYMLINK_OPTION: + keep_directory_symlink_option = true; + break; + case KEEP_NEWER_FILES_OPTION: old_files_option = KEEP_NEWER_FILES; break; @@ -1949,6 +1964,11 @@ parse_opt (int key, char *arg, struct argp_state *state) exit (0); } + case SHOW_SNAPSHOT_FIELD_RANGES_OPTION: + show_snapshot_field_ranges (); + close_stdout (); + exit (0); + case STRIP_COMPONENTS_OPTION: { uintmax_t u; @@ -2203,7 +2223,7 @@ static int subcommand_class[] = { /* Return t if the subcommand_option is in class(es) f */ #define IS_SUBCOMMAND_CLASS(f) (subcommand_class[subcommand_option] & (f)) - + static struct tar_args args; static void @@ -2470,6 +2490,13 @@ decode_options (int argc, char **argv) && !IS_SUBCOMMAND_CLASS (SUBCL_READ)) USAGE_ERROR ((0, 0, _("--xattrs can be used only on POSIX archives"))); + if ((starting_file_option || same_order_option) + && !IS_SUBCOMMAND_CLASS (SUBCL_READ)) + USAGE_ERROR ((0, 0, + _("--%s option cannot be used with %s"), + starting_file_option ? "starting-file" : "same-order", + subcommand_string (subcommand_option))); + /* If ready to unlink hierarchies, so we are for simpler files. */ if (recursive_unlink_option) old_files_option = UNLINK_FIRST_OLD_FILES; @@ -2599,6 +2626,8 @@ main (int argc, char **argv) exit_failure = TAREXIT_FAILURE; exit_status = TAREXIT_SUCCESS; + error_hook = checkpoint_flush_actions; + filename_terminator = '\n'; set_quoting_style (0, DEFAULT_QUOTING_STYLE); @@ -2672,6 +2701,8 @@ main (int argc, char **argv) test_archive_label (); } + checkpoint_finish (); + if (totals_option) print_total_stats ();