1 /* A tar (tape archiver) program.
3 Copyright 1988, 1992-1997, 1999-2001, 2003-2007, 2012-2013 Free
4 Software Foundation, Inc.
6 Written by John Gilmore, starting 1985-08-25.
8 This program is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by the
10 Free Software Foundation; either version 3, or (at your option) any later
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
16 Public License for more details.
18 You should have received a copy of the GNU General Public License along
19 with this program. If not, see <http://www.gnu.org/licenses/>. */
25 #include <argp-namefrob.h>
26 #include <argp-fmtstream.h>
27 #include <argp-version-etc.h>
30 #if ! defined SIGCHLD && defined SIGCLD
31 # define SIGCHLD SIGCLD
34 /* The following causes "common.h" to produce definitions of all the global
35 variables, rather than just "extern" declarations of them. GNU tar does
36 depend on the system loader to preset all GLOBAL variables to neutral (or
37 zero) values; explicit initialization is usually not done. */
43 #include <configmake.h>
45 #include <parse-datetime.h>
47 #include <rmt-command.h>
50 #include <version-etc.h>
55 /* Local declarations. */
57 #ifndef DEFAULT_ARCHIVE_FORMAT
58 # define DEFAULT_ARCHIVE_FORMAT GNU_FORMAT
61 #ifndef DEFAULT_ARCHIVE
62 # define DEFAULT_ARCHIVE "tar.out"
65 #ifndef DEFAULT_BLOCKING
66 # define DEFAULT_BLOCKING 20
69 /* Print a message if not all links are dumped */
70 static int check_links_option
;
72 /* Number of allocated tape drive names. */
73 static size_t allocated_archive_names
;
78 /* Name of option using stdin. */
79 static const char *stdin_used_by
;
81 /* Doesn't return if stdin already requested. */
83 request_stdin (const char *option
)
86 USAGE_ERROR ((0, 0, _("Options '-%s' and '-%s' both want standard input"),
87 stdin_used_by
, option
));
89 stdin_used_by
= option
;
92 extern int rpmatch (char const *response
);
94 /* Returns true if and only if the user typed an affirmative response. */
96 confirm (const char *message_action
, const char *message_name
)
98 static FILE *confirm_file
;
99 static int confirm_file_EOF
;
104 if (archive
== 0 || stdin_used_by
)
106 confirm_file
= fopen (TTY_NAME
, "r");
108 open_fatal (TTY_NAME
);
112 request_stdin ("-w");
113 confirm_file
= stdin
;
117 fprintf (stdlis
, "%s %s?", message_action
, quote (message_name
));
120 if (!confirm_file_EOF
)
122 char *response
= NULL
;
123 size_t response_size
= 0;
124 if (getline (&response
, &response_size
, confirm_file
) < 0)
125 confirm_file_EOF
= 1;
127 status
= rpmatch (response
) > 0;
131 if (confirm_file_EOF
)
133 fputc ('\n', stdlis
);
140 static struct fmttab
{
142 enum archive_format fmt
;
145 { "oldgnu", OLDGNU_FORMAT
},
146 { "ustar", USTAR_FORMAT
},
147 { "posix", POSIX_FORMAT
},
148 #if 0 /* not fully supported yet */
149 { "star", STAR_FORMAT
},
151 { "gnu", GNU_FORMAT
},
152 { "pax", POSIX_FORMAT
}, /* An alias for posix */
157 set_archive_format (char const *name
)
159 struct fmttab
const *p
;
161 for (p
= fmttab
; strcmp (p
->name
, name
) != 0; )
163 USAGE_ERROR ((0, 0, _("%s: Invalid archive format"),
164 quotearg_colon (name
)));
166 archive_format
= p
->fmt
;
170 archive_format_string (enum archive_format fmt
)
172 struct fmttab
const *p
;
174 for (p
= fmttab
; p
->name
; p
++)
180 #define FORMAT_MASK(n) (1<<(n))
183 assert_format(unsigned fmt_mask
)
185 if ((FORMAT_MASK (archive_format
) & fmt_mask
) == 0)
187 _("GNU features wanted on incompatible archive format")));
191 subcommand_string (enum subcommand c
)
195 case UNKNOWN_SUBCOMMAND
:
198 case APPEND_SUBCOMMAND
:
204 case CREATE_SUBCOMMAND
:
207 case DELETE_SUBCOMMAND
:
210 case DIFF_SUBCOMMAND
:
213 case EXTRACT_SUBCOMMAND
:
216 case LIST_SUBCOMMAND
:
219 case UPDATE_SUBCOMMAND
:
222 case TEST_LABEL_SUBCOMMAND
:
223 return "--test-label";
229 tar_list_quoting_styles (struct obstack
*stk
, char const *prefix
)
232 size_t prefixlen
= strlen (prefix
);
234 for (i
= 0; quoting_style_args
[i
]; i
++)
236 obstack_grow (stk
, prefix
, prefixlen
);
237 obstack_grow (stk
, quoting_style_args
[i
],
238 strlen (quoting_style_args
[i
]));
239 obstack_1grow (stk
, '\n');
244 tar_set_quoting_style (char *arg
)
248 for (i
= 0; quoting_style_args
[i
]; i
++)
249 if (strcmp (arg
, quoting_style_args
[i
]) == 0)
251 set_quoting_style (NULL
, i
);
255 _("Unknown quoting style '%s'. Try '%s --quoting-style=help' to get a list."), arg
, program_invocation_short_name
));
263 ACLS_OPTION
= CHAR_MAX
+ 1,
265 ATIME_PRESERVE_OPTION
,
269 CHECKPOINT_ACTION_OPTION
,
270 DELAY_DIRECTORY_RESTORE_OPTION
,
271 HARD_DEREFERENCE_OPTION
,
273 EXCLUDE_BACKUPS_OPTION
,
274 EXCLUDE_CACHES_OPTION
,
275 EXCLUDE_CACHES_UNDER_OPTION
,
276 EXCLUDE_CACHES_ALL_OPTION
,
279 EXCLUDE_TAG_UNDER_OPTION
,
280 EXCLUDE_TAG_ALL_OPTION
,
286 IGNORE_COMMAND_ERROR_OPTION
,
287 IGNORE_FAILED_READ_OPTION
,
289 KEEP_DIRECTORY_SYMLINK_OPTION
,
290 KEEP_NEWER_FILES_OPTION
,
300 NO_AUTO_COMPRESS_OPTION
,
301 NO_CHECK_DEVICE_OPTION
,
302 NO_DELAY_DIRECTORY_RESTORE_OPTION
,
303 NO_IGNORE_CASE_OPTION
,
304 NO_IGNORE_COMMAND_ERROR_OPTION
,
306 NO_OVERWRITE_DIR_OPTION
,
307 NO_QUOTE_CHARS_OPTION
,
309 NO_SAME_OWNER_OPTION
,
310 NO_SAME_PERMISSIONS_OPTION
,
312 NO_SELINUX_CONTEXT_OPTION
,
314 NO_WILDCARDS_MATCH_SLASH_OPTION
,
318 NUMERIC_OWNER_OPTION
,
321 ONE_FILE_SYSTEM_OPTION
,
322 ONE_TOP_LEVEL_OPTION
,
323 OVERWRITE_DIR_OPTION
,
330 QUOTING_STYLE_OPTION
,
333 RECURSIVE_UNLINK_OPTION
,
339 SELINUX_CONTEXT_OPTION
,
340 SHOW_DEFAULTS_OPTION
,
341 SHOW_OMITTED_DIRS_OPTION
,
342 SHOW_SNAPSHOT_FIELD_RANGES_OPTION
,
343 SHOW_TRANSFORMED_NAMES_OPTION
,
344 SKIP_OLD_FILES_OPTION
,
345 SPARSE_VERSION_OPTION
,
346 STRIP_COMPONENTS_OPTION
,
356 WILDCARDS_MATCH_SLASH_OPTION
,
363 const char *argp_program_version
= "tar (" PACKAGE_NAME
") " VERSION
;
364 const char *argp_program_bug_address
= "<" PACKAGE_BUGREPORT
">";
365 static char const doc
[] = N_("\
366 GNU 'tar' saves many files together into a single tape or disk archive, \
367 and can restore individual files from the archive.\n\
370 tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n\
371 tar -tvf archive.tar # List all files in archive.tar verbosely.\n\
372 tar -xf archive.tar # Extract all files from archive.tar.\n")
374 N_("The backup suffix is '~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
375 The version control may be set with --backup or VERSION_CONTROL, values are:\n\n\
376 none, off never make backups\n\
377 t, numbered make numbered backups\n\
378 nil, existing numbered if numbered backups exist, simple otherwise\n\
379 never, simple always make simple backups\n");
384 Available option letters are DEQY and eqy. Consider the following
387 [For Solaris tar compatibility =/= Is it important at all?]
388 e exit immediately with a nonzero exit status if unexpected errors occur
389 E use extended headers (--format=posix)
391 [q alias for --occurrence=1 =/= this would better be used for quiet?]
393 y per-file gzip compression
394 Y per-block gzip compression.
396 Additionally, the 'n' letter is assigned for option --seek, which
397 is probably not needed and should be marked as deprecated, so that
398 -n may become available in the future.
401 static struct argp_option options
[] = {
404 N_("Main operation mode:"), GRID
},
407 N_("list the contents of an archive"), GRID
+1 },
408 {"extract", 'x', 0, 0,
409 N_("extract files from an archive"), GRID
+1 },
410 {"get", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
411 {"create", 'c', 0, 0,
412 N_("create a new archive"), GRID
+1 },
414 N_("find differences between archive and file system"), GRID
+1 },
415 {"compare", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
416 {"append", 'r', 0, 0,
417 N_("append files to the end of an archive"), GRID
+1 },
418 {"update", 'u', 0, 0,
419 N_("only append files newer than copy in archive"), GRID
+1 },
420 {"catenate", 'A', 0, 0,
421 N_("append tar files to an archive"), GRID
+1 },
422 {"concatenate", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
423 {"delete", DELETE_OPTION
, 0, 0,
424 N_("delete from the archive (not on mag tapes!)"), GRID
+1 },
425 {"test-label", TEST_LABEL_OPTION
, NULL
, 0,
426 N_("test the archive volume label and exit"), GRID
+1 },
431 N_("Operation modifiers:"), GRID
},
433 {"sparse", 'S', 0, 0,
434 N_("handle sparse files efficiently"), GRID
+1 },
435 {"sparse-version", SPARSE_VERSION_OPTION
, N_("MAJOR[.MINOR]"), 0,
436 N_("set version of the sparse format to use (implies --sparse)"), GRID
+1},
437 {"incremental", 'G', 0, 0,
438 N_("handle old GNU-format incremental backup"), GRID
+1 },
439 {"listed-incremental", 'g', N_("FILE"), 0,
440 N_("handle new GNU-format incremental backup"), GRID
+1 },
441 {"level", LEVEL_OPTION
, N_("NUMBER"), 0,
442 N_("dump level for created listed-incremental archive"), GRID
+1 },
443 {"ignore-failed-read", IGNORE_FAILED_READ_OPTION
, 0, 0,
444 N_("do not exit with nonzero on unreadable files"), GRID
+1 },
445 {"occurrence", OCCURRENCE_OPTION
, N_("NUMBER"), OPTION_ARG_OPTIONAL
,
446 N_("process only the NUMBERth occurrence of each file in the archive;"
447 " this option is valid only in conjunction with one of the subcommands"
448 " --delete, --diff, --extract or --list and when a list of files"
449 " is given either on the command line or via the -T option;"
450 " NUMBER defaults to 1"), GRID
+1 },
451 {"seek", 'n', NULL
, 0,
452 N_("archive is seekable"), GRID
+1 },
453 {"no-seek", NO_SEEK_OPTION
, NULL
, 0,
454 N_("archive is not seekable"), GRID
+1 },
455 {"no-check-device", NO_CHECK_DEVICE_OPTION
, NULL
, 0,
456 N_("do not check device numbers when creating incremental archives"),
458 {"check-device", CHECK_DEVICE_OPTION
, NULL
, 0,
459 N_("check device numbers when creating incremental archives (default)"),
465 N_("Overwrite control:"), GRID
},
467 {"verify", 'W', 0, 0,
468 N_("attempt to verify the archive after writing it"), GRID
+1 },
469 {"remove-files", REMOVE_FILES_OPTION
, 0, 0,
470 N_("remove files after adding them to the archive"), GRID
+1 },
471 {"keep-old-files", 'k', 0, 0,
472 N_("don't replace existing files when extracting, "
473 "treat them as errors"), GRID
+1 },
474 {"skip-old-files", SKIP_OLD_FILES_OPTION
, 0, 0,
475 N_("don't replace existing files when extracting, silently skip over them"),
477 {"keep-newer-files", KEEP_NEWER_FILES_OPTION
, 0, 0,
478 N_("don't replace existing files that are newer than their archive copies"), GRID
+1 },
479 {"overwrite", OVERWRITE_OPTION
, 0, 0,
480 N_("overwrite existing files when extracting"), GRID
+1 },
481 {"unlink-first", 'U', 0, 0,
482 N_("remove each file prior to extracting over it"), GRID
+1 },
483 {"recursive-unlink", RECURSIVE_UNLINK_OPTION
, 0, 0,
484 N_("empty hierarchies prior to extracting directory"), GRID
+1 },
485 {"no-overwrite-dir", NO_OVERWRITE_DIR_OPTION
, 0, 0,
486 N_("preserve metadata of existing directories"), GRID
+1 },
487 {"overwrite-dir", OVERWRITE_DIR_OPTION
, 0, 0,
488 N_("overwrite metadata of existing directories when extracting (default)"),
490 {"keep-directory-symlink", KEEP_DIRECTORY_SYMLINK_OPTION
, 0, 0,
491 N_("preserve existing symlinks to directories when extracting"),
493 {"one-top-level", ONE_TOP_LEVEL_OPTION
, 0, 0,
494 N_("create a subdirectory to avoid having loose files extracted"),
500 N_("Select output stream:"), GRID
},
502 {"to-stdout", 'O', 0, 0,
503 N_("extract files to standard output"), GRID
+1 },
504 {"to-command", TO_COMMAND_OPTION
, N_("COMMAND"), 0,
505 N_("pipe extracted files to another program"), GRID
+1 },
506 {"ignore-command-error", IGNORE_COMMAND_ERROR_OPTION
, 0, 0,
507 N_("ignore exit codes of children"), GRID
+1 },
508 {"no-ignore-command-error", NO_IGNORE_COMMAND_ERROR_OPTION
, 0, 0,
509 N_("treat non-zero exit codes of children as error"), GRID
+1 },
514 N_("Handling of file attributes:"), GRID
},
516 {"owner", OWNER_OPTION
, N_("NAME"), 0,
517 N_("force NAME as owner for added files"), GRID
+1 },
518 {"group", GROUP_OPTION
, N_("NAME"), 0,
519 N_("force NAME as group for added files"), GRID
+1 },
520 {"mtime", MTIME_OPTION
, N_("DATE-OR-FILE"), 0,
521 N_("set mtime for added files from DATE-OR-FILE"), GRID
+1 },
522 {"mode", MODE_OPTION
, N_("CHANGES"), 0,
523 N_("force (symbolic) mode CHANGES for added files"), GRID
+1 },
524 {"atime-preserve", ATIME_PRESERVE_OPTION
,
525 N_("METHOD"), OPTION_ARG_OPTIONAL
,
526 N_("preserve access times on dumped files, either by restoring the times"
527 " after reading (METHOD='replace'; default) or by not setting the times"
528 " in the first place (METHOD='system')"), GRID
+1 },
530 N_("don't extract file modified time"), GRID
+1 },
531 {"same-owner", SAME_OWNER_OPTION
, 0, 0,
532 N_("try extracting files with the same ownership as exists in the archive (default for superuser)"), GRID
+1 },
533 {"no-same-owner", NO_SAME_OWNER_OPTION
, 0, 0,
534 N_("extract files as yourself (default for ordinary users)"), GRID
+1 },
535 {"numeric-owner", NUMERIC_OWNER_OPTION
, 0, 0,
536 N_("always use numbers for user/group names"), GRID
+1 },
537 {"preserve-permissions", 'p', 0, 0,
538 N_("extract information about file permissions (default for superuser)"),
540 {"same-permissions", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
541 {"no-same-permissions", NO_SAME_PERMISSIONS_OPTION
, 0, 0,
542 N_("apply the user's umask when extracting permissions from the archive (default for ordinary users)"), GRID
+1 },
543 {"preserve-order", 's', 0, 0,
544 N_("member arguments are listed in the same order as the "
545 "files in the archive"), GRID
+1 },
546 {"same-order", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
547 {"preserve", PRESERVE_OPTION
, 0, 0,
548 N_("same as both -p and -s"), GRID
+1 },
549 {"delay-directory-restore", DELAY_DIRECTORY_RESTORE_OPTION
, 0, 0,
550 N_("delay setting modification times and permissions of extracted"
551 " directories until the end of extraction"), GRID
+1 },
552 {"no-delay-directory-restore", NO_DELAY_DIRECTORY_RESTORE_OPTION
, 0, 0,
553 N_("cancel the effect of --delay-directory-restore option"), GRID
+1 },
558 N_("Handling of extended file attributes:"), GRID
},
560 {"xattrs", XATTR_OPTION
, 0, 0,
561 N_("Enable extended attributes support"), GRID
+1 },
562 {"no-xattrs", NO_XATTR_OPTION
, 0, 0,
563 N_("Disable extended attributes support"), GRID
+1 },
564 {"xattrs-include", XATTR_INCLUDE
, N_("MASK"), 0,
565 N_("specify the include pattern for xattr keys"), GRID
+1 },
566 {"xattrs-exclude", XATTR_EXCLUDE
, N_("MASK"), 0,
567 N_("specify the exclude pattern for xattr keys"), GRID
+1 },
568 {"selinux", SELINUX_CONTEXT_OPTION
, 0, 0,
569 N_("Enable the SELinux context support"), GRID
+1 },
570 {"no-selinux", NO_SELINUX_CONTEXT_OPTION
, 0, 0,
571 N_("Disable the SELinux context support"), GRID
+1 },
572 {"acls", ACLS_OPTION
, 0, 0,
573 N_("Enable the POSIX ACLs support"), GRID
+1 },
574 {"no-acls", NO_ACLS_OPTION
, 0, 0,
575 N_("Disable the POSIX ACLs support"), GRID
+1 },
580 N_("Device selection and switching:"), GRID
},
582 {"file", 'f', N_("ARCHIVE"), 0,
583 N_("use archive file or device ARCHIVE"), GRID
+1 },
584 {"force-local", FORCE_LOCAL_OPTION
, 0, 0,
585 N_("archive file is local even if it has a colon"), GRID
+1 },
586 {"rmt-command", RMT_COMMAND_OPTION
, N_("COMMAND"), 0,
587 N_("use given rmt COMMAND instead of rmt"), GRID
+1 },
588 {"rsh-command", RSH_COMMAND_OPTION
, N_("COMMAND"), 0,
589 N_("use remote COMMAND instead of rsh"), GRID
+1 },
591 {"-[0-7][lmh]", 0, NULL
, OPTION_DOC
, /* It is OK, since 'name' will never be
593 N_("specify drive and density"), GRID
+1 },
595 {NULL
, '0', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
596 {NULL
, '1', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
597 {NULL
, '2', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
598 {NULL
, '3', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
599 {NULL
, '4', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
600 {NULL
, '5', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
601 {NULL
, '6', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
602 {NULL
, '7', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
603 {NULL
, '8', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
604 {NULL
, '9', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
606 {"multi-volume", 'M', 0, 0,
607 N_("create/list/extract multi-volume archive"), GRID
+1 },
608 {"tape-length", 'L', N_("NUMBER"), 0,
609 N_("change tape after writing NUMBER x 1024 bytes"), GRID
+1 },
610 {"info-script", 'F', N_("NAME"), 0,
611 N_("run script at end of each tape (implies -M)"), GRID
+1 },
612 {"new-volume-script", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
613 {"volno-file", VOLNO_FILE_OPTION
, N_("FILE"), 0,
614 N_("use/update the volume number in FILE"), GRID
+1 },
619 N_("Device blocking:"), GRID
},
621 {"blocking-factor", 'b', N_("BLOCKS"), 0,
622 N_("BLOCKS x 512 bytes per record"), GRID
+1 },
623 {"record-size", RECORD_SIZE_OPTION
, N_("NUMBER"), 0,
624 N_("NUMBER of bytes per record, multiple of 512"), GRID
+1 },
625 {"ignore-zeros", 'i', 0, 0,
626 N_("ignore zeroed blocks in archive (means EOF)"), GRID
+1 },
627 {"read-full-records", 'B', 0, 0,
628 N_("reblock as we read (for 4.2BSD pipes)"), GRID
+1 },
633 N_("Archive format selection:"), GRID
},
635 {"format", 'H', N_("FORMAT"), 0,
636 N_("create archive of the given format"), GRID
+1 },
638 {NULL
, 0, NULL
, 0, N_("FORMAT is one of the following:"), GRID
+2 },
639 {" v7", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("old V7 tar format"),
641 {" oldgnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
642 N_("GNU format as per tar <= 1.12"), GRID
+3 },
643 {" gnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
644 N_("GNU tar 1.13.x format"), GRID
+3 },
645 {" ustar", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
646 N_("POSIX 1003.1-1988 (ustar) format"), GRID
+3 },
647 {" pax", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
648 N_("POSIX 1003.1-2001 (pax) format"), GRID
+3 },
649 {" posix", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("same as pax"), GRID
+3 },
651 {"old-archive", OLD_ARCHIVE_OPTION
, 0, 0, /* FIXME */
652 N_("same as --format=v7"), GRID
+8 },
653 {"portability", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
654 {"posix", POSIX_OPTION
, 0, 0,
655 N_("same as --format=posix"), GRID
+8 },
656 {"pax-option", PAX_OPTION
, N_("keyword[[:]=value][,keyword[[:]=value]]..."), 0,
657 N_("control pax keywords"), GRID
+8 },
658 {"label", 'V', N_("TEXT"), 0,
659 N_("create archive with volume name TEXT; at list/extract time, use TEXT as a globbing pattern for volume name"), GRID
+8 },
664 N_("Compression options:"), GRID
},
665 {"auto-compress", 'a', 0, 0,
666 N_("use archive suffix to determine the compression program"), GRID
+1 },
667 {"no-auto-compress", NO_AUTO_COMPRESS_OPTION
, 0, 0,
668 N_("do not use archive suffix to determine the compression program"),
670 {"use-compress-program", 'I', N_("PROG"), 0,
671 N_("filter through PROG (must accept -d)"), GRID
+1 },
672 /* Note: docstrings for the options below are generated by tar_help_filter */
673 {"bzip2", 'j', 0, 0, NULL
, GRID
+1 },
674 {"gzip", 'z', 0, 0, NULL
, GRID
+1 },
675 {"gunzip", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
676 {"ungzip", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
677 {"compress", 'Z', 0, 0, NULL
, GRID
+1 },
678 {"uncompress", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
679 {"lzip", LZIP_OPTION
, 0, 0, NULL
, GRID
+1 },
680 {"lzma", LZMA_OPTION
, 0, 0, NULL
, GRID
+1 },
681 {"lzop", LZOP_OPTION
, 0, 0, NULL
, GRID
+1 },
682 {"xz", 'J', 0, 0, NULL
, GRID
+1 },
687 N_("Local file selection:"), GRID
},
689 {"add-file", ARGP_KEY_ARG
, N_("FILE"), 0,
690 N_("add given FILE to the archive (useful if its name starts with a dash)"), GRID
+1 },
691 {"directory", 'C', N_("DIR"), 0,
692 N_("change to directory DIR"), GRID
+1 },
693 {"files-from", 'T', N_("FILE"), 0,
694 N_("get names to extract or create from FILE"), GRID
+1 },
695 {"null", NULL_OPTION
, 0, 0,
696 N_("-T reads null-terminated names, disable -C"), GRID
+1 },
697 {"no-null", NO_NULL_OPTION
, 0, 0,
698 N_("disable the effect of the previous --null option"), GRID
+1 },
699 {"unquote", UNQUOTE_OPTION
, 0, 0,
700 N_("unquote filenames read with -T (default)"), GRID
+1 },
701 {"no-unquote", NO_UNQUOTE_OPTION
, 0, 0,
702 N_("do not unquote filenames read with -T"), GRID
+1 },
703 {"exclude", EXCLUDE_OPTION
, N_("PATTERN"), 0,
704 N_("exclude files, given as a PATTERN"), GRID
+1 },
705 {"exclude-from", 'X', N_("FILE"), 0,
706 N_("exclude patterns listed in FILE"), GRID
+1 },
707 {"exclude-caches", EXCLUDE_CACHES_OPTION
, 0, 0,
708 N_("exclude contents of directories containing CACHEDIR.TAG, "
709 "except for the tag file itself"), GRID
+1 },
710 {"exclude-caches-under", EXCLUDE_CACHES_UNDER_OPTION
, 0, 0,
711 N_("exclude everything under directories containing CACHEDIR.TAG"),
713 {"exclude-caches-all", EXCLUDE_CACHES_ALL_OPTION
, 0, 0,
714 N_("exclude directories containing CACHEDIR.TAG"), GRID
+1 },
715 {"exclude-tag", EXCLUDE_TAG_OPTION
, N_("FILE"), 0,
716 N_("exclude contents of directories containing FILE, except"
717 " for FILE itself"), GRID
+1 },
718 {"exclude-tag-under", EXCLUDE_TAG_UNDER_OPTION
, N_("FILE"), 0,
719 N_("exclude everything under directories containing FILE"), GRID
+1 },
720 {"exclude-tag-all", EXCLUDE_TAG_ALL_OPTION
, N_("FILE"), 0,
721 N_("exclude directories containing FILE"), GRID
+1 },
722 {"exclude-vcs", EXCLUDE_VCS_OPTION
, NULL
, 0,
723 N_("exclude version control system directories"), GRID
+1 },
724 {"exclude-backups", EXCLUDE_BACKUPS_OPTION
, NULL
, 0,
725 N_("exclude backup and lock files"), GRID
+1 },
726 {"no-recursion", NO_RECURSION_OPTION
, 0, 0,
727 N_("avoid descending automatically in directories"), GRID
+1 },
728 {"one-file-system", ONE_FILE_SYSTEM_OPTION
, 0, 0,
729 N_("stay in local file system when creating archive"), GRID
+1 },
730 {"recursion", RECURSION_OPTION
, 0, 0,
731 N_("recurse into directories (default)"), GRID
+1 },
732 {"absolute-names", 'P', 0, 0,
733 N_("don't strip leading '/'s from file names"), GRID
+1 },
734 {"dereference", 'h', 0, 0,
735 N_("follow symlinks; archive and dump the files they point to"), GRID
+1 },
736 {"hard-dereference", HARD_DEREFERENCE_OPTION
, 0, 0,
737 N_("follow hard links; archive and dump the files they refer to"), GRID
+1 },
738 {"starting-file", 'K', N_("MEMBER-NAME"), 0,
739 N_("begin at member MEMBER-NAME when reading the archive"), GRID
+1 },
740 {"newer", 'N', N_("DATE-OR-FILE"), 0,
741 N_("only store files newer than DATE-OR-FILE"), GRID
+1 },
742 {"after-date", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
743 {"newer-mtime", NEWER_MTIME_OPTION
, N_("DATE"), 0,
744 N_("compare date and time when data changed only"), GRID
+1 },
745 {"backup", BACKUP_OPTION
, N_("CONTROL"), OPTION_ARG_OPTIONAL
,
746 N_("backup before removal, choose version CONTROL"), GRID
+1 },
747 {"suffix", SUFFIX_OPTION
, N_("STRING"), 0,
748 N_("backup before removal, override usual suffix ('~' unless overridden by environment variable SIMPLE_BACKUP_SUFFIX)"), GRID
+1 },
753 N_("File name transformations:"), GRID
},
754 {"strip-components", STRIP_COMPONENTS_OPTION
, N_("NUMBER"), 0,
755 N_("strip NUMBER leading components from file names on extraction"),
757 {"transform", TRANSFORM_OPTION
, N_("EXPRESSION"), 0,
758 N_("use sed replace EXPRESSION to transform file names"), GRID
+1 },
759 {"xform", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
764 N_("File name matching options (affect both exclude and include patterns):"),
766 {"ignore-case", IGNORE_CASE_OPTION
, 0, 0,
767 N_("ignore case"), GRID
+1 },
768 {"anchored", ANCHORED_OPTION
, 0, 0,
769 N_("patterns match file name start"), GRID
+1 },
770 {"no-anchored", NO_ANCHORED_OPTION
, 0, 0,
771 N_("patterns match after any '/' (default for exclusion)"), GRID
+1 },
772 {"no-ignore-case", NO_IGNORE_CASE_OPTION
, 0, 0,
773 N_("case sensitive matching (default)"), GRID
+1 },
774 {"wildcards", WILDCARDS_OPTION
, 0, 0,
775 N_("use wildcards (default for exclusion)"), GRID
+1 },
776 {"no-wildcards", NO_WILDCARDS_OPTION
, 0, 0,
777 N_("verbatim string matching"), GRID
+1 },
778 {"no-wildcards-match-slash", NO_WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
779 N_("wildcards do not match '/'"), GRID
+1 },
780 {"wildcards-match-slash", WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
781 N_("wildcards match '/' (default for exclusion)"), GRID
+1 },
786 N_("Informative output:"), GRID
},
788 {"verbose", 'v', 0, 0,
789 N_("verbosely list files processed"), GRID
+1 },
790 {"warning", WARNING_OPTION
, N_("KEYWORD"), 0,
791 N_("warning control"), GRID
+1 },
792 {"checkpoint", CHECKPOINT_OPTION
, N_("NUMBER"), OPTION_ARG_OPTIONAL
,
793 N_("display progress messages every NUMBERth record (default 10)"),
795 {"checkpoint-action", CHECKPOINT_ACTION_OPTION
, N_("ACTION"), 0,
796 N_("execute ACTION on each checkpoint"),
798 {"check-links", 'l', 0, 0,
799 N_("print a message if not all links are dumped"), GRID
+1 },
800 {"totals", TOTALS_OPTION
, N_("SIGNAL"), OPTION_ARG_OPTIONAL
,
801 N_("print total bytes after processing the archive; "
802 "with an argument - print total bytes when this SIGNAL is delivered; "
803 "Allowed signals are: SIGHUP, SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; "
804 "the names without SIG prefix are also accepted"), GRID
+1 },
805 {"utc", UTC_OPTION
, 0, 0,
806 N_("print file modification times in UTC"), GRID
+1 },
807 {"full-time", FULL_TIME_OPTION
, 0, 0,
808 N_("print file time to its full resolution"), GRID
+1 },
809 {"index-file", INDEX_FILE_OPTION
, N_("FILE"), 0,
810 N_("send verbose output to FILE"), GRID
+1 },
811 {"block-number", 'R', 0, 0,
812 N_("show block number within archive with each message"), GRID
+1 },
813 {"interactive", 'w', 0, 0,
814 N_("ask for confirmation for every action"), GRID
+1 },
815 {"confirmation", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
816 {"show-defaults", SHOW_DEFAULTS_OPTION
, 0, 0,
817 N_("show tar defaults"), GRID
+1 },
818 {"show-snapshot-field-ranges", SHOW_SNAPSHOT_FIELD_RANGES_OPTION
, 0, 0,
819 N_("show valid ranges for snapshot-file fields"), GRID
+1 },
820 {"show-omitted-dirs", SHOW_OMITTED_DIRS_OPTION
, 0, 0,
821 N_("when listing or extracting, list each directory that does not match search criteria"), GRID
+1 },
822 {"show-transformed-names", SHOW_TRANSFORMED_NAMES_OPTION
, 0, 0,
823 N_("show file or archive names after transformation"),
825 {"show-stored-names", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
826 {"quoting-style", QUOTING_STYLE_OPTION
, N_("STYLE"), 0,
827 N_("set name quoting style; see below for valid STYLE values"), GRID
+1 },
828 {"quote-chars", QUOTE_CHARS_OPTION
, N_("STRING"), 0,
829 N_("additionally quote characters from STRING"), GRID
+1 },
830 {"no-quote-chars", NO_QUOTE_CHARS_OPTION
, N_("STRING"), 0,
831 N_("disable quoting for characters from STRING"), GRID
+1 },
836 N_("Compatibility options:"), GRID
},
839 N_("when creating, same as --old-archive; when extracting, same as --no-same-owner"), GRID
+1 },
844 N_("Other options:"), GRID
},
846 {"restrict", RESTRICT_OPTION
, 0, 0,
847 N_("disable use of some potentially harmful options"), -1 },
853 static char const *const atime_preserve_args
[] =
855 "replace", "system", NULL
858 static enum atime_preserve
const atime_preserve_types
[] =
860 replace_atime_preserve
, system_atime_preserve
863 /* Make sure atime_preserve_types has as much entries as atime_preserve_args
864 (minus 1 for NULL guard) */
865 ARGMATCH_VERIFY (atime_preserve_args
, atime_preserve_types
);
867 /* Wildcard matching settings */
870 default_wildcards
, /* For exclusion == enable_wildcards,
871 for inclusion == disable_wildcards */
876 struct tar_args
/* Variables used during option parsing */
878 struct textual_date
*textual_date
; /* Keeps the arguments to --newer-mtime
879 and/or --date option if they are
881 enum wildcards wildcards
; /* Wildcard settings (--wildcards/
883 int matching_flags
; /* exclude_fnmatch options */
884 int include_anchored
; /* Pattern anchoring options used for
886 bool o_option
; /* True if -o option was given */
887 bool pax_option
; /* True if --pax-option was given */
888 char const *backup_suffix_string
; /* --suffix option argument */
889 char const *version_control_string
; /* --backup option argument */
890 bool input_files
; /* True if some input files where given */
891 int compress_autodetect
; /* True if compression autodetection should
892 be attempted when creating archives */
896 #define MAKE_EXCL_OPTIONS(args) \
897 ((((args)->wildcards != disable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
898 | (args)->matching_flags \
901 #define MAKE_INCL_OPTIONS(args) \
902 ((((args)->wildcards == enable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
903 | (args)->include_anchored \
904 | (args)->matching_flags \
907 static char const * const vcs_file_table
[] = {
939 static char const * const backup_file_table
[] = {
947 add_exclude_array (char const * const * fv
, int opts
)
951 for (i
= 0; fv
[i
]; i
++)
952 add_exclude (excluded
, fv
[i
], opts
);
957 format_default_settings (void)
960 "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s"
965 archive_format_string (DEFAULT_ARCHIVE_FORMAT
),
966 DEFAULT_ARCHIVE
, DEFAULT_BLOCKING
,
967 quoting_style_args
[DEFAULT_QUOTING_STYLE
],
977 set_subcommand_option (enum subcommand subcommand
)
979 if (subcommand_option
!= UNKNOWN_SUBCOMMAND
980 && subcommand_option
!= subcommand
)
982 _("You may not specify more than one '-Acdtrux', '--delete' or '--test-label' option")));
984 subcommand_option
= subcommand
;
988 set_use_compress_program_option (const char *string
)
990 if (use_compress_program_option
991 && strcmp (use_compress_program_option
, string
) != 0)
992 USAGE_ERROR ((0, 0, _("Conflicting compression options")));
994 use_compress_program_option
= string
;
1000 compute_duration ();
1001 print_total_stats ();
1002 #ifndef HAVE_SIGACTION
1003 signal (signo
, sigstat
);
1008 stat_on_signal (int signo
)
1010 #ifdef HAVE_SIGACTION
1012 # define SA_RESTART 0
1014 struct sigaction act
;
1015 act
.sa_handler
= sigstat
;
1016 sigemptyset (&act
.sa_mask
);
1017 act
.sa_flags
= SA_RESTART
;
1018 sigaction (signo
, &act
, NULL
);
1020 signal (signo
, sigstat
);
1025 set_stat_signal (const char *name
)
1027 static struct sigtab
1031 } const sigtab
[] = {
1032 { "SIGUSR1", SIGUSR1
},
1033 { "USR1", SIGUSR1
},
1034 { "SIGUSR2", SIGUSR2
},
1035 { "USR2", SIGUSR2
},
1036 { "SIGHUP", SIGHUP
},
1038 { "SIGINT", SIGINT
},
1040 { "SIGQUIT", SIGQUIT
},
1043 struct sigtab
const *p
;
1045 for (p
= sigtab
; p
< sigtab
+ sizeof (sigtab
) / sizeof (sigtab
[0]); p
++)
1046 if (strcmp (p
->name
, name
) == 0)
1048 stat_on_signal (p
->signo
);
1051 FATAL_ERROR ((0, 0, _("Unknown signal name: %s"), name
));
1057 struct textual_date
*next
;
1064 get_date_or_file (struct tar_args
*args
, const char *option
,
1065 const char *str
, struct timespec
*ts
)
1067 if (FILE_SYSTEM_PREFIX_LEN (str
) != 0
1072 if (stat (str
, &st
) != 0)
1075 USAGE_ERROR ((0, 0, _("Date sample file not found")));
1077 *ts
= get_stat_mtime (&st
);
1081 if (! parse_datetime (ts
, str
, NULL
))
1083 WARN ((0, 0, _("Substituting %s for unknown date format %s"),
1084 tartime (*ts
, false), quote (str
)));
1090 struct textual_date
*p
= xmalloc (sizeof (*p
));
1093 p
->date
= xstrdup (str
);
1094 p
->next
= args
->textual_date
;
1095 args
->textual_date
= p
;
1102 report_textual_dates (struct tar_args
*args
)
1104 struct textual_date
*p
;
1105 for (p
= args
->textual_date
; p
; )
1107 struct textual_date
*next
= p
->next
;
1110 char const *treated_as
= tartime (p
->ts
, true);
1111 if (strcmp (p
->date
, treated_as
) != 0)
1112 WARN ((0, 0, _("Option %s: Treating date '%s' as %s"),
1113 p
->option
, p
->date
, treated_as
));
1122 static bool files_from_option
; /* When set, tar will not refuse to create
1125 /* Default density numbers for [0-9][lmh] device specifications */
1127 #if defined DEVICE_PREFIX && !defined DENSITY_LETTER
1128 # ifndef LOW_DENSITY_NUM
1129 # define LOW_DENSITY_NUM 0
1132 # ifndef MID_DENSITY_NUM
1133 # define MID_DENSITY_NUM 8
1136 # ifndef HIGH_DENSITY_NUM
1137 # define HIGH_DENSITY_NUM 16
1143 tar_help_filter (int key
, const char *text
, void *input
)
1155 s
= xasprintf (_("filter the archive through %s"), BZIP2_PROGRAM
);
1159 s
= xasprintf (_("filter the archive through %s"), GZIP_PROGRAM
);
1163 s
= xasprintf (_("filter the archive through %s"), COMPRESS_PROGRAM
);
1167 s
= xasprintf (_("filter the archive through %s"), LZIP_PROGRAM
);
1171 s
= xasprintf (_("filter the archive through %s"), LZMA_PROGRAM
);
1175 s
= xasprintf (_("filter the archive through %s"), LZOP_PROGRAM
);
1178 s
= xasprintf (_("filter the archive through %s"), XZ_PROGRAM
);
1181 case ARGP_KEY_HELP_EXTRA
:
1185 obstack_init (&stk
);
1186 tstr
= _("Valid arguments for the --quoting-style option are:");
1187 obstack_grow (&stk
, tstr
, strlen (tstr
));
1188 obstack_grow (&stk
, "\n\n", 2);
1189 tar_list_quoting_styles (&stk
, " ");
1190 tstr
= _("\n*This* tar defaults to:\n");
1191 obstack_grow (&stk
, tstr
, strlen (tstr
));
1192 s
= format_default_settings ();
1193 obstack_grow (&stk
, s
, strlen (s
));
1194 obstack_1grow (&stk
, '\n');
1195 obstack_1grow (&stk
, 0);
1196 s
= xstrdup (obstack_finish (&stk
));
1197 obstack_free (&stk
, NULL
);
1204 expand_pax_option (struct tar_args
*targs
, const char *arg
)
1209 obstack_init (&stk
);
1212 size_t seglen
= strcspn (arg
, ",");
1213 char *p
= memchr (arg
, '=', seglen
);
1216 size_t len
= p
- arg
+ 1;
1217 obstack_grow (&stk
, arg
, len
);
1219 for (++p
; *p
&& isspace ((unsigned char) *p
); p
++)
1221 if (*p
== '{' && p
[len
-1] == '}')
1224 char *tmp
= xmalloc (len
);
1225 memcpy (tmp
, p
+ 1, len
-2);
1227 if (get_date_or_file (targs
, "--pax-option", tmp
, &ts
) == 0)
1229 char buf
[TIMESPEC_STRSIZE_BOUND
];
1230 char const *s
= code_timespec (ts
, buf
);
1231 obstack_grow (&stk
, s
, strlen (s
));
1234 obstack_grow (&stk
, p
, len
);
1238 obstack_grow (&stk
, p
, len
);
1241 obstack_grow (&stk
, arg
, seglen
);
1246 obstack_1grow (&stk
, *arg
);
1250 obstack_1grow (&stk
, 0);
1251 res
= xstrdup (obstack_finish (&stk
));
1252 obstack_free (&stk
, NULL
);
1258 parse_owner_group (char *arg
, uintmax_t field_max
, char const **name_option
)
1260 uintmax_t u
= UINTMAX_MAX
;
1262 char const *name
= 0;
1263 char const *invalid_num
= 0;
1264 char *colon
= strchr (arg
, ':');
1268 char const *num
= colon
+ 1;
1272 if (num
&& (! (xstrtoumax (num
, &end
, 10, &u
, "") == LONGINT_OK
1273 && u
<= field_max
)))
1279 switch ('0' <= *arg
&& *arg
<= '9'
1280 ? xstrtoumax (arg
, &end
, 10, &u1
, "")
1288 if (u1
<= field_max
)
1294 case LONGINT_OVERFLOW
:
1301 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (invalid_num
),
1302 _("Invalid owner or group ID")));
1304 *name_option
= name
;
1308 #define TAR_SIZE_SUFFIXES "bBcGgkKMmPTtw"
1310 /* Either NL or NUL, as decided by the --null option. */
1311 static char filename_terminator
;
1314 parse_opt (int key
, char *arg
, struct argp_state
*state
)
1316 struct tar_args
*args
= state
->input
;
1321 /* File name or non-parsed option, because of ARGP_IN_ORDER */
1322 name_add_name (arg
, MAKE_INCL_OPTIONS (args
));
1323 args
->input_files
= true;
1327 set_subcommand_option (CAT_SUBCOMMAND
);
1331 args
->compress_autodetect
= true;
1334 case NO_AUTO_COMPRESS_OPTION
:
1335 args
->compress_autodetect
= false;
1341 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1342 && u
== (blocking_factor
= u
)
1343 && 0 < blocking_factor
1344 && u
== (record_size
= u
* BLOCKSIZE
) / BLOCKSIZE
))
1345 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1346 _("Invalid blocking factor")));
1351 /* Try to reblock input records. For reading 4.2BSD pipes. */
1353 /* It would surely make sense to exchange -B and -R, but it seems
1354 that -B has been used for a long while in Sun tar and most
1355 BSD-derived systems. This is a consequence of the block/record
1356 terminology confusion. */
1358 read_full_records_option
= true;
1362 set_subcommand_option (CREATE_SUBCOMMAND
);
1370 set_subcommand_option (DIFF_SUBCOMMAND
);
1374 if (archive_names
== allocated_archive_names
)
1375 archive_name_array
= x2nrealloc (archive_name_array
,
1376 &allocated_archive_names
,
1377 sizeof (archive_name_array
[0]));
1379 archive_name_array
[archive_names
++] = arg
;
1383 /* Since -F is only useful with -M, make it implied. Run this
1384 script at the end of each tape. */
1386 info_script_option
= arg
;
1387 multi_volume_option
= true;
1390 case FULL_TIME_OPTION
:
1391 full_time_option
= true;
1395 listed_incremental_option
= arg
;
1396 after_date_option
= true;
1400 /* We are making an incremental dump (FIXME: are we?); save
1401 directories at the beginning of the archive, and include in each
1402 directory its contents. */
1404 incremental_option
= true;
1408 /* Follow symbolic links. */
1409 dereference_option
= true;
1412 case HARD_DEREFERENCE_OPTION
:
1413 hard_dereference_option
= true;
1417 /* Ignore zero blocks (eofs). This can't be the default,
1418 because Unix tar writes two blocks of zeros, then pads out
1419 the record with garbage. */
1421 ignore_zeros_option
= true;
1425 set_use_compress_program_option (BZIP2_PROGRAM
);
1429 set_use_compress_program_option (XZ_PROGRAM
);
1433 /* Don't replace existing files. */
1434 old_files_option
= KEEP_OLD_FILES
;
1438 starting_file_option
= true;
1439 addname (arg
, 0, true, NULL
);
1442 case ONE_FILE_SYSTEM_OPTION
:
1443 /* When dumping directories, don't dump files/subdirectories
1444 that are on other filesystems. */
1445 one_file_system_option
= true;
1448 case ONE_TOP_LEVEL_OPTION
:
1449 one_top_level_option
= true;
1453 check_links_option
= 1;
1461 if (xstrtoumax (arg
, &p
, 10, &u
, TAR_SIZE_SUFFIXES
) != LONGINT_OK
)
1462 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1463 _("Invalid tape length")));
1464 if (p
> arg
&& !strchr (TAR_SIZE_SUFFIXES
, p
[-1]))
1465 tape_length_option
= 1024 * (tarlong
) u
;
1467 tape_length_option
= (tarlong
) u
;
1468 multi_volume_option
= true;
1475 incremental_level
= strtoul (arg
, &p
, 10);
1477 USAGE_ERROR ((0, 0, _("Invalid incremental level value")));
1482 set_use_compress_program_option (LZIP_PROGRAM
);
1486 set_use_compress_program_option (LZMA_PROGRAM
);
1490 set_use_compress_program_option (LZOP_PROGRAM
);
1494 touch_option
= true;
1498 /* Make multivolume archive: when we can't write any more into
1499 the archive, re-open it, and continue writing. */
1501 multi_volume_option
= true;
1505 get_date_or_file (args
, "--mtime", arg
, &mtime_option
);
1506 set_mtime_option
= true;
1513 case NO_SEEK_OPTION
:
1518 after_date_option
= true;
1521 case NEWER_MTIME_OPTION
:
1522 if (NEWER_OPTION_INITIALIZED (newer_mtime_option
))
1523 USAGE_ERROR ((0, 0, _("More than one threshold date")));
1524 get_date_or_file (args
,
1525 key
== NEWER_MTIME_OPTION
? "--newer-mtime"
1526 : "--after-date", arg
, &newer_mtime_option
);
1530 args
->o_option
= true;
1534 to_stdout_option
= true;
1538 same_permissions_option
= true;
1542 absolute_names_option
= true;
1546 set_subcommand_option (APPEND_SUBCOMMAND
);
1550 /* Print block numbers for debugging bad tar archives. */
1552 /* It would surely make sense to exchange -B and -R, but it seems
1553 that -B has been used for a long while in Sun tar and most
1554 BSD-derived systems. This is a consequence of the block/record
1555 terminology confusion. */
1557 block_number_option
= true;
1561 /* Names to extract are sorted. */
1563 same_order_option
= true;
1567 sparse_option
= true;
1570 case SKIP_OLD_FILES_OPTION
:
1571 old_files_option
= SKIP_OLD_FILES
;
1574 case SPARSE_VERSION_OPTION
:
1575 sparse_option
= true;
1578 tar_sparse_major
= strtoul (arg
, &p
, 10);
1582 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1583 tar_sparse_minor
= strtoul (p
+ 1, &p
, 10);
1585 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1591 set_subcommand_option (LIST_SUBCOMMAND
);
1595 case TEST_LABEL_OPTION
:
1596 set_subcommand_option (TEST_LABEL_SUBCOMMAND
);
1600 name_add_file (arg
, filename_terminator
);
1601 /* Indicate we've been given -T option. This is for backward
1602 compatibility only, so that `tar cfT archive /dev/null will
1604 files_from_option
= true;
1608 set_subcommand_option (UPDATE_SUBCOMMAND
);
1612 old_files_option
= UNLINK_FIRST_OLD_FILES
;
1621 warning_option
|= WARN_VERBOSE_WARNINGS
;
1625 volume_label_option
= arg
;
1629 interactive_option
= true;
1633 verify_option
= true;
1637 set_subcommand_option (EXTRACT_SUBCOMMAND
);
1641 if (add_exclude_file (add_exclude
, excluded
, arg
,
1642 MAKE_EXCL_OPTIONS (args
), '\n')
1646 FATAL_ERROR ((0, e
, "%s", quotearg_colon (arg
)));
1651 set_use_compress_program_option (GZIP_PROGRAM
);
1655 set_use_compress_program_option (COMPRESS_PROGRAM
);
1658 case ANCHORED_OPTION
:
1659 args
->matching_flags
|= EXCLUDE_ANCHORED
;
1662 case ATIME_PRESERVE_OPTION
:
1663 atime_preserve_option
=
1665 ? XARGMATCH ("--atime-preserve", arg
,
1666 atime_preserve_args
, atime_preserve_types
)
1667 : replace_atime_preserve
);
1668 if (! O_NOATIME
&& atime_preserve_option
== system_atime_preserve
)
1670 _("--atime-preserve='system' is not supported"
1671 " on this platform")));
1674 case CHECK_DEVICE_OPTION
:
1675 check_device_option
= true;
1678 case NO_CHECK_DEVICE_OPTION
:
1679 check_device_option
= false;
1682 case CHECKPOINT_OPTION
:
1689 checkpoint_compile_action (".");
1692 checkpoint_option
= strtoul (arg
, &p
, 0);
1695 _("--checkpoint value is not an integer")));
1698 checkpoint_option
= DEFAULT_CHECKPOINT
;
1701 case CHECKPOINT_ACTION_OPTION
:
1702 checkpoint_compile_action (arg
);
1706 backup_option
= true;
1708 args
->version_control_string
= arg
;
1711 case DELAY_DIRECTORY_RESTORE_OPTION
:
1712 delay_directory_restore_option
= true;
1715 case NO_DELAY_DIRECTORY_RESTORE_OPTION
:
1716 delay_directory_restore_option
= false;
1720 set_subcommand_option (DELETE_SUBCOMMAND
);
1723 case EXCLUDE_BACKUPS_OPTION
:
1724 add_exclude_array (backup_file_table
, EXCLUDE_WILDCARDS
);
1727 case EXCLUDE_OPTION
:
1728 add_exclude (excluded
, arg
, MAKE_EXCL_OPTIONS (args
));
1731 case EXCLUDE_CACHES_OPTION
:
1732 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_contents
,
1736 case EXCLUDE_CACHES_UNDER_OPTION
:
1737 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_under
,
1741 case EXCLUDE_CACHES_ALL_OPTION
:
1742 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_all
,
1746 case EXCLUDE_TAG_OPTION
:
1747 add_exclusion_tag (arg
, exclusion_tag_contents
, NULL
);
1750 case EXCLUDE_TAG_UNDER_OPTION
:
1751 add_exclusion_tag (arg
, exclusion_tag_under
, NULL
);
1754 case EXCLUDE_TAG_ALL_OPTION
:
1755 add_exclusion_tag (arg
, exclusion_tag_all
, NULL
);
1758 case EXCLUDE_VCS_OPTION
:
1759 add_exclude_array (vcs_file_table
, 0);
1762 case FORCE_LOCAL_OPTION
:
1763 force_local_option
= true;
1767 set_archive_format (arg
);
1770 case INDEX_FILE_OPTION
:
1771 index_file_name
= arg
;
1774 case IGNORE_CASE_OPTION
:
1775 args
->matching_flags
|= FNM_CASEFOLD
;
1778 case IGNORE_COMMAND_ERROR_OPTION
:
1779 ignore_command_error_option
= true;
1782 case IGNORE_FAILED_READ_OPTION
:
1783 ignore_failed_read_option
= true;
1786 case KEEP_DIRECTORY_SYMLINK_OPTION
:
1787 keep_directory_symlink_option
= true;
1790 case KEEP_NEWER_FILES_OPTION
:
1791 old_files_option
= KEEP_NEWER_FILES
;
1796 uintmax_t u
= parse_owner_group (arg
, TYPE_MAXIMUM (gid_t
),
1797 &group_name_option
);
1798 if (u
== UINTMAX_MAX
)
1801 if (group_name_option
)
1802 gname_to_gid (group_name_option
, &group_option
);
1810 mode_option
= mode_compile (arg
);
1812 FATAL_ERROR ((0, 0, _("Invalid mode given on option")));
1813 initial_umask
= umask (0);
1814 umask (initial_umask
);
1817 case NO_ANCHORED_OPTION
:
1818 args
->include_anchored
= 0; /* Clear the default for comman line args */
1819 args
->matching_flags
&= ~ EXCLUDE_ANCHORED
;
1822 case NO_IGNORE_CASE_OPTION
:
1823 args
->matching_flags
&= ~ FNM_CASEFOLD
;
1826 case NO_IGNORE_COMMAND_ERROR_OPTION
:
1827 ignore_command_error_option
= false;
1830 case NO_OVERWRITE_DIR_OPTION
:
1831 old_files_option
= NO_OVERWRITE_DIR_OLD_FILES
;
1834 case NO_QUOTE_CHARS_OPTION
:
1836 set_char_quoting (NULL
, *arg
, 0);
1839 case NO_WILDCARDS_OPTION
:
1840 args
->wildcards
= disable_wildcards
;
1843 case NO_WILDCARDS_MATCH_SLASH_OPTION
:
1844 args
->matching_flags
|= FNM_FILE_NAME
;
1848 filename_terminator
= '\0';
1851 case NO_NULL_OPTION
:
1852 filename_terminator
= '\n';
1855 case NUMERIC_OWNER_OPTION
:
1856 numeric_owner_option
= true;
1859 case OCCURRENCE_OPTION
:
1861 occurrence_option
= 1;
1865 if (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
)
1866 occurrence_option
= u
;
1868 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1869 _("Invalid number")));
1873 case OLD_ARCHIVE_OPTION
:
1874 set_archive_format ("v7");
1877 case OVERWRITE_DIR_OPTION
:
1878 old_files_option
= DEFAULT_OLD_FILES
;
1881 case OVERWRITE_OPTION
:
1882 old_files_option
= OVERWRITE_OLD_FILES
;
1887 uintmax_t u
= parse_owner_group (arg
, TYPE_MAXIMUM (uid_t
),
1888 &owner_name_option
);
1889 if (u
== UINTMAX_MAX
)
1892 if (owner_name_option
)
1893 uname_to_uid (owner_name_option
, &owner_option
);
1900 case QUOTE_CHARS_OPTION
:
1902 set_char_quoting (NULL
, *arg
, 1);
1905 case QUOTING_STYLE_OPTION
:
1906 tar_set_quoting_style (arg
);
1911 char *tmp
= expand_pax_option (args
, arg
);
1912 args
->pax_option
= true;
1913 xheader_set_option (tmp
);
1919 set_archive_format ("posix");
1922 case PRESERVE_OPTION
:
1923 /* FIXME: What it is good for? */
1924 same_permissions_option
= true;
1925 same_order_option
= true;
1926 WARN ((0, 0, _("The --preserve option is deprecated, "
1927 "use --preserve-permissions --preserve-order instead")));
1930 case RECORD_SIZE_OPTION
:
1934 if (! (xstrtoumax (arg
, NULL
, 10, &u
, TAR_SIZE_SUFFIXES
) == LONGINT_OK
1935 && u
== (size_t) u
))
1936 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1937 _("Invalid record size")));
1939 if (record_size
% BLOCKSIZE
!= 0)
1940 USAGE_ERROR ((0, 0, _("Record size must be a multiple of %d."),
1942 blocking_factor
= record_size
/ BLOCKSIZE
;
1946 case RECURSIVE_UNLINK_OPTION
:
1947 recursive_unlink_option
= true;
1950 case REMOVE_FILES_OPTION
:
1951 remove_files_option
= true;
1954 case RESTRICT_OPTION
:
1955 restrict_option
= true;
1958 case RMT_COMMAND_OPTION
:
1962 case RSH_COMMAND_OPTION
:
1963 rsh_command_option
= arg
;
1966 case SHOW_DEFAULTS_OPTION
:
1968 char *s
= format_default_settings ();
1975 case SHOW_SNAPSHOT_FIELD_RANGES_OPTION
:
1976 show_snapshot_field_ranges ();
1980 case STRIP_COMPONENTS_OPTION
:
1983 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1984 && u
== (size_t) u
))
1985 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1986 _("Invalid number of elements")));
1987 strip_name_components
= u
;
1991 case SHOW_OMITTED_DIRS_OPTION
:
1992 show_omitted_dirs_option
= true;
1995 case SHOW_TRANSFORMED_NAMES_OPTION
:
1996 show_transformed_names_option
= true;
2000 backup_option
= true;
2001 args
->backup_suffix_string
= arg
;
2004 case TO_COMMAND_OPTION
:
2005 if (to_command_option
)
2006 USAGE_ERROR ((0, 0, _("Only one --to-command option allowed")));
2007 to_command_option
= arg
;
2012 set_stat_signal (arg
);
2014 totals_option
= true;
2017 case TRANSFORM_OPTION
:
2018 set_transform_expr (arg
);
2022 set_use_compress_program_option (arg
);
2025 case VOLNO_FILE_OPTION
:
2026 volno_file_option
= arg
;
2029 case WILDCARDS_OPTION
:
2030 args
->wildcards
= enable_wildcards
;
2033 case WILDCARDS_MATCH_SLASH_OPTION
:
2034 args
->matching_flags
&= ~ FNM_FILE_NAME
;
2037 case NO_RECURSION_OPTION
:
2038 recursion_option
= 0;
2041 case NO_SAME_OWNER_OPTION
:
2042 same_owner_option
= -1;
2045 case NO_SAME_PERMISSIONS_OPTION
:
2046 same_permissions_option
= -1;
2050 set_archive_format ("posix");
2054 case NO_ACLS_OPTION
:
2058 case SELINUX_CONTEXT_OPTION
:
2059 set_archive_format ("posix");
2060 selinux_context_option
= 1;
2063 case NO_SELINUX_CONTEXT_OPTION
:
2064 selinux_context_option
= -1;
2068 set_archive_format ("posix");
2072 case NO_XATTR_OPTION
:
2078 xattrs_mask_add (arg
, (key
== XATTR_INCLUDE
));
2081 case RECURSION_OPTION
:
2082 recursion_option
= FNM_LEADING_DIR
;
2085 case SAME_OWNER_OPTION
:
2086 same_owner_option
= 1;
2089 case UNQUOTE_OPTION
:
2090 unquote_option
= true;
2093 case NO_UNQUOTE_OPTION
:
2094 unquote_option
= false;
2097 case WARNING_OPTION
:
2098 set_warning_option (arg
);
2110 #ifdef DEVICE_PREFIX
2112 int device
= key
- '0';
2114 static char buf
[sizeof DEVICE_PREFIX
+ 10];
2118 argp_error (state
, _("Malformed density argument: %s"), quote (arg
));
2120 strcpy (buf
, DEVICE_PREFIX
);
2121 cursor
= buf
+ strlen (buf
);
2123 #ifdef DENSITY_LETTER
2125 sprintf (cursor
, "%d%c", device
, arg
[0]);
2127 #else /* not DENSITY_LETTER */
2132 device
+= LOW_DENSITY_NUM
;
2136 device
+= MID_DENSITY_NUM
;
2140 device
+= HIGH_DENSITY_NUM
;
2144 argp_error (state
, _("Unknown density: '%c'"), arg
[0]);
2146 sprintf (cursor
, "%d", device
);
2148 #endif /* not DENSITY_LETTER */
2150 if (archive_names
== allocated_archive_names
)
2151 archive_name_array
= x2nrealloc (archive_name_array
,
2152 &allocated_archive_names
,
2153 sizeof (archive_name_array
[0]));
2154 archive_name_array
[archive_names
++] = xstrdup (buf
);
2158 #else /* not DEVICE_PREFIX */
2161 _("Options '-[0-7][lmh]' not supported by *this* tar"));
2163 #endif /* not DEVICE_PREFIX */
2166 return ARGP_ERR_UNKNOWN
;
2171 static struct argp argp
= {
2184 argp_help (&argp
, stderr
, ARGP_HELP_SEE
, (char*) program_name
);
2189 /* Parse the options for tar. */
2191 static struct argp_option
*
2192 find_argp_option (struct argp_option
*o
, int letter
)
2199 && o
->doc
== NULL
); o
++)
2200 if (o
->key
== letter
)
2205 static const char *tar_authors
[] = {
2211 /* Subcommand classes */
2212 #define SUBCL_READ 0x01 /* subcommand reads from the archive */
2213 #define SUBCL_WRITE 0x02 /* subcommand writes to the archive */
2214 #define SUBCL_UPDATE 0x04 /* subcommand updates existing archive */
2215 #define SUBCL_TEST 0x08 /* subcommand tests archive header or meta-info */
2216 #define SUBCL_OCCUR 0x10 /* subcommand allows the use of the occurrence
2219 static int subcommand_class
[] = {
2220 /* UNKNOWN_SUBCOMMAND */ 0,
2221 /* APPEND_SUBCOMMAND */ SUBCL_WRITE
|SUBCL_UPDATE
,
2222 /* CAT_SUBCOMMAND */ SUBCL_WRITE
,
2223 /* CREATE_SUBCOMMAND */ SUBCL_WRITE
,
2224 /* DELETE_SUBCOMMAND */ SUBCL_WRITE
|SUBCL_UPDATE
|SUBCL_OCCUR
,
2225 /* DIFF_SUBCOMMAND */ SUBCL_READ
|SUBCL_OCCUR
,
2226 /* EXTRACT_SUBCOMMAND */ SUBCL_READ
|SUBCL_OCCUR
,
2227 /* LIST_SUBCOMMAND */ SUBCL_READ
|SUBCL_OCCUR
,
2228 /* UPDATE_SUBCOMMAND */ SUBCL_WRITE
|SUBCL_UPDATE
,
2229 /* TEST_LABEL_SUBCOMMAND */ SUBCL_TEST
2232 /* Return t if the subcommand_option is in class(es) f */
2233 #define IS_SUBCOMMAND_CLASS(f) (subcommand_class[subcommand_option] & (f))
2235 static struct tar_args args
;
2238 decode_options (int argc
, char **argv
)
2242 argp_version_setup ("tar", tar_authors
);
2244 /* Set some default option values. */
2245 args
.textual_date
= NULL
;
2246 args
.wildcards
= default_wildcards
;
2247 args
.matching_flags
= 0;
2248 args
.include_anchored
= EXCLUDE_ANCHORED
;
2249 args
.o_option
= false;
2250 args
.pax_option
= false;
2251 args
.backup_suffix_string
= getenv ("SIMPLE_BACKUP_SUFFIX");
2252 args
.version_control_string
= 0;
2253 args
.input_files
= false;
2254 args
.compress_autodetect
= false;
2256 subcommand_option
= UNKNOWN_SUBCOMMAND
;
2257 archive_format
= DEFAULT_FORMAT
;
2258 blocking_factor
= DEFAULT_BLOCKING
;
2259 record_size
= DEFAULT_BLOCKING
* BLOCKSIZE
;
2260 excluded
= new_exclude ();
2261 newer_mtime_option
.tv_sec
= TYPE_MINIMUM (time_t);
2262 newer_mtime_option
.tv_nsec
= -1;
2263 recursion_option
= FNM_LEADING_DIR
;
2264 unquote_option
= true;
2265 tar_sparse_major
= 1;
2266 tar_sparse_minor
= 0;
2268 owner_option
= -1; owner_name_option
= NULL
;
2269 group_option
= -1; group_name_option
= NULL
;
2271 check_device_option
= true;
2273 incremental_level
= -1;
2277 /* Convert old-style tar call by exploding option element and rearranging
2278 options accordingly. */
2280 if (argc
> 1 && argv
[1][0] != '-')
2282 int new_argc
; /* argc value for rearranged arguments */
2283 char **new_argv
; /* argv value for rearranged arguments */
2284 char *const *in
; /* cursor into original argv */
2285 char **out
; /* cursor into rearranged argv */
2286 const char *letter
; /* cursor into old option letters */
2287 char buffer
[3]; /* constructed option buffer */
2289 /* Initialize a constructed option. */
2294 /* Allocate a new argument array, and copy program name in it. */
2296 new_argc
= argc
- 1 + strlen (argv
[1]);
2297 new_argv
= xmalloc ((new_argc
+ 1) * sizeof (char *));
2302 /* Copy each old letter option as a separate option, and have the
2303 corresponding argument moved next to it. */
2305 for (letter
= *in
++; *letter
; letter
++)
2307 struct argp_option
*opt
;
2309 buffer
[1] = *letter
;
2310 *out
++ = xstrdup (buffer
);
2311 opt
= find_argp_option (options
, *letter
);
2312 if (opt
&& opt
->arg
)
2314 if (in
< argv
+ argc
)
2317 USAGE_ERROR ((0, 0, _("Old option '%c' requires an argument."),
2322 /* Copy all remaining options. */
2324 while (in
< argv
+ argc
)
2328 /* Replace the old option list by the new one. */
2334 /* Parse all options and non-options as they appear. */
2336 prepend_default_options (getenv ("TAR_OPTIONS"), &argc
, &argv
);
2338 if (argp_parse (&argp
, argc
, argv
, ARGP_IN_ORDER
, &idx
, &args
))
2339 exit (TAREXIT_FAILURE
);
2341 /* Special handling for 'o' option:
2343 GNU tar used to say "output old format".
2344 UNIX98 tar says don't chown files after extracting (we use
2345 "--no-same-owner" for this).
2347 The old GNU tar semantics is retained when used with --create
2348 option, otherwise UNIX98 semantics is assumed */
2352 if (subcommand_option
== CREATE_SUBCOMMAND
)
2354 /* GNU Tar <= 1.13 compatibility */
2355 set_archive_format ("v7");
2359 /* UNIX98 compatibility */
2360 same_owner_option
= -1;
2364 /* Handle operands after any "--" argument. */
2365 for (; idx
< argc
; idx
++)
2367 name_add_name (argv
[idx
], MAKE_INCL_OPTIONS (&args
));
2368 args
.input_files
= true;
2371 /* Warn about implicit use of the wildcards in command line arguments.
2373 warn_regex_usage
= args
.wildcards
== default_wildcards
;
2375 /* Derive option values and check option consistency. */
2377 if (archive_format
== DEFAULT_FORMAT
)
2379 if (args
.pax_option
)
2380 archive_format
= POSIX_FORMAT
;
2382 archive_format
= DEFAULT_ARCHIVE_FORMAT
;
2385 if ((volume_label_option
&& subcommand_option
== CREATE_SUBCOMMAND
)
2386 || incremental_option
2387 || multi_volume_option
2389 assert_format (FORMAT_MASK (OLDGNU_FORMAT
)
2390 | FORMAT_MASK (GNU_FORMAT
)
2391 | FORMAT_MASK (POSIX_FORMAT
));
2393 if (occurrence_option
)
2395 if (!args
.input_files
)
2397 _("--occurrence is meaningless without a file list")));
2398 if (!IS_SUBCOMMAND_CLASS (SUBCL_OCCUR
))
2400 _("--occurrence cannot be used with %s"),
2401 subcommand_string (subcommand_option
)));
2404 if (one_top_level_option
&& absolute_names_option
)
2405 USAGE_ERROR ((0, 0, _("--one-top-level cannot be used with --absolute-names")));
2407 if (archive_names
== 0)
2409 /* If no archive file name given, try TAPE from the environment, or
2410 else, DEFAULT_ARCHIVE from the configuration process. */
2413 archive_name_array
[0] = getenv ("TAPE");
2414 if (! archive_name_array
[0])
2415 archive_name_array
[0] = DEFAULT_ARCHIVE
;
2418 /* Allow multiple archives only with '-M'. */
2420 if (archive_names
> 1 && !multi_volume_option
)
2422 _("Multiple archive files require '-M' option")));
2424 if (listed_incremental_option
2425 && NEWER_OPTION_INITIALIZED (newer_mtime_option
))
2427 _("Cannot combine --listed-incremental with --newer")));
2428 if (incremental_level
!= -1 && !listed_incremental_option
)
2430 _("--level is meaningless without --listed-incremental")));
2432 if (volume_label_option
)
2434 if (archive_format
== GNU_FORMAT
|| archive_format
== OLDGNU_FORMAT
)
2436 size_t volume_label_max_len
=
2437 (sizeof current_header
->header
.name
2438 - 1 /* for trailing '\0' */
2439 - (multi_volume_option
2440 ? (sizeof " Volume "
2441 - 1 /* for null at end of " Volume " */
2442 + INT_STRLEN_BOUND (int) /* for volume number */
2443 - 1 /* for sign, as 0 <= volno */)
2445 if (volume_label_max_len
< strlen (volume_label_option
))
2447 ngettext ("%s: Volume label is too long (limit is %lu byte)",
2448 "%s: Volume label is too long (limit is %lu bytes)",
2449 volume_label_max_len
),
2450 quotearg_colon (volume_label_option
),
2451 (unsigned long) volume_label_max_len
));
2454 Label length in PAX format is limited by the volume size. */
2459 if (multi_volume_option
)
2460 USAGE_ERROR ((0, 0, _("Cannot verify multi-volume archives")));
2461 if (use_compress_program_option
)
2462 USAGE_ERROR ((0, 0, _("Cannot verify compressed archives")));
2463 if (!IS_SUBCOMMAND_CLASS (SUBCL_WRITE
))
2464 USAGE_ERROR ((0, 0, _("--verify cannot be used with %s"),
2465 subcommand_string (subcommand_option
)));
2468 if (use_compress_program_option
)
2470 if (multi_volume_option
)
2471 USAGE_ERROR ((0, 0, _("Cannot use multi-volume compressed archives")));
2472 if (IS_SUBCOMMAND_CLASS (SUBCL_UPDATE
))
2473 USAGE_ERROR ((0, 0, _("Cannot update compressed archives")));
2474 if (subcommand_option
== CAT_SUBCOMMAND
)
2475 USAGE_ERROR ((0, 0, _("Cannot concatenate compressed archives")));
2478 /* It is no harm to use --pax-option on non-pax archives in archive
2479 reading mode. It may even be useful, since it allows to override
2480 file attributes from tar headers. Therefore I allow such usage.
2483 && archive_format
!= POSIX_FORMAT
2484 && !IS_SUBCOMMAND_CLASS (SUBCL_READ
))
2485 USAGE_ERROR ((0, 0, _("--pax-option can be used only on POSIX archives")));
2487 /* star creates non-POSIX typed archives with xattr support, so allow the
2488 extra headers when reading */
2489 if ((acls_option
> 0)
2490 && archive_format
!= POSIX_FORMAT
2491 && !IS_SUBCOMMAND_CLASS (SUBCL_READ
))
2492 USAGE_ERROR ((0, 0, _("--acls can be used only on POSIX archives")));
2494 if ((selinux_context_option
> 0)
2495 && archive_format
!= POSIX_FORMAT
2496 && !IS_SUBCOMMAND_CLASS (SUBCL_READ
))
2497 USAGE_ERROR ((0, 0, _("--selinux can be used only on POSIX archives")));
2499 if ((xattrs_option
> 0)
2500 && archive_format
!= POSIX_FORMAT
2501 && !IS_SUBCOMMAND_CLASS (SUBCL_READ
))
2502 USAGE_ERROR ((0, 0, _("--xattrs can be used only on POSIX archives")));
2504 if ((starting_file_option
|| same_order_option
)
2505 && !IS_SUBCOMMAND_CLASS (SUBCL_READ
))
2507 _("--%s option cannot be used with %s"),
2508 starting_file_option
? "starting-file" : "same-order",
2509 subcommand_string (subcommand_option
)));
2511 /* If ready to unlink hierarchies, so we are for simpler files. */
2512 if (recursive_unlink_option
)
2513 old_files_option
= UNLINK_FIRST_OLD_FILES
;
2515 /* Flags for accessing files to be read from or copied into. POSIX says
2516 O_NONBLOCK has unspecified effect on most types of files, but in
2517 practice it never harms and sometimes helps. */
2519 int base_open_flags
=
2520 (O_BINARY
| O_CLOEXEC
| O_NOCTTY
| O_NONBLOCK
2521 | (dereference_option
? 0 : O_NOFOLLOW
)
2522 | (atime_preserve_option
== system_atime_preserve
? O_NOATIME
: 0));
2523 open_read_flags
= O_RDONLY
| base_open_flags
;
2524 open_searchdir_flags
= O_SEARCH
| O_DIRECTORY
| base_open_flags
;
2526 fstatat_flags
= dereference_option
? 0 : AT_SYMLINK_NOFOLLOW
;
2528 if (subcommand_option
== TEST_LABEL_SUBCOMMAND
)
2530 /* --test-label is silent if the user has specified the label name to
2532 if (!args
.input_files
)
2535 else if (utc_option
)
2538 if (tape_length_option
&& tape_length_option
< record_size
)
2539 USAGE_ERROR ((0, 0, _("Volume length cannot be less than record size")));
2541 if (same_order_option
&& listed_incremental_option
)
2542 USAGE_ERROR ((0, 0, _("--preserve-order is not compatible with "
2543 "--listed-incremental")));
2545 /* Forbid using -c with no input files whatsoever. Check that '-f -',
2546 explicit or implied, is used correctly. */
2548 switch (subcommand_option
)
2550 case CREATE_SUBCOMMAND
:
2551 if (!args
.input_files
&& !files_from_option
)
2553 _("Cowardly refusing to create an empty archive")));
2554 if (args
.compress_autodetect
&& archive_names
2555 && strcmp (archive_name_array
[0], "-"))
2556 set_compression_program_by_suffix (archive_name_array
[0],
2557 use_compress_program_option
);
2560 case EXTRACT_SUBCOMMAND
:
2561 case LIST_SUBCOMMAND
:
2562 case DIFF_SUBCOMMAND
:
2563 case TEST_LABEL_SUBCOMMAND
:
2564 for (archive_name_cursor
= archive_name_array
;
2565 archive_name_cursor
< archive_name_array
+ archive_names
;
2566 archive_name_cursor
++)
2567 if (!strcmp (*archive_name_cursor
, "-"))
2568 request_stdin ("-f");
2571 case CAT_SUBCOMMAND
:
2572 case UPDATE_SUBCOMMAND
:
2573 case APPEND_SUBCOMMAND
:
2574 for (archive_name_cursor
= archive_name_array
;
2575 archive_name_cursor
< archive_name_array
+ archive_names
;
2576 archive_name_cursor
++)
2577 if (!strcmp (*archive_name_cursor
, "-"))
2579 _("Options '-Aru' are incompatible with '-f -'")));
2585 /* Initialize stdlis */
2586 if (index_file_name
)
2588 stdlis
= fopen (index_file_name
, "w");
2590 open_fatal (index_file_name
);
2593 stdlis
= to_stdout_option
? stderr
: stdout
;
2595 archive_name_cursor
= archive_name_array
;
2597 /* Prepare for generating backup names. */
2599 if (args
.backup_suffix_string
)
2600 simple_backup_suffix
= xstrdup (args
.backup_suffix_string
);
2604 backup_type
= xget_version ("--backup", args
.version_control_string
);
2605 /* No backup is needed either if explicitely disabled or if
2606 the extracted files are not being written to disk. */
2607 if (backup_type
== no_backups
|| EXTRACT_OVER_PIPE
)
2608 backup_option
= false;
2611 checkpoint_finish_compile ();
2613 report_textual_dates (&args
);
2617 more_options (int argc
, char **argv
)
2620 if (argp_parse (&argp
, argc
, argv
, ARGP_IN_ORDER
,
2622 exit (TAREXIT_FAILURE
);
2627 /* Main routine for tar. */
2629 main (int argc
, char **argv
)
2632 set_program_name (argv
[0]);
2634 setlocale (LC_ALL
, "");
2635 bindtextdomain (PACKAGE
, LOCALEDIR
);
2636 textdomain (PACKAGE
);
2638 exit_failure
= TAREXIT_FAILURE
;
2639 exit_status
= TAREXIT_SUCCESS
;
2640 error_hook
= checkpoint_flush_actions
;
2642 filename_terminator
= '\n';
2643 set_quoting_style (0, DEFAULT_QUOTING_STYLE
);
2645 /* Make sure we have first three descriptors available */
2648 /* Pre-allocate a few structures. */
2650 allocated_archive_names
= 10;
2651 archive_name_array
=
2652 xmalloc (sizeof (const char *) * allocated_archive_names
);
2655 /* System V fork+wait does not work if SIGCHLD is ignored. */
2656 signal (SIGCHLD
, SIG_DFL
);
2658 /* Try to disable the ability to unlink a directory. */
2659 priv_set_remove_linkdir ();
2661 /* Decode options. */
2663 decode_options (argc
, argv
);
2667 /* Main command execution. */
2669 if (volno_file_option
)
2670 init_volume_number ();
2672 switch (subcommand_option
)
2674 case UNKNOWN_SUBCOMMAND
:
2676 _("You must specify one of the '-Acdtrux', '--delete' or '--test-label' options")));
2678 case CAT_SUBCOMMAND
:
2679 case UPDATE_SUBCOMMAND
:
2680 case APPEND_SUBCOMMAND
:
2684 case DELETE_SUBCOMMAND
:
2685 delete_archive_members ();
2688 case CREATE_SUBCOMMAND
:
2692 case EXTRACT_SUBCOMMAND
:
2694 read_and (extract_archive
);
2696 /* FIXME: should extract_finish () even if an ordinary signal is
2702 case LIST_SUBCOMMAND
:
2703 read_and (list_archive
);
2706 case DIFF_SUBCOMMAND
:
2708 read_and (diff_archive
);
2711 case TEST_LABEL_SUBCOMMAND
:
2712 test_archive_label ();
2715 checkpoint_finish ();
2718 print_total_stats ();
2720 if (check_links_option
)
2723 if (volno_file_option
)
2724 closeout_volume_number ();
2726 /* Dispose of allocated memory, and return. */
2728 free (archive_name_array
);
2729 xattrs_clear_setup ();
2732 if (exit_status
== TAREXIT_FAILURE
)
2733 error (0, 0, _("Exiting with failure status due to previous errors"));
2735 if (stdlis
== stdout
)
2737 else if (ferror (stderr
) || fclose (stderr
) != 0)
2738 set_exit_status (TAREXIT_FAILURE
);
2744 tar_stat_init (struct tar_stat_info
*st
)
2746 memset (st
, 0, sizeof (*st
));
2749 /* Close the stream or file descriptor associated with ST, and remove
2750 all traces of it from ST. Return true if successful, false (with a
2751 diagnostic) otherwise. */
2753 tar_stat_close (struct tar_stat_info
*st
)
2755 int status
= (st
->dirstream
? closedir (st
->dirstream
)
2756 : 0 < st
->fd
? close (st
->fd
)
2765 close_diag (st
->orig_file_name
);
2771 tar_stat_destroy (struct tar_stat_info
*st
)
2773 tar_stat_close (st
);
2774 xheader_xattr_free (st
->xattr_map
, st
->xattr_map_size
);
2775 free (st
->orig_file_name
);
2776 free (st
->file_name
);
2777 free (st
->link_name
);
2780 free (st
->cntx_name
);
2781 free (st
->acls_a_ptr
);
2782 free (st
->acls_d_ptr
);
2783 free (st
->sparse_map
);
2785 xheader_destroy (&st
->xhdr
);
2786 memset (st
, 0, sizeof (*st
));
2789 /* Format mask for all available formats that support nanosecond
2790 timestamp resolution. */
2791 #define NS_PRECISION_FORMAT_MASK FORMAT_MASK (POSIX_FORMAT)
2793 /* Same as timespec_cmp, but ignore nanoseconds if current archive
2794 format does not provide sufficient resolution. */
2796 tar_timespec_cmp (struct timespec a
, struct timespec b
)
2798 if (!(FORMAT_MASK (current_format
) & NS_PRECISION_FORMAT_MASK
))
2799 a
.tv_nsec
= b
.tv_nsec
= 0;
2800 return timespec_cmp (a
, b
);
2803 /* Set tar exit status to VAL, unless it is already indicating
2804 a more serious condition. This relies on the fact that the
2805 values of TAREXIT_ constants are ranged by severity. */
2807 set_exit_status (int val
)
2809 if (val
> exit_status
)