/* A tar (tape archiver) program.
Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000,
- 2001, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+ 2001, 2003, 2004, 2005, 2006, 2007, 2009 Free Software Foundation, Inc.
Written by John Gilmore, starting 1985-08-25.
#include <version-etc.h>
#include <xstrtol.h>
#include <stdopen.h>
+#include <priv-set.h>
/* Local declarations. */
IGNORE_FAILED_READ_OPTION,
INDEX_FILE_OPTION,
KEEP_NEWER_FILES_OPTION,
+ LEVEL_OPTION,
+ LZMA_OPTION,
LZOP_OPTION,
MODE_OPTION,
MTIME_OPTION,
NO_RECURSION_OPTION,
NO_SAME_OWNER_OPTION,
NO_SAME_PERMISSIONS_OPTION,
- NO_TRANSFORM_SYMLINKS_OPTION,
NO_UNQUOTE_OPTION,
NO_WILDCARDS_MATCH_SLASH_OPTION,
NO_WILDCARDS_OPTION,
TOTALS_OPTION,
TO_COMMAND_OPTION,
TRANSFORM_OPTION,
- TRANSFORM_SYMLINKS_OPTION,
UNQUOTE_OPTION,
USAGE_OPTION,
- USE_COMPRESS_PROGRAM_OPTION,
UTC_OPTION,
VERSION_OPTION,
VOLNO_FILE_OPTION,
+ WARNING_OPTION,
WILDCARDS_MATCH_SLASH_OPTION,
WILDCARDS_OPTION
};
/* NOTE:
- Available option letters are DEIQY and eqy. Consider the following
+ Available option letters are DEQY and eqy. Consider the following
assignments:
[For Solaris tar compatibility =/= Is it important at all?]
E use extended headers (--format=posix)
[q alias for --occurrence=1 =/= this would better be used for quiet?]
- [I same as T =/= will harm star compatibility]
y per-file gzip compression
Y per-block gzip compression */
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,
{"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,
{"auto-compress", 'a', 0, 0,
N_("use archive suffix to determine the compression program"), GRID+1 },
{"no-auto-compress", NO_AUTO_COMPRESS_OPTION, 0, 0,
- N_("do not use use archive suffix to determine the compression program"),
+ N_("do not use archive suffix to determine the compression program"),
GRID+1 },
{"bzip2", 'j', 0, 0,
N_("filter the archive through bzip2"), GRID+1 },
{"compress", 'Z', 0, 0,
N_("filter the archive through compress"), GRID+1 },
{"uncompress", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
- {"lzma", 'J', 0, 0,
+ {"lzma", LZMA_OPTION, 0, 0,
N_("filter the archive through lzma"), GRID+1 },
{"lzop", LZOP_OPTION, 0, 0,
N_("filter the archive through lzop"), GRID+8 },
- {"use-compress-program", USE_COMPRESS_PROGRAM_OPTION, N_("PROG"), 0,
+ {"xz", 'J', 0, 0,
+ N_("filter the archive through xz"), GRID+8 },
+ {"use-compress-program", 'I', N_("PROG"), 0,
N_("filter through PROG (must accept -d)"), GRID+1 },
#undef GRID
{"transform", TRANSFORM_OPTION, N_("EXPRESSION"), 0,
N_("use sed replace EXPRESSION to transform file names"), GRID+1 },
{"xform", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
- {"transform-symlinks", TRANSFORM_SYMLINKS_OPTION, NULL, 0,
- N_("apply transformations to symlink targets"), GRID+1 },
- {"no-transform-symlinks", NO_TRANSFORM_SYMLINKS_OPTION, NULL, 0,
- N_("cancel effect of the previous --transform-symlinks option"), GRID+1 },
#undef GRID
#define GRID 120
{"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 },
{
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);
ignore_zeros_option = true;
break;
- case 'I':
- USAGE_ERROR ((0, 0,
- _("Warning: the -I option is not supported;"
- " perhaps you meant -j or -T?")));
- break;
-
case 'j':
set_use_compress_program_option ("bzip2");
break;
case 'J':
- set_use_compress_program_option ("lzma");
+ set_use_compress_program_option ("xz");
break;
case 'k':
case 'K':
starting_file_option = true;
- addname (arg, 0);
+ addname (arg, 0, NULL);
break;
case ONE_FILE_SYSTEM_OPTION:
}
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;
+
case LZOP_OPTION:
set_use_compress_program_option ("lzop");
break;
case 'v':
verbose_option++;
+ warning_option |= WARN_VERBOSE_WARNINGS;
break;
case 'V':
set_transform_expr (arg);
break;
- case TRANSFORM_SYMLINKS_OPTION:
- transform_symlinks_option = true;
- break;
-
- case NO_TRANSFORM_SYMLINKS_OPTION:
- transform_symlinks_option = false;
- break;
-
- case USE_COMPRESS_PROGRAM_OPTION:
+ case 'I':
set_use_compress_program_option (arg);
break;
unquote_option = false;
break;
+ case WARNING_OPTION:
+ set_warning_option (arg);
+ break;
+
case '0':
case '1':
case '2':
group_option = -1;
check_device_option = true;
+
+ incremental_level = -1;
/* Convert old-style tar call by exploding option element and rearranging
options accordingly. */
&& 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)
obstack_init (&argv_stk);
-#ifdef SIGCHLD
+ /* Ensure default behavior for some signals */
+ signal (SIGPIPE, SIG_DFL);
/* System V fork+wait does not work if SIGCHLD is ignored. */
signal (SIGCHLD, SIG_DFL);
-#endif
+ /* Try to disable the ability to unlink a directory. */
+ priv_set_remove_linkdir ();
+
/* Decode options. */
decode_options (argc, argv);