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
,
308 NO_WILDCARDS_MATCH_SLASH_OPTION
,
312 NUMERIC_OWNER_OPTION
,
315 ONE_FILE_SYSTEM_OPTION
,
316 OVERWRITE_DIR_OPTION
,
323 QUOTING_STYLE_OPTION
,
326 RECURSIVE_UNLINK_OPTION
,
332 SHOW_DEFAULTS_OPTION
,
333 SHOW_OMITTED_DIRS_OPTION
,
334 SHOW_TRANSFORMED_NAMES_OPTION
,
335 SKIP_OLD_FILES_OPTION
,
336 SPARSE_VERSION_OPTION
,
337 STRIP_COMPONENTS_OPTION
,
347 WILDCARDS_MATCH_SLASH_OPTION
,
354 const char *argp_program_version
= "tar (" PACKAGE_NAME
") " VERSION
;
355 const char *argp_program_bug_address
= "<" PACKAGE_BUGREPORT
">";
356 static char const doc
[] = N_("\
357 GNU 'tar' saves many files together into a single tape or disk archive, \
358 and can restore individual files from the archive.\n\
361 tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n\
362 tar -tvf archive.tar # List all files in archive.tar verbosely.\n\
363 tar -xf archive.tar # Extract all files from archive.tar.\n")
365 N_("The backup suffix is '~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
366 The version control may be set with --backup or VERSION_CONTROL, values are:\n\n\
367 none, off never make backups\n\
368 t, numbered make numbered backups\n\
369 nil, existing numbered if numbered backups exist, simple otherwise\n\
370 never, simple always make simple backups\n");
375 Available option letters are DEQY and eqy. Consider the following
378 [For Solaris tar compatibility =/= Is it important at all?]
379 e exit immediately with a nonzero exit status if unexpected errors occur
380 E use extended headers (--format=posix)
382 [q alias for --occurrence=1 =/= this would better be used for quiet?]
384 y per-file gzip compression
385 Y per-block gzip compression.
387 Additionally, the 'n' letter is assigned for option --seek, which
388 is probably not needed and should be marked as deprecated, so that
389 -n may become available in the future.
392 static struct argp_option options
[] = {
395 N_("Main operation mode:"), GRID
},
398 N_("list the contents of an archive"), GRID
+1 },
399 {"extract", 'x', 0, 0,
400 N_("extract files from an archive"), GRID
+1 },
401 {"get", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
402 {"create", 'c', 0, 0,
403 N_("create a new archive"), GRID
+1 },
405 N_("find differences between archive and file system"), GRID
+1 },
406 {"compare", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
407 {"append", 'r', 0, 0,
408 N_("append files to the end of an archive"), GRID
+1 },
409 {"update", 'u', 0, 0,
410 N_("only append files newer than copy in archive"), GRID
+1 },
411 {"catenate", 'A', 0, 0,
412 N_("append tar files to an archive"), GRID
+1 },
413 {"concatenate", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
414 {"delete", DELETE_OPTION
, 0, 0,
415 N_("delete from the archive (not on mag tapes!)"), GRID
+1 },
416 {"test-label", TEST_LABEL_OPTION
, NULL
, 0,
417 N_("test the archive volume label and exit"), GRID
+1 },
422 N_("Operation modifiers:"), GRID
},
424 {"sparse", 'S', 0, 0,
425 N_("handle sparse files efficiently"), GRID
+1 },
426 {"sparse-version", SPARSE_VERSION_OPTION
, N_("MAJOR[.MINOR]"), 0,
427 N_("set version of the sparse format to use (implies --sparse)"), GRID
+1},
428 {"incremental", 'G', 0, 0,
429 N_("handle old GNU-format incremental backup"), GRID
+1 },
430 {"listed-incremental", 'g', N_("FILE"), 0,
431 N_("handle new GNU-format incremental backup"), GRID
+1 },
432 {"level", LEVEL_OPTION
, N_("NUMBER"), 0,
433 N_("dump level for created listed-incremental archive"), GRID
+1 },
434 {"ignore-failed-read", IGNORE_FAILED_READ_OPTION
, 0, 0,
435 N_("do not exit with nonzero on unreadable files"), GRID
+1 },
436 {"occurrence", OCCURRENCE_OPTION
, N_("NUMBER"), OPTION_ARG_OPTIONAL
,
437 N_("process only the NUMBERth occurrence of each file in the archive;"
438 " this option is valid only in conjunction with one of the subcommands"
439 " --delete, --diff, --extract or --list and when a list of files"
440 " is given either on the command line or via the -T option;"
441 " NUMBER defaults to 1"), GRID
+1 },
442 {"seek", 'n', NULL
, 0,
443 N_("archive is seekable"), GRID
+1 },
444 {"no-seek", NO_SEEK_OPTION
, NULL
, 0,
445 N_("archive is not seekable"), GRID
+1 },
446 {"no-check-device", NO_CHECK_DEVICE_OPTION
, NULL
, 0,
447 N_("do not check device numbers when creating incremental archives"),
449 {"check-device", CHECK_DEVICE_OPTION
, NULL
, 0,
450 N_("check device numbers when creating incremental archives (default)"),
456 N_("Overwrite control:"), GRID
},
458 {"verify", 'W', 0, 0,
459 N_("attempt to verify the archive after writing it"), GRID
+1 },
460 {"remove-files", REMOVE_FILES_OPTION
, 0, 0,
461 N_("remove files after adding them to the archive"), GRID
+1 },
462 {"keep-old-files", 'k', 0, 0,
463 N_("don't replace existing files when extracting, "
464 "treat them as errors"), GRID
+1 },
465 {"skip-old-files", SKIP_OLD_FILES_OPTION
, 0, 0,
466 N_("don't replace existing files when extracting, silently skip over them"),
468 {"keep-newer-files", KEEP_NEWER_FILES_OPTION
, 0, 0,
469 N_("don't replace existing files that are newer than their archive copies"), GRID
+1 },
470 {"overwrite", OVERWRITE_OPTION
, 0, 0,
471 N_("overwrite existing files when extracting"), GRID
+1 },
472 {"unlink-first", 'U', 0, 0,
473 N_("remove each file prior to extracting over it"), GRID
+1 },
474 {"recursive-unlink", RECURSIVE_UNLINK_OPTION
, 0, 0,
475 N_("empty hierarchies prior to extracting directory"), GRID
+1 },
476 {"no-overwrite-dir", NO_OVERWRITE_DIR_OPTION
, 0, 0,
477 N_("preserve metadata of existing directories"), GRID
+1 },
478 {"overwrite-dir", OVERWRITE_DIR_OPTION
, 0, 0,
479 N_("overwrite metadata of existing directories when extracting (default)"),
485 N_("Select output stream:"), GRID
},
487 {"to-stdout", 'O', 0, 0,
488 N_("extract files to standard output"), GRID
+1 },
489 {"to-command", TO_COMMAND_OPTION
, N_("COMMAND"), 0,
490 N_("pipe extracted files to another program"), GRID
+1 },
491 {"ignore-command-error", IGNORE_COMMAND_ERROR_OPTION
, 0, 0,
492 N_("ignore exit codes of children"), GRID
+1 },
493 {"no-ignore-command-error", NO_IGNORE_COMMAND_ERROR_OPTION
, 0, 0,
494 N_("treat non-zero exit codes of children as error"), GRID
+1 },
499 N_("Handling of file attributes:"), GRID
},
501 {"owner", OWNER_OPTION
, N_("NAME"), 0,
502 N_("force NAME as owner for added files"), GRID
+1 },
503 {"group", GROUP_OPTION
, N_("NAME"), 0,
504 N_("force NAME as group for added files"), GRID
+1 },
505 {"mtime", MTIME_OPTION
, N_("DATE-OR-FILE"), 0,
506 N_("set mtime for added files from DATE-OR-FILE"), GRID
+1 },
507 {"mode", MODE_OPTION
, N_("CHANGES"), 0,
508 N_("force (symbolic) mode CHANGES for added files"), GRID
+1 },
509 {"atime-preserve", ATIME_PRESERVE_OPTION
,
510 N_("METHOD"), OPTION_ARG_OPTIONAL
,
511 N_("preserve access times on dumped files, either by restoring the times"
512 " after reading (METHOD='replace'; default) or by not setting the times"
513 " in the first place (METHOD='system')"), GRID
+1 },
515 N_("don't extract file modified time"), GRID
+1 },
516 {"same-owner", SAME_OWNER_OPTION
, 0, 0,
517 N_("try extracting files with the same ownership as exists in the archive (default for superuser)"), GRID
+1 },
518 {"no-same-owner", NO_SAME_OWNER_OPTION
, 0, 0,
519 N_("extract files as yourself (default for ordinary users)"), GRID
+1 },
520 {"numeric-owner", NUMERIC_OWNER_OPTION
, 0, 0,
521 N_("always use numbers for user/group names"), GRID
+1 },
522 {"preserve-permissions", 'p', 0, 0,
523 N_("extract information about file permissions (default for superuser)"),
525 {"same-permissions", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
526 {"no-same-permissions", NO_SAME_PERMISSIONS_OPTION
, 0, 0,
527 N_("apply the user's umask when extracting permissions from the archive (default for ordinary users)"), GRID
+1 },
528 {"preserve-order", 's', 0, 0,
529 N_("sort names to extract to match archive"), GRID
+1 },
530 {"same-order", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
531 {"preserve", PRESERVE_OPTION
, 0, 0,
532 N_("same as both -p and -s"), GRID
+1 },
533 {"delay-directory-restore", DELAY_DIRECTORY_RESTORE_OPTION
, 0, 0,
534 N_("delay setting modification times and permissions of extracted"
535 " directories until the end of extraction"), GRID
+1 },
536 {"no-delay-directory-restore", NO_DELAY_DIRECTORY_RESTORE_OPTION
, 0, 0,
537 N_("cancel the effect of --delay-directory-restore option"), GRID
+1 },
542 N_("Handling of extended file attributes:"), GRID
},
544 {"xattrs", XATTR_OPTION
, 0, 0,
545 N_("Enable extended attributes support"), GRID
+1 },
546 {"no-xattrs", NO_XATTR_OPTION
, 0, 0,
547 N_("Disable extended attributes support"), GRID
+1 },
548 {"xattrs-include", XATTR_INCLUDE
, N_("MASK"), 0,
549 N_("specify the include pattern for xattr keys"), GRID
+1 },
550 {"xattrs-exclude", XATTR_EXCLUDE
, N_("MASK"), 0,
551 N_("specify the exclude pattern for xattr keys"), GRID
+1 },
552 {"acls", ACLS_OPTION
, 0, 0,
553 N_("Enable the POSIX ACLs support"), GRID
+1 },
554 {"no-acls", NO_ACLS_OPTION
, 0, 0,
555 N_("Disable the POSIX ACLs support"), GRID
+1 },
560 N_("Device selection and switching:"), GRID
},
562 {"file", 'f', N_("ARCHIVE"), 0,
563 N_("use archive file or device ARCHIVE"), GRID
+1 },
564 {"force-local", FORCE_LOCAL_OPTION
, 0, 0,
565 N_("archive file is local even if it has a colon"), GRID
+1 },
566 {"rmt-command", RMT_COMMAND_OPTION
, N_("COMMAND"), 0,
567 N_("use given rmt COMMAND instead of rmt"), GRID
+1 },
568 {"rsh-command", RSH_COMMAND_OPTION
, N_("COMMAND"), 0,
569 N_("use remote COMMAND instead of rsh"), GRID
+1 },
571 {"-[0-7][lmh]", 0, NULL
, OPTION_DOC
, /* It is OK, since 'name' will never be
573 N_("specify drive and density"), GRID
+1 },
575 {NULL
, '0', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
576 {NULL
, '1', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
577 {NULL
, '2', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
578 {NULL
, '3', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
579 {NULL
, '4', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
580 {NULL
, '5', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
581 {NULL
, '6', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
582 {NULL
, '7', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
583 {NULL
, '8', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
584 {NULL
, '9', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
586 {"multi-volume", 'M', 0, 0,
587 N_("create/list/extract multi-volume archive"), GRID
+1 },
588 {"tape-length", 'L', N_("NUMBER"), 0,
589 N_("change tape after writing NUMBER x 1024 bytes"), GRID
+1 },
590 {"info-script", 'F', N_("NAME"), 0,
591 N_("run script at end of each tape (implies -M)"), GRID
+1 },
592 {"new-volume-script", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
593 {"volno-file", VOLNO_FILE_OPTION
, N_("FILE"), 0,
594 N_("use/update the volume number in FILE"), GRID
+1 },
599 N_("Device blocking:"), GRID
},
601 {"blocking-factor", 'b', N_("BLOCKS"), 0,
602 N_("BLOCKS x 512 bytes per record"), GRID
+1 },
603 {"record-size", RECORD_SIZE_OPTION
, N_("NUMBER"), 0,
604 N_("NUMBER of bytes per record, multiple of 512"), GRID
+1 },
605 {"ignore-zeros", 'i', 0, 0,
606 N_("ignore zeroed blocks in archive (means EOF)"), GRID
+1 },
607 {"read-full-records", 'B', 0, 0,
608 N_("reblock as we read (for 4.2BSD pipes)"), GRID
+1 },
613 N_("Archive format selection:"), GRID
},
615 {"format", 'H', N_("FORMAT"), 0,
616 N_("create archive of the given format"), GRID
+1 },
618 {NULL
, 0, NULL
, 0, N_("FORMAT is one of the following:"), GRID
+2 },
619 {" v7", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("old V7 tar format"),
621 {" oldgnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
622 N_("GNU format as per tar <= 1.12"), GRID
+3 },
623 {" gnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
624 N_("GNU tar 1.13.x format"), GRID
+3 },
625 {" ustar", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
626 N_("POSIX 1003.1-1988 (ustar) format"), GRID
+3 },
627 {" pax", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
628 N_("POSIX 1003.1-2001 (pax) format"), GRID
+3 },
629 {" posix", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("same as pax"), GRID
+3 },
631 {"old-archive", OLD_ARCHIVE_OPTION
, 0, 0, /* FIXME */
632 N_("same as --format=v7"), GRID
+8 },
633 {"portability", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
634 {"posix", POSIX_OPTION
, 0, 0,
635 N_("same as --format=posix"), GRID
+8 },
636 {"pax-option", PAX_OPTION
, N_("keyword[[:]=value][,keyword[[:]=value]]..."), 0,
637 N_("control pax keywords"), GRID
+8 },
638 {"label", 'V', N_("TEXT"), 0,
639 N_("create archive with volume name TEXT; at list/extract time, use TEXT as a globbing pattern for volume name"), GRID
+8 },
644 N_("Compression options:"), GRID
},
645 {"auto-compress", 'a', 0, 0,
646 N_("use archive suffix to determine the compression program"), GRID
+1 },
647 {"no-auto-compress", NO_AUTO_COMPRESS_OPTION
, 0, 0,
648 N_("do not use archive suffix to determine the compression program"),
650 {"use-compress-program", 'I', N_("PROG"), 0,
651 N_("filter through PROG (must accept -d)"), GRID
+1 },
652 /* Note: docstrings for the options below are generated by tar_help_filter */
653 {"bzip2", 'j', 0, 0, NULL
, GRID
+1 },
654 {"gzip", 'z', 0, 0, NULL
, GRID
+1 },
655 {"gunzip", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
656 {"ungzip", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
657 {"compress", 'Z', 0, 0, NULL
, GRID
+1 },
658 {"uncompress", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
659 {"lzip", LZIP_OPTION
, 0, 0, NULL
, GRID
+1 },
660 {"lzma", LZMA_OPTION
, 0, 0, NULL
, GRID
+1 },
661 {"lzop", LZOP_OPTION
, 0, 0, NULL
, GRID
+1 },
662 {"xz", 'J', 0, 0, NULL
, GRID
+1 },
667 N_("Local file selection:"), GRID
},
669 {"add-file", ARGP_KEY_ARG
, N_("FILE"), 0,
670 N_("add given FILE to the archive (useful if its name starts with a dash)"), GRID
+1 },
671 {"directory", 'C', N_("DIR"), 0,
672 N_("change to directory DIR"), GRID
+1 },
673 {"files-from", 'T', N_("FILE"), 0,
674 N_("get names to extract or create from FILE"), GRID
+1 },
675 {"null", NULL_OPTION
, 0, 0,
676 N_("-T reads null-terminated names, disable -C"), GRID
+1 },
677 {"no-null", NO_NULL_OPTION
, 0, 0,
678 N_("disable the effect of the previous --null option"), GRID
+1 },
679 {"unquote", UNQUOTE_OPTION
, 0, 0,
680 N_("unquote filenames read with -T (default)"), GRID
+1 },
681 {"no-unquote", NO_UNQUOTE_OPTION
, 0, 0,
682 N_("do not unquote filenames read with -T"), GRID
+1 },
683 {"exclude", EXCLUDE_OPTION
, N_("PATTERN"), 0,
684 N_("exclude files, given as a PATTERN"), GRID
+1 },
685 {"exclude-from", 'X', N_("FILE"), 0,
686 N_("exclude patterns listed in FILE"), GRID
+1 },
687 {"exclude-caches", EXCLUDE_CACHES_OPTION
, 0, 0,
688 N_("exclude contents of directories containing CACHEDIR.TAG, "
689 "except for the tag file itself"), GRID
+1 },
690 {"exclude-caches-under", EXCLUDE_CACHES_UNDER_OPTION
, 0, 0,
691 N_("exclude everything under directories containing CACHEDIR.TAG"),
693 {"exclude-caches-all", EXCLUDE_CACHES_ALL_OPTION
, 0, 0,
694 N_("exclude directories containing CACHEDIR.TAG"), GRID
+1 },
695 {"exclude-tag", EXCLUDE_TAG_OPTION
, N_("FILE"), 0,
696 N_("exclude contents of directories containing FILE, except"
697 " for FILE itself"), GRID
+1 },
698 {"exclude-tag-under", EXCLUDE_TAG_UNDER_OPTION
, N_("FILE"), 0,
699 N_("exclude everything under directories containing FILE"), GRID
+1 },
700 {"exclude-tag-all", EXCLUDE_TAG_ALL_OPTION
, N_("FILE"), 0,
701 N_("exclude directories containing FILE"), GRID
+1 },
702 {"exclude-vcs", EXCLUDE_VCS_OPTION
, NULL
, 0,
703 N_("exclude version control system directories"), GRID
+1 },
704 {"exclude-backups", EXCLUDE_BACKUPS_OPTION
, NULL
, 0,
705 N_("exclude backup and lock files"), GRID
+1 },
706 {"no-recursion", NO_RECURSION_OPTION
, 0, 0,
707 N_("avoid descending automatically in directories"), GRID
+1 },
708 {"one-file-system", ONE_FILE_SYSTEM_OPTION
, 0, 0,
709 N_("stay in local file system when creating archive"), GRID
+1 },
710 {"recursion", RECURSION_OPTION
, 0, 0,
711 N_("recurse into directories (default)"), GRID
+1 },
712 {"absolute-names", 'P', 0, 0,
713 N_("don't strip leading '/'s from file names"), GRID
+1 },
714 {"dereference", 'h', 0, 0,
715 N_("follow symlinks; archive and dump the files they point to"), GRID
+1 },
716 {"hard-dereference", HARD_DEREFERENCE_OPTION
, 0, 0,
717 N_("follow hard links; archive and dump the files they refer to"), GRID
+1 },
718 {"starting-file", 'K', N_("MEMBER-NAME"), 0,
719 N_("begin at member MEMBER-NAME in the archive"), GRID
+1 },
720 {"newer", 'N', N_("DATE-OR-FILE"), 0,
721 N_("only store files newer than DATE-OR-FILE"), GRID
+1 },
722 {"after-date", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
723 {"newer-mtime", NEWER_MTIME_OPTION
, N_("DATE"), 0,
724 N_("compare date and time when data changed only"), GRID
+1 },
725 {"backup", BACKUP_OPTION
, N_("CONTROL"), OPTION_ARG_OPTIONAL
,
726 N_("backup before removal, choose version CONTROL"), GRID
+1 },
727 {"suffix", SUFFIX_OPTION
, N_("STRING"), 0,
728 N_("backup before removal, override usual suffix ('~' unless overridden by environment variable SIMPLE_BACKUP_SUFFIX)"), GRID
+1 },
733 N_("File name transformations:"), GRID
},
734 {"strip-components", STRIP_COMPONENTS_OPTION
, N_("NUMBER"), 0,
735 N_("strip NUMBER leading components from file names on extraction"),
737 {"transform", TRANSFORM_OPTION
, N_("EXPRESSION"), 0,
738 N_("use sed replace EXPRESSION to transform file names"), GRID
+1 },
739 {"xform", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
744 N_("File name matching options (affect both exclude and include patterns):"),
746 {"ignore-case", IGNORE_CASE_OPTION
, 0, 0,
747 N_("ignore case"), GRID
+1 },
748 {"anchored", ANCHORED_OPTION
, 0, 0,
749 N_("patterns match file name start"), GRID
+1 },
750 {"no-anchored", NO_ANCHORED_OPTION
, 0, 0,
751 N_("patterns match after any '/' (default for exclusion)"), GRID
+1 },
752 {"no-ignore-case", NO_IGNORE_CASE_OPTION
, 0, 0,
753 N_("case sensitive matching (default)"), GRID
+1 },
754 {"wildcards", WILDCARDS_OPTION
, 0, 0,
755 N_("use wildcards (default for exclusion)"), GRID
+1 },
756 {"no-wildcards", NO_WILDCARDS_OPTION
, 0, 0,
757 N_("verbatim string matching"), GRID
+1 },
758 {"no-wildcards-match-slash", NO_WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
759 N_("wildcards do not match '/'"), GRID
+1 },
760 {"wildcards-match-slash", WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
761 N_("wildcards match '/' (default for exclusion)"), GRID
+1 },
766 N_("Informative output:"), GRID
},
768 {"verbose", 'v', 0, 0,
769 N_("verbosely list files processed"), GRID
+1 },
770 {"warning", WARNING_OPTION
, N_("KEYWORD"), 0,
771 N_("warning control"), GRID
+1 },
772 {"checkpoint", CHECKPOINT_OPTION
, N_("NUMBER"), OPTION_ARG_OPTIONAL
,
773 N_("display progress messages every NUMBERth record (default 10)"),
775 {"checkpoint-action", CHECKPOINT_ACTION_OPTION
, N_("ACTION"), 0,
776 N_("execute ACTION on each checkpoint"),
778 {"check-links", 'l', 0, 0,
779 N_("print a message if not all links are dumped"), GRID
+1 },
780 {"totals", TOTALS_OPTION
, N_("SIGNAL"), OPTION_ARG_OPTIONAL
,
781 N_("print total bytes after processing the archive; "
782 "with an argument - print total bytes when this SIGNAL is delivered; "
783 "Allowed signals are: SIGHUP, SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; "
784 "the names without SIG prefix are also accepted"), GRID
+1 },
785 {"utc", UTC_OPTION
, 0, 0,
786 N_("print file modification times in UTC"), GRID
+1 },
787 {"full-time", FULL_TIME_OPTION
, 0, 0,
788 N_("print file time to its full resolution"), GRID
+1 },
789 {"index-file", INDEX_FILE_OPTION
, N_("FILE"), 0,
790 N_("send verbose output to FILE"), GRID
+1 },
791 {"block-number", 'R', 0, 0,
792 N_("show block number within archive with each message"), GRID
+1 },
793 {"interactive", 'w', 0, 0,
794 N_("ask for confirmation for every action"), GRID
+1 },
795 {"confirmation", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
796 {"show-defaults", SHOW_DEFAULTS_OPTION
, 0, 0,
797 N_("show tar defaults"), GRID
+1 },
798 {"show-omitted-dirs", SHOW_OMITTED_DIRS_OPTION
, 0, 0,
799 N_("when listing or extracting, list each directory that does not match search criteria"), GRID
+1 },
800 {"show-transformed-names", SHOW_TRANSFORMED_NAMES_OPTION
, 0, 0,
801 N_("show file or archive names after transformation"),
803 {"show-stored-names", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
804 {"quoting-style", QUOTING_STYLE_OPTION
, N_("STYLE"), 0,
805 N_("set name quoting style; see below for valid STYLE values"), GRID
+1 },
806 {"quote-chars", QUOTE_CHARS_OPTION
, N_("STRING"), 0,
807 N_("additionally quote characters from STRING"), GRID
+1 },
808 {"no-quote-chars", NO_QUOTE_CHARS_OPTION
, N_("STRING"), 0,
809 N_("disable quoting for characters from STRING"), GRID
+1 },
814 N_("Compatibility options:"), GRID
},
817 N_("when creating, same as --old-archive; when extracting, same as --no-same-owner"), GRID
+1 },
822 N_("Other options:"), GRID
},
824 {"restrict", RESTRICT_OPTION
, 0, 0,
825 N_("disable use of some potentially harmful options"), -1 },
831 static char const *const atime_preserve_args
[] =
833 "replace", "system", NULL
836 static enum atime_preserve
const atime_preserve_types
[] =
838 replace_atime_preserve
, system_atime_preserve
841 /* Make sure atime_preserve_types has as much entries as atime_preserve_args
842 (minus 1 for NULL guard) */
843 ARGMATCH_VERIFY (atime_preserve_args
, atime_preserve_types
);
845 /* Wildcard matching settings */
848 default_wildcards
, /* For exclusion == enable_wildcards,
849 for inclusion == disable_wildcards */
854 struct tar_args
/* Variables used during option parsing */
856 struct textual_date
*textual_date
; /* Keeps the arguments to --newer-mtime
857 and/or --date option if they are
859 enum wildcards wildcards
; /* Wildcard settings (--wildcards/
861 int matching_flags
; /* exclude_fnmatch options */
862 int include_anchored
; /* Pattern anchoring options used for
864 bool o_option
; /* True if -o option was given */
865 bool pax_option
; /* True if --pax-option was given */
866 char const *backup_suffix_string
; /* --suffix option argument */
867 char const *version_control_string
; /* --backup option argument */
868 bool input_files
; /* True if some input files where given */
869 int compress_autodetect
; /* True if compression autodetection should
870 be attempted when creating archives */
874 #define MAKE_EXCL_OPTIONS(args) \
875 ((((args)->wildcards != disable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
876 | (args)->matching_flags \
879 #define MAKE_INCL_OPTIONS(args) \
880 ((((args)->wildcards == enable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
881 | (args)->include_anchored \
882 | (args)->matching_flags \
885 static char const * const vcs_file_table
[] = {
917 static char const * const backup_file_table
[] = {
925 add_exclude_array (char const * const * fv
, int opts
)
929 for (i
= 0; fv
[i
]; i
++)
930 add_exclude (excluded
, fv
[i
], opts
);
935 format_default_settings (void)
938 "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s"
943 archive_format_string (DEFAULT_ARCHIVE_FORMAT
),
944 DEFAULT_ARCHIVE
, DEFAULT_BLOCKING
,
945 quoting_style_args
[DEFAULT_QUOTING_STYLE
],
955 set_subcommand_option (enum subcommand subcommand
)
957 if (subcommand_option
!= UNKNOWN_SUBCOMMAND
958 && subcommand_option
!= subcommand
)
960 _("You may not specify more than one '-Acdtrux' or '--test-label' option")));
962 subcommand_option
= subcommand
;
966 set_use_compress_program_option (const char *string
)
968 if (use_compress_program_option
969 && strcmp (use_compress_program_option
, string
) != 0)
970 USAGE_ERROR ((0, 0, _("Conflicting compression options")));
972 use_compress_program_option
= string
;
979 print_total_stats ();
980 #ifndef HAVE_SIGACTION
981 signal (signo
, sigstat
);
986 stat_on_signal (int signo
)
988 #ifdef HAVE_SIGACTION
990 # define SA_RESTART 0
992 struct sigaction act
;
993 act
.sa_handler
= sigstat
;
994 sigemptyset (&act
.sa_mask
);
995 act
.sa_flags
= SA_RESTART
;
996 sigaction (signo
, &act
, NULL
);
998 signal (signo
, sigstat
);
1003 set_stat_signal (const char *name
)
1005 static struct sigtab
1009 } const sigtab
[] = {
1010 { "SIGUSR1", SIGUSR1
},
1011 { "USR1", SIGUSR1
},
1012 { "SIGUSR2", SIGUSR2
},
1013 { "USR2", SIGUSR2
},
1014 { "SIGHUP", SIGHUP
},
1016 { "SIGINT", SIGINT
},
1018 { "SIGQUIT", SIGQUIT
},
1021 struct sigtab
const *p
;
1023 for (p
= sigtab
; p
< sigtab
+ sizeof (sigtab
) / sizeof (sigtab
[0]); p
++)
1024 if (strcmp (p
->name
, name
) == 0)
1026 stat_on_signal (p
->signo
);
1029 FATAL_ERROR ((0, 0, _("Unknown signal name: %s"), name
));
1035 struct textual_date
*next
;
1042 get_date_or_file (struct tar_args
*args
, const char *option
,
1043 const char *str
, struct timespec
*ts
)
1045 if (FILE_SYSTEM_PREFIX_LEN (str
) != 0
1050 if (stat (str
, &st
) != 0)
1053 USAGE_ERROR ((0, 0, _("Date sample file not found")));
1055 *ts
= get_stat_mtime (&st
);
1059 if (! parse_datetime (ts
, str
, NULL
))
1061 WARN ((0, 0, _("Substituting %s for unknown date format %s"),
1062 tartime (*ts
, false), quote (str
)));
1068 struct textual_date
*p
= xmalloc (sizeof (*p
));
1071 p
->date
= xstrdup (str
);
1072 p
->next
= args
->textual_date
;
1073 args
->textual_date
= p
;
1080 report_textual_dates (struct tar_args
*args
)
1082 struct textual_date
*p
;
1083 for (p
= args
->textual_date
; p
; )
1085 struct textual_date
*next
= p
->next
;
1088 char const *treated_as
= tartime (p
->ts
, true);
1089 if (strcmp (p
->date
, treated_as
) != 0)
1090 WARN ((0, 0, _("Option %s: Treating date '%s' as %s"),
1091 p
->option
, p
->date
, treated_as
));
1101 /* Either NL or NUL, as decided by the --null option. */
1102 static char filename_terminator
;
1104 enum read_file_list_state
/* Result of reading file name from the list file */
1106 file_list_success
, /* OK, name read successfully */
1107 file_list_end
, /* End of list file */
1108 file_list_zero
, /* Zero separator encountered where it should not */
1109 file_list_skip
/* Empty (zero-length) entry encountered, skip it */
1112 /* Read from FP a sequence of characters up to TERM and put them
1115 static enum read_file_list_state
1116 read_name_from_file (FILE *fp
, struct obstack
*stk
, int term
)
1121 for (c
= getc (fp
); c
!= EOF
&& c
!= term
; c
= getc (fp
))
1125 /* We have read a zero separator. The file possibly is
1127 return file_list_zero
;
1129 obstack_1grow (stk
, c
);
1133 if (counter
== 0 && c
!= EOF
)
1134 return file_list_skip
;
1136 obstack_1grow (stk
, 0);
1138 return (counter
== 0 && c
== EOF
) ? file_list_end
: file_list_success
;
1142 static bool files_from_option
; /* When set, tar will not refuse to create
1144 static struct obstack argv_stk
; /* Storage for additional command line options
1145 read using -T option */
1147 /* Prevent recursive inclusion of the same file */
1150 struct file_id_list
*next
;
1155 static struct file_id_list
*file_id_list
;
1158 add_file_id (const char *filename
)
1160 struct file_id_list
*p
;
1163 if (stat (filename
, &st
))
1164 stat_fatal (filename
);
1165 for (p
= file_id_list
; p
; p
= p
->next
)
1166 if (p
->ino
== st
.st_ino
&& p
->dev
== st
.st_dev
)
1168 FATAL_ERROR ((0, 0, _("%s: file list already read"),
1169 quotearg_colon (filename
)));
1171 p
= xmalloc (sizeof *p
);
1172 p
->next
= file_id_list
;
1178 /* Default density numbers for [0-9][lmh] device specifications */
1180 #if defined DEVICE_PREFIX && !defined DENSITY_LETTER
1181 # ifndef LOW_DENSITY_NUM
1182 # define LOW_DENSITY_NUM 0
1185 # ifndef MID_DENSITY_NUM
1186 # define MID_DENSITY_NUM 8
1189 # ifndef HIGH_DENSITY_NUM
1190 # define HIGH_DENSITY_NUM 16
1195 update_argv (const char *filename
, struct argp_state
*state
)
1198 size_t count
= 0, i
;
1202 bool is_stdin
= false;
1203 enum read_file_list_state read_state
;
1204 int term
= filename_terminator
;
1206 if (!strcmp (filename
, "-"))
1209 request_stdin ("-T");
1214 add_file_id (filename
);
1215 if ((fp
= fopen (filename
, "r")) == NULL
)
1216 open_fatal (filename
);
1219 while ((read_state
= read_name_from_file (fp
, &argv_stk
, term
))
1224 case file_list_success
:
1228 case file_list_end
: /* won't happen, just to pacify gcc */
1231 case file_list_zero
:
1235 WARNOPT (WARN_FILENAME_WITH_NULS
,
1236 (0, 0, N_("%s: file name read contains nul character"),
1237 quotearg_colon (filename
)));
1239 /* Prepare new stack contents */
1240 size
= obstack_object_size (&argv_stk
);
1241 p
= obstack_finish (&argv_stk
);
1242 for (; size
> 0; size
--, p
++)
1244 obstack_1grow (&argv_stk
, *p
);
1246 obstack_1grow (&argv_stk
, '\n');
1247 obstack_1grow (&argv_stk
, 0);
1249 /* Read rest of files using new filename terminator */
1254 case file_list_skip
:
1265 start
= obstack_finish (&argv_stk
);
1268 for (p
= start
; *p
; p
+= strlen (p
) + 1)
1272 new_argc
= state
->argc
+ count
;
1273 new_argv
= xmalloc (sizeof (state
->argv
[0]) * (new_argc
+ 1));
1274 memcpy (new_argv
, state
->argv
, sizeof (state
->argv
[0]) * (state
->argc
+ 1));
1275 state
->argv
= new_argv
;
1276 memmove (&state
->argv
[state
->next
+ count
], &state
->argv
[state
->next
],
1277 (state
->argc
- state
->next
+ 1) * sizeof (state
->argv
[0]));
1279 state
->argc
= new_argc
;
1281 for (i
= state
->next
, p
= start
; *p
; p
+= strlen (p
) + 1, i
++)
1283 if (term
== 0 && p
[0] == '-')
1284 state
->argv
[i
++] = "--add-file";
1291 tar_help_filter (int key
, const char *text
, void *input
)
1303 s
= xasprintf (_("filter the archive through %s"), BZIP2_PROGRAM
);
1307 s
= xasprintf (_("filter the archive through %s"), GZIP_PROGRAM
);
1311 s
= xasprintf (_("filter the archive through %s"), COMPRESS_PROGRAM
);
1315 s
= xasprintf (_("filter the archive through %s"), LZIP_PROGRAM
);
1319 s
= xasprintf (_("filter the archive through %s"), LZMA_PROGRAM
);
1323 s
= xasprintf (_("filter the archive through %s"), XZ_PROGRAM
);
1326 case ARGP_KEY_HELP_EXTRA
:
1330 obstack_init (&stk
);
1331 tstr
= _("Valid arguments for the --quoting-style option are:");
1332 obstack_grow (&stk
, tstr
, strlen (tstr
));
1333 obstack_grow (&stk
, "\n\n", 2);
1334 tar_list_quoting_styles (&stk
, " ");
1335 tstr
= _("\n*This* tar defaults to:\n");
1336 obstack_grow (&stk
, tstr
, strlen (tstr
));
1337 s
= format_default_settings ();
1338 obstack_grow (&stk
, s
, strlen (s
));
1339 obstack_1grow (&stk
, '\n');
1340 obstack_1grow (&stk
, 0);
1341 s
= xstrdup (obstack_finish (&stk
));
1342 obstack_free (&stk
, NULL
);
1349 expand_pax_option (struct tar_args
*targs
, const char *arg
)
1354 obstack_init (&stk
);
1357 size_t seglen
= strcspn (arg
, ",");
1358 char *p
= memchr (arg
, '=', seglen
);
1361 size_t len
= p
- arg
+ 1;
1362 obstack_grow (&stk
, arg
, len
);
1364 for (++p
; *p
&& isspace ((unsigned char) *p
); p
++)
1366 if (*p
== '{' && p
[len
-1] == '}')
1369 char *tmp
= xmalloc (len
);
1370 memcpy (tmp
, p
+ 1, len
-2);
1372 if (get_date_or_file (targs
, "--pax-option", tmp
, &ts
) == 0)
1374 char buf
[UINTMAX_STRSIZE_BOUND
], *s
;
1375 s
= umaxtostr (ts
.tv_sec
, buf
);
1376 obstack_grow (&stk
, s
, strlen (s
));
1379 obstack_grow (&stk
, p
, len
);
1383 obstack_grow (&stk
, p
, len
);
1386 obstack_grow (&stk
, arg
, seglen
);
1391 obstack_1grow (&stk
, *arg
);
1395 obstack_1grow (&stk
, 0);
1396 res
= xstrdup (obstack_finish (&stk
));
1397 obstack_free (&stk
, NULL
);
1403 parse_owner_group (char *arg
, uintmax_t field_max
, char const **name_option
)
1405 uintmax_t u
= UINTMAX_MAX
;
1407 char const *name
= 0;
1408 char const *invalid_num
= 0;
1409 char *colon
= strchr (arg
, ':');
1413 char const *num
= colon
+ 1;
1417 if (num
&& (! (xstrtoumax (num
, &end
, 10, &u
, "") == LONGINT_OK
1418 && u
<= field_max
)))
1424 switch ('0' <= *arg
&& *arg
<= '9'
1425 ? xstrtoumax (arg
, &end
, 10, &u1
, "")
1433 if (u1
<= field_max
)
1439 case LONGINT_OVERFLOW
:
1446 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (invalid_num
),
1447 _("Invalid owner or group ID")));
1449 *name_option
= name
;
1453 #define TAR_SIZE_SUFFIXES "bBcGgkKMmPTtw"
1456 parse_opt (int key
, char *arg
, struct argp_state
*state
)
1458 struct tar_args
*args
= state
->input
;
1463 /* File name or non-parsed option, because of ARGP_IN_ORDER */
1464 name_add_name (arg
, MAKE_INCL_OPTIONS (args
));
1465 args
->input_files
= true;
1469 set_subcommand_option (CAT_SUBCOMMAND
);
1473 args
->compress_autodetect
= true;
1476 case NO_AUTO_COMPRESS_OPTION
:
1477 args
->compress_autodetect
= false;
1483 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1484 && u
== (blocking_factor
= u
)
1485 && 0 < blocking_factor
1486 && u
== (record_size
= u
* BLOCKSIZE
) / BLOCKSIZE
))
1487 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1488 _("Invalid blocking factor")));
1493 /* Try to reblock input records. For reading 4.2BSD pipes. */
1495 /* It would surely make sense to exchange -B and -R, but it seems
1496 that -B has been used for a long while in Sun tar and most
1497 BSD-derived systems. This is a consequence of the block/record
1498 terminology confusion. */
1500 read_full_records_option
= true;
1504 set_subcommand_option (CREATE_SUBCOMMAND
);
1512 set_subcommand_option (DIFF_SUBCOMMAND
);
1516 if (archive_names
== allocated_archive_names
)
1517 archive_name_array
= x2nrealloc (archive_name_array
,
1518 &allocated_archive_names
,
1519 sizeof (archive_name_array
[0]));
1521 archive_name_array
[archive_names
++] = arg
;
1525 /* Since -F is only useful with -M, make it implied. Run this
1526 script at the end of each tape. */
1528 info_script_option
= arg
;
1529 multi_volume_option
= true;
1532 case FULL_TIME_OPTION
:
1533 full_time_option
= true;
1537 listed_incremental_option
= arg
;
1538 after_date_option
= true;
1542 /* We are making an incremental dump (FIXME: are we?); save
1543 directories at the beginning of the archive, and include in each
1544 directory its contents. */
1546 incremental_option
= true;
1550 /* Follow symbolic links. */
1551 dereference_option
= true;
1554 case HARD_DEREFERENCE_OPTION
:
1555 hard_dereference_option
= true;
1559 /* Ignore zero blocks (eofs). This can't be the default,
1560 because Unix tar writes two blocks of zeros, then pads out
1561 the record with garbage. */
1563 ignore_zeros_option
= true;
1567 set_use_compress_program_option (BZIP2_PROGRAM
);
1571 set_use_compress_program_option (XZ_PROGRAM
);
1575 /* Don't replace existing files. */
1576 old_files_option
= KEEP_OLD_FILES
;
1580 starting_file_option
= true;
1581 addname (arg
, 0, true, NULL
);
1584 case ONE_FILE_SYSTEM_OPTION
:
1585 /* When dumping directories, don't dump files/subdirectories
1586 that are on other filesystems. */
1587 one_file_system_option
= true;
1591 check_links_option
= 1;
1599 if (xstrtoumax (arg
, &p
, 10, &u
, TAR_SIZE_SUFFIXES
) != LONGINT_OK
)
1600 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1601 _("Invalid tape length")));
1602 if (p
> arg
&& !strchr (TAR_SIZE_SUFFIXES
, p
[-1]))
1603 tape_length_option
= 1024 * (tarlong
) u
;
1605 tape_length_option
= (tarlong
) u
;
1606 multi_volume_option
= true;
1613 incremental_level
= strtoul (arg
, &p
, 10);
1615 USAGE_ERROR ((0, 0, _("Invalid incremental level value")));
1620 set_use_compress_program_option (LZIP_PROGRAM
);
1624 set_use_compress_program_option (LZMA_PROGRAM
);
1628 set_use_compress_program_option (LZOP_PROGRAM
);
1632 touch_option
= true;
1636 /* Make multivolume archive: when we can't write any more into
1637 the archive, re-open it, and continue writing. */
1639 multi_volume_option
= true;
1643 get_date_or_file (args
, "--mtime", arg
, &mtime_option
);
1644 set_mtime_option
= true;
1651 case NO_SEEK_OPTION
:
1656 after_date_option
= true;
1659 case NEWER_MTIME_OPTION
:
1660 if (NEWER_OPTION_INITIALIZED (newer_mtime_option
))
1661 USAGE_ERROR ((0, 0, _("More than one threshold date")));
1662 get_date_or_file (args
,
1663 key
== NEWER_MTIME_OPTION
? "--newer-mtime"
1664 : "--after-date", arg
, &newer_mtime_option
);
1668 args
->o_option
= true;
1672 to_stdout_option
= true;
1676 same_permissions_option
= true;
1680 absolute_names_option
= true;
1684 set_subcommand_option (APPEND_SUBCOMMAND
);
1688 /* Print block numbers for debugging bad tar archives. */
1690 /* It would surely make sense to exchange -B and -R, but it seems
1691 that -B has been used for a long while in Sun tar and most
1692 BSD-derived systems. This is a consequence of the block/record
1693 terminology confusion. */
1695 block_number_option
= true;
1699 /* Names to extract are sorted. */
1701 same_order_option
= true;
1705 sparse_option
= true;
1708 case SKIP_OLD_FILES_OPTION
:
1709 old_files_option
= SKIP_OLD_FILES
;
1712 case SPARSE_VERSION_OPTION
:
1713 sparse_option
= true;
1716 tar_sparse_major
= strtoul (arg
, &p
, 10);
1720 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1721 tar_sparse_minor
= strtoul (p
+ 1, &p
, 10);
1723 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1729 set_subcommand_option (LIST_SUBCOMMAND
);
1733 case TEST_LABEL_OPTION
:
1734 set_subcommand_option (TEST_LABEL_SUBCOMMAND
);
1738 update_argv (arg
, state
);
1739 /* Indicate we've been given -T option. This is for backward
1740 compatibility only, so that `tar cfT archive /dev/null will
1742 files_from_option
= true;
1746 set_subcommand_option (UPDATE_SUBCOMMAND
);
1750 old_files_option
= UNLINK_FIRST_OLD_FILES
;
1759 warning_option
|= WARN_VERBOSE_WARNINGS
;
1763 volume_label_option
= arg
;
1767 interactive_option
= true;
1771 verify_option
= true;
1775 set_subcommand_option (EXTRACT_SUBCOMMAND
);
1779 if (add_exclude_file (add_exclude
, excluded
, arg
,
1780 MAKE_EXCL_OPTIONS (args
), '\n')
1784 FATAL_ERROR ((0, e
, "%s", quotearg_colon (arg
)));
1789 set_use_compress_program_option (GZIP_PROGRAM
);
1793 set_use_compress_program_option (COMPRESS_PROGRAM
);
1796 case ANCHORED_OPTION
:
1797 args
->matching_flags
|= EXCLUDE_ANCHORED
;
1800 case ATIME_PRESERVE_OPTION
:
1801 atime_preserve_option
=
1803 ? XARGMATCH ("--atime-preserve", arg
,
1804 atime_preserve_args
, atime_preserve_types
)
1805 : replace_atime_preserve
);
1806 if (! O_NOATIME
&& atime_preserve_option
== system_atime_preserve
)
1808 _("--atime-preserve='system' is not supported"
1809 " on this platform")));
1812 case CHECK_DEVICE_OPTION
:
1813 check_device_option
= true;
1816 case NO_CHECK_DEVICE_OPTION
:
1817 check_device_option
= false;
1820 case CHECKPOINT_OPTION
:
1827 checkpoint_compile_action (".");
1830 checkpoint_option
= strtoul (arg
, &p
, 0);
1833 _("--checkpoint value is not an integer")));
1836 checkpoint_option
= DEFAULT_CHECKPOINT
;
1839 case CHECKPOINT_ACTION_OPTION
:
1840 checkpoint_compile_action (arg
);
1844 backup_option
= true;
1846 args
->version_control_string
= arg
;
1849 case DELAY_DIRECTORY_RESTORE_OPTION
:
1850 delay_directory_restore_option
= true;
1853 case NO_DELAY_DIRECTORY_RESTORE_OPTION
:
1854 delay_directory_restore_option
= false;
1858 set_subcommand_option (DELETE_SUBCOMMAND
);
1861 case EXCLUDE_BACKUPS_OPTION
:
1862 add_exclude_array (backup_file_table
, EXCLUDE_WILDCARDS
);
1865 case EXCLUDE_OPTION
:
1866 add_exclude (excluded
, arg
, MAKE_EXCL_OPTIONS (args
));
1869 case EXCLUDE_CACHES_OPTION
:
1870 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_contents
,
1874 case EXCLUDE_CACHES_UNDER_OPTION
:
1875 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_under
,
1879 case EXCLUDE_CACHES_ALL_OPTION
:
1880 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_all
,
1884 case EXCLUDE_TAG_OPTION
:
1885 add_exclusion_tag (arg
, exclusion_tag_contents
, NULL
);
1888 case EXCLUDE_TAG_UNDER_OPTION
:
1889 add_exclusion_tag (arg
, exclusion_tag_under
, NULL
);
1892 case EXCLUDE_TAG_ALL_OPTION
:
1893 add_exclusion_tag (arg
, exclusion_tag_all
, NULL
);
1896 case EXCLUDE_VCS_OPTION
:
1897 add_exclude_array (vcs_file_table
, 0);
1900 case FORCE_LOCAL_OPTION
:
1901 force_local_option
= true;
1905 set_archive_format (arg
);
1908 case INDEX_FILE_OPTION
:
1909 index_file_name
= arg
;
1912 case IGNORE_CASE_OPTION
:
1913 args
->matching_flags
|= FNM_CASEFOLD
;
1916 case IGNORE_COMMAND_ERROR_OPTION
:
1917 ignore_command_error_option
= true;
1920 case IGNORE_FAILED_READ_OPTION
:
1921 ignore_failed_read_option
= true;
1924 case KEEP_NEWER_FILES_OPTION
:
1925 old_files_option
= KEEP_NEWER_FILES
;
1930 uintmax_t u
= parse_owner_group (arg
, TYPE_MAXIMUM (gid_t
),
1931 &group_name_option
);
1932 if (u
== UINTMAX_MAX
)
1935 if (group_name_option
)
1936 gname_to_gid (group_name_option
, &group_option
);
1944 mode_option
= mode_compile (arg
);
1946 FATAL_ERROR ((0, 0, _("Invalid mode given on option")));
1947 initial_umask
= umask (0);
1948 umask (initial_umask
);
1951 case NO_ANCHORED_OPTION
:
1952 args
->include_anchored
= 0; /* Clear the default for comman line args */
1953 args
->matching_flags
&= ~ EXCLUDE_ANCHORED
;
1956 case NO_IGNORE_CASE_OPTION
:
1957 args
->matching_flags
&= ~ FNM_CASEFOLD
;
1960 case NO_IGNORE_COMMAND_ERROR_OPTION
:
1961 ignore_command_error_option
= false;
1964 case NO_OVERWRITE_DIR_OPTION
:
1965 old_files_option
= NO_OVERWRITE_DIR_OLD_FILES
;
1968 case NO_QUOTE_CHARS_OPTION
:
1970 set_char_quoting (NULL
, *arg
, 0);
1973 case NO_WILDCARDS_OPTION
:
1974 args
->wildcards
= disable_wildcards
;
1977 case NO_WILDCARDS_MATCH_SLASH_OPTION
:
1978 args
->matching_flags
|= FNM_FILE_NAME
;
1982 filename_terminator
= '\0';
1985 case NO_NULL_OPTION
:
1986 filename_terminator
= '\n';
1989 case NUMERIC_OWNER_OPTION
:
1990 numeric_owner_option
= true;
1993 case OCCURRENCE_OPTION
:
1995 occurrence_option
= 1;
1999 if (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
)
2000 occurrence_option
= u
;
2002 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
2003 _("Invalid number")));
2007 case OLD_ARCHIVE_OPTION
:
2008 set_archive_format ("v7");
2011 case OVERWRITE_DIR_OPTION
:
2012 old_files_option
= DEFAULT_OLD_FILES
;
2015 case OVERWRITE_OPTION
:
2016 old_files_option
= OVERWRITE_OLD_FILES
;
2021 uintmax_t u
= parse_owner_group (arg
, TYPE_MAXIMUM (uid_t
),
2022 &owner_name_option
);
2023 if (u
== UINTMAX_MAX
)
2026 if (owner_name_option
)
2027 uname_to_uid (owner_name_option
, &owner_option
);
2034 case QUOTE_CHARS_OPTION
:
2036 set_char_quoting (NULL
, *arg
, 1);
2039 case QUOTING_STYLE_OPTION
:
2040 tar_set_quoting_style (arg
);
2045 char *tmp
= expand_pax_option (args
, arg
);
2046 args
->pax_option
= true;
2047 xheader_set_option (tmp
);
2053 set_archive_format ("posix");
2056 case PRESERVE_OPTION
:
2057 /* FIXME: What it is good for? */
2058 same_permissions_option
= true;
2059 same_order_option
= true;
2060 WARN ((0, 0, _("The --preserve option is deprecated, "
2061 "use --preserve-permissions --preserve-order instead")));
2064 case RECORD_SIZE_OPTION
:
2068 if (! (xstrtoumax (arg
, NULL
, 10, &u
, TAR_SIZE_SUFFIXES
) == LONGINT_OK
2069 && u
== (size_t) u
))
2070 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
2071 _("Invalid record size")));
2073 if (record_size
% BLOCKSIZE
!= 0)
2074 USAGE_ERROR ((0, 0, _("Record size must be a multiple of %d."),
2076 blocking_factor
= record_size
/ BLOCKSIZE
;
2080 case RECURSIVE_UNLINK_OPTION
:
2081 recursive_unlink_option
= true;
2084 case REMOVE_FILES_OPTION
:
2085 remove_files_option
= true;
2088 case RESTRICT_OPTION
:
2089 restrict_option
= true;
2092 case RMT_COMMAND_OPTION
:
2096 case RSH_COMMAND_OPTION
:
2097 rsh_command_option
= arg
;
2100 case SHOW_DEFAULTS_OPTION
:
2102 char *s
= format_default_settings ();
2109 case STRIP_COMPONENTS_OPTION
:
2112 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
2113 && u
== (size_t) u
))
2114 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
2115 _("Invalid number of elements")));
2116 strip_name_components
= u
;
2120 case SHOW_OMITTED_DIRS_OPTION
:
2121 show_omitted_dirs_option
= true;
2124 case SHOW_TRANSFORMED_NAMES_OPTION
:
2125 show_transformed_names_option
= true;
2129 backup_option
= true;
2130 args
->backup_suffix_string
= arg
;
2133 case TO_COMMAND_OPTION
:
2134 if (to_command_option
)
2135 USAGE_ERROR ((0, 0, _("Only one --to-command option allowed")));
2136 to_command_option
= arg
;
2141 set_stat_signal (arg
);
2143 totals_option
= true;
2146 case TRANSFORM_OPTION
:
2147 set_transform_expr (arg
);
2151 set_use_compress_program_option (arg
);
2154 case VOLNO_FILE_OPTION
:
2155 volno_file_option
= arg
;
2158 case WILDCARDS_OPTION
:
2159 args
->wildcards
= enable_wildcards
;
2162 case WILDCARDS_MATCH_SLASH_OPTION
:
2163 args
->matching_flags
&= ~ FNM_FILE_NAME
;
2166 case NO_RECURSION_OPTION
:
2167 recursion_option
= 0;
2170 case NO_SAME_OWNER_OPTION
:
2171 same_owner_option
= -1;
2174 case NO_SAME_PERMISSIONS_OPTION
:
2175 same_permissions_option
= -1;
2179 set_archive_format ("posix");
2183 case NO_ACLS_OPTION
:
2188 set_archive_format ("posix");
2192 case NO_XATTR_OPTION
:
2198 xattrs_mask_add (arg
, (key
== XATTR_INCLUDE
));
2201 case RECURSION_OPTION
:
2202 recursion_option
= FNM_LEADING_DIR
;
2205 case SAME_OWNER_OPTION
:
2206 same_owner_option
= 1;
2209 case UNQUOTE_OPTION
:
2210 unquote_option
= true;
2213 case NO_UNQUOTE_OPTION
:
2214 unquote_option
= false;
2217 case WARNING_OPTION
:
2218 set_warning_option (arg
);
2230 #ifdef DEVICE_PREFIX
2232 int device
= key
- '0';
2234 static char buf
[sizeof DEVICE_PREFIX
+ 10];
2238 argp_error (state
, _("Malformed density argument: %s"), quote (arg
));
2240 strcpy (buf
, DEVICE_PREFIX
);
2241 cursor
= buf
+ strlen (buf
);
2243 #ifdef DENSITY_LETTER
2245 sprintf (cursor
, "%d%c", device
, arg
[0]);
2247 #else /* not DENSITY_LETTER */
2252 device
+= LOW_DENSITY_NUM
;
2256 device
+= MID_DENSITY_NUM
;
2260 device
+= HIGH_DENSITY_NUM
;
2264 argp_error (state
, _("Unknown density: '%c'"), arg
[0]);
2266 sprintf (cursor
, "%d", device
);
2268 #endif /* not DENSITY_LETTER */
2270 if (archive_names
== allocated_archive_names
)
2271 archive_name_array
= x2nrealloc (archive_name_array
,
2272 &allocated_archive_names
,
2273 sizeof (archive_name_array
[0]));
2274 archive_name_array
[archive_names
++] = xstrdup (buf
);
2278 #else /* not DEVICE_PREFIX */
2281 _("Options '-[0-7][lmh]' not supported by *this* tar"));
2283 #endif /* not DEVICE_PREFIX */
2286 return ARGP_ERR_UNKNOWN
;
2291 static struct argp argp
= {
2304 argp_help (&argp
, stderr
, ARGP_HELP_SEE
, (char*) program_name
);
2309 /* Parse the options for tar. */
2311 static struct argp_option
*
2312 find_argp_option (struct argp_option
*o
, int letter
)
2319 && o
->doc
== NULL
); o
++)
2320 if (o
->key
== letter
)
2325 static const char *tar_authors
[] = {
2332 decode_options (int argc
, char **argv
)
2335 struct tar_args args
;
2337 argp_version_setup ("tar", tar_authors
);
2339 /* Set some default option values. */
2340 args
.textual_date
= NULL
;
2341 args
.wildcards
= default_wildcards
;
2342 args
.matching_flags
= 0;
2343 args
.include_anchored
= EXCLUDE_ANCHORED
;
2344 args
.o_option
= false;
2345 args
.pax_option
= false;
2346 args
.backup_suffix_string
= getenv ("SIMPLE_BACKUP_SUFFIX");
2347 args
.version_control_string
= 0;
2348 args
.input_files
= false;
2349 args
.compress_autodetect
= false;
2351 subcommand_option
= UNKNOWN_SUBCOMMAND
;
2352 archive_format
= DEFAULT_FORMAT
;
2353 blocking_factor
= DEFAULT_BLOCKING
;
2354 record_size
= DEFAULT_BLOCKING
* BLOCKSIZE
;
2355 excluded
= new_exclude ();
2356 newer_mtime_option
.tv_sec
= TYPE_MINIMUM (time_t);
2357 newer_mtime_option
.tv_nsec
= -1;
2358 recursion_option
= FNM_LEADING_DIR
;
2359 unquote_option
= true;
2360 tar_sparse_major
= 1;
2361 tar_sparse_minor
= 0;
2363 owner_option
= -1; owner_name_option
= NULL
;
2364 group_option
= -1; group_name_option
= NULL
;
2366 check_device_option
= true;
2368 incremental_level
= -1;
2372 /* Convert old-style tar call by exploding option element and rearranging
2373 options accordingly. */
2375 if (argc
> 1 && argv
[1][0] != '-')
2377 int new_argc
; /* argc value for rearranged arguments */
2378 char **new_argv
; /* argv value for rearranged arguments */
2379 char *const *in
; /* cursor into original argv */
2380 char **out
; /* cursor into rearranged argv */
2381 const char *letter
; /* cursor into old option letters */
2382 char buffer
[3]; /* constructed option buffer */
2384 /* Initialize a constructed option. */
2389 /* Allocate a new argument array, and copy program name in it. */
2391 new_argc
= argc
- 1 + strlen (argv
[1]);
2392 new_argv
= xmalloc ((new_argc
+ 1) * sizeof (char *));
2397 /* Copy each old letter option as a separate option, and have the
2398 corresponding argument moved next to it. */
2400 for (letter
= *in
++; *letter
; letter
++)
2402 struct argp_option
*opt
;
2404 buffer
[1] = *letter
;
2405 *out
++ = xstrdup (buffer
);
2406 opt
= find_argp_option (options
, *letter
);
2407 if (opt
&& opt
->arg
)
2409 if (in
< argv
+ argc
)
2412 USAGE_ERROR ((0, 0, _("Old option '%c' requires an argument."),
2417 /* Copy all remaining options. */
2419 while (in
< argv
+ argc
)
2423 /* Replace the old option list by the new one. */
2429 /* Parse all options and non-options as they appear. */
2431 prepend_default_options (getenv ("TAR_OPTIONS"), &argc
, &argv
);
2433 if (argp_parse (&argp
, argc
, argv
, ARGP_IN_ORDER
, &idx
, &args
))
2434 exit (TAREXIT_FAILURE
);
2437 /* Special handling for 'o' option:
2439 GNU tar used to say "output old format".
2440 UNIX98 tar says don't chown files after extracting (we use
2441 "--no-same-owner" for this).
2443 The old GNU tar semantics is retained when used with --create
2444 option, otherwise UNIX98 semantics is assumed */
2448 if (subcommand_option
== CREATE_SUBCOMMAND
)
2450 /* GNU Tar <= 1.13 compatibility */
2451 set_archive_format ("v7");
2455 /* UNIX98 compatibility */
2456 same_owner_option
= -1;
2460 /* Handle operands after any "--" argument. */
2461 for (; idx
< argc
; idx
++)
2463 name_add_name (argv
[idx
], MAKE_INCL_OPTIONS (&args
));
2464 args
.input_files
= true;
2467 /* Warn about implicit use of the wildcards in command line arguments.
2469 warn_regex_usage
= args
.wildcards
== default_wildcards
;
2471 /* Derive option values and check option consistency. */
2473 if (archive_format
== DEFAULT_FORMAT
)
2475 if (args
.pax_option
)
2476 archive_format
= POSIX_FORMAT
;
2478 archive_format
= DEFAULT_ARCHIVE_FORMAT
;
2481 if ((volume_label_option
&& subcommand_option
== CREATE_SUBCOMMAND
)
2482 || incremental_option
2483 || multi_volume_option
2485 assert_format (FORMAT_MASK (OLDGNU_FORMAT
)
2486 | FORMAT_MASK (GNU_FORMAT
)
2487 | FORMAT_MASK (POSIX_FORMAT
));
2489 if (occurrence_option
)
2491 if (!args
.input_files
)
2493 _("--occurrence is meaningless without a file list")));
2494 if (subcommand_option
!= DELETE_SUBCOMMAND
2495 && subcommand_option
!= DIFF_SUBCOMMAND
2496 && subcommand_option
!= EXTRACT_SUBCOMMAND
2497 && subcommand_option
!= LIST_SUBCOMMAND
)
2499 _("--occurrence cannot be used in the requested operation mode")));
2502 if (archive_names
== 0)
2504 /* If no archive file name given, try TAPE from the environment, or
2505 else, DEFAULT_ARCHIVE from the configuration process. */
2508 archive_name_array
[0] = getenv ("TAPE");
2509 if (! archive_name_array
[0])
2510 archive_name_array
[0] = DEFAULT_ARCHIVE
;
2513 /* Allow multiple archives only with '-M'. */
2515 if (archive_names
> 1 && !multi_volume_option
)
2517 _("Multiple archive files require '-M' option")));
2519 if (listed_incremental_option
2520 && NEWER_OPTION_INITIALIZED (newer_mtime_option
))
2522 _("Cannot combine --listed-incremental with --newer")));
2523 if (incremental_level
!= -1 && !listed_incremental_option
)
2525 _("--level is meaningless without --listed-incremental")));
2527 if (volume_label_option
)
2529 if (archive_format
== GNU_FORMAT
|| archive_format
== OLDGNU_FORMAT
)
2531 size_t volume_label_max_len
=
2532 (sizeof current_header
->header
.name
2533 - 1 /* for trailing '\0' */
2534 - (multi_volume_option
2535 ? (sizeof " Volume "
2536 - 1 /* for null at end of " Volume " */
2537 + INT_STRLEN_BOUND (int) /* for volume number */
2538 - 1 /* for sign, as 0 <= volno */)
2540 if (volume_label_max_len
< strlen (volume_label_option
))
2542 ngettext ("%s: Volume label is too long (limit is %lu byte)",
2543 "%s: Volume label is too long (limit is %lu bytes)",
2544 volume_label_max_len
),
2545 quotearg_colon (volume_label_option
),
2546 (unsigned long) volume_label_max_len
));
2549 Label length in PAX format is limited by the volume size. */
2554 if (multi_volume_option
)
2555 USAGE_ERROR ((0, 0, _("Cannot verify multi-volume archives")));
2556 if (use_compress_program_option
)
2557 USAGE_ERROR ((0, 0, _("Cannot verify compressed archives")));
2560 if (use_compress_program_option
)
2562 if (multi_volume_option
)
2563 USAGE_ERROR ((0, 0, _("Cannot use multi-volume compressed archives")));
2564 if (subcommand_option
== UPDATE_SUBCOMMAND
2565 || subcommand_option
== APPEND_SUBCOMMAND
2566 || subcommand_option
== DELETE_SUBCOMMAND
)
2567 USAGE_ERROR ((0, 0, _("Cannot update compressed archives")));
2568 if (subcommand_option
== CAT_SUBCOMMAND
)
2569 USAGE_ERROR ((0, 0, _("Cannot concatenate compressed archives")));
2572 /* It is no harm to use --pax-option on non-pax archives in archive
2573 reading mode. It may even be useful, since it allows to override
2574 file attributes from tar headers. Therefore I allow such usage.
2577 && archive_format
!= POSIX_FORMAT
2578 && !READ_LIKE_SUBCOMMAND
)
2579 USAGE_ERROR ((0, 0, _("--pax-option can be used only on POSIX archives")));
2581 /* star creates non-POSIX typed archives with xattr support, so allow the
2582 extra headers whenn reading */
2583 if ((acls_option
> 0)
2584 && archive_format
!= POSIX_FORMAT
2585 && !READ_LIKE_SUBCOMMAND
)
2586 USAGE_ERROR ((0, 0, _("--acls can be used only on POSIX archives")));
2588 if ((xattrs_option
> 0)
2589 && archive_format
!= POSIX_FORMAT
2590 && !READ_LIKE_SUBCOMMAND
)
2591 USAGE_ERROR ((0, 0, _("--xattrs can be used only on POSIX archives")));
2593 /* If ready to unlink hierarchies, so we are for simpler files. */
2594 if (recursive_unlink_option
)
2595 old_files_option
= UNLINK_FIRST_OLD_FILES
;
2597 /* Flags for accessing files to be read from or copied into. POSIX says
2598 O_NONBLOCK has unspecified effect on most types of files, but in
2599 practice it never harms and sometimes helps. */
2601 int base_open_flags
=
2602 (O_BINARY
| O_CLOEXEC
| O_NOCTTY
| O_NONBLOCK
2603 | (dereference_option
? 0 : O_NOFOLLOW
)
2604 | (atime_preserve_option
== system_atime_preserve
? O_NOATIME
: 0));
2605 open_read_flags
= O_RDONLY
| base_open_flags
;
2606 open_searchdir_flags
= O_SEARCH
| O_DIRECTORY
| base_open_flags
;
2608 fstatat_flags
= dereference_option
? 0 : AT_SYMLINK_NOFOLLOW
;
2610 if (subcommand_option
== TEST_LABEL_SUBCOMMAND
)
2612 /* --test-label is silent if the user has specified the label name to
2614 if (!args
.input_files
)
2617 else if (utc_option
)
2620 if (tape_length_option
&& tape_length_option
< record_size
)
2621 USAGE_ERROR ((0, 0, _("Volume length cannot be less than record size")));
2623 if (same_order_option
&& listed_incremental_option
)
2624 USAGE_ERROR ((0, 0, _("--preserve-order is not compatible with "
2625 "--listed-incremental")));
2627 /* Forbid using -c with no input files whatsoever. Check that '-f -',
2628 explicit or implied, is used correctly. */
2630 switch (subcommand_option
)
2632 case CREATE_SUBCOMMAND
:
2633 if (!args
.input_files
&& !files_from_option
)
2635 _("Cowardly refusing to create an empty archive")));
2636 if (args
.compress_autodetect
&& archive_names
2637 && strcmp (archive_name_array
[0], "-"))
2638 set_compression_program_by_suffix (archive_name_array
[0],
2639 use_compress_program_option
);
2642 case EXTRACT_SUBCOMMAND
:
2643 case LIST_SUBCOMMAND
:
2644 case DIFF_SUBCOMMAND
:
2645 case TEST_LABEL_SUBCOMMAND
:
2646 for (archive_name_cursor
= archive_name_array
;
2647 archive_name_cursor
< archive_name_array
+ archive_names
;
2648 archive_name_cursor
++)
2649 if (!strcmp (*archive_name_cursor
, "-"))
2650 request_stdin ("-f");
2653 case CAT_SUBCOMMAND
:
2654 case UPDATE_SUBCOMMAND
:
2655 case APPEND_SUBCOMMAND
:
2656 for (archive_name_cursor
= archive_name_array
;
2657 archive_name_cursor
< archive_name_array
+ archive_names
;
2658 archive_name_cursor
++)
2659 if (!strcmp (*archive_name_cursor
, "-"))
2661 _("Options '-Aru' are incompatible with '-f -'")));
2667 /* Initialize stdlis */
2668 if (index_file_name
)
2670 stdlis
= fopen (index_file_name
, "w");
2672 open_fatal (index_file_name
);
2675 stdlis
= to_stdout_option
? stderr
: stdout
;
2677 archive_name_cursor
= archive_name_array
;
2679 /* Prepare for generating backup names. */
2681 if (args
.backup_suffix_string
)
2682 simple_backup_suffix
= xstrdup (args
.backup_suffix_string
);
2686 backup_type
= xget_version ("--backup", args
.version_control_string
);
2687 /* No backup is needed either if explicitely disabled or if
2688 the extracted files are not being written to disk. */
2689 if (backup_type
== no_backups
|| EXTRACT_OVER_PIPE
)
2690 backup_option
= false;
2693 checkpoint_finish_compile ();
2695 report_textual_dates (&args
);
2701 /* Main routine for tar. */
2703 main (int argc
, char **argv
)
2706 set_program_name (argv
[0]);
2708 setlocale (LC_ALL
, "");
2709 bindtextdomain (PACKAGE
, LOCALEDIR
);
2710 textdomain (PACKAGE
);
2712 exit_failure
= TAREXIT_FAILURE
;
2713 exit_status
= TAREXIT_SUCCESS
;
2714 filename_terminator
= '\n';
2715 set_quoting_style (0, DEFAULT_QUOTING_STYLE
);
2717 /* Make sure we have first three descriptors available */
2720 /* Pre-allocate a few structures. */
2722 allocated_archive_names
= 10;
2723 archive_name_array
=
2724 xmalloc (sizeof (const char *) * allocated_archive_names
);
2727 obstack_init (&argv_stk
);
2729 /* System V fork+wait does not work if SIGCHLD is ignored. */
2730 signal (SIGCHLD
, SIG_DFL
);
2732 /* Try to disable the ability to unlink a directory. */
2733 priv_set_remove_linkdir ();
2735 /* Decode options. */
2737 decode_options (argc
, argv
);
2741 /* Main command execution. */
2743 if (volno_file_option
)
2744 init_volume_number ();
2746 switch (subcommand_option
)
2748 case UNKNOWN_SUBCOMMAND
:
2750 _("You must specify one of the '-Acdtrux' or '--test-label' options")));
2752 case CAT_SUBCOMMAND
:
2753 case UPDATE_SUBCOMMAND
:
2754 case APPEND_SUBCOMMAND
:
2758 case DELETE_SUBCOMMAND
:
2759 delete_archive_members ();
2762 case CREATE_SUBCOMMAND
:
2766 case EXTRACT_SUBCOMMAND
:
2768 read_and (extract_archive
);
2770 /* FIXME: should extract_finish () even if an ordinary signal is
2776 case LIST_SUBCOMMAND
:
2777 read_and (list_archive
);
2780 case DIFF_SUBCOMMAND
:
2782 read_and (diff_archive
);
2785 case TEST_LABEL_SUBCOMMAND
:
2786 test_archive_label ();
2790 print_total_stats ();
2792 if (check_links_option
)
2795 if (volno_file_option
)
2796 closeout_volume_number ();
2798 /* Dispose of allocated memory, and return. */
2800 free (archive_name_array
);
2801 xattrs_clear_setup ();
2804 if (exit_status
== TAREXIT_FAILURE
)
2805 error (0, 0, _("Exiting with failure status due to previous errors"));
2807 if (stdlis
== stdout
)
2809 else if (ferror (stderr
) || fclose (stderr
) != 0)
2810 set_exit_status (TAREXIT_FAILURE
);
2816 tar_stat_init (struct tar_stat_info
*st
)
2818 memset (st
, 0, sizeof (*st
));
2821 /* Close the stream or file descriptor associated with ST, and remove
2822 all traces of it from ST. Return true if successful, false (with a
2823 diagnostic) otherwise. */
2825 tar_stat_close (struct tar_stat_info
*st
)
2827 int status
= (st
->dirstream
? closedir (st
->dirstream
)
2828 : 0 < st
->fd
? close (st
->fd
)
2837 close_diag (st
->orig_file_name
);
2843 tar_stat_destroy (struct tar_stat_info
*st
)
2845 tar_stat_close (st
);
2846 xheader_xattr_free (st
->xattr_map
, st
->xattr_map_size
);
2847 free (st
->orig_file_name
);
2848 free (st
->file_name
);
2849 free (st
->link_name
);
2852 free (st
->acls_a_ptr
);
2853 free (st
->acls_d_ptr
);
2854 free (st
->sparse_map
);
2856 xheader_destroy (&st
->xhdr
);
2857 memset (st
, 0, sizeof (*st
));
2860 /* Format mask for all available formats that support nanosecond
2861 timestamp resolution. */
2862 #define NS_PRECISION_FORMAT_MASK FORMAT_MASK (POSIX_FORMAT)
2864 /* Same as timespec_cmp, but ignore nanoseconds if current archive
2865 format does not provide sufficient resolution. */
2867 tar_timespec_cmp (struct timespec a
, struct timespec b
)
2869 if (!(FORMAT_MASK (current_format
) & NS_PRECISION_FORMAT_MASK
))
2870 a
.tv_nsec
= b
.tv_nsec
= 0;
2871 return timespec_cmp (a
, b
);
2874 /* Set tar exit status to VAL, unless it is already indicating
2875 a more serious condition. This relies on the fact that the
2876 values of TAREXIT_ constants are ranged by severity. */
2878 set_exit_status (int val
)
2880 if (val
> exit_status
)