You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
#include <system.h>
SHOW_OMITTED_DIRS_OPTION,
STRIP_COMPONENTS_OPTION,
SUFFIX_OPTION,
+ TEST_LABEL_OPTION,
TO_COMMAND_OPTION,
TOTALS_OPTION,
UNQUOTE_OPTION,
N_("process only the NUMBERth occurrence of each file in the archive. This option is valid only in conjunction with one of the subcommands --delete, --diff, --extract or --list and when a list of files is given either on the command line or via -T option. NUMBER defaults to 1."), 21 },
{"seek", 'n', NULL, 0,
N_("archive is seekable"), 21 },
+ {"test-label", TEST_LABEL_OPTION, NULL, 0,
+ N_("List volume label and exit"), 21 },
+
{NULL, 0, NULL, 0,
N_("Overwrite control:"), 30},
" GNU General Public License for more details.\n"
"\n"
" You should have received a copy of the GNU General Public License\n"
- " along with GNU tar; if not, write to the Free Software\n"
- " Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n\n"));
+ " along with GNU tar; if not, write to the Free Software Foundation,\n"
+ " Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA\n\n"));
exit (0);
}
static volatile int _argp_hang;
-static bool
+enum read_file_list_state /* Result of reading file name from the list file */
+ {
+ file_list_success, /* OK, name read successfully */
+ file_list_end, /* End of list file */
+ file_list_zero /* Zero separator encountered where it should not */
+ };
+
+/* Read from FP a sequence of characters up to FILENAME_TERMINATOR and put them
+ into STK.
+ */
+static enum read_file_list_state
read_name_from_file (FILE *fp, struct obstack *stk)
{
int c;
for (c = getc (fp); c != EOF && c != filename_terminator; c = getc (fp))
{
if (c == 0)
- FATAL_ERROR((0, 0, N_("file name contains null character")));
+ {
+ /* We have read a zero separator. The file possibly is zero-separated */
+ /* FATAL_ERROR((0, 0, N_("file name contains null character"))); */
+ return file_list_zero;
+ }
obstack_1grow (stk, c);
counter++;
}
obstack_1grow (stk, 0);
- return !(counter == 0 && c == EOF);
+ return (counter == 0 && c == EOF) ? file_list_end : file_list_success;
}
\f
char **new_argv;
size_t new_argc;
bool is_stdin = false;
+ enum read_file_list_state read_state;
if (!strcmp (filename, "-"))
{
open_fatal (filename);
}
- while (read_name_from_file (fp, &argv_stk))
+ while ((read_state = read_name_from_file (fp, &argv_stk)) == file_list_success)
count++;
+ if (read_state == file_list_zero)
+ {
+ size_t size;
+
+ WARN ((0, 0, N_("%s: file name read contains nul character"),
+ quotearg_colon (filename)));
+
+ /* Prepare new stack contents */
+ size = obstack_object_size (&argv_stk);
+ p = obstack_finish (&argv_stk);
+ for (; size > 0; size--, p++)
+ if (*p)
+ obstack_1grow (&argv_stk, *p);
+ else
+ obstack_1grow (&argv_stk, '\n');
+ obstack_1grow (&argv_stk, 0);
+ count = 1;
+
+ /* Read rest of files using new filename terminator */
+ filename_terminator = 0;
+ while (read_name_from_file (fp, &argv_stk) == file_list_success)
+ count++;
+ }
+
if (!is_stdin)
fclose (fp);
stat_error (arg);
USAGE_ERROR ((0, 0, _("Date sample file not found")));
}
- newer_mtime_option.tv_sec = st.st_mtime;
- newer_mtime_option.tv_nsec = TIMESPEC_NS (st.st_mtim);
+ newer_mtime_option = get_stat_mtime (&st);
}
else
{
if (! get_date (&newer_mtime_option, arg, NULL))
{
WARN ((0, 0, _("Substituting %s for unknown date format %s"),
- tartime (newer_mtime_option.tv_sec), quote (arg)));
+ tartime (newer_mtime_option, false), quote (arg)));
newer_mtime_option.tv_nsec = 0;
}
else
verbose_option++;
break;
+ case TEST_LABEL_OPTION:
+ set_subcommand_option (LIST_SUBCOMMAND);
+ test_label_option = true;
+ break;
+
case 'T':
update_argv (arg, state);
/* Indicate we've been given -T option. This is for backward
if (recursive_unlink_option)
old_files_option = UNLINK_FIRST_OLD_FILES;
- if (utc_option)
+
+ if (test_label_option)
+ {
+ /* --test-label is silent if the user has specified the label name to
+ compare against. */
+ if (args.input_files == 0)
+ verbose_option++;
+ }
+ else if (utc_option)
verbose_option = 2;
/* Forbid using -c with no input files whatsoever. Check that `-f -',
if (verbose_option && args.textual_date_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);
+ char const *treated_as = tartime (newer_mtime_option, true);
if (strcmp (args.textual_date_option, treated_as) != 0)
- WARN ((0, 0,
- ngettext ("Treating date `%s' as %s + %ld nanosecond",
- "Treating date `%s' as %s + %ld nanoseconds",
- newer_mtime_option.tv_nsec),
- args.textual_date_option, treated_as,
- newer_mtime_option.tv_nsec));
+ WARN ((0, 0, _("Treating date `%s' as %s"),
+ args.textual_date_option, treated_as));
}
}