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
, N_("DIR"), OPTION_ARG_OPTIONAL
,
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;
1450 one_top_level_dir
= arg
;
1454 check_links_option
= 1;
1462 if (xstrtoumax (arg
, &p
, 10, &u
, TAR_SIZE_SUFFIXES
) != LONGINT_OK
)
1463 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1464 _("Invalid tape length")));
1465 if (p
> arg
&& !strchr (TAR_SIZE_SUFFIXES
, p
[-1]))
1466 tape_length_option
= 1024 * (tarlong
) u
;
1468 tape_length_option
= (tarlong
) u
;
1469 multi_volume_option
= true;
1476 incremental_level
= strtoul (arg
, &p
, 10);
1478 USAGE_ERROR ((0, 0, _("Invalid incremental level value")));
1483 set_use_compress_program_option (LZIP_PROGRAM
);
1487 set_use_compress_program_option (LZMA_PROGRAM
);
1491 set_use_compress_program_option (LZOP_PROGRAM
);
1495 touch_option
= true;
1499 /* Make multivolume archive: when we can't write any more into
1500 the archive, re-open it, and continue writing. */
1502 multi_volume_option
= true;
1506 get_date_or_file (args
, "--mtime", arg
, &mtime_option
);
1507 set_mtime_option
= true;
1514 case NO_SEEK_OPTION
:
1519 after_date_option
= true;
1522 case NEWER_MTIME_OPTION
:
1523 if (NEWER_OPTION_INITIALIZED (newer_mtime_option
))
1524 USAGE_ERROR ((0, 0, _("More than one threshold date")));
1525 get_date_or_file (args
,
1526 key
== NEWER_MTIME_OPTION
? "--newer-mtime"
1527 : "--after-date", arg
, &newer_mtime_option
);
1531 args
->o_option
= true;
1535 to_stdout_option
= true;
1539 same_permissions_option
= true;
1543 absolute_names_option
= true;
1547 set_subcommand_option (APPEND_SUBCOMMAND
);
1551 /* Print block numbers for debugging bad tar archives. */
1553 /* It would surely make sense to exchange -B and -R, but it seems
1554 that -B has been used for a long while in Sun tar and most
1555 BSD-derived systems. This is a consequence of the block/record
1556 terminology confusion. */
1558 block_number_option
= true;
1562 /* Names to extract are sorted. */
1564 same_order_option
= true;
1568 sparse_option
= true;
1571 case SKIP_OLD_FILES_OPTION
:
1572 old_files_option
= SKIP_OLD_FILES
;
1575 case SPARSE_VERSION_OPTION
:
1576 sparse_option
= true;
1579 tar_sparse_major
= strtoul (arg
, &p
, 10);
1583 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1584 tar_sparse_minor
= strtoul (p
+ 1, &p
, 10);
1586 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1592 set_subcommand_option (LIST_SUBCOMMAND
);
1596 case TEST_LABEL_OPTION
:
1597 set_subcommand_option (TEST_LABEL_SUBCOMMAND
);
1601 name_add_file (arg
, filename_terminator
);
1602 /* Indicate we've been given -T option. This is for backward
1603 compatibility only, so that `tar cfT archive /dev/null will
1605 files_from_option
= true;
1609 set_subcommand_option (UPDATE_SUBCOMMAND
);
1613 old_files_option
= UNLINK_FIRST_OLD_FILES
;
1622 warning_option
|= WARN_VERBOSE_WARNINGS
;
1626 volume_label_option
= arg
;
1630 interactive_option
= true;
1634 verify_option
= true;
1638 set_subcommand_option (EXTRACT_SUBCOMMAND
);
1642 if (add_exclude_file (add_exclude
, excluded
, arg
,
1643 MAKE_EXCL_OPTIONS (args
), '\n')
1647 FATAL_ERROR ((0, e
, "%s", quotearg_colon (arg
)));
1652 set_use_compress_program_option (GZIP_PROGRAM
);
1656 set_use_compress_program_option (COMPRESS_PROGRAM
);
1659 case ANCHORED_OPTION
:
1660 args
->matching_flags
|= EXCLUDE_ANCHORED
;
1663 case ATIME_PRESERVE_OPTION
:
1664 atime_preserve_option
=
1666 ? XARGMATCH ("--atime-preserve", arg
,
1667 atime_preserve_args
, atime_preserve_types
)
1668 : replace_atime_preserve
);
1669 if (! O_NOATIME
&& atime_preserve_option
== system_atime_preserve
)
1671 _("--atime-preserve='system' is not supported"
1672 " on this platform")));
1675 case CHECK_DEVICE_OPTION
:
1676 check_device_option
= true;
1679 case NO_CHECK_DEVICE_OPTION
:
1680 check_device_option
= false;
1683 case CHECKPOINT_OPTION
:
1690 checkpoint_compile_action (".");
1693 checkpoint_option
= strtoul (arg
, &p
, 0);
1696 _("--checkpoint value is not an integer")));
1699 checkpoint_option
= DEFAULT_CHECKPOINT
;
1702 case CHECKPOINT_ACTION_OPTION
:
1703 checkpoint_compile_action (arg
);
1707 backup_option
= true;
1709 args
->version_control_string
= arg
;
1712 case DELAY_DIRECTORY_RESTORE_OPTION
:
1713 delay_directory_restore_option
= true;
1716 case NO_DELAY_DIRECTORY_RESTORE_OPTION
:
1717 delay_directory_restore_option
= false;
1721 set_subcommand_option (DELETE_SUBCOMMAND
);
1724 case EXCLUDE_BACKUPS_OPTION
:
1725 add_exclude_array (backup_file_table
, EXCLUDE_WILDCARDS
);
1728 case EXCLUDE_OPTION
:
1729 add_exclude (excluded
, arg
, MAKE_EXCL_OPTIONS (args
));
1732 case EXCLUDE_CACHES_OPTION
:
1733 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_contents
,
1737 case EXCLUDE_CACHES_UNDER_OPTION
:
1738 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_under
,
1742 case EXCLUDE_CACHES_ALL_OPTION
:
1743 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_all
,
1747 case EXCLUDE_TAG_OPTION
:
1748 add_exclusion_tag (arg
, exclusion_tag_contents
, NULL
);
1751 case EXCLUDE_TAG_UNDER_OPTION
:
1752 add_exclusion_tag (arg
, exclusion_tag_under
, NULL
);
1755 case EXCLUDE_TAG_ALL_OPTION
:
1756 add_exclusion_tag (arg
, exclusion_tag_all
, NULL
);
1759 case EXCLUDE_VCS_OPTION
:
1760 add_exclude_array (vcs_file_table
, 0);
1763 case FORCE_LOCAL_OPTION
:
1764 force_local_option
= true;
1768 set_archive_format (arg
);
1771 case INDEX_FILE_OPTION
:
1772 index_file_name
= arg
;
1775 case IGNORE_CASE_OPTION
:
1776 args
->matching_flags
|= FNM_CASEFOLD
;
1779 case IGNORE_COMMAND_ERROR_OPTION
:
1780 ignore_command_error_option
= true;
1783 case IGNORE_FAILED_READ_OPTION
:
1784 ignore_failed_read_option
= true;
1787 case KEEP_DIRECTORY_SYMLINK_OPTION
:
1788 keep_directory_symlink_option
= true;
1791 case KEEP_NEWER_FILES_OPTION
:
1792 old_files_option
= KEEP_NEWER_FILES
;
1797 uintmax_t u
= parse_owner_group (arg
, TYPE_MAXIMUM (gid_t
),
1798 &group_name_option
);
1799 if (u
== UINTMAX_MAX
)
1802 if (group_name_option
)
1803 gname_to_gid (group_name_option
, &group_option
);
1811 mode_option
= mode_compile (arg
);
1813 FATAL_ERROR ((0, 0, _("Invalid mode given on option")));
1814 initial_umask
= umask (0);
1815 umask (initial_umask
);
1818 case NO_ANCHORED_OPTION
:
1819 args
->include_anchored
= 0; /* Clear the default for comman line args */
1820 args
->matching_flags
&= ~ EXCLUDE_ANCHORED
;
1823 case NO_IGNORE_CASE_OPTION
:
1824 args
->matching_flags
&= ~ FNM_CASEFOLD
;
1827 case NO_IGNORE_COMMAND_ERROR_OPTION
:
1828 ignore_command_error_option
= false;
1831 case NO_OVERWRITE_DIR_OPTION
:
1832 old_files_option
= NO_OVERWRITE_DIR_OLD_FILES
;
1835 case NO_QUOTE_CHARS_OPTION
:
1837 set_char_quoting (NULL
, *arg
, 0);
1840 case NO_WILDCARDS_OPTION
:
1841 args
->wildcards
= disable_wildcards
;
1844 case NO_WILDCARDS_MATCH_SLASH_OPTION
:
1845 args
->matching_flags
|= FNM_FILE_NAME
;
1849 filename_terminator
= '\0';
1852 case NO_NULL_OPTION
:
1853 filename_terminator
= '\n';
1856 case NUMERIC_OWNER_OPTION
:
1857 numeric_owner_option
= true;
1860 case OCCURRENCE_OPTION
:
1862 occurrence_option
= 1;
1866 if (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
)
1867 occurrence_option
= u
;
1869 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1870 _("Invalid number")));
1874 case OLD_ARCHIVE_OPTION
:
1875 set_archive_format ("v7");
1878 case OVERWRITE_DIR_OPTION
:
1879 old_files_option
= DEFAULT_OLD_FILES
;
1882 case OVERWRITE_OPTION
:
1883 old_files_option
= OVERWRITE_OLD_FILES
;
1888 uintmax_t u
= parse_owner_group (arg
, TYPE_MAXIMUM (uid_t
),
1889 &owner_name_option
);
1890 if (u
== UINTMAX_MAX
)
1893 if (owner_name_option
)
1894 uname_to_uid (owner_name_option
, &owner_option
);
1901 case QUOTE_CHARS_OPTION
:
1903 set_char_quoting (NULL
, *arg
, 1);
1906 case QUOTING_STYLE_OPTION
:
1907 tar_set_quoting_style (arg
);
1912 char *tmp
= expand_pax_option (args
, arg
);
1913 args
->pax_option
= true;
1914 xheader_set_option (tmp
);
1920 set_archive_format ("posix");
1923 case PRESERVE_OPTION
:
1924 /* FIXME: What it is good for? */
1925 same_permissions_option
= true;
1926 same_order_option
= true;
1927 WARN ((0, 0, _("The --preserve option is deprecated, "
1928 "use --preserve-permissions --preserve-order instead")));
1931 case RECORD_SIZE_OPTION
:
1935 if (! (xstrtoumax (arg
, NULL
, 10, &u
, TAR_SIZE_SUFFIXES
) == LONGINT_OK
1936 && u
== (size_t) u
))
1937 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1938 _("Invalid record size")));
1940 if (record_size
% BLOCKSIZE
!= 0)
1941 USAGE_ERROR ((0, 0, _("Record size must be a multiple of %d."),
1943 blocking_factor
= record_size
/ BLOCKSIZE
;
1947 case RECURSIVE_UNLINK_OPTION
:
1948 recursive_unlink_option
= true;
1951 case REMOVE_FILES_OPTION
:
1952 remove_files_option
= true;
1955 case RESTRICT_OPTION
:
1956 restrict_option
= true;
1959 case RMT_COMMAND_OPTION
:
1963 case RSH_COMMAND_OPTION
:
1964 rsh_command_option
= arg
;
1967 case SHOW_DEFAULTS_OPTION
:
1969 char *s
= format_default_settings ();
1976 case SHOW_SNAPSHOT_FIELD_RANGES_OPTION
:
1977 show_snapshot_field_ranges ();
1981 case STRIP_COMPONENTS_OPTION
:
1984 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1985 && u
== (size_t) u
))
1986 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1987 _("Invalid number of elements")));
1988 strip_name_components
= u
;
1992 case SHOW_OMITTED_DIRS_OPTION
:
1993 show_omitted_dirs_option
= true;
1996 case SHOW_TRANSFORMED_NAMES_OPTION
:
1997 show_transformed_names_option
= true;
2001 backup_option
= true;
2002 args
->backup_suffix_string
= arg
;
2005 case TO_COMMAND_OPTION
:
2006 if (to_command_option
)
2007 USAGE_ERROR ((0, 0, _("Only one --to-command option allowed")));
2008 to_command_option
= arg
;
2013 set_stat_signal (arg
);
2015 totals_option
= true;
2018 case TRANSFORM_OPTION
:
2019 set_transform_expr (arg
);
2023 set_use_compress_program_option (arg
);
2026 case VOLNO_FILE_OPTION
:
2027 volno_file_option
= arg
;
2030 case WILDCARDS_OPTION
:
2031 args
->wildcards
= enable_wildcards
;
2034 case WILDCARDS_MATCH_SLASH_OPTION
:
2035 args
->matching_flags
&= ~ FNM_FILE_NAME
;
2038 case NO_RECURSION_OPTION
:
2039 recursion_option
= 0;
2042 case NO_SAME_OWNER_OPTION
:
2043 same_owner_option
= -1;
2046 case NO_SAME_PERMISSIONS_OPTION
:
2047 same_permissions_option
= -1;
2051 set_archive_format ("posix");
2055 case NO_ACLS_OPTION
:
2059 case SELINUX_CONTEXT_OPTION
:
2060 set_archive_format ("posix");
2061 selinux_context_option
= 1;
2064 case NO_SELINUX_CONTEXT_OPTION
:
2065 selinux_context_option
= -1;
2069 set_archive_format ("posix");
2073 case NO_XATTR_OPTION
:
2079 xattrs_mask_add (arg
, (key
== XATTR_INCLUDE
));
2082 case RECURSION_OPTION
:
2083 recursion_option
= FNM_LEADING_DIR
;
2086 case SAME_OWNER_OPTION
:
2087 same_owner_option
= 1;
2090 case UNQUOTE_OPTION
:
2091 unquote_option
= true;
2094 case NO_UNQUOTE_OPTION
:
2095 unquote_option
= false;
2098 case WARNING_OPTION
:
2099 set_warning_option (arg
);
2111 #ifdef DEVICE_PREFIX
2113 int device
= key
- '0';
2115 static char buf
[sizeof DEVICE_PREFIX
+ 10];
2119 argp_error (state
, _("Malformed density argument: %s"), quote (arg
));
2121 strcpy (buf
, DEVICE_PREFIX
);
2122 cursor
= buf
+ strlen (buf
);
2124 #ifdef DENSITY_LETTER
2126 sprintf (cursor
, "%d%c", device
, arg
[0]);
2128 #else /* not DENSITY_LETTER */
2133 device
+= LOW_DENSITY_NUM
;
2137 device
+= MID_DENSITY_NUM
;
2141 device
+= HIGH_DENSITY_NUM
;
2145 argp_error (state
, _("Unknown density: '%c'"), arg
[0]);
2147 sprintf (cursor
, "%d", device
);
2149 #endif /* not DENSITY_LETTER */
2151 if (archive_names
== allocated_archive_names
)
2152 archive_name_array
= x2nrealloc (archive_name_array
,
2153 &allocated_archive_names
,
2154 sizeof (archive_name_array
[0]));
2155 archive_name_array
[archive_names
++] = xstrdup (buf
);
2159 #else /* not DEVICE_PREFIX */
2162 _("Options '-[0-7][lmh]' not supported by *this* tar"));
2164 #endif /* not DEVICE_PREFIX */
2167 return ARGP_ERR_UNKNOWN
;
2172 static struct argp argp
= {
2185 argp_help (&argp
, stderr
, ARGP_HELP_SEE
, (char*) program_name
);
2190 /* Parse the options for tar. */
2192 static struct argp_option
*
2193 find_argp_option (struct argp_option
*o
, int letter
)
2200 && o
->doc
== NULL
); o
++)
2201 if (o
->key
== letter
)
2206 static const char *tar_authors
[] = {
2212 /* Subcommand classes */
2213 #define SUBCL_READ 0x01 /* subcommand reads from the archive */
2214 #define SUBCL_WRITE 0x02 /* subcommand writes to the archive */
2215 #define SUBCL_UPDATE 0x04 /* subcommand updates existing archive */
2216 #define SUBCL_TEST 0x08 /* subcommand tests archive header or meta-info */
2217 #define SUBCL_OCCUR 0x10 /* subcommand allows the use of the occurrence
2220 static int subcommand_class
[] = {
2221 /* UNKNOWN_SUBCOMMAND */ 0,
2222 /* APPEND_SUBCOMMAND */ SUBCL_WRITE
|SUBCL_UPDATE
,
2223 /* CAT_SUBCOMMAND */ SUBCL_WRITE
,
2224 /* CREATE_SUBCOMMAND */ SUBCL_WRITE
,
2225 /* DELETE_SUBCOMMAND */ SUBCL_WRITE
|SUBCL_UPDATE
|SUBCL_OCCUR
,
2226 /* DIFF_SUBCOMMAND */ SUBCL_READ
|SUBCL_OCCUR
,
2227 /* EXTRACT_SUBCOMMAND */ SUBCL_READ
|SUBCL_OCCUR
,
2228 /* LIST_SUBCOMMAND */ SUBCL_READ
|SUBCL_OCCUR
,
2229 /* UPDATE_SUBCOMMAND */ SUBCL_WRITE
|SUBCL_UPDATE
,
2230 /* TEST_LABEL_SUBCOMMAND */ SUBCL_TEST
2233 /* Return t if the subcommand_option is in class(es) f */
2234 #define IS_SUBCOMMAND_CLASS(f) (subcommand_class[subcommand_option] & (f))
2236 static struct tar_args args
;
2239 decode_options (int argc
, char **argv
)
2243 argp_version_setup ("tar", tar_authors
);
2245 /* Set some default option values. */
2246 args
.textual_date
= NULL
;
2247 args
.wildcards
= default_wildcards
;
2248 args
.matching_flags
= 0;
2249 args
.include_anchored
= EXCLUDE_ANCHORED
;
2250 args
.o_option
= false;
2251 args
.pax_option
= false;
2252 args
.backup_suffix_string
= getenv ("SIMPLE_BACKUP_SUFFIX");
2253 args
.version_control_string
= 0;
2254 args
.input_files
= false;
2255 args
.compress_autodetect
= false;
2257 subcommand_option
= UNKNOWN_SUBCOMMAND
;
2258 archive_format
= DEFAULT_FORMAT
;
2259 blocking_factor
= DEFAULT_BLOCKING
;
2260 record_size
= DEFAULT_BLOCKING
* BLOCKSIZE
;
2261 excluded
= new_exclude ();
2262 newer_mtime_option
.tv_sec
= TYPE_MINIMUM (time_t);
2263 newer_mtime_option
.tv_nsec
= -1;
2264 recursion_option
= FNM_LEADING_DIR
;
2265 unquote_option
= true;
2266 tar_sparse_major
= 1;
2267 tar_sparse_minor
= 0;
2269 owner_option
= -1; owner_name_option
= NULL
;
2270 group_option
= -1; group_name_option
= NULL
;
2272 check_device_option
= true;
2274 incremental_level
= -1;
2278 /* Convert old-style tar call by exploding option element and rearranging
2279 options accordingly. */
2281 if (argc
> 1 && argv
[1][0] != '-')
2283 int new_argc
; /* argc value for rearranged arguments */
2284 char **new_argv
; /* argv value for rearranged arguments */
2285 char *const *in
; /* cursor into original argv */
2286 char **out
; /* cursor into rearranged argv */
2287 const char *letter
; /* cursor into old option letters */
2288 char buffer
[3]; /* constructed option buffer */
2290 /* Initialize a constructed option. */
2295 /* Allocate a new argument array, and copy program name in it. */
2297 new_argc
= argc
- 1 + strlen (argv
[1]);
2298 new_argv
= xmalloc ((new_argc
+ 1) * sizeof (char *));
2303 /* Copy each old letter option as a separate option, and have the
2304 corresponding argument moved next to it. */
2306 for (letter
= *in
++; *letter
; letter
++)
2308 struct argp_option
*opt
;
2310 buffer
[1] = *letter
;
2311 *out
++ = xstrdup (buffer
);
2312 opt
= find_argp_option (options
, *letter
);
2313 if (opt
&& opt
->arg
)
2315 if (in
< argv
+ argc
)
2318 USAGE_ERROR ((0, 0, _("Old option '%c' requires an argument."),
2323 /* Copy all remaining options. */
2325 while (in
< argv
+ argc
)
2329 /* Replace the old option list by the new one. */
2335 /* Parse all options and non-options as they appear. */
2337 prepend_default_options (getenv ("TAR_OPTIONS"), &argc
, &argv
);
2339 if (argp_parse (&argp
, argc
, argv
, ARGP_IN_ORDER
, &idx
, &args
))
2340 exit (TAREXIT_FAILURE
);
2342 /* Special handling for 'o' option:
2344 GNU tar used to say "output old format".
2345 UNIX98 tar says don't chown files after extracting (we use
2346 "--no-same-owner" for this).
2348 The old GNU tar semantics is retained when used with --create
2349 option, otherwise UNIX98 semantics is assumed */
2353 if (subcommand_option
== CREATE_SUBCOMMAND
)
2355 /* GNU Tar <= 1.13 compatibility */
2356 set_archive_format ("v7");
2360 /* UNIX98 compatibility */
2361 same_owner_option
= -1;
2365 /* Handle operands after any "--" argument. */
2366 for (; idx
< argc
; idx
++)
2368 name_add_name (argv
[idx
], MAKE_INCL_OPTIONS (&args
));
2369 args
.input_files
= true;
2372 /* Warn about implicit use of the wildcards in command line arguments.
2374 warn_regex_usage
= args
.wildcards
== default_wildcards
;
2376 /* Derive option values and check option consistency. */
2378 if (archive_format
== DEFAULT_FORMAT
)
2380 if (args
.pax_option
)
2381 archive_format
= POSIX_FORMAT
;
2383 archive_format
= DEFAULT_ARCHIVE_FORMAT
;
2386 if ((volume_label_option
&& subcommand_option
== CREATE_SUBCOMMAND
)
2387 || incremental_option
2388 || multi_volume_option
2390 assert_format (FORMAT_MASK (OLDGNU_FORMAT
)
2391 | FORMAT_MASK (GNU_FORMAT
)
2392 | FORMAT_MASK (POSIX_FORMAT
));
2394 if (occurrence_option
)
2396 if (!args
.input_files
)
2398 _("--occurrence is meaningless without a file list")));
2399 if (!IS_SUBCOMMAND_CLASS (SUBCL_OCCUR
))
2401 _("--occurrence cannot be used with %s"),
2402 subcommand_string (subcommand_option
)));
2405 if (one_top_level_option
&& absolute_names_option
)
2406 USAGE_ERROR ((0, 0, _("--one-top-level cannot be used with --absolute-names")));
2408 if (archive_names
== 0)
2410 /* If no archive file name given, try TAPE from the environment, or
2411 else, DEFAULT_ARCHIVE from the configuration process. */
2414 archive_name_array
[0] = getenv ("TAPE");
2415 if (! archive_name_array
[0])
2416 archive_name_array
[0] = DEFAULT_ARCHIVE
;
2419 /* Allow multiple archives only with '-M'. */
2421 if (archive_names
> 1 && !multi_volume_option
)
2423 _("Multiple archive files require '-M' option")));
2425 if (listed_incremental_option
2426 && NEWER_OPTION_INITIALIZED (newer_mtime_option
))
2428 _("Cannot combine --listed-incremental with --newer")));
2429 if (incremental_level
!= -1 && !listed_incremental_option
)
2431 _("--level is meaningless without --listed-incremental")));
2433 if (volume_label_option
)
2435 if (archive_format
== GNU_FORMAT
|| archive_format
== OLDGNU_FORMAT
)
2437 size_t volume_label_max_len
=
2438 (sizeof current_header
->header
.name
2439 - 1 /* for trailing '\0' */
2440 - (multi_volume_option
2441 ? (sizeof " Volume "
2442 - 1 /* for null at end of " Volume " */
2443 + INT_STRLEN_BOUND (int) /* for volume number */
2444 - 1 /* for sign, as 0 <= volno */)
2446 if (volume_label_max_len
< strlen (volume_label_option
))
2448 ngettext ("%s: Volume label is too long (limit is %lu byte)",
2449 "%s: Volume label is too long (limit is %lu bytes)",
2450 volume_label_max_len
),
2451 quotearg_colon (volume_label_option
),
2452 (unsigned long) volume_label_max_len
));
2455 Label length in PAX format is limited by the volume size. */
2460 if (multi_volume_option
)
2461 USAGE_ERROR ((0, 0, _("Cannot verify multi-volume archives")));
2462 if (use_compress_program_option
)
2463 USAGE_ERROR ((0, 0, _("Cannot verify compressed archives")));
2464 if (!IS_SUBCOMMAND_CLASS (SUBCL_WRITE
))
2465 USAGE_ERROR ((0, 0, _("--verify cannot be used with %s"),
2466 subcommand_string (subcommand_option
)));
2469 if (use_compress_program_option
)
2471 if (multi_volume_option
)
2472 USAGE_ERROR ((0, 0, _("Cannot use multi-volume compressed archives")));
2473 if (IS_SUBCOMMAND_CLASS (SUBCL_UPDATE
))
2474 USAGE_ERROR ((0, 0, _("Cannot update compressed archives")));
2475 if (subcommand_option
== CAT_SUBCOMMAND
)
2476 USAGE_ERROR ((0, 0, _("Cannot concatenate compressed archives")));
2479 /* It is no harm to use --pax-option on non-pax archives in archive
2480 reading mode. It may even be useful, since it allows to override
2481 file attributes from tar headers. Therefore I allow such usage.
2484 && archive_format
!= POSIX_FORMAT
2485 && !IS_SUBCOMMAND_CLASS (SUBCL_READ
))
2486 USAGE_ERROR ((0, 0, _("--pax-option can be used only on POSIX archives")));
2488 /* star creates non-POSIX typed archives with xattr support, so allow the
2489 extra headers when reading */
2490 if ((acls_option
> 0)
2491 && archive_format
!= POSIX_FORMAT
2492 && !IS_SUBCOMMAND_CLASS (SUBCL_READ
))
2493 USAGE_ERROR ((0, 0, _("--acls can be used only on POSIX archives")));
2495 if ((selinux_context_option
> 0)
2496 && archive_format
!= POSIX_FORMAT
2497 && !IS_SUBCOMMAND_CLASS (SUBCL_READ
))
2498 USAGE_ERROR ((0, 0, _("--selinux can be used only on POSIX archives")));
2500 if ((xattrs_option
> 0)
2501 && archive_format
!= POSIX_FORMAT
2502 && !IS_SUBCOMMAND_CLASS (SUBCL_READ
))
2503 USAGE_ERROR ((0, 0, _("--xattrs can be used only on POSIX archives")));
2505 if ((starting_file_option
|| same_order_option
)
2506 && !IS_SUBCOMMAND_CLASS (SUBCL_READ
))
2508 _("--%s option cannot be used with %s"),
2509 starting_file_option
? "starting-file" : "same-order",
2510 subcommand_string (subcommand_option
)));
2512 /* If ready to unlink hierarchies, so we are for simpler files. */
2513 if (recursive_unlink_option
)
2514 old_files_option
= UNLINK_FIRST_OLD_FILES
;
2516 /* Flags for accessing files to be read from or copied into. POSIX says
2517 O_NONBLOCK has unspecified effect on most types of files, but in
2518 practice it never harms and sometimes helps. */
2520 int base_open_flags
=
2521 (O_BINARY
| O_CLOEXEC
| O_NOCTTY
| O_NONBLOCK
2522 | (dereference_option
? 0 : O_NOFOLLOW
)
2523 | (atime_preserve_option
== system_atime_preserve
? O_NOATIME
: 0));
2524 open_read_flags
= O_RDONLY
| base_open_flags
;
2525 open_searchdir_flags
= O_SEARCH
| O_DIRECTORY
| base_open_flags
;
2527 fstatat_flags
= dereference_option
? 0 : AT_SYMLINK_NOFOLLOW
;
2529 if (subcommand_option
== TEST_LABEL_SUBCOMMAND
)
2531 /* --test-label is silent if the user has specified the label name to
2533 if (!args
.input_files
)
2536 else if (utc_option
)
2539 if (tape_length_option
&& tape_length_option
< record_size
)
2540 USAGE_ERROR ((0, 0, _("Volume length cannot be less than record size")));
2542 if (same_order_option
&& listed_incremental_option
)
2543 USAGE_ERROR ((0, 0, _("--preserve-order is not compatible with "
2544 "--listed-incremental")));
2546 /* Forbid using -c with no input files whatsoever. Check that '-f -',
2547 explicit or implied, is used correctly. */
2549 switch (subcommand_option
)
2551 case CREATE_SUBCOMMAND
:
2552 if (!args
.input_files
&& !files_from_option
)
2554 _("Cowardly refusing to create an empty archive")));
2555 if (args
.compress_autodetect
&& archive_names
2556 && strcmp (archive_name_array
[0], "-"))
2557 set_compression_program_by_suffix (archive_name_array
[0],
2558 use_compress_program_option
);
2561 case EXTRACT_SUBCOMMAND
:
2562 case LIST_SUBCOMMAND
:
2563 case DIFF_SUBCOMMAND
:
2564 case TEST_LABEL_SUBCOMMAND
:
2565 for (archive_name_cursor
= archive_name_array
;
2566 archive_name_cursor
< archive_name_array
+ archive_names
;
2567 archive_name_cursor
++)
2568 if (!strcmp (*archive_name_cursor
, "-"))
2569 request_stdin ("-f");
2572 case CAT_SUBCOMMAND
:
2573 case UPDATE_SUBCOMMAND
:
2574 case APPEND_SUBCOMMAND
:
2575 for (archive_name_cursor
= archive_name_array
;
2576 archive_name_cursor
< archive_name_array
+ archive_names
;
2577 archive_name_cursor
++)
2578 if (!strcmp (*archive_name_cursor
, "-"))
2580 _("Options '-Aru' are incompatible with '-f -'")));
2586 /* Initialize stdlis */
2587 if (index_file_name
)
2589 stdlis
= fopen (index_file_name
, "w");
2591 open_fatal (index_file_name
);
2594 stdlis
= to_stdout_option
? stderr
: stdout
;
2596 archive_name_cursor
= archive_name_array
;
2598 /* Prepare for generating backup names. */
2600 if (args
.backup_suffix_string
)
2601 simple_backup_suffix
= xstrdup (args
.backup_suffix_string
);
2605 backup_type
= xget_version ("--backup", args
.version_control_string
);
2606 /* No backup is needed either if explicitely disabled or if
2607 the extracted files are not being written to disk. */
2608 if (backup_type
== no_backups
|| EXTRACT_OVER_PIPE
)
2609 backup_option
= false;
2612 checkpoint_finish_compile ();
2614 report_textual_dates (&args
);
2618 more_options (int argc
, char **argv
)
2621 if (argp_parse (&argp
, argc
, argv
, ARGP_IN_ORDER
,
2623 exit (TAREXIT_FAILURE
);
2628 /* Main routine for tar. */
2630 main (int argc
, char **argv
)
2633 set_program_name (argv
[0]);
2635 setlocale (LC_ALL
, "");
2636 bindtextdomain (PACKAGE
, LOCALEDIR
);
2637 textdomain (PACKAGE
);
2639 exit_failure
= TAREXIT_FAILURE
;
2640 exit_status
= TAREXIT_SUCCESS
;
2641 error_hook
= checkpoint_flush_actions
;
2643 filename_terminator
= '\n';
2644 set_quoting_style (0, DEFAULT_QUOTING_STYLE
);
2646 /* Make sure we have first three descriptors available */
2649 /* Pre-allocate a few structures. */
2651 allocated_archive_names
= 10;
2652 archive_name_array
=
2653 xmalloc (sizeof (const char *) * allocated_archive_names
);
2656 /* System V fork+wait does not work if SIGCHLD is ignored. */
2657 signal (SIGCHLD
, SIG_DFL
);
2659 /* Try to disable the ability to unlink a directory. */
2660 priv_set_remove_linkdir ();
2662 /* Decode options. */
2664 decode_options (argc
, argv
);
2668 /* Main command execution. */
2670 if (volno_file_option
)
2671 init_volume_number ();
2673 switch (subcommand_option
)
2675 case UNKNOWN_SUBCOMMAND
:
2677 _("You must specify one of the '-Acdtrux', '--delete' or '--test-label' options")));
2679 case CAT_SUBCOMMAND
:
2680 case UPDATE_SUBCOMMAND
:
2681 case APPEND_SUBCOMMAND
:
2685 case DELETE_SUBCOMMAND
:
2686 delete_archive_members ();
2689 case CREATE_SUBCOMMAND
:
2693 case EXTRACT_SUBCOMMAND
:
2695 read_and (extract_archive
);
2697 /* FIXME: should extract_finish () even if an ordinary signal is
2703 case LIST_SUBCOMMAND
:
2704 read_and (list_archive
);
2707 case DIFF_SUBCOMMAND
:
2709 read_and (diff_archive
);
2712 case TEST_LABEL_SUBCOMMAND
:
2713 test_archive_label ();
2716 checkpoint_finish ();
2719 print_total_stats ();
2721 if (check_links_option
)
2724 if (volno_file_option
)
2725 closeout_volume_number ();
2727 /* Dispose of allocated memory, and return. */
2729 free (archive_name_array
);
2730 xattrs_clear_setup ();
2733 if (exit_status
== TAREXIT_FAILURE
)
2734 error (0, 0, _("Exiting with failure status due to previous errors"));
2736 if (stdlis
== stdout
)
2738 else if (ferror (stderr
) || fclose (stderr
) != 0)
2739 set_exit_status (TAREXIT_FAILURE
);
2745 tar_stat_init (struct tar_stat_info
*st
)
2747 memset (st
, 0, sizeof (*st
));
2750 /* Close the stream or file descriptor associated with ST, and remove
2751 all traces of it from ST. Return true if successful, false (with a
2752 diagnostic) otherwise. */
2754 tar_stat_close (struct tar_stat_info
*st
)
2756 int status
= (st
->dirstream
? closedir (st
->dirstream
)
2757 : 0 < st
->fd
? close (st
->fd
)
2766 close_diag (st
->orig_file_name
);
2772 tar_stat_destroy (struct tar_stat_info
*st
)
2774 tar_stat_close (st
);
2775 xheader_xattr_free (st
->xattr_map
, st
->xattr_map_size
);
2776 free (st
->orig_file_name
);
2777 free (st
->file_name
);
2778 free (st
->link_name
);
2781 free (st
->cntx_name
);
2782 free (st
->acls_a_ptr
);
2783 free (st
->acls_d_ptr
);
2784 free (st
->sparse_map
);
2786 xheader_destroy (&st
->xhdr
);
2787 memset (st
, 0, sizeof (*st
));
2790 /* Format mask for all available formats that support nanosecond
2791 timestamp resolution. */
2792 #define NS_PRECISION_FORMAT_MASK FORMAT_MASK (POSIX_FORMAT)
2794 /* Same as timespec_cmp, but ignore nanoseconds if current archive
2795 format does not provide sufficient resolution. */
2797 tar_timespec_cmp (struct timespec a
, struct timespec b
)
2799 if (!(FORMAT_MASK (current_format
) & NS_PRECISION_FORMAT_MASK
))
2800 a
.tv_nsec
= b
.tv_nsec
= 0;
2801 return timespec_cmp (a
, b
);
2804 /* Set tar exit status to VAL, unless it is already indicating
2805 a more serious condition. This relies on the fact that the
2806 values of TAREXIT_ constants are ranged by severity. */
2808 set_exit_status (int val
)
2810 if (val
> exit_status
)