1 /* A tar (tape archiver) program.
3 Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000,
4 2001, 2003, 2004, 2005, 2006, 2007, 2012
5 Free Software Foundation, Inc.
7 Written by John Gilmore, starting 1985-08-25.
9 This program is free software; you can redistribute it and/or modify it
10 under the terms of the GNU General Public License as published by the
11 Free Software Foundation; either version 3, or (at your option) any later
14 This program is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
17 Public License for more details.
19 You should have received a copy of the GNU General Public License along
20 with this program; if not, write to the Free Software Foundation, Inc.,
21 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
27 #include <argp-namefrob.h>
28 #include <argp-fmtstream.h>
29 #include <argp-version-etc.h>
32 #if ! defined SIGCHLD && defined SIGCLD
33 # define SIGCHLD SIGCLD
36 /* The following causes "common.h" to produce definitions of all the global
37 variables, rather than just "extern" declarations of them. GNU tar does
38 depend on the system loader to preset all GLOBAL variables to neutral (or
39 zero) values; explicit initialization is usually not done. */
45 #include <configmake.h>
47 #include <parse-datetime.h>
49 #include <rmt-command.h>
52 #include <version-etc.h>
57 /* Local declarations. */
59 #ifndef DEFAULT_ARCHIVE_FORMAT
60 # define DEFAULT_ARCHIVE_FORMAT GNU_FORMAT
63 #ifndef DEFAULT_ARCHIVE
64 # define DEFAULT_ARCHIVE "tar.out"
67 #ifndef DEFAULT_BLOCKING
68 # define DEFAULT_BLOCKING 20
74 /* Name of option using stdin. */
75 static const char *stdin_used_by
;
77 /* Doesn't return if stdin already requested. */
79 request_stdin (const char *option
)
82 USAGE_ERROR ((0, 0, _("Options '-%s' and '-%s' both want standard input"),
83 stdin_used_by
, option
));
85 stdin_used_by
= option
;
88 extern int rpmatch (char const *response
);
90 /* Returns true if and only if the user typed an affirmative response. */
92 confirm (const char *message_action
, const char *message_name
)
94 static FILE *confirm_file
;
95 static int confirm_file_EOF
;
100 if (archive
== 0 || stdin_used_by
)
102 confirm_file
= fopen (TTY_NAME
, "r");
104 open_fatal (TTY_NAME
);
108 request_stdin ("-w");
109 confirm_file
= stdin
;
113 fprintf (stdlis
, "%s %s?", message_action
, quote (message_name
));
116 if (!confirm_file_EOF
)
118 char *response
= NULL
;
119 size_t response_size
= 0;
120 if (getline (&response
, &response_size
, confirm_file
) < 0)
121 confirm_file_EOF
= 1;
123 status
= rpmatch (response
) > 0;
127 if (confirm_file_EOF
)
129 fputc ('\n', stdlis
);
136 static struct fmttab
{
138 enum archive_format fmt
;
141 { "oldgnu", OLDGNU_FORMAT
},
142 { "ustar", USTAR_FORMAT
},
143 { "posix", POSIX_FORMAT
},
144 #if 0 /* not fully supported yet */
145 { "star", STAR_FORMAT
},
147 { "gnu", GNU_FORMAT
},
148 { "pax", POSIX_FORMAT
}, /* An alias for posix */
153 set_archive_format (char const *name
)
155 struct fmttab
const *p
;
157 for (p
= fmttab
; strcmp (p
->name
, name
) != 0; )
159 USAGE_ERROR ((0, 0, _("%s: Invalid archive format"),
160 quotearg_colon (name
)));
162 archive_format
= p
->fmt
;
166 archive_format_string (enum archive_format fmt
)
168 struct fmttab
const *p
;
170 for (p
= fmttab
; p
->name
; p
++)
176 #define FORMAT_MASK(n) (1<<(n))
179 assert_format(unsigned fmt_mask
)
181 if ((FORMAT_MASK (archive_format
) & fmt_mask
) == 0)
183 _("GNU features wanted on incompatible archive format")));
187 subcommand_string (enum subcommand c
)
191 case UNKNOWN_SUBCOMMAND
:
194 case APPEND_SUBCOMMAND
:
200 case CREATE_SUBCOMMAND
:
203 case DELETE_SUBCOMMAND
:
206 case DIFF_SUBCOMMAND
:
209 case EXTRACT_SUBCOMMAND
:
212 case LIST_SUBCOMMAND
:
215 case UPDATE_SUBCOMMAND
:
218 case TEST_LABEL_SUBCOMMAND
:
219 return "--test-label";
225 tar_list_quoting_styles (struct obstack
*stk
, char const *prefix
)
228 size_t prefixlen
= strlen (prefix
);
230 for (i
= 0; quoting_style_args
[i
]; i
++)
232 obstack_grow (stk
, prefix
, prefixlen
);
233 obstack_grow (stk
, quoting_style_args
[i
],
234 strlen (quoting_style_args
[i
]));
235 obstack_1grow (stk
, '\n');
240 tar_set_quoting_style (char *arg
)
244 for (i
= 0; quoting_style_args
[i
]; i
++)
245 if (strcmp (arg
, quoting_style_args
[i
]) == 0)
247 set_quoting_style (NULL
, i
);
251 _("Unknown quoting style '%s'. Try '%s --quoting-style=help' to get a list."), arg
, program_invocation_short_name
));
259 ACLS_OPTION
= CHAR_MAX
+ 1,
261 ATIME_PRESERVE_OPTION
,
265 CHECKPOINT_ACTION_OPTION
,
266 DELAY_DIRECTORY_RESTORE_OPTION
,
267 HARD_DEREFERENCE_OPTION
,
269 EXCLUDE_BACKUPS_OPTION
,
270 EXCLUDE_CACHES_OPTION
,
271 EXCLUDE_CACHES_UNDER_OPTION
,
272 EXCLUDE_CACHES_ALL_OPTION
,
275 EXCLUDE_TAG_UNDER_OPTION
,
276 EXCLUDE_TAG_ALL_OPTION
,
282 IGNORE_COMMAND_ERROR_OPTION
,
283 IGNORE_FAILED_READ_OPTION
,
285 KEEP_NEWER_FILES_OPTION
,
295 NO_AUTO_COMPRESS_OPTION
,
296 NO_CHECK_DEVICE_OPTION
,
297 NO_DELAY_DIRECTORY_RESTORE_OPTION
,
298 NO_IGNORE_CASE_OPTION
,
299 NO_IGNORE_COMMAND_ERROR_OPTION
,
301 NO_OVERWRITE_DIR_OPTION
,
302 NO_QUOTE_CHARS_OPTION
,
304 NO_SAME_OWNER_OPTION
,
305 NO_SAME_PERMISSIONS_OPTION
,
307 NO_SELINUX_CONTEXT_OPTION
,
309 NO_WILDCARDS_MATCH_SLASH_OPTION
,
313 NUMERIC_OWNER_OPTION
,
316 ONE_FILE_SYSTEM_OPTION
,
317 OVERWRITE_DIR_OPTION
,
324 QUOTING_STYLE_OPTION
,
327 RECURSIVE_UNLINK_OPTION
,
333 SELINUX_CONTEXT_OPTION
,
334 SHOW_DEFAULTS_OPTION
,
335 SHOW_OMITTED_DIRS_OPTION
,
336 SHOW_TRANSFORMED_NAMES_OPTION
,
337 SKIP_OLD_FILES_OPTION
,
338 SPARSE_VERSION_OPTION
,
339 STRIP_COMPONENTS_OPTION
,
349 WILDCARDS_MATCH_SLASH_OPTION
,
356 const char *argp_program_version
= "tar (" PACKAGE_NAME
") " VERSION
;
357 const char *argp_program_bug_address
= "<" PACKAGE_BUGREPORT
">";
358 static char const doc
[] = N_("\
359 GNU 'tar' saves many files together into a single tape or disk archive, \
360 and can restore individual files from the archive.\n\
363 tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n\
364 tar -tvf archive.tar # List all files in archive.tar verbosely.\n\
365 tar -xf archive.tar # Extract all files from archive.tar.\n")
367 N_("The backup suffix is '~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
368 The version control may be set with --backup or VERSION_CONTROL, values are:\n\n\
369 none, off never make backups\n\
370 t, numbered make numbered backups\n\
371 nil, existing numbered if numbered backups exist, simple otherwise\n\
372 never, simple always make simple backups\n");
377 Available option letters are DEQY and eqy. Consider the following
380 [For Solaris tar compatibility =/= Is it important at all?]
381 e exit immediately with a nonzero exit status if unexpected errors occur
382 E use extended headers (--format=posix)
384 [q alias for --occurrence=1 =/= this would better be used for quiet?]
386 y per-file gzip compression
387 Y per-block gzip compression.
389 Additionally, the 'n' letter is assigned for option --seek, which
390 is probably not needed and should be marked as deprecated, so that
391 -n may become available in the future.
394 static struct argp_option options
[] = {
397 N_("Main operation mode:"), GRID
},
400 N_("list the contents of an archive"), GRID
+1 },
401 {"extract", 'x', 0, 0,
402 N_("extract files from an archive"), GRID
+1 },
403 {"get", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
404 {"create", 'c', 0, 0,
405 N_("create a new archive"), GRID
+1 },
407 N_("find differences between archive and file system"), GRID
+1 },
408 {"compare", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
409 {"append", 'r', 0, 0,
410 N_("append files to the end of an archive"), GRID
+1 },
411 {"update", 'u', 0, 0,
412 N_("only append files newer than copy in archive"), GRID
+1 },
413 {"catenate", 'A', 0, 0,
414 N_("append tar files to an archive"), GRID
+1 },
415 {"concatenate", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
416 {"delete", DELETE_OPTION
, 0, 0,
417 N_("delete from the archive (not on mag tapes!)"), GRID
+1 },
418 {"test-label", TEST_LABEL_OPTION
, NULL
, 0,
419 N_("test the archive volume label and exit"), GRID
+1 },
424 N_("Operation modifiers:"), GRID
},
426 {"sparse", 'S', 0, 0,
427 N_("handle sparse files efficiently"), GRID
+1 },
428 {"sparse-version", SPARSE_VERSION_OPTION
, N_("MAJOR[.MINOR]"), 0,
429 N_("set version of the sparse format to use (implies --sparse)"), GRID
+1},
430 {"incremental", 'G', 0, 0,
431 N_("handle old GNU-format incremental backup"), GRID
+1 },
432 {"listed-incremental", 'g', N_("FILE"), 0,
433 N_("handle new GNU-format incremental backup"), GRID
+1 },
434 {"level", LEVEL_OPTION
, N_("NUMBER"), 0,
435 N_("dump level for created listed-incremental archive"), GRID
+1 },
436 {"ignore-failed-read", IGNORE_FAILED_READ_OPTION
, 0, 0,
437 N_("do not exit with nonzero on unreadable files"), GRID
+1 },
438 {"occurrence", OCCURRENCE_OPTION
, N_("NUMBER"), OPTION_ARG_OPTIONAL
,
439 N_("process only the NUMBERth occurrence of each file in the archive;"
440 " this option is valid only in conjunction with one of the subcommands"
441 " --delete, --diff, --extract or --list and when a list of files"
442 " is given either on the command line or via the -T option;"
443 " NUMBER defaults to 1"), GRID
+1 },
444 {"seek", 'n', NULL
, 0,
445 N_("archive is seekable"), GRID
+1 },
446 {"no-seek", NO_SEEK_OPTION
, NULL
, 0,
447 N_("archive is not seekable"), GRID
+1 },
448 {"no-check-device", NO_CHECK_DEVICE_OPTION
, NULL
, 0,
449 N_("do not check device numbers when creating incremental archives"),
451 {"check-device", CHECK_DEVICE_OPTION
, NULL
, 0,
452 N_("check device numbers when creating incremental archives (default)"),
458 N_("Overwrite control:"), GRID
},
460 {"verify", 'W', 0, 0,
461 N_("attempt to verify the archive after writing it"), GRID
+1 },
462 {"remove-files", REMOVE_FILES_OPTION
, 0, 0,
463 N_("remove files after adding them to the archive"), GRID
+1 },
464 {"keep-old-files", 'k', 0, 0,
465 N_("don't replace existing files when extracting, "
466 "treat them as errors"), GRID
+1 },
467 {"skip-old-files", SKIP_OLD_FILES_OPTION
, 0, 0,
468 N_("don't replace existing files when extracting, silently skip over them"),
470 {"keep-newer-files", KEEP_NEWER_FILES_OPTION
, 0, 0,
471 N_("don't replace existing files that are newer than their archive copies"), GRID
+1 },
472 {"overwrite", OVERWRITE_OPTION
, 0, 0,
473 N_("overwrite existing files when extracting"), GRID
+1 },
474 {"unlink-first", 'U', 0, 0,
475 N_("remove each file prior to extracting over it"), GRID
+1 },
476 {"recursive-unlink", RECURSIVE_UNLINK_OPTION
, 0, 0,
477 N_("empty hierarchies prior to extracting directory"), GRID
+1 },
478 {"no-overwrite-dir", NO_OVERWRITE_DIR_OPTION
, 0, 0,
479 N_("preserve metadata of existing directories"), GRID
+1 },
480 {"overwrite-dir", OVERWRITE_DIR_OPTION
, 0, 0,
481 N_("overwrite metadata of existing directories when extracting (default)"),
487 N_("Select output stream:"), GRID
},
489 {"to-stdout", 'O', 0, 0,
490 N_("extract files to standard output"), GRID
+1 },
491 {"to-command", TO_COMMAND_OPTION
, N_("COMMAND"), 0,
492 N_("pipe extracted files to another program"), GRID
+1 },
493 {"ignore-command-error", IGNORE_COMMAND_ERROR_OPTION
, 0, 0,
494 N_("ignore exit codes of children"), GRID
+1 },
495 {"no-ignore-command-error", NO_IGNORE_COMMAND_ERROR_OPTION
, 0, 0,
496 N_("treat non-zero exit codes of children as error"), GRID
+1 },
501 N_("Handling of file attributes:"), GRID
},
503 {"owner", OWNER_OPTION
, N_("NAME"), 0,
504 N_("force NAME as owner for added files"), GRID
+1 },
505 {"group", GROUP_OPTION
, N_("NAME"), 0,
506 N_("force NAME as group for added files"), GRID
+1 },
507 {"mtime", MTIME_OPTION
, N_("DATE-OR-FILE"), 0,
508 N_("set mtime for added files from DATE-OR-FILE"), GRID
+1 },
509 {"mode", MODE_OPTION
, N_("CHANGES"), 0,
510 N_("force (symbolic) mode CHANGES for added files"), GRID
+1 },
511 {"atime-preserve", ATIME_PRESERVE_OPTION
,
512 N_("METHOD"), OPTION_ARG_OPTIONAL
,
513 N_("preserve access times on dumped files, either by restoring the times"
514 " after reading (METHOD='replace'; default) or by not setting the times"
515 " in the first place (METHOD='system')"), GRID
+1 },
517 N_("don't extract file modified time"), GRID
+1 },
518 {"same-owner", SAME_OWNER_OPTION
, 0, 0,
519 N_("try extracting files with the same ownership as exists in the archive (default for superuser)"), GRID
+1 },
520 {"no-same-owner", NO_SAME_OWNER_OPTION
, 0, 0,
521 N_("extract files as yourself (default for ordinary users)"), GRID
+1 },
522 {"numeric-owner", NUMERIC_OWNER_OPTION
, 0, 0,
523 N_("always use numbers for user/group names"), GRID
+1 },
524 {"preserve-permissions", 'p', 0, 0,
525 N_("extract information about file permissions (default for superuser)"),
527 {"same-permissions", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
528 {"no-same-permissions", NO_SAME_PERMISSIONS_OPTION
, 0, 0,
529 N_("apply the user's umask when extracting permissions from the archive (default for ordinary users)"), GRID
+1 },
530 {"preserve-order", 's', 0, 0,
531 N_("sort names to extract to match archive"), GRID
+1 },
532 {"same-order", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
533 {"preserve", PRESERVE_OPTION
, 0, 0,
534 N_("same as both -p and -s"), GRID
+1 },
535 {"delay-directory-restore", DELAY_DIRECTORY_RESTORE_OPTION
, 0, 0,
536 N_("delay setting modification times and permissions of extracted"
537 " directories until the end of extraction"), GRID
+1 },
538 {"no-delay-directory-restore", NO_DELAY_DIRECTORY_RESTORE_OPTION
, 0, 0,
539 N_("cancel the effect of --delay-directory-restore option"), GRID
+1 },
544 N_("Handling of extended file attributes:"), GRID
},
546 {"xattrs", XATTR_OPTION
, 0, 0,
547 N_("Enable extended attributes support"), GRID
+1 },
548 {"no-xattrs", NO_XATTR_OPTION
, 0, 0,
549 N_("Disable extended attributes support"), GRID
+1 },
550 {"xattrs-include", XATTR_INCLUDE
, N_("MASK"), 0,
551 N_("specify the include pattern for xattr keys"), GRID
+1 },
552 {"xattrs-exclude", XATTR_EXCLUDE
, N_("MASK"), 0,
553 N_("specify the exclude pattern for xattr keys"), GRID
+1 },
554 {"selinux", SELINUX_CONTEXT_OPTION
, 0, 0,
555 N_("Enable the SELinux context support"), GRID
+1 },
556 {"no-selinux", NO_SELINUX_CONTEXT_OPTION
, 0, 0,
557 N_("Disable the SELinux context support"), GRID
+1 },
558 {"acls", ACLS_OPTION
, 0, 0,
559 N_("Enable the POSIX ACLs support"), GRID
+1 },
560 {"no-acls", NO_ACLS_OPTION
, 0, 0,
561 N_("Disable the POSIX ACLs support"), GRID
+1 },
566 N_("Device selection and switching:"), GRID
},
568 {"file", 'f', N_("ARCHIVE"), 0,
569 N_("use archive file or device ARCHIVE"), GRID
+1 },
570 {"force-local", FORCE_LOCAL_OPTION
, 0, 0,
571 N_("archive file is local even if it has a colon"), GRID
+1 },
572 {"rmt-command", RMT_COMMAND_OPTION
, N_("COMMAND"), 0,
573 N_("use given rmt COMMAND instead of rmt"), GRID
+1 },
574 {"rsh-command", RSH_COMMAND_OPTION
, N_("COMMAND"), 0,
575 N_("use remote COMMAND instead of rsh"), GRID
+1 },
577 {"-[0-7][lmh]", 0, NULL
, OPTION_DOC
, /* It is OK, since 'name' will never be
579 N_("specify drive and density"), GRID
+1 },
581 {NULL
, '0', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
582 {NULL
, '1', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
583 {NULL
, '2', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
584 {NULL
, '3', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
585 {NULL
, '4', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
586 {NULL
, '5', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
587 {NULL
, '6', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
588 {NULL
, '7', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
589 {NULL
, '8', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
590 {NULL
, '9', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
592 {"multi-volume", 'M', 0, 0,
593 N_("create/list/extract multi-volume archive"), GRID
+1 },
594 {"tape-length", 'L', N_("NUMBER"), 0,
595 N_("change tape after writing NUMBER x 1024 bytes"), GRID
+1 },
596 {"info-script", 'F', N_("NAME"), 0,
597 N_("run script at end of each tape (implies -M)"), GRID
+1 },
598 {"new-volume-script", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
599 {"volno-file", VOLNO_FILE_OPTION
, N_("FILE"), 0,
600 N_("use/update the volume number in FILE"), GRID
+1 },
605 N_("Device blocking:"), GRID
},
607 {"blocking-factor", 'b', N_("BLOCKS"), 0,
608 N_("BLOCKS x 512 bytes per record"), GRID
+1 },
609 {"record-size", RECORD_SIZE_OPTION
, N_("NUMBER"), 0,
610 N_("NUMBER of bytes per record, multiple of 512"), GRID
+1 },
611 {"ignore-zeros", 'i', 0, 0,
612 N_("ignore zeroed blocks in archive (means EOF)"), GRID
+1 },
613 {"read-full-records", 'B', 0, 0,
614 N_("reblock as we read (for 4.2BSD pipes)"), GRID
+1 },
619 N_("Archive format selection:"), GRID
},
621 {"format", 'H', N_("FORMAT"), 0,
622 N_("create archive of the given format"), GRID
+1 },
624 {NULL
, 0, NULL
, 0, N_("FORMAT is one of the following:"), GRID
+2 },
625 {" v7", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("old V7 tar format"),
627 {" oldgnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
628 N_("GNU format as per tar <= 1.12"), GRID
+3 },
629 {" gnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
630 N_("GNU tar 1.13.x format"), GRID
+3 },
631 {" ustar", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
632 N_("POSIX 1003.1-1988 (ustar) format"), GRID
+3 },
633 {" pax", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
634 N_("POSIX 1003.1-2001 (pax) format"), GRID
+3 },
635 {" posix", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("same as pax"), GRID
+3 },
637 {"old-archive", OLD_ARCHIVE_OPTION
, 0, 0, /* FIXME */
638 N_("same as --format=v7"), GRID
+8 },
639 {"portability", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
640 {"posix", POSIX_OPTION
, 0, 0,
641 N_("same as --format=posix"), GRID
+8 },
642 {"pax-option", PAX_OPTION
, N_("keyword[[:]=value][,keyword[[:]=value]]..."), 0,
643 N_("control pax keywords"), GRID
+8 },
644 {"label", 'V', N_("TEXT"), 0,
645 N_("create archive with volume name TEXT; at list/extract time, use TEXT as a globbing pattern for volume name"), GRID
+8 },
650 N_("Compression options:"), GRID
},
651 {"auto-compress", 'a', 0, 0,
652 N_("use archive suffix to determine the compression program"), GRID
+1 },
653 {"no-auto-compress", NO_AUTO_COMPRESS_OPTION
, 0, 0,
654 N_("do not use archive suffix to determine the compression program"),
656 {"use-compress-program", 'I', N_("PROG"), 0,
657 N_("filter through PROG (must accept -d)"), GRID
+1 },
658 /* Note: docstrings for the options below are generated by tar_help_filter */
659 {"bzip2", 'j', 0, 0, NULL
, GRID
+1 },
660 {"gzip", 'z', 0, 0, NULL
, GRID
+1 },
661 {"gunzip", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
662 {"ungzip", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
663 {"compress", 'Z', 0, 0, NULL
, GRID
+1 },
664 {"uncompress", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
665 {"lzip", LZIP_OPTION
, 0, 0, NULL
, GRID
+1 },
666 {"lzma", LZMA_OPTION
, 0, 0, NULL
, GRID
+1 },
667 {"lzop", LZOP_OPTION
, 0, 0, NULL
, GRID
+1 },
668 {"xz", 'J', 0, 0, NULL
, GRID
+1 },
673 N_("Local file selection:"), GRID
},
675 {"add-file", ARGP_KEY_ARG
, N_("FILE"), 0,
676 N_("add given FILE to the archive (useful if its name starts with a dash)"), GRID
+1 },
677 {"directory", 'C', N_("DIR"), 0,
678 N_("change to directory DIR"), GRID
+1 },
679 {"files-from", 'T', N_("FILE"), 0,
680 N_("get names to extract or create from FILE"), GRID
+1 },
681 {"null", NULL_OPTION
, 0, 0,
682 N_("-T reads null-terminated names, disable -C"), GRID
+1 },
683 {"no-null", NO_NULL_OPTION
, 0, 0,
684 N_("disable the effect of the previous --null option"), GRID
+1 },
685 {"unquote", UNQUOTE_OPTION
, 0, 0,
686 N_("unquote filenames read with -T (default)"), GRID
+1 },
687 {"no-unquote", NO_UNQUOTE_OPTION
, 0, 0,
688 N_("do not unquote filenames read with -T"), GRID
+1 },
689 {"exclude", EXCLUDE_OPTION
, N_("PATTERN"), 0,
690 N_("exclude files, given as a PATTERN"), GRID
+1 },
691 {"exclude-from", 'X', N_("FILE"), 0,
692 N_("exclude patterns listed in FILE"), GRID
+1 },
693 {"exclude-caches", EXCLUDE_CACHES_OPTION
, 0, 0,
694 N_("exclude contents of directories containing CACHEDIR.TAG, "
695 "except for the tag file itself"), GRID
+1 },
696 {"exclude-caches-under", EXCLUDE_CACHES_UNDER_OPTION
, 0, 0,
697 N_("exclude everything under directories containing CACHEDIR.TAG"),
699 {"exclude-caches-all", EXCLUDE_CACHES_ALL_OPTION
, 0, 0,
700 N_("exclude directories containing CACHEDIR.TAG"), GRID
+1 },
701 {"exclude-tag", EXCLUDE_TAG_OPTION
, N_("FILE"), 0,
702 N_("exclude contents of directories containing FILE, except"
703 " for FILE itself"), GRID
+1 },
704 {"exclude-tag-under", EXCLUDE_TAG_UNDER_OPTION
, N_("FILE"), 0,
705 N_("exclude everything under directories containing FILE"), GRID
+1 },
706 {"exclude-tag-all", EXCLUDE_TAG_ALL_OPTION
, N_("FILE"), 0,
707 N_("exclude directories containing FILE"), GRID
+1 },
708 {"exclude-vcs", EXCLUDE_VCS_OPTION
, NULL
, 0,
709 N_("exclude version control system directories"), GRID
+1 },
710 {"exclude-backups", EXCLUDE_BACKUPS_OPTION
, NULL
, 0,
711 N_("exclude backup and lock files"), GRID
+1 },
712 {"no-recursion", NO_RECURSION_OPTION
, 0, 0,
713 N_("avoid descending automatically in directories"), GRID
+1 },
714 {"one-file-system", ONE_FILE_SYSTEM_OPTION
, 0, 0,
715 N_("stay in local file system when creating archive"), GRID
+1 },
716 {"recursion", RECURSION_OPTION
, 0, 0,
717 N_("recurse into directories (default)"), GRID
+1 },
718 {"absolute-names", 'P', 0, 0,
719 N_("don't strip leading '/'s from file names"), GRID
+1 },
720 {"dereference", 'h', 0, 0,
721 N_("follow symlinks; archive and dump the files they point to"), GRID
+1 },
722 {"hard-dereference", HARD_DEREFERENCE_OPTION
, 0, 0,
723 N_("follow hard links; archive and dump the files they refer to"), GRID
+1 },
724 {"starting-file", 'K', N_("MEMBER-NAME"), 0,
725 N_("begin at member MEMBER-NAME in the archive"), GRID
+1 },
726 {"newer", 'N', N_("DATE-OR-FILE"), 0,
727 N_("only store files newer than DATE-OR-FILE"), GRID
+1 },
728 {"after-date", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
729 {"newer-mtime", NEWER_MTIME_OPTION
, N_("DATE"), 0,
730 N_("compare date and time when data changed only"), GRID
+1 },
731 {"backup", BACKUP_OPTION
, N_("CONTROL"), OPTION_ARG_OPTIONAL
,
732 N_("backup before removal, choose version CONTROL"), GRID
+1 },
733 {"suffix", SUFFIX_OPTION
, N_("STRING"), 0,
734 N_("backup before removal, override usual suffix ('~' unless overridden by environment variable SIMPLE_BACKUP_SUFFIX)"), GRID
+1 },
739 N_("File name transformations:"), GRID
},
740 {"strip-components", STRIP_COMPONENTS_OPTION
, N_("NUMBER"), 0,
741 N_("strip NUMBER leading components from file names on extraction"),
743 {"transform", TRANSFORM_OPTION
, N_("EXPRESSION"), 0,
744 N_("use sed replace EXPRESSION to transform file names"), GRID
+1 },
745 {"xform", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
750 N_("File name matching options (affect both exclude and include patterns):"),
752 {"ignore-case", IGNORE_CASE_OPTION
, 0, 0,
753 N_("ignore case"), GRID
+1 },
754 {"anchored", ANCHORED_OPTION
, 0, 0,
755 N_("patterns match file name start"), GRID
+1 },
756 {"no-anchored", NO_ANCHORED_OPTION
, 0, 0,
757 N_("patterns match after any '/' (default for exclusion)"), GRID
+1 },
758 {"no-ignore-case", NO_IGNORE_CASE_OPTION
, 0, 0,
759 N_("case sensitive matching (default)"), GRID
+1 },
760 {"wildcards", WILDCARDS_OPTION
, 0, 0,
761 N_("use wildcards (default for exclusion)"), GRID
+1 },
762 {"no-wildcards", NO_WILDCARDS_OPTION
, 0, 0,
763 N_("verbatim string matching"), GRID
+1 },
764 {"no-wildcards-match-slash", NO_WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
765 N_("wildcards do not match '/'"), GRID
+1 },
766 {"wildcards-match-slash", WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
767 N_("wildcards match '/' (default for exclusion)"), GRID
+1 },
772 N_("Informative output:"), GRID
},
774 {"verbose", 'v', 0, 0,
775 N_("verbosely list files processed"), GRID
+1 },
776 {"warning", WARNING_OPTION
, N_("KEYWORD"), 0,
777 N_("warning control"), GRID
+1 },
778 {"checkpoint", CHECKPOINT_OPTION
, N_("NUMBER"), OPTION_ARG_OPTIONAL
,
779 N_("display progress messages every NUMBERth record (default 10)"),
781 {"checkpoint-action", CHECKPOINT_ACTION_OPTION
, N_("ACTION"), 0,
782 N_("execute ACTION on each checkpoint"),
784 {"check-links", 'l', 0, 0,
785 N_("print a message if not all links are dumped"), GRID
+1 },
786 {"totals", TOTALS_OPTION
, N_("SIGNAL"), OPTION_ARG_OPTIONAL
,
787 N_("print total bytes after processing the archive; "
788 "with an argument - print total bytes when this SIGNAL is delivered; "
789 "Allowed signals are: SIGHUP, SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; "
790 "the names without SIG prefix are also accepted"), GRID
+1 },
791 {"utc", UTC_OPTION
, 0, 0,
792 N_("print file modification times in UTC"), GRID
+1 },
793 {"full-time", FULL_TIME_OPTION
, 0, 0,
794 N_("print file time to its full resolution"), GRID
+1 },
795 {"index-file", INDEX_FILE_OPTION
, N_("FILE"), 0,
796 N_("send verbose output to FILE"), GRID
+1 },
797 {"block-number", 'R', 0, 0,
798 N_("show block number within archive with each message"), GRID
+1 },
799 {"interactive", 'w', 0, 0,
800 N_("ask for confirmation for every action"), GRID
+1 },
801 {"confirmation", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
802 {"show-defaults", SHOW_DEFAULTS_OPTION
, 0, 0,
803 N_("show tar defaults"), GRID
+1 },
804 {"show-omitted-dirs", SHOW_OMITTED_DIRS_OPTION
, 0, 0,
805 N_("when listing or extracting, list each directory that does not match search criteria"), GRID
+1 },
806 {"show-transformed-names", SHOW_TRANSFORMED_NAMES_OPTION
, 0, 0,
807 N_("show file or archive names after transformation"),
809 {"show-stored-names", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
810 {"quoting-style", QUOTING_STYLE_OPTION
, N_("STYLE"), 0,
811 N_("set name quoting style; see below for valid STYLE values"), GRID
+1 },
812 {"quote-chars", QUOTE_CHARS_OPTION
, N_("STRING"), 0,
813 N_("additionally quote characters from STRING"), GRID
+1 },
814 {"no-quote-chars", NO_QUOTE_CHARS_OPTION
, N_("STRING"), 0,
815 N_("disable quoting for characters from STRING"), GRID
+1 },
820 N_("Compatibility options:"), GRID
},
823 N_("when creating, same as --old-archive; when extracting, same as --no-same-owner"), GRID
+1 },
828 N_("Other options:"), GRID
},
830 {"restrict", RESTRICT_OPTION
, 0, 0,
831 N_("disable use of some potentially harmful options"), -1 },
837 static char const *const atime_preserve_args
[] =
839 "replace", "system", NULL
842 static enum atime_preserve
const atime_preserve_types
[] =
844 replace_atime_preserve
, system_atime_preserve
847 /* Make sure atime_preserve_types has as much entries as atime_preserve_args
848 (minus 1 for NULL guard) */
849 ARGMATCH_VERIFY (atime_preserve_args
, atime_preserve_types
);
851 /* Wildcard matching settings */
854 default_wildcards
, /* For exclusion == enable_wildcards,
855 for inclusion == disable_wildcards */
860 struct tar_args
/* Variables used during option parsing */
862 struct textual_date
*textual_date
; /* Keeps the arguments to --newer-mtime
863 and/or --date option if they are
865 enum wildcards wildcards
; /* Wildcard settings (--wildcards/
867 int matching_flags
; /* exclude_fnmatch options */
868 int include_anchored
; /* Pattern anchoring options used for
870 bool o_option
; /* True if -o option was given */
871 bool pax_option
; /* True if --pax-option was given */
872 char const *backup_suffix_string
; /* --suffix option argument */
873 char const *version_control_string
; /* --backup option argument */
874 bool input_files
; /* True if some input files where given */
875 int compress_autodetect
; /* True if compression autodetection should
876 be attempted when creating archives */
880 #define MAKE_EXCL_OPTIONS(args) \
881 ((((args)->wildcards != disable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
882 | (args)->matching_flags \
885 #define MAKE_INCL_OPTIONS(args) \
886 ((((args)->wildcards == enable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
887 | (args)->include_anchored \
888 | (args)->matching_flags \
891 static char const * const vcs_file_table
[] = {
923 static char const * const backup_file_table
[] = {
931 add_exclude_array (char const * const * fv
, int opts
)
935 for (i
= 0; fv
[i
]; i
++)
936 add_exclude (excluded
, fv
[i
], opts
);
941 format_default_settings (void)
944 "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s"
949 archive_format_string (DEFAULT_ARCHIVE_FORMAT
),
950 DEFAULT_ARCHIVE
, DEFAULT_BLOCKING
,
951 quoting_style_args
[DEFAULT_QUOTING_STYLE
],
961 set_subcommand_option (enum subcommand subcommand
)
963 if (subcommand_option
!= UNKNOWN_SUBCOMMAND
964 && subcommand_option
!= subcommand
)
966 _("You may not specify more than one '-Acdtrux' or '--test-label' option")));
968 subcommand_option
= subcommand
;
972 set_use_compress_program_option (const char *string
)
974 if (use_compress_program_option
975 && strcmp (use_compress_program_option
, string
) != 0)
976 USAGE_ERROR ((0, 0, _("Conflicting compression options")));
978 use_compress_program_option
= string
;
985 print_total_stats ();
986 #ifndef HAVE_SIGACTION
987 signal (signo
, sigstat
);
992 stat_on_signal (int signo
)
994 #ifdef HAVE_SIGACTION
996 # define SA_RESTART 0
998 struct sigaction act
;
999 act
.sa_handler
= sigstat
;
1000 sigemptyset (&act
.sa_mask
);
1001 act
.sa_flags
= SA_RESTART
;
1002 sigaction (signo
, &act
, NULL
);
1004 signal (signo
, sigstat
);
1009 set_stat_signal (const char *name
)
1011 static struct sigtab
1015 } const sigtab
[] = {
1016 { "SIGUSR1", SIGUSR1
},
1017 { "USR1", SIGUSR1
},
1018 { "SIGUSR2", SIGUSR2
},
1019 { "USR2", SIGUSR2
},
1020 { "SIGHUP", SIGHUP
},
1022 { "SIGINT", SIGINT
},
1024 { "SIGQUIT", SIGQUIT
},
1027 struct sigtab
const *p
;
1029 for (p
= sigtab
; p
< sigtab
+ sizeof (sigtab
) / sizeof (sigtab
[0]); p
++)
1030 if (strcmp (p
->name
, name
) == 0)
1032 stat_on_signal (p
->signo
);
1035 FATAL_ERROR ((0, 0, _("Unknown signal name: %s"), name
));
1041 struct textual_date
*next
;
1048 get_date_or_file (struct tar_args
*args
, const char *option
,
1049 const char *str
, struct timespec
*ts
)
1051 if (FILE_SYSTEM_PREFIX_LEN (str
) != 0
1056 if (stat (str
, &st
) != 0)
1059 USAGE_ERROR ((0, 0, _("Date sample file not found")));
1061 *ts
= get_stat_mtime (&st
);
1065 if (! parse_datetime (ts
, str
, NULL
))
1067 WARN ((0, 0, _("Substituting %s for unknown date format %s"),
1068 tartime (*ts
, false), quote (str
)));
1074 struct textual_date
*p
= xmalloc (sizeof (*p
));
1077 p
->date
= xstrdup (str
);
1078 p
->next
= args
->textual_date
;
1079 args
->textual_date
= p
;
1086 report_textual_dates (struct tar_args
*args
)
1088 struct textual_date
*p
;
1089 for (p
= args
->textual_date
; p
; )
1091 struct textual_date
*next
= p
->next
;
1094 char const *treated_as
= tartime (p
->ts
, true);
1095 if (strcmp (p
->date
, treated_as
) != 0)
1096 WARN ((0, 0, _("Option %s: Treating date '%s' as %s"),
1097 p
->option
, p
->date
, treated_as
));
1107 /* Either NL or NUL, as decided by the --null option. */
1108 static char filename_terminator
;
1110 enum read_file_list_state
/* Result of reading file name from the list file */
1112 file_list_success
, /* OK, name read successfully */
1113 file_list_end
, /* End of list file */
1114 file_list_zero
, /* Zero separator encountered where it should not */
1115 file_list_skip
/* Empty (zero-length) entry encountered, skip it */
1118 /* Read from FP a sequence of characters up to TERM and put them
1121 static enum read_file_list_state
1122 read_name_from_file (FILE *fp
, struct obstack
*stk
, int term
)
1127 for (c
= getc (fp
); c
!= EOF
&& c
!= term
; c
= getc (fp
))
1131 /* We have read a zero separator. The file possibly is
1133 return file_list_zero
;
1135 obstack_1grow (stk
, c
);
1139 if (counter
== 0 && c
!= EOF
)
1140 return file_list_skip
;
1142 obstack_1grow (stk
, 0);
1144 return (counter
== 0 && c
== EOF
) ? file_list_end
: file_list_success
;
1148 static bool files_from_option
; /* When set, tar will not refuse to create
1150 static struct obstack argv_stk
; /* Storage for additional command line options
1151 read using -T option */
1153 /* Prevent recursive inclusion of the same file */
1156 struct file_id_list
*next
;
1161 static struct file_id_list
*file_id_list
;
1164 add_file_id (const char *filename
)
1166 struct file_id_list
*p
;
1169 if (stat (filename
, &st
))
1170 stat_fatal (filename
);
1171 for (p
= file_id_list
; p
; p
= p
->next
)
1172 if (p
->ino
== st
.st_ino
&& p
->dev
== st
.st_dev
)
1174 FATAL_ERROR ((0, 0, _("%s: file list already read"),
1175 quotearg_colon (filename
)));
1177 p
= xmalloc (sizeof *p
);
1178 p
->next
= file_id_list
;
1184 /* Default density numbers for [0-9][lmh] device specifications */
1186 #if defined DEVICE_PREFIX && !defined DENSITY_LETTER
1187 # ifndef LOW_DENSITY_NUM
1188 # define LOW_DENSITY_NUM 0
1191 # ifndef MID_DENSITY_NUM
1192 # define MID_DENSITY_NUM 8
1195 # ifndef HIGH_DENSITY_NUM
1196 # define HIGH_DENSITY_NUM 16
1201 update_argv (const char *filename
, struct argp_state
*state
)
1204 size_t count
= 0, i
;
1208 bool is_stdin
= false;
1209 enum read_file_list_state read_state
;
1210 int term
= filename_terminator
;
1212 if (!strcmp (filename
, "-"))
1215 request_stdin ("-T");
1220 add_file_id (filename
);
1221 if ((fp
= fopen (filename
, "r")) == NULL
)
1222 open_fatal (filename
);
1225 while ((read_state
= read_name_from_file (fp
, &argv_stk
, term
))
1230 case file_list_success
:
1234 case file_list_end
: /* won't happen, just to pacify gcc */
1237 case file_list_zero
:
1241 WARNOPT (WARN_FILENAME_WITH_NULS
,
1242 (0, 0, N_("%s: file name read contains nul character"),
1243 quotearg_colon (filename
)));
1245 /* Prepare new stack contents */
1246 size
= obstack_object_size (&argv_stk
);
1247 p
= obstack_finish (&argv_stk
);
1248 for (; size
> 0; size
--, p
++)
1250 obstack_1grow (&argv_stk
, *p
);
1252 obstack_1grow (&argv_stk
, '\n');
1253 obstack_1grow (&argv_stk
, 0);
1255 /* Read rest of files using new filename terminator */
1260 case file_list_skip
:
1271 start
= obstack_finish (&argv_stk
);
1274 for (p
= start
; *p
; p
+= strlen (p
) + 1)
1278 new_argc
= state
->argc
+ count
;
1279 new_argv
= xmalloc (sizeof (state
->argv
[0]) * (new_argc
+ 1));
1280 memcpy (new_argv
, state
->argv
, sizeof (state
->argv
[0]) * (state
->argc
+ 1));
1281 state
->argv
= new_argv
;
1282 memmove (&state
->argv
[state
->next
+ count
], &state
->argv
[state
->next
],
1283 (state
->argc
- state
->next
+ 1) * sizeof (state
->argv
[0]));
1285 state
->argc
= new_argc
;
1287 for (i
= state
->next
, p
= start
; *p
; p
+= strlen (p
) + 1, i
++)
1289 if (term
== 0 && p
[0] == '-')
1290 state
->argv
[i
++] = "--add-file";
1297 tar_help_filter (int key
, const char *text
, void *input
)
1309 s
= xasprintf (_("filter the archive through %s"), BZIP2_PROGRAM
);
1313 s
= xasprintf (_("filter the archive through %s"), GZIP_PROGRAM
);
1317 s
= xasprintf (_("filter the archive through %s"), COMPRESS_PROGRAM
);
1321 s
= xasprintf (_("filter the archive through %s"), LZIP_PROGRAM
);
1325 s
= xasprintf (_("filter the archive through %s"), LZMA_PROGRAM
);
1329 s
= xasprintf (_("filter the archive through %s"), XZ_PROGRAM
);
1332 case ARGP_KEY_HELP_EXTRA
:
1336 obstack_init (&stk
);
1337 tstr
= _("Valid arguments for the --quoting-style option are:");
1338 obstack_grow (&stk
, tstr
, strlen (tstr
));
1339 obstack_grow (&stk
, "\n\n", 2);
1340 tar_list_quoting_styles (&stk
, " ");
1341 tstr
= _("\n*This* tar defaults to:\n");
1342 obstack_grow (&stk
, tstr
, strlen (tstr
));
1343 s
= format_default_settings ();
1344 obstack_grow (&stk
, s
, strlen (s
));
1345 obstack_1grow (&stk
, '\n');
1346 obstack_1grow (&stk
, 0);
1347 s
= xstrdup (obstack_finish (&stk
));
1348 obstack_free (&stk
, NULL
);
1355 expand_pax_option (struct tar_args
*targs
, const char *arg
)
1360 obstack_init (&stk
);
1363 size_t seglen
= strcspn (arg
, ",");
1364 char *p
= memchr (arg
, '=', seglen
);
1367 size_t len
= p
- arg
+ 1;
1368 obstack_grow (&stk
, arg
, len
);
1370 for (++p
; *p
&& isspace ((unsigned char) *p
); p
++)
1372 if (*p
== '{' && p
[len
-1] == '}')
1375 char *tmp
= xmalloc (len
);
1376 memcpy (tmp
, p
+ 1, len
-2);
1378 if (get_date_or_file (targs
, "--pax-option", tmp
, &ts
) == 0)
1380 char buf
[UINTMAX_STRSIZE_BOUND
], *s
;
1381 s
= umaxtostr (ts
.tv_sec
, buf
);
1382 obstack_grow (&stk
, s
, strlen (s
));
1385 obstack_grow (&stk
, p
, len
);
1389 obstack_grow (&stk
, p
, len
);
1392 obstack_grow (&stk
, arg
, seglen
);
1397 obstack_1grow (&stk
, *arg
);
1401 obstack_1grow (&stk
, 0);
1402 res
= xstrdup (obstack_finish (&stk
));
1403 obstack_free (&stk
, NULL
);
1409 parse_owner_group (char *arg
, uintmax_t field_max
, char const **name_option
)
1411 uintmax_t u
= UINTMAX_MAX
;
1413 char const *name
= 0;
1414 char const *invalid_num
= 0;
1415 char *colon
= strchr (arg
, ':');
1419 char const *num
= colon
+ 1;
1423 if (num
&& (! (xstrtoumax (num
, &end
, 10, &u
, "") == LONGINT_OK
1424 && u
<= field_max
)))
1430 switch ('0' <= *arg
&& *arg
<= '9'
1431 ? xstrtoumax (arg
, &end
, 10, &u1
, "")
1439 if (u1
<= field_max
)
1445 case LONGINT_OVERFLOW
:
1452 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (invalid_num
),
1453 _("Invalid owner or group ID")));
1455 *name_option
= name
;
1459 #define TAR_SIZE_SUFFIXES "bBcGgkKMmPTtw"
1462 parse_opt (int key
, char *arg
, struct argp_state
*state
)
1464 struct tar_args
*args
= state
->input
;
1469 /* File name or non-parsed option, because of ARGP_IN_ORDER */
1470 name_add_name (arg
, MAKE_INCL_OPTIONS (args
));
1471 args
->input_files
= true;
1475 set_subcommand_option (CAT_SUBCOMMAND
);
1479 args
->compress_autodetect
= true;
1482 case NO_AUTO_COMPRESS_OPTION
:
1483 args
->compress_autodetect
= false;
1489 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1490 && u
== (blocking_factor
= u
)
1491 && 0 < blocking_factor
1492 && u
== (record_size
= u
* BLOCKSIZE
) / BLOCKSIZE
))
1493 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1494 _("Invalid blocking factor")));
1499 /* Try to reblock input records. For reading 4.2BSD pipes. */
1501 /* It would surely make sense to exchange -B and -R, but it seems
1502 that -B has been used for a long while in Sun tar and most
1503 BSD-derived systems. This is a consequence of the block/record
1504 terminology confusion. */
1506 read_full_records_option
= true;
1510 set_subcommand_option (CREATE_SUBCOMMAND
);
1518 set_subcommand_option (DIFF_SUBCOMMAND
);
1522 if (archive_names
== allocated_archive_names
)
1523 archive_name_array
= x2nrealloc (archive_name_array
,
1524 &allocated_archive_names
,
1525 sizeof (archive_name_array
[0]));
1527 archive_name_array
[archive_names
++] = arg
;
1531 /* Since -F is only useful with -M, make it implied. Run this
1532 script at the end of each tape. */
1534 info_script_option
= arg
;
1535 multi_volume_option
= true;
1538 case FULL_TIME_OPTION
:
1539 full_time_option
= true;
1543 listed_incremental_option
= arg
;
1544 after_date_option
= true;
1548 /* We are making an incremental dump (FIXME: are we?); save
1549 directories at the beginning of the archive, and include in each
1550 directory its contents. */
1552 incremental_option
= true;
1556 /* Follow symbolic links. */
1557 dereference_option
= true;
1560 case HARD_DEREFERENCE_OPTION
:
1561 hard_dereference_option
= true;
1565 /* Ignore zero blocks (eofs). This can't be the default,
1566 because Unix tar writes two blocks of zeros, then pads out
1567 the record with garbage. */
1569 ignore_zeros_option
= true;
1573 set_use_compress_program_option (BZIP2_PROGRAM
);
1577 set_use_compress_program_option (XZ_PROGRAM
);
1581 /* Don't replace existing files. */
1582 old_files_option
= KEEP_OLD_FILES
;
1586 starting_file_option
= true;
1587 addname (arg
, 0, true, NULL
);
1590 case ONE_FILE_SYSTEM_OPTION
:
1591 /* When dumping directories, don't dump files/subdirectories
1592 that are on other filesystems. */
1593 one_file_system_option
= true;
1597 check_links_option
= 1;
1605 if (xstrtoumax (arg
, &p
, 10, &u
, TAR_SIZE_SUFFIXES
) != LONGINT_OK
)
1606 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1607 _("Invalid tape length")));
1608 if (p
> arg
&& !strchr (TAR_SIZE_SUFFIXES
, p
[-1]))
1609 tape_length_option
= 1024 * (tarlong
) u
;
1611 tape_length_option
= (tarlong
) u
;
1612 multi_volume_option
= true;
1619 incremental_level
= strtoul (arg
, &p
, 10);
1621 USAGE_ERROR ((0, 0, _("Invalid incremental level value")));
1626 set_use_compress_program_option (LZIP_PROGRAM
);
1630 set_use_compress_program_option (LZMA_PROGRAM
);
1634 set_use_compress_program_option (LZOP_PROGRAM
);
1638 touch_option
= true;
1642 /* Make multivolume archive: when we can't write any more into
1643 the archive, re-open it, and continue writing. */
1645 multi_volume_option
= true;
1649 get_date_or_file (args
, "--mtime", arg
, &mtime_option
);
1650 set_mtime_option
= true;
1657 case NO_SEEK_OPTION
:
1662 after_date_option
= true;
1665 case NEWER_MTIME_OPTION
:
1666 if (NEWER_OPTION_INITIALIZED (newer_mtime_option
))
1667 USAGE_ERROR ((0, 0, _("More than one threshold date")));
1668 get_date_or_file (args
,
1669 key
== NEWER_MTIME_OPTION
? "--newer-mtime"
1670 : "--after-date", arg
, &newer_mtime_option
);
1674 args
->o_option
= true;
1678 to_stdout_option
= true;
1682 same_permissions_option
= true;
1686 absolute_names_option
= true;
1690 set_subcommand_option (APPEND_SUBCOMMAND
);
1694 /* Print block numbers for debugging bad tar archives. */
1696 /* It would surely make sense to exchange -B and -R, but it seems
1697 that -B has been used for a long while in Sun tar and most
1698 BSD-derived systems. This is a consequence of the block/record
1699 terminology confusion. */
1701 block_number_option
= true;
1705 /* Names to extract are sorted. */
1707 same_order_option
= true;
1711 sparse_option
= true;
1714 case SKIP_OLD_FILES_OPTION
:
1715 old_files_option
= SKIP_OLD_FILES
;
1718 case SPARSE_VERSION_OPTION
:
1719 sparse_option
= true;
1722 tar_sparse_major
= strtoul (arg
, &p
, 10);
1726 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1727 tar_sparse_minor
= strtoul (p
+ 1, &p
, 10);
1729 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1735 set_subcommand_option (LIST_SUBCOMMAND
);
1739 case TEST_LABEL_OPTION
:
1740 set_subcommand_option (TEST_LABEL_SUBCOMMAND
);
1744 update_argv (arg
, state
);
1745 /* Indicate we've been given -T option. This is for backward
1746 compatibility only, so that `tar cfT archive /dev/null will
1748 files_from_option
= true;
1752 set_subcommand_option (UPDATE_SUBCOMMAND
);
1756 old_files_option
= UNLINK_FIRST_OLD_FILES
;
1765 warning_option
|= WARN_VERBOSE_WARNINGS
;
1769 volume_label_option
= arg
;
1773 interactive_option
= true;
1777 verify_option
= true;
1781 set_subcommand_option (EXTRACT_SUBCOMMAND
);
1785 if (add_exclude_file (add_exclude
, excluded
, arg
,
1786 MAKE_EXCL_OPTIONS (args
), '\n')
1790 FATAL_ERROR ((0, e
, "%s", quotearg_colon (arg
)));
1795 set_use_compress_program_option (GZIP_PROGRAM
);
1799 set_use_compress_program_option (COMPRESS_PROGRAM
);
1802 case ANCHORED_OPTION
:
1803 args
->matching_flags
|= EXCLUDE_ANCHORED
;
1806 case ATIME_PRESERVE_OPTION
:
1807 atime_preserve_option
=
1809 ? XARGMATCH ("--atime-preserve", arg
,
1810 atime_preserve_args
, atime_preserve_types
)
1811 : replace_atime_preserve
);
1812 if (! O_NOATIME
&& atime_preserve_option
== system_atime_preserve
)
1814 _("--atime-preserve='system' is not supported"
1815 " on this platform")));
1818 case CHECK_DEVICE_OPTION
:
1819 check_device_option
= true;
1822 case NO_CHECK_DEVICE_OPTION
:
1823 check_device_option
= false;
1826 case CHECKPOINT_OPTION
:
1833 checkpoint_compile_action (".");
1836 checkpoint_option
= strtoul (arg
, &p
, 0);
1839 _("--checkpoint value is not an integer")));
1842 checkpoint_option
= DEFAULT_CHECKPOINT
;
1845 case CHECKPOINT_ACTION_OPTION
:
1846 checkpoint_compile_action (arg
);
1850 backup_option
= true;
1852 args
->version_control_string
= arg
;
1855 case DELAY_DIRECTORY_RESTORE_OPTION
:
1856 delay_directory_restore_option
= true;
1859 case NO_DELAY_DIRECTORY_RESTORE_OPTION
:
1860 delay_directory_restore_option
= false;
1864 set_subcommand_option (DELETE_SUBCOMMAND
);
1867 case EXCLUDE_BACKUPS_OPTION
:
1868 add_exclude_array (backup_file_table
, EXCLUDE_WILDCARDS
);
1871 case EXCLUDE_OPTION
:
1872 add_exclude (excluded
, arg
, MAKE_EXCL_OPTIONS (args
));
1875 case EXCLUDE_CACHES_OPTION
:
1876 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_contents
,
1880 case EXCLUDE_CACHES_UNDER_OPTION
:
1881 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_under
,
1885 case EXCLUDE_CACHES_ALL_OPTION
:
1886 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_all
,
1890 case EXCLUDE_TAG_OPTION
:
1891 add_exclusion_tag (arg
, exclusion_tag_contents
, NULL
);
1894 case EXCLUDE_TAG_UNDER_OPTION
:
1895 add_exclusion_tag (arg
, exclusion_tag_under
, NULL
);
1898 case EXCLUDE_TAG_ALL_OPTION
:
1899 add_exclusion_tag (arg
, exclusion_tag_all
, NULL
);
1902 case EXCLUDE_VCS_OPTION
:
1903 add_exclude_array (vcs_file_table
, 0);
1906 case FORCE_LOCAL_OPTION
:
1907 force_local_option
= true;
1911 set_archive_format (arg
);
1914 case INDEX_FILE_OPTION
:
1915 index_file_name
= arg
;
1918 case IGNORE_CASE_OPTION
:
1919 args
->matching_flags
|= FNM_CASEFOLD
;
1922 case IGNORE_COMMAND_ERROR_OPTION
:
1923 ignore_command_error_option
= true;
1926 case IGNORE_FAILED_READ_OPTION
:
1927 ignore_failed_read_option
= true;
1930 case KEEP_NEWER_FILES_OPTION
:
1931 old_files_option
= KEEP_NEWER_FILES
;
1936 uintmax_t u
= parse_owner_group (arg
, TYPE_MAXIMUM (gid_t
),
1937 &group_name_option
);
1938 if (u
== UINTMAX_MAX
)
1941 if (group_name_option
)
1942 gname_to_gid (group_name_option
, &group_option
);
1950 mode_option
= mode_compile (arg
);
1952 FATAL_ERROR ((0, 0, _("Invalid mode given on option")));
1953 initial_umask
= umask (0);
1954 umask (initial_umask
);
1957 case NO_ANCHORED_OPTION
:
1958 args
->include_anchored
= 0; /* Clear the default for comman line args */
1959 args
->matching_flags
&= ~ EXCLUDE_ANCHORED
;
1962 case NO_IGNORE_CASE_OPTION
:
1963 args
->matching_flags
&= ~ FNM_CASEFOLD
;
1966 case NO_IGNORE_COMMAND_ERROR_OPTION
:
1967 ignore_command_error_option
= false;
1970 case NO_OVERWRITE_DIR_OPTION
:
1971 old_files_option
= NO_OVERWRITE_DIR_OLD_FILES
;
1974 case NO_QUOTE_CHARS_OPTION
:
1976 set_char_quoting (NULL
, *arg
, 0);
1979 case NO_WILDCARDS_OPTION
:
1980 args
->wildcards
= disable_wildcards
;
1983 case NO_WILDCARDS_MATCH_SLASH_OPTION
:
1984 args
->matching_flags
|= FNM_FILE_NAME
;
1988 filename_terminator
= '\0';
1991 case NO_NULL_OPTION
:
1992 filename_terminator
= '\n';
1995 case NUMERIC_OWNER_OPTION
:
1996 numeric_owner_option
= true;
1999 case OCCURRENCE_OPTION
:
2001 occurrence_option
= 1;
2005 if (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
)
2006 occurrence_option
= u
;
2008 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
2009 _("Invalid number")));
2013 case OLD_ARCHIVE_OPTION
:
2014 set_archive_format ("v7");
2017 case OVERWRITE_DIR_OPTION
:
2018 old_files_option
= DEFAULT_OLD_FILES
;
2021 case OVERWRITE_OPTION
:
2022 old_files_option
= OVERWRITE_OLD_FILES
;
2027 uintmax_t u
= parse_owner_group (arg
, TYPE_MAXIMUM (uid_t
),
2028 &owner_name_option
);
2029 if (u
== UINTMAX_MAX
)
2032 if (owner_name_option
)
2033 uname_to_uid (owner_name_option
, &owner_option
);
2040 case QUOTE_CHARS_OPTION
:
2042 set_char_quoting (NULL
, *arg
, 1);
2045 case QUOTING_STYLE_OPTION
:
2046 tar_set_quoting_style (arg
);
2051 char *tmp
= expand_pax_option (args
, arg
);
2052 args
->pax_option
= true;
2053 xheader_set_option (tmp
);
2059 set_archive_format ("posix");
2062 case PRESERVE_OPTION
:
2063 /* FIXME: What it is good for? */
2064 same_permissions_option
= true;
2065 same_order_option
= true;
2066 WARN ((0, 0, _("The --preserve option is deprecated, "
2067 "use --preserve-permissions --preserve-order instead")));
2070 case RECORD_SIZE_OPTION
:
2074 if (! (xstrtoumax (arg
, NULL
, 10, &u
, TAR_SIZE_SUFFIXES
) == LONGINT_OK
2075 && u
== (size_t) u
))
2076 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
2077 _("Invalid record size")));
2079 if (record_size
% BLOCKSIZE
!= 0)
2080 USAGE_ERROR ((0, 0, _("Record size must be a multiple of %d."),
2082 blocking_factor
= record_size
/ BLOCKSIZE
;
2086 case RECURSIVE_UNLINK_OPTION
:
2087 recursive_unlink_option
= true;
2090 case REMOVE_FILES_OPTION
:
2091 remove_files_option
= true;
2094 case RESTRICT_OPTION
:
2095 restrict_option
= true;
2098 case RMT_COMMAND_OPTION
:
2102 case RSH_COMMAND_OPTION
:
2103 rsh_command_option
= arg
;
2106 case SHOW_DEFAULTS_OPTION
:
2108 char *s
= format_default_settings ();
2115 case STRIP_COMPONENTS_OPTION
:
2118 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
2119 && u
== (size_t) u
))
2120 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
2121 _("Invalid number of elements")));
2122 strip_name_components
= u
;
2126 case SHOW_OMITTED_DIRS_OPTION
:
2127 show_omitted_dirs_option
= true;
2130 case SHOW_TRANSFORMED_NAMES_OPTION
:
2131 show_transformed_names_option
= true;
2135 backup_option
= true;
2136 args
->backup_suffix_string
= arg
;
2139 case TO_COMMAND_OPTION
:
2140 if (to_command_option
)
2141 USAGE_ERROR ((0, 0, _("Only one --to-command option allowed")));
2142 to_command_option
= arg
;
2147 set_stat_signal (arg
);
2149 totals_option
= true;
2152 case TRANSFORM_OPTION
:
2153 set_transform_expr (arg
);
2157 set_use_compress_program_option (arg
);
2160 case VOLNO_FILE_OPTION
:
2161 volno_file_option
= arg
;
2164 case WILDCARDS_OPTION
:
2165 args
->wildcards
= enable_wildcards
;
2168 case WILDCARDS_MATCH_SLASH_OPTION
:
2169 args
->matching_flags
&= ~ FNM_FILE_NAME
;
2172 case NO_RECURSION_OPTION
:
2173 recursion_option
= 0;
2176 case NO_SAME_OWNER_OPTION
:
2177 same_owner_option
= -1;
2180 case NO_SAME_PERMISSIONS_OPTION
:
2181 same_permissions_option
= -1;
2185 set_archive_format ("posix");
2189 case NO_ACLS_OPTION
:
2193 case SELINUX_CONTEXT_OPTION
:
2194 set_archive_format ("posix");
2195 selinux_context_option
= 1;
2198 case NO_SELINUX_CONTEXT_OPTION
:
2199 selinux_context_option
= -1;
2203 set_archive_format ("posix");
2207 case NO_XATTR_OPTION
:
2213 xattrs_mask_add (arg
, (key
== XATTR_INCLUDE
));
2216 case RECURSION_OPTION
:
2217 recursion_option
= FNM_LEADING_DIR
;
2220 case SAME_OWNER_OPTION
:
2221 same_owner_option
= 1;
2224 case UNQUOTE_OPTION
:
2225 unquote_option
= true;
2228 case NO_UNQUOTE_OPTION
:
2229 unquote_option
= false;
2232 case WARNING_OPTION
:
2233 set_warning_option (arg
);
2245 #ifdef DEVICE_PREFIX
2247 int device
= key
- '0';
2249 static char buf
[sizeof DEVICE_PREFIX
+ 10];
2253 argp_error (state
, _("Malformed density argument: %s"), quote (arg
));
2255 strcpy (buf
, DEVICE_PREFIX
);
2256 cursor
= buf
+ strlen (buf
);
2258 #ifdef DENSITY_LETTER
2260 sprintf (cursor
, "%d%c", device
, arg
[0]);
2262 #else /* not DENSITY_LETTER */
2267 device
+= LOW_DENSITY_NUM
;
2271 device
+= MID_DENSITY_NUM
;
2275 device
+= HIGH_DENSITY_NUM
;
2279 argp_error (state
, _("Unknown density: '%c'"), arg
[0]);
2281 sprintf (cursor
, "%d", device
);
2283 #endif /* not DENSITY_LETTER */
2285 if (archive_names
== allocated_archive_names
)
2286 archive_name_array
= x2nrealloc (archive_name_array
,
2287 &allocated_archive_names
,
2288 sizeof (archive_name_array
[0]));
2289 archive_name_array
[archive_names
++] = xstrdup (buf
);
2293 #else /* not DEVICE_PREFIX */
2296 _("Options '-[0-7][lmh]' not supported by *this* tar"));
2298 #endif /* not DEVICE_PREFIX */
2301 return ARGP_ERR_UNKNOWN
;
2306 static struct argp argp
= {
2319 argp_help (&argp
, stderr
, ARGP_HELP_SEE
, (char*) program_name
);
2324 /* Parse the options for tar. */
2326 static struct argp_option
*
2327 find_argp_option (struct argp_option
*o
, int letter
)
2334 && o
->doc
== NULL
); o
++)
2335 if (o
->key
== letter
)
2340 static const char *tar_authors
[] = {
2347 decode_options (int argc
, char **argv
)
2350 struct tar_args args
;
2352 argp_version_setup ("tar", tar_authors
);
2354 /* Set some default option values. */
2355 args
.textual_date
= NULL
;
2356 args
.wildcards
= default_wildcards
;
2357 args
.matching_flags
= 0;
2358 args
.include_anchored
= EXCLUDE_ANCHORED
;
2359 args
.o_option
= false;
2360 args
.pax_option
= false;
2361 args
.backup_suffix_string
= getenv ("SIMPLE_BACKUP_SUFFIX");
2362 args
.version_control_string
= 0;
2363 args
.input_files
= false;
2364 args
.compress_autodetect
= false;
2366 subcommand_option
= UNKNOWN_SUBCOMMAND
;
2367 archive_format
= DEFAULT_FORMAT
;
2368 blocking_factor
= DEFAULT_BLOCKING
;
2369 record_size
= DEFAULT_BLOCKING
* BLOCKSIZE
;
2370 excluded
= new_exclude ();
2371 newer_mtime_option
.tv_sec
= TYPE_MINIMUM (time_t);
2372 newer_mtime_option
.tv_nsec
= -1;
2373 recursion_option
= FNM_LEADING_DIR
;
2374 unquote_option
= true;
2375 tar_sparse_major
= 1;
2376 tar_sparse_minor
= 0;
2378 owner_option
= -1; owner_name_option
= NULL
;
2379 group_option
= -1; group_name_option
= NULL
;
2381 check_device_option
= true;
2383 incremental_level
= -1;
2387 /* Convert old-style tar call by exploding option element and rearranging
2388 options accordingly. */
2390 if (argc
> 1 && argv
[1][0] != '-')
2392 int new_argc
; /* argc value for rearranged arguments */
2393 char **new_argv
; /* argv value for rearranged arguments */
2394 char *const *in
; /* cursor into original argv */
2395 char **out
; /* cursor into rearranged argv */
2396 const char *letter
; /* cursor into old option letters */
2397 char buffer
[3]; /* constructed option buffer */
2399 /* Initialize a constructed option. */
2404 /* Allocate a new argument array, and copy program name in it. */
2406 new_argc
= argc
- 1 + strlen (argv
[1]);
2407 new_argv
= xmalloc ((new_argc
+ 1) * sizeof (char *));
2412 /* Copy each old letter option as a separate option, and have the
2413 corresponding argument moved next to it. */
2415 for (letter
= *in
++; *letter
; letter
++)
2417 struct argp_option
*opt
;
2419 buffer
[1] = *letter
;
2420 *out
++ = xstrdup (buffer
);
2421 opt
= find_argp_option (options
, *letter
);
2422 if (opt
&& opt
->arg
)
2424 if (in
< argv
+ argc
)
2427 USAGE_ERROR ((0, 0, _("Old option '%c' requires an argument."),
2432 /* Copy all remaining options. */
2434 while (in
< argv
+ argc
)
2438 /* Replace the old option list by the new one. */
2444 /* Parse all options and non-options as they appear. */
2446 prepend_default_options (getenv ("TAR_OPTIONS"), &argc
, &argv
);
2448 if (argp_parse (&argp
, argc
, argv
, ARGP_IN_ORDER
, &idx
, &args
))
2449 exit (TAREXIT_FAILURE
);
2452 /* Special handling for 'o' option:
2454 GNU tar used to say "output old format".
2455 UNIX98 tar says don't chown files after extracting (we use
2456 "--no-same-owner" for this).
2458 The old GNU tar semantics is retained when used with --create
2459 option, otherwise UNIX98 semantics is assumed */
2463 if (subcommand_option
== CREATE_SUBCOMMAND
)
2465 /* GNU Tar <= 1.13 compatibility */
2466 set_archive_format ("v7");
2470 /* UNIX98 compatibility */
2471 same_owner_option
= -1;
2475 /* Handle operands after any "--" argument. */
2476 for (; idx
< argc
; idx
++)
2478 name_add_name (argv
[idx
], MAKE_INCL_OPTIONS (&args
));
2479 args
.input_files
= true;
2482 /* Warn about implicit use of the wildcards in command line arguments.
2484 warn_regex_usage
= args
.wildcards
== default_wildcards
;
2486 /* Derive option values and check option consistency. */
2488 if (archive_format
== DEFAULT_FORMAT
)
2490 if (args
.pax_option
)
2491 archive_format
= POSIX_FORMAT
;
2493 archive_format
= DEFAULT_ARCHIVE_FORMAT
;
2496 if ((volume_label_option
&& subcommand_option
== CREATE_SUBCOMMAND
)
2497 || incremental_option
2498 || multi_volume_option
2500 assert_format (FORMAT_MASK (OLDGNU_FORMAT
)
2501 | FORMAT_MASK (GNU_FORMAT
)
2502 | FORMAT_MASK (POSIX_FORMAT
));
2504 if (occurrence_option
)
2506 if (!args
.input_files
)
2508 _("--occurrence is meaningless without a file list")));
2509 if (subcommand_option
!= DELETE_SUBCOMMAND
2510 && subcommand_option
!= DIFF_SUBCOMMAND
2511 && subcommand_option
!= EXTRACT_SUBCOMMAND
2512 && subcommand_option
!= LIST_SUBCOMMAND
)
2514 _("--occurrence cannot be used in the requested operation mode")));
2517 if (archive_names
== 0)
2519 /* If no archive file name given, try TAPE from the environment, or
2520 else, DEFAULT_ARCHIVE from the configuration process. */
2523 archive_name_array
[0] = getenv ("TAPE");
2524 if (! archive_name_array
[0])
2525 archive_name_array
[0] = DEFAULT_ARCHIVE
;
2528 /* Allow multiple archives only with '-M'. */
2530 if (archive_names
> 1 && !multi_volume_option
)
2532 _("Multiple archive files require '-M' option")));
2534 if (listed_incremental_option
2535 && NEWER_OPTION_INITIALIZED (newer_mtime_option
))
2537 _("Cannot combine --listed-incremental with --newer")));
2538 if (incremental_level
!= -1 && !listed_incremental_option
)
2540 _("--level is meaningless without --listed-incremental")));
2542 if (volume_label_option
)
2544 if (archive_format
== GNU_FORMAT
|| archive_format
== OLDGNU_FORMAT
)
2546 size_t volume_label_max_len
=
2547 (sizeof current_header
->header
.name
2548 - 1 /* for trailing '\0' */
2549 - (multi_volume_option
2550 ? (sizeof " Volume "
2551 - 1 /* for null at end of " Volume " */
2552 + INT_STRLEN_BOUND (int) /* for volume number */
2553 - 1 /* for sign, as 0 <= volno */)
2555 if (volume_label_max_len
< strlen (volume_label_option
))
2557 ngettext ("%s: Volume label is too long (limit is %lu byte)",
2558 "%s: Volume label is too long (limit is %lu bytes)",
2559 volume_label_max_len
),
2560 quotearg_colon (volume_label_option
),
2561 (unsigned long) volume_label_max_len
));
2564 Label length in PAX format is limited by the volume size. */
2569 if (multi_volume_option
)
2570 USAGE_ERROR ((0, 0, _("Cannot verify multi-volume archives")));
2571 if (use_compress_program_option
)
2572 USAGE_ERROR ((0, 0, _("Cannot verify compressed archives")));
2575 if (use_compress_program_option
)
2577 if (multi_volume_option
)
2578 USAGE_ERROR ((0, 0, _("Cannot use multi-volume compressed archives")));
2579 if (subcommand_option
== UPDATE_SUBCOMMAND
2580 || subcommand_option
== APPEND_SUBCOMMAND
2581 || subcommand_option
== DELETE_SUBCOMMAND
)
2582 USAGE_ERROR ((0, 0, _("Cannot update compressed archives")));
2583 if (subcommand_option
== CAT_SUBCOMMAND
)
2584 USAGE_ERROR ((0, 0, _("Cannot concatenate compressed archives")));
2587 /* It is no harm to use --pax-option on non-pax archives in archive
2588 reading mode. It may even be useful, since it allows to override
2589 file attributes from tar headers. Therefore I allow such usage.
2592 && archive_format
!= POSIX_FORMAT
2593 && !READ_LIKE_SUBCOMMAND
)
2594 USAGE_ERROR ((0, 0, _("--pax-option can be used only on POSIX archives")));
2596 /* star creates non-POSIX typed archives with xattr support, so allow the
2597 extra headers whenn reading */
2598 if ((acls_option
> 0)
2599 && archive_format
!= POSIX_FORMAT
2600 && !READ_LIKE_SUBCOMMAND
)
2601 USAGE_ERROR ((0, 0, _("--acls can be used only on POSIX archives")));
2603 if ((selinux_context_option
> 0)
2604 && archive_format
!= POSIX_FORMAT
2605 && !READ_LIKE_SUBCOMMAND
)
2606 USAGE_ERROR ((0, 0, _("--selinux can be used only on POSIX archives")));
2608 if ((xattrs_option
> 0)
2609 && archive_format
!= POSIX_FORMAT
2610 && !READ_LIKE_SUBCOMMAND
)
2611 USAGE_ERROR ((0, 0, _("--xattrs can be used only on POSIX archives")));
2613 /* If ready to unlink hierarchies, so we are for simpler files. */
2614 if (recursive_unlink_option
)
2615 old_files_option
= UNLINK_FIRST_OLD_FILES
;
2617 /* Flags for accessing files to be read from or copied into. POSIX says
2618 O_NONBLOCK has unspecified effect on most types of files, but in
2619 practice it never harms and sometimes helps. */
2621 int base_open_flags
=
2622 (O_BINARY
| O_CLOEXEC
| O_NOCTTY
| O_NONBLOCK
2623 | (dereference_option
? 0 : O_NOFOLLOW
)
2624 | (atime_preserve_option
== system_atime_preserve
? O_NOATIME
: 0));
2625 open_read_flags
= O_RDONLY
| base_open_flags
;
2626 open_searchdir_flags
= O_SEARCH
| O_DIRECTORY
| base_open_flags
;
2628 fstatat_flags
= dereference_option
? 0 : AT_SYMLINK_NOFOLLOW
;
2630 if (subcommand_option
== TEST_LABEL_SUBCOMMAND
)
2632 /* --test-label is silent if the user has specified the label name to
2634 if (!args
.input_files
)
2637 else if (utc_option
)
2640 if (tape_length_option
&& tape_length_option
< record_size
)
2641 USAGE_ERROR ((0, 0, _("Volume length cannot be less than record size")));
2643 if (same_order_option
&& listed_incremental_option
)
2644 USAGE_ERROR ((0, 0, _("--preserve-order is not compatible with "
2645 "--listed-incremental")));
2647 /* Forbid using -c with no input files whatsoever. Check that '-f -',
2648 explicit or implied, is used correctly. */
2650 switch (subcommand_option
)
2652 case CREATE_SUBCOMMAND
:
2653 if (!args
.input_files
&& !files_from_option
)
2655 _("Cowardly refusing to create an empty archive")));
2656 if (args
.compress_autodetect
&& archive_names
2657 && strcmp (archive_name_array
[0], "-"))
2658 set_compression_program_by_suffix (archive_name_array
[0],
2659 use_compress_program_option
);
2662 case EXTRACT_SUBCOMMAND
:
2663 case LIST_SUBCOMMAND
:
2664 case DIFF_SUBCOMMAND
:
2665 case TEST_LABEL_SUBCOMMAND
:
2666 for (archive_name_cursor
= archive_name_array
;
2667 archive_name_cursor
< archive_name_array
+ archive_names
;
2668 archive_name_cursor
++)
2669 if (!strcmp (*archive_name_cursor
, "-"))
2670 request_stdin ("-f");
2673 case CAT_SUBCOMMAND
:
2674 case UPDATE_SUBCOMMAND
:
2675 case APPEND_SUBCOMMAND
:
2676 for (archive_name_cursor
= archive_name_array
;
2677 archive_name_cursor
< archive_name_array
+ archive_names
;
2678 archive_name_cursor
++)
2679 if (!strcmp (*archive_name_cursor
, "-"))
2681 _("Options '-Aru' are incompatible with '-f -'")));
2687 /* Initialize stdlis */
2688 if (index_file_name
)
2690 stdlis
= fopen (index_file_name
, "w");
2692 open_fatal (index_file_name
);
2695 stdlis
= to_stdout_option
? stderr
: stdout
;
2697 archive_name_cursor
= archive_name_array
;
2699 /* Prepare for generating backup names. */
2701 if (args
.backup_suffix_string
)
2702 simple_backup_suffix
= xstrdup (args
.backup_suffix_string
);
2706 backup_type
= xget_version ("--backup", args
.version_control_string
);
2707 /* No backup is needed either if explicitely disabled or if
2708 the extracted files are not being written to disk. */
2709 if (backup_type
== no_backups
|| EXTRACT_OVER_PIPE
)
2710 backup_option
= false;
2713 checkpoint_finish_compile ();
2715 report_textual_dates (&args
);
2721 /* Main routine for tar. */
2723 main (int argc
, char **argv
)
2726 set_program_name (argv
[0]);
2728 setlocale (LC_ALL
, "");
2729 bindtextdomain (PACKAGE
, LOCALEDIR
);
2730 textdomain (PACKAGE
);
2732 exit_failure
= TAREXIT_FAILURE
;
2733 exit_status
= TAREXIT_SUCCESS
;
2734 filename_terminator
= '\n';
2735 set_quoting_style (0, DEFAULT_QUOTING_STYLE
);
2737 /* Make sure we have first three descriptors available */
2740 /* Pre-allocate a few structures. */
2742 allocated_archive_names
= 10;
2743 archive_name_array
=
2744 xmalloc (sizeof (const char *) * allocated_archive_names
);
2747 obstack_init (&argv_stk
);
2749 /* System V fork+wait does not work if SIGCHLD is ignored. */
2750 signal (SIGCHLD
, SIG_DFL
);
2752 /* Try to disable the ability to unlink a directory. */
2753 priv_set_remove_linkdir ();
2755 /* Decode options. */
2757 decode_options (argc
, argv
);
2761 /* Main command execution. */
2763 if (volno_file_option
)
2764 init_volume_number ();
2766 switch (subcommand_option
)
2768 case UNKNOWN_SUBCOMMAND
:
2770 _("You must specify one of the '-Acdtrux' or '--test-label' options")));
2772 case CAT_SUBCOMMAND
:
2773 case UPDATE_SUBCOMMAND
:
2774 case APPEND_SUBCOMMAND
:
2778 case DELETE_SUBCOMMAND
:
2779 delete_archive_members ();
2782 case CREATE_SUBCOMMAND
:
2786 case EXTRACT_SUBCOMMAND
:
2788 read_and (extract_archive
);
2790 /* FIXME: should extract_finish () even if an ordinary signal is
2796 case LIST_SUBCOMMAND
:
2797 read_and (list_archive
);
2800 case DIFF_SUBCOMMAND
:
2802 read_and (diff_archive
);
2805 case TEST_LABEL_SUBCOMMAND
:
2806 test_archive_label ();
2810 print_total_stats ();
2812 if (check_links_option
)
2815 if (volno_file_option
)
2816 closeout_volume_number ();
2818 /* Dispose of allocated memory, and return. */
2820 free (archive_name_array
);
2821 xattrs_clear_setup ();
2824 if (exit_status
== TAREXIT_FAILURE
)
2825 error (0, 0, _("Exiting with failure status due to previous errors"));
2827 if (stdlis
== stdout
)
2829 else if (ferror (stderr
) || fclose (stderr
) != 0)
2830 set_exit_status (TAREXIT_FAILURE
);
2836 tar_stat_init (struct tar_stat_info
*st
)
2838 memset (st
, 0, sizeof (*st
));
2841 /* Close the stream or file descriptor associated with ST, and remove
2842 all traces of it from ST. Return true if successful, false (with a
2843 diagnostic) otherwise. */
2845 tar_stat_close (struct tar_stat_info
*st
)
2847 int status
= (st
->dirstream
? closedir (st
->dirstream
)
2848 : 0 < st
->fd
? close (st
->fd
)
2857 close_diag (st
->orig_file_name
);
2863 tar_stat_destroy (struct tar_stat_info
*st
)
2865 tar_stat_close (st
);
2866 xheader_xattr_free (st
->xattr_map
, st
->xattr_map_size
);
2867 free (st
->orig_file_name
);
2868 free (st
->file_name
);
2869 free (st
->link_name
);
2872 free (st
->cntx_name
);
2873 free (st
->acls_a_ptr
);
2874 free (st
->acls_d_ptr
);
2875 free (st
->sparse_map
);
2877 xheader_destroy (&st
->xhdr
);
2878 memset (st
, 0, sizeof (*st
));
2881 /* Format mask for all available formats that support nanosecond
2882 timestamp resolution. */
2883 #define NS_PRECISION_FORMAT_MASK FORMAT_MASK (POSIX_FORMAT)
2885 /* Same as timespec_cmp, but ignore nanoseconds if current archive
2886 format does not provide sufficient resolution. */
2888 tar_timespec_cmp (struct timespec a
, struct timespec b
)
2890 if (!(FORMAT_MASK (current_format
) & NS_PRECISION_FORMAT_MASK
))
2891 a
.tv_nsec
= b
.tv_nsec
= 0;
2892 return timespec_cmp (a
, b
);
2895 /* Set tar exit status to VAL, unless it is already indicating
2896 a more serious condition. This relies on the fact that the
2897 values of TAREXIT_ constants are ranged by severity. */
2899 set_exit_status (int val
)
2901 if (val
> exit_status
)