enum archive_format fmt;
} const fmttab[] = {
{ "v7", V7_FORMAT },
- { "oldgnu", OLDGNU_FORMAT },
+ { "oldgnu", OLDGNU_FORMAT },
+ { "ustar", USTAR_FORMAT },
{ "posix", POSIX_FORMAT },
#if 0 /* not fully supported yet */
{ "star", STAR_FORMAT },
CHECKPOINT_OPTION,
DELETE_OPTION,
EXCLUDE_OPTION,
- FIRST_COPY_OPTION,
FORCE_LOCAL_OPTION,
FORMAT_OPTION,
GROUP_OPTION,
NO_WILDCARDS_MATCH_SLASH_OPTION,
NULL_OPTION,
NUMERIC_OWNER_OPTION,
+ OCCURRENCE_OPTION,
OVERWRITE_OPTION,
OWNER_OPTION,
POSIX_OPTION,
USE_COMPRESS_PROGRAM_OPTION,
VOLNO_FILE_OPTION,
WILDCARDS_OPTION,
- WILDCARDS_MATCH_SLASH_OPTION,
+ WILDCARDS_MATCH_SLASH_OPTION
};
/* If nonzero, display usage information and exit. */
/* If nonzero, print the version on standard output and exit. */
static int show_version;
-/* If nonzero, stop processing when all the files from the namelist
- where handled */
-static int first_copy_option;
-
static struct option long_options[] =
{
{"absolute-names", no_argument, 0, 'P'},
{"extract", no_argument, 0, 'x'},
{"file", required_argument, 0, 'f'},
{"files-from", required_argument, 0, 'T'},
- {"first-copy", no_argument, &first_copy_option, 1},
{"force-local", no_argument, 0, FORCE_LOCAL_OPTION},
{"format", required_argument, 0, FORMAT_OPTION},
{"get", no_argument, 0, 'x'},
{"no-same-owner", no_argument, &same_owner_option, -1},
{"no-same-permissions", no_argument, &same_permissions_option, -1},
{"numeric-owner", no_argument, 0, NUMERIC_OWNER_OPTION},
+ {"occurrence", optional_argument, 0, OCCURRENCE_OPTION},
{"old-archive", no_argument, 0, 'o'},
{"one-file-system", no_argument, 0, 'l'},
{"overwrite", no_argument, 0, OVERWRITE_OPTION},
-g, --listed-incremental=FILE\n\
handle new GNU-format incremental backup\n\
--ignore-failed-read do not exit with nonzero on unreadable files\n\
- --first-copy process only the first copy of each file in the\
- archive\n"),
+ --occurrence[=NUM] process only the NUMth occurrence of each file in\n\
+ the archive. This option is valid only in\n\
+ conjunction with one of the subcommands --delete,\n\
+ --diff, --extract or --list and when a list of\n\
+ files is given either on the command line or\n\
+ via -T option.\n\
+ NUM defaults to 1.\n"),
stdout);
fputs (_("\
\n\
FMTNAME is one of the following:\n\
v7 old V7 tar format\n\
oldgnu GNU format as per tar <= 1.12\n\
- posix POSIX 1003.1-2001 tar 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\
stdout);
#if !MSDOS
fputs (_("\
- -N, --newer=DATE only store files newer than DATE\n\
+ -N, --newer=DATE-OR-FILE only store files newer than DATE-OR-FILE\n\
--newer-mtime=DATE compare date and time when data changed only\n\
--after-date=DATE same as -N\n"),
stdout);
numeric_owner_option = true;
break;
+ case OCCURRENCE_OPTION:
+ if (!optarg)
+ occurrence_option = 1;
+ else
+ {
+ uintmax_t u;
+ if (xstrtoumax (optarg, 0, 10, &u, "") == LONGINT_OK)
+ occurrence_option = u;
+ else
+ FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (optarg),
+ _("Invalid number")));
+ }
+ break;
+
case OVERWRITE_OPTION:
old_files_option = OVERWRITE_OLD_FILES;
break;
archive_format = DEFAULT_ARCHIVE_FORMAT;
if (archive_format == GNU_FORMAT && getenv ("POSIXLY_CORRECT"))
- archive_format = POSIX_FORMAT;
-
- if (((volume_label_option && subcommand_option == CREATE_SUBCOMMAND)
- || incremental_option || multi_volume_option || sparse_option)
- && archive_format != OLDGNU_FORMAT && archive_format != GNU_FORMAT)
- USAGE_ERROR ((0, 0,
- _("GNU features wanted on incompatible archive format")));
+ archive_format = POSIX_FORMAT; /*FIXME?*/
if (volume_label_option && subcommand_option == CREATE_SUBCOMMAND)
assert_format (FORMAT_MASK (OLDGNU_FORMAT)
|| multi_volume_option
|| sparse_option)
assert_format (FORMAT_MASK (OLDGNU_FORMAT)
- | FORMAT_MASK (GNU_FORMAT));
+ | FORMAT_MASK (GNU_FORMAT)
+ | FORMAT_MASK (POSIX_FORMAT));
- if (first_copy_option)
+ if (occurrence_option)
{
if (!input_files && !files_from_option)
USAGE_ERROR ((0, 0,
- _("--first-copy is meaningless without file list")));
+ _("--occurrence is meaningless without file list")));
if (subcommand_option != DELETE_SUBCOMMAND
&& subcommand_option != DIFF_SUBCOMMAND
&& subcommand_option != EXTRACT_SUBCOMMAND
&& subcommand_option != LIST_SUBCOMMAND)
USAGE_ERROR ((0, 0,
- _("--first-copy cannot be used in the requested operation mode")));
+ _("--occurrence cannot be used in the requested operation mode")));
}
if (archive_names == 0)
}
}
-bool
-all_names_found ()
-{
- return first_copy_option && names_done ();
-}
-
\f
/* Tar proper. */
error (0, 0, _("Error exit delayed from previous errors"));
if (ferror (stderr) || fclose (stderr) != 0)
exit_status = TAREXIT_FAILURE;
- exit (exit_status);
+ return exit_status;
}
void
-destroy_stat (struct tar_stat_info *st)
+tar_stat_init (struct tar_stat_info *st)
+{
+ memset (st, 0, sizeof (*st));
+}
+
+void
+tar_stat_destroy (struct tar_stat_info *st)
{
free (st->orig_file_name);
free (st->file_name);
free (st->link_name);
free (st->uname);
free (st->gname);
+ free (st->sparse_map);
memset (st, 0, sizeof (*st));
}