/* A tar (tape archiver) program.
Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000,
- 2001, 2003 Free Software Foundation, Inc.
+ 2001, 2003, 2004 Free Software Foundation, Inc.
Written by John Gilmore, starting 1985-08-25.
# define DEFAULT_BLOCKING 20
#endif
-void usage (int) __attribute__ ((noreturn));
\f
/* Miscellaneous. */
IGNORE_CASE_OPTION,
IGNORE_FAILED_READ_OPTION,
INDEX_FILE_OPTION,
+ KEEP_NEWER_FILES_OPTION,
MODE_OPTION,
NEWER_MTIME_OPTION,
NO_ANCHORED_OPTION,
SUFFIX_OPTION,
TOTALS_OPTION,
USE_COMPRESS_PROGRAM_OPTION,
+ UTC_OPTION,
VOLNO_FILE_OPTION,
WILDCARDS_OPTION,
WILDCARDS_MATCH_SLASH_OPTION
{"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'},
{"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'},
{"volno-file", required_argument, 0, VOLNO_FILE_OPTION},
{"wildcards", no_argument, 0, WILDCARDS_OPTION},
{"wildcards-match-slash", no_argument, 0, WILDCARDS_MATCH_SLASH_OPTION},
-
+
{0, 0, 0, 0}
};
-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\
--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"),
-o when creating, same as --old-archive\n\
when extracting, same as --no-same-owner\n"),
stdout);
-
+
fputs (_("\
\n\
The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
blocking_factor = DEFAULT_BLOCKING;
record_size = DEFAULT_BLOCKING * BLOCKSIZE;
excluded = new_exclude ();
- newer_mtime_option = TYPE_MINIMUM (time_t);
+ newer_mtime_option.tv_sec = TYPE_MINIMUM (time_t);
+ newer_mtime_option.tv_nsec = -1;
recursion_option = FNM_LEADING_DIR;
owner_option = -1;
/* Fall through. */
case NEWER_MTIME_OPTION:
- if (newer_mtime_option != TYPE_MINIMUM (time_t))
+ if (NEWER_OPTION_INITIALIZED (newer_mtime_option))
USAGE_ERROR ((0, 0, _("More than one threshold date")));
if (FILESYSTEM_PREFIX_LEN (optarg) != 0
stat_error (optarg);
USAGE_ERROR ((0, 0, _("Date file not found")));
}
- newer_mtime_option = st.st_mtime;
+ newer_mtime_option.tv_sec = st.st_mtime;
+ newer_mtime_option.tv_nsec = TIMESPEC_NS (st.st_mtim);
}
else
{
- newer_mtime_option = get_date (optarg, 0);
- if (newer_mtime_option == (time_t) -1)
- WARN ((0, 0, _("Substituting %s for unknown date format %s"),
- tartime (newer_mtime_option), quote (optarg)));
+ if (! get_date (&newer_mtime_option, optarg, NULL))
+ {
+ WARN ((0, 0, _("Substituting %s for unknown date format %s"),
+ tartime (newer_mtime_option.tv_sec), quote (optarg)));
+ newer_mtime_option.tv_nsec = 0;
+ }
else
textual_date_option = optarg;
}
old_files_option = UNLINK_FIRST_OLD_FILES;
break;
+ case UTC_OPTION:
+ utc_option = true;
+ break;
+
case 'v':
verbose_option++;
break;
case FORMAT_OPTION:
set_archive_format (optarg);
break;
-
+
case INDEX_FILE_OPTION:
index_file_name = optarg;
break;
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)))
_("Invalid number")));
}
break;
-
+
case OVERWRITE_OPTION:
old_files_option = OVERWRITE_OLD_FILES;
break;
pax_option++;
xheader_set_option (optarg);
break;
-
+
case POSIX_OPTION:
set_archive_format ("posix");
break;
strip_path_elements = u;
}
break;
-
+
case SUFFIX_OPTION:
backup_option = true;
backup_suffix_string = optarg;
case TOTALS_OPTION:
totals_option = true;
break;
-
+
case USE_COMPRESS_PROGRAM_OPTION:
set_use_compress_program_option (optarg);
break;
if (show_version)
{
printf ("tar (%s) %s\n%s\n", PACKAGE_NAME, PACKAGE_VERSION,
- "Copyright (C) 2003 Free Software Foundation, Inc.");
+ "Copyright (C) 2004 Free Software Foundation, Inc.");
puts (_("\
This program comes with NO WARRANTY, to the extent permitted by law.\n\
You may redistribute it under the terms of the GNU General Public License;\n\
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)
| FORMAT_MASK (POSIX_FORMAT));
-
+
if (occurrence_option)
{
if (!input_files && !files_from_option)
_("Multiple archive files require `-M' option")));
if (listed_incremental_option
- && newer_mtime_option != TYPE_MINIMUM (time_t))
+ && NEWER_OPTION_INITIALIZED (newer_mtime_option))
USAGE_ERROR ((0, 0,
_("Cannot combine --listed-incremental with --newer")));
|| 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)
old_files_option = UNLINK_FIRST_OLD_FILES;
if (verbose_option && textual_date_option)
{
- char const *treated_as = tartime (newer_mtime_option);
+ /* FIXME: tartime should support nanoseconds, too, so that this
+ comparison doesn't complain about lost nanoseconds. */
+ char const *treated_as = tartime (newer_mtime_option.tv_sec);
if (strcmp (textual_date_option, treated_as) != 0)
- WARN ((0, 0, _("Treating date `%s' as %s"),
- textual_date_option, treated_as));
+ WARN ((0, 0, _("Treating date `%s' as %s + %ld nanoseconds"),
+ textual_date_option, treated_as, newer_mtime_option.tv_nsec));
}
}
/* Decode options. */
decode_options (argc, argv);
- name_init (argc, argv);
+ name_init ();
/* Main command execution. */
{
memset (st, 0, sizeof (*st));
}
-
+
void
tar_stat_destroy (struct tar_stat_info *st)
{
free (st->sparse_map);
memset (st, 0, sizeof (*st));
}
-