1 /* A tar (tape archiver) program.
3 Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000,
4 2001, 2003, 2004, 2005, 2006, 2007, 2012
5 Free Software Foundation, Inc.
7 Written by John Gilmore, starting 1985-08-25.
9 This program is free software; you can redistribute it and/or modify it
10 under the terms of the GNU General Public License as published by the
11 Free Software Foundation; either version 3, or (at your option) any later
14 This program is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
17 Public License for more details.
19 You should have received a copy of the GNU General Public License along
20 with this program; if not, write to the Free Software Foundation, Inc.,
21 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
27 #include <argp-namefrob.h>
28 #include <argp-fmtstream.h>
29 #include <argp-version-etc.h>
32 #if ! defined SIGCHLD && defined SIGCLD
33 # define SIGCHLD SIGCLD
36 /* The following causes "common.h" to produce definitions of all the global
37 variables, rather than just "extern" declarations of them. GNU tar does
38 depend on the system loader to preset all GLOBAL variables to neutral (or
39 zero) values; explicit initialization is usually not done. */
45 #include <configmake.h>
47 #include <parse-datetime.h>
49 #include <rmt-command.h>
52 #include <version-etc.h>
57 /* Local declarations. */
59 #ifndef DEFAULT_ARCHIVE_FORMAT
60 # define DEFAULT_ARCHIVE_FORMAT GNU_FORMAT
63 #ifndef DEFAULT_ARCHIVE
64 # define DEFAULT_ARCHIVE "tar.out"
67 #ifndef DEFAULT_BLOCKING
68 # define DEFAULT_BLOCKING 20
71 /* Print a message if not all links are dumped */
72 static int check_links_option
;
74 /* Number of allocated tape drive names. */
75 static size_t allocated_archive_names
;
80 /* Name of option using stdin. */
81 static const char *stdin_used_by
;
83 /* Doesn't return if stdin already requested. */
85 request_stdin (const char *option
)
88 USAGE_ERROR ((0, 0, _("Options '-%s' and '-%s' both want standard input"),
89 stdin_used_by
, option
));
91 stdin_used_by
= option
;
94 extern int rpmatch (char const *response
);
96 /* Returns true if and only if the user typed an affirmative response. */
98 confirm (const char *message_action
, const char *message_name
)
100 static FILE *confirm_file
;
101 static int confirm_file_EOF
;
106 if (archive
== 0 || stdin_used_by
)
108 confirm_file
= fopen (TTY_NAME
, "r");
110 open_fatal (TTY_NAME
);
114 request_stdin ("-w");
115 confirm_file
= stdin
;
119 fprintf (stdlis
, "%s %s?", message_action
, quote (message_name
));
122 if (!confirm_file_EOF
)
124 char *response
= NULL
;
125 size_t response_size
= 0;
126 if (getline (&response
, &response_size
, confirm_file
) < 0)
127 confirm_file_EOF
= 1;
129 status
= rpmatch (response
) > 0;
133 if (confirm_file_EOF
)
135 fputc ('\n', stdlis
);
142 static struct fmttab
{
144 enum archive_format fmt
;
147 { "oldgnu", OLDGNU_FORMAT
},
148 { "ustar", USTAR_FORMAT
},
149 { "posix", POSIX_FORMAT
},
150 #if 0 /* not fully supported yet */
151 { "star", STAR_FORMAT
},
153 { "gnu", GNU_FORMAT
},
154 { "pax", POSIX_FORMAT
}, /* An alias for posix */
159 set_archive_format (char const *name
)
161 struct fmttab
const *p
;
163 for (p
= fmttab
; strcmp (p
->name
, name
) != 0; )
165 USAGE_ERROR ((0, 0, _("%s: Invalid archive format"),
166 quotearg_colon (name
)));
168 archive_format
= p
->fmt
;
172 archive_format_string (enum archive_format fmt
)
174 struct fmttab
const *p
;
176 for (p
= fmttab
; p
->name
; p
++)
182 #define FORMAT_MASK(n) (1<<(n))
185 assert_format(unsigned fmt_mask
)
187 if ((FORMAT_MASK (archive_format
) & fmt_mask
) == 0)
189 _("GNU features wanted on incompatible archive format")));
193 subcommand_string (enum subcommand c
)
197 case UNKNOWN_SUBCOMMAND
:
200 case APPEND_SUBCOMMAND
:
206 case CREATE_SUBCOMMAND
:
209 case DELETE_SUBCOMMAND
:
212 case DIFF_SUBCOMMAND
:
215 case EXTRACT_SUBCOMMAND
:
218 case LIST_SUBCOMMAND
:
221 case UPDATE_SUBCOMMAND
:
224 case TEST_LABEL_SUBCOMMAND
:
225 return "--test-label";
231 tar_list_quoting_styles (struct obstack
*stk
, char const *prefix
)
234 size_t prefixlen
= strlen (prefix
);
236 for (i
= 0; quoting_style_args
[i
]; i
++)
238 obstack_grow (stk
, prefix
, prefixlen
);
239 obstack_grow (stk
, quoting_style_args
[i
],
240 strlen (quoting_style_args
[i
]));
241 obstack_1grow (stk
, '\n');
246 tar_set_quoting_style (char *arg
)
250 for (i
= 0; quoting_style_args
[i
]; i
++)
251 if (strcmp (arg
, quoting_style_args
[i
]) == 0)
253 set_quoting_style (NULL
, i
);
257 _("Unknown quoting style '%s'. Try '%s --quoting-style=help' to get a list."), arg
, program_invocation_short_name
));
265 ACLS_OPTION
= CHAR_MAX
+ 1,
267 ATIME_PRESERVE_OPTION
,
271 CHECKPOINT_ACTION_OPTION
,
272 DELAY_DIRECTORY_RESTORE_OPTION
,
273 HARD_DEREFERENCE_OPTION
,
275 EXCLUDE_BACKUPS_OPTION
,
276 EXCLUDE_CACHES_OPTION
,
277 EXCLUDE_CACHES_UNDER_OPTION
,
278 EXCLUDE_CACHES_ALL_OPTION
,
281 EXCLUDE_TAG_UNDER_OPTION
,
282 EXCLUDE_TAG_ALL_OPTION
,
288 IGNORE_COMMAND_ERROR_OPTION
,
289 IGNORE_FAILED_READ_OPTION
,
291 KEEP_NEWER_FILES_OPTION
,
301 NO_AUTO_COMPRESS_OPTION
,
302 NO_CHECK_DEVICE_OPTION
,
303 NO_DELAY_DIRECTORY_RESTORE_OPTION
,
304 NO_IGNORE_CASE_OPTION
,
305 NO_IGNORE_COMMAND_ERROR_OPTION
,
307 NO_OVERWRITE_DIR_OPTION
,
308 NO_QUOTE_CHARS_OPTION
,
310 NO_SAME_OWNER_OPTION
,
311 NO_SAME_PERMISSIONS_OPTION
,
313 NO_SELINUX_CONTEXT_OPTION
,
315 NO_WILDCARDS_MATCH_SLASH_OPTION
,
319 NUMERIC_OWNER_OPTION
,
322 ONE_FILE_SYSTEM_OPTION
,
323 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_TRANSFORMED_NAMES_OPTION
,
343 SKIP_OLD_FILES_OPTION
,
344 SPARSE_VERSION_OPTION
,
345 STRIP_COMPONENTS_OPTION
,
355 WILDCARDS_MATCH_SLASH_OPTION
,
362 const char *argp_program_version
= "tar (" PACKAGE_NAME
") " VERSION
;
363 const char *argp_program_bug_address
= "<" PACKAGE_BUGREPORT
">";
364 static char const doc
[] = N_("\
365 GNU 'tar' saves many files together into a single tape or disk archive, \
366 and can restore individual files from the archive.\n\
369 tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n\
370 tar -tvf archive.tar # List all files in archive.tar verbosely.\n\
371 tar -xf archive.tar # Extract all files from archive.tar.\n")
373 N_("The backup suffix is '~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
374 The version control may be set with --backup or VERSION_CONTROL, values are:\n\n\
375 none, off never make backups\n\
376 t, numbered make numbered backups\n\
377 nil, existing numbered if numbered backups exist, simple otherwise\n\
378 never, simple always make simple backups\n");
383 Available option letters are DEQY and eqy. Consider the following
386 [For Solaris tar compatibility =/= Is it important at all?]
387 e exit immediately with a nonzero exit status if unexpected errors occur
388 E use extended headers (--format=posix)
390 [q alias for --occurrence=1 =/= this would better be used for quiet?]
392 y per-file gzip compression
393 Y per-block gzip compression.
395 Additionally, the 'n' letter is assigned for option --seek, which
396 is probably not needed and should be marked as deprecated, so that
397 -n may become available in the future.
400 static struct argp_option options
[] = {
403 N_("Main operation mode:"), GRID
},
406 N_("list the contents of an archive"), GRID
+1 },
407 {"extract", 'x', 0, 0,
408 N_("extract files from an archive"), GRID
+1 },
409 {"get", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
410 {"create", 'c', 0, 0,
411 N_("create a new archive"), GRID
+1 },
413 N_("find differences between archive and file system"), GRID
+1 },
414 {"compare", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
415 {"append", 'r', 0, 0,
416 N_("append files to the end of an archive"), GRID
+1 },
417 {"update", 'u', 0, 0,
418 N_("only append files newer than copy in archive"), GRID
+1 },
419 {"catenate", 'A', 0, 0,
420 N_("append tar files to an archive"), GRID
+1 },
421 {"concatenate", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
422 {"delete", DELETE_OPTION
, 0, 0,
423 N_("delete from the archive (not on mag tapes!)"), GRID
+1 },
424 {"test-label", TEST_LABEL_OPTION
, NULL
, 0,
425 N_("test the archive volume label and exit"), GRID
+1 },
430 N_("Operation modifiers:"), GRID
},
432 {"sparse", 'S', 0, 0,
433 N_("handle sparse files efficiently"), GRID
+1 },
434 {"sparse-version", SPARSE_VERSION_OPTION
, N_("MAJOR[.MINOR]"), 0,
435 N_("set version of the sparse format to use (implies --sparse)"), GRID
+1},
436 {"incremental", 'G', 0, 0,
437 N_("handle old GNU-format incremental backup"), GRID
+1 },
438 {"listed-incremental", 'g', N_("FILE"), 0,
439 N_("handle new GNU-format incremental backup"), GRID
+1 },
440 {"level", LEVEL_OPTION
, N_("NUMBER"), 0,
441 N_("dump level for created listed-incremental archive"), GRID
+1 },
442 {"ignore-failed-read", IGNORE_FAILED_READ_OPTION
, 0, 0,
443 N_("do not exit with nonzero on unreadable files"), GRID
+1 },
444 {"occurrence", OCCURRENCE_OPTION
, N_("NUMBER"), OPTION_ARG_OPTIONAL
,
445 N_("process only the NUMBERth occurrence of each file in the archive;"
446 " this option is valid only in conjunction with one of the subcommands"
447 " --delete, --diff, --extract or --list and when a list of files"
448 " is given either on the command line or via the -T option;"
449 " NUMBER defaults to 1"), GRID
+1 },
450 {"seek", 'n', NULL
, 0,
451 N_("archive is seekable"), GRID
+1 },
452 {"no-seek", NO_SEEK_OPTION
, NULL
, 0,
453 N_("archive is not seekable"), GRID
+1 },
454 {"no-check-device", NO_CHECK_DEVICE_OPTION
, NULL
, 0,
455 N_("do not check device numbers when creating incremental archives"),
457 {"check-device", CHECK_DEVICE_OPTION
, NULL
, 0,
458 N_("check device numbers when creating incremental archives (default)"),
464 N_("Overwrite control:"), GRID
},
466 {"verify", 'W', 0, 0,
467 N_("attempt to verify the archive after writing it"), GRID
+1 },
468 {"remove-files", REMOVE_FILES_OPTION
, 0, 0,
469 N_("remove files after adding them to the archive"), GRID
+1 },
470 {"keep-old-files", 'k', 0, 0,
471 N_("don't replace existing files when extracting, "
472 "treat them as errors"), GRID
+1 },
473 {"skip-old-files", SKIP_OLD_FILES_OPTION
, 0, 0,
474 N_("don't replace existing files when extracting, silently skip over them"),
476 {"keep-newer-files", KEEP_NEWER_FILES_OPTION
, 0, 0,
477 N_("don't replace existing files that are newer than their archive copies"), GRID
+1 },
478 {"overwrite", OVERWRITE_OPTION
, 0, 0,
479 N_("overwrite existing files when extracting"), GRID
+1 },
480 {"unlink-first", 'U', 0, 0,
481 N_("remove each file prior to extracting over it"), GRID
+1 },
482 {"recursive-unlink", RECURSIVE_UNLINK_OPTION
, 0, 0,
483 N_("empty hierarchies prior to extracting directory"), GRID
+1 },
484 {"no-overwrite-dir", NO_OVERWRITE_DIR_OPTION
, 0, 0,
485 N_("preserve metadata of existing directories"), GRID
+1 },
486 {"overwrite-dir", OVERWRITE_DIR_OPTION
, 0, 0,
487 N_("overwrite metadata of existing directories when extracting (default)"),
493 N_("Select output stream:"), GRID
},
495 {"to-stdout", 'O', 0, 0,
496 N_("extract files to standard output"), GRID
+1 },
497 {"to-command", TO_COMMAND_OPTION
, N_("COMMAND"), 0,
498 N_("pipe extracted files to another program"), GRID
+1 },
499 {"ignore-command-error", IGNORE_COMMAND_ERROR_OPTION
, 0, 0,
500 N_("ignore exit codes of children"), GRID
+1 },
501 {"no-ignore-command-error", NO_IGNORE_COMMAND_ERROR_OPTION
, 0, 0,
502 N_("treat non-zero exit codes of children as error"), GRID
+1 },
507 N_("Handling of file attributes:"), GRID
},
509 {"owner", OWNER_OPTION
, N_("NAME"), 0,
510 N_("force NAME as owner for added files"), GRID
+1 },
511 {"group", GROUP_OPTION
, N_("NAME"), 0,
512 N_("force NAME as group for added files"), GRID
+1 },
513 {"mtime", MTIME_OPTION
, N_("DATE-OR-FILE"), 0,
514 N_("set mtime for added files from DATE-OR-FILE"), GRID
+1 },
515 {"mode", MODE_OPTION
, N_("CHANGES"), 0,
516 N_("force (symbolic) mode CHANGES for added files"), GRID
+1 },
517 {"atime-preserve", ATIME_PRESERVE_OPTION
,
518 N_("METHOD"), OPTION_ARG_OPTIONAL
,
519 N_("preserve access times on dumped files, either by restoring the times"
520 " after reading (METHOD='replace'; default) or by not setting the times"
521 " in the first place (METHOD='system')"), GRID
+1 },
523 N_("don't extract file modified time"), GRID
+1 },
524 {"same-owner", SAME_OWNER_OPTION
, 0, 0,
525 N_("try extracting files with the same ownership as exists in the archive (default for superuser)"), GRID
+1 },
526 {"no-same-owner", NO_SAME_OWNER_OPTION
, 0, 0,
527 N_("extract files as yourself (default for ordinary users)"), GRID
+1 },
528 {"numeric-owner", NUMERIC_OWNER_OPTION
, 0, 0,
529 N_("always use numbers for user/group names"), GRID
+1 },
530 {"preserve-permissions", 'p', 0, 0,
531 N_("extract information about file permissions (default for superuser)"),
533 {"same-permissions", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
534 {"no-same-permissions", NO_SAME_PERMISSIONS_OPTION
, 0, 0,
535 N_("apply the user's umask when extracting permissions from the archive (default for ordinary users)"), GRID
+1 },
536 {"preserve-order", 's', 0, 0,
537 N_("sort names to extract to match archive"), GRID
+1 },
538 {"same-order", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
539 {"preserve", PRESERVE_OPTION
, 0, 0,
540 N_("same as both -p and -s"), GRID
+1 },
541 {"delay-directory-restore", DELAY_DIRECTORY_RESTORE_OPTION
, 0, 0,
542 N_("delay setting modification times and permissions of extracted"
543 " directories until the end of extraction"), GRID
+1 },
544 {"no-delay-directory-restore", NO_DELAY_DIRECTORY_RESTORE_OPTION
, 0, 0,
545 N_("cancel the effect of --delay-directory-restore option"), GRID
+1 },
550 N_("Handling of extended file attributes:"), GRID
},
552 {"xattrs", XATTR_OPTION
, 0, 0,
553 N_("Enable extended attributes support"), GRID
+1 },
554 {"no-xattrs", NO_XATTR_OPTION
, 0, 0,
555 N_("Disable extended attributes support"), GRID
+1 },
556 {"xattrs-include", XATTR_INCLUDE
, N_("MASK"), 0,
557 N_("specify the include pattern for xattr keys"), GRID
+1 },
558 {"xattrs-exclude", XATTR_EXCLUDE
, N_("MASK"), 0,
559 N_("specify the exclude pattern for xattr keys"), GRID
+1 },
560 {"selinux", SELINUX_CONTEXT_OPTION
, 0, 0,
561 N_("Enable the SELinux context support"), GRID
+1 },
562 {"no-selinux", NO_SELINUX_CONTEXT_OPTION
, 0, 0,
563 N_("Disable the SELinux context support"), GRID
+1 },
564 {"acls", ACLS_OPTION
, 0, 0,
565 N_("Enable the POSIX ACLs support"), GRID
+1 },
566 {"no-acls", NO_ACLS_OPTION
, 0, 0,
567 N_("Disable the POSIX ACLs support"), GRID
+1 },
572 N_("Device selection and switching:"), GRID
},
574 {"file", 'f', N_("ARCHIVE"), 0,
575 N_("use archive file or device ARCHIVE"), GRID
+1 },
576 {"force-local", FORCE_LOCAL_OPTION
, 0, 0,
577 N_("archive file is local even if it has a colon"), GRID
+1 },
578 {"rmt-command", RMT_COMMAND_OPTION
, N_("COMMAND"), 0,
579 N_("use given rmt COMMAND instead of rmt"), GRID
+1 },
580 {"rsh-command", RSH_COMMAND_OPTION
, N_("COMMAND"), 0,
581 N_("use remote COMMAND instead of rsh"), GRID
+1 },
583 {"-[0-7][lmh]", 0, NULL
, OPTION_DOC
, /* It is OK, since 'name' will never be
585 N_("specify drive and density"), GRID
+1 },
587 {NULL
, '0', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
588 {NULL
, '1', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
589 {NULL
, '2', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
590 {NULL
, '3', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
591 {NULL
, '4', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
592 {NULL
, '5', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
593 {NULL
, '6', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
594 {NULL
, '7', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
595 {NULL
, '8', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
596 {NULL
, '9', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
598 {"multi-volume", 'M', 0, 0,
599 N_("create/list/extract multi-volume archive"), GRID
+1 },
600 {"tape-length", 'L', N_("NUMBER"), 0,
601 N_("change tape after writing NUMBER x 1024 bytes"), GRID
+1 },
602 {"info-script", 'F', N_("NAME"), 0,
603 N_("run script at end of each tape (implies -M)"), GRID
+1 },
604 {"new-volume-script", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
605 {"volno-file", VOLNO_FILE_OPTION
, N_("FILE"), 0,
606 N_("use/update the volume number in FILE"), GRID
+1 },
611 N_("Device blocking:"), GRID
},
613 {"blocking-factor", 'b', N_("BLOCKS"), 0,
614 N_("BLOCKS x 512 bytes per record"), GRID
+1 },
615 {"record-size", RECORD_SIZE_OPTION
, N_("NUMBER"), 0,
616 N_("NUMBER of bytes per record, multiple of 512"), GRID
+1 },
617 {"ignore-zeros", 'i', 0, 0,
618 N_("ignore zeroed blocks in archive (means EOF)"), GRID
+1 },
619 {"read-full-records", 'B', 0, 0,
620 N_("reblock as we read (for 4.2BSD pipes)"), GRID
+1 },
625 N_("Archive format selection:"), GRID
},
627 {"format", 'H', N_("FORMAT"), 0,
628 N_("create archive of the given format"), GRID
+1 },
630 {NULL
, 0, NULL
, 0, N_("FORMAT is one of the following:"), GRID
+2 },
631 {" v7", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("old V7 tar format"),
633 {" oldgnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
634 N_("GNU format as per tar <= 1.12"), GRID
+3 },
635 {" gnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
636 N_("GNU tar 1.13.x format"), GRID
+3 },
637 {" ustar", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
638 N_("POSIX 1003.1-1988 (ustar) format"), GRID
+3 },
639 {" pax", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
640 N_("POSIX 1003.1-2001 (pax) format"), GRID
+3 },
641 {" posix", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("same as pax"), GRID
+3 },
643 {"old-archive", OLD_ARCHIVE_OPTION
, 0, 0, /* FIXME */
644 N_("same as --format=v7"), GRID
+8 },
645 {"portability", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
646 {"posix", POSIX_OPTION
, 0, 0,
647 N_("same as --format=posix"), GRID
+8 },
648 {"pax-option", PAX_OPTION
, N_("keyword[[:]=value][,keyword[[:]=value]]..."), 0,
649 N_("control pax keywords"), GRID
+8 },
650 {"label", 'V', N_("TEXT"), 0,
651 N_("create archive with volume name TEXT; at list/extract time, use TEXT as a globbing pattern for volume name"), GRID
+8 },
656 N_("Compression options:"), GRID
},
657 {"auto-compress", 'a', 0, 0,
658 N_("use archive suffix to determine the compression program"), GRID
+1 },
659 {"no-auto-compress", NO_AUTO_COMPRESS_OPTION
, 0, 0,
660 N_("do not use archive suffix to determine the compression program"),
662 {"use-compress-program", 'I', N_("PROG"), 0,
663 N_("filter through PROG (must accept -d)"), GRID
+1 },
664 /* Note: docstrings for the options below are generated by tar_help_filter */
665 {"bzip2", 'j', 0, 0, NULL
, GRID
+1 },
666 {"gzip", 'z', 0, 0, NULL
, GRID
+1 },
667 {"gunzip", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
668 {"ungzip", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
669 {"compress", 'Z', 0, 0, NULL
, GRID
+1 },
670 {"uncompress", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
671 {"lzip", LZIP_OPTION
, 0, 0, NULL
, GRID
+1 },
672 {"lzma", LZMA_OPTION
, 0, 0, NULL
, GRID
+1 },
673 {"lzop", LZOP_OPTION
, 0, 0, NULL
, GRID
+1 },
674 {"xz", 'J', 0, 0, NULL
, GRID
+1 },
679 N_("Local file selection:"), GRID
},
681 {"add-file", ARGP_KEY_ARG
, N_("FILE"), 0,
682 N_("add given FILE to the archive (useful if its name starts with a dash)"), GRID
+1 },
683 {"directory", 'C', N_("DIR"), 0,
684 N_("change to directory DIR"), GRID
+1 },
685 {"files-from", 'T', N_("FILE"), 0,
686 N_("get names to extract or create from FILE"), GRID
+1 },
687 {"null", NULL_OPTION
, 0, 0,
688 N_("-T reads null-terminated names, disable -C"), GRID
+1 },
689 {"no-null", NO_NULL_OPTION
, 0, 0,
690 N_("disable the effect of the previous --null option"), GRID
+1 },
691 {"unquote", UNQUOTE_OPTION
, 0, 0,
692 N_("unquote filenames read with -T (default)"), GRID
+1 },
693 {"no-unquote", NO_UNQUOTE_OPTION
, 0, 0,
694 N_("do not unquote filenames read with -T"), GRID
+1 },
695 {"exclude", EXCLUDE_OPTION
, N_("PATTERN"), 0,
696 N_("exclude files, given as a PATTERN"), GRID
+1 },
697 {"exclude-from", 'X', N_("FILE"), 0,
698 N_("exclude patterns listed in FILE"), GRID
+1 },
699 {"exclude-caches", EXCLUDE_CACHES_OPTION
, 0, 0,
700 N_("exclude contents of directories containing CACHEDIR.TAG, "
701 "except for the tag file itself"), GRID
+1 },
702 {"exclude-caches-under", EXCLUDE_CACHES_UNDER_OPTION
, 0, 0,
703 N_("exclude everything under directories containing CACHEDIR.TAG"),
705 {"exclude-caches-all", EXCLUDE_CACHES_ALL_OPTION
, 0, 0,
706 N_("exclude directories containing CACHEDIR.TAG"), GRID
+1 },
707 {"exclude-tag", EXCLUDE_TAG_OPTION
, N_("FILE"), 0,
708 N_("exclude contents of directories containing FILE, except"
709 " for FILE itself"), GRID
+1 },
710 {"exclude-tag-under", EXCLUDE_TAG_UNDER_OPTION
, N_("FILE"), 0,
711 N_("exclude everything under directories containing FILE"), GRID
+1 },
712 {"exclude-tag-all", EXCLUDE_TAG_ALL_OPTION
, N_("FILE"), 0,
713 N_("exclude directories containing FILE"), GRID
+1 },
714 {"exclude-vcs", EXCLUDE_VCS_OPTION
, NULL
, 0,
715 N_("exclude version control system directories"), GRID
+1 },
716 {"exclude-backups", EXCLUDE_BACKUPS_OPTION
, NULL
, 0,
717 N_("exclude backup and lock files"), GRID
+1 },
718 {"no-recursion", NO_RECURSION_OPTION
, 0, 0,
719 N_("avoid descending automatically in directories"), GRID
+1 },
720 {"one-file-system", ONE_FILE_SYSTEM_OPTION
, 0, 0,
721 N_("stay in local file system when creating archive"), GRID
+1 },
722 {"recursion", RECURSION_OPTION
, 0, 0,
723 N_("recurse into directories (default)"), GRID
+1 },
724 {"absolute-names", 'P', 0, 0,
725 N_("don't strip leading '/'s from file names"), GRID
+1 },
726 {"dereference", 'h', 0, 0,
727 N_("follow symlinks; archive and dump the files they point to"), GRID
+1 },
728 {"hard-dereference", HARD_DEREFERENCE_OPTION
, 0, 0,
729 N_("follow hard links; archive and dump the files they refer to"), GRID
+1 },
730 {"starting-file", 'K', N_("MEMBER-NAME"), 0,
731 N_("begin at member MEMBER-NAME in the archive"), GRID
+1 },
732 {"newer", 'N', N_("DATE-OR-FILE"), 0,
733 N_("only store files newer than DATE-OR-FILE"), GRID
+1 },
734 {"after-date", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
735 {"newer-mtime", NEWER_MTIME_OPTION
, N_("DATE"), 0,
736 N_("compare date and time when data changed only"), GRID
+1 },
737 {"backup", BACKUP_OPTION
, N_("CONTROL"), OPTION_ARG_OPTIONAL
,
738 N_("backup before removal, choose version CONTROL"), GRID
+1 },
739 {"suffix", SUFFIX_OPTION
, N_("STRING"), 0,
740 N_("backup before removal, override usual suffix ('~' unless overridden by environment variable SIMPLE_BACKUP_SUFFIX)"), GRID
+1 },
745 N_("File name transformations:"), GRID
},
746 {"strip-components", STRIP_COMPONENTS_OPTION
, N_("NUMBER"), 0,
747 N_("strip NUMBER leading components from file names on extraction"),
749 {"transform", TRANSFORM_OPTION
, N_("EXPRESSION"), 0,
750 N_("use sed replace EXPRESSION to transform file names"), GRID
+1 },
751 {"xform", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
756 N_("File name matching options (affect both exclude and include patterns):"),
758 {"ignore-case", IGNORE_CASE_OPTION
, 0, 0,
759 N_("ignore case"), GRID
+1 },
760 {"anchored", ANCHORED_OPTION
, 0, 0,
761 N_("patterns match file name start"), GRID
+1 },
762 {"no-anchored", NO_ANCHORED_OPTION
, 0, 0,
763 N_("patterns match after any '/' (default for exclusion)"), GRID
+1 },
764 {"no-ignore-case", NO_IGNORE_CASE_OPTION
, 0, 0,
765 N_("case sensitive matching (default)"), GRID
+1 },
766 {"wildcards", WILDCARDS_OPTION
, 0, 0,
767 N_("use wildcards (default for exclusion)"), GRID
+1 },
768 {"no-wildcards", NO_WILDCARDS_OPTION
, 0, 0,
769 N_("verbatim string matching"), GRID
+1 },
770 {"no-wildcards-match-slash", NO_WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
771 N_("wildcards do not match '/'"), GRID
+1 },
772 {"wildcards-match-slash", WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
773 N_("wildcards match '/' (default for exclusion)"), GRID
+1 },
778 N_("Informative output:"), GRID
},
780 {"verbose", 'v', 0, 0,
781 N_("verbosely list files processed"), GRID
+1 },
782 {"warning", WARNING_OPTION
, N_("KEYWORD"), 0,
783 N_("warning control"), GRID
+1 },
784 {"checkpoint", CHECKPOINT_OPTION
, N_("NUMBER"), OPTION_ARG_OPTIONAL
,
785 N_("display progress messages every NUMBERth record (default 10)"),
787 {"checkpoint-action", CHECKPOINT_ACTION_OPTION
, N_("ACTION"), 0,
788 N_("execute ACTION on each checkpoint"),
790 {"check-links", 'l', 0, 0,
791 N_("print a message if not all links are dumped"), GRID
+1 },
792 {"totals", TOTALS_OPTION
, N_("SIGNAL"), OPTION_ARG_OPTIONAL
,
793 N_("print total bytes after processing the archive; "
794 "with an argument - print total bytes when this SIGNAL is delivered; "
795 "Allowed signals are: SIGHUP, SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; "
796 "the names without SIG prefix are also accepted"), GRID
+1 },
797 {"utc", UTC_OPTION
, 0, 0,
798 N_("print file modification times in UTC"), GRID
+1 },
799 {"full-time", FULL_TIME_OPTION
, 0, 0,
800 N_("print file time to its full resolution"), GRID
+1 },
801 {"index-file", INDEX_FILE_OPTION
, N_("FILE"), 0,
802 N_("send verbose output to FILE"), GRID
+1 },
803 {"block-number", 'R', 0, 0,
804 N_("show block number within archive with each message"), GRID
+1 },
805 {"interactive", 'w', 0, 0,
806 N_("ask for confirmation for every action"), GRID
+1 },
807 {"confirmation", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
808 {"show-defaults", SHOW_DEFAULTS_OPTION
, 0, 0,
809 N_("show tar defaults"), GRID
+1 },
810 {"show-omitted-dirs", SHOW_OMITTED_DIRS_OPTION
, 0, 0,
811 N_("when listing or extracting, list each directory that does not match search criteria"), GRID
+1 },
812 {"show-transformed-names", SHOW_TRANSFORMED_NAMES_OPTION
, 0, 0,
813 N_("show file or archive names after transformation"),
815 {"show-stored-names", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
816 {"quoting-style", QUOTING_STYLE_OPTION
, N_("STYLE"), 0,
817 N_("set name quoting style; see below for valid STYLE values"), GRID
+1 },
818 {"quote-chars", QUOTE_CHARS_OPTION
, N_("STRING"), 0,
819 N_("additionally quote characters from STRING"), GRID
+1 },
820 {"no-quote-chars", NO_QUOTE_CHARS_OPTION
, N_("STRING"), 0,
821 N_("disable quoting for characters from STRING"), GRID
+1 },
826 N_("Compatibility options:"), GRID
},
829 N_("when creating, same as --old-archive; when extracting, same as --no-same-owner"), GRID
+1 },
834 N_("Other options:"), GRID
},
836 {"restrict", RESTRICT_OPTION
, 0, 0,
837 N_("disable use of some potentially harmful options"), -1 },
843 static char const *const atime_preserve_args
[] =
845 "replace", "system", NULL
848 static enum atime_preserve
const atime_preserve_types
[] =
850 replace_atime_preserve
, system_atime_preserve
853 /* Make sure atime_preserve_types has as much entries as atime_preserve_args
854 (minus 1 for NULL guard) */
855 ARGMATCH_VERIFY (atime_preserve_args
, atime_preserve_types
);
857 /* Wildcard matching settings */
860 default_wildcards
, /* For exclusion == enable_wildcards,
861 for inclusion == disable_wildcards */
866 struct tar_args
/* Variables used during option parsing */
868 struct textual_date
*textual_date
; /* Keeps the arguments to --newer-mtime
869 and/or --date option if they are
871 enum wildcards wildcards
; /* Wildcard settings (--wildcards/
873 int matching_flags
; /* exclude_fnmatch options */
874 int include_anchored
; /* Pattern anchoring options used for
876 bool o_option
; /* True if -o option was given */
877 bool pax_option
; /* True if --pax-option was given */
878 char const *backup_suffix_string
; /* --suffix option argument */
879 char const *version_control_string
; /* --backup option argument */
880 bool input_files
; /* True if some input files where given */
881 int compress_autodetect
; /* True if compression autodetection should
882 be attempted when creating archives */
886 #define MAKE_EXCL_OPTIONS(args) \
887 ((((args)->wildcards != disable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
888 | (args)->matching_flags \
891 #define MAKE_INCL_OPTIONS(args) \
892 ((((args)->wildcards == enable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
893 | (args)->include_anchored \
894 | (args)->matching_flags \
897 static char const * const vcs_file_table
[] = {
929 static char const * const backup_file_table
[] = {
937 add_exclude_array (char const * const * fv
, int opts
)
941 for (i
= 0; fv
[i
]; i
++)
942 add_exclude (excluded
, fv
[i
], opts
);
947 format_default_settings (void)
950 "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s"
955 archive_format_string (DEFAULT_ARCHIVE_FORMAT
),
956 DEFAULT_ARCHIVE
, DEFAULT_BLOCKING
,
957 quoting_style_args
[DEFAULT_QUOTING_STYLE
],
967 set_subcommand_option (enum subcommand subcommand
)
969 if (subcommand_option
!= UNKNOWN_SUBCOMMAND
970 && subcommand_option
!= subcommand
)
972 _("You may not specify more than one '-Acdtrux' or '--test-label' option")));
974 subcommand_option
= subcommand
;
978 set_use_compress_program_option (const char *string
)
980 if (use_compress_program_option
981 && strcmp (use_compress_program_option
, string
) != 0)
982 USAGE_ERROR ((0, 0, _("Conflicting compression options")));
984 use_compress_program_option
= string
;
991 print_total_stats ();
992 #ifndef HAVE_SIGACTION
993 signal (signo
, sigstat
);
998 stat_on_signal (int signo
)
1000 #ifdef HAVE_SIGACTION
1002 # define SA_RESTART 0
1004 struct sigaction act
;
1005 act
.sa_handler
= sigstat
;
1006 sigemptyset (&act
.sa_mask
);
1007 act
.sa_flags
= SA_RESTART
;
1008 sigaction (signo
, &act
, NULL
);
1010 signal (signo
, sigstat
);
1015 set_stat_signal (const char *name
)
1017 static struct sigtab
1021 } const sigtab
[] = {
1022 { "SIGUSR1", SIGUSR1
},
1023 { "USR1", SIGUSR1
},
1024 { "SIGUSR2", SIGUSR2
},
1025 { "USR2", SIGUSR2
},
1026 { "SIGHUP", SIGHUP
},
1028 { "SIGINT", SIGINT
},
1030 { "SIGQUIT", SIGQUIT
},
1033 struct sigtab
const *p
;
1035 for (p
= sigtab
; p
< sigtab
+ sizeof (sigtab
) / sizeof (sigtab
[0]); p
++)
1036 if (strcmp (p
->name
, name
) == 0)
1038 stat_on_signal (p
->signo
);
1041 FATAL_ERROR ((0, 0, _("Unknown signal name: %s"), name
));
1047 struct textual_date
*next
;
1054 get_date_or_file (struct tar_args
*args
, const char *option
,
1055 const char *str
, struct timespec
*ts
)
1057 if (FILE_SYSTEM_PREFIX_LEN (str
) != 0
1062 if (stat (str
, &st
) != 0)
1065 USAGE_ERROR ((0, 0, _("Date sample file not found")));
1067 *ts
= get_stat_mtime (&st
);
1071 if (! parse_datetime (ts
, str
, NULL
))
1073 WARN ((0, 0, _("Substituting %s for unknown date format %s"),
1074 tartime (*ts
, false), quote (str
)));
1080 struct textual_date
*p
= xmalloc (sizeof (*p
));
1083 p
->date
= xstrdup (str
);
1084 p
->next
= args
->textual_date
;
1085 args
->textual_date
= p
;
1092 report_textual_dates (struct tar_args
*args
)
1094 struct textual_date
*p
;
1095 for (p
= args
->textual_date
; p
; )
1097 struct textual_date
*next
= p
->next
;
1100 char const *treated_as
= tartime (p
->ts
, true);
1101 if (strcmp (p
->date
, treated_as
) != 0)
1102 WARN ((0, 0, _("Option %s: Treating date '%s' as %s"),
1103 p
->option
, p
->date
, treated_as
));
1113 /* Either NL or NUL, as decided by the --null option. */
1114 static char filename_terminator
;
1116 enum read_file_list_state
/* Result of reading file name from the list file */
1118 file_list_success
, /* OK, name read successfully */
1119 file_list_end
, /* End of list file */
1120 file_list_zero
, /* Zero separator encountered where it should not */
1121 file_list_skip
/* Empty (zero-length) entry encountered, skip it */
1124 /* Read from FP a sequence of characters up to TERM and put them
1127 static enum read_file_list_state
1128 read_name_from_file (FILE *fp
, struct obstack
*stk
, int term
)
1133 for (c
= getc (fp
); c
!= EOF
&& c
!= term
; c
= getc (fp
))
1137 /* We have read a zero separator. The file possibly is
1139 return file_list_zero
;
1141 obstack_1grow (stk
, c
);
1145 if (counter
== 0 && c
!= EOF
)
1146 return file_list_skip
;
1148 obstack_1grow (stk
, 0);
1150 return (counter
== 0 && c
== EOF
) ? file_list_end
: file_list_success
;
1154 static bool files_from_option
; /* When set, tar will not refuse to create
1156 static struct obstack argv_stk
; /* Storage for additional command line options
1157 read using -T option */
1159 /* Prevent recursive inclusion of the same file */
1162 struct file_id_list
*next
;
1167 static struct file_id_list
*file_id_list
;
1170 add_file_id (const char *filename
)
1172 struct file_id_list
*p
;
1175 if (stat (filename
, &st
))
1176 stat_fatal (filename
);
1177 for (p
= file_id_list
; p
; p
= p
->next
)
1178 if (p
->ino
== st
.st_ino
&& p
->dev
== st
.st_dev
)
1180 FATAL_ERROR ((0, 0, _("%s: file list already read"),
1181 quotearg_colon (filename
)));
1183 p
= xmalloc (sizeof *p
);
1184 p
->next
= file_id_list
;
1190 /* Default density numbers for [0-9][lmh] device specifications */
1192 #if defined DEVICE_PREFIX && !defined DENSITY_LETTER
1193 # ifndef LOW_DENSITY_NUM
1194 # define LOW_DENSITY_NUM 0
1197 # ifndef MID_DENSITY_NUM
1198 # define MID_DENSITY_NUM 8
1201 # ifndef HIGH_DENSITY_NUM
1202 # define HIGH_DENSITY_NUM 16
1207 update_argv (const char *filename
, struct argp_state
*state
)
1210 size_t count
= 0, i
;
1214 bool is_stdin
= false;
1215 enum read_file_list_state read_state
;
1216 int term
= filename_terminator
;
1218 if (!strcmp (filename
, "-"))
1221 request_stdin ("-T");
1226 add_file_id (filename
);
1227 if ((fp
= fopen (filename
, "r")) == NULL
)
1228 open_fatal (filename
);
1231 while ((read_state
= read_name_from_file (fp
, &argv_stk
, term
))
1236 case file_list_success
:
1240 case file_list_end
: /* won't happen, just to pacify gcc */
1243 case file_list_zero
:
1247 WARNOPT (WARN_FILENAME_WITH_NULS
,
1248 (0, 0, N_("%s: file name read contains nul character"),
1249 quotearg_colon (filename
)));
1251 /* Prepare new stack contents */
1252 size
= obstack_object_size (&argv_stk
);
1253 p
= obstack_finish (&argv_stk
);
1254 for (; size
> 0; size
--, p
++)
1256 obstack_1grow (&argv_stk
, *p
);
1258 obstack_1grow (&argv_stk
, '\n');
1259 obstack_1grow (&argv_stk
, 0);
1261 /* Read rest of files using new filename terminator */
1266 case file_list_skip
:
1277 start
= obstack_finish (&argv_stk
);
1280 for (p
= start
; *p
; p
+= strlen (p
) + 1)
1284 new_argc
= state
->argc
+ count
;
1285 new_argv
= xmalloc (sizeof (state
->argv
[0]) * (new_argc
+ 1));
1286 memcpy (new_argv
, state
->argv
, sizeof (state
->argv
[0]) * (state
->argc
+ 1));
1287 state
->argv
= new_argv
;
1288 memmove (&state
->argv
[state
->next
+ count
], &state
->argv
[state
->next
],
1289 (state
->argc
- state
->next
+ 1) * sizeof (state
->argv
[0]));
1291 state
->argc
= new_argc
;
1293 for (i
= state
->next
, p
= start
; *p
; p
+= strlen (p
) + 1, i
++)
1295 if (term
== 0 && p
[0] == '-')
1296 state
->argv
[i
++] = (char *) "--add-file";
1303 tar_help_filter (int key
, const char *text
, void *input
)
1315 s
= xasprintf (_("filter the archive through %s"), BZIP2_PROGRAM
);
1319 s
= xasprintf (_("filter the archive through %s"), GZIP_PROGRAM
);
1323 s
= xasprintf (_("filter the archive through %s"), COMPRESS_PROGRAM
);
1327 s
= xasprintf (_("filter the archive through %s"), LZIP_PROGRAM
);
1331 s
= xasprintf (_("filter the archive through %s"), LZMA_PROGRAM
);
1335 s
= xasprintf (_("filter the archive through %s"), XZ_PROGRAM
);
1338 case ARGP_KEY_HELP_EXTRA
:
1342 obstack_init (&stk
);
1343 tstr
= _("Valid arguments for the --quoting-style option are:");
1344 obstack_grow (&stk
, tstr
, strlen (tstr
));
1345 obstack_grow (&stk
, "\n\n", 2);
1346 tar_list_quoting_styles (&stk
, " ");
1347 tstr
= _("\n*This* tar defaults to:\n");
1348 obstack_grow (&stk
, tstr
, strlen (tstr
));
1349 s
= format_default_settings ();
1350 obstack_grow (&stk
, s
, strlen (s
));
1351 obstack_1grow (&stk
, '\n');
1352 obstack_1grow (&stk
, 0);
1353 s
= xstrdup (obstack_finish (&stk
));
1354 obstack_free (&stk
, NULL
);
1361 expand_pax_option (struct tar_args
*targs
, const char *arg
)
1366 obstack_init (&stk
);
1369 size_t seglen
= strcspn (arg
, ",");
1370 char *p
= memchr (arg
, '=', seglen
);
1373 size_t len
= p
- arg
+ 1;
1374 obstack_grow (&stk
, arg
, len
);
1376 for (++p
; *p
&& isspace ((unsigned char) *p
); p
++)
1378 if (*p
== '{' && p
[len
-1] == '}')
1381 char *tmp
= xmalloc (len
);
1382 memcpy (tmp
, p
+ 1, len
-2);
1384 if (get_date_or_file (targs
, "--pax-option", tmp
, &ts
) == 0)
1386 char buf
[UINTMAX_STRSIZE_BOUND
], *s
;
1387 s
= umaxtostr (ts
.tv_sec
, buf
);
1388 obstack_grow (&stk
, s
, strlen (s
));
1391 obstack_grow (&stk
, p
, len
);
1395 obstack_grow (&stk
, p
, len
);
1398 obstack_grow (&stk
, arg
, seglen
);
1403 obstack_1grow (&stk
, *arg
);
1407 obstack_1grow (&stk
, 0);
1408 res
= xstrdup (obstack_finish (&stk
));
1409 obstack_free (&stk
, NULL
);
1415 parse_owner_group (char *arg
, uintmax_t field_max
, char const **name_option
)
1417 uintmax_t u
= UINTMAX_MAX
;
1419 char const *name
= 0;
1420 char const *invalid_num
= 0;
1421 char *colon
= strchr (arg
, ':');
1425 char const *num
= colon
+ 1;
1429 if (num
&& (! (xstrtoumax (num
, &end
, 10, &u
, "") == LONGINT_OK
1430 && u
<= field_max
)))
1436 switch ('0' <= *arg
&& *arg
<= '9'
1437 ? xstrtoumax (arg
, &end
, 10, &u1
, "")
1445 if (u1
<= field_max
)
1451 case LONGINT_OVERFLOW
:
1458 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (invalid_num
),
1459 _("Invalid owner or group ID")));
1461 *name_option
= name
;
1465 #define TAR_SIZE_SUFFIXES "bBcGgkKMmPTtw"
1468 parse_opt (int key
, char *arg
, struct argp_state
*state
)
1470 struct tar_args
*args
= state
->input
;
1475 /* File name or non-parsed option, because of ARGP_IN_ORDER */
1476 name_add_name (arg
, MAKE_INCL_OPTIONS (args
));
1477 args
->input_files
= true;
1481 set_subcommand_option (CAT_SUBCOMMAND
);
1485 args
->compress_autodetect
= true;
1488 case NO_AUTO_COMPRESS_OPTION
:
1489 args
->compress_autodetect
= false;
1495 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1496 && u
== (blocking_factor
= u
)
1497 && 0 < blocking_factor
1498 && u
== (record_size
= u
* BLOCKSIZE
) / BLOCKSIZE
))
1499 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1500 _("Invalid blocking factor")));
1505 /* Try to reblock input records. For reading 4.2BSD pipes. */
1507 /* It would surely make sense to exchange -B and -R, but it seems
1508 that -B has been used for a long while in Sun tar and most
1509 BSD-derived systems. This is a consequence of the block/record
1510 terminology confusion. */
1512 read_full_records_option
= true;
1516 set_subcommand_option (CREATE_SUBCOMMAND
);
1524 set_subcommand_option (DIFF_SUBCOMMAND
);
1528 if (archive_names
== allocated_archive_names
)
1529 archive_name_array
= x2nrealloc (archive_name_array
,
1530 &allocated_archive_names
,
1531 sizeof (archive_name_array
[0]));
1533 archive_name_array
[archive_names
++] = arg
;
1537 /* Since -F is only useful with -M, make it implied. Run this
1538 script at the end of each tape. */
1540 info_script_option
= arg
;
1541 multi_volume_option
= true;
1544 case FULL_TIME_OPTION
:
1545 full_time_option
= true;
1549 listed_incremental_option
= arg
;
1550 after_date_option
= true;
1554 /* We are making an incremental dump (FIXME: are we?); save
1555 directories at the beginning of the archive, and include in each
1556 directory its contents. */
1558 incremental_option
= true;
1562 /* Follow symbolic links. */
1563 dereference_option
= true;
1566 case HARD_DEREFERENCE_OPTION
:
1567 hard_dereference_option
= true;
1571 /* Ignore zero blocks (eofs). This can't be the default,
1572 because Unix tar writes two blocks of zeros, then pads out
1573 the record with garbage. */
1575 ignore_zeros_option
= true;
1579 set_use_compress_program_option (BZIP2_PROGRAM
);
1583 set_use_compress_program_option (XZ_PROGRAM
);
1587 /* Don't replace existing files. */
1588 old_files_option
= KEEP_OLD_FILES
;
1592 starting_file_option
= true;
1593 addname (arg
, 0, true, NULL
);
1596 case ONE_FILE_SYSTEM_OPTION
:
1597 /* When dumping directories, don't dump files/subdirectories
1598 that are on other filesystems. */
1599 one_file_system_option
= true;
1603 check_links_option
= 1;
1611 if (xstrtoumax (arg
, &p
, 10, &u
, TAR_SIZE_SUFFIXES
) != LONGINT_OK
)
1612 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1613 _("Invalid tape length")));
1614 if (p
> arg
&& !strchr (TAR_SIZE_SUFFIXES
, p
[-1]))
1615 tape_length_option
= 1024 * (tarlong
) u
;
1617 tape_length_option
= (tarlong
) u
;
1618 multi_volume_option
= true;
1625 incremental_level
= strtoul (arg
, &p
, 10);
1627 USAGE_ERROR ((0, 0, _("Invalid incremental level value")));
1632 set_use_compress_program_option (LZIP_PROGRAM
);
1636 set_use_compress_program_option (LZMA_PROGRAM
);
1640 set_use_compress_program_option (LZOP_PROGRAM
);
1644 touch_option
= true;
1648 /* Make multivolume archive: when we can't write any more into
1649 the archive, re-open it, and continue writing. */
1651 multi_volume_option
= true;
1655 get_date_or_file (args
, "--mtime", arg
, &mtime_option
);
1656 set_mtime_option
= true;
1663 case NO_SEEK_OPTION
:
1668 after_date_option
= true;
1671 case NEWER_MTIME_OPTION
:
1672 if (NEWER_OPTION_INITIALIZED (newer_mtime_option
))
1673 USAGE_ERROR ((0, 0, _("More than one threshold date")));
1674 get_date_or_file (args
,
1675 key
== NEWER_MTIME_OPTION
? "--newer-mtime"
1676 : "--after-date", arg
, &newer_mtime_option
);
1680 args
->o_option
= true;
1684 to_stdout_option
= true;
1688 same_permissions_option
= true;
1692 absolute_names_option
= true;
1696 set_subcommand_option (APPEND_SUBCOMMAND
);
1700 /* Print block numbers for debugging bad tar archives. */
1702 /* It would surely make sense to exchange -B and -R, but it seems
1703 that -B has been used for a long while in Sun tar and most
1704 BSD-derived systems. This is a consequence of the block/record
1705 terminology confusion. */
1707 block_number_option
= true;
1711 /* Names to extract are sorted. */
1713 same_order_option
= true;
1717 sparse_option
= true;
1720 case SKIP_OLD_FILES_OPTION
:
1721 old_files_option
= SKIP_OLD_FILES
;
1724 case SPARSE_VERSION_OPTION
:
1725 sparse_option
= true;
1728 tar_sparse_major
= strtoul (arg
, &p
, 10);
1732 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1733 tar_sparse_minor
= strtoul (p
+ 1, &p
, 10);
1735 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1741 set_subcommand_option (LIST_SUBCOMMAND
);
1745 case TEST_LABEL_OPTION
:
1746 set_subcommand_option (TEST_LABEL_SUBCOMMAND
);
1750 update_argv (arg
, state
);
1751 /* Indicate we've been given -T option. This is for backward
1752 compatibility only, so that `tar cfT archive /dev/null will
1754 files_from_option
= true;
1758 set_subcommand_option (UPDATE_SUBCOMMAND
);
1762 old_files_option
= UNLINK_FIRST_OLD_FILES
;
1771 warning_option
|= WARN_VERBOSE_WARNINGS
;
1775 volume_label_option
= arg
;
1779 interactive_option
= true;
1783 verify_option
= true;
1787 set_subcommand_option (EXTRACT_SUBCOMMAND
);
1791 if (add_exclude_file (add_exclude
, excluded
, arg
,
1792 MAKE_EXCL_OPTIONS (args
), '\n')
1796 FATAL_ERROR ((0, e
, "%s", quotearg_colon (arg
)));
1801 set_use_compress_program_option (GZIP_PROGRAM
);
1805 set_use_compress_program_option (COMPRESS_PROGRAM
);
1808 case ANCHORED_OPTION
:
1809 args
->matching_flags
|= EXCLUDE_ANCHORED
;
1812 case ATIME_PRESERVE_OPTION
:
1813 atime_preserve_option
=
1815 ? XARGMATCH ("--atime-preserve", arg
,
1816 atime_preserve_args
, atime_preserve_types
)
1817 : replace_atime_preserve
);
1818 if (! O_NOATIME
&& atime_preserve_option
== system_atime_preserve
)
1820 _("--atime-preserve='system' is not supported"
1821 " on this platform")));
1824 case CHECK_DEVICE_OPTION
:
1825 check_device_option
= true;
1828 case NO_CHECK_DEVICE_OPTION
:
1829 check_device_option
= false;
1832 case CHECKPOINT_OPTION
:
1839 checkpoint_compile_action (".");
1842 checkpoint_option
= strtoul (arg
, &p
, 0);
1845 _("--checkpoint value is not an integer")));
1848 checkpoint_option
= DEFAULT_CHECKPOINT
;
1851 case CHECKPOINT_ACTION_OPTION
:
1852 checkpoint_compile_action (arg
);
1856 backup_option
= true;
1858 args
->version_control_string
= arg
;
1861 case DELAY_DIRECTORY_RESTORE_OPTION
:
1862 delay_directory_restore_option
= true;
1865 case NO_DELAY_DIRECTORY_RESTORE_OPTION
:
1866 delay_directory_restore_option
= false;
1870 set_subcommand_option (DELETE_SUBCOMMAND
);
1873 case EXCLUDE_BACKUPS_OPTION
:
1874 add_exclude_array (backup_file_table
, EXCLUDE_WILDCARDS
);
1877 case EXCLUDE_OPTION
:
1878 add_exclude (excluded
, arg
, MAKE_EXCL_OPTIONS (args
));
1881 case EXCLUDE_CACHES_OPTION
:
1882 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_contents
,
1886 case EXCLUDE_CACHES_UNDER_OPTION
:
1887 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_under
,
1891 case EXCLUDE_CACHES_ALL_OPTION
:
1892 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_all
,
1896 case EXCLUDE_TAG_OPTION
:
1897 add_exclusion_tag (arg
, exclusion_tag_contents
, NULL
);
1900 case EXCLUDE_TAG_UNDER_OPTION
:
1901 add_exclusion_tag (arg
, exclusion_tag_under
, NULL
);
1904 case EXCLUDE_TAG_ALL_OPTION
:
1905 add_exclusion_tag (arg
, exclusion_tag_all
, NULL
);
1908 case EXCLUDE_VCS_OPTION
:
1909 add_exclude_array (vcs_file_table
, 0);
1912 case FORCE_LOCAL_OPTION
:
1913 force_local_option
= true;
1917 set_archive_format (arg
);
1920 case INDEX_FILE_OPTION
:
1921 index_file_name
= arg
;
1924 case IGNORE_CASE_OPTION
:
1925 args
->matching_flags
|= FNM_CASEFOLD
;
1928 case IGNORE_COMMAND_ERROR_OPTION
:
1929 ignore_command_error_option
= true;
1932 case IGNORE_FAILED_READ_OPTION
:
1933 ignore_failed_read_option
= true;
1936 case KEEP_NEWER_FILES_OPTION
:
1937 old_files_option
= KEEP_NEWER_FILES
;
1942 uintmax_t u
= parse_owner_group (arg
, TYPE_MAXIMUM (gid_t
),
1943 &group_name_option
);
1944 if (u
== UINTMAX_MAX
)
1947 if (group_name_option
)
1948 gname_to_gid (group_name_option
, &group_option
);
1956 mode_option
= mode_compile (arg
);
1958 FATAL_ERROR ((0, 0, _("Invalid mode given on option")));
1959 initial_umask
= umask (0);
1960 umask (initial_umask
);
1963 case NO_ANCHORED_OPTION
:
1964 args
->include_anchored
= 0; /* Clear the default for comman line args */
1965 args
->matching_flags
&= ~ EXCLUDE_ANCHORED
;
1968 case NO_IGNORE_CASE_OPTION
:
1969 args
->matching_flags
&= ~ FNM_CASEFOLD
;
1972 case NO_IGNORE_COMMAND_ERROR_OPTION
:
1973 ignore_command_error_option
= false;
1976 case NO_OVERWRITE_DIR_OPTION
:
1977 old_files_option
= NO_OVERWRITE_DIR_OLD_FILES
;
1980 case NO_QUOTE_CHARS_OPTION
:
1982 set_char_quoting (NULL
, *arg
, 0);
1985 case NO_WILDCARDS_OPTION
:
1986 args
->wildcards
= disable_wildcards
;
1989 case NO_WILDCARDS_MATCH_SLASH_OPTION
:
1990 args
->matching_flags
|= FNM_FILE_NAME
;
1994 filename_terminator
= '\0';
1997 case NO_NULL_OPTION
:
1998 filename_terminator
= '\n';
2001 case NUMERIC_OWNER_OPTION
:
2002 numeric_owner_option
= true;
2005 case OCCURRENCE_OPTION
:
2007 occurrence_option
= 1;
2011 if (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
)
2012 occurrence_option
= u
;
2014 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
2015 _("Invalid number")));
2019 case OLD_ARCHIVE_OPTION
:
2020 set_archive_format ("v7");
2023 case OVERWRITE_DIR_OPTION
:
2024 old_files_option
= DEFAULT_OLD_FILES
;
2027 case OVERWRITE_OPTION
:
2028 old_files_option
= OVERWRITE_OLD_FILES
;
2033 uintmax_t u
= parse_owner_group (arg
, TYPE_MAXIMUM (uid_t
),
2034 &owner_name_option
);
2035 if (u
== UINTMAX_MAX
)
2038 if (owner_name_option
)
2039 uname_to_uid (owner_name_option
, &owner_option
);
2046 case QUOTE_CHARS_OPTION
:
2048 set_char_quoting (NULL
, *arg
, 1);
2051 case QUOTING_STYLE_OPTION
:
2052 tar_set_quoting_style (arg
);
2057 char *tmp
= expand_pax_option (args
, arg
);
2058 args
->pax_option
= true;
2059 xheader_set_option (tmp
);
2065 set_archive_format ("posix");
2068 case PRESERVE_OPTION
:
2069 /* FIXME: What it is good for? */
2070 same_permissions_option
= true;
2071 same_order_option
= true;
2072 WARN ((0, 0, _("The --preserve option is deprecated, "
2073 "use --preserve-permissions --preserve-order instead")));
2076 case RECORD_SIZE_OPTION
:
2080 if (! (xstrtoumax (arg
, NULL
, 10, &u
, TAR_SIZE_SUFFIXES
) == LONGINT_OK
2081 && u
== (size_t) u
))
2082 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
2083 _("Invalid record size")));
2085 if (record_size
% BLOCKSIZE
!= 0)
2086 USAGE_ERROR ((0, 0, _("Record size must be a multiple of %d."),
2088 blocking_factor
= record_size
/ BLOCKSIZE
;
2092 case RECURSIVE_UNLINK_OPTION
:
2093 recursive_unlink_option
= true;
2096 case REMOVE_FILES_OPTION
:
2097 remove_files_option
= true;
2100 case RESTRICT_OPTION
:
2101 restrict_option
= true;
2104 case RMT_COMMAND_OPTION
:
2108 case RSH_COMMAND_OPTION
:
2109 rsh_command_option
= arg
;
2112 case SHOW_DEFAULTS_OPTION
:
2114 char *s
= format_default_settings ();
2121 case STRIP_COMPONENTS_OPTION
:
2124 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
2125 && u
== (size_t) u
))
2126 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
2127 _("Invalid number of elements")));
2128 strip_name_components
= u
;
2132 case SHOW_OMITTED_DIRS_OPTION
:
2133 show_omitted_dirs_option
= true;
2136 case SHOW_TRANSFORMED_NAMES_OPTION
:
2137 show_transformed_names_option
= true;
2141 backup_option
= true;
2142 args
->backup_suffix_string
= arg
;
2145 case TO_COMMAND_OPTION
:
2146 if (to_command_option
)
2147 USAGE_ERROR ((0, 0, _("Only one --to-command option allowed")));
2148 to_command_option
= arg
;
2153 set_stat_signal (arg
);
2155 totals_option
= true;
2158 case TRANSFORM_OPTION
:
2159 set_transform_expr (arg
);
2163 set_use_compress_program_option (arg
);
2166 case VOLNO_FILE_OPTION
:
2167 volno_file_option
= arg
;
2170 case WILDCARDS_OPTION
:
2171 args
->wildcards
= enable_wildcards
;
2174 case WILDCARDS_MATCH_SLASH_OPTION
:
2175 args
->matching_flags
&= ~ FNM_FILE_NAME
;
2178 case NO_RECURSION_OPTION
:
2179 recursion_option
= 0;
2182 case NO_SAME_OWNER_OPTION
:
2183 same_owner_option
= -1;
2186 case NO_SAME_PERMISSIONS_OPTION
:
2187 same_permissions_option
= -1;
2191 set_archive_format ("posix");
2195 case NO_ACLS_OPTION
:
2199 case SELINUX_CONTEXT_OPTION
:
2200 set_archive_format ("posix");
2201 selinux_context_option
= 1;
2204 case NO_SELINUX_CONTEXT_OPTION
:
2205 selinux_context_option
= -1;
2209 set_archive_format ("posix");
2213 case NO_XATTR_OPTION
:
2219 xattrs_mask_add (arg
, (key
== XATTR_INCLUDE
));
2222 case RECURSION_OPTION
:
2223 recursion_option
= FNM_LEADING_DIR
;
2226 case SAME_OWNER_OPTION
:
2227 same_owner_option
= 1;
2230 case UNQUOTE_OPTION
:
2231 unquote_option
= true;
2234 case NO_UNQUOTE_OPTION
:
2235 unquote_option
= false;
2238 case WARNING_OPTION
:
2239 set_warning_option (arg
);
2251 #ifdef DEVICE_PREFIX
2253 int device
= key
- '0';
2255 static char buf
[sizeof DEVICE_PREFIX
+ 10];
2259 argp_error (state
, _("Malformed density argument: %s"), quote (arg
));
2261 strcpy (buf
, DEVICE_PREFIX
);
2262 cursor
= buf
+ strlen (buf
);
2264 #ifdef DENSITY_LETTER
2266 sprintf (cursor
, "%d%c", device
, arg
[0]);
2268 #else /* not DENSITY_LETTER */
2273 device
+= LOW_DENSITY_NUM
;
2277 device
+= MID_DENSITY_NUM
;
2281 device
+= HIGH_DENSITY_NUM
;
2285 argp_error (state
, _("Unknown density: '%c'"), arg
[0]);
2287 sprintf (cursor
, "%d", device
);
2289 #endif /* not DENSITY_LETTER */
2291 if (archive_names
== allocated_archive_names
)
2292 archive_name_array
= x2nrealloc (archive_name_array
,
2293 &allocated_archive_names
,
2294 sizeof (archive_name_array
[0]));
2295 archive_name_array
[archive_names
++] = xstrdup (buf
);
2299 #else /* not DEVICE_PREFIX */
2302 _("Options '-[0-7][lmh]' not supported by *this* tar"));
2304 #endif /* not DEVICE_PREFIX */
2307 return ARGP_ERR_UNKNOWN
;
2312 static struct argp argp
= {
2325 argp_help (&argp
, stderr
, ARGP_HELP_SEE
, (char*) program_name
);
2330 /* Parse the options for tar. */
2332 static struct argp_option
*
2333 find_argp_option (struct argp_option
*o
, int letter
)
2340 && o
->doc
== NULL
); o
++)
2341 if (o
->key
== letter
)
2346 static const char *tar_authors
[] = {
2353 decode_options (int argc
, char **argv
)
2356 struct tar_args args
;
2358 argp_version_setup ("tar", tar_authors
);
2360 /* Set some default option values. */
2361 args
.textual_date
= NULL
;
2362 args
.wildcards
= default_wildcards
;
2363 args
.matching_flags
= 0;
2364 args
.include_anchored
= EXCLUDE_ANCHORED
;
2365 args
.o_option
= false;
2366 args
.pax_option
= false;
2367 args
.backup_suffix_string
= getenv ("SIMPLE_BACKUP_SUFFIX");
2368 args
.version_control_string
= 0;
2369 args
.input_files
= false;
2370 args
.compress_autodetect
= false;
2372 subcommand_option
= UNKNOWN_SUBCOMMAND
;
2373 archive_format
= DEFAULT_FORMAT
;
2374 blocking_factor
= DEFAULT_BLOCKING
;
2375 record_size
= DEFAULT_BLOCKING
* BLOCKSIZE
;
2376 excluded
= new_exclude ();
2377 newer_mtime_option
.tv_sec
= TYPE_MINIMUM (time_t);
2378 newer_mtime_option
.tv_nsec
= -1;
2379 recursion_option
= FNM_LEADING_DIR
;
2380 unquote_option
= true;
2381 tar_sparse_major
= 1;
2382 tar_sparse_minor
= 0;
2384 owner_option
= -1; owner_name_option
= NULL
;
2385 group_option
= -1; group_name_option
= NULL
;
2387 check_device_option
= true;
2389 incremental_level
= -1;
2393 /* Convert old-style tar call by exploding option element and rearranging
2394 options accordingly. */
2396 if (argc
> 1 && argv
[1][0] != '-')
2398 int new_argc
; /* argc value for rearranged arguments */
2399 char **new_argv
; /* argv value for rearranged arguments */
2400 char *const *in
; /* cursor into original argv */
2401 char **out
; /* cursor into rearranged argv */
2402 const char *letter
; /* cursor into old option letters */
2403 char buffer
[3]; /* constructed option buffer */
2405 /* Initialize a constructed option. */
2410 /* Allocate a new argument array, and copy program name in it. */
2412 new_argc
= argc
- 1 + strlen (argv
[1]);
2413 new_argv
= xmalloc ((new_argc
+ 1) * sizeof (char *));
2418 /* Copy each old letter option as a separate option, and have the
2419 corresponding argument moved next to it. */
2421 for (letter
= *in
++; *letter
; letter
++)
2423 struct argp_option
*opt
;
2425 buffer
[1] = *letter
;
2426 *out
++ = xstrdup (buffer
);
2427 opt
= find_argp_option (options
, *letter
);
2428 if (opt
&& opt
->arg
)
2430 if (in
< argv
+ argc
)
2433 USAGE_ERROR ((0, 0, _("Old option '%c' requires an argument."),
2438 /* Copy all remaining options. */
2440 while (in
< argv
+ argc
)
2444 /* Replace the old option list by the new one. */
2450 /* Parse all options and non-options as they appear. */
2452 prepend_default_options (getenv ("TAR_OPTIONS"), &argc
, &argv
);
2454 if (argp_parse (&argp
, argc
, argv
, ARGP_IN_ORDER
, &idx
, &args
))
2455 exit (TAREXIT_FAILURE
);
2458 /* Special handling for 'o' option:
2460 GNU tar used to say "output old format".
2461 UNIX98 tar says don't chown files after extracting (we use
2462 "--no-same-owner" for this).
2464 The old GNU tar semantics is retained when used with --create
2465 option, otherwise UNIX98 semantics is assumed */
2469 if (subcommand_option
== CREATE_SUBCOMMAND
)
2471 /* GNU Tar <= 1.13 compatibility */
2472 set_archive_format ("v7");
2476 /* UNIX98 compatibility */
2477 same_owner_option
= -1;
2481 /* Handle operands after any "--" argument. */
2482 for (; idx
< argc
; idx
++)
2484 name_add_name (argv
[idx
], MAKE_INCL_OPTIONS (&args
));
2485 args
.input_files
= true;
2488 /* Warn about implicit use of the wildcards in command line arguments.
2490 warn_regex_usage
= args
.wildcards
== default_wildcards
;
2492 /* Derive option values and check option consistency. */
2494 if (archive_format
== DEFAULT_FORMAT
)
2496 if (args
.pax_option
)
2497 archive_format
= POSIX_FORMAT
;
2499 archive_format
= DEFAULT_ARCHIVE_FORMAT
;
2502 if ((volume_label_option
&& subcommand_option
== CREATE_SUBCOMMAND
)
2503 || incremental_option
2504 || multi_volume_option
2506 assert_format (FORMAT_MASK (OLDGNU_FORMAT
)
2507 | FORMAT_MASK (GNU_FORMAT
)
2508 | FORMAT_MASK (POSIX_FORMAT
));
2510 if (occurrence_option
)
2512 if (!args
.input_files
)
2514 _("--occurrence is meaningless without a file list")));
2515 if (subcommand_option
!= DELETE_SUBCOMMAND
2516 && subcommand_option
!= DIFF_SUBCOMMAND
2517 && subcommand_option
!= EXTRACT_SUBCOMMAND
2518 && subcommand_option
!= LIST_SUBCOMMAND
)
2520 _("--occurrence cannot be used in the requested operation mode")));
2523 if (archive_names
== 0)
2525 /* If no archive file name given, try TAPE from the environment, or
2526 else, DEFAULT_ARCHIVE from the configuration process. */
2529 archive_name_array
[0] = getenv ("TAPE");
2530 if (! archive_name_array
[0])
2531 archive_name_array
[0] = DEFAULT_ARCHIVE
;
2534 /* Allow multiple archives only with '-M'. */
2536 if (archive_names
> 1 && !multi_volume_option
)
2538 _("Multiple archive files require '-M' option")));
2540 if (listed_incremental_option
2541 && NEWER_OPTION_INITIALIZED (newer_mtime_option
))
2543 _("Cannot combine --listed-incremental with --newer")));
2544 if (incremental_level
!= -1 && !listed_incremental_option
)
2546 _("--level is meaningless without --listed-incremental")));
2548 if (volume_label_option
)
2550 if (archive_format
== GNU_FORMAT
|| archive_format
== OLDGNU_FORMAT
)
2552 size_t volume_label_max_len
=
2553 (sizeof current_header
->header
.name
2554 - 1 /* for trailing '\0' */
2555 - (multi_volume_option
2556 ? (sizeof " Volume "
2557 - 1 /* for null at end of " Volume " */
2558 + INT_STRLEN_BOUND (int) /* for volume number */
2559 - 1 /* for sign, as 0 <= volno */)
2561 if (volume_label_max_len
< strlen (volume_label_option
))
2563 ngettext ("%s: Volume label is too long (limit is %lu byte)",
2564 "%s: Volume label is too long (limit is %lu bytes)",
2565 volume_label_max_len
),
2566 quotearg_colon (volume_label_option
),
2567 (unsigned long) volume_label_max_len
));
2570 Label length in PAX format is limited by the volume size. */
2575 if (multi_volume_option
)
2576 USAGE_ERROR ((0, 0, _("Cannot verify multi-volume archives")));
2577 if (use_compress_program_option
)
2578 USAGE_ERROR ((0, 0, _("Cannot verify compressed archives")));
2581 if (use_compress_program_option
)
2583 if (multi_volume_option
)
2584 USAGE_ERROR ((0, 0, _("Cannot use multi-volume compressed archives")));
2585 if (subcommand_option
== UPDATE_SUBCOMMAND
2586 || subcommand_option
== APPEND_SUBCOMMAND
2587 || subcommand_option
== DELETE_SUBCOMMAND
)
2588 USAGE_ERROR ((0, 0, _("Cannot update compressed archives")));
2589 if (subcommand_option
== CAT_SUBCOMMAND
)
2590 USAGE_ERROR ((0, 0, _("Cannot concatenate compressed archives")));
2593 /* It is no harm to use --pax-option on non-pax archives in archive
2594 reading mode. It may even be useful, since it allows to override
2595 file attributes from tar headers. Therefore I allow such usage.
2598 && archive_format
!= POSIX_FORMAT
2599 && !READ_LIKE_SUBCOMMAND
)
2600 USAGE_ERROR ((0, 0, _("--pax-option can be used only on POSIX archives")));
2602 /* star creates non-POSIX typed archives with xattr support, so allow the
2603 extra headers whenn reading */
2604 if ((acls_option
> 0)
2605 && archive_format
!= POSIX_FORMAT
2606 && !READ_LIKE_SUBCOMMAND
)
2607 USAGE_ERROR ((0, 0, _("--acls can be used only on POSIX archives")));
2609 if ((selinux_context_option
> 0)
2610 && archive_format
!= POSIX_FORMAT
2611 && !READ_LIKE_SUBCOMMAND
)
2612 USAGE_ERROR ((0, 0, _("--selinux can be used only on POSIX archives")));
2614 if ((xattrs_option
> 0)
2615 && archive_format
!= POSIX_FORMAT
2616 && !READ_LIKE_SUBCOMMAND
)
2617 USAGE_ERROR ((0, 0, _("--xattrs can be used only on POSIX archives")));
2619 /* If ready to unlink hierarchies, so we are for simpler files. */
2620 if (recursive_unlink_option
)
2621 old_files_option
= UNLINK_FIRST_OLD_FILES
;
2623 /* Flags for accessing files to be read from or copied into. POSIX says
2624 O_NONBLOCK has unspecified effect on most types of files, but in
2625 practice it never harms and sometimes helps. */
2627 int base_open_flags
=
2628 (O_BINARY
| O_CLOEXEC
| O_NOCTTY
| O_NONBLOCK
2629 | (dereference_option
? 0 : O_NOFOLLOW
)
2630 | (atime_preserve_option
== system_atime_preserve
? O_NOATIME
: 0));
2631 open_read_flags
= O_RDONLY
| base_open_flags
;
2632 open_searchdir_flags
= O_SEARCH
| O_DIRECTORY
| base_open_flags
;
2634 fstatat_flags
= dereference_option
? 0 : AT_SYMLINK_NOFOLLOW
;
2636 if (subcommand_option
== TEST_LABEL_SUBCOMMAND
)
2638 /* --test-label is silent if the user has specified the label name to
2640 if (!args
.input_files
)
2643 else if (utc_option
)
2646 if (tape_length_option
&& tape_length_option
< record_size
)
2647 USAGE_ERROR ((0, 0, _("Volume length cannot be less than record size")));
2649 if (same_order_option
&& listed_incremental_option
)
2650 USAGE_ERROR ((0, 0, _("--preserve-order is not compatible with "
2651 "--listed-incremental")));
2653 /* Forbid using -c with no input files whatsoever. Check that '-f -',
2654 explicit or implied, is used correctly. */
2656 switch (subcommand_option
)
2658 case CREATE_SUBCOMMAND
:
2659 if (!args
.input_files
&& !files_from_option
)
2661 _("Cowardly refusing to create an empty archive")));
2662 if (args
.compress_autodetect
&& archive_names
2663 && strcmp (archive_name_array
[0], "-"))
2664 set_compression_program_by_suffix (archive_name_array
[0],
2665 use_compress_program_option
);
2668 case EXTRACT_SUBCOMMAND
:
2669 case LIST_SUBCOMMAND
:
2670 case DIFF_SUBCOMMAND
:
2671 case TEST_LABEL_SUBCOMMAND
:
2672 for (archive_name_cursor
= archive_name_array
;
2673 archive_name_cursor
< archive_name_array
+ archive_names
;
2674 archive_name_cursor
++)
2675 if (!strcmp (*archive_name_cursor
, "-"))
2676 request_stdin ("-f");
2679 case CAT_SUBCOMMAND
:
2680 case UPDATE_SUBCOMMAND
:
2681 case APPEND_SUBCOMMAND
:
2682 for (archive_name_cursor
= archive_name_array
;
2683 archive_name_cursor
< archive_name_array
+ archive_names
;
2684 archive_name_cursor
++)
2685 if (!strcmp (*archive_name_cursor
, "-"))
2687 _("Options '-Aru' are incompatible with '-f -'")));
2693 /* Initialize stdlis */
2694 if (index_file_name
)
2696 stdlis
= fopen (index_file_name
, "w");
2698 open_fatal (index_file_name
);
2701 stdlis
= to_stdout_option
? stderr
: stdout
;
2703 archive_name_cursor
= archive_name_array
;
2705 /* Prepare for generating backup names. */
2707 if (args
.backup_suffix_string
)
2708 simple_backup_suffix
= xstrdup (args
.backup_suffix_string
);
2712 backup_type
= xget_version ("--backup", args
.version_control_string
);
2713 /* No backup is needed either if explicitely disabled or if
2714 the extracted files are not being written to disk. */
2715 if (backup_type
== no_backups
|| EXTRACT_OVER_PIPE
)
2716 backup_option
= false;
2719 checkpoint_finish_compile ();
2721 report_textual_dates (&args
);
2727 /* Main routine for tar. */
2729 main (int argc
, char **argv
)
2732 set_program_name (argv
[0]);
2734 setlocale (LC_ALL
, "");
2735 bindtextdomain (PACKAGE
, LOCALEDIR
);
2736 textdomain (PACKAGE
);
2738 exit_failure
= TAREXIT_FAILURE
;
2739 exit_status
= TAREXIT_SUCCESS
;
2740 filename_terminator
= '\n';
2741 set_quoting_style (0, DEFAULT_QUOTING_STYLE
);
2743 /* Make sure we have first three descriptors available */
2746 /* Pre-allocate a few structures. */
2748 allocated_archive_names
= 10;
2749 archive_name_array
=
2750 xmalloc (sizeof (const char *) * allocated_archive_names
);
2753 obstack_init (&argv_stk
);
2755 /* System V fork+wait does not work if SIGCHLD is ignored. */
2756 signal (SIGCHLD
, SIG_DFL
);
2758 /* Try to disable the ability to unlink a directory. */
2759 priv_set_remove_linkdir ();
2761 /* Decode options. */
2763 decode_options (argc
, argv
);
2767 /* Main command execution. */
2769 if (volno_file_option
)
2770 init_volume_number ();
2772 switch (subcommand_option
)
2774 case UNKNOWN_SUBCOMMAND
:
2776 _("You must specify one of the '-Acdtrux' or '--test-label' options")));
2778 case CAT_SUBCOMMAND
:
2779 case UPDATE_SUBCOMMAND
:
2780 case APPEND_SUBCOMMAND
:
2784 case DELETE_SUBCOMMAND
:
2785 delete_archive_members ();
2788 case CREATE_SUBCOMMAND
:
2792 case EXTRACT_SUBCOMMAND
:
2794 read_and (extract_archive
);
2796 /* FIXME: should extract_finish () even if an ordinary signal is
2802 case LIST_SUBCOMMAND
:
2803 read_and (list_archive
);
2806 case DIFF_SUBCOMMAND
:
2808 read_and (diff_archive
);
2811 case TEST_LABEL_SUBCOMMAND
:
2812 test_archive_label ();
2816 print_total_stats ();
2818 if (check_links_option
)
2821 if (volno_file_option
)
2822 closeout_volume_number ();
2824 /* Dispose of allocated memory, and return. */
2826 free (archive_name_array
);
2827 xattrs_clear_setup ();
2830 if (exit_status
== TAREXIT_FAILURE
)
2831 error (0, 0, _("Exiting with failure status due to previous errors"));
2833 if (stdlis
== stdout
)
2835 else if (ferror (stderr
) || fclose (stderr
) != 0)
2836 set_exit_status (TAREXIT_FAILURE
);
2842 tar_stat_init (struct tar_stat_info
*st
)
2844 memset (st
, 0, sizeof (*st
));
2847 /* Close the stream or file descriptor associated with ST, and remove
2848 all traces of it from ST. Return true if successful, false (with a
2849 diagnostic) otherwise. */
2851 tar_stat_close (struct tar_stat_info
*st
)
2853 int status
= (st
->dirstream
? closedir (st
->dirstream
)
2854 : 0 < st
->fd
? close (st
->fd
)
2863 close_diag (st
->orig_file_name
);
2869 tar_stat_destroy (struct tar_stat_info
*st
)
2871 tar_stat_close (st
);
2872 xheader_xattr_free (st
->xattr_map
, st
->xattr_map_size
);
2873 free (st
->orig_file_name
);
2874 free (st
->file_name
);
2875 free (st
->link_name
);
2878 free (st
->cntx_name
);
2879 free (st
->acls_a_ptr
);
2880 free (st
->acls_d_ptr
);
2881 free (st
->sparse_map
);
2883 xheader_destroy (&st
->xhdr
);
2884 memset (st
, 0, sizeof (*st
));
2887 /* Format mask for all available formats that support nanosecond
2888 timestamp resolution. */
2889 #define NS_PRECISION_FORMAT_MASK FORMAT_MASK (POSIX_FORMAT)
2891 /* Same as timespec_cmp, but ignore nanoseconds if current archive
2892 format does not provide sufficient resolution. */
2894 tar_timespec_cmp (struct timespec a
, struct timespec b
)
2896 if (!(FORMAT_MASK (current_format
) & NS_PRECISION_FORMAT_MASK
))
2897 a
.tv_nsec
= b
.tv_nsec
= 0;
2898 return timespec_cmp (a
, b
);
2901 /* Set tar exit status to VAL, unless it is already indicating
2902 a more serious condition. This relies on the fact that the
2903 values of TAREXIT_ constants are ranged by severity. */
2905 set_exit_status (int val
)
2907 if (val
> exit_status
)