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 archive_format_string (enum archive_format fmt
)
173 struct fmttab
const *p
;
175 for (p
= fmttab
; p
->name
; p
++)
181 #define FORMAT_MASK(n) (1<<(n))
184 assert_format(unsigned fmt_mask
)
186 if ((FORMAT_MASK (archive_format
) & fmt_mask
) == 0)
188 _("GNU features wanted on incompatible archive format")));
192 subcommand_string (enum subcommand c
)
196 case UNKNOWN_SUBCOMMAND
:
199 case APPEND_SUBCOMMAND
:
205 case CREATE_SUBCOMMAND
:
208 case DELETE_SUBCOMMAND
:
211 case DIFF_SUBCOMMAND
:
214 case EXTRACT_SUBCOMMAND
:
217 case LIST_SUBCOMMAND
:
220 case UPDATE_SUBCOMMAND
:
223 case TEST_LABEL_SUBCOMMAND
:
224 return "--test-label";
230 tar_list_quoting_styles (struct obstack
*stk
, char const *prefix
)
233 size_t prefixlen
= strlen (prefix
);
235 for (i
= 0; quoting_style_args
[i
]; i
++)
237 obstack_grow (stk
, prefix
, prefixlen
);
238 obstack_grow (stk
, quoting_style_args
[i
],
239 strlen (quoting_style_args
[i
]));
240 obstack_1grow (stk
, '\n');
245 tar_set_quoting_style (char *arg
)
249 for (i
= 0; quoting_style_args
[i
]; i
++)
250 if (strcmp (arg
, quoting_style_args
[i
]) == 0)
252 set_quoting_style (NULL
, i
);
256 _("Unknown quoting style '%s'. Try '%s --quoting-style=help' to get a list."), arg
, program_invocation_short_name
));
264 ACLS_OPTION
= CHAR_MAX
+ 1,
266 ATIME_PRESERVE_OPTION
,
270 CHECKPOINT_ACTION_OPTION
,
271 DELAY_DIRECTORY_RESTORE_OPTION
,
272 HARD_DEREFERENCE_OPTION
,
274 EXCLUDE_BACKUPS_OPTION
,
275 EXCLUDE_CACHES_OPTION
,
276 EXCLUDE_CACHES_UNDER_OPTION
,
277 EXCLUDE_CACHES_ALL_OPTION
,
280 EXCLUDE_TAG_UNDER_OPTION
,
281 EXCLUDE_TAG_ALL_OPTION
,
287 IGNORE_COMMAND_ERROR_OPTION
,
288 IGNORE_FAILED_READ_OPTION
,
290 KEEP_DIRECTORY_SYMLINK_OPTION
,
291 KEEP_NEWER_FILES_OPTION
,
301 NO_AUTO_COMPRESS_OPTION
,
302 NO_CHECK_DEVICE_OPTION
,
303 NO_DELAY_DIRECTORY_RESTORE_OPTION
,
304 NO_IGNORE_CASE_OPTION
,
305 NO_IGNORE_COMMAND_ERROR_OPTION
,
307 NO_OVERWRITE_DIR_OPTION
,
308 NO_QUOTE_CHARS_OPTION
,
310 NO_SAME_OWNER_OPTION
,
311 NO_SAME_PERMISSIONS_OPTION
,
313 NO_SELINUX_CONTEXT_OPTION
,
315 NO_WILDCARDS_MATCH_SLASH_OPTION
,
319 NUMERIC_OWNER_OPTION
,
322 ONE_FILE_SYSTEM_OPTION
,
323 ONE_TOP_LEVEL_OPTION
,
324 OVERWRITE_DIR_OPTION
,
331 QUOTING_STYLE_OPTION
,
334 RECURSIVE_UNLINK_OPTION
,
340 SELINUX_CONTEXT_OPTION
,
341 SHOW_DEFAULTS_OPTION
,
342 SHOW_OMITTED_DIRS_OPTION
,
343 SHOW_SNAPSHOT_FIELD_RANGES_OPTION
,
344 SHOW_TRANSFORMED_NAMES_OPTION
,
345 SKIP_OLD_FILES_OPTION
,
347 SPARSE_VERSION_OPTION
,
348 STRIP_COMPONENTS_OPTION
,
358 WILDCARDS_MATCH_SLASH_OPTION
,
365 const char *argp_program_version
= "tar (" PACKAGE_NAME
") " VERSION
;
366 const char *argp_program_bug_address
= "<" PACKAGE_BUGREPORT
">";
367 static char const doc
[] = N_("\
368 GNU 'tar' saves many files together into a single tape or disk archive, \
369 and can restore individual files from the archive.\n\
372 tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n\
373 tar -tvf archive.tar # List all files in archive.tar verbosely.\n\
374 tar -xf archive.tar # Extract all files from archive.tar.\n")
376 N_("The backup suffix is '~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
377 The version control may be set with --backup or VERSION_CONTROL, values are:\n\n\
378 none, off never make backups\n\
379 t, numbered make numbered backups\n\
380 nil, existing numbered if numbered backups exist, simple otherwise\n\
381 never, simple always make simple backups\n");
386 Available option letters are DEQY and eqy. Consider the following
389 [For Solaris tar compatibility =/= Is it important at all?]
390 e exit immediately with a nonzero exit status if unexpected errors occur
391 E use extended headers (--format=posix)
393 [q alias for --occurrence=1 =/= this would better be used for quiet?]
395 y per-file gzip compression
396 Y per-block gzip compression.
398 Additionally, the 'n' letter is assigned for option --seek, which
399 is probably not needed and should be marked as deprecated, so that
400 -n may become available in the future.
403 static struct argp_option options
[] = {
406 N_("Main operation mode:"), GRID
},
409 N_("list the contents of an archive"), GRID
+1 },
410 {"extract", 'x', 0, 0,
411 N_("extract files from an archive"), GRID
+1 },
412 {"get", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
413 {"create", 'c', 0, 0,
414 N_("create a new archive"), GRID
+1 },
416 N_("find differences between archive and file system"), GRID
+1 },
417 {"compare", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
418 {"append", 'r', 0, 0,
419 N_("append files to the end of an archive"), GRID
+1 },
420 {"update", 'u', 0, 0,
421 N_("only append files newer than copy in archive"), GRID
+1 },
422 {"catenate", 'A', 0, 0,
423 N_("append tar files to an archive"), GRID
+1 },
424 {"concatenate", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
425 {"delete", DELETE_OPTION
, 0, 0,
426 N_("delete from the archive (not on mag tapes!)"), GRID
+1 },
427 {"test-label", TEST_LABEL_OPTION
, NULL
, 0,
428 N_("test the archive volume label and exit"), GRID
+1 },
433 N_("Operation modifiers:"), GRID
},
435 {"sparse", 'S', 0, 0,
436 N_("handle sparse files efficiently"), GRID
+1 },
437 {"sparse-version", SPARSE_VERSION_OPTION
, N_("MAJOR[.MINOR]"), 0,
438 N_("set version of the sparse format to use (implies --sparse)"), GRID
+1},
439 {"incremental", 'G', 0, 0,
440 N_("handle old GNU-format incremental backup"), GRID
+1 },
441 {"listed-incremental", 'g', N_("FILE"), 0,
442 N_("handle new GNU-format incremental backup"), GRID
+1 },
443 {"level", LEVEL_OPTION
, N_("NUMBER"), 0,
444 N_("dump level for created listed-incremental archive"), GRID
+1 },
445 {"ignore-failed-read", IGNORE_FAILED_READ_OPTION
, 0, 0,
446 N_("do not exit with nonzero on unreadable files"), GRID
+1 },
447 {"occurrence", OCCURRENCE_OPTION
, N_("NUMBER"), OPTION_ARG_OPTIONAL
,
448 N_("process only the NUMBERth occurrence of each file in the archive;"
449 " this option is valid only in conjunction with one of the subcommands"
450 " --delete, --diff, --extract or --list and when a list of files"
451 " is given either on the command line or via the -T option;"
452 " NUMBER defaults to 1"), GRID
+1 },
453 {"seek", 'n', NULL
, 0,
454 N_("archive is seekable"), GRID
+1 },
455 {"no-seek", NO_SEEK_OPTION
, NULL
, 0,
456 N_("archive is not seekable"), GRID
+1 },
457 {"no-check-device", NO_CHECK_DEVICE_OPTION
, NULL
, 0,
458 N_("do not check device numbers when creating incremental archives"),
460 {"check-device", CHECK_DEVICE_OPTION
, NULL
, 0,
461 N_("check device numbers when creating incremental archives (default)"),
467 N_("Overwrite control:"), GRID
},
469 {"verify", 'W', 0, 0,
470 N_("attempt to verify the archive after writing it"), GRID
+1 },
471 {"remove-files", REMOVE_FILES_OPTION
, 0, 0,
472 N_("remove files after adding them to the archive"), GRID
+1 },
473 {"keep-old-files", 'k', 0, 0,
474 N_("don't replace existing files when extracting, "
475 "treat them as errors"), GRID
+1 },
476 {"skip-old-files", SKIP_OLD_FILES_OPTION
, 0, 0,
477 N_("don't replace existing files when extracting, silently skip over them"),
479 {"keep-newer-files", KEEP_NEWER_FILES_OPTION
, 0, 0,
480 N_("don't replace existing files that are newer than their archive copies"), GRID
+1 },
481 {"overwrite", OVERWRITE_OPTION
, 0, 0,
482 N_("overwrite existing files when extracting"), GRID
+1 },
483 {"unlink-first", 'U', 0, 0,
484 N_("remove each file prior to extracting over it"), GRID
+1 },
485 {"recursive-unlink", RECURSIVE_UNLINK_OPTION
, 0, 0,
486 N_("empty hierarchies prior to extracting directory"), GRID
+1 },
487 {"no-overwrite-dir", NO_OVERWRITE_DIR_OPTION
, 0, 0,
488 N_("preserve metadata of existing directories"), GRID
+1 },
489 {"overwrite-dir", OVERWRITE_DIR_OPTION
, 0, 0,
490 N_("overwrite metadata of existing directories when extracting (default)"),
492 {"keep-directory-symlink", KEEP_DIRECTORY_SYMLINK_OPTION
, 0, 0,
493 N_("preserve existing symlinks to directories when extracting"),
495 {"one-top-level", ONE_TOP_LEVEL_OPTION
, N_("DIR"), OPTION_ARG_OPTIONAL
,
496 N_("create a subdirectory to avoid having loose files extracted"),
502 N_("Select output stream:"), GRID
},
504 {"to-stdout", 'O', 0, 0,
505 N_("extract files to standard output"), GRID
+1 },
506 {"to-command", TO_COMMAND_OPTION
, N_("COMMAND"), 0,
507 N_("pipe extracted files to another program"), GRID
+1 },
508 {"ignore-command-error", IGNORE_COMMAND_ERROR_OPTION
, 0, 0,
509 N_("ignore exit codes of children"), GRID
+1 },
510 {"no-ignore-command-error", NO_IGNORE_COMMAND_ERROR_OPTION
, 0, 0,
511 N_("treat non-zero exit codes of children as error"), GRID
+1 },
516 N_("Handling of file attributes:"), GRID
},
518 {"owner", OWNER_OPTION
, N_("NAME"), 0,
519 N_("force NAME as owner for added files"), GRID
+1 },
520 {"group", GROUP_OPTION
, N_("NAME"), 0,
521 N_("force NAME as group for added files"), GRID
+1 },
522 {"mtime", MTIME_OPTION
, N_("DATE-OR-FILE"), 0,
523 N_("set mtime for added files from DATE-OR-FILE"), GRID
+1 },
524 {"mode", MODE_OPTION
, N_("CHANGES"), 0,
525 N_("force (symbolic) mode CHANGES for added files"), GRID
+1 },
526 {"atime-preserve", ATIME_PRESERVE_OPTION
,
527 N_("METHOD"), OPTION_ARG_OPTIONAL
,
528 N_("preserve access times on dumped files, either by restoring the times"
529 " after reading (METHOD='replace'; default) or by not setting the times"
530 " in the first place (METHOD='system')"), GRID
+1 },
532 N_("don't extract file modified time"), GRID
+1 },
533 {"same-owner", SAME_OWNER_OPTION
, 0, 0,
534 N_("try extracting files with the same ownership as exists in the archive (default for superuser)"), GRID
+1 },
535 {"no-same-owner", NO_SAME_OWNER_OPTION
, 0, 0,
536 N_("extract files as yourself (default for ordinary users)"), GRID
+1 },
537 {"numeric-owner", NUMERIC_OWNER_OPTION
, 0, 0,
538 N_("always use numbers for user/group names"), GRID
+1 },
539 {"preserve-permissions", 'p', 0, 0,
540 N_("extract information about file permissions (default for superuser)"),
542 {"same-permissions", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
543 {"no-same-permissions", NO_SAME_PERMISSIONS_OPTION
, 0, 0,
544 N_("apply the user's umask when extracting permissions from the archive (default for ordinary users)"), GRID
+1 },
545 {"preserve-order", 's', 0, 0,
546 N_("member arguments are listed in the same order as the "
547 "files in the archive"), GRID
+1 },
548 {"same-order", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
549 {"preserve", PRESERVE_OPTION
, 0, 0,
550 N_("same as both -p and -s"), GRID
+1 },
551 {"delay-directory-restore", DELAY_DIRECTORY_RESTORE_OPTION
, 0, 0,
552 N_("delay setting modification times and permissions of extracted"
553 " directories until the end of extraction"), GRID
+1 },
554 {"no-delay-directory-restore", NO_DELAY_DIRECTORY_RESTORE_OPTION
, 0, 0,
555 N_("cancel the effect of --delay-directory-restore option"), GRID
+1 },
556 {"sort", SORT_OPTION
, N_("ORDER"), 0,
558 N_("directory sorting order: none (default), name or inode"
560 N_("directory sorting order: none (default) or name"
567 N_("Handling of extended file attributes:"), GRID
},
569 {"xattrs", XATTR_OPTION
, 0, 0,
570 N_("Enable extended attributes support"), GRID
+1 },
571 {"no-xattrs", NO_XATTR_OPTION
, 0, 0,
572 N_("Disable extended attributes support"), GRID
+1 },
573 {"xattrs-include", XATTR_INCLUDE
, N_("MASK"), 0,
574 N_("specify the include pattern for xattr keys"), GRID
+1 },
575 {"xattrs-exclude", XATTR_EXCLUDE
, N_("MASK"), 0,
576 N_("specify the exclude pattern for xattr keys"), GRID
+1 },
577 {"selinux", SELINUX_CONTEXT_OPTION
, 0, 0,
578 N_("Enable the SELinux context support"), GRID
+1 },
579 {"no-selinux", NO_SELINUX_CONTEXT_OPTION
, 0, 0,
580 N_("Disable the SELinux context support"), GRID
+1 },
581 {"acls", ACLS_OPTION
, 0, 0,
582 N_("Enable the POSIX ACLs support"), GRID
+1 },
583 {"no-acls", NO_ACLS_OPTION
, 0, 0,
584 N_("Disable the POSIX ACLs support"), GRID
+1 },
589 N_("Device selection and switching:"), GRID
},
591 {"file", 'f', N_("ARCHIVE"), 0,
592 N_("use archive file or device ARCHIVE"), GRID
+1 },
593 {"force-local", FORCE_LOCAL_OPTION
, 0, 0,
594 N_("archive file is local even if it has a colon"), GRID
+1 },
595 {"rmt-command", RMT_COMMAND_OPTION
, N_("COMMAND"), 0,
596 N_("use given rmt COMMAND instead of rmt"), GRID
+1 },
597 {"rsh-command", RSH_COMMAND_OPTION
, N_("COMMAND"), 0,
598 N_("use remote COMMAND instead of rsh"), GRID
+1 },
600 {"-[0-7][lmh]", 0, NULL
, OPTION_DOC
, /* It is OK, since 'name' will never be
602 N_("specify drive and density"), GRID
+1 },
604 {NULL
, '0', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
605 {NULL
, '1', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
606 {NULL
, '2', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
607 {NULL
, '3', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
608 {NULL
, '4', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
609 {NULL
, '5', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
610 {NULL
, '6', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
611 {NULL
, '7', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
612 {NULL
, '8', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
613 {NULL
, '9', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
615 {"multi-volume", 'M', 0, 0,
616 N_("create/list/extract multi-volume archive"), GRID
+1 },
617 {"tape-length", 'L', N_("NUMBER"), 0,
618 N_("change tape after writing NUMBER x 1024 bytes"), GRID
+1 },
619 {"info-script", 'F', N_("NAME"), 0,
620 N_("run script at end of each tape (implies -M)"), GRID
+1 },
621 {"new-volume-script", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
622 {"volno-file", VOLNO_FILE_OPTION
, N_("FILE"), 0,
623 N_("use/update the volume number in FILE"), GRID
+1 },
628 N_("Device blocking:"), GRID
},
630 {"blocking-factor", 'b', N_("BLOCKS"), 0,
631 N_("BLOCKS x 512 bytes per record"), GRID
+1 },
632 {"record-size", RECORD_SIZE_OPTION
, N_("NUMBER"), 0,
633 N_("NUMBER of bytes per record, multiple of 512"), GRID
+1 },
634 {"ignore-zeros", 'i', 0, 0,
635 N_("ignore zeroed blocks in archive (means EOF)"), GRID
+1 },
636 {"read-full-records", 'B', 0, 0,
637 N_("reblock as we read (for 4.2BSD pipes)"), GRID
+1 },
642 N_("Archive format selection:"), GRID
},
644 {"format", 'H', N_("FORMAT"), 0,
645 N_("create archive of the given format"), GRID
+1 },
647 {NULL
, 0, NULL
, 0, N_("FORMAT is one of the following:"), GRID
+2 },
648 {" v7", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("old V7 tar format"),
650 {" oldgnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
651 N_("GNU format as per tar <= 1.12"), GRID
+3 },
652 {" gnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
653 N_("GNU tar 1.13.x format"), GRID
+3 },
654 {" ustar", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
655 N_("POSIX 1003.1-1988 (ustar) format"), GRID
+3 },
656 {" pax", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
657 N_("POSIX 1003.1-2001 (pax) format"), GRID
+3 },
658 {" posix", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("same as pax"), GRID
+3 },
660 {"old-archive", OLD_ARCHIVE_OPTION
, 0, 0, /* FIXME */
661 N_("same as --format=v7"), GRID
+8 },
662 {"portability", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
663 {"posix", POSIX_OPTION
, 0, 0,
664 N_("same as --format=posix"), GRID
+8 },
665 {"pax-option", PAX_OPTION
, N_("keyword[[:]=value][,keyword[[:]=value]]..."), 0,
666 N_("control pax keywords"), GRID
+8 },
667 {"label", 'V', N_("TEXT"), 0,
668 N_("create archive with volume name TEXT; at list/extract time, use TEXT as a globbing pattern for volume name"), GRID
+8 },
673 N_("Compression options:"), GRID
},
674 {"auto-compress", 'a', 0, 0,
675 N_("use archive suffix to determine the compression program"), GRID
+1 },
676 {"no-auto-compress", NO_AUTO_COMPRESS_OPTION
, 0, 0,
677 N_("do not use archive suffix to determine the compression program"),
679 {"use-compress-program", 'I', N_("PROG"), 0,
680 N_("filter through PROG (must accept -d)"), GRID
+1 },
681 /* Note: docstrings for the options below are generated by tar_help_filter */
682 {"bzip2", 'j', 0, 0, NULL
, GRID
+1 },
683 {"gzip", 'z', 0, 0, NULL
, GRID
+1 },
684 {"gunzip", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
685 {"ungzip", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
686 {"compress", 'Z', 0, 0, NULL
, GRID
+1 },
687 {"uncompress", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
688 {"lzip", LZIP_OPTION
, 0, 0, NULL
, GRID
+1 },
689 {"lzma", LZMA_OPTION
, 0, 0, NULL
, GRID
+1 },
690 {"lzop", LZOP_OPTION
, 0, 0, NULL
, GRID
+1 },
691 {"xz", 'J', 0, 0, NULL
, GRID
+1 },
696 N_("Local file selection:"), GRID
},
698 {"add-file", ARGP_KEY_ARG
, N_("FILE"), 0,
699 N_("add given FILE to the archive (useful if its name starts with a dash)"), GRID
+1 },
700 {"directory", 'C', N_("DIR"), 0,
701 N_("change to directory DIR"), GRID
+1 },
702 {"files-from", 'T', N_("FILE"), 0,
703 N_("get names to extract or create from FILE"), GRID
+1 },
704 {"null", NULL_OPTION
, 0, 0,
705 N_("-T reads null-terminated names, disable -C"), GRID
+1 },
706 {"no-null", NO_NULL_OPTION
, 0, 0,
707 N_("disable the effect of the previous --null option"), GRID
+1 },
708 {"unquote", UNQUOTE_OPTION
, 0, 0,
709 N_("unquote filenames read with -T (default)"), GRID
+1 },
710 {"no-unquote", NO_UNQUOTE_OPTION
, 0, 0,
711 N_("do not unquote filenames read with -T"), GRID
+1 },
712 {"exclude", EXCLUDE_OPTION
, N_("PATTERN"), 0,
713 N_("exclude files, given as a PATTERN"), GRID
+1 },
714 {"exclude-from", 'X', N_("FILE"), 0,
715 N_("exclude patterns listed in FILE"), GRID
+1 },
716 {"exclude-caches", EXCLUDE_CACHES_OPTION
, 0, 0,
717 N_("exclude contents of directories containing CACHEDIR.TAG, "
718 "except for the tag file itself"), GRID
+1 },
719 {"exclude-caches-under", EXCLUDE_CACHES_UNDER_OPTION
, 0, 0,
720 N_("exclude everything under directories containing CACHEDIR.TAG"),
722 {"exclude-caches-all", EXCLUDE_CACHES_ALL_OPTION
, 0, 0,
723 N_("exclude directories containing CACHEDIR.TAG"), GRID
+1 },
724 {"exclude-tag", EXCLUDE_TAG_OPTION
, N_("FILE"), 0,
725 N_("exclude contents of directories containing FILE, except"
726 " for FILE itself"), GRID
+1 },
727 {"exclude-tag-under", EXCLUDE_TAG_UNDER_OPTION
, N_("FILE"), 0,
728 N_("exclude everything under directories containing FILE"), GRID
+1 },
729 {"exclude-tag-all", EXCLUDE_TAG_ALL_OPTION
, N_("FILE"), 0,
730 N_("exclude directories containing FILE"), GRID
+1 },
731 {"exclude-vcs", EXCLUDE_VCS_OPTION
, NULL
, 0,
732 N_("exclude version control system directories"), GRID
+1 },
733 {"exclude-backups", EXCLUDE_BACKUPS_OPTION
, NULL
, 0,
734 N_("exclude backup and lock files"), GRID
+1 },
735 {"no-recursion", NO_RECURSION_OPTION
, 0, 0,
736 N_("avoid descending automatically in directories"), GRID
+1 },
737 {"one-file-system", ONE_FILE_SYSTEM_OPTION
, 0, 0,
738 N_("stay in local file system when creating archive"), GRID
+1 },
739 {"recursion", RECURSION_OPTION
, 0, 0,
740 N_("recurse into directories (default)"), GRID
+1 },
741 {"absolute-names", 'P', 0, 0,
742 N_("don't strip leading '/'s from file names"), GRID
+1 },
743 {"dereference", 'h', 0, 0,
744 N_("follow symlinks; archive and dump the files they point to"), GRID
+1 },
745 {"hard-dereference", HARD_DEREFERENCE_OPTION
, 0, 0,
746 N_("follow hard links; archive and dump the files they refer to"), GRID
+1 },
747 {"starting-file", 'K', N_("MEMBER-NAME"), 0,
748 N_("begin at member MEMBER-NAME when reading the archive"), GRID
+1 },
749 {"newer", 'N', N_("DATE-OR-FILE"), 0,
750 N_("only store files newer than DATE-OR-FILE"), GRID
+1 },
751 {"after-date", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
752 {"newer-mtime", NEWER_MTIME_OPTION
, N_("DATE"), 0,
753 N_("compare date and time when data changed only"), GRID
+1 },
754 {"backup", BACKUP_OPTION
, N_("CONTROL"), OPTION_ARG_OPTIONAL
,
755 N_("backup before removal, choose version CONTROL"), GRID
+1 },
756 {"suffix", SUFFIX_OPTION
, N_("STRING"), 0,
757 N_("backup before removal, override usual suffix ('~' unless overridden by environment variable SIMPLE_BACKUP_SUFFIX)"), GRID
+1 },
762 N_("File name transformations:"), GRID
},
763 {"strip-components", STRIP_COMPONENTS_OPTION
, N_("NUMBER"), 0,
764 N_("strip NUMBER leading components from file names on extraction"),
766 {"transform", TRANSFORM_OPTION
, N_("EXPRESSION"), 0,
767 N_("use sed replace EXPRESSION to transform file names"), GRID
+1 },
768 {"xform", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
773 N_("File name matching options (affect both exclude and include patterns):"),
775 {"ignore-case", IGNORE_CASE_OPTION
, 0, 0,
776 N_("ignore case"), GRID
+1 },
777 {"anchored", ANCHORED_OPTION
, 0, 0,
778 N_("patterns match file name start"), GRID
+1 },
779 {"no-anchored", NO_ANCHORED_OPTION
, 0, 0,
780 N_("patterns match after any '/' (default for exclusion)"), GRID
+1 },
781 {"no-ignore-case", NO_IGNORE_CASE_OPTION
, 0, 0,
782 N_("case sensitive matching (default)"), GRID
+1 },
783 {"wildcards", WILDCARDS_OPTION
, 0, 0,
784 N_("use wildcards (default for exclusion)"), GRID
+1 },
785 {"no-wildcards", NO_WILDCARDS_OPTION
, 0, 0,
786 N_("verbatim string matching"), GRID
+1 },
787 {"no-wildcards-match-slash", NO_WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
788 N_("wildcards do not match '/'"), GRID
+1 },
789 {"wildcards-match-slash", WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
790 N_("wildcards match '/' (default for exclusion)"), GRID
+1 },
795 N_("Informative output:"), GRID
},
797 {"verbose", 'v', 0, 0,
798 N_("verbosely list files processed"), GRID
+1 },
799 {"warning", WARNING_OPTION
, N_("KEYWORD"), 0,
800 N_("warning control"), GRID
+1 },
801 {"checkpoint", CHECKPOINT_OPTION
, N_("NUMBER"), OPTION_ARG_OPTIONAL
,
802 N_("display progress messages every NUMBERth record (default 10)"),
804 {"checkpoint-action", CHECKPOINT_ACTION_OPTION
, N_("ACTION"), 0,
805 N_("execute ACTION on each checkpoint"),
807 {"check-links", 'l', 0, 0,
808 N_("print a message if not all links are dumped"), GRID
+1 },
809 {"totals", TOTALS_OPTION
, N_("SIGNAL"), OPTION_ARG_OPTIONAL
,
810 N_("print total bytes after processing the archive; "
811 "with an argument - print total bytes when this SIGNAL is delivered; "
812 "Allowed signals are: SIGHUP, SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; "
813 "the names without SIG prefix are also accepted"), GRID
+1 },
814 {"utc", UTC_OPTION
, 0, 0,
815 N_("print file modification times in UTC"), GRID
+1 },
816 {"full-time", FULL_TIME_OPTION
, 0, 0,
817 N_("print file time to its full resolution"), GRID
+1 },
818 {"index-file", INDEX_FILE_OPTION
, N_("FILE"), 0,
819 N_("send verbose output to FILE"), GRID
+1 },
820 {"block-number", 'R', 0, 0,
821 N_("show block number within archive with each message"), GRID
+1 },
822 {"interactive", 'w', 0, 0,
823 N_("ask for confirmation for every action"), GRID
+1 },
824 {"confirmation", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
825 {"show-defaults", SHOW_DEFAULTS_OPTION
, 0, 0,
826 N_("show tar defaults"), GRID
+1 },
827 {"show-snapshot-field-ranges", SHOW_SNAPSHOT_FIELD_RANGES_OPTION
, 0, 0,
828 N_("show valid ranges for snapshot-file fields"), GRID
+1 },
829 {"show-omitted-dirs", SHOW_OMITTED_DIRS_OPTION
, 0, 0,
830 N_("when listing or extracting, list each directory that does not match search criteria"), GRID
+1 },
831 {"show-transformed-names", SHOW_TRANSFORMED_NAMES_OPTION
, 0, 0,
832 N_("show file or archive names after transformation"),
834 {"show-stored-names", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
835 {"quoting-style", QUOTING_STYLE_OPTION
, N_("STYLE"), 0,
836 N_("set name quoting style; see below for valid STYLE values"), GRID
+1 },
837 {"quote-chars", QUOTE_CHARS_OPTION
, N_("STRING"), 0,
838 N_("additionally quote characters from STRING"), GRID
+1 },
839 {"no-quote-chars", NO_QUOTE_CHARS_OPTION
, N_("STRING"), 0,
840 N_("disable quoting for characters from STRING"), GRID
+1 },
845 N_("Compatibility options:"), GRID
},
848 N_("when creating, same as --old-archive; when extracting, same as --no-same-owner"), GRID
+1 },
853 N_("Other options:"), GRID
},
855 {"restrict", RESTRICT_OPTION
, 0, 0,
856 N_("disable use of some potentially harmful options"), -1 },
862 static char const *const atime_preserve_args
[] =
864 "replace", "system", NULL
867 static enum atime_preserve
const atime_preserve_types
[] =
869 replace_atime_preserve
, system_atime_preserve
872 /* Make sure atime_preserve_types has as much entries as atime_preserve_args
873 (minus 1 for NULL guard) */
874 ARGMATCH_VERIFY (atime_preserve_args
, atime_preserve_types
);
876 /* Wildcard matching settings */
879 default_wildcards
, /* For exclusion == enable_wildcards,
880 for inclusion == disable_wildcards */
885 struct tar_args
/* Variables used during option parsing */
887 struct textual_date
*textual_date
; /* Keeps the arguments to --newer-mtime
888 and/or --date option if they are
890 enum wildcards wildcards
; /* Wildcard settings (--wildcards/
892 int matching_flags
; /* exclude_fnmatch options */
893 int include_anchored
; /* Pattern anchoring options used for
895 bool o_option
; /* True if -o option was given */
896 bool pax_option
; /* True if --pax-option was given */
897 char const *backup_suffix_string
; /* --suffix option argument */
898 char const *version_control_string
; /* --backup option argument */
899 bool input_files
; /* True if some input files where given */
900 int compress_autodetect
; /* True if compression autodetection should
901 be attempted when creating archives */
905 #define MAKE_EXCL_OPTIONS(args) \
906 ((((args)->wildcards != disable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
907 | (args)->matching_flags \
910 #define MAKE_INCL_OPTIONS(args) \
911 ((((args)->wildcards == enable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
912 | (args)->include_anchored \
913 | (args)->matching_flags \
916 static char const * const vcs_file_table
[] = {
948 static char const * const backup_file_table
[] = {
956 add_exclude_array (char const * const * fv
, int opts
)
960 for (i
= 0; fv
[i
]; i
++)
961 add_exclude (excluded
, fv
[i
], opts
);
966 format_default_settings (void)
969 "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s"
974 archive_format_string (DEFAULT_ARCHIVE_FORMAT
),
975 DEFAULT_ARCHIVE
, DEFAULT_BLOCKING
,
976 quoting_style_args
[DEFAULT_QUOTING_STYLE
],
986 set_subcommand_option (enum subcommand subcommand
)
988 if (subcommand_option
!= UNKNOWN_SUBCOMMAND
989 && subcommand_option
!= subcommand
)
991 _("You may not specify more than one '-Acdtrux', '--delete' or '--test-label' option")));
993 subcommand_option
= subcommand
;
997 set_use_compress_program_option (const char *string
)
999 if (use_compress_program_option
1000 && strcmp (use_compress_program_option
, string
) != 0)
1001 USAGE_ERROR ((0, 0, _("Conflicting compression options")));
1003 use_compress_program_option
= string
;
1009 compute_duration ();
1010 print_total_stats ();
1011 #ifndef HAVE_SIGACTION
1012 signal (signo
, sigstat
);
1017 stat_on_signal (int signo
)
1019 #ifdef HAVE_SIGACTION
1021 # define SA_RESTART 0
1023 struct sigaction act
;
1024 act
.sa_handler
= sigstat
;
1025 sigemptyset (&act
.sa_mask
);
1026 act
.sa_flags
= SA_RESTART
;
1027 sigaction (signo
, &act
, NULL
);
1029 signal (signo
, sigstat
);
1034 set_stat_signal (const char *name
)
1036 static struct sigtab
1040 } const sigtab
[] = {
1041 { "SIGUSR1", SIGUSR1
},
1042 { "USR1", SIGUSR1
},
1043 { "SIGUSR2", SIGUSR2
},
1044 { "USR2", SIGUSR2
},
1045 { "SIGHUP", SIGHUP
},
1047 { "SIGINT", SIGINT
},
1049 { "SIGQUIT", SIGQUIT
},
1052 struct sigtab
const *p
;
1054 for (p
= sigtab
; p
< sigtab
+ sizeof (sigtab
) / sizeof (sigtab
[0]); p
++)
1055 if (strcmp (p
->name
, name
) == 0)
1057 stat_on_signal (p
->signo
);
1060 FATAL_ERROR ((0, 0, _("Unknown signal name: %s"), name
));
1066 struct textual_date
*next
;
1073 get_date_or_file (struct tar_args
*args
, const char *option
,
1074 const char *str
, struct timespec
*ts
)
1076 if (FILE_SYSTEM_PREFIX_LEN (str
) != 0
1081 if (stat (str
, &st
) != 0)
1084 USAGE_ERROR ((0, 0, _("Date sample file not found")));
1086 *ts
= get_stat_mtime (&st
);
1090 if (! parse_datetime (ts
, str
, NULL
))
1092 WARN ((0, 0, _("Substituting %s for unknown date format %s"),
1093 tartime (*ts
, false), quote (str
)));
1099 struct textual_date
*p
= xmalloc (sizeof (*p
));
1102 p
->date
= xstrdup (str
);
1103 p
->next
= args
->textual_date
;
1104 args
->textual_date
= p
;
1111 report_textual_dates (struct tar_args
*args
)
1113 struct textual_date
*p
;
1114 for (p
= args
->textual_date
; p
; )
1116 struct textual_date
*next
= p
->next
;
1119 char const *treated_as
= tartime (p
->ts
, true);
1120 if (strcmp (p
->date
, treated_as
) != 0)
1121 WARN ((0, 0, _("Option %s: Treating date '%s' as %s"),
1122 p
->option
, p
->date
, treated_as
));
1131 static bool files_from_option
; /* When set, tar will not refuse to create
1134 /* Default density numbers for [0-9][lmh] device specifications */
1136 #if defined DEVICE_PREFIX && !defined DENSITY_LETTER
1137 # ifndef LOW_DENSITY_NUM
1138 # define LOW_DENSITY_NUM 0
1141 # ifndef MID_DENSITY_NUM
1142 # define MID_DENSITY_NUM 8
1145 # ifndef HIGH_DENSITY_NUM
1146 # define HIGH_DENSITY_NUM 16
1152 tar_help_filter (int key
, const char *text
, void *input
)
1164 s
= xasprintf (_("filter the archive through %s"), BZIP2_PROGRAM
);
1168 s
= xasprintf (_("filter the archive through %s"), GZIP_PROGRAM
);
1172 s
= xasprintf (_("filter the archive through %s"), COMPRESS_PROGRAM
);
1176 s
= xasprintf (_("filter the archive through %s"), LZIP_PROGRAM
);
1180 s
= xasprintf (_("filter the archive through %s"), LZMA_PROGRAM
);
1184 s
= xasprintf (_("filter the archive through %s"), LZOP_PROGRAM
);
1187 s
= xasprintf (_("filter the archive through %s"), XZ_PROGRAM
);
1190 case ARGP_KEY_HELP_EXTRA
:
1194 obstack_init (&stk
);
1195 tstr
= _("Valid arguments for the --quoting-style option are:");
1196 obstack_grow (&stk
, tstr
, strlen (tstr
));
1197 obstack_grow (&stk
, "\n\n", 2);
1198 tar_list_quoting_styles (&stk
, " ");
1199 tstr
= _("\n*This* tar defaults to:\n");
1200 obstack_grow (&stk
, tstr
, strlen (tstr
));
1201 s
= format_default_settings ();
1202 obstack_grow (&stk
, s
, strlen (s
));
1203 obstack_1grow (&stk
, '\n');
1204 obstack_1grow (&stk
, 0);
1205 s
= xstrdup (obstack_finish (&stk
));
1206 obstack_free (&stk
, NULL
);
1213 expand_pax_option (struct tar_args
*targs
, const char *arg
)
1218 obstack_init (&stk
);
1221 size_t seglen
= strcspn (arg
, ",");
1222 char *p
= memchr (arg
, '=', seglen
);
1225 size_t len
= p
- arg
+ 1;
1226 obstack_grow (&stk
, arg
, len
);
1228 for (++p
; *p
&& isspace ((unsigned char) *p
); p
++)
1230 if (*p
== '{' && p
[len
-1] == '}')
1233 char *tmp
= xmalloc (len
);
1234 memcpy (tmp
, p
+ 1, len
-2);
1236 if (get_date_or_file (targs
, "--pax-option", tmp
, &ts
) == 0)
1238 char buf
[TIMESPEC_STRSIZE_BOUND
];
1239 char const *s
= code_timespec (ts
, buf
);
1240 obstack_grow (&stk
, s
, strlen (s
));
1243 obstack_grow (&stk
, p
, len
);
1247 obstack_grow (&stk
, p
, len
);
1250 obstack_grow (&stk
, arg
, seglen
);
1255 obstack_1grow (&stk
, *arg
);
1259 obstack_1grow (&stk
, 0);
1260 res
= xstrdup (obstack_finish (&stk
));
1261 obstack_free (&stk
, NULL
);
1267 parse_owner_group (char *arg
, uintmax_t field_max
, char const **name_option
)
1269 uintmax_t u
= UINTMAX_MAX
;
1271 char const *name
= 0;
1272 char const *invalid_num
= 0;
1273 char *colon
= strchr (arg
, ':');
1277 char const *num
= colon
+ 1;
1281 if (num
&& (! (xstrtoumax (num
, &end
, 10, &u
, "") == LONGINT_OK
1282 && u
<= field_max
)))
1288 switch ('0' <= *arg
&& *arg
<= '9'
1289 ? xstrtoumax (arg
, &end
, 10, &u1
, "")
1297 if (u1
<= field_max
)
1303 case LONGINT_OVERFLOW
:
1310 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (invalid_num
),
1311 _("Invalid owner or group ID")));
1313 *name_option
= name
;
1317 #define TAR_SIZE_SUFFIXES "bBcGgkKMmPTtw"
1319 /* Either NL or NUL, as decided by the --null option. */
1320 static char filename_terminator
;
1322 static char const *const sort_mode_arg
[] = {
1329 static int sort_mode_flag
[] = {
1335 ARGMATCH_VERIFY (sort_mode_arg
, sort_mode_flag
);
1338 parse_opt (int key
, char *arg
, struct argp_state
*state
)
1340 struct tar_args
*args
= state
->input
;
1345 /* File name or non-parsed option, because of ARGP_IN_ORDER */
1346 name_add_name (arg
, MAKE_INCL_OPTIONS (args
));
1347 args
->input_files
= true;
1351 set_subcommand_option (CAT_SUBCOMMAND
);
1355 args
->compress_autodetect
= true;
1358 case NO_AUTO_COMPRESS_OPTION
:
1359 args
->compress_autodetect
= false;
1365 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1366 && u
== (blocking_factor
= u
)
1367 && 0 < blocking_factor
1368 && u
== (record_size
= u
* BLOCKSIZE
) / BLOCKSIZE
))
1369 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1370 _("Invalid blocking factor")));
1375 /* Try to reblock input records. For reading 4.2BSD pipes. */
1377 /* It would surely make sense to exchange -B and -R, but it seems
1378 that -B has been used for a long while in Sun tar and most
1379 BSD-derived systems. This is a consequence of the block/record
1380 terminology confusion. */
1382 read_full_records_option
= true;
1386 set_subcommand_option (CREATE_SUBCOMMAND
);
1394 set_subcommand_option (DIFF_SUBCOMMAND
);
1398 if (archive_names
== allocated_archive_names
)
1399 archive_name_array
= x2nrealloc (archive_name_array
,
1400 &allocated_archive_names
,
1401 sizeof (archive_name_array
[0]));
1403 archive_name_array
[archive_names
++] = arg
;
1407 /* Since -F is only useful with -M, make it implied. Run this
1408 script at the end of each tape. */
1410 info_script_option
= arg
;
1411 multi_volume_option
= true;
1414 case FULL_TIME_OPTION
:
1415 full_time_option
= true;
1419 listed_incremental_option
= arg
;
1420 after_date_option
= true;
1424 /* We are making an incremental dump (FIXME: are we?); save
1425 directories at the beginning of the archive, and include in each
1426 directory its contents. */
1428 incremental_option
= true;
1432 /* Follow symbolic links. */
1433 dereference_option
= true;
1436 case HARD_DEREFERENCE_OPTION
:
1437 hard_dereference_option
= true;
1441 /* Ignore zero blocks (eofs). This can't be the default,
1442 because Unix tar writes two blocks of zeros, then pads out
1443 the record with garbage. */
1445 ignore_zeros_option
= true;
1449 set_use_compress_program_option (BZIP2_PROGRAM
);
1453 set_use_compress_program_option (XZ_PROGRAM
);
1457 /* Don't replace existing files. */
1458 old_files_option
= KEEP_OLD_FILES
;
1462 starting_file_option
= true;
1463 addname (arg
, 0, true, NULL
);
1466 case ONE_FILE_SYSTEM_OPTION
:
1467 /* When dumping directories, don't dump files/subdirectories
1468 that are on other filesystems. */
1469 one_file_system_option
= true;
1472 case ONE_TOP_LEVEL_OPTION
:
1473 one_top_level_option
= true;
1474 one_top_level_dir
= arg
;
1478 check_links_option
= 1;
1486 if (xstrtoumax (arg
, &p
, 10, &u
, TAR_SIZE_SUFFIXES
) != LONGINT_OK
)
1487 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1488 _("Invalid tape length")));
1489 if (p
> arg
&& !strchr (TAR_SIZE_SUFFIXES
, p
[-1]))
1490 tape_length_option
= 1024 * (tarlong
) u
;
1492 tape_length_option
= (tarlong
) u
;
1493 multi_volume_option
= true;
1500 incremental_level
= strtoul (arg
, &p
, 10);
1502 USAGE_ERROR ((0, 0, _("Invalid incremental level value")));
1507 set_use_compress_program_option (LZIP_PROGRAM
);
1511 set_use_compress_program_option (LZMA_PROGRAM
);
1515 set_use_compress_program_option (LZOP_PROGRAM
);
1519 touch_option
= true;
1523 /* Make multivolume archive: when we can't write any more into
1524 the archive, re-open it, and continue writing. */
1526 multi_volume_option
= true;
1530 get_date_or_file (args
, "--mtime", arg
, &mtime_option
);
1531 set_mtime_option
= true;
1538 case NO_SEEK_OPTION
:
1543 after_date_option
= true;
1546 case NEWER_MTIME_OPTION
:
1547 if (NEWER_OPTION_INITIALIZED (newer_mtime_option
))
1548 USAGE_ERROR ((0, 0, _("More than one threshold date")));
1549 get_date_or_file (args
,
1550 key
== NEWER_MTIME_OPTION
? "--newer-mtime"
1551 : "--after-date", arg
, &newer_mtime_option
);
1555 args
->o_option
= true;
1559 to_stdout_option
= true;
1563 same_permissions_option
= true;
1567 absolute_names_option
= true;
1571 set_subcommand_option (APPEND_SUBCOMMAND
);
1575 /* Print block numbers for debugging bad tar archives. */
1577 /* It would surely make sense to exchange -B and -R, but it seems
1578 that -B has been used for a long while in Sun tar and most
1579 BSD-derived systems. This is a consequence of the block/record
1580 terminology confusion. */
1582 block_number_option
= true;
1586 /* Names to extract are sorted. */
1588 same_order_option
= true;
1592 sparse_option
= true;
1595 case SKIP_OLD_FILES_OPTION
:
1596 old_files_option
= SKIP_OLD_FILES
;
1599 case SPARSE_VERSION_OPTION
:
1600 sparse_option
= true;
1603 tar_sparse_major
= strtoul (arg
, &p
, 10);
1607 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1608 tar_sparse_minor
= strtoul (p
+ 1, &p
, 10);
1610 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1616 set_subcommand_option (LIST_SUBCOMMAND
);
1620 case TEST_LABEL_OPTION
:
1621 set_subcommand_option (TEST_LABEL_SUBCOMMAND
);
1625 name_add_file (arg
, filename_terminator
);
1626 /* Indicate we've been given -T option. This is for backward
1627 compatibility only, so that `tar cfT archive /dev/null will
1629 files_from_option
= true;
1633 set_subcommand_option (UPDATE_SUBCOMMAND
);
1637 old_files_option
= UNLINK_FIRST_OLD_FILES
;
1646 warning_option
|= WARN_VERBOSE_WARNINGS
;
1650 volume_label_option
= arg
;
1654 interactive_option
= true;
1658 verify_option
= true;
1662 set_subcommand_option (EXTRACT_SUBCOMMAND
);
1666 if (add_exclude_file (add_exclude
, excluded
, arg
,
1667 MAKE_EXCL_OPTIONS (args
), '\n')
1671 FATAL_ERROR ((0, e
, "%s", quotearg_colon (arg
)));
1676 set_use_compress_program_option (GZIP_PROGRAM
);
1680 set_use_compress_program_option (COMPRESS_PROGRAM
);
1683 case ANCHORED_OPTION
:
1684 args
->matching_flags
|= EXCLUDE_ANCHORED
;
1687 case ATIME_PRESERVE_OPTION
:
1688 atime_preserve_option
=
1690 ? XARGMATCH ("--atime-preserve", arg
,
1691 atime_preserve_args
, atime_preserve_types
)
1692 : replace_atime_preserve
);
1693 if (! O_NOATIME
&& atime_preserve_option
== system_atime_preserve
)
1695 _("--atime-preserve='system' is not supported"
1696 " on this platform")));
1699 case CHECK_DEVICE_OPTION
:
1700 check_device_option
= true;
1703 case NO_CHECK_DEVICE_OPTION
:
1704 check_device_option
= false;
1707 case CHECKPOINT_OPTION
:
1714 checkpoint_compile_action (".");
1717 checkpoint_option
= strtoul (arg
, &p
, 0);
1720 _("--checkpoint value is not an integer")));
1723 checkpoint_option
= DEFAULT_CHECKPOINT
;
1726 case CHECKPOINT_ACTION_OPTION
:
1727 checkpoint_compile_action (arg
);
1731 backup_option
= true;
1733 args
->version_control_string
= arg
;
1736 case DELAY_DIRECTORY_RESTORE_OPTION
:
1737 delay_directory_restore_option
= true;
1740 case NO_DELAY_DIRECTORY_RESTORE_OPTION
:
1741 delay_directory_restore_option
= false;
1745 set_subcommand_option (DELETE_SUBCOMMAND
);
1748 case EXCLUDE_BACKUPS_OPTION
:
1749 add_exclude_array (backup_file_table
, EXCLUDE_WILDCARDS
);
1752 case EXCLUDE_OPTION
:
1753 add_exclude (excluded
, arg
, MAKE_EXCL_OPTIONS (args
));
1756 case EXCLUDE_CACHES_OPTION
:
1757 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_contents
,
1761 case EXCLUDE_CACHES_UNDER_OPTION
:
1762 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_under
,
1766 case EXCLUDE_CACHES_ALL_OPTION
:
1767 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_all
,
1771 case EXCLUDE_TAG_OPTION
:
1772 add_exclusion_tag (arg
, exclusion_tag_contents
, NULL
);
1775 case EXCLUDE_TAG_UNDER_OPTION
:
1776 add_exclusion_tag (arg
, exclusion_tag_under
, NULL
);
1779 case EXCLUDE_TAG_ALL_OPTION
:
1780 add_exclusion_tag (arg
, exclusion_tag_all
, NULL
);
1783 case EXCLUDE_VCS_OPTION
:
1784 add_exclude_array (vcs_file_table
, 0);
1787 case FORCE_LOCAL_OPTION
:
1788 force_local_option
= true;
1792 set_archive_format (arg
);
1795 case INDEX_FILE_OPTION
:
1796 index_file_name
= arg
;
1799 case IGNORE_CASE_OPTION
:
1800 args
->matching_flags
|= FNM_CASEFOLD
;
1803 case IGNORE_COMMAND_ERROR_OPTION
:
1804 ignore_command_error_option
= true;
1807 case IGNORE_FAILED_READ_OPTION
:
1808 ignore_failed_read_option
= true;
1811 case KEEP_DIRECTORY_SYMLINK_OPTION
:
1812 keep_directory_symlink_option
= true;
1815 case KEEP_NEWER_FILES_OPTION
:
1816 old_files_option
= KEEP_NEWER_FILES
;
1821 uintmax_t u
= parse_owner_group (arg
, TYPE_MAXIMUM (gid_t
),
1822 &group_name_option
);
1823 if (u
== UINTMAX_MAX
)
1826 if (group_name_option
)
1827 gname_to_gid (group_name_option
, &group_option
);
1835 mode_option
= mode_compile (arg
);
1837 FATAL_ERROR ((0, 0, _("Invalid mode given on option")));
1838 initial_umask
= umask (0);
1839 umask (initial_umask
);
1842 case NO_ANCHORED_OPTION
:
1843 args
->include_anchored
= 0; /* Clear the default for comman line args */
1844 args
->matching_flags
&= ~ EXCLUDE_ANCHORED
;
1847 case NO_IGNORE_CASE_OPTION
:
1848 args
->matching_flags
&= ~ FNM_CASEFOLD
;
1851 case NO_IGNORE_COMMAND_ERROR_OPTION
:
1852 ignore_command_error_option
= false;
1855 case NO_OVERWRITE_DIR_OPTION
:
1856 old_files_option
= NO_OVERWRITE_DIR_OLD_FILES
;
1859 case NO_QUOTE_CHARS_OPTION
:
1861 set_char_quoting (NULL
, *arg
, 0);
1864 case NO_WILDCARDS_OPTION
:
1865 args
->wildcards
= disable_wildcards
;
1868 case NO_WILDCARDS_MATCH_SLASH_OPTION
:
1869 args
->matching_flags
|= FNM_FILE_NAME
;
1873 filename_terminator
= '\0';
1876 case NO_NULL_OPTION
:
1877 filename_terminator
= '\n';
1880 case NUMERIC_OWNER_OPTION
:
1881 numeric_owner_option
= true;
1884 case OCCURRENCE_OPTION
:
1886 occurrence_option
= 1;
1890 if (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
)
1891 occurrence_option
= u
;
1893 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1894 _("Invalid number")));
1898 case OLD_ARCHIVE_OPTION
:
1899 set_archive_format ("v7");
1902 case OVERWRITE_DIR_OPTION
:
1903 old_files_option
= DEFAULT_OLD_FILES
;
1906 case OVERWRITE_OPTION
:
1907 old_files_option
= OVERWRITE_OLD_FILES
;
1912 uintmax_t u
= parse_owner_group (arg
, TYPE_MAXIMUM (uid_t
),
1913 &owner_name_option
);
1914 if (u
== UINTMAX_MAX
)
1917 if (owner_name_option
)
1918 uname_to_uid (owner_name_option
, &owner_option
);
1925 case QUOTE_CHARS_OPTION
:
1927 set_char_quoting (NULL
, *arg
, 1);
1930 case QUOTING_STYLE_OPTION
:
1931 tar_set_quoting_style (arg
);
1936 char *tmp
= expand_pax_option (args
, arg
);
1937 args
->pax_option
= true;
1938 xheader_set_option (tmp
);
1944 set_archive_format ("posix");
1947 case PRESERVE_OPTION
:
1948 /* FIXME: What it is good for? */
1949 same_permissions_option
= true;
1950 same_order_option
= true;
1951 WARN ((0, 0, _("The --preserve option is deprecated, "
1952 "use --preserve-permissions --preserve-order instead")));
1955 case RECORD_SIZE_OPTION
:
1959 if (! (xstrtoumax (arg
, NULL
, 10, &u
, TAR_SIZE_SUFFIXES
) == LONGINT_OK
1960 && u
== (size_t) u
))
1961 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1962 _("Invalid record size")));
1964 if (record_size
% BLOCKSIZE
!= 0)
1965 USAGE_ERROR ((0, 0, _("Record size must be a multiple of %d."),
1967 blocking_factor
= record_size
/ BLOCKSIZE
;
1971 case RECURSIVE_UNLINK_OPTION
:
1972 recursive_unlink_option
= true;
1975 case REMOVE_FILES_OPTION
:
1976 remove_files_option
= true;
1979 case RESTRICT_OPTION
:
1980 restrict_option
= true;
1983 case RMT_COMMAND_OPTION
:
1987 case RSH_COMMAND_OPTION
:
1988 rsh_command_option
= arg
;
1991 case SHOW_DEFAULTS_OPTION
:
1993 char *s
= format_default_settings ();
2000 case SHOW_SNAPSHOT_FIELD_RANGES_OPTION
:
2001 show_snapshot_field_ranges ();
2005 case STRIP_COMPONENTS_OPTION
:
2008 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
2009 && u
== (size_t) u
))
2010 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
2011 _("Invalid number of elements")));
2012 strip_name_components
= u
;
2016 case SHOW_OMITTED_DIRS_OPTION
:
2017 show_omitted_dirs_option
= true;
2020 case SHOW_TRANSFORMED_NAMES_OPTION
:
2021 show_transformed_names_option
= true;
2025 savedir_sort_order
= XARGMATCH ("--sort", arg
,
2026 sort_mode_arg
, sort_mode_flag
);
2030 backup_option
= true;
2031 args
->backup_suffix_string
= arg
;
2034 case TO_COMMAND_OPTION
:
2035 if (to_command_option
)
2036 USAGE_ERROR ((0, 0, _("Only one --to-command option allowed")));
2037 to_command_option
= arg
;
2042 set_stat_signal (arg
);
2044 totals_option
= true;
2047 case TRANSFORM_OPTION
:
2048 set_transform_expr (arg
);
2052 set_use_compress_program_option (arg
);
2055 case VOLNO_FILE_OPTION
:
2056 volno_file_option
= arg
;
2059 case WILDCARDS_OPTION
:
2060 args
->wildcards
= enable_wildcards
;
2063 case WILDCARDS_MATCH_SLASH_OPTION
:
2064 args
->matching_flags
&= ~ FNM_FILE_NAME
;
2067 case NO_RECURSION_OPTION
:
2068 recursion_option
= 0;
2071 case NO_SAME_OWNER_OPTION
:
2072 same_owner_option
= -1;
2075 case NO_SAME_PERMISSIONS_OPTION
:
2076 same_permissions_option
= -1;
2080 set_archive_format ("posix");
2084 case NO_ACLS_OPTION
:
2088 case SELINUX_CONTEXT_OPTION
:
2089 set_archive_format ("posix");
2090 selinux_context_option
= 1;
2093 case NO_SELINUX_CONTEXT_OPTION
:
2094 selinux_context_option
= -1;
2098 set_archive_format ("posix");
2102 case NO_XATTR_OPTION
:
2108 xattrs_mask_add (arg
, (key
== XATTR_INCLUDE
));
2111 case RECURSION_OPTION
:
2112 recursion_option
= FNM_LEADING_DIR
;
2115 case SAME_OWNER_OPTION
:
2116 same_owner_option
= 1;
2119 case UNQUOTE_OPTION
:
2120 unquote_option
= true;
2123 case NO_UNQUOTE_OPTION
:
2124 unquote_option
= false;
2127 case WARNING_OPTION
:
2128 set_warning_option (arg
);
2140 #ifdef DEVICE_PREFIX
2142 int device
= key
- '0';
2144 static char buf
[sizeof DEVICE_PREFIX
+ 10];
2148 argp_error (state
, _("Malformed density argument: %s"), quote (arg
));
2150 strcpy (buf
, DEVICE_PREFIX
);
2151 cursor
= buf
+ strlen (buf
);
2153 #ifdef DENSITY_LETTER
2155 sprintf (cursor
, "%d%c", device
, arg
[0]);
2157 #else /* not DENSITY_LETTER */
2162 device
+= LOW_DENSITY_NUM
;
2166 device
+= MID_DENSITY_NUM
;
2170 device
+= HIGH_DENSITY_NUM
;
2174 argp_error (state
, _("Unknown density: '%c'"), arg
[0]);
2176 sprintf (cursor
, "%d", device
);
2178 #endif /* not DENSITY_LETTER */
2180 if (archive_names
== allocated_archive_names
)
2181 archive_name_array
= x2nrealloc (archive_name_array
,
2182 &allocated_archive_names
,
2183 sizeof (archive_name_array
[0]));
2184 archive_name_array
[archive_names
++] = xstrdup (buf
);
2188 #else /* not DEVICE_PREFIX */
2191 _("Options '-[0-7][lmh]' not supported by *this* tar"));
2193 #endif /* not DEVICE_PREFIX */
2196 return ARGP_ERR_UNKNOWN
;
2201 static struct argp argp
= {
2214 argp_help (&argp
, stderr
, ARGP_HELP_SEE
, (char*) program_name
);
2219 /* Parse the options for tar. */
2221 static struct argp_option
*
2222 find_argp_option (struct argp_option
*o
, int letter
)
2229 && o
->doc
== NULL
); o
++)
2230 if (o
->key
== letter
)
2235 static const char *tar_authors
[] = {
2241 /* Subcommand classes */
2242 #define SUBCL_READ 0x01 /* subcommand reads from the archive */
2243 #define SUBCL_WRITE 0x02 /* subcommand writes to the archive */
2244 #define SUBCL_UPDATE 0x04 /* subcommand updates existing archive */
2245 #define SUBCL_TEST 0x08 /* subcommand tests archive header or meta-info */
2246 #define SUBCL_OCCUR 0x10 /* subcommand allows the use of the occurrence
2249 static int subcommand_class
[] = {
2250 /* UNKNOWN_SUBCOMMAND */ 0,
2251 /* APPEND_SUBCOMMAND */ SUBCL_WRITE
|SUBCL_UPDATE
,
2252 /* CAT_SUBCOMMAND */ SUBCL_WRITE
,
2253 /* CREATE_SUBCOMMAND */ SUBCL_WRITE
,
2254 /* DELETE_SUBCOMMAND */ SUBCL_WRITE
|SUBCL_UPDATE
|SUBCL_OCCUR
,
2255 /* DIFF_SUBCOMMAND */ SUBCL_READ
|SUBCL_OCCUR
,
2256 /* EXTRACT_SUBCOMMAND */ SUBCL_READ
|SUBCL_OCCUR
,
2257 /* LIST_SUBCOMMAND */ SUBCL_READ
|SUBCL_OCCUR
,
2258 /* UPDATE_SUBCOMMAND */ SUBCL_WRITE
|SUBCL_UPDATE
,
2259 /* TEST_LABEL_SUBCOMMAND */ SUBCL_TEST
2262 /* Return t if the subcommand_option is in class(es) f */
2263 #define IS_SUBCOMMAND_CLASS(f) (subcommand_class[subcommand_option] & (f))
2265 static struct tar_args args
;
2268 option_conflict_error (const char *a
, const char *b
)
2270 /* TRANSLATORS: Both %s in this statement are replaced with
2272 USAGE_ERROR ((0, 0, _("'%s' cannot be used with '%s'"), a
, b
));
2276 decode_options (int argc
, char **argv
)
2280 argp_version_setup ("tar", tar_authors
);
2282 /* Set some default option values. */
2283 args
.textual_date
= NULL
;
2284 args
.wildcards
= default_wildcards
;
2285 args
.matching_flags
= 0;
2286 args
.include_anchored
= EXCLUDE_ANCHORED
;
2287 args
.o_option
= false;
2288 args
.pax_option
= false;
2289 args
.backup_suffix_string
= getenv ("SIMPLE_BACKUP_SUFFIX");
2290 args
.version_control_string
= 0;
2291 args
.input_files
= false;
2292 args
.compress_autodetect
= false;
2294 subcommand_option
= UNKNOWN_SUBCOMMAND
;
2295 archive_format
= DEFAULT_FORMAT
;
2296 blocking_factor
= DEFAULT_BLOCKING
;
2297 record_size
= DEFAULT_BLOCKING
* BLOCKSIZE
;
2298 excluded
= new_exclude ();
2299 newer_mtime_option
.tv_sec
= TYPE_MINIMUM (time_t);
2300 newer_mtime_option
.tv_nsec
= -1;
2301 recursion_option
= FNM_LEADING_DIR
;
2302 unquote_option
= true;
2303 tar_sparse_major
= 1;
2304 tar_sparse_minor
= 0;
2306 savedir_sort_order
= SAVEDIR_SORT_NONE
;
2308 owner_option
= -1; owner_name_option
= NULL
;
2309 group_option
= -1; group_name_option
= NULL
;
2311 check_device_option
= true;
2313 incremental_level
= -1;
2317 /* Convert old-style tar call by exploding option element and rearranging
2318 options accordingly. */
2320 if (argc
> 1 && argv
[1][0] != '-')
2322 int new_argc
; /* argc value for rearranged arguments */
2323 char **new_argv
; /* argv value for rearranged arguments */
2324 char *const *in
; /* cursor into original argv */
2325 char **out
; /* cursor into rearranged argv */
2326 const char *letter
; /* cursor into old option letters */
2327 char buffer
[3]; /* constructed option buffer */
2329 /* Initialize a constructed option. */
2334 /* Allocate a new argument array, and copy program name in it. */
2336 new_argc
= argc
- 1 + strlen (argv
[1]);
2337 new_argv
= xmalloc ((new_argc
+ 1) * sizeof (char *));
2342 /* Copy each old letter option as a separate option, and have the
2343 corresponding argument moved next to it. */
2345 for (letter
= *in
++; *letter
; letter
++)
2347 struct argp_option
*opt
;
2349 buffer
[1] = *letter
;
2350 *out
++ = xstrdup (buffer
);
2351 opt
= find_argp_option (options
, *letter
);
2352 if (opt
&& opt
->arg
)
2354 if (in
< argv
+ argc
)
2357 USAGE_ERROR ((0, 0, _("Old option '%c' requires an argument."),
2362 /* Copy all remaining options. */
2364 while (in
< argv
+ argc
)
2368 /* Replace the old option list by the new one. */
2374 /* Parse all options and non-options as they appear. */
2376 prepend_default_options (getenv ("TAR_OPTIONS"), &argc
, &argv
);
2378 if (argp_parse (&argp
, argc
, argv
, ARGP_IN_ORDER
, &idx
, &args
))
2379 exit (TAREXIT_FAILURE
);
2381 /* Special handling for 'o' option:
2383 GNU tar used to say "output old format".
2384 UNIX98 tar says don't chown files after extracting (we use
2385 "--no-same-owner" for this).
2387 The old GNU tar semantics is retained when used with --create
2388 option, otherwise UNIX98 semantics is assumed */
2392 if (subcommand_option
== CREATE_SUBCOMMAND
)
2394 /* GNU Tar <= 1.13 compatibility */
2395 set_archive_format ("v7");
2399 /* UNIX98 compatibility */
2400 same_owner_option
= -1;
2404 /* Handle operands after any "--" argument. */
2405 for (; idx
< argc
; idx
++)
2407 name_add_name (argv
[idx
], MAKE_INCL_OPTIONS (&args
));
2408 args
.input_files
= true;
2411 /* Warn about implicit use of the wildcards in command line arguments.
2413 warn_regex_usage
= args
.wildcards
== default_wildcards
;
2415 /* Derive option values and check option consistency. */
2417 if (archive_format
== DEFAULT_FORMAT
)
2419 if (args
.pax_option
)
2420 archive_format
= POSIX_FORMAT
;
2422 archive_format
= DEFAULT_ARCHIVE_FORMAT
;
2425 if ((volume_label_option
&& subcommand_option
== CREATE_SUBCOMMAND
)
2426 || incremental_option
2427 || multi_volume_option
2429 assert_format (FORMAT_MASK (OLDGNU_FORMAT
)
2430 | FORMAT_MASK (GNU_FORMAT
)
2431 | FORMAT_MASK (POSIX_FORMAT
));
2433 if (occurrence_option
)
2435 if (!args
.input_files
)
2437 _("--occurrence is meaningless without a file list")));
2438 if (!IS_SUBCOMMAND_CLASS (SUBCL_OCCUR
))
2439 option_conflict_error ("--occurrence",
2440 subcommand_string (subcommand_option
));
2443 if (archive_names
== 0)
2445 /* If no archive file name given, try TAPE from the environment, or
2446 else, DEFAULT_ARCHIVE from the configuration process. */
2449 archive_name_array
[0] = getenv ("TAPE");
2450 if (! archive_name_array
[0])
2451 archive_name_array
[0] = DEFAULT_ARCHIVE
;
2454 /* Allow multiple archives only with '-M'. */
2456 if (archive_names
> 1 && !multi_volume_option
)
2458 _("Multiple archive files require '-M' option")));
2460 if (listed_incremental_option
2461 && NEWER_OPTION_INITIALIZED (newer_mtime_option
))
2462 option_conflict_error ("--listed-incremental", "--newer");
2464 if (incremental_level
!= -1 && !listed_incremental_option
)
2466 _("--level is meaningless without --listed-incremental")));
2468 if (volume_label_option
)
2470 if (archive_format
== GNU_FORMAT
|| archive_format
== OLDGNU_FORMAT
)
2472 size_t volume_label_max_len
=
2473 (sizeof current_header
->header
.name
2474 - 1 /* for trailing '\0' */
2475 - (multi_volume_option
2476 ? (sizeof " Volume "
2477 - 1 /* for null at end of " Volume " */
2478 + INT_STRLEN_BOUND (int) /* for volume number */
2479 - 1 /* for sign, as 0 <= volno */)
2481 if (volume_label_max_len
< strlen (volume_label_option
))
2483 ngettext ("%s: Volume label is too long (limit is %lu byte)",
2484 "%s: Volume label is too long (limit is %lu bytes)",
2485 volume_label_max_len
),
2486 quotearg_colon (volume_label_option
),
2487 (unsigned long) volume_label_max_len
));
2490 Label length in PAX format is limited by the volume size. */
2495 if (multi_volume_option
)
2496 USAGE_ERROR ((0, 0, _("Cannot verify multi-volume archives")));
2497 if (use_compress_program_option
)
2498 USAGE_ERROR ((0, 0, _("Cannot verify compressed archives")));
2499 if (!IS_SUBCOMMAND_CLASS (SUBCL_WRITE
))
2500 option_conflict_error ("--verify",
2501 subcommand_string (subcommand_option
));
2504 if (use_compress_program_option
)
2506 if (multi_volume_option
)
2507 USAGE_ERROR ((0, 0, _("Cannot use multi-volume compressed archives")));
2508 if (IS_SUBCOMMAND_CLASS (SUBCL_UPDATE
))
2509 USAGE_ERROR ((0, 0, _("Cannot update compressed archives")));
2510 if (subcommand_option
== CAT_SUBCOMMAND
)
2511 USAGE_ERROR ((0, 0, _("Cannot concatenate compressed archives")));
2514 /* It is no harm to use --pax-option on non-pax archives in archive
2515 reading mode. It may even be useful, since it allows to override
2516 file attributes from tar headers. Therefore I allow such usage.
2519 && archive_format
!= POSIX_FORMAT
2520 && !IS_SUBCOMMAND_CLASS (SUBCL_READ
))
2521 USAGE_ERROR ((0, 0, _("--pax-option can be used only on POSIX archives")));
2523 /* star creates non-POSIX typed archives with xattr support, so allow the
2524 extra headers when reading */
2525 if ((acls_option
> 0)
2526 && archive_format
!= POSIX_FORMAT
2527 && !IS_SUBCOMMAND_CLASS (SUBCL_READ
))
2528 USAGE_ERROR ((0, 0, _("--acls can be used only on POSIX archives")));
2530 if ((selinux_context_option
> 0)
2531 && archive_format
!= POSIX_FORMAT
2532 && !IS_SUBCOMMAND_CLASS (SUBCL_READ
))
2533 USAGE_ERROR ((0, 0, _("--selinux can be used only on POSIX archives")));
2535 if ((xattrs_option
> 0)
2536 && archive_format
!= POSIX_FORMAT
2537 && !IS_SUBCOMMAND_CLASS (SUBCL_READ
))
2538 USAGE_ERROR ((0, 0, _("--xattrs can be used only on POSIX archives")));
2540 if (starting_file_option
&& !IS_SUBCOMMAND_CLASS (SUBCL_READ
))
2541 option_conflict_error ("--starting-file",
2542 subcommand_string (subcommand_option
));
2544 if (same_order_option
&& !IS_SUBCOMMAND_CLASS (SUBCL_READ
))
2545 option_conflict_error ("--same-order",
2546 subcommand_string (subcommand_option
));
2548 if (one_top_level_option
)
2552 if (!IS_SUBCOMMAND_CLASS (SUBCL_READ
))
2553 option_conflict_error ("--one-top-level",
2554 subcommand_string (subcommand_option
));
2555 if (absolute_names_option
)
2556 option_conflict_error ("--one-top-level", "--absolute-names");
2558 /* If the user wants to guarantee that everything is under one directory,
2559 determine its name now and let it be created later. */
2560 base
= base_name (archive_name_array
[0]);
2561 one_top_level_dir
= strip_compression_suffix (base
);
2564 if (!one_top_level_dir
)
2566 _("Cannot deduce top-level directory name; "
2567 "please set it explicitly with --one-top-level=DIR")));
2570 /* If ready to unlink hierarchies, so we are for simpler files. */
2571 if (recursive_unlink_option
)
2572 old_files_option
= UNLINK_FIRST_OLD_FILES
;
2574 /* Flags for accessing files to be read from or copied into. POSIX says
2575 O_NONBLOCK has unspecified effect on most types of files, but in
2576 practice it never harms and sometimes helps. */
2578 int base_open_flags
=
2579 (O_BINARY
| O_CLOEXEC
| O_NOCTTY
| O_NONBLOCK
2580 | (dereference_option
? 0 : O_NOFOLLOW
)
2581 | (atime_preserve_option
== system_atime_preserve
? O_NOATIME
: 0));
2582 open_read_flags
= O_RDONLY
| base_open_flags
;
2583 open_searchdir_flags
= O_SEARCH
| O_DIRECTORY
| base_open_flags
;
2585 fstatat_flags
= dereference_option
? 0 : AT_SYMLINK_NOFOLLOW
;
2587 if (subcommand_option
== TEST_LABEL_SUBCOMMAND
)
2589 /* --test-label is silent if the user has specified the label name to
2591 if (!args
.input_files
)
2594 else if (utc_option
)
2597 if (tape_length_option
&& tape_length_option
< record_size
)
2598 USAGE_ERROR ((0, 0, _("Volume length cannot be less than record size")));
2600 if (same_order_option
&& listed_incremental_option
)
2601 option_conflict_error ("--preserve-order", "--listed-incremental");
2603 /* Forbid using -c with no input files whatsoever. Check that '-f -',
2604 explicit or implied, is used correctly. */
2606 switch (subcommand_option
)
2608 case CREATE_SUBCOMMAND
:
2609 if (!args
.input_files
&& !files_from_option
)
2611 _("Cowardly refusing to create an empty archive")));
2612 if (args
.compress_autodetect
&& archive_names
2613 && strcmp (archive_name_array
[0], "-"))
2614 set_compression_program_by_suffix (archive_name_array
[0],
2615 use_compress_program_option
);
2618 case EXTRACT_SUBCOMMAND
:
2619 case LIST_SUBCOMMAND
:
2620 case DIFF_SUBCOMMAND
:
2621 case TEST_LABEL_SUBCOMMAND
:
2622 for (archive_name_cursor
= archive_name_array
;
2623 archive_name_cursor
< archive_name_array
+ archive_names
;
2624 archive_name_cursor
++)
2625 if (!strcmp (*archive_name_cursor
, "-"))
2626 request_stdin ("-f");
2629 case CAT_SUBCOMMAND
:
2630 case UPDATE_SUBCOMMAND
:
2631 case APPEND_SUBCOMMAND
:
2632 for (archive_name_cursor
= archive_name_array
;
2633 archive_name_cursor
< archive_name_array
+ archive_names
;
2634 archive_name_cursor
++)
2635 if (!strcmp (*archive_name_cursor
, "-"))
2637 _("Options '-Aru' are incompatible with '-f -'")));
2643 /* Initialize stdlis */
2644 if (index_file_name
)
2646 stdlis
= fopen (index_file_name
, "w");
2648 open_fatal (index_file_name
);
2651 stdlis
= to_stdout_option
? stderr
: stdout
;
2653 archive_name_cursor
= archive_name_array
;
2655 /* Prepare for generating backup names. */
2657 if (args
.backup_suffix_string
)
2658 simple_backup_suffix
= xstrdup (args
.backup_suffix_string
);
2662 backup_type
= xget_version ("--backup", args
.version_control_string
);
2663 /* No backup is needed either if explicitely disabled or if
2664 the extracted files are not being written to disk. */
2665 if (backup_type
== no_backups
|| EXTRACT_OVER_PIPE
)
2666 backup_option
= false;
2669 checkpoint_finish_compile ();
2671 report_textual_dates (&args
);
2675 more_options (int argc
, char **argv
)
2678 if (argp_parse (&argp
, argc
, argv
, ARGP_IN_ORDER
,
2680 exit (TAREXIT_FAILURE
);
2685 /* Main routine for tar. */
2687 main (int argc
, char **argv
)
2690 set_program_name (argv
[0]);
2692 setlocale (LC_ALL
, "");
2693 bindtextdomain (PACKAGE
, LOCALEDIR
);
2694 textdomain (PACKAGE
);
2696 exit_failure
= TAREXIT_FAILURE
;
2697 exit_status
= TAREXIT_SUCCESS
;
2698 error_hook
= checkpoint_flush_actions
;
2700 filename_terminator
= '\n';
2701 set_quoting_style (0, DEFAULT_QUOTING_STYLE
);
2703 /* Make sure we have first three descriptors available */
2706 /* Pre-allocate a few structures. */
2708 allocated_archive_names
= 10;
2709 archive_name_array
=
2710 xmalloc (sizeof (const char *) * allocated_archive_names
);
2713 /* System V fork+wait does not work if SIGCHLD is ignored. */
2714 signal (SIGCHLD
, SIG_DFL
);
2716 /* Try to disable the ability to unlink a directory. */
2717 priv_set_remove_linkdir ();
2719 /* Decode options. */
2721 decode_options (argc
, argv
);
2725 /* Main command execution. */
2727 if (volno_file_option
)
2728 init_volume_number ();
2730 switch (subcommand_option
)
2732 case UNKNOWN_SUBCOMMAND
:
2734 _("You must specify one of the '-Acdtrux', '--delete' or '--test-label' options")));
2736 case CAT_SUBCOMMAND
:
2737 case UPDATE_SUBCOMMAND
:
2738 case APPEND_SUBCOMMAND
:
2742 case DELETE_SUBCOMMAND
:
2743 delete_archive_members ();
2746 case CREATE_SUBCOMMAND
:
2750 case EXTRACT_SUBCOMMAND
:
2752 read_and (extract_archive
);
2754 /* FIXME: should extract_finish () even if an ordinary signal is
2760 case LIST_SUBCOMMAND
:
2761 read_and (list_archive
);
2764 case DIFF_SUBCOMMAND
:
2766 read_and (diff_archive
);
2769 case TEST_LABEL_SUBCOMMAND
:
2770 test_archive_label ();
2773 checkpoint_finish ();
2776 print_total_stats ();
2778 if (check_links_option
)
2781 if (volno_file_option
)
2782 closeout_volume_number ();
2784 /* Dispose of allocated memory, and return. */
2786 free (archive_name_array
);
2787 xattrs_clear_setup ();
2790 if (exit_status
== TAREXIT_FAILURE
)
2791 error (0, 0, _("Exiting with failure status due to previous errors"));
2793 if (stdlis
== stdout
)
2795 else if (ferror (stderr
) || fclose (stderr
) != 0)
2796 set_exit_status (TAREXIT_FAILURE
);
2802 tar_stat_init (struct tar_stat_info
*st
)
2804 memset (st
, 0, sizeof (*st
));
2807 /* Close the stream or file descriptor associated with ST, and remove
2808 all traces of it from ST. Return true if successful, false (with a
2809 diagnostic) otherwise. */
2811 tar_stat_close (struct tar_stat_info
*st
)
2813 int status
= (st
->dirstream
? closedir (st
->dirstream
)
2814 : 0 < st
->fd
? close (st
->fd
)
2823 close_diag (st
->orig_file_name
);
2829 tar_stat_destroy (struct tar_stat_info
*st
)
2831 tar_stat_close (st
);
2832 xheader_xattr_free (st
->xattr_map
, st
->xattr_map_size
);
2833 free (st
->orig_file_name
);
2834 free (st
->file_name
);
2835 free (st
->link_name
);
2838 free (st
->cntx_name
);
2839 free (st
->acls_a_ptr
);
2840 free (st
->acls_d_ptr
);
2841 free (st
->sparse_map
);
2843 xheader_destroy (&st
->xhdr
);
2844 memset (st
, 0, sizeof (*st
));
2847 /* Format mask for all available formats that support nanosecond
2848 timestamp resolution. */
2849 #define NS_PRECISION_FORMAT_MASK FORMAT_MASK (POSIX_FORMAT)
2851 /* Same as timespec_cmp, but ignore nanoseconds if current archive
2852 format does not provide sufficient resolution. */
2854 tar_timespec_cmp (struct timespec a
, struct timespec b
)
2856 if (!(FORMAT_MASK (current_format
) & NS_PRECISION_FORMAT_MASK
))
2857 a
.tv_nsec
= b
.tv_nsec
= 0;
2858 return timespec_cmp (a
, b
);
2861 /* Set tar exit status to VAL, unless it is already indicating
2862 a more serious condition. This relies on the fact that the
2863 values of TAREXIT_ constants are ranged by severity. */
2865 set_exit_status (int val
)
2867 if (val
> exit_status
)