1 /* A tar (tape archiver) program.
3 Copyright 1988, 1992-1997, 1999-2001, 2003-2007, 2012-2014 Free
4 Software Foundation, Inc.
6 Written by John Gilmore, starting 1985-08-25.
8 This program is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by the
10 Free Software Foundation; either version 3, or (at your option) any later
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
16 Public License for more details.
18 You should have received a copy of the GNU General Public License along
19 with this program. If not, see <http://www.gnu.org/licenses/>. */
25 #include <argp-namefrob.h>
26 #include <argp-fmtstream.h>
27 #include <argp-version-etc.h>
30 #if ! defined SIGCHLD && defined SIGCLD
31 # define SIGCHLD SIGCLD
34 /* The following causes "common.h" to produce definitions of all the global
35 variables, rather than just "extern" declarations of them. GNU tar does
36 depend on the system loader to preset all GLOBAL variables to neutral (or
37 zero) values; explicit initialization is usually not done. */
43 #include <configmake.h>
45 #include <parse-datetime.h>
47 #include <rmt-command.h>
50 #include <version-etc.h>
56 /* Local declarations. */
58 #ifndef DEFAULT_ARCHIVE_FORMAT
59 # define DEFAULT_ARCHIVE_FORMAT GNU_FORMAT
62 #ifndef DEFAULT_ARCHIVE
63 # define DEFAULT_ARCHIVE "tar.out"
66 #ifndef DEFAULT_BLOCKING
67 # define DEFAULT_BLOCKING 20
70 /* Print a message if not all links are dumped */
71 static int check_links_option;
73 /* Number of allocated tape drive names. */
74 static size_t allocated_archive_names;
79 /* Name of option using stdin. */
80 static const char *stdin_used_by;
82 /* Doesn't return if stdin already requested. */
84 request_stdin (const char *option)
87 USAGE_ERROR ((0, 0, _("Options '%s' and '%s' both want standard input"),
88 stdin_used_by, option));
90 stdin_used_by = option;
93 extern int rpmatch (char const *response);
95 /* Returns true if and only if the user typed an affirmative response. */
97 confirm (const char *message_action, const char *message_name)
99 static FILE *confirm_file;
100 static int confirm_file_EOF;
105 if (archive == 0 || stdin_used_by)
107 confirm_file = fopen (TTY_NAME, "r");
109 open_fatal (TTY_NAME);
113 request_stdin ("-w");
114 confirm_file = stdin;
118 fprintf (stdlis, "%s %s?", message_action, quote (message_name));
121 if (!confirm_file_EOF)
123 char *response = NULL;
124 size_t response_size = 0;
125 if (getline (&response, &response_size, confirm_file) < 0)
126 confirm_file_EOF = 1;
128 status = rpmatch (response) > 0;
132 if (confirm_file_EOF)
134 fputc ('\n', stdlis);
141 static struct fmttab {
143 enum archive_format fmt;
146 { "oldgnu", OLDGNU_FORMAT },
147 { "ustar", USTAR_FORMAT },
148 { "posix", POSIX_FORMAT },
149 #if 0 /* not fully supported yet */
150 { "star", STAR_FORMAT },
152 { "gnu", GNU_FORMAT },
153 { "pax", POSIX_FORMAT }, /* An alias for posix */
158 set_archive_format (char const *name)
160 struct fmttab const *p;
162 for (p = fmttab; strcmp (p->name, name) != 0; )
164 USAGE_ERROR ((0, 0, _("%s: Invalid archive format"),
165 quotearg_colon (name)));
167 archive_format = p->fmt;
171 set_xattr_option (int value)
174 set_archive_format ("posix");
175 xattrs_option = value;
179 archive_format_string (enum archive_format fmt)
181 struct fmttab const *p;
183 for (p = fmttab; p->name; p++)
189 #define FORMAT_MASK(n) (1<<(n))
192 assert_format(unsigned fmt_mask)
194 if ((FORMAT_MASK (archive_format) & fmt_mask) == 0)
196 _("GNU features wanted on incompatible archive format")));
200 subcommand_string (enum subcommand c)
204 case UNKNOWN_SUBCOMMAND:
207 case APPEND_SUBCOMMAND:
213 case CREATE_SUBCOMMAND:
216 case DELETE_SUBCOMMAND:
219 case DIFF_SUBCOMMAND:
222 case EXTRACT_SUBCOMMAND:
225 case LIST_SUBCOMMAND:
228 case UPDATE_SUBCOMMAND:
231 case TEST_LABEL_SUBCOMMAND:
232 return "--test-label";
238 tar_list_quoting_styles (struct obstack *stk, char const *prefix)
241 size_t prefixlen = strlen (prefix);
243 for (i = 0; quoting_style_args[i]; i++)
245 obstack_grow (stk, prefix, prefixlen);
246 obstack_grow (stk, quoting_style_args[i],
247 strlen (quoting_style_args[i]));
248 obstack_1grow (stk, '\n');
253 tar_set_quoting_style (char *arg)
257 for (i = 0; quoting_style_args[i]; i++)
258 if (strcmp (arg, quoting_style_args[i]) == 0)
260 set_quoting_style (NULL, i);
264 _("Unknown quoting style '%s'. Try '%s --quoting-style=help' to get a list."), arg, program_invocation_short_name));
272 ACLS_OPTION = CHAR_MAX + 1,
274 ATIME_PRESERVE_OPTION,
278 CHECKPOINT_ACTION_OPTION,
279 DELAY_DIRECTORY_RESTORE_OPTION,
280 HARD_DEREFERENCE_OPTION,
282 EXCLUDE_BACKUPS_OPTION,
283 EXCLUDE_CACHES_OPTION,
284 EXCLUDE_CACHES_UNDER_OPTION,
285 EXCLUDE_CACHES_ALL_OPTION,
287 EXCLUDE_IGNORE_OPTION,
288 EXCLUDE_IGNORE_RECURSIVE_OPTION,
290 EXCLUDE_TAG_UNDER_OPTION,
291 EXCLUDE_TAG_ALL_OPTION,
293 EXCLUDE_VCS_IGNORES_OPTION,
298 IGNORE_COMMAND_ERROR_OPTION,
299 IGNORE_FAILED_READ_OPTION,
301 KEEP_DIRECTORY_SYMLINK_OPTION,
302 KEEP_NEWER_FILES_OPTION,
312 NO_AUTO_COMPRESS_OPTION,
313 NO_CHECK_DEVICE_OPTION,
314 NO_DELAY_DIRECTORY_RESTORE_OPTION,
315 NO_IGNORE_CASE_OPTION,
316 NO_IGNORE_COMMAND_ERROR_OPTION,
318 NO_OVERWRITE_DIR_OPTION,
319 NO_QUOTE_CHARS_OPTION,
321 NO_SAME_OWNER_OPTION,
322 NO_SAME_PERMISSIONS_OPTION,
324 NO_SELINUX_CONTEXT_OPTION,
326 NO_WILDCARDS_MATCH_SLASH_OPTION,
330 NUMERIC_OWNER_OPTION,
333 ONE_FILE_SYSTEM_OPTION,
334 ONE_TOP_LEVEL_OPTION,
335 OVERWRITE_DIR_OPTION,
342 QUOTING_STYLE_OPTION,
345 RECURSIVE_UNLINK_OPTION,
351 SELINUX_CONTEXT_OPTION,
352 SHOW_DEFAULTS_OPTION,
353 SHOW_OMITTED_DIRS_OPTION,
354 SHOW_SNAPSHOT_FIELD_RANGES_OPTION,
355 SHOW_TRANSFORMED_NAMES_OPTION,
356 SKIP_OLD_FILES_OPTION,
358 SPARSE_VERSION_OPTION,
359 STRIP_COMPONENTS_OPTION,
369 WILDCARDS_MATCH_SLASH_OPTION,
376 const char *argp_program_version = "tar (" PACKAGE_NAME ") " VERSION;
377 const char *argp_program_bug_address = "<" PACKAGE_BUGREPORT ">";
378 static char const doc[] = N_("\
379 GNU 'tar' saves many files together into a single tape or disk archive, \
380 and can restore individual files from the archive.\n\
383 tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n\
384 tar -tvf archive.tar # List all files in archive.tar verbosely.\n\
385 tar -xf archive.tar # Extract all files from archive.tar.\n")
387 N_("The backup suffix is '~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
388 The version control may be set with --backup or VERSION_CONTROL, values are:\n\n\
389 none, off never make backups\n\
390 t, numbered make numbered backups\n\
391 nil, existing numbered if numbered backups exist, simple otherwise\n\
392 never, simple always make simple backups\n");
397 Available option letters are DEQY and eqy. Consider the following
400 [For Solaris tar compatibility =/= Is it important at all?]
401 e exit immediately with a nonzero exit status if unexpected errors occur
402 E use extended headers (--format=posix)
404 [q alias for --occurrence=1 =/= this would better be used for quiet?]
406 y per-file gzip compression
407 Y per-block gzip compression.
409 Additionally, the 'n' letter is assigned for option --seek, which
410 is probably not needed and should be marked as deprecated, so that
411 -n may become available in the future.
414 static struct argp_option options[] = {
417 N_("Main operation mode:"), GRID },
420 N_("list the contents of an archive"), GRID+1 },
421 {"extract", 'x', 0, 0,
422 N_("extract files from an archive"), GRID+1 },
423 {"get", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
424 {"create", 'c', 0, 0,
425 N_("create a new archive"), GRID+1 },
427 N_("find differences between archive and file system"), GRID+1 },
428 {"compare", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
429 {"append", 'r', 0, 0,
430 N_("append files to the end of an archive"), GRID+1 },
431 {"update", 'u', 0, 0,
432 N_("only append files newer than copy in archive"), GRID+1 },
433 {"catenate", 'A', 0, 0,
434 N_("append tar files to an archive"), GRID+1 },
435 {"concatenate", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
436 {"delete", DELETE_OPTION, 0, 0,
437 N_("delete from the archive (not on mag tapes!)"), GRID+1 },
438 {"test-label", TEST_LABEL_OPTION, NULL, 0,
439 N_("test the archive volume label and exit"), GRID+1 },
444 N_("Operation modifiers:"), GRID },
446 {"sparse", 'S', 0, 0,
447 N_("handle sparse files efficiently"), GRID+1 },
448 {"sparse-version", SPARSE_VERSION_OPTION, N_("MAJOR[.MINOR]"), 0,
449 N_("set version of the sparse format to use (implies --sparse)"), GRID+1},
450 {"incremental", 'G', 0, 0,
451 N_("handle old GNU-format incremental backup"), GRID+1 },
452 {"listed-incremental", 'g', N_("FILE"), 0,
453 N_("handle new GNU-format incremental backup"), GRID+1 },
454 {"level", LEVEL_OPTION, N_("NUMBER"), 0,
455 N_("dump level for created listed-incremental archive"), GRID+1 },
456 {"ignore-failed-read", IGNORE_FAILED_READ_OPTION, 0, 0,
457 N_("do not exit with nonzero on unreadable files"), GRID+1 },
458 {"occurrence", OCCURRENCE_OPTION, N_("NUMBER"), OPTION_ARG_OPTIONAL,
459 N_("process only the NUMBERth occurrence of each file in the archive;"
460 " this option is valid only in conjunction with one of the subcommands"
461 " --delete, --diff, --extract or --list and when a list of files"
462 " is given either on the command line or via the -T option;"
463 " NUMBER defaults to 1"), GRID+1 },
464 {"seek", 'n', NULL, 0,
465 N_("archive is seekable"), GRID+1 },
466 {"no-seek", NO_SEEK_OPTION, NULL, 0,
467 N_("archive is not seekable"), GRID+1 },
468 {"no-check-device", NO_CHECK_DEVICE_OPTION, NULL, 0,
469 N_("do not check device numbers when creating incremental archives"),
471 {"check-device", CHECK_DEVICE_OPTION, NULL, 0,
472 N_("check device numbers when creating incremental archives (default)"),
478 N_("Overwrite control:"), GRID },
480 {"verify", 'W', 0, 0,
481 N_("attempt to verify the archive after writing it"), GRID+1 },
482 {"remove-files", REMOVE_FILES_OPTION, 0, 0,
483 N_("remove files after adding them to the archive"), GRID+1 },
484 {"keep-old-files", 'k', 0, 0,
485 N_("don't replace existing files when extracting, "
486 "treat them as errors"), GRID+1 },
487 {"skip-old-files", SKIP_OLD_FILES_OPTION, 0, 0,
488 N_("don't replace existing files when extracting, silently skip over them"),
490 {"keep-newer-files", KEEP_NEWER_FILES_OPTION, 0, 0,
491 N_("don't replace existing files that are newer than their archive copies"), GRID+1 },
492 {"overwrite", OVERWRITE_OPTION, 0, 0,
493 N_("overwrite existing files when extracting"), GRID+1 },
494 {"unlink-first", 'U', 0, 0,
495 N_("remove each file prior to extracting over it"), GRID+1 },
496 {"recursive-unlink", RECURSIVE_UNLINK_OPTION, 0, 0,
497 N_("empty hierarchies prior to extracting directory"), GRID+1 },
498 {"no-overwrite-dir", NO_OVERWRITE_DIR_OPTION, 0, 0,
499 N_("preserve metadata of existing directories"), GRID+1 },
500 {"overwrite-dir", OVERWRITE_DIR_OPTION, 0, 0,
501 N_("overwrite metadata of existing directories when extracting (default)"),
503 {"keep-directory-symlink", KEEP_DIRECTORY_SYMLINK_OPTION, 0, 0,
504 N_("preserve existing symlinks to directories when extracting"),
506 {"one-top-level", ONE_TOP_LEVEL_OPTION, N_("DIR"), OPTION_ARG_OPTIONAL,
507 N_("create a subdirectory to avoid having loose files extracted"),
513 N_("Select output stream:"), GRID },
515 {"to-stdout", 'O', 0, 0,
516 N_("extract files to standard output"), GRID+1 },
517 {"to-command", TO_COMMAND_OPTION, N_("COMMAND"), 0,
518 N_("pipe extracted files to another program"), GRID+1 },
519 {"ignore-command-error", IGNORE_COMMAND_ERROR_OPTION, 0, 0,
520 N_("ignore exit codes of children"), GRID+1 },
521 {"no-ignore-command-error", NO_IGNORE_COMMAND_ERROR_OPTION, 0, 0,
522 N_("treat non-zero exit codes of children as error"), GRID+1 },
527 N_("Handling of file attributes:"), GRID },
529 {"owner", OWNER_OPTION, N_("NAME"), 0,
530 N_("force NAME as owner for added files"), GRID+1 },
531 {"group", GROUP_OPTION, N_("NAME"), 0,
532 N_("force NAME as group for added files"), GRID+1 },
533 {"mtime", MTIME_OPTION, N_("DATE-OR-FILE"), 0,
534 N_("set mtime for added files from DATE-OR-FILE"), GRID+1 },
535 {"mode", MODE_OPTION, N_("CHANGES"), 0,
536 N_("force (symbolic) mode CHANGES for added files"), GRID+1 },
537 {"atime-preserve", ATIME_PRESERVE_OPTION,
538 N_("METHOD"), OPTION_ARG_OPTIONAL,
539 N_("preserve access times on dumped files, either by restoring the times"
540 " after reading (METHOD='replace'; default) or by not setting the times"
541 " in the first place (METHOD='system')"), GRID+1 },
543 N_("don't extract file modified time"), GRID+1 },
544 {"same-owner", SAME_OWNER_OPTION, 0, 0,
545 N_("try extracting files with the same ownership as exists in the archive (default for superuser)"), GRID+1 },
546 {"no-same-owner", NO_SAME_OWNER_OPTION, 0, 0,
547 N_("extract files as yourself (default for ordinary users)"), GRID+1 },
548 {"numeric-owner", NUMERIC_OWNER_OPTION, 0, 0,
549 N_("always use numbers for user/group names"), GRID+1 },
550 {"preserve-permissions", 'p', 0, 0,
551 N_("extract information about file permissions (default for superuser)"),
553 {"same-permissions", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
554 {"no-same-permissions", NO_SAME_PERMISSIONS_OPTION, 0, 0,
555 N_("apply the user's umask when extracting permissions from the archive (default for ordinary users)"), GRID+1 },
556 {"preserve-order", 's', 0, 0,
557 N_("member arguments are listed in the same order as the "
558 "files in the archive"), GRID+1 },
559 {"same-order", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
560 {"preserve", PRESERVE_OPTION, 0, 0,
561 N_("same as both -p and -s"), GRID+1 },
562 {"delay-directory-restore", DELAY_DIRECTORY_RESTORE_OPTION, 0, 0,
563 N_("delay setting modification times and permissions of extracted"
564 " directories until the end of extraction"), GRID+1 },
565 {"no-delay-directory-restore", NO_DELAY_DIRECTORY_RESTORE_OPTION, 0, 0,
566 N_("cancel the effect of --delay-directory-restore option"), GRID+1 },
567 {"sort", SORT_OPTION, N_("ORDER"), 0,
569 N_("directory sorting order: none (default), name or inode"
571 N_("directory sorting order: none (default) or name"
578 N_("Handling of extended file attributes:"), GRID },
580 {"xattrs", XATTR_OPTION, 0, 0,
581 N_("Enable extended attributes support"), GRID+1 },
582 {"no-xattrs", NO_XATTR_OPTION, 0, 0,
583 N_("Disable extended attributes support"), GRID+1 },
584 {"xattrs-include", XATTR_INCLUDE, N_("MASK"), 0,
585 N_("specify the include pattern for xattr keys"), GRID+1 },
586 {"xattrs-exclude", XATTR_EXCLUDE, N_("MASK"), 0,
587 N_("specify the exclude pattern for xattr keys"), GRID+1 },
588 {"selinux", SELINUX_CONTEXT_OPTION, 0, 0,
589 N_("Enable the SELinux context support"), GRID+1 },
590 {"no-selinux", NO_SELINUX_CONTEXT_OPTION, 0, 0,
591 N_("Disable the SELinux context support"), GRID+1 },
592 {"acls", ACLS_OPTION, 0, 0,
593 N_("Enable the POSIX ACLs support"), GRID+1 },
594 {"no-acls", NO_ACLS_OPTION, 0, 0,
595 N_("Disable the POSIX ACLs support"), GRID+1 },
600 N_("Device selection and switching:"), GRID },
602 {"file", 'f', N_("ARCHIVE"), 0,
603 N_("use archive file or device ARCHIVE"), GRID+1 },
604 {"force-local", FORCE_LOCAL_OPTION, 0, 0,
605 N_("archive file is local even if it has a colon"), GRID+1 },
606 {"rmt-command", RMT_COMMAND_OPTION, N_("COMMAND"), 0,
607 N_("use given rmt COMMAND instead of rmt"), GRID+1 },
608 {"rsh-command", RSH_COMMAND_OPTION, N_("COMMAND"), 0,
609 N_("use remote COMMAND instead of rsh"), GRID+1 },
611 {"-[0-7][lmh]", 0, NULL, OPTION_DOC, /* It is OK, since 'name' will never be
613 N_("specify drive and density"), GRID+1 },
615 {NULL, '0', NULL, OPTION_HIDDEN, NULL, GRID+1 },
616 {NULL, '1', NULL, OPTION_HIDDEN, NULL, GRID+1 },
617 {NULL, '2', NULL, OPTION_HIDDEN, NULL, GRID+1 },
618 {NULL, '3', NULL, OPTION_HIDDEN, NULL, GRID+1 },
619 {NULL, '4', NULL, OPTION_HIDDEN, NULL, GRID+1 },
620 {NULL, '5', NULL, OPTION_HIDDEN, NULL, GRID+1 },
621 {NULL, '6', NULL, OPTION_HIDDEN, NULL, GRID+1 },
622 {NULL, '7', NULL, OPTION_HIDDEN, NULL, GRID+1 },
623 {NULL, '8', NULL, OPTION_HIDDEN, NULL, GRID+1 },
624 {NULL, '9', NULL, OPTION_HIDDEN, NULL, GRID+1 },
626 {"multi-volume", 'M', 0, 0,
627 N_("create/list/extract multi-volume archive"), GRID+1 },
628 {"tape-length", 'L', N_("NUMBER"), 0,
629 N_("change tape after writing NUMBER x 1024 bytes"), GRID+1 },
630 {"info-script", 'F', N_("NAME"), 0,
631 N_("run script at end of each tape (implies -M)"), GRID+1 },
632 {"new-volume-script", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
633 {"volno-file", VOLNO_FILE_OPTION, N_("FILE"), 0,
634 N_("use/update the volume number in FILE"), GRID+1 },
639 N_("Device blocking:"), GRID },
641 {"blocking-factor", 'b', N_("BLOCKS"), 0,
642 N_("BLOCKS x 512 bytes per record"), GRID+1 },
643 {"record-size", RECORD_SIZE_OPTION, N_("NUMBER"), 0,
644 N_("NUMBER of bytes per record, multiple of 512"), GRID+1 },
645 {"ignore-zeros", 'i', 0, 0,
646 N_("ignore zeroed blocks in archive (means EOF)"), GRID+1 },
647 {"read-full-records", 'B', 0, 0,
648 N_("reblock as we read (for 4.2BSD pipes)"), GRID+1 },
653 N_("Archive format selection:"), GRID },
655 {"format", 'H', N_("FORMAT"), 0,
656 N_("create archive of the given format"), GRID+1 },
658 {NULL, 0, NULL, 0, N_("FORMAT is one of the following:"), GRID+2 },
659 {" v7", 0, NULL, OPTION_DOC|OPTION_NO_TRANS, N_("old V7 tar format"),
661 {" oldgnu", 0, NULL, OPTION_DOC|OPTION_NO_TRANS,
662 N_("GNU format as per tar <= 1.12"), GRID+3 },
663 {" gnu", 0, NULL, OPTION_DOC|OPTION_NO_TRANS,
664 N_("GNU tar 1.13.x format"), GRID+3 },
665 {" ustar", 0, NULL, OPTION_DOC|OPTION_NO_TRANS,
666 N_("POSIX 1003.1-1988 (ustar) format"), GRID+3 },
667 {" pax", 0, NULL, OPTION_DOC|OPTION_NO_TRANS,
668 N_("POSIX 1003.1-2001 (pax) format"), GRID+3 },
669 {" posix", 0, NULL, OPTION_DOC|OPTION_NO_TRANS, N_("same as pax"), GRID+3 },
671 {"old-archive", OLD_ARCHIVE_OPTION, 0, 0, /* FIXME */
672 N_("same as --format=v7"), GRID+8 },
673 {"portability", 0, 0, OPTION_ALIAS, NULL, GRID+8 },
674 {"posix", POSIX_OPTION, 0, 0,
675 N_("same as --format=posix"), GRID+8 },
676 {"pax-option", PAX_OPTION, N_("keyword[[:]=value][,keyword[[:]=value]]..."), 0,
677 N_("control pax keywords"), GRID+8 },
678 {"label", 'V', N_("TEXT"), 0,
679 N_("create archive with volume name TEXT; at list/extract time, use TEXT as a globbing pattern for volume name"), GRID+8 },
684 N_("Compression options:"), GRID },
685 {"auto-compress", 'a', 0, 0,
686 N_("use archive suffix to determine the compression program"), GRID+1 },
687 {"no-auto-compress", NO_AUTO_COMPRESS_OPTION, 0, 0,
688 N_("do not use archive suffix to determine the compression program"),
690 {"use-compress-program", 'I', N_("PROG"), 0,
691 N_("filter through PROG (must accept -d)"), GRID+1 },
692 /* Note: docstrings for the options below are generated by tar_help_filter */
693 {"bzip2", 'j', 0, 0, NULL, GRID+1 },
694 {"gzip", 'z', 0, 0, NULL, GRID+1 },
695 {"gunzip", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
696 {"ungzip", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
697 {"compress", 'Z', 0, 0, NULL, GRID+1 },
698 {"uncompress", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
699 {"lzip", LZIP_OPTION, 0, 0, NULL, GRID+1 },
700 {"lzma", LZMA_OPTION, 0, 0, NULL, GRID+1 },
701 {"lzop", LZOP_OPTION, 0, 0, NULL, GRID+1 },
702 {"xz", 'J', 0, 0, NULL, GRID+1 },
707 N_("Local file selection:"), GRID },
709 {"add-file", ARGP_KEY_ARG, N_("FILE"), 0,
710 N_("add given FILE to the archive (useful if its name starts with a dash)"), GRID+1 },
711 {"directory", 'C', N_("DIR"), 0,
712 N_("change to directory DIR"), GRID+1 },
713 {"files-from", 'T', N_("FILE"), 0,
714 N_("get names to extract or create from FILE"), GRID+1 },
715 {"null", NULL_OPTION, 0, 0,
716 N_("-T reads null-terminated names, disable -C"), GRID+1 },
717 {"no-null", NO_NULL_OPTION, 0, 0,
718 N_("disable the effect of the previous --null option"), GRID+1 },
719 {"unquote", UNQUOTE_OPTION, 0, 0,
720 N_("unquote input file or member names (default)"), GRID+1 },
721 {"no-unquote", NO_UNQUOTE_OPTION, 0, 0,
722 N_("do not unquote input file or member names"), GRID+1 },
723 {"exclude", EXCLUDE_OPTION, N_("PATTERN"), 0,
724 N_("exclude files, given as a PATTERN"), GRID+1 },
725 {"exclude-from", 'X', N_("FILE"), 0,
726 N_("exclude patterns listed in FILE"), GRID+1 },
727 {"exclude-caches", EXCLUDE_CACHES_OPTION, 0, 0,
728 N_("exclude contents of directories containing CACHEDIR.TAG, "
729 "except for the tag file itself"), GRID+1 },
730 {"exclude-caches-under", EXCLUDE_CACHES_UNDER_OPTION, 0, 0,
731 N_("exclude everything under directories containing CACHEDIR.TAG"),
733 {"exclude-caches-all", EXCLUDE_CACHES_ALL_OPTION, 0, 0,
734 N_("exclude directories containing CACHEDIR.TAG"), GRID+1 },
735 {"exclude-tag", EXCLUDE_TAG_OPTION, N_("FILE"), 0,
736 N_("exclude contents of directories containing FILE, except"
737 " for FILE itself"), GRID+1 },
738 {"exclude-ignore", EXCLUDE_IGNORE_OPTION, N_("FILE"), 0,
739 N_("read exclude patterns for each directory from FILE, if it exists"),
741 {"exclude-ignore-recursive", EXCLUDE_IGNORE_RECURSIVE_OPTION, N_("FILE"), 0,
742 N_("read exclude patterns for each directory and its subdirectories "
743 "from FILE, if it exists"), GRID+1 },
744 {"exclude-tag-under", EXCLUDE_TAG_UNDER_OPTION, N_("FILE"), 0,
745 N_("exclude everything under directories containing FILE"), GRID+1 },
746 {"exclude-tag-all", EXCLUDE_TAG_ALL_OPTION, N_("FILE"), 0,
747 N_("exclude directories containing FILE"), GRID+1 },
748 {"exclude-vcs", EXCLUDE_VCS_OPTION, NULL, 0,
749 N_("exclude version control system directories"), GRID+1 },
750 {"exclude-vcs-ignores", EXCLUDE_VCS_IGNORES_OPTION, NULL, 0,
751 N_("read exclude patterns from the VCS ignore files"), GRID+1 },
752 {"exclude-backups", EXCLUDE_BACKUPS_OPTION, NULL, 0,
753 N_("exclude backup and lock files"), GRID+1 },
754 {"no-recursion", NO_RECURSION_OPTION, 0, 0,
755 N_("avoid descending automatically in directories"), GRID+1 },
756 {"one-file-system", ONE_FILE_SYSTEM_OPTION, 0, 0,
757 N_("stay in local file system when creating archive"), GRID+1 },
758 {"recursion", RECURSION_OPTION, 0, 0,
759 N_("recurse into directories (default)"), GRID+1 },
760 {"absolute-names", 'P', 0, 0,
761 N_("don't strip leading '/'s from file names"), GRID+1 },
762 {"dereference", 'h', 0, 0,
763 N_("follow symlinks; archive and dump the files they point to"), GRID+1 },
764 {"hard-dereference", HARD_DEREFERENCE_OPTION, 0, 0,
765 N_("follow hard links; archive and dump the files they refer to"), GRID+1 },
766 {"starting-file", 'K', N_("MEMBER-NAME"), 0,
767 N_("begin at member MEMBER-NAME when reading the archive"), GRID+1 },
768 {"newer", 'N', N_("DATE-OR-FILE"), 0,
769 N_("only store files newer than DATE-OR-FILE"), GRID+1 },
770 {"after-date", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
771 {"newer-mtime", NEWER_MTIME_OPTION, N_("DATE"), 0,
772 N_("compare date and time when data changed only"), GRID+1 },
773 {"backup", BACKUP_OPTION, N_("CONTROL"), OPTION_ARG_OPTIONAL,
774 N_("backup before removal, choose version CONTROL"), GRID+1 },
775 {"suffix", SUFFIX_OPTION, N_("STRING"), 0,
776 N_("backup before removal, override usual suffix ('~' unless overridden by environment variable SIMPLE_BACKUP_SUFFIX)"), GRID+1 },
781 N_("File name transformations:"), GRID },
782 {"strip-components", STRIP_COMPONENTS_OPTION, N_("NUMBER"), 0,
783 N_("strip NUMBER leading components from file names on extraction"),
785 {"transform", TRANSFORM_OPTION, N_("EXPRESSION"), 0,
786 N_("use sed replace EXPRESSION to transform file names"), GRID+1 },
787 {"xform", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
792 N_("File name matching options (affect both exclude and include patterns):"),
794 {"ignore-case", IGNORE_CASE_OPTION, 0, 0,
795 N_("ignore case"), GRID+1 },
796 {"anchored", ANCHORED_OPTION, 0, 0,
797 N_("patterns match file name start"), GRID+1 },
798 {"no-anchored", NO_ANCHORED_OPTION, 0, 0,
799 N_("patterns match after any '/' (default for exclusion)"), GRID+1 },
800 {"no-ignore-case", NO_IGNORE_CASE_OPTION, 0, 0,
801 N_("case sensitive matching (default)"), GRID+1 },
802 {"wildcards", WILDCARDS_OPTION, 0, 0,
803 N_("use wildcards (default for exclusion)"), GRID+1 },
804 {"no-wildcards", NO_WILDCARDS_OPTION, 0, 0,
805 N_("verbatim string matching"), GRID+1 },
806 {"no-wildcards-match-slash", NO_WILDCARDS_MATCH_SLASH_OPTION, 0, 0,
807 N_("wildcards do not match '/'"), GRID+1 },
808 {"wildcards-match-slash", WILDCARDS_MATCH_SLASH_OPTION, 0, 0,
809 N_("wildcards match '/' (default for exclusion)"), GRID+1 },
814 N_("Informative output:"), GRID },
816 {"verbose", 'v', 0, 0,
817 N_("verbosely list files processed"), GRID+1 },
818 {"warning", WARNING_OPTION, N_("KEYWORD"), 0,
819 N_("warning control"), GRID+1 },
820 {"checkpoint", CHECKPOINT_OPTION, N_("NUMBER"), OPTION_ARG_OPTIONAL,
821 N_("display progress messages every NUMBERth record (default 10)"),
823 {"checkpoint-action", CHECKPOINT_ACTION_OPTION, N_("ACTION"), 0,
824 N_("execute ACTION on each checkpoint"),
826 {"check-links", 'l', 0, 0,
827 N_("print a message if not all links are dumped"), GRID+1 },
828 {"totals", TOTALS_OPTION, N_("SIGNAL"), OPTION_ARG_OPTIONAL,
829 N_("print total bytes after processing the archive; "
830 "with an argument - print total bytes when this SIGNAL is delivered; "
831 "Allowed signals are: SIGHUP, SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; "
832 "the names without SIG prefix are also accepted"), GRID+1 },
833 {"utc", UTC_OPTION, 0, 0,
834 N_("print file modification times in UTC"), GRID+1 },
835 {"full-time", FULL_TIME_OPTION, 0, 0,
836 N_("print file time to its full resolution"), GRID+1 },
837 {"index-file", INDEX_FILE_OPTION, N_("FILE"), 0,
838 N_("send verbose output to FILE"), GRID+1 },
839 {"block-number", 'R', 0, 0,
840 N_("show block number within archive with each message"), GRID+1 },
841 {"interactive", 'w', 0, 0,
842 N_("ask for confirmation for every action"), GRID+1 },
843 {"confirmation", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
844 {"show-defaults", SHOW_DEFAULTS_OPTION, 0, 0,
845 N_("show tar defaults"), GRID+1 },
846 {"show-snapshot-field-ranges", SHOW_SNAPSHOT_FIELD_RANGES_OPTION, 0, 0,
847 N_("show valid ranges for snapshot-file fields"), GRID+1 },
848 {"show-omitted-dirs", SHOW_OMITTED_DIRS_OPTION, 0, 0,
849 N_("when listing or extracting, list each directory that does not match search criteria"), GRID+1 },
850 {"show-transformed-names", SHOW_TRANSFORMED_NAMES_OPTION, 0, 0,
851 N_("show file or archive names after transformation"),
853 {"show-stored-names", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
854 {"quoting-style", QUOTING_STYLE_OPTION, N_("STYLE"), 0,
855 N_("set name quoting style; see below for valid STYLE values"), GRID+1 },
856 {"quote-chars", QUOTE_CHARS_OPTION, N_("STRING"), 0,
857 N_("additionally quote characters from STRING"), GRID+1 },
858 {"no-quote-chars", NO_QUOTE_CHARS_OPTION, N_("STRING"), 0,
859 N_("disable quoting for characters from STRING"), GRID+1 },
864 N_("Compatibility options:"), GRID },
867 N_("when creating, same as --old-archive; when extracting, same as --no-same-owner"), GRID+1 },
872 N_("Other options:"), GRID },
874 {"restrict", RESTRICT_OPTION, 0, 0,
875 N_("disable use of some potentially harmful options"), -1 },
881 static char const *const atime_preserve_args[] =
883 "replace", "system", NULL
886 static enum atime_preserve const atime_preserve_types[] =
888 replace_atime_preserve, system_atime_preserve
891 /* Make sure atime_preserve_types has as much entries as atime_preserve_args
892 (minus 1 for NULL guard) */
893 ARGMATCH_VERIFY (atime_preserve_args, atime_preserve_types);
895 /* Wildcard matching settings */
898 default_wildcards, /* For exclusion == enable_wildcards,
899 for inclusion == disable_wildcards */
904 struct tar_args /* Variables used during option parsing */
906 struct textual_date *textual_date; /* Keeps the arguments to --newer-mtime
907 and/or --date option if they are
909 enum wildcards wildcards; /* Wildcard settings (--wildcards/
911 int matching_flags; /* exclude_fnmatch options */
912 int include_anchored; /* Pattern anchoring options used for
914 bool o_option; /* True if -o option was given */
915 bool pax_option; /* True if --pax-option was given */
916 char const *backup_suffix_string; /* --suffix option argument */
917 char const *version_control_string; /* --backup option argument */
918 bool input_files; /* True if some input files where given */
919 int compress_autodetect; /* True if compression autodetection should
920 be attempted when creating archives */
924 #define MAKE_EXCL_OPTIONS(args) \
925 ((((args)->wildcards != disable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
926 | (args)->matching_flags \
929 #define MAKE_INCL_OPTIONS(args) \
930 ((((args)->wildcards == enable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
931 | (args)->include_anchored \
932 | (args)->matching_flags \
935 static char const * const vcs_file_table[] = {
967 static char const * const backup_file_table[] = {
975 add_exclude_array (char const * const * fv, int opts)
979 for (i = 0; fv[i]; i++)
980 add_exclude (excluded, fv[i], opts);
985 format_default_settings (void)
988 "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s"
993 archive_format_string (DEFAULT_ARCHIVE_FORMAT),
994 DEFAULT_ARCHIVE, DEFAULT_BLOCKING,
995 quoting_style_args[DEFAULT_QUOTING_STYLE],
1005 set_subcommand_option (enum subcommand subcommand)
1007 if (subcommand_option != UNKNOWN_SUBCOMMAND
1008 && subcommand_option != subcommand)
1010 _("You may not specify more than one '-Acdtrux', '--delete' or '--test-label' option")));
1012 subcommand_option = subcommand;
1016 set_use_compress_program_option (const char *string)
1018 if (use_compress_program_option
1019 && strcmp (use_compress_program_option, string) != 0)
1020 USAGE_ERROR ((0, 0, _("Conflicting compression options")));
1022 use_compress_program_option = string;
1028 compute_duration ();
1029 print_total_stats ();
1030 #ifndef HAVE_SIGACTION
1031 signal (signo, sigstat);
1036 stat_on_signal (int signo)
1038 #ifdef HAVE_SIGACTION
1040 # define SA_RESTART 0
1042 struct sigaction act;
1043 act.sa_handler = sigstat;
1044 sigemptyset (&act.sa_mask);
1045 act.sa_flags = SA_RESTART;
1046 sigaction (signo, &act, NULL);
1048 signal (signo, sigstat);
1053 set_stat_signal (const char *name)
1055 static struct sigtab
1059 } const sigtab[] = {
1060 { "SIGUSR1", SIGUSR1 },
1061 { "USR1", SIGUSR1 },
1062 { "SIGUSR2", SIGUSR2 },
1063 { "USR2", SIGUSR2 },
1064 { "SIGHUP", SIGHUP },
1066 { "SIGINT", SIGINT },
1068 { "SIGQUIT", SIGQUIT },
1071 struct sigtab const *p;
1073 for (p = sigtab; p < sigtab + sizeof (sigtab) / sizeof (sigtab[0]); p++)
1074 if (strcmp (p->name, name) == 0)
1076 stat_on_signal (p->signo);
1079 FATAL_ERROR ((0, 0, _("Unknown signal name: %s"), name));
1085 struct textual_date *next;
1092 get_date_or_file (struct tar_args *args, const char *option,
1093 const char *str, struct timespec *ts)
1095 if (FILE_SYSTEM_PREFIX_LEN (str) != 0
1100 if (stat (str, &st) != 0)
1103 USAGE_ERROR ((0, 0, _("Date sample file not found")));
1105 *ts = get_stat_mtime (&st);
1109 if (! parse_datetime (ts, str, NULL))
1111 WARN ((0, 0, _("Substituting %s for unknown date format %s"),
1112 tartime (*ts, false), quote (str)));
1118 struct textual_date *p = xmalloc (sizeof (*p));
1121 p->date = xstrdup (str);
1122 p->next = args->textual_date;
1123 args->textual_date = p;
1130 report_textual_dates (struct tar_args *args)
1132 struct textual_date *p;
1133 for (p = args->textual_date; p; )
1135 struct textual_date *next = p->next;
1138 char const *treated_as = tartime (p->ts, true);
1139 if (strcmp (p->date, treated_as) != 0)
1140 WARN ((0, 0, _("Option %s: Treating date '%s' as %s"),
1141 p->option, p->date, treated_as));
1150 static bool files_from_option; /* When set, tar will not refuse to create
1153 /* Default density numbers for [0-9][lmh] device specifications */
1155 #if defined DEVICE_PREFIX && !defined DENSITY_LETTER
1156 # ifndef LOW_DENSITY_NUM
1157 # define LOW_DENSITY_NUM 0
1160 # ifndef MID_DENSITY_NUM
1161 # define MID_DENSITY_NUM 8
1164 # ifndef HIGH_DENSITY_NUM
1165 # define HIGH_DENSITY_NUM 16
1171 tar_help_filter (int key, const char *text, void *input)
1183 s = xasprintf (_("filter the archive through %s"), BZIP2_PROGRAM);
1187 s = xasprintf (_("filter the archive through %s"), GZIP_PROGRAM);
1191 s = xasprintf (_("filter the archive through %s"), COMPRESS_PROGRAM);
1195 s = xasprintf (_("filter the archive through %s"), LZIP_PROGRAM);
1199 s = xasprintf (_("filter the archive through %s"), LZMA_PROGRAM);
1203 s = xasprintf (_("filter the archive through %s"), LZOP_PROGRAM);
1206 s = xasprintf (_("filter the archive through %s"), XZ_PROGRAM);
1209 case ARGP_KEY_HELP_EXTRA:
1213 obstack_init (&stk);
1214 tstr = _("Valid arguments for the --quoting-style option are:");
1215 obstack_grow (&stk, tstr, strlen (tstr));
1216 obstack_grow (&stk, "\n\n", 2);
1217 tar_list_quoting_styles (&stk, " ");
1218 tstr = _("\n*This* tar defaults to:\n");
1219 obstack_grow (&stk, tstr, strlen (tstr));
1220 s = format_default_settings ();
1221 obstack_grow (&stk, s, strlen (s));
1222 obstack_1grow (&stk, '\n');
1223 obstack_1grow (&stk, 0);
1224 s = xstrdup (obstack_finish (&stk));
1225 obstack_free (&stk, NULL);
1232 expand_pax_option (struct tar_args *targs, const char *arg)
1237 obstack_init (&stk);
1240 size_t seglen = strcspn (arg, ",");
1241 char *p = memchr (arg, '=', seglen);
1244 size_t len = p - arg + 1;
1245 obstack_grow (&stk, arg, len);
1247 for (++p; *p && isspace ((unsigned char) *p); p++)
1249 if (*p == '{' && p[len-1] == '}')
1252 char *tmp = xmalloc (len);
1253 memcpy (tmp, p + 1, len-2);
1255 if (get_date_or_file (targs, "--pax-option", tmp, &ts) == 0)
1257 char buf[TIMESPEC_STRSIZE_BOUND];
1258 char const *s = code_timespec (ts, buf);
1259 obstack_grow (&stk, s, strlen (s));
1262 obstack_grow (&stk, p, len);
1266 obstack_grow (&stk, p, len);
1269 obstack_grow (&stk, arg, seglen);
1274 obstack_1grow (&stk, *arg);
1278 obstack_1grow (&stk, 0);
1279 res = xstrdup (obstack_finish (&stk));
1280 obstack_free (&stk, NULL);
1286 parse_owner_group (char *arg, uintmax_t field_max, char const **name_option)
1288 uintmax_t u = UINTMAX_MAX;
1290 char const *name = 0;
1291 char const *invalid_num = 0;
1292 char *colon = strchr (arg, ':');
1296 char const *num = colon + 1;
1300 if (num && (! (xstrtoumax (num, &end, 10, &u, "") == LONGINT_OK
1301 && u <= field_max)))
1307 switch ('0' <= *arg && *arg <= '9'
1308 ? xstrtoumax (arg, &end, 10, &u1, "")
1316 if (u1 <= field_max)
1322 case LONGINT_OVERFLOW:
1329 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (invalid_num),
1330 _("Invalid owner or group ID")));
1332 *name_option = name;
1336 #define TAR_SIZE_SUFFIXES "bBcGgkKMmPTtw"
1338 /* Either NL or NUL, as decided by the --null option. */
1339 static char filename_terminator;
1341 static char const *const sort_mode_arg[] = {
1348 static int sort_mode_flag[] = {
1354 ARGMATCH_VERIFY (sort_mode_arg, sort_mode_flag);
1357 parse_opt (int key, char *arg, struct argp_state *state)
1359 struct tar_args *args = state->input;
1364 /* File name or non-parsed option, because of ARGP_IN_ORDER */
1365 name_add_name (arg, MAKE_INCL_OPTIONS (args));
1366 args->input_files = true;
1370 set_subcommand_option (CAT_SUBCOMMAND);
1374 args->compress_autodetect = true;
1377 case NO_AUTO_COMPRESS_OPTION:
1378 args->compress_autodetect = false;
1384 if (! (xstrtoumax (arg, 0, 10, &u, "") == LONGINT_OK
1385 && u == (blocking_factor = u)
1386 && 0 < blocking_factor
1387 && u == (record_size = u * BLOCKSIZE) / BLOCKSIZE))
1388 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
1389 _("Invalid blocking factor")));
1394 /* Try to reblock input records. For reading 4.2BSD pipes. */
1396 /* It would surely make sense to exchange -B and -R, but it seems
1397 that -B has been used for a long while in Sun tar and most
1398 BSD-derived systems. This is a consequence of the block/record
1399 terminology confusion. */
1401 read_full_records_option = true;
1405 set_subcommand_option (CREATE_SUBCOMMAND);
1413 set_subcommand_option (DIFF_SUBCOMMAND);
1417 if (archive_names == allocated_archive_names)
1418 archive_name_array = x2nrealloc (archive_name_array,
1419 &allocated_archive_names,
1420 sizeof (archive_name_array[0]));
1422 archive_name_array[archive_names++] = arg;
1426 /* Since -F is only useful with -M, make it implied. Run this
1427 script at the end of each tape. */
1429 info_script_option = arg;
1430 multi_volume_option = true;
1433 case FULL_TIME_OPTION:
1434 full_time_option = true;
1438 listed_incremental_option = arg;
1439 after_date_option = true;
1443 /* We are making an incremental dump (FIXME: are we?); save
1444 directories at the beginning of the archive, and include in each
1445 directory its contents. */
1447 incremental_option = true;
1451 /* Follow symbolic links. */
1452 dereference_option = true;
1455 case HARD_DEREFERENCE_OPTION:
1456 hard_dereference_option = true;
1460 /* Ignore zero blocks (eofs). This can't be the default,
1461 because Unix tar writes two blocks of zeros, then pads out
1462 the record with garbage. */
1464 ignore_zeros_option = true;
1468 set_use_compress_program_option (BZIP2_PROGRAM);
1472 set_use_compress_program_option (XZ_PROGRAM);
1476 /* Don't replace existing files. */
1477 old_files_option = KEEP_OLD_FILES;
1481 starting_file_option = true;
1482 addname (arg, 0, true, NULL);
1485 case ONE_FILE_SYSTEM_OPTION:
1486 /* When dumping directories, don't dump files/subdirectories
1487 that are on other filesystems. */
1488 one_file_system_option = true;
1491 case ONE_TOP_LEVEL_OPTION:
1492 one_top_level_option = true;
1493 one_top_level_dir = arg;
1497 check_links_option = 1;
1505 if (xstrtoumax (arg, &p, 10, &u, TAR_SIZE_SUFFIXES) != LONGINT_OK)
1506 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
1507 _("Invalid tape length")));
1508 if (p > arg && !strchr (TAR_SIZE_SUFFIXES, p[-1]))
1509 tape_length_option = 1024 * (tarlong) u;
1511 tape_length_option = (tarlong) u;
1512 multi_volume_option = true;
1519 incremental_level = strtoul (arg, &p, 10);
1521 USAGE_ERROR ((0, 0, _("Invalid incremental level value")));
1526 set_use_compress_program_option (LZIP_PROGRAM);
1530 set_use_compress_program_option (LZMA_PROGRAM);
1534 set_use_compress_program_option (LZOP_PROGRAM);
1538 touch_option = true;
1542 /* Make multivolume archive: when we can't write any more into
1543 the archive, re-open it, and continue writing. */
1545 multi_volume_option = true;
1549 get_date_or_file (args, "--mtime", arg, &mtime_option);
1550 set_mtime_option = true;
1557 case NO_SEEK_OPTION:
1562 after_date_option = true;
1565 case NEWER_MTIME_OPTION:
1566 if (NEWER_OPTION_INITIALIZED (newer_mtime_option))
1567 USAGE_ERROR ((0, 0, _("More than one threshold date")));
1568 get_date_or_file (args,
1569 key == NEWER_MTIME_OPTION ? "--newer-mtime"
1570 : "--after-date", arg, &newer_mtime_option);
1574 args->o_option = true;
1578 to_stdout_option = true;
1582 same_permissions_option = true;
1586 absolute_names_option = true;
1590 set_subcommand_option (APPEND_SUBCOMMAND);
1594 /* Print block numbers for debugging bad tar archives. */
1596 /* It would surely make sense to exchange -B and -R, but it seems
1597 that -B has been used for a long while in Sun tar and most
1598 BSD-derived systems. This is a consequence of the block/record
1599 terminology confusion. */
1601 block_number_option = true;
1605 /* Names to extract are sorted. */
1607 same_order_option = true;
1611 sparse_option = true;
1614 case SKIP_OLD_FILES_OPTION:
1615 old_files_option = SKIP_OLD_FILES;
1618 case SPARSE_VERSION_OPTION:
1619 sparse_option = true;
1622 tar_sparse_major = strtoul (arg, &p, 10);
1626 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1627 tar_sparse_minor = strtoul (p + 1, &p, 10);
1629 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1635 set_subcommand_option (LIST_SUBCOMMAND);
1639 case TEST_LABEL_OPTION:
1640 set_subcommand_option (TEST_LABEL_SUBCOMMAND);
1644 name_add_file (arg, filename_terminator);
1645 /* Indicate we've been given -T option. This is for backward
1646 compatibility only, so that `tar cfT archive /dev/null will
1648 files_from_option = true;
1652 set_subcommand_option (UPDATE_SUBCOMMAND);
1656 old_files_option = UNLINK_FIRST_OLD_FILES;
1665 warning_option |= WARN_VERBOSE_WARNINGS;
1669 volume_label_option = arg;
1673 interactive_option = true;
1677 verify_option = true;
1681 set_subcommand_option (EXTRACT_SUBCOMMAND);
1685 if (add_exclude_file (add_exclude, excluded, arg,
1686 MAKE_EXCL_OPTIONS (args), '\n')
1690 FATAL_ERROR ((0, e, "%s", quotearg_colon (arg)));
1695 set_use_compress_program_option (GZIP_PROGRAM);
1699 set_use_compress_program_option (COMPRESS_PROGRAM);
1702 case ANCHORED_OPTION:
1703 args->matching_flags |= EXCLUDE_ANCHORED;
1706 case ATIME_PRESERVE_OPTION:
1707 atime_preserve_option =
1709 ? XARGMATCH ("--atime-preserve", arg,
1710 atime_preserve_args, atime_preserve_types)
1711 : replace_atime_preserve);
1712 if (! O_NOATIME && atime_preserve_option == system_atime_preserve)
1714 _("--atime-preserve='system' is not supported"
1715 " on this platform")));
1718 case CHECK_DEVICE_OPTION:
1719 check_device_option = true;
1722 case NO_CHECK_DEVICE_OPTION:
1723 check_device_option = false;
1726 case CHECKPOINT_OPTION:
1733 checkpoint_compile_action (".");
1736 checkpoint_option = strtoul (arg, &p, 0);
1739 _("--checkpoint value is not an integer")));
1742 checkpoint_option = DEFAULT_CHECKPOINT;
1745 case CHECKPOINT_ACTION_OPTION:
1746 checkpoint_compile_action (arg);
1750 backup_option = true;
1752 args->version_control_string = arg;
1755 case DELAY_DIRECTORY_RESTORE_OPTION:
1756 delay_directory_restore_option = true;
1759 case NO_DELAY_DIRECTORY_RESTORE_OPTION:
1760 delay_directory_restore_option = false;
1764 set_subcommand_option (DELETE_SUBCOMMAND);
1767 case EXCLUDE_BACKUPS_OPTION:
1768 add_exclude_array (backup_file_table, EXCLUDE_WILDCARDS);
1771 case EXCLUDE_OPTION:
1772 add_exclude (excluded, arg, MAKE_EXCL_OPTIONS (args));
1775 case EXCLUDE_CACHES_OPTION:
1776 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_contents,
1780 case EXCLUDE_CACHES_UNDER_OPTION:
1781 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_under,
1785 case EXCLUDE_CACHES_ALL_OPTION:
1786 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_all,
1790 case EXCLUDE_IGNORE_OPTION:
1791 excfile_add (arg, EXCL_NON_RECURSIVE);
1794 case EXCLUDE_IGNORE_RECURSIVE_OPTION:
1795 excfile_add (arg, EXCL_RECURSIVE);
1798 case EXCLUDE_TAG_OPTION:
1799 add_exclusion_tag (arg, exclusion_tag_contents, NULL);
1802 case EXCLUDE_TAG_UNDER_OPTION:
1803 add_exclusion_tag (arg, exclusion_tag_under, NULL);
1806 case EXCLUDE_TAG_ALL_OPTION:
1807 add_exclusion_tag (arg, exclusion_tag_all, NULL);
1810 case EXCLUDE_VCS_OPTION:
1811 add_exclude_array (vcs_file_table, 0);
1814 case EXCLUDE_VCS_IGNORES_OPTION:
1815 exclude_vcs_ignores ();
1818 case FORCE_LOCAL_OPTION:
1819 force_local_option = true;
1823 set_archive_format (arg);
1826 case INDEX_FILE_OPTION:
1827 index_file_name = arg;
1830 case IGNORE_CASE_OPTION:
1831 args->matching_flags |= FNM_CASEFOLD;
1834 case IGNORE_COMMAND_ERROR_OPTION:
1835 ignore_command_error_option = true;
1838 case IGNORE_FAILED_READ_OPTION:
1839 ignore_failed_read_option = true;
1842 case KEEP_DIRECTORY_SYMLINK_OPTION:
1843 keep_directory_symlink_option = true;
1846 case KEEP_NEWER_FILES_OPTION:
1847 old_files_option = KEEP_NEWER_FILES;
1852 uintmax_t u = parse_owner_group (arg, TYPE_MAXIMUM (gid_t),
1853 &group_name_option);
1854 if (u == UINTMAX_MAX)
1857 if (group_name_option)
1858 gname_to_gid (group_name_option, &group_option);
1866 mode_option = mode_compile (arg);
1868 FATAL_ERROR ((0, 0, _("Invalid mode given on option")));
1869 initial_umask = umask (0);
1870 umask (initial_umask);
1873 case NO_ANCHORED_OPTION:
1874 args->include_anchored = 0; /* Clear the default for comman line args */
1875 args->matching_flags &= ~ EXCLUDE_ANCHORED;
1878 case NO_IGNORE_CASE_OPTION:
1879 args->matching_flags &= ~ FNM_CASEFOLD;
1882 case NO_IGNORE_COMMAND_ERROR_OPTION:
1883 ignore_command_error_option = false;
1886 case NO_OVERWRITE_DIR_OPTION:
1887 old_files_option = NO_OVERWRITE_DIR_OLD_FILES;
1890 case NO_QUOTE_CHARS_OPTION:
1892 set_char_quoting (NULL, *arg, 0);
1895 case NO_WILDCARDS_OPTION:
1896 args->wildcards = disable_wildcards;
1899 case NO_WILDCARDS_MATCH_SLASH_OPTION:
1900 args->matching_flags |= FNM_FILE_NAME;
1904 filename_terminator = '\0';
1907 case NO_NULL_OPTION:
1908 filename_terminator = '\n';
1911 case NUMERIC_OWNER_OPTION:
1912 numeric_owner_option = true;
1915 case OCCURRENCE_OPTION:
1917 occurrence_option = 1;
1921 if (xstrtoumax (arg, 0, 10, &u, "") == LONGINT_OK)
1922 occurrence_option = u;
1924 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
1925 _("Invalid number")));
1929 case OLD_ARCHIVE_OPTION:
1930 set_archive_format ("v7");
1933 case OVERWRITE_DIR_OPTION:
1934 old_files_option = DEFAULT_OLD_FILES;
1937 case OVERWRITE_OPTION:
1938 old_files_option = OVERWRITE_OLD_FILES;
1943 uintmax_t u = parse_owner_group (arg, TYPE_MAXIMUM (uid_t),
1944 &owner_name_option);
1945 if (u == UINTMAX_MAX)
1948 if (owner_name_option)
1949 uname_to_uid (owner_name_option, &owner_option);
1956 case QUOTE_CHARS_OPTION:
1958 set_char_quoting (NULL, *arg, 1);
1961 case QUOTING_STYLE_OPTION:
1962 tar_set_quoting_style (arg);
1967 char *tmp = expand_pax_option (args, arg);
1968 args->pax_option = true;
1969 xheader_set_option (tmp);
1975 set_archive_format ("posix");
1978 case PRESERVE_OPTION:
1979 /* FIXME: What it is good for? */
1980 same_permissions_option = true;
1981 same_order_option = true;
1982 WARN ((0, 0, _("The --preserve option is deprecated, "
1983 "use --preserve-permissions --preserve-order instead")));
1986 case RECORD_SIZE_OPTION:
1990 if (! (xstrtoumax (arg, NULL, 10, &u, TAR_SIZE_SUFFIXES) == LONGINT_OK
1991 && u == (size_t) u))
1992 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
1993 _("Invalid record size")));
1995 if (record_size % BLOCKSIZE != 0)
1996 USAGE_ERROR ((0, 0, _("Record size must be a multiple of %d."),
1998 blocking_factor = record_size / BLOCKSIZE;
2002 case RECURSIVE_UNLINK_OPTION:
2003 recursive_unlink_option = true;
2006 case REMOVE_FILES_OPTION:
2007 remove_files_option = true;
2010 case RESTRICT_OPTION:
2011 restrict_option = true;
2014 case RMT_COMMAND_OPTION:
2018 case RSH_COMMAND_OPTION:
2019 rsh_command_option = arg;
2022 case SHOW_DEFAULTS_OPTION:
2024 char *s = format_default_settings ();
2031 case SHOW_SNAPSHOT_FIELD_RANGES_OPTION:
2032 show_snapshot_field_ranges ();
2036 case STRIP_COMPONENTS_OPTION:
2039 if (! (xstrtoumax (arg, 0, 10, &u, "") == LONGINT_OK
2040 && u == (size_t) u))
2041 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
2042 _("Invalid number of elements")));
2043 strip_name_components = u;
2047 case SHOW_OMITTED_DIRS_OPTION:
2048 show_omitted_dirs_option = true;
2051 case SHOW_TRANSFORMED_NAMES_OPTION:
2052 show_transformed_names_option = true;
2056 savedir_sort_order = XARGMATCH ("--sort", arg,
2057 sort_mode_arg, sort_mode_flag);
2061 backup_option = true;
2062 args->backup_suffix_string = arg;
2065 case TO_COMMAND_OPTION:
2066 if (to_command_option)
2067 USAGE_ERROR ((0, 0, _("Only one --to-command option allowed")));
2068 to_command_option = arg;
2073 set_stat_signal (arg);
2075 totals_option = true;
2078 case TRANSFORM_OPTION:
2079 set_transform_expr (arg);
2083 set_use_compress_program_option (arg);
2086 case VOLNO_FILE_OPTION:
2087 volno_file_option = arg;
2090 case WILDCARDS_OPTION:
2091 args->wildcards = enable_wildcards;
2094 case WILDCARDS_MATCH_SLASH_OPTION:
2095 args->matching_flags &= ~ FNM_FILE_NAME;
2098 case NO_RECURSION_OPTION:
2099 recursion_option = 0;
2102 case NO_SAME_OWNER_OPTION:
2103 same_owner_option = -1;
2106 case NO_SAME_PERMISSIONS_OPTION:
2107 same_permissions_option = -1;
2111 set_archive_format ("posix");
2115 case NO_ACLS_OPTION:
2119 case SELINUX_CONTEXT_OPTION:
2120 set_archive_format ("posix");
2121 selinux_context_option = 1;
2124 case NO_SELINUX_CONTEXT_OPTION:
2125 selinux_context_option = -1;
2129 set_xattr_option (1);
2132 case NO_XATTR_OPTION:
2133 set_xattr_option (-1);
2138 set_xattr_option (1);
2139 xattrs_mask_add (arg, (key == XATTR_INCLUDE));
2142 case RECURSION_OPTION:
2143 recursion_option = FNM_LEADING_DIR;
2146 case SAME_OWNER_OPTION:
2147 same_owner_option = 1;
2150 case UNQUOTE_OPTION:
2151 unquote_option = true;
2154 case NO_UNQUOTE_OPTION:
2155 unquote_option = false;
2158 case WARNING_OPTION:
2159 set_warning_option (arg);
2171 #ifdef DEVICE_PREFIX
2173 int device = key - '0';
2175 static char buf[sizeof DEVICE_PREFIX + 10];
2179 argp_error (state, _("Malformed density argument: %s"), quote (arg));
2181 strcpy (buf, DEVICE_PREFIX);
2182 cursor = buf + strlen (buf);
2184 #ifdef DENSITY_LETTER
2186 sprintf (cursor, "%d%c", device, arg[0]);
2188 #else /* not DENSITY_LETTER */
2193 device += LOW_DENSITY_NUM;
2197 device += MID_DENSITY_NUM;
2201 device += HIGH_DENSITY_NUM;
2205 argp_error (state, _("Unknown density: '%c'"), arg[0]);
2207 sprintf (cursor, "%d", device);
2209 #endif /* not DENSITY_LETTER */
2211 if (archive_names == allocated_archive_names)
2212 archive_name_array = x2nrealloc (archive_name_array,
2213 &allocated_archive_names,
2214 sizeof (archive_name_array[0]));
2215 archive_name_array[archive_names++] = xstrdup (buf);
2219 #else /* not DEVICE_PREFIX */
2222 _("Options '-[0-7][lmh]' not supported by *this* tar"));
2224 #endif /* not DEVICE_PREFIX */
2227 return ARGP_ERR_UNKNOWN;
2232 static struct argp argp = {
2245 argp_help (&argp, stderr, ARGP_HELP_SEE, (char*) program_name);
2250 /* Parse the options for tar. */
2252 static struct argp_option *
2253 find_argp_option (struct argp_option *o, int letter)
2260 && o->doc == NULL); o++)
2261 if (o->key == letter)
2266 static const char *tar_authors[] = {
2272 /* Subcommand classes */
2273 #define SUBCL_READ 0x01 /* subcommand reads from the archive */
2274 #define SUBCL_WRITE 0x02 /* subcommand writes to the archive */
2275 #define SUBCL_UPDATE 0x04 /* subcommand updates existing archive */
2276 #define SUBCL_TEST 0x08 /* subcommand tests archive header or meta-info */
2277 #define SUBCL_OCCUR 0x10 /* subcommand allows the use of the occurrence
2280 static int subcommand_class[] = {
2281 /* UNKNOWN_SUBCOMMAND */ 0,
2282 /* APPEND_SUBCOMMAND */ SUBCL_WRITE|SUBCL_UPDATE,
2283 /* CAT_SUBCOMMAND */ SUBCL_WRITE,
2284 /* CREATE_SUBCOMMAND */ SUBCL_WRITE,
2285 /* DELETE_SUBCOMMAND */ SUBCL_WRITE|SUBCL_UPDATE|SUBCL_OCCUR,
2286 /* DIFF_SUBCOMMAND */ SUBCL_READ|SUBCL_OCCUR,
2287 /* EXTRACT_SUBCOMMAND */ SUBCL_READ|SUBCL_OCCUR,
2288 /* LIST_SUBCOMMAND */ SUBCL_READ|SUBCL_OCCUR,
2289 /* UPDATE_SUBCOMMAND */ SUBCL_WRITE|SUBCL_UPDATE,
2290 /* TEST_LABEL_SUBCOMMAND */ SUBCL_TEST
2293 /* Return t if the subcommand_option is in class(es) f */
2294 #define IS_SUBCOMMAND_CLASS(f) (subcommand_class[subcommand_option] & (f))
2296 static struct tar_args args;
2299 option_conflict_error (const char *a, const char *b)
2301 /* TRANSLATORS: Both %s in this statement are replaced with
2303 USAGE_ERROR ((0, 0, _("'%s' cannot be used with '%s'"), a, b));
2307 decode_options (int argc, char **argv)
2311 argp_version_setup ("tar", tar_authors);
2313 /* Set some default option values. */
2314 args.textual_date = NULL;
2315 args.wildcards = default_wildcards;
2316 args.matching_flags = 0;
2317 args.include_anchored = EXCLUDE_ANCHORED;
2318 args.o_option = false;
2319 args.pax_option = false;
2320 args.backup_suffix_string = getenv ("SIMPLE_BACKUP_SUFFIX");
2321 args.version_control_string = 0;
2322 args.input_files = false;
2323 args.compress_autodetect = false;
2325 subcommand_option = UNKNOWN_SUBCOMMAND;
2326 archive_format = DEFAULT_FORMAT;
2327 blocking_factor = DEFAULT_BLOCKING;
2328 record_size = DEFAULT_BLOCKING * BLOCKSIZE;
2329 excluded = new_exclude ();
2331 newer_mtime_option.tv_sec = TYPE_MINIMUM (time_t);
2332 newer_mtime_option.tv_nsec = -1;
2333 recursion_option = FNM_LEADING_DIR;
2334 unquote_option = true;
2335 tar_sparse_major = 1;
2336 tar_sparse_minor = 0;
2338 savedir_sort_order = SAVEDIR_SORT_NONE;
2340 owner_option = -1; owner_name_option = NULL;
2341 group_option = -1; group_name_option = NULL;
2343 check_device_option = true;
2345 incremental_level = -1;
2349 /* Convert old-style tar call by exploding option element and rearranging
2350 options accordingly. */
2352 if (argc > 1 && argv[1][0] != '-')
2354 int new_argc; /* argc value for rearranged arguments */
2355 char **new_argv; /* argv value for rearranged arguments */
2356 char *const *in; /* cursor into original argv */
2357 char **out; /* cursor into rearranged argv */
2358 const char *letter; /* cursor into old option letters */
2359 char buffer[3]; /* constructed option buffer */
2361 /* Initialize a constructed option. */
2366 /* Allocate a new argument array, and copy program name in it. */
2368 new_argc = argc - 1 + strlen (argv[1]);
2369 new_argv = xmalloc ((new_argc + 1) * sizeof (char *));
2374 /* Copy each old letter option as a separate option, and have the
2375 corresponding argument moved next to it. */
2377 for (letter = *in++; *letter; letter++)
2379 struct argp_option *opt;
2381 buffer[1] = *letter;
2382 *out++ = xstrdup (buffer);
2383 opt = find_argp_option (options, *letter);
2384 if (opt && opt->arg)
2386 if (in < argv + argc)
2389 USAGE_ERROR ((0, 0, _("Old option '%c' requires an argument."),
2394 /* Copy all remaining options. */
2396 while (in < argv + argc)
2400 /* Replace the old option list by the new one. */
2406 /* Parse all options and non-options as they appear. */
2408 prepend_default_options (getenv ("TAR_OPTIONS"), &argc, &argv);
2410 if (argp_parse (&argp, argc, argv, ARGP_IN_ORDER, &idx, &args))
2411 exit (TAREXIT_FAILURE);
2413 /* Special handling for 'o' option:
2415 GNU tar used to say "output old format".
2416 UNIX98 tar says don't chown files after extracting (we use
2417 "--no-same-owner" for this).
2419 The old GNU tar semantics is retained when used with --create
2420 option, otherwise UNIX98 semantics is assumed */
2424 if (subcommand_option == CREATE_SUBCOMMAND)
2426 /* GNU Tar <= 1.13 compatibility */
2427 set_archive_format ("v7");
2431 /* UNIX98 compatibility */
2432 same_owner_option = -1;
2436 /* Handle operands after any "--" argument. */
2437 for (; idx < argc; idx++)
2439 name_add_name (argv[idx], MAKE_INCL_OPTIONS (&args));
2440 args.input_files = true;
2443 /* Warn about implicit use of the wildcards in command line arguments.
2445 warn_regex_usage = args.wildcards == default_wildcards;
2447 /* Derive option values and check option consistency. */
2449 if (archive_format == DEFAULT_FORMAT)
2451 if (args.pax_option)
2452 archive_format = POSIX_FORMAT;
2454 archive_format = DEFAULT_ARCHIVE_FORMAT;
2457 if ((volume_label_option && subcommand_option == CREATE_SUBCOMMAND)
2458 || incremental_option
2459 || multi_volume_option
2461 assert_format (FORMAT_MASK (OLDGNU_FORMAT)
2462 | FORMAT_MASK (GNU_FORMAT)
2463 | FORMAT_MASK (POSIX_FORMAT));
2465 if (occurrence_option)
2467 if (!args.input_files)
2469 _("--occurrence is meaningless without a file list")));
2470 if (!IS_SUBCOMMAND_CLASS (SUBCL_OCCUR))
2471 option_conflict_error ("--occurrence",
2472 subcommand_string (subcommand_option));
2475 if (archive_names == 0)
2477 /* If no archive file name given, try TAPE from the environment, or
2478 else, DEFAULT_ARCHIVE from the configuration process. */
2481 archive_name_array[0] = getenv ("TAPE");
2482 if (! archive_name_array[0])
2483 archive_name_array[0] = DEFAULT_ARCHIVE;
2486 /* Allow multiple archives only with '-M'. */
2488 if (archive_names > 1 && !multi_volume_option)
2490 _("Multiple archive files require '-M' option")));
2492 if (listed_incremental_option
2493 && NEWER_OPTION_INITIALIZED (newer_mtime_option))
2494 option_conflict_error ("--listed-incremental", "--newer");
2496 if (incremental_level != -1 && !listed_incremental_option)
2498 _("--level is meaningless without --listed-incremental")));
2500 if (volume_label_option)
2502 if (archive_format == GNU_FORMAT || archive_format == OLDGNU_FORMAT)
2504 size_t volume_label_max_len =
2505 (sizeof current_header->header.name
2506 - 1 /* for trailing '\0' */
2507 - (multi_volume_option
2508 ? (sizeof " Volume "
2509 - 1 /* for null at end of " Volume " */
2510 + INT_STRLEN_BOUND (int) /* for volume number */
2511 - 1 /* for sign, as 0 <= volno */)
2513 if (volume_label_max_len < strlen (volume_label_option))
2515 ngettext ("%s: Volume label is too long (limit is %lu byte)",
2516 "%s: Volume label is too long (limit is %lu bytes)",
2517 volume_label_max_len),
2518 quotearg_colon (volume_label_option),
2519 (unsigned long) volume_label_max_len));
2522 Label length in PAX format is limited by the volume size. */
2527 if (multi_volume_option)
2528 USAGE_ERROR ((0, 0, _("Cannot verify multi-volume archives")));
2529 if (use_compress_program_option)
2530 USAGE_ERROR ((0, 0, _("Cannot verify compressed archives")));
2531 if (!IS_SUBCOMMAND_CLASS (SUBCL_WRITE))
2532 option_conflict_error ("--verify",
2533 subcommand_string (subcommand_option));
2536 if (use_compress_program_option)
2538 if (multi_volume_option)
2539 USAGE_ERROR ((0, 0, _("Cannot use multi-volume compressed archives")));
2540 if (IS_SUBCOMMAND_CLASS (SUBCL_UPDATE))
2541 USAGE_ERROR ((0, 0, _("Cannot update compressed archives")));
2542 if (subcommand_option == CAT_SUBCOMMAND)
2543 USAGE_ERROR ((0, 0, _("Cannot concatenate compressed archives")));
2546 /* It is no harm to use --pax-option on non-pax archives in archive
2547 reading mode. It may even be useful, since it allows to override
2548 file attributes from tar headers. Therefore I allow such usage.
2551 && archive_format != POSIX_FORMAT
2552 && !IS_SUBCOMMAND_CLASS (SUBCL_READ))
2553 USAGE_ERROR ((0, 0, _("--pax-option can be used only on POSIX archives")));
2555 /* star creates non-POSIX typed archives with xattr support, so allow the
2556 extra headers when reading */
2557 if ((acls_option > 0)
2558 && archive_format != POSIX_FORMAT
2559 && !IS_SUBCOMMAND_CLASS (SUBCL_READ))
2560 USAGE_ERROR ((0, 0, _("--acls can be used only on POSIX archives")));
2562 if ((selinux_context_option > 0)
2563 && archive_format != POSIX_FORMAT
2564 && !IS_SUBCOMMAND_CLASS (SUBCL_READ))
2565 USAGE_ERROR ((0, 0, _("--selinux can be used only on POSIX archives")));
2567 if ((xattrs_option > 0)
2568 && archive_format != POSIX_FORMAT
2569 && !IS_SUBCOMMAND_CLASS (SUBCL_READ))
2570 USAGE_ERROR ((0, 0, _("--xattrs can be used only on POSIX archives")));
2572 if (starting_file_option && !IS_SUBCOMMAND_CLASS (SUBCL_READ))
2573 option_conflict_error ("--starting-file",
2574 subcommand_string (subcommand_option));
2576 if (same_order_option && !IS_SUBCOMMAND_CLASS (SUBCL_READ))
2577 option_conflict_error ("--same-order",
2578 subcommand_string (subcommand_option));
2580 if (one_top_level_option)
2584 if (absolute_names_option)
2585 option_conflict_error ("--one-top-level", "--absolute-names");
2587 if (!one_top_level_dir)
2589 /* If the user wants to guarantee that everything is under one
2590 directory, determine its name now and let it be created later. */
2591 base = base_name (archive_name_array[0]);
2592 one_top_level_dir = strip_compression_suffix (base);
2595 if (!one_top_level_dir)
2597 _("Cannot deduce top-level directory name; "
2598 "please set it explicitly with --one-top-level=DIR")));
2602 /* If ready to unlink hierarchies, so we are for simpler files. */
2603 if (recursive_unlink_option)
2604 old_files_option = UNLINK_FIRST_OLD_FILES;
2606 /* Flags for accessing files to be read from or copied into. POSIX says
2607 O_NONBLOCK has unspecified effect on most types of files, but in
2608 practice it never harms and sometimes helps. */
2610 int base_open_flags =
2611 (O_BINARY | O_CLOEXEC | O_NOCTTY | O_NONBLOCK
2612 | (dereference_option ? 0 : O_NOFOLLOW)
2613 | (atime_preserve_option == system_atime_preserve ? O_NOATIME : 0));
2614 open_read_flags = O_RDONLY | base_open_flags;
2615 open_searchdir_flags = O_SEARCH | O_DIRECTORY | base_open_flags;
2617 fstatat_flags = dereference_option ? 0 : AT_SYMLINK_NOFOLLOW;
2619 if (subcommand_option == TEST_LABEL_SUBCOMMAND)
2621 /* --test-label is silent if the user has specified the label name to
2623 if (!args.input_files)
2626 else if (utc_option)
2629 if (tape_length_option && tape_length_option < record_size)
2630 USAGE_ERROR ((0, 0, _("Volume length cannot be less than record size")));
2632 if (same_order_option && listed_incremental_option)
2633 option_conflict_error ("--preserve-order", "--listed-incremental");
2635 /* Forbid using -c with no input files whatsoever. Check that '-f -',
2636 explicit or implied, is used correctly. */
2638 switch (subcommand_option)
2640 case CREATE_SUBCOMMAND:
2641 if (!args.input_files && !files_from_option)
2643 _("Cowardly refusing to create an empty archive")));
2644 if (args.compress_autodetect && archive_names
2645 && strcmp (archive_name_array[0], "-"))
2646 set_compression_program_by_suffix (archive_name_array[0],
2647 use_compress_program_option);
2650 case EXTRACT_SUBCOMMAND:
2651 case LIST_SUBCOMMAND:
2652 case DIFF_SUBCOMMAND:
2653 case TEST_LABEL_SUBCOMMAND:
2654 for (archive_name_cursor = archive_name_array;
2655 archive_name_cursor < archive_name_array + archive_names;
2656 archive_name_cursor++)
2657 if (!strcmp (*archive_name_cursor, "-"))
2658 request_stdin ("-f");
2661 case CAT_SUBCOMMAND:
2662 case UPDATE_SUBCOMMAND:
2663 case APPEND_SUBCOMMAND:
2664 for (archive_name_cursor = archive_name_array;
2665 archive_name_cursor < archive_name_array + archive_names;
2666 archive_name_cursor++)
2667 if (!strcmp (*archive_name_cursor, "-"))
2669 _("Options '-Aru' are incompatible with '-f -'")));
2675 /* Initialize stdlis */
2676 if (index_file_name)
2678 stdlis = fopen (index_file_name, "w");
2680 open_fatal (index_file_name);
2683 stdlis = to_stdout_option ? stderr : stdout;
2685 archive_name_cursor = archive_name_array;
2687 /* Prepare for generating backup names. */
2689 if (args.backup_suffix_string)
2690 simple_backup_suffix = xstrdup (args.backup_suffix_string);
2694 backup_type = xget_version ("--backup", args.version_control_string);
2695 /* No backup is needed either if explicitely disabled or if
2696 the extracted files are not being written to disk. */
2697 if (backup_type == no_backups || EXTRACT_OVER_PIPE)
2698 backup_option = false;
2701 checkpoint_finish_compile ();
2703 report_textual_dates (&args);
2707 more_options (int argc, char **argv)
2710 if (argp_parse (&argp, argc, argv, ARGP_IN_ORDER,
2712 exit (TAREXIT_FAILURE);
2717 /* Main routine for tar. */
2719 main (int argc, char **argv)
2722 set_program_name (argv[0]);
2724 setlocale (LC_ALL, "");
2725 bindtextdomain (PACKAGE, LOCALEDIR);
2726 textdomain (PACKAGE);
2728 exit_failure = TAREXIT_FAILURE;
2729 exit_status = TAREXIT_SUCCESS;
2730 error_hook = checkpoint_flush_actions;
2732 filename_terminator = '\n';
2733 set_quoting_style (0, DEFAULT_QUOTING_STYLE);
2735 /* Make sure we have first three descriptors available */
2738 /* Pre-allocate a few structures. */
2740 allocated_archive_names = 10;
2741 archive_name_array =
2742 xmalloc (sizeof (const char *) * allocated_archive_names);
2745 /* System V fork+wait does not work if SIGCHLD is ignored. */
2746 signal (SIGCHLD, SIG_DFL);
2748 /* Try to disable the ability to unlink a directory. */
2749 priv_set_remove_linkdir ();
2751 /* Decode options. */
2753 decode_options (argc, argv);
2757 /* Main command execution. */
2759 if (volno_file_option)
2760 init_volume_number ();
2762 switch (subcommand_option)
2764 case UNKNOWN_SUBCOMMAND:
2766 _("You must specify one of the '-Acdtrux', '--delete' or '--test-label' options")));
2768 case CAT_SUBCOMMAND:
2769 case UPDATE_SUBCOMMAND:
2770 case APPEND_SUBCOMMAND:
2774 case DELETE_SUBCOMMAND:
2775 delete_archive_members ();
2778 case CREATE_SUBCOMMAND:
2782 case EXTRACT_SUBCOMMAND:
2784 read_and (extract_archive);
2786 /* FIXME: should extract_finish () even if an ordinary signal is
2792 case LIST_SUBCOMMAND:
2793 read_and (list_archive);
2796 case DIFF_SUBCOMMAND:
2798 read_and (diff_archive);
2801 case TEST_LABEL_SUBCOMMAND:
2802 test_archive_label ();
2805 checkpoint_finish ();
2808 print_total_stats ();
2810 if (check_links_option)
2813 if (volno_file_option)
2814 closeout_volume_number ();
2816 /* Dispose of allocated memory, and return. */
2818 free (archive_name_array);
2819 xattrs_clear_setup ();
2822 if (exit_status == TAREXIT_FAILURE)
2823 error (0, 0, _("Exiting with failure status due to previous errors"));
2825 if (stdlis == stdout)
2827 else if (ferror (stderr) || fclose (stderr) != 0)
2828 set_exit_status (TAREXIT_FAILURE);
2834 tar_stat_init (struct tar_stat_info *st)
2836 memset (st, 0, sizeof (*st));
2839 /* Close the stream or file descriptor associated with ST, and remove
2840 all traces of it from ST. Return true if successful, false (with a
2841 diagnostic) otherwise. */
2843 tar_stat_close (struct tar_stat_info *st)
2845 int status = (st->dirstream ? closedir (st->dirstream)
2846 : 0 < st->fd ? close (st->fd)
2855 close_diag (st->orig_file_name);
2861 tar_stat_destroy (struct tar_stat_info *st)
2863 tar_stat_close (st);
2864 xheader_xattr_free (st->xattr_map, st->xattr_map_size);
2865 free (st->orig_file_name);
2866 free (st->file_name);
2867 free (st->link_name);
2870 free (st->cntx_name);
2871 free (st->acls_a_ptr);
2872 free (st->acls_d_ptr);
2873 free (st->sparse_map);
2875 xheader_destroy (&st->xhdr);
2876 info_free_exclist (st);
2877 memset (st, 0, sizeof (*st));
2880 /* Format mask for all available formats that support nanosecond
2881 timestamp resolution. */
2882 #define NS_PRECISION_FORMAT_MASK FORMAT_MASK (POSIX_FORMAT)
2884 /* Same as timespec_cmp, but ignore nanoseconds if current archive
2885 format does not provide sufficient resolution. */
2887 tar_timespec_cmp (struct timespec a, struct timespec b)
2889 if (!(FORMAT_MASK (current_format) & NS_PRECISION_FORMAT_MASK))
2890 a.tv_nsec = b.tv_nsec = 0;
2891 return timespec_cmp (a, b);
2894 /* Set tar exit status to VAL, unless it is already indicating
2895 a more serious condition. This relies on the fact that the
2896 values of TAREXIT_ constants are ranged by severity. */
2898 set_exit_status (int val)
2900 if (val > exit_status)