1 /* A tar (tape archiver) program.
3 Copyright 1988, 1992-1997, 1999-2001, 2003-2007, 2012-2013 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>
55 /* Local declarations. */
57 #ifndef DEFAULT_ARCHIVE_FORMAT
58 # define DEFAULT_ARCHIVE_FORMAT GNU_FORMAT
61 #ifndef DEFAULT_ARCHIVE
62 # define DEFAULT_ARCHIVE "tar.out"
65 #ifndef DEFAULT_BLOCKING
66 # define DEFAULT_BLOCKING 20
69 /* Print a message if not all links are dumped */
70 static int check_links_option;
72 /* Number of allocated tape drive names. */
73 static size_t allocated_archive_names;
78 /* Name of option using stdin. */
79 static const char *stdin_used_by;
81 /* Doesn't return if stdin already requested. */
83 request_stdin (const char *option)
86 USAGE_ERROR ((0, 0, _("Options '-%s' and '-%s' both want standard input"),
87 stdin_used_by, option));
89 stdin_used_by = option;
92 extern int rpmatch (char const *response);
94 /* Returns true if and only if the user typed an affirmative response. */
96 confirm (const char *message_action, const char *message_name)
98 static FILE *confirm_file;
99 static int confirm_file_EOF;
104 if (archive == 0 || stdin_used_by)
106 confirm_file = fopen (TTY_NAME, "r");
108 open_fatal (TTY_NAME);
112 request_stdin ("-w");
113 confirm_file = stdin;
117 fprintf (stdlis, "%s %s?", message_action, quote (message_name));
120 if (!confirm_file_EOF)
122 char *response = NULL;
123 size_t response_size = 0;
124 if (getline (&response, &response_size, confirm_file) < 0)
125 confirm_file_EOF = 1;
127 status = rpmatch (response) > 0;
131 if (confirm_file_EOF)
133 fputc ('\n', stdlis);
140 static struct fmttab {
142 enum archive_format fmt;
145 { "oldgnu", OLDGNU_FORMAT },
146 { "ustar", USTAR_FORMAT },
147 { "posix", POSIX_FORMAT },
148 #if 0 /* not fully supported yet */
149 { "star", STAR_FORMAT },
151 { "gnu", GNU_FORMAT },
152 { "pax", POSIX_FORMAT }, /* An alias for posix */
157 set_archive_format (char const *name)
159 struct fmttab const *p;
161 for (p = fmttab; strcmp (p->name, name) != 0; )
163 USAGE_ERROR ((0, 0, _("%s: Invalid archive format"),
164 quotearg_colon (name)));
166 archive_format = p->fmt;
170 archive_format_string (enum archive_format fmt)
172 struct fmttab const *p;
174 for (p = fmttab; p->name; p++)
180 #define FORMAT_MASK(n) (1<<(n))
183 assert_format(unsigned fmt_mask)
185 if ((FORMAT_MASK (archive_format) & fmt_mask) == 0)
187 _("GNU features wanted on incompatible archive format")));
191 subcommand_string (enum subcommand c)
195 case UNKNOWN_SUBCOMMAND:
198 case APPEND_SUBCOMMAND:
204 case CREATE_SUBCOMMAND:
207 case DELETE_SUBCOMMAND:
210 case DIFF_SUBCOMMAND:
213 case EXTRACT_SUBCOMMAND:
216 case LIST_SUBCOMMAND:
219 case UPDATE_SUBCOMMAND:
222 case TEST_LABEL_SUBCOMMAND:
223 return "--test-label";
229 tar_list_quoting_styles (struct obstack *stk, char const *prefix)
232 size_t prefixlen = strlen (prefix);
234 for (i = 0; quoting_style_args[i]; i++)
236 obstack_grow (stk, prefix, prefixlen);
237 obstack_grow (stk, quoting_style_args[i],
238 strlen (quoting_style_args[i]));
239 obstack_1grow (stk, '\n');
244 tar_set_quoting_style (char *arg)
248 for (i = 0; quoting_style_args[i]; i++)
249 if (strcmp (arg, quoting_style_args[i]) == 0)
251 set_quoting_style (NULL, i);
255 _("Unknown quoting style '%s'. Try '%s --quoting-style=help' to get a list."), arg, program_invocation_short_name));
263 ACLS_OPTION = CHAR_MAX + 1,
265 ATIME_PRESERVE_OPTION,
269 CHECKPOINT_ACTION_OPTION,
270 DELAY_DIRECTORY_RESTORE_OPTION,
271 HARD_DEREFERENCE_OPTION,
273 EXCLUDE_BACKUPS_OPTION,
274 EXCLUDE_CACHES_OPTION,
275 EXCLUDE_CACHES_UNDER_OPTION,
276 EXCLUDE_CACHES_ALL_OPTION,
279 EXCLUDE_TAG_UNDER_OPTION,
280 EXCLUDE_TAG_ALL_OPTION,
286 IGNORE_COMMAND_ERROR_OPTION,
287 IGNORE_FAILED_READ_OPTION,
289 KEEP_DIRECTORY_SYMLINK_OPTION,
290 KEEP_NEWER_FILES_OPTION,
300 NO_AUTO_COMPRESS_OPTION,
301 NO_CHECK_DEVICE_OPTION,
302 NO_DELAY_DIRECTORY_RESTORE_OPTION,
303 NO_IGNORE_CASE_OPTION,
304 NO_IGNORE_COMMAND_ERROR_OPTION,
306 NO_OVERWRITE_DIR_OPTION,
307 NO_QUOTE_CHARS_OPTION,
309 NO_SAME_OWNER_OPTION,
310 NO_SAME_PERMISSIONS_OPTION,
312 NO_SELINUX_CONTEXT_OPTION,
314 NO_WILDCARDS_MATCH_SLASH_OPTION,
318 NUMERIC_OWNER_OPTION,
321 ONE_FILE_SYSTEM_OPTION,
322 OVERWRITE_DIR_OPTION,
329 QUOTING_STYLE_OPTION,
332 RECURSIVE_UNLINK_OPTION,
338 SELINUX_CONTEXT_OPTION,
339 SHOW_DEFAULTS_OPTION,
340 SHOW_OMITTED_DIRS_OPTION,
341 SHOW_SNAPSHOT_FIELD_RANGES_OPTION,
342 SHOW_TRANSFORMED_NAMES_OPTION,
343 SKIP_OLD_FILES_OPTION,
344 SPARSE_VERSION_OPTION,
345 STRIP_COMPONENTS_OPTION,
355 WILDCARDS_MATCH_SLASH_OPTION,
362 const char *argp_program_version = "tar (" PACKAGE_NAME ") " VERSION;
363 const char *argp_program_bug_address = "<" PACKAGE_BUGREPORT ">";
364 static char const doc[] = N_("\
365 GNU 'tar' saves many files together into a single tape or disk archive, \
366 and can restore individual files from the archive.\n\
369 tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n\
370 tar -tvf archive.tar # List all files in archive.tar verbosely.\n\
371 tar -xf archive.tar # Extract all files from archive.tar.\n")
373 N_("The backup suffix is '~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
374 The version control may be set with --backup or VERSION_CONTROL, values are:\n\n\
375 none, off never make backups\n\
376 t, numbered make numbered backups\n\
377 nil, existing numbered if numbered backups exist, simple otherwise\n\
378 never, simple always make simple backups\n");
383 Available option letters are DEQY and eqy. Consider the following
386 [For Solaris tar compatibility =/= Is it important at all?]
387 e exit immediately with a nonzero exit status if unexpected errors occur
388 E use extended headers (--format=posix)
390 [q alias for --occurrence=1 =/= this would better be used for quiet?]
392 y per-file gzip compression
393 Y per-block gzip compression.
395 Additionally, the 'n' letter is assigned for option --seek, which
396 is probably not needed and should be marked as deprecated, so that
397 -n may become available in the future.
400 static struct argp_option options[] = {
403 N_("Main operation mode:"), GRID },
406 N_("list the contents of an archive"), GRID+1 },
407 {"extract", 'x', 0, 0,
408 N_("extract files from an archive"), GRID+1 },
409 {"get", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
410 {"create", 'c', 0, 0,
411 N_("create a new archive"), GRID+1 },
413 N_("find differences between archive and file system"), GRID+1 },
414 {"compare", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
415 {"append", 'r', 0, 0,
416 N_("append files to the end of an archive"), GRID+1 },
417 {"update", 'u', 0, 0,
418 N_("only append files newer than copy in archive"), GRID+1 },
419 {"catenate", 'A', 0, 0,
420 N_("append tar files to an archive"), GRID+1 },
421 {"concatenate", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
422 {"delete", DELETE_OPTION, 0, 0,
423 N_("delete from the archive (not on mag tapes!)"), GRID+1 },
424 {"test-label", TEST_LABEL_OPTION, NULL, 0,
425 N_("test the archive volume label and exit"), GRID+1 },
430 N_("Operation modifiers:"), GRID },
432 {"sparse", 'S', 0, 0,
433 N_("handle sparse files efficiently"), GRID+1 },
434 {"sparse-version", SPARSE_VERSION_OPTION, N_("MAJOR[.MINOR]"), 0,
435 N_("set version of the sparse format to use (implies --sparse)"), GRID+1},
436 {"incremental", 'G', 0, 0,
437 N_("handle old GNU-format incremental backup"), GRID+1 },
438 {"listed-incremental", 'g', N_("FILE"), 0,
439 N_("handle new GNU-format incremental backup"), GRID+1 },
440 {"level", LEVEL_OPTION, N_("NUMBER"), 0,
441 N_("dump level for created listed-incremental archive"), GRID+1 },
442 {"ignore-failed-read", IGNORE_FAILED_READ_OPTION, 0, 0,
443 N_("do not exit with nonzero on unreadable files"), GRID+1 },
444 {"occurrence", OCCURRENCE_OPTION, N_("NUMBER"), OPTION_ARG_OPTIONAL,
445 N_("process only the NUMBERth occurrence of each file in the archive;"
446 " this option is valid only in conjunction with one of the subcommands"
447 " --delete, --diff, --extract or --list and when a list of files"
448 " is given either on the command line or via the -T option;"
449 " NUMBER defaults to 1"), GRID+1 },
450 {"seek", 'n', NULL, 0,
451 N_("archive is seekable"), GRID+1 },
452 {"no-seek", NO_SEEK_OPTION, NULL, 0,
453 N_("archive is not seekable"), GRID+1 },
454 {"no-check-device", NO_CHECK_DEVICE_OPTION, NULL, 0,
455 N_("do not check device numbers when creating incremental archives"),
457 {"check-device", CHECK_DEVICE_OPTION, NULL, 0,
458 N_("check device numbers when creating incremental archives (default)"),
464 N_("Overwrite control:"), GRID },
466 {"verify", 'W', 0, 0,
467 N_("attempt to verify the archive after writing it"), GRID+1 },
468 {"remove-files", REMOVE_FILES_OPTION, 0, 0,
469 N_("remove files after adding them to the archive"), GRID+1 },
470 {"keep-old-files", 'k', 0, 0,
471 N_("don't replace existing files when extracting, "
472 "treat them as errors"), GRID+1 },
473 {"skip-old-files", SKIP_OLD_FILES_OPTION, 0, 0,
474 N_("don't replace existing files when extracting, silently skip over them"),
476 {"keep-newer-files", KEEP_NEWER_FILES_OPTION, 0, 0,
477 N_("don't replace existing files that are newer than their archive copies"), GRID+1 },
478 {"overwrite", OVERWRITE_OPTION, 0, 0,
479 N_("overwrite existing files when extracting"), GRID+1 },
480 {"unlink-first", 'U', 0, 0,
481 N_("remove each file prior to extracting over it"), GRID+1 },
482 {"recursive-unlink", RECURSIVE_UNLINK_OPTION, 0, 0,
483 N_("empty hierarchies prior to extracting directory"), GRID+1 },
484 {"no-overwrite-dir", NO_OVERWRITE_DIR_OPTION, 0, 0,
485 N_("preserve metadata of existing directories"), GRID+1 },
486 {"overwrite-dir", OVERWRITE_DIR_OPTION, 0, 0,
487 N_("overwrite metadata of existing directories when extracting (default)"),
489 {"keep-directory-symlink", KEEP_DIRECTORY_SYMLINK_OPTION, 0, 0,
490 N_("preserve existing symlinks to directories when extracting"),
496 N_("Select output stream:"), GRID },
498 {"to-stdout", 'O', 0, 0,
499 N_("extract files to standard output"), GRID+1 },
500 {"to-command", TO_COMMAND_OPTION, N_("COMMAND"), 0,
501 N_("pipe extracted files to another program"), GRID+1 },
502 {"ignore-command-error", IGNORE_COMMAND_ERROR_OPTION, 0, 0,
503 N_("ignore exit codes of children"), GRID+1 },
504 {"no-ignore-command-error", NO_IGNORE_COMMAND_ERROR_OPTION, 0, 0,
505 N_("treat non-zero exit codes of children as error"), GRID+1 },
510 N_("Handling of file attributes:"), GRID },
512 {"owner", OWNER_OPTION, N_("NAME"), 0,
513 N_("force NAME as owner for added files"), GRID+1 },
514 {"group", GROUP_OPTION, N_("NAME"), 0,
515 N_("force NAME as group for added files"), GRID+1 },
516 {"mtime", MTIME_OPTION, N_("DATE-OR-FILE"), 0,
517 N_("set mtime for added files from DATE-OR-FILE"), GRID+1 },
518 {"mode", MODE_OPTION, N_("CHANGES"), 0,
519 N_("force (symbolic) mode CHANGES for added files"), GRID+1 },
520 {"atime-preserve", ATIME_PRESERVE_OPTION,
521 N_("METHOD"), OPTION_ARG_OPTIONAL,
522 N_("preserve access times on dumped files, either by restoring the times"
523 " after reading (METHOD='replace'; default) or by not setting the times"
524 " in the first place (METHOD='system')"), GRID+1 },
526 N_("don't extract file modified time"), GRID+1 },
527 {"same-owner", SAME_OWNER_OPTION, 0, 0,
528 N_("try extracting files with the same ownership as exists in the archive (default for superuser)"), GRID+1 },
529 {"no-same-owner", NO_SAME_OWNER_OPTION, 0, 0,
530 N_("extract files as yourself (default for ordinary users)"), GRID+1 },
531 {"numeric-owner", NUMERIC_OWNER_OPTION, 0, 0,
532 N_("always use numbers for user/group names"), GRID+1 },
533 {"preserve-permissions", 'p', 0, 0,
534 N_("extract information about file permissions (default for superuser)"),
536 {"same-permissions", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
537 {"no-same-permissions", NO_SAME_PERMISSIONS_OPTION, 0, 0,
538 N_("apply the user's umask when extracting permissions from the archive (default for ordinary users)"), GRID+1 },
539 {"preserve-order", 's', 0, 0,
540 N_("member arguments are listed in the same order as the "
541 "files in the archive"), GRID+1 },
542 {"same-order", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
543 {"preserve", PRESERVE_OPTION, 0, 0,
544 N_("same as both -p and -s"), GRID+1 },
545 {"delay-directory-restore", DELAY_DIRECTORY_RESTORE_OPTION, 0, 0,
546 N_("delay setting modification times and permissions of extracted"
547 " directories until the end of extraction"), GRID+1 },
548 {"no-delay-directory-restore", NO_DELAY_DIRECTORY_RESTORE_OPTION, 0, 0,
549 N_("cancel the effect of --delay-directory-restore option"), GRID+1 },
554 N_("Handling of extended file attributes:"), GRID },
556 {"xattrs", XATTR_OPTION, 0, 0,
557 N_("Enable extended attributes support"), GRID+1 },
558 {"no-xattrs", NO_XATTR_OPTION, 0, 0,
559 N_("Disable extended attributes support"), GRID+1 },
560 {"xattrs-include", XATTR_INCLUDE, N_("MASK"), 0,
561 N_("specify the include pattern for xattr keys"), GRID+1 },
562 {"xattrs-exclude", XATTR_EXCLUDE, N_("MASK"), 0,
563 N_("specify the exclude pattern for xattr keys"), GRID+1 },
564 {"selinux", SELINUX_CONTEXT_OPTION, 0, 0,
565 N_("Enable the SELinux context support"), GRID+1 },
566 {"no-selinux", NO_SELINUX_CONTEXT_OPTION, 0, 0,
567 N_("Disable the SELinux context support"), GRID+1 },
568 {"acls", ACLS_OPTION, 0, 0,
569 N_("Enable the POSIX ACLs support"), GRID+1 },
570 {"no-acls", NO_ACLS_OPTION, 0, 0,
571 N_("Disable the POSIX ACLs support"), GRID+1 },
576 N_("Device selection and switching:"), GRID },
578 {"file", 'f', N_("ARCHIVE"), 0,
579 N_("use archive file or device ARCHIVE"), GRID+1 },
580 {"force-local", FORCE_LOCAL_OPTION, 0, 0,
581 N_("archive file is local even if it has a colon"), GRID+1 },
582 {"rmt-command", RMT_COMMAND_OPTION, N_("COMMAND"), 0,
583 N_("use given rmt COMMAND instead of rmt"), GRID+1 },
584 {"rsh-command", RSH_COMMAND_OPTION, N_("COMMAND"), 0,
585 N_("use remote COMMAND instead of rsh"), GRID+1 },
587 {"-[0-7][lmh]", 0, NULL, OPTION_DOC, /* It is OK, since 'name' will never be
589 N_("specify drive and density"), GRID+1 },
591 {NULL, '0', NULL, OPTION_HIDDEN, NULL, GRID+1 },
592 {NULL, '1', NULL, OPTION_HIDDEN, NULL, GRID+1 },
593 {NULL, '2', NULL, OPTION_HIDDEN, NULL, GRID+1 },
594 {NULL, '3', NULL, OPTION_HIDDEN, NULL, GRID+1 },
595 {NULL, '4', NULL, OPTION_HIDDEN, NULL, GRID+1 },
596 {NULL, '5', NULL, OPTION_HIDDEN, NULL, GRID+1 },
597 {NULL, '6', NULL, OPTION_HIDDEN, NULL, GRID+1 },
598 {NULL, '7', NULL, OPTION_HIDDEN, NULL, GRID+1 },
599 {NULL, '8', NULL, OPTION_HIDDEN, NULL, GRID+1 },
600 {NULL, '9', NULL, OPTION_HIDDEN, NULL, GRID+1 },
602 {"multi-volume", 'M', 0, 0,
603 N_("create/list/extract multi-volume archive"), GRID+1 },
604 {"tape-length", 'L', N_("NUMBER"), 0,
605 N_("change tape after writing NUMBER x 1024 bytes"), GRID+1 },
606 {"info-script", 'F', N_("NAME"), 0,
607 N_("run script at end of each tape (implies -M)"), GRID+1 },
608 {"new-volume-script", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
609 {"volno-file", VOLNO_FILE_OPTION, N_("FILE"), 0,
610 N_("use/update the volume number in FILE"), GRID+1 },
615 N_("Device blocking:"), GRID },
617 {"blocking-factor", 'b', N_("BLOCKS"), 0,
618 N_("BLOCKS x 512 bytes per record"), GRID+1 },
619 {"record-size", RECORD_SIZE_OPTION, N_("NUMBER"), 0,
620 N_("NUMBER of bytes per record, multiple of 512"), GRID+1 },
621 {"ignore-zeros", 'i', 0, 0,
622 N_("ignore zeroed blocks in archive (means EOF)"), GRID+1 },
623 {"read-full-records", 'B', 0, 0,
624 N_("reblock as we read (for 4.2BSD pipes)"), GRID+1 },
629 N_("Archive format selection:"), GRID },
631 {"format", 'H', N_("FORMAT"), 0,
632 N_("create archive of the given format"), GRID+1 },
634 {NULL, 0, NULL, 0, N_("FORMAT is one of the following:"), GRID+2 },
635 {" v7", 0, NULL, OPTION_DOC|OPTION_NO_TRANS, N_("old V7 tar format"),
637 {" oldgnu", 0, NULL, OPTION_DOC|OPTION_NO_TRANS,
638 N_("GNU format as per tar <= 1.12"), GRID+3 },
639 {" gnu", 0, NULL, OPTION_DOC|OPTION_NO_TRANS,
640 N_("GNU tar 1.13.x format"), GRID+3 },
641 {" ustar", 0, NULL, OPTION_DOC|OPTION_NO_TRANS,
642 N_("POSIX 1003.1-1988 (ustar) format"), GRID+3 },
643 {" pax", 0, NULL, OPTION_DOC|OPTION_NO_TRANS,
644 N_("POSIX 1003.1-2001 (pax) format"), GRID+3 },
645 {" posix", 0, NULL, OPTION_DOC|OPTION_NO_TRANS, N_("same as pax"), GRID+3 },
647 {"old-archive", OLD_ARCHIVE_OPTION, 0, 0, /* FIXME */
648 N_("same as --format=v7"), GRID+8 },
649 {"portability", 0, 0, OPTION_ALIAS, NULL, GRID+8 },
650 {"posix", POSIX_OPTION, 0, 0,
651 N_("same as --format=posix"), GRID+8 },
652 {"pax-option", PAX_OPTION, N_("keyword[[:]=value][,keyword[[:]=value]]..."), 0,
653 N_("control pax keywords"), GRID+8 },
654 {"label", 'V', N_("TEXT"), 0,
655 N_("create archive with volume name TEXT; at list/extract time, use TEXT as a globbing pattern for volume name"), GRID+8 },
660 N_("Compression options:"), GRID },
661 {"auto-compress", 'a', 0, 0,
662 N_("use archive suffix to determine the compression program"), GRID+1 },
663 {"no-auto-compress", NO_AUTO_COMPRESS_OPTION, 0, 0,
664 N_("do not use archive suffix to determine the compression program"),
666 {"use-compress-program", 'I', N_("PROG"), 0,
667 N_("filter through PROG (must accept -d)"), GRID+1 },
668 /* Note: docstrings for the options below are generated by tar_help_filter */
669 {"bzip2", 'j', 0, 0, NULL, GRID+1 },
670 {"gzip", 'z', 0, 0, NULL, GRID+1 },
671 {"gunzip", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
672 {"ungzip", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
673 {"compress", 'Z', 0, 0, NULL, GRID+1 },
674 {"uncompress", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
675 {"lzip", LZIP_OPTION, 0, 0, NULL, GRID+1 },
676 {"lzma", LZMA_OPTION, 0, 0, NULL, GRID+1 },
677 {"lzop", LZOP_OPTION, 0, 0, NULL, GRID+1 },
678 {"xz", 'J', 0, 0, NULL, GRID+1 },
683 N_("Local file selection:"), GRID },
685 {"add-file", ARGP_KEY_ARG, N_("FILE"), 0,
686 N_("add given FILE to the archive (useful if its name starts with a dash)"), GRID+1 },
687 {"directory", 'C', N_("DIR"), 0,
688 N_("change to directory DIR"), GRID+1 },
689 {"files-from", 'T', N_("FILE"), 0,
690 N_("get names to extract or create from FILE"), GRID+1 },
691 {"null", NULL_OPTION, 0, 0,
692 N_("-T reads null-terminated names, disable -C"), GRID+1 },
693 {"no-null", NO_NULL_OPTION, 0, 0,
694 N_("disable the effect of the previous --null option"), GRID+1 },
695 {"unquote", UNQUOTE_OPTION, 0, 0,
696 N_("unquote filenames read with -T (default)"), GRID+1 },
697 {"no-unquote", NO_UNQUOTE_OPTION, 0, 0,
698 N_("do not unquote filenames read with -T"), GRID+1 },
699 {"exclude", EXCLUDE_OPTION, N_("PATTERN"), 0,
700 N_("exclude files, given as a PATTERN"), GRID+1 },
701 {"exclude-from", 'X', N_("FILE"), 0,
702 N_("exclude patterns listed in FILE"), GRID+1 },
703 {"exclude-caches", EXCLUDE_CACHES_OPTION, 0, 0,
704 N_("exclude contents of directories containing CACHEDIR.TAG, "
705 "except for the tag file itself"), GRID+1 },
706 {"exclude-caches-under", EXCLUDE_CACHES_UNDER_OPTION, 0, 0,
707 N_("exclude everything under directories containing CACHEDIR.TAG"),
709 {"exclude-caches-all", EXCLUDE_CACHES_ALL_OPTION, 0, 0,
710 N_("exclude directories containing CACHEDIR.TAG"), GRID+1 },
711 {"exclude-tag", EXCLUDE_TAG_OPTION, N_("FILE"), 0,
712 N_("exclude contents of directories containing FILE, except"
713 " for FILE itself"), GRID+1 },
714 {"exclude-tag-under", EXCLUDE_TAG_UNDER_OPTION, N_("FILE"), 0,
715 N_("exclude everything under directories containing FILE"), GRID+1 },
716 {"exclude-tag-all", EXCLUDE_TAG_ALL_OPTION, N_("FILE"), 0,
717 N_("exclude directories containing FILE"), GRID+1 },
718 {"exclude-vcs", EXCLUDE_VCS_OPTION, NULL, 0,
719 N_("exclude version control system directories"), GRID+1 },
720 {"exclude-backups", EXCLUDE_BACKUPS_OPTION, NULL, 0,
721 N_("exclude backup and lock files"), GRID+1 },
722 {"no-recursion", NO_RECURSION_OPTION, 0, 0,
723 N_("avoid descending automatically in directories"), GRID+1 },
724 {"one-file-system", ONE_FILE_SYSTEM_OPTION, 0, 0,
725 N_("stay in local file system when creating archive"), GRID+1 },
726 {"recursion", RECURSION_OPTION, 0, 0,
727 N_("recurse into directories (default)"), GRID+1 },
728 {"absolute-names", 'P', 0, 0,
729 N_("don't strip leading '/'s from file names"), GRID+1 },
730 {"dereference", 'h', 0, 0,
731 N_("follow symlinks; archive and dump the files they point to"), GRID+1 },
732 {"hard-dereference", HARD_DEREFERENCE_OPTION, 0, 0,
733 N_("follow hard links; archive and dump the files they refer to"), GRID+1 },
734 {"starting-file", 'K', N_("MEMBER-NAME"), 0,
735 N_("begin at member MEMBER-NAME when reading the archive"), GRID+1 },
736 {"newer", 'N', N_("DATE-OR-FILE"), 0,
737 N_("only store files newer than DATE-OR-FILE"), GRID+1 },
738 {"after-date", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
739 {"newer-mtime", NEWER_MTIME_OPTION, N_("DATE"), 0,
740 N_("compare date and time when data changed only"), GRID+1 },
741 {"backup", BACKUP_OPTION, N_("CONTROL"), OPTION_ARG_OPTIONAL,
742 N_("backup before removal, choose version CONTROL"), GRID+1 },
743 {"suffix", SUFFIX_OPTION, N_("STRING"), 0,
744 N_("backup before removal, override usual suffix ('~' unless overridden by environment variable SIMPLE_BACKUP_SUFFIX)"), GRID+1 },
749 N_("File name transformations:"), GRID },
750 {"strip-components", STRIP_COMPONENTS_OPTION, N_("NUMBER"), 0,
751 N_("strip NUMBER leading components from file names on extraction"),
753 {"transform", TRANSFORM_OPTION, N_("EXPRESSION"), 0,
754 N_("use sed replace EXPRESSION to transform file names"), GRID+1 },
755 {"xform", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
760 N_("File name matching options (affect both exclude and include patterns):"),
762 {"ignore-case", IGNORE_CASE_OPTION, 0, 0,
763 N_("ignore case"), GRID+1 },
764 {"anchored", ANCHORED_OPTION, 0, 0,
765 N_("patterns match file name start"), GRID+1 },
766 {"no-anchored", NO_ANCHORED_OPTION, 0, 0,
767 N_("patterns match after any '/' (default for exclusion)"), GRID+1 },
768 {"no-ignore-case", NO_IGNORE_CASE_OPTION, 0, 0,
769 N_("case sensitive matching (default)"), GRID+1 },
770 {"wildcards", WILDCARDS_OPTION, 0, 0,
771 N_("use wildcards (default for exclusion)"), GRID+1 },
772 {"no-wildcards", NO_WILDCARDS_OPTION, 0, 0,
773 N_("verbatim string matching"), GRID+1 },
774 {"no-wildcards-match-slash", NO_WILDCARDS_MATCH_SLASH_OPTION, 0, 0,
775 N_("wildcards do not match '/'"), GRID+1 },
776 {"wildcards-match-slash", WILDCARDS_MATCH_SLASH_OPTION, 0, 0,
777 N_("wildcards match '/' (default for exclusion)"), GRID+1 },
782 N_("Informative output:"), GRID },
784 {"verbose", 'v', 0, 0,
785 N_("verbosely list files processed"), GRID+1 },
786 {"warning", WARNING_OPTION, N_("KEYWORD"), 0,
787 N_("warning control"), GRID+1 },
788 {"checkpoint", CHECKPOINT_OPTION, N_("NUMBER"), OPTION_ARG_OPTIONAL,
789 N_("display progress messages every NUMBERth record (default 10)"),
791 {"checkpoint-action", CHECKPOINT_ACTION_OPTION, N_("ACTION"), 0,
792 N_("execute ACTION on each checkpoint"),
794 {"check-links", 'l', 0, 0,
795 N_("print a message if not all links are dumped"), GRID+1 },
796 {"totals", TOTALS_OPTION, N_("SIGNAL"), OPTION_ARG_OPTIONAL,
797 N_("print total bytes after processing the archive; "
798 "with an argument - print total bytes when this SIGNAL is delivered; "
799 "Allowed signals are: SIGHUP, SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; "
800 "the names without SIG prefix are also accepted"), GRID+1 },
801 {"utc", UTC_OPTION, 0, 0,
802 N_("print file modification times in UTC"), GRID+1 },
803 {"full-time", FULL_TIME_OPTION, 0, 0,
804 N_("print file time to its full resolution"), GRID+1 },
805 {"index-file", INDEX_FILE_OPTION, N_("FILE"), 0,
806 N_("send verbose output to FILE"), GRID+1 },
807 {"block-number", 'R', 0, 0,
808 N_("show block number within archive with each message"), GRID+1 },
809 {"interactive", 'w', 0, 0,
810 N_("ask for confirmation for every action"), GRID+1 },
811 {"confirmation", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
812 {"show-defaults", SHOW_DEFAULTS_OPTION, 0, 0,
813 N_("show tar defaults"), GRID+1 },
814 {"show-snapshot-field-ranges", SHOW_SNAPSHOT_FIELD_RANGES_OPTION, 0, 0,
815 N_("show valid ranges for snapshot-file fields"), GRID+1 },
816 {"show-omitted-dirs", SHOW_OMITTED_DIRS_OPTION, 0, 0,
817 N_("when listing or extracting, list each directory that does not match search criteria"), GRID+1 },
818 {"show-transformed-names", SHOW_TRANSFORMED_NAMES_OPTION, 0, 0,
819 N_("show file or archive names after transformation"),
821 {"show-stored-names", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
822 {"quoting-style", QUOTING_STYLE_OPTION, N_("STYLE"), 0,
823 N_("set name quoting style; see below for valid STYLE values"), GRID+1 },
824 {"quote-chars", QUOTE_CHARS_OPTION, N_("STRING"), 0,
825 N_("additionally quote characters from STRING"), GRID+1 },
826 {"no-quote-chars", NO_QUOTE_CHARS_OPTION, N_("STRING"), 0,
827 N_("disable quoting for characters from STRING"), GRID+1 },
832 N_("Compatibility options:"), GRID },
835 N_("when creating, same as --old-archive; when extracting, same as --no-same-owner"), GRID+1 },
840 N_("Other options:"), GRID },
842 {"restrict", RESTRICT_OPTION, 0, 0,
843 N_("disable use of some potentially harmful options"), -1 },
849 static char const *const atime_preserve_args[] =
851 "replace", "system", NULL
854 static enum atime_preserve const atime_preserve_types[] =
856 replace_atime_preserve, system_atime_preserve
859 /* Make sure atime_preserve_types has as much entries as atime_preserve_args
860 (minus 1 for NULL guard) */
861 ARGMATCH_VERIFY (atime_preserve_args, atime_preserve_types);
863 /* Wildcard matching settings */
866 default_wildcards, /* For exclusion == enable_wildcards,
867 for inclusion == disable_wildcards */
872 struct tar_args /* Variables used during option parsing */
874 struct textual_date *textual_date; /* Keeps the arguments to --newer-mtime
875 and/or --date option if they are
877 enum wildcards wildcards; /* Wildcard settings (--wildcards/
879 int matching_flags; /* exclude_fnmatch options */
880 int include_anchored; /* Pattern anchoring options used for
882 bool o_option; /* True if -o option was given */
883 bool pax_option; /* True if --pax-option was given */
884 char const *backup_suffix_string; /* --suffix option argument */
885 char const *version_control_string; /* --backup option argument */
886 bool input_files; /* True if some input files where given */
887 int compress_autodetect; /* True if compression autodetection should
888 be attempted when creating archives */
892 #define MAKE_EXCL_OPTIONS(args) \
893 ((((args)->wildcards != disable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
894 | (args)->matching_flags \
897 #define MAKE_INCL_OPTIONS(args) \
898 ((((args)->wildcards == enable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
899 | (args)->include_anchored \
900 | (args)->matching_flags \
903 static char const * const vcs_file_table[] = {
935 static char const * const backup_file_table[] = {
943 add_exclude_array (char const * const * fv, int opts)
947 for (i = 0; fv[i]; i++)
948 add_exclude (excluded, fv[i], opts);
953 format_default_settings (void)
956 "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s"
961 archive_format_string (DEFAULT_ARCHIVE_FORMAT),
962 DEFAULT_ARCHIVE, DEFAULT_BLOCKING,
963 quoting_style_args[DEFAULT_QUOTING_STYLE],
973 set_subcommand_option (enum subcommand subcommand)
975 if (subcommand_option != UNKNOWN_SUBCOMMAND
976 && subcommand_option != subcommand)
978 _("You may not specify more than one '-Acdtrux', '--delete' or '--test-label' option")));
980 subcommand_option = subcommand;
984 set_use_compress_program_option (const char *string)
986 if (use_compress_program_option
987 && strcmp (use_compress_program_option, string) != 0)
988 USAGE_ERROR ((0, 0, _("Conflicting compression options")));
990 use_compress_program_option = string;
997 print_total_stats ();
998 #ifndef HAVE_SIGACTION
999 signal (signo, sigstat);
1004 stat_on_signal (int signo)
1006 #ifdef HAVE_SIGACTION
1008 # define SA_RESTART 0
1010 struct sigaction act;
1011 act.sa_handler = sigstat;
1012 sigemptyset (&act.sa_mask);
1013 act.sa_flags = SA_RESTART;
1014 sigaction (signo, &act, NULL);
1016 signal (signo, sigstat);
1021 set_stat_signal (const char *name)
1023 static struct sigtab
1027 } const sigtab[] = {
1028 { "SIGUSR1", SIGUSR1 },
1029 { "USR1", SIGUSR1 },
1030 { "SIGUSR2", SIGUSR2 },
1031 { "USR2", SIGUSR2 },
1032 { "SIGHUP", SIGHUP },
1034 { "SIGINT", SIGINT },
1036 { "SIGQUIT", SIGQUIT },
1039 struct sigtab const *p;
1041 for (p = sigtab; p < sigtab + sizeof (sigtab) / sizeof (sigtab[0]); p++)
1042 if (strcmp (p->name, name) == 0)
1044 stat_on_signal (p->signo);
1047 FATAL_ERROR ((0, 0, _("Unknown signal name: %s"), name));
1053 struct textual_date *next;
1060 get_date_or_file (struct tar_args *args, const char *option,
1061 const char *str, struct timespec *ts)
1063 if (FILE_SYSTEM_PREFIX_LEN (str) != 0
1068 if (stat (str, &st) != 0)
1071 USAGE_ERROR ((0, 0, _("Date sample file not found")));
1073 *ts = get_stat_mtime (&st);
1077 if (! parse_datetime (ts, str, NULL))
1079 WARN ((0, 0, _("Substituting %s for unknown date format %s"),
1080 tartime (*ts, false), quote (str)));
1086 struct textual_date *p = xmalloc (sizeof (*p));
1089 p->date = xstrdup (str);
1090 p->next = args->textual_date;
1091 args->textual_date = p;
1098 report_textual_dates (struct tar_args *args)
1100 struct textual_date *p;
1101 for (p = args->textual_date; p; )
1103 struct textual_date *next = p->next;
1106 char const *treated_as = tartime (p->ts, true);
1107 if (strcmp (p->date, treated_as) != 0)
1108 WARN ((0, 0, _("Option %s: Treating date '%s' as %s"),
1109 p->option, p->date, treated_as));
1118 static bool files_from_option; /* When set, tar will not refuse to create
1121 /* Default density numbers for [0-9][lmh] device specifications */
1123 #if defined DEVICE_PREFIX && !defined DENSITY_LETTER
1124 # ifndef LOW_DENSITY_NUM
1125 # define LOW_DENSITY_NUM 0
1128 # ifndef MID_DENSITY_NUM
1129 # define MID_DENSITY_NUM 8
1132 # ifndef HIGH_DENSITY_NUM
1133 # define HIGH_DENSITY_NUM 16
1139 tar_help_filter (int key, const char *text, void *input)
1151 s = xasprintf (_("filter the archive through %s"), BZIP2_PROGRAM);
1155 s = xasprintf (_("filter the archive through %s"), GZIP_PROGRAM);
1159 s = xasprintf (_("filter the archive through %s"), COMPRESS_PROGRAM);
1163 s = xasprintf (_("filter the archive through %s"), LZIP_PROGRAM);
1167 s = xasprintf (_("filter the archive through %s"), LZMA_PROGRAM);
1171 s = xasprintf (_("filter the archive through %s"), XZ_PROGRAM);
1174 case ARGP_KEY_HELP_EXTRA:
1178 obstack_init (&stk);
1179 tstr = _("Valid arguments for the --quoting-style option are:");
1180 obstack_grow (&stk, tstr, strlen (tstr));
1181 obstack_grow (&stk, "\n\n", 2);
1182 tar_list_quoting_styles (&stk, " ");
1183 tstr = _("\n*This* tar defaults to:\n");
1184 obstack_grow (&stk, tstr, strlen (tstr));
1185 s = format_default_settings ();
1186 obstack_grow (&stk, s, strlen (s));
1187 obstack_1grow (&stk, '\n');
1188 obstack_1grow (&stk, 0);
1189 s = xstrdup (obstack_finish (&stk));
1190 obstack_free (&stk, NULL);
1197 expand_pax_option (struct tar_args *targs, const char *arg)
1202 obstack_init (&stk);
1205 size_t seglen = strcspn (arg, ",");
1206 char *p = memchr (arg, '=', seglen);
1209 size_t len = p - arg + 1;
1210 obstack_grow (&stk, arg, len);
1212 for (++p; *p && isspace ((unsigned char) *p); p++)
1214 if (*p == '{' && p[len-1] == '}')
1217 char *tmp = xmalloc (len);
1218 memcpy (tmp, p + 1, len-2);
1220 if (get_date_or_file (targs, "--pax-option", tmp, &ts) == 0)
1222 char buf[TIMESPEC_STRSIZE_BOUND];
1223 char const *s = code_timespec (ts, buf);
1224 obstack_grow (&stk, s, strlen (s));
1227 obstack_grow (&stk, p, len);
1231 obstack_grow (&stk, p, len);
1234 obstack_grow (&stk, arg, seglen);
1239 obstack_1grow (&stk, *arg);
1243 obstack_1grow (&stk, 0);
1244 res = xstrdup (obstack_finish (&stk));
1245 obstack_free (&stk, NULL);
1251 parse_owner_group (char *arg, uintmax_t field_max, char const **name_option)
1253 uintmax_t u = UINTMAX_MAX;
1255 char const *name = 0;
1256 char const *invalid_num = 0;
1257 char *colon = strchr (arg, ':');
1261 char const *num = colon + 1;
1265 if (num && (! (xstrtoumax (num, &end, 10, &u, "") == LONGINT_OK
1266 && u <= field_max)))
1272 switch ('0' <= *arg && *arg <= '9'
1273 ? xstrtoumax (arg, &end, 10, &u1, "")
1281 if (u1 <= field_max)
1287 case LONGINT_OVERFLOW:
1294 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (invalid_num),
1295 _("Invalid owner or group ID")));
1297 *name_option = name;
1301 #define TAR_SIZE_SUFFIXES "bBcGgkKMmPTtw"
1303 /* Either NL or NUL, as decided by the --null option. */
1304 static char filename_terminator;
1307 parse_opt (int key, char *arg, struct argp_state *state)
1309 struct tar_args *args = state->input;
1314 /* File name or non-parsed option, because of ARGP_IN_ORDER */
1315 name_add_name (arg, MAKE_INCL_OPTIONS (args));
1316 args->input_files = true;
1320 set_subcommand_option (CAT_SUBCOMMAND);
1324 args->compress_autodetect = true;
1327 case NO_AUTO_COMPRESS_OPTION:
1328 args->compress_autodetect = false;
1334 if (! (xstrtoumax (arg, 0, 10, &u, "") == LONGINT_OK
1335 && u == (blocking_factor = u)
1336 && 0 < blocking_factor
1337 && u == (record_size = u * BLOCKSIZE) / BLOCKSIZE))
1338 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
1339 _("Invalid blocking factor")));
1344 /* Try to reblock input records. For reading 4.2BSD pipes. */
1346 /* It would surely make sense to exchange -B and -R, but it seems
1347 that -B has been used for a long while in Sun tar and most
1348 BSD-derived systems. This is a consequence of the block/record
1349 terminology confusion. */
1351 read_full_records_option = true;
1355 set_subcommand_option (CREATE_SUBCOMMAND);
1363 set_subcommand_option (DIFF_SUBCOMMAND);
1367 if (archive_names == allocated_archive_names)
1368 archive_name_array = x2nrealloc (archive_name_array,
1369 &allocated_archive_names,
1370 sizeof (archive_name_array[0]));
1372 archive_name_array[archive_names++] = arg;
1376 /* Since -F is only useful with -M, make it implied. Run this
1377 script at the end of each tape. */
1379 info_script_option = arg;
1380 multi_volume_option = true;
1383 case FULL_TIME_OPTION:
1384 full_time_option = true;
1388 listed_incremental_option = arg;
1389 after_date_option = true;
1393 /* We are making an incremental dump (FIXME: are we?); save
1394 directories at the beginning of the archive, and include in each
1395 directory its contents. */
1397 incremental_option = true;
1401 /* Follow symbolic links. */
1402 dereference_option = true;
1405 case HARD_DEREFERENCE_OPTION:
1406 hard_dereference_option = true;
1410 /* Ignore zero blocks (eofs). This can't be the default,
1411 because Unix tar writes two blocks of zeros, then pads out
1412 the record with garbage. */
1414 ignore_zeros_option = true;
1418 set_use_compress_program_option (BZIP2_PROGRAM);
1422 set_use_compress_program_option (XZ_PROGRAM);
1426 /* Don't replace existing files. */
1427 old_files_option = KEEP_OLD_FILES;
1431 starting_file_option = true;
1432 addname (arg, 0, true, NULL);
1435 case ONE_FILE_SYSTEM_OPTION:
1436 /* When dumping directories, don't dump files/subdirectories
1437 that are on other filesystems. */
1438 one_file_system_option = true;
1442 check_links_option = 1;
1450 if (xstrtoumax (arg, &p, 10, &u, TAR_SIZE_SUFFIXES) != LONGINT_OK)
1451 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
1452 _("Invalid tape length")));
1453 if (p > arg && !strchr (TAR_SIZE_SUFFIXES, p[-1]))
1454 tape_length_option = 1024 * (tarlong) u;
1456 tape_length_option = (tarlong) u;
1457 multi_volume_option = true;
1464 incremental_level = strtoul (arg, &p, 10);
1466 USAGE_ERROR ((0, 0, _("Invalid incremental level value")));
1471 set_use_compress_program_option (LZIP_PROGRAM);
1475 set_use_compress_program_option (LZMA_PROGRAM);
1479 set_use_compress_program_option (LZOP_PROGRAM);
1483 touch_option = true;
1487 /* Make multivolume archive: when we can't write any more into
1488 the archive, re-open it, and continue writing. */
1490 multi_volume_option = true;
1494 get_date_or_file (args, "--mtime", arg, &mtime_option);
1495 set_mtime_option = true;
1502 case NO_SEEK_OPTION:
1507 after_date_option = true;
1510 case NEWER_MTIME_OPTION:
1511 if (NEWER_OPTION_INITIALIZED (newer_mtime_option))
1512 USAGE_ERROR ((0, 0, _("More than one threshold date")));
1513 get_date_or_file (args,
1514 key == NEWER_MTIME_OPTION ? "--newer-mtime"
1515 : "--after-date", arg, &newer_mtime_option);
1519 args->o_option = true;
1523 to_stdout_option = true;
1527 same_permissions_option = true;
1531 absolute_names_option = true;
1535 set_subcommand_option (APPEND_SUBCOMMAND);
1539 /* Print block numbers for debugging bad tar archives. */
1541 /* It would surely make sense to exchange -B and -R, but it seems
1542 that -B has been used for a long while in Sun tar and most
1543 BSD-derived systems. This is a consequence of the block/record
1544 terminology confusion. */
1546 block_number_option = true;
1550 /* Names to extract are sorted. */
1552 same_order_option = true;
1556 sparse_option = true;
1559 case SKIP_OLD_FILES_OPTION:
1560 old_files_option = SKIP_OLD_FILES;
1563 case SPARSE_VERSION_OPTION:
1564 sparse_option = true;
1567 tar_sparse_major = strtoul (arg, &p, 10);
1571 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1572 tar_sparse_minor = strtoul (p + 1, &p, 10);
1574 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1580 set_subcommand_option (LIST_SUBCOMMAND);
1584 case TEST_LABEL_OPTION:
1585 set_subcommand_option (TEST_LABEL_SUBCOMMAND);
1589 name_add_file (arg, filename_terminator);
1590 /* Indicate we've been given -T option. This is for backward
1591 compatibility only, so that `tar cfT archive /dev/null will
1593 files_from_option = true;
1597 set_subcommand_option (UPDATE_SUBCOMMAND);
1601 old_files_option = UNLINK_FIRST_OLD_FILES;
1610 warning_option |= WARN_VERBOSE_WARNINGS;
1614 volume_label_option = arg;
1618 interactive_option = true;
1622 verify_option = true;
1626 set_subcommand_option (EXTRACT_SUBCOMMAND);
1630 if (add_exclude_file (add_exclude, excluded, arg,
1631 MAKE_EXCL_OPTIONS (args), '\n')
1635 FATAL_ERROR ((0, e, "%s", quotearg_colon (arg)));
1640 set_use_compress_program_option (GZIP_PROGRAM);
1644 set_use_compress_program_option (COMPRESS_PROGRAM);
1647 case ANCHORED_OPTION:
1648 args->matching_flags |= EXCLUDE_ANCHORED;
1651 case ATIME_PRESERVE_OPTION:
1652 atime_preserve_option =
1654 ? XARGMATCH ("--atime-preserve", arg,
1655 atime_preserve_args, atime_preserve_types)
1656 : replace_atime_preserve);
1657 if (! O_NOATIME && atime_preserve_option == system_atime_preserve)
1659 _("--atime-preserve='system' is not supported"
1660 " on this platform")));
1663 case CHECK_DEVICE_OPTION:
1664 check_device_option = true;
1667 case NO_CHECK_DEVICE_OPTION:
1668 check_device_option = false;
1671 case CHECKPOINT_OPTION:
1678 checkpoint_compile_action (".");
1681 checkpoint_option = strtoul (arg, &p, 0);
1684 _("--checkpoint value is not an integer")));
1687 checkpoint_option = DEFAULT_CHECKPOINT;
1690 case CHECKPOINT_ACTION_OPTION:
1691 checkpoint_compile_action (arg);
1695 backup_option = true;
1697 args->version_control_string = arg;
1700 case DELAY_DIRECTORY_RESTORE_OPTION:
1701 delay_directory_restore_option = true;
1704 case NO_DELAY_DIRECTORY_RESTORE_OPTION:
1705 delay_directory_restore_option = false;
1709 set_subcommand_option (DELETE_SUBCOMMAND);
1712 case EXCLUDE_BACKUPS_OPTION:
1713 add_exclude_array (backup_file_table, EXCLUDE_WILDCARDS);
1716 case EXCLUDE_OPTION:
1717 add_exclude (excluded, arg, MAKE_EXCL_OPTIONS (args));
1720 case EXCLUDE_CACHES_OPTION:
1721 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_contents,
1725 case EXCLUDE_CACHES_UNDER_OPTION:
1726 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_under,
1730 case EXCLUDE_CACHES_ALL_OPTION:
1731 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_all,
1735 case EXCLUDE_TAG_OPTION:
1736 add_exclusion_tag (arg, exclusion_tag_contents, NULL);
1739 case EXCLUDE_TAG_UNDER_OPTION:
1740 add_exclusion_tag (arg, exclusion_tag_under, NULL);
1743 case EXCLUDE_TAG_ALL_OPTION:
1744 add_exclusion_tag (arg, exclusion_tag_all, NULL);
1747 case EXCLUDE_VCS_OPTION:
1748 add_exclude_array (vcs_file_table, 0);
1751 case FORCE_LOCAL_OPTION:
1752 force_local_option = true;
1756 set_archive_format (arg);
1759 case INDEX_FILE_OPTION:
1760 index_file_name = arg;
1763 case IGNORE_CASE_OPTION:
1764 args->matching_flags |= FNM_CASEFOLD;
1767 case IGNORE_COMMAND_ERROR_OPTION:
1768 ignore_command_error_option = true;
1771 case IGNORE_FAILED_READ_OPTION:
1772 ignore_failed_read_option = true;
1775 case KEEP_DIRECTORY_SYMLINK_OPTION:
1776 keep_directory_symlink_option = true;
1779 case KEEP_NEWER_FILES_OPTION:
1780 old_files_option = KEEP_NEWER_FILES;
1785 uintmax_t u = parse_owner_group (arg, TYPE_MAXIMUM (gid_t),
1786 &group_name_option);
1787 if (u == UINTMAX_MAX)
1790 if (group_name_option)
1791 gname_to_gid (group_name_option, &group_option);
1799 mode_option = mode_compile (arg);
1801 FATAL_ERROR ((0, 0, _("Invalid mode given on option")));
1802 initial_umask = umask (0);
1803 umask (initial_umask);
1806 case NO_ANCHORED_OPTION:
1807 args->include_anchored = 0; /* Clear the default for comman line args */
1808 args->matching_flags &= ~ EXCLUDE_ANCHORED;
1811 case NO_IGNORE_CASE_OPTION:
1812 args->matching_flags &= ~ FNM_CASEFOLD;
1815 case NO_IGNORE_COMMAND_ERROR_OPTION:
1816 ignore_command_error_option = false;
1819 case NO_OVERWRITE_DIR_OPTION:
1820 old_files_option = NO_OVERWRITE_DIR_OLD_FILES;
1823 case NO_QUOTE_CHARS_OPTION:
1825 set_char_quoting (NULL, *arg, 0);
1828 case NO_WILDCARDS_OPTION:
1829 args->wildcards = disable_wildcards;
1832 case NO_WILDCARDS_MATCH_SLASH_OPTION:
1833 args->matching_flags |= FNM_FILE_NAME;
1837 filename_terminator = '\0';
1840 case NO_NULL_OPTION:
1841 filename_terminator = '\n';
1844 case NUMERIC_OWNER_OPTION:
1845 numeric_owner_option = true;
1848 case OCCURRENCE_OPTION:
1850 occurrence_option = 1;
1854 if (xstrtoumax (arg, 0, 10, &u, "") == LONGINT_OK)
1855 occurrence_option = u;
1857 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
1858 _("Invalid number")));
1862 case OLD_ARCHIVE_OPTION:
1863 set_archive_format ("v7");
1866 case OVERWRITE_DIR_OPTION:
1867 old_files_option = DEFAULT_OLD_FILES;
1870 case OVERWRITE_OPTION:
1871 old_files_option = OVERWRITE_OLD_FILES;
1876 uintmax_t u = parse_owner_group (arg, TYPE_MAXIMUM (uid_t),
1877 &owner_name_option);
1878 if (u == UINTMAX_MAX)
1881 if (owner_name_option)
1882 uname_to_uid (owner_name_option, &owner_option);
1889 case QUOTE_CHARS_OPTION:
1891 set_char_quoting (NULL, *arg, 1);
1894 case QUOTING_STYLE_OPTION:
1895 tar_set_quoting_style (arg);
1900 char *tmp = expand_pax_option (args, arg);
1901 args->pax_option = true;
1902 xheader_set_option (tmp);
1908 set_archive_format ("posix");
1911 case PRESERVE_OPTION:
1912 /* FIXME: What it is good for? */
1913 same_permissions_option = true;
1914 same_order_option = true;
1915 WARN ((0, 0, _("The --preserve option is deprecated, "
1916 "use --preserve-permissions --preserve-order instead")));
1919 case RECORD_SIZE_OPTION:
1923 if (! (xstrtoumax (arg, NULL, 10, &u, TAR_SIZE_SUFFIXES) == LONGINT_OK
1924 && u == (size_t) u))
1925 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
1926 _("Invalid record size")));
1928 if (record_size % BLOCKSIZE != 0)
1929 USAGE_ERROR ((0, 0, _("Record size must be a multiple of %d."),
1931 blocking_factor = record_size / BLOCKSIZE;
1935 case RECURSIVE_UNLINK_OPTION:
1936 recursive_unlink_option = true;
1939 case REMOVE_FILES_OPTION:
1940 remove_files_option = true;
1943 case RESTRICT_OPTION:
1944 restrict_option = true;
1947 case RMT_COMMAND_OPTION:
1951 case RSH_COMMAND_OPTION:
1952 rsh_command_option = arg;
1955 case SHOW_DEFAULTS_OPTION:
1957 char *s = format_default_settings ();
1964 case SHOW_SNAPSHOT_FIELD_RANGES_OPTION:
1965 show_snapshot_field_ranges ();
1969 case STRIP_COMPONENTS_OPTION:
1972 if (! (xstrtoumax (arg, 0, 10, &u, "") == LONGINT_OK
1973 && u == (size_t) u))
1974 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
1975 _("Invalid number of elements")));
1976 strip_name_components = u;
1980 case SHOW_OMITTED_DIRS_OPTION:
1981 show_omitted_dirs_option = true;
1984 case SHOW_TRANSFORMED_NAMES_OPTION:
1985 show_transformed_names_option = true;
1989 backup_option = true;
1990 args->backup_suffix_string = arg;
1993 case TO_COMMAND_OPTION:
1994 if (to_command_option)
1995 USAGE_ERROR ((0, 0, _("Only one --to-command option allowed")));
1996 to_command_option = arg;
2001 set_stat_signal (arg);
2003 totals_option = true;
2006 case TRANSFORM_OPTION:
2007 set_transform_expr (arg);
2011 set_use_compress_program_option (arg);
2014 case VOLNO_FILE_OPTION:
2015 volno_file_option = arg;
2018 case WILDCARDS_OPTION:
2019 args->wildcards = enable_wildcards;
2022 case WILDCARDS_MATCH_SLASH_OPTION:
2023 args->matching_flags &= ~ FNM_FILE_NAME;
2026 case NO_RECURSION_OPTION:
2027 recursion_option = 0;
2030 case NO_SAME_OWNER_OPTION:
2031 same_owner_option = -1;
2034 case NO_SAME_PERMISSIONS_OPTION:
2035 same_permissions_option = -1;
2039 set_archive_format ("posix");
2043 case NO_ACLS_OPTION:
2047 case SELINUX_CONTEXT_OPTION:
2048 set_archive_format ("posix");
2049 selinux_context_option = 1;
2052 case NO_SELINUX_CONTEXT_OPTION:
2053 selinux_context_option = -1;
2057 set_archive_format ("posix");
2061 case NO_XATTR_OPTION:
2067 xattrs_mask_add (arg, (key == XATTR_INCLUDE));
2070 case RECURSION_OPTION:
2071 recursion_option = FNM_LEADING_DIR;
2074 case SAME_OWNER_OPTION:
2075 same_owner_option = 1;
2078 case UNQUOTE_OPTION:
2079 unquote_option = true;
2082 case NO_UNQUOTE_OPTION:
2083 unquote_option = false;
2086 case WARNING_OPTION:
2087 set_warning_option (arg);
2099 #ifdef DEVICE_PREFIX
2101 int device = key - '0';
2103 static char buf[sizeof DEVICE_PREFIX + 10];
2107 argp_error (state, _("Malformed density argument: %s"), quote (arg));
2109 strcpy (buf, DEVICE_PREFIX);
2110 cursor = buf + strlen (buf);
2112 #ifdef DENSITY_LETTER
2114 sprintf (cursor, "%d%c", device, arg[0]);
2116 #else /* not DENSITY_LETTER */
2121 device += LOW_DENSITY_NUM;
2125 device += MID_DENSITY_NUM;
2129 device += HIGH_DENSITY_NUM;
2133 argp_error (state, _("Unknown density: '%c'"), arg[0]);
2135 sprintf (cursor, "%d", device);
2137 #endif /* not DENSITY_LETTER */
2139 if (archive_names == allocated_archive_names)
2140 archive_name_array = x2nrealloc (archive_name_array,
2141 &allocated_archive_names,
2142 sizeof (archive_name_array[0]));
2143 archive_name_array[archive_names++] = xstrdup (buf);
2147 #else /* not DEVICE_PREFIX */
2150 _("Options '-[0-7][lmh]' not supported by *this* tar"));
2152 #endif /* not DEVICE_PREFIX */
2155 return ARGP_ERR_UNKNOWN;
2160 static struct argp argp = {
2173 argp_help (&argp, stderr, ARGP_HELP_SEE, (char*) program_name);
2178 /* Parse the options for tar. */
2180 static struct argp_option *
2181 find_argp_option (struct argp_option *o, int letter)
2188 && o->doc == NULL); o++)
2189 if (o->key == letter)
2194 static const char *tar_authors[] = {
2200 /* Subcommand classes */
2201 #define SUBCL_READ 0x01 /* subcommand reads from the archive */
2202 #define SUBCL_WRITE 0x02 /* subcommand writes to the archive */
2203 #define SUBCL_UPDATE 0x04 /* subcommand updates existing archive */
2204 #define SUBCL_TEST 0x08 /* subcommand tests archive header or meta-info */
2205 #define SUBCL_OCCUR 0x10 /* subcommand allows the use of the occurrence
2208 static int subcommand_class[] = {
2209 /* UNKNOWN_SUBCOMMAND */ 0,
2210 /* APPEND_SUBCOMMAND */ SUBCL_WRITE|SUBCL_UPDATE,
2211 /* CAT_SUBCOMMAND */ SUBCL_WRITE,
2212 /* CREATE_SUBCOMMAND */ SUBCL_WRITE,
2213 /* DELETE_SUBCOMMAND */ SUBCL_WRITE|SUBCL_UPDATE|SUBCL_OCCUR,
2214 /* DIFF_SUBCOMMAND */ SUBCL_READ|SUBCL_OCCUR,
2215 /* EXTRACT_SUBCOMMAND */ SUBCL_READ|SUBCL_OCCUR,
2216 /* LIST_SUBCOMMAND */ SUBCL_READ|SUBCL_OCCUR,
2217 /* UPDATE_SUBCOMMAND */ SUBCL_WRITE|SUBCL_UPDATE,
2218 /* TEST_LABEL_SUBCOMMAND */ SUBCL_TEST
2221 /* Return t if the subcommand_option is in class(es) f */
2222 #define IS_SUBCOMMAND_CLASS(f) (subcommand_class[subcommand_option] & (f))
2224 static struct tar_args args;
2227 decode_options (int argc, char **argv)
2231 argp_version_setup ("tar", tar_authors);
2233 /* Set some default option values. */
2234 args.textual_date = NULL;
2235 args.wildcards = default_wildcards;
2236 args.matching_flags = 0;
2237 args.include_anchored = EXCLUDE_ANCHORED;
2238 args.o_option = false;
2239 args.pax_option = false;
2240 args.backup_suffix_string = getenv ("SIMPLE_BACKUP_SUFFIX");
2241 args.version_control_string = 0;
2242 args.input_files = false;
2243 args.compress_autodetect = false;
2245 subcommand_option = UNKNOWN_SUBCOMMAND;
2246 archive_format = DEFAULT_FORMAT;
2247 blocking_factor = DEFAULT_BLOCKING;
2248 record_size = DEFAULT_BLOCKING * BLOCKSIZE;
2249 excluded = new_exclude ();
2250 newer_mtime_option.tv_sec = TYPE_MINIMUM (time_t);
2251 newer_mtime_option.tv_nsec = -1;
2252 recursion_option = FNM_LEADING_DIR;
2253 unquote_option = true;
2254 tar_sparse_major = 1;
2255 tar_sparse_minor = 0;
2257 owner_option = -1; owner_name_option = NULL;
2258 group_option = -1; group_name_option = NULL;
2260 check_device_option = true;
2262 incremental_level = -1;
2266 /* Convert old-style tar call by exploding option element and rearranging
2267 options accordingly. */
2269 if (argc > 1 && argv[1][0] != '-')
2271 int new_argc; /* argc value for rearranged arguments */
2272 char **new_argv; /* argv value for rearranged arguments */
2273 char *const *in; /* cursor into original argv */
2274 char **out; /* cursor into rearranged argv */
2275 const char *letter; /* cursor into old option letters */
2276 char buffer[3]; /* constructed option buffer */
2278 /* Initialize a constructed option. */
2283 /* Allocate a new argument array, and copy program name in it. */
2285 new_argc = argc - 1 + strlen (argv[1]);
2286 new_argv = xmalloc ((new_argc + 1) * sizeof (char *));
2291 /* Copy each old letter option as a separate option, and have the
2292 corresponding argument moved next to it. */
2294 for (letter = *in++; *letter; letter++)
2296 struct argp_option *opt;
2298 buffer[1] = *letter;
2299 *out++ = xstrdup (buffer);
2300 opt = find_argp_option (options, *letter);
2301 if (opt && opt->arg)
2303 if (in < argv + argc)
2306 USAGE_ERROR ((0, 0, _("Old option '%c' requires an argument."),
2311 /* Copy all remaining options. */
2313 while (in < argv + argc)
2317 /* Replace the old option list by the new one. */
2323 /* Parse all options and non-options as they appear. */
2325 prepend_default_options (getenv ("TAR_OPTIONS"), &argc, &argv);
2327 if (argp_parse (&argp, argc, argv, ARGP_IN_ORDER, &idx, &args))
2328 exit (TAREXIT_FAILURE);
2330 /* Special handling for 'o' option:
2332 GNU tar used to say "output old format".
2333 UNIX98 tar says don't chown files after extracting (we use
2334 "--no-same-owner" for this).
2336 The old GNU tar semantics is retained when used with --create
2337 option, otherwise UNIX98 semantics is assumed */
2341 if (subcommand_option == CREATE_SUBCOMMAND)
2343 /* GNU Tar <= 1.13 compatibility */
2344 set_archive_format ("v7");
2348 /* UNIX98 compatibility */
2349 same_owner_option = -1;
2353 /* Handle operands after any "--" argument. */
2354 for (; idx < argc; idx++)
2356 name_add_name (argv[idx], MAKE_INCL_OPTIONS (&args));
2357 args.input_files = true;
2360 /* Warn about implicit use of the wildcards in command line arguments.
2362 warn_regex_usage = args.wildcards == default_wildcards;
2364 /* Derive option values and check option consistency. */
2366 if (archive_format == DEFAULT_FORMAT)
2368 if (args.pax_option)
2369 archive_format = POSIX_FORMAT;
2371 archive_format = DEFAULT_ARCHIVE_FORMAT;
2374 if ((volume_label_option && subcommand_option == CREATE_SUBCOMMAND)
2375 || incremental_option
2376 || multi_volume_option
2378 assert_format (FORMAT_MASK (OLDGNU_FORMAT)
2379 | FORMAT_MASK (GNU_FORMAT)
2380 | FORMAT_MASK (POSIX_FORMAT));
2382 if (occurrence_option)
2384 if (!args.input_files)
2386 _("--occurrence is meaningless without a file list")));
2387 if (!IS_SUBCOMMAND_CLASS (SUBCL_OCCUR))
2389 _("--occurrence cannot be used with %s"),
2390 subcommand_string (subcommand_option)));
2393 if (archive_names == 0)
2395 /* If no archive file name given, try TAPE from the environment, or
2396 else, DEFAULT_ARCHIVE from the configuration process. */
2399 archive_name_array[0] = getenv ("TAPE");
2400 if (! archive_name_array[0])
2401 archive_name_array[0] = DEFAULT_ARCHIVE;
2404 /* Allow multiple archives only with '-M'. */
2406 if (archive_names > 1 && !multi_volume_option)
2408 _("Multiple archive files require '-M' option")));
2410 if (listed_incremental_option
2411 && NEWER_OPTION_INITIALIZED (newer_mtime_option))
2413 _("Cannot combine --listed-incremental with --newer")));
2414 if (incremental_level != -1 && !listed_incremental_option)
2416 _("--level is meaningless without --listed-incremental")));
2418 if (volume_label_option)
2420 if (archive_format == GNU_FORMAT || archive_format == OLDGNU_FORMAT)
2422 size_t volume_label_max_len =
2423 (sizeof current_header->header.name
2424 - 1 /* for trailing '\0' */
2425 - (multi_volume_option
2426 ? (sizeof " Volume "
2427 - 1 /* for null at end of " Volume " */
2428 + INT_STRLEN_BOUND (int) /* for volume number */
2429 - 1 /* for sign, as 0 <= volno */)
2431 if (volume_label_max_len < strlen (volume_label_option))
2433 ngettext ("%s: Volume label is too long (limit is %lu byte)",
2434 "%s: Volume label is too long (limit is %lu bytes)",
2435 volume_label_max_len),
2436 quotearg_colon (volume_label_option),
2437 (unsigned long) volume_label_max_len));
2440 Label length in PAX format is limited by the volume size. */
2445 if (multi_volume_option)
2446 USAGE_ERROR ((0, 0, _("Cannot verify multi-volume archives")));
2447 if (use_compress_program_option)
2448 USAGE_ERROR ((0, 0, _("Cannot verify compressed archives")));
2449 if (!IS_SUBCOMMAND_CLASS (SUBCL_WRITE))
2450 USAGE_ERROR ((0, 0, _("--verify cannot be used with %s"),
2451 subcommand_string (subcommand_option)));
2454 if (use_compress_program_option)
2456 if (multi_volume_option)
2457 USAGE_ERROR ((0, 0, _("Cannot use multi-volume compressed archives")));
2458 if (IS_SUBCOMMAND_CLASS (SUBCL_UPDATE))
2459 USAGE_ERROR ((0, 0, _("Cannot update compressed archives")));
2460 if (subcommand_option == CAT_SUBCOMMAND)
2461 USAGE_ERROR ((0, 0, _("Cannot concatenate compressed archives")));
2464 /* It is no harm to use --pax-option on non-pax archives in archive
2465 reading mode. It may even be useful, since it allows to override
2466 file attributes from tar headers. Therefore I allow such usage.
2469 && archive_format != POSIX_FORMAT
2470 && !IS_SUBCOMMAND_CLASS (SUBCL_READ))
2471 USAGE_ERROR ((0, 0, _("--pax-option can be used only on POSIX archives")));
2473 /* star creates non-POSIX typed archives with xattr support, so allow the
2474 extra headers when reading */
2475 if ((acls_option > 0)
2476 && archive_format != POSIX_FORMAT
2477 && !IS_SUBCOMMAND_CLASS (SUBCL_READ))
2478 USAGE_ERROR ((0, 0, _("--acls can be used only on POSIX archives")));
2480 if ((selinux_context_option > 0)
2481 && archive_format != POSIX_FORMAT
2482 && !IS_SUBCOMMAND_CLASS (SUBCL_READ))
2483 USAGE_ERROR ((0, 0, _("--selinux can be used only on POSIX archives")));
2485 if ((xattrs_option > 0)
2486 && archive_format != POSIX_FORMAT
2487 && !IS_SUBCOMMAND_CLASS (SUBCL_READ))
2488 USAGE_ERROR ((0, 0, _("--xattrs can be used only on POSIX archives")));
2490 if ((starting_file_option || same_order_option)
2491 && !IS_SUBCOMMAND_CLASS (SUBCL_READ))
2493 _("--%s option cannot be used with %s"),
2494 starting_file_option ? "starting-file" : "same-order",
2495 subcommand_string (subcommand_option)));
2497 /* If ready to unlink hierarchies, so we are for simpler files. */
2498 if (recursive_unlink_option)
2499 old_files_option = UNLINK_FIRST_OLD_FILES;
2501 /* Flags for accessing files to be read from or copied into. POSIX says
2502 O_NONBLOCK has unspecified effect on most types of files, but in
2503 practice it never harms and sometimes helps. */
2505 int base_open_flags =
2506 (O_BINARY | O_CLOEXEC | O_NOCTTY | O_NONBLOCK
2507 | (dereference_option ? 0 : O_NOFOLLOW)
2508 | (atime_preserve_option == system_atime_preserve ? O_NOATIME : 0));
2509 open_read_flags = O_RDONLY | base_open_flags;
2510 open_searchdir_flags = O_SEARCH | O_DIRECTORY | base_open_flags;
2512 fstatat_flags = dereference_option ? 0 : AT_SYMLINK_NOFOLLOW;
2514 if (subcommand_option == TEST_LABEL_SUBCOMMAND)
2516 /* --test-label is silent if the user has specified the label name to
2518 if (!args.input_files)
2521 else if (utc_option)
2524 if (tape_length_option && tape_length_option < record_size)
2525 USAGE_ERROR ((0, 0, _("Volume length cannot be less than record size")));
2527 if (same_order_option && listed_incremental_option)
2528 USAGE_ERROR ((0, 0, _("--preserve-order is not compatible with "
2529 "--listed-incremental")));
2531 /* Forbid using -c with no input files whatsoever. Check that '-f -',
2532 explicit or implied, is used correctly. */
2534 switch (subcommand_option)
2536 case CREATE_SUBCOMMAND:
2537 if (!args.input_files && !files_from_option)
2539 _("Cowardly refusing to create an empty archive")));
2540 if (args.compress_autodetect && archive_names
2541 && strcmp (archive_name_array[0], "-"))
2542 set_compression_program_by_suffix (archive_name_array[0],
2543 use_compress_program_option);
2546 case EXTRACT_SUBCOMMAND:
2547 case LIST_SUBCOMMAND:
2548 case DIFF_SUBCOMMAND:
2549 case TEST_LABEL_SUBCOMMAND:
2550 for (archive_name_cursor = archive_name_array;
2551 archive_name_cursor < archive_name_array + archive_names;
2552 archive_name_cursor++)
2553 if (!strcmp (*archive_name_cursor, "-"))
2554 request_stdin ("-f");
2557 case CAT_SUBCOMMAND:
2558 case UPDATE_SUBCOMMAND:
2559 case APPEND_SUBCOMMAND:
2560 for (archive_name_cursor = archive_name_array;
2561 archive_name_cursor < archive_name_array + archive_names;
2562 archive_name_cursor++)
2563 if (!strcmp (*archive_name_cursor, "-"))
2565 _("Options '-Aru' are incompatible with '-f -'")));
2571 /* Initialize stdlis */
2572 if (index_file_name)
2574 stdlis = fopen (index_file_name, "w");
2576 open_fatal (index_file_name);
2579 stdlis = to_stdout_option ? stderr : stdout;
2581 archive_name_cursor = archive_name_array;
2583 /* Prepare for generating backup names. */
2585 if (args.backup_suffix_string)
2586 simple_backup_suffix = xstrdup (args.backup_suffix_string);
2590 backup_type = xget_version ("--backup", args.version_control_string);
2591 /* No backup is needed either if explicitely disabled or if
2592 the extracted files are not being written to disk. */
2593 if (backup_type == no_backups || EXTRACT_OVER_PIPE)
2594 backup_option = false;
2597 checkpoint_finish_compile ();
2599 report_textual_dates (&args);
2603 more_options (int argc, char **argv)
2606 if (argp_parse (&argp, argc, argv, ARGP_IN_ORDER,
2608 exit (TAREXIT_FAILURE);
2613 /* Main routine for tar. */
2615 main (int argc, char **argv)
2618 set_program_name (argv[0]);
2620 setlocale (LC_ALL, "");
2621 bindtextdomain (PACKAGE, LOCALEDIR);
2622 textdomain (PACKAGE);
2624 exit_failure = TAREXIT_FAILURE;
2625 exit_status = TAREXIT_SUCCESS;
2626 filename_terminator = '\n';
2627 set_quoting_style (0, DEFAULT_QUOTING_STYLE);
2629 /* Make sure we have first three descriptors available */
2632 /* Pre-allocate a few structures. */
2634 allocated_archive_names = 10;
2635 archive_name_array =
2636 xmalloc (sizeof (const char *) * allocated_archive_names);
2639 /* System V fork+wait does not work if SIGCHLD is ignored. */
2640 signal (SIGCHLD, SIG_DFL);
2642 /* Try to disable the ability to unlink a directory. */
2643 priv_set_remove_linkdir ();
2645 /* Decode options. */
2647 decode_options (argc, argv);
2651 /* Main command execution. */
2653 if (volno_file_option)
2654 init_volume_number ();
2656 switch (subcommand_option)
2658 case UNKNOWN_SUBCOMMAND:
2660 _("You must specify one of the '-Acdtrux', '--delete' or '--test-label' options")));
2662 case CAT_SUBCOMMAND:
2663 case UPDATE_SUBCOMMAND:
2664 case APPEND_SUBCOMMAND:
2668 case DELETE_SUBCOMMAND:
2669 delete_archive_members ();
2672 case CREATE_SUBCOMMAND:
2676 case EXTRACT_SUBCOMMAND:
2678 read_and (extract_archive);
2680 /* FIXME: should extract_finish () even if an ordinary signal is
2686 case LIST_SUBCOMMAND:
2687 read_and (list_archive);
2690 case DIFF_SUBCOMMAND:
2692 read_and (diff_archive);
2695 case TEST_LABEL_SUBCOMMAND:
2696 test_archive_label ();
2700 print_total_stats ();
2702 if (check_links_option)
2705 if (volno_file_option)
2706 closeout_volume_number ();
2708 /* Dispose of allocated memory, and return. */
2710 free (archive_name_array);
2711 xattrs_clear_setup ();
2714 if (exit_status == TAREXIT_FAILURE)
2715 error (0, 0, _("Exiting with failure status due to previous errors"));
2717 if (stdlis == stdout)
2719 else if (ferror (stderr) || fclose (stderr) != 0)
2720 set_exit_status (TAREXIT_FAILURE);
2726 tar_stat_init (struct tar_stat_info *st)
2728 memset (st, 0, sizeof (*st));
2731 /* Close the stream or file descriptor associated with ST, and remove
2732 all traces of it from ST. Return true if successful, false (with a
2733 diagnostic) otherwise. */
2735 tar_stat_close (struct tar_stat_info *st)
2737 int status = (st->dirstream ? closedir (st->dirstream)
2738 : 0 < st->fd ? close (st->fd)
2747 close_diag (st->orig_file_name);
2753 tar_stat_destroy (struct tar_stat_info *st)
2755 tar_stat_close (st);
2756 xheader_xattr_free (st->xattr_map, st->xattr_map_size);
2757 free (st->orig_file_name);
2758 free (st->file_name);
2759 free (st->link_name);
2762 free (st->cntx_name);
2763 free (st->acls_a_ptr);
2764 free (st->acls_d_ptr);
2765 free (st->sparse_map);
2767 xheader_destroy (&st->xhdr);
2768 memset (st, 0, sizeof (*st));
2771 /* Format mask for all available formats that support nanosecond
2772 timestamp resolution. */
2773 #define NS_PRECISION_FORMAT_MASK FORMAT_MASK (POSIX_FORMAT)
2775 /* Same as timespec_cmp, but ignore nanoseconds if current archive
2776 format does not provide sufficient resolution. */
2778 tar_timespec_cmp (struct timespec a, struct timespec b)
2780 if (!(FORMAT_MASK (current_format) & NS_PRECISION_FORMAT_MASK))
2781 a.tv_nsec = b.tv_nsec = 0;
2782 return timespec_cmp (a, b);
2785 /* Set tar exit status to VAL, unless it is already indicating
2786 a more serious condition. This relies on the fact that the
2787 values of TAREXIT_ constants are ranged by severity. */
2789 set_exit_status (int val)
2791 if (val > exit_status)