X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Ftar.c;h=8d23a4faa656f270dee2a3b70838003a035e81ad;hb=1bcbbcf1ff2c537ffa970dbf82e3843d4ad110e5;hp=e10b80431c1c60ba5f7fa2ee04b9e0f07310970a;hpb=0d6720288b78115095031cbb39cf32d9db670340;p=chaz%2Ftar diff --git a/src/tar.c b/src/tar.c index e10b804..8d23a4f 100644 --- a/src/tar.c +++ b/src/tar.c @@ -50,6 +50,7 @@ #include #include #include +#include /* Local declarations. */ @@ -271,6 +272,7 @@ enum IGNORE_FAILED_READ_OPTION, INDEX_FILE_OPTION, KEEP_NEWER_FILES_OPTION, + LEVEL_OPTION, LZMA_OPTION, LZOP_OPTION, MODE_OPTION, @@ -327,6 +329,7 @@ enum UTC_OPTION, VERSION_OPTION, VOLNO_FILE_OPTION, + WARNING_OPTION, WILDCARDS_MATCH_SLASH_OPTION, WILDCARDS_OPTION }; @@ -404,6 +407,8 @@ static struct argp_option options[] = { N_("handle old GNU-format incremental backup"), GRID+1 }, {"listed-incremental", 'g', N_("FILE"), 0, N_("handle new GNU-format incremental backup"), GRID+1 }, + {"level", LEVEL_OPTION, N_("NUMBER"), 0, + N_("dump level for created listed-incremental archive"), GRID+1 }, {"ignore-failed-read", IGNORE_FAILED_READ_OPTION, 0, 0, N_("do not exit with nonzero on unreadable files"), GRID+1 }, {"occurrence", OCCURRENCE_OPTION, N_("NUMBER"), OPTION_ARG_OPTIONAL, @@ -481,9 +486,9 @@ static struct argp_option options[] = { {"touch", 'm', 0, 0, N_("don't extract file modified time"), GRID+1 }, {"same-owner", SAME_OWNER_OPTION, 0, 0, - N_("try extracting files with the same ownership"), GRID+1 }, + N_("try extracting files with the same ownership as exists in the archive (default for superuser)"), GRID+1 }, {"no-same-owner", NO_SAME_OWNER_OPTION, 0, 0, - N_("extract files as yourself"), GRID+1 }, + N_("extract files as yourself (default for ordinary users)"), GRID+1 }, {"numeric-owner", NUMERIC_OWNER_OPTION, 0, 0, N_("always use numbers for user/group names"), GRID+1 }, {"preserve-permissions", 'p', 0, 0, @@ -718,6 +723,8 @@ static struct argp_option options[] = { {"verbose", 'v', 0, 0, N_("verbosely list files processed"), GRID+1 }, + {"warning", WARNING_OPTION, N_("KEYWORD"), 0, + N_("warning control"), GRID+1 }, {"checkpoint", CHECKPOINT_OPTION, N_("NUMBER"), OPTION_ARG_OPTIONAL, N_("display progress messages every NUMBERth record (default 10)"), GRID+1 }, @@ -1182,8 +1189,9 @@ update_argv (const char *filename, struct argp_state *state) { size_t size; - WARN ((0, 0, N_("%s: file name read contains nul character"), - quotearg_colon (filename))); + WARNOPT (WARN_FILENAME_WITH_NULS, + (0, 0, N_("%s: file name read contains nul character"), + quotearg_colon (filename))); /* Prepare new stack contents */ size = obstack_object_size (&argv_stk); @@ -1380,7 +1388,7 @@ parse_opt (int key, char *arg, struct argp_state *state) case 'K': starting_file_option = true; - addname (arg, 0); + addname (arg, 0, NULL); break; case ONE_FILE_SYSTEM_OPTION: @@ -1404,6 +1412,15 @@ parse_opt (int key, char *arg, struct argp_state *state) } break; + case LEVEL_OPTION: + { + char *p; + incremental_level = strtoul (arg, &p, 10); + if (*p) + USAGE_ERROR ((0, 0, _("Invalid incremental level value"))); + } + break; + case LZMA_OPTION: set_use_compress_program_option ("lzma"); break; @@ -1533,6 +1550,7 @@ parse_opt (int key, char *arg, struct argp_state *state) case 'v': verbose_option++; + warning_option |= WARN_VERBOSE_WARNINGS; break; case 'V': @@ -1948,6 +1966,10 @@ parse_opt (int key, char *arg, struct argp_state *state) unquote_option = false; break; + case WARNING_OPTION: + set_warning_option (arg); + break; + case '0': case '1': case '2': @@ -2108,6 +2130,8 @@ decode_options (int argc, char **argv) group_option = -1; check_device_option = true; + + incremental_level = -1; /* Convert old-style tar call by exploding option element and rearranging options accordingly. */ @@ -2273,7 +2297,10 @@ decode_options (int argc, char **argv) && NEWER_OPTION_INITIALIZED (newer_mtime_option)) USAGE_ERROR ((0, 0, _("Cannot combine --listed-incremental with --newer"))); - + if (incremental_level != -1 && !listed_incremental_option) + WARN ((0, 0, + _("--level is meaningless without --listed-incremental"))); + if (volume_label_option) { if (archive_format == GNU_FORMAT || archive_format == OLDGNU_FORMAT) @@ -2459,6 +2486,9 @@ main (int argc, char **argv) /* System V fork+wait does not work if SIGCHLD is ignored. */ signal (SIGCHLD, SIG_DFL); + /* Try to disable the ability to unlink a directory. */ + priv_set_remove_linkdir (); + /* Decode options. */ decode_options (argc, argv);