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, 2009 Free 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, write to the Free Software Foundation, Inc.,
20 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
26 #include <argp-namefrob.h>
27 #include <argp-fmtstream.h>
28 #include <argp-version-etc.h>
31 #if ! defined SIGCHLD && defined SIGCLD
32 # define SIGCHLD SIGCLD
35 /* The following causes "common.h" to produce definitions of all the global
36 variables, rather than just "extern" declarations of them. GNU tar does
37 depend on the system loader to preset all GLOBAL variables to neutral (or
38 zero) values; explicit initialization is usually not done. */
44 #include <configmake.h>
48 #include <rmt-command.h>
51 #include <version-etc.h>
56 /* Local declarations. */
58 #ifndef DEFAULT_ARCHIVE_FORMAT
59 # define DEFAULT_ARCHIVE_FORMAT GNU_FORMAT
62 #ifndef DEFAULT_ARCHIVE
63 # define DEFAULT_ARCHIVE "tar.out"
66 #ifndef DEFAULT_BLOCKING
67 # define DEFAULT_BLOCKING 20
73 /* Name of option using stdin. */
74 static const char *stdin_used_by
;
76 /* Doesn't return if stdin already requested. */
78 request_stdin (const char *option
)
81 USAGE_ERROR ((0, 0, _("Options `-%s' and `-%s' both want standard input"),
82 stdin_used_by
, option
));
84 stdin_used_by
= option
;
87 extern int rpmatch (char const *response
);
89 /* Returns true if and only if the user typed an affirmative response. */
91 confirm (const char *message_action
, const char *message_name
)
93 static FILE *confirm_file
;
94 static int confirm_file_EOF
;
99 if (archive
== 0 || stdin_used_by
)
101 confirm_file
= fopen (TTY_NAME
, "r");
103 open_fatal (TTY_NAME
);
107 request_stdin ("-w");
108 confirm_file
= stdin
;
112 fprintf (stdlis
, "%s %s?", message_action
, quote (message_name
));
115 if (!confirm_file_EOF
)
117 char *response
= NULL
;
118 size_t response_size
= 0;
119 if (getline (&response
, &response_size
, confirm_file
) < 0)
120 confirm_file_EOF
= 1;
122 status
= rpmatch (response
) > 0;
126 if (confirm_file_EOF
)
128 fputc ('\n', stdlis
);
135 static struct fmttab
{
137 enum archive_format fmt
;
140 { "oldgnu", OLDGNU_FORMAT
},
141 { "ustar", USTAR_FORMAT
},
142 { "posix", POSIX_FORMAT
},
143 #if 0 /* not fully supported yet */
144 { "star", STAR_FORMAT
},
146 { "gnu", GNU_FORMAT
},
147 { "pax", POSIX_FORMAT
}, /* An alias for posix */
152 set_archive_format (char const *name
)
154 struct fmttab
const *p
;
156 for (p
= fmttab
; strcmp (p
->name
, name
) != 0; )
158 USAGE_ERROR ((0, 0, _("%s: Invalid archive format"),
159 quotearg_colon (name
)));
161 archive_format
= p
->fmt
;
165 archive_format_string (enum archive_format fmt
)
167 struct fmttab
const *p
;
169 for (p
= fmttab
; p
->name
; p
++)
175 #define FORMAT_MASK(n) (1<<(n))
178 assert_format(unsigned fmt_mask
)
180 if ((FORMAT_MASK (archive_format
) & fmt_mask
) == 0)
182 _("GNU features wanted on incompatible archive format")));
186 subcommand_string (enum subcommand c
)
190 case UNKNOWN_SUBCOMMAND
:
193 case APPEND_SUBCOMMAND
:
199 case CREATE_SUBCOMMAND
:
202 case DELETE_SUBCOMMAND
:
205 case DIFF_SUBCOMMAND
:
208 case EXTRACT_SUBCOMMAND
:
211 case LIST_SUBCOMMAND
:
214 case UPDATE_SUBCOMMAND
:
223 tar_list_quoting_styles (argp_fmtstream_t fs
, char *prefix
)
227 for (i
= 0; quoting_style_args
[i
]; i
++)
228 argp_fmtstream_printf (fs
, "%s%s\n", prefix
, quoting_style_args
[i
]);
232 tar_set_quoting_style (char *arg
)
236 for (i
= 0; quoting_style_args
[i
]; i
++)
237 if (strcmp (arg
, quoting_style_args
[i
]) == 0)
239 set_quoting_style (NULL
, i
);
243 _("Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."), arg
, program_invocation_short_name
));
251 ANCHORED_OPTION
= CHAR_MAX
+ 1,
252 ATIME_PRESERVE_OPTION
,
256 CHECKPOINT_ACTION_OPTION
,
257 DELAY_DIRECTORY_RESTORE_OPTION
,
258 HARD_DEREFERENCE_OPTION
,
260 EXCLUDE_BACKUPS_OPTION
,
261 EXCLUDE_CACHES_OPTION
,
262 EXCLUDE_CACHES_UNDER_OPTION
,
263 EXCLUDE_CACHES_ALL_OPTION
,
266 EXCLUDE_TAG_UNDER_OPTION
,
267 EXCLUDE_TAG_ALL_OPTION
,
272 IGNORE_COMMAND_ERROR_OPTION
,
273 IGNORE_FAILED_READ_OPTION
,
275 KEEP_NEWER_FILES_OPTION
,
283 NO_AUTO_COMPRESS_OPTION
,
284 NO_CHECK_DEVICE_OPTION
,
285 NO_DELAY_DIRECTORY_RESTORE_OPTION
,
286 NO_IGNORE_CASE_OPTION
,
287 NO_IGNORE_COMMAND_ERROR_OPTION
,
289 NO_OVERWRITE_DIR_OPTION
,
290 NO_QUOTE_CHARS_OPTION
,
292 NO_SAME_OWNER_OPTION
,
293 NO_SAME_PERMISSIONS_OPTION
,
296 NO_WILDCARDS_MATCH_SLASH_OPTION
,
299 NUMERIC_OWNER_OPTION
,
302 ONE_FILE_SYSTEM_OPTION
,
303 OVERWRITE_DIR_OPTION
,
310 QUOTING_STYLE_OPTION
,
313 RECURSIVE_UNLINK_OPTION
,
319 SHOW_DEFAULTS_OPTION
,
320 SHOW_OMITTED_DIRS_OPTION
,
321 SHOW_TRANSFORMED_NAMES_OPTION
,
322 SPARSE_VERSION_OPTION
,
323 STRIP_COMPONENTS_OPTION
,
333 WILDCARDS_MATCH_SLASH_OPTION
,
337 const char *argp_program_version
= "tar (" PACKAGE_NAME
") " VERSION
;
338 const char *argp_program_bug_address
= "<" PACKAGE_BUGREPORT
">";
339 static char const doc
[] = N_("\
340 GNU `tar' saves many files together into a single tape or disk archive, \
341 and can restore individual files from the archive.\n\
344 tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n\
345 tar -tvf archive.tar # List all files in archive.tar verbosely.\n\
346 tar -xf archive.tar # Extract all files from archive.tar.\n")
348 N_("The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
349 The version control may be set with --backup or VERSION_CONTROL, values are:\n\n\
350 none, off never make backups\n\
351 t, numbered make numbered backups\n\
352 nil, existing numbered if numbered backups exist, simple otherwise\n\
353 never, simple always make simple backups\n");
358 Available option letters are DEQY and eqy. Consider the following
361 [For Solaris tar compatibility =/= Is it important at all?]
362 e exit immediately with a nonzero exit status if unexpected errors occur
363 E use extended headers (--format=posix)
365 [q alias for --occurrence=1 =/= this would better be used for quiet?]
367 y per-file gzip compression
368 Y per-block gzip compression.
370 Additionally, the 'n' letter is assigned for option --seek, which
371 is probably not needed and should be marked as deprecated, so that
372 -n may become available in the future.
375 static struct argp_option options
[] = {
378 N_("Main operation mode:"), GRID
},
381 N_("list the contents of an archive"), GRID
+1 },
382 {"extract", 'x', 0, 0,
383 N_("extract files from an archive"), GRID
+1 },
384 {"get", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
385 {"create", 'c', 0, 0,
386 N_("create a new archive"), GRID
+1 },
388 N_("find differences between archive and file system"), GRID
+1 },
389 {"compare", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
390 {"append", 'r', 0, 0,
391 N_("append files to the end of an archive"), GRID
+1 },
392 {"update", 'u', 0, 0,
393 N_("only append files newer than copy in archive"), GRID
+1 },
394 {"catenate", 'A', 0, 0,
395 N_("append tar files to an archive"), GRID
+1 },
396 {"concatenate", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
397 {"delete", DELETE_OPTION
, 0, 0,
398 N_("delete from the archive (not on mag tapes!)"), GRID
+1 },
399 {"test-label", TEST_LABEL_OPTION
, NULL
, 0,
400 N_("test the archive volume label and exit"), GRID
+1 },
405 N_("Operation modifiers:"), GRID
},
407 {"sparse", 'S', 0, 0,
408 N_("handle sparse files efficiently"), GRID
+1 },
409 {"sparse-version", SPARSE_VERSION_OPTION
, N_("MAJOR[.MINOR]"), 0,
410 N_("set version of the sparse format to use (implies --sparse)"), GRID
+1},
411 {"incremental", 'G', 0, 0,
412 N_("handle old GNU-format incremental backup"), GRID
+1 },
413 {"listed-incremental", 'g', N_("FILE"), 0,
414 N_("handle new GNU-format incremental backup"), GRID
+1 },
415 {"level", LEVEL_OPTION
, N_("NUMBER"), 0,
416 N_("dump level for created listed-incremental archive"), GRID
+1 },
417 {"ignore-failed-read", IGNORE_FAILED_READ_OPTION
, 0, 0,
418 N_("do not exit with nonzero on unreadable files"), GRID
+1 },
419 {"occurrence", OCCURRENCE_OPTION
, N_("NUMBER"), OPTION_ARG_OPTIONAL
,
420 N_("process only the NUMBERth occurrence of each file in the archive;"
421 " this option is valid only in conjunction with one of the subcommands"
422 " --delete, --diff, --extract or --list and when a list of files"
423 " is given either on the command line or via the -T option;"
424 " NUMBER defaults to 1"), GRID
+1 },
425 {"seek", 'n', NULL
, 0,
426 N_("archive is seekable"), GRID
+1 },
427 {"no-seek", NO_SEEK_OPTION
, NULL
, 0,
428 N_("archive is not seekable"), GRID
+1 },
429 {"no-check-device", NO_CHECK_DEVICE_OPTION
, NULL
, 0,
430 N_("do not check device numbers when creating incremental archives"),
432 {"check-device", CHECK_DEVICE_OPTION
, NULL
, 0,
433 N_("check device numbers when creating incremental archives (default)"),
439 N_("Overwrite control:"), GRID
},
441 {"verify", 'W', 0, 0,
442 N_("attempt to verify the archive after writing it"), GRID
+1 },
443 {"remove-files", REMOVE_FILES_OPTION
, 0, 0,
444 N_("remove files after adding them to the archive"), GRID
+1 },
445 {"keep-old-files", 'k', 0, 0,
446 N_("don't replace existing files when extracting"), GRID
+1 },
447 {"keep-newer-files", KEEP_NEWER_FILES_OPTION
, 0, 0,
448 N_("don't replace existing files that are newer than their archive copies"), GRID
+1 },
449 {"overwrite", OVERWRITE_OPTION
, 0, 0,
450 N_("overwrite existing files when extracting"), GRID
+1 },
451 {"unlink-first", 'U', 0, 0,
452 N_("remove each file prior to extracting over it"), GRID
+1 },
453 {"recursive-unlink", RECURSIVE_UNLINK_OPTION
, 0, 0,
454 N_("empty hierarchies prior to extracting directory"), GRID
+1 },
455 {"no-overwrite-dir", NO_OVERWRITE_DIR_OPTION
, 0, 0,
456 N_("preserve metadata of existing directories"), GRID
+1 },
457 {"overwrite-dir", OVERWRITE_DIR_OPTION
, 0, 0,
458 N_("overwrite metadata of existing directories when extracting (default)"),
464 N_("Select output stream:"), GRID
},
466 {"to-stdout", 'O', 0, 0,
467 N_("extract files to standard output"), GRID
+1 },
468 {"to-command", TO_COMMAND_OPTION
, N_("COMMAND"), 0,
469 N_("pipe extracted files to another program"), GRID
+1 },
470 {"ignore-command-error", IGNORE_COMMAND_ERROR_OPTION
, 0, 0,
471 N_("ignore exit codes of children"), GRID
+1 },
472 {"no-ignore-command-error", NO_IGNORE_COMMAND_ERROR_OPTION
, 0, 0,
473 N_("treat non-zero exit codes of children as error"), GRID
+1 },
478 N_("Handling of file attributes:"), GRID
},
480 {"owner", OWNER_OPTION
, N_("NAME"), 0,
481 N_("force NAME as owner for added files"), GRID
+1 },
482 {"group", GROUP_OPTION
, N_("NAME"), 0,
483 N_("force NAME as group for added files"), GRID
+1 },
484 {"mtime", MTIME_OPTION
, N_("DATE-OR-FILE"), 0,
485 N_("set mtime for added files from DATE-OR-FILE"), GRID
+1 },
486 {"mode", MODE_OPTION
, N_("CHANGES"), 0,
487 N_("force (symbolic) mode CHANGES for added files"), GRID
+1 },
488 {"atime-preserve", ATIME_PRESERVE_OPTION
,
489 N_("METHOD"), OPTION_ARG_OPTIONAL
,
490 N_("preserve access times on dumped files, either by restoring the times"
491 " after reading (METHOD='replace'; default) or by not setting the times"
492 " in the first place (METHOD='system')"), GRID
+1 },
494 N_("don't extract file modified time"), GRID
+1 },
495 {"same-owner", SAME_OWNER_OPTION
, 0, 0,
496 N_("try extracting files with the same ownership as exists in the archive (default for superuser)"), GRID
+1 },
497 {"no-same-owner", NO_SAME_OWNER_OPTION
, 0, 0,
498 N_("extract files as yourself (default for ordinary users)"), GRID
+1 },
499 {"numeric-owner", NUMERIC_OWNER_OPTION
, 0, 0,
500 N_("always use numbers for user/group names"), GRID
+1 },
501 {"preserve-permissions", 'p', 0, 0,
502 N_("extract information about file permissions (default for superuser)"),
504 {"same-permissions", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
505 {"no-same-permissions", NO_SAME_PERMISSIONS_OPTION
, 0, 0,
506 N_("apply the user's umask when extracting permissions from the archive (default for ordinary users)"), GRID
+1 },
507 {"preserve-order", 's', 0, 0,
508 N_("sort names to extract to match archive"), GRID
+1 },
509 {"same-order", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
510 {"preserve", PRESERVE_OPTION
, 0, 0,
511 N_("same as both -p and -s"), GRID
+1 },
512 {"delay-directory-restore", DELAY_DIRECTORY_RESTORE_OPTION
, 0, 0,
513 N_("delay setting modification times and permissions of extracted"
514 " directories until the end of extraction"), GRID
+1 },
515 {"no-delay-directory-restore", NO_DELAY_DIRECTORY_RESTORE_OPTION
, 0, 0,
516 N_("cancel the effect of --delay-directory-restore option"), GRID
+1 },
521 N_("Device selection and switching:"), GRID
},
523 {"file", 'f', N_("ARCHIVE"), 0,
524 N_("use archive file or device ARCHIVE"), GRID
+1 },
525 {"force-local", FORCE_LOCAL_OPTION
, 0, 0,
526 N_("archive file is local even if it has a colon"), GRID
+1 },
527 {"rmt-command", RMT_COMMAND_OPTION
, N_("COMMAND"), 0,
528 N_("use given rmt COMMAND instead of rmt"), GRID
+1 },
529 {"rsh-command", RSH_COMMAND_OPTION
, N_("COMMAND"), 0,
530 N_("use remote COMMAND instead of rsh"), GRID
+1 },
532 {"-[0-7][lmh]", 0, NULL
, OPTION_DOC
, /* It is OK, since `name' will never be
534 N_("specify drive and density"), GRID
+1 },
536 {NULL
, '0', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
537 {NULL
, '1', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
538 {NULL
, '2', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
539 {NULL
, '3', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
540 {NULL
, '4', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
541 {NULL
, '5', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
542 {NULL
, '6', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
543 {NULL
, '7', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
544 {NULL
, '8', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
545 {NULL
, '9', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
547 {"multi-volume", 'M', 0, 0,
548 N_("create/list/extract multi-volume archive"), GRID
+1 },
549 {"tape-length", 'L', N_("NUMBER"), 0,
550 N_("change tape after writing NUMBER x 1024 bytes"), GRID
+1 },
551 {"info-script", 'F', N_("NAME"), 0,
552 N_("run script at end of each tape (implies -M)"), GRID
+1 },
553 {"new-volume-script", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
554 {"volno-file", VOLNO_FILE_OPTION
, N_("FILE"), 0,
555 N_("use/update the volume number in FILE"), GRID
+1 },
560 N_("Device blocking:"), GRID
},
562 {"blocking-factor", 'b', N_("BLOCKS"), 0,
563 N_("BLOCKS x 512 bytes per record"), GRID
+1 },
564 {"record-size", RECORD_SIZE_OPTION
, N_("NUMBER"), 0,
565 N_("NUMBER of bytes per record, multiple of 512"), GRID
+1 },
566 {"ignore-zeros", 'i', 0, 0,
567 N_("ignore zeroed blocks in archive (means EOF)"), GRID
+1 },
568 {"read-full-records", 'B', 0, 0,
569 N_("reblock as we read (for 4.2BSD pipes)"), GRID
+1 },
574 N_("Archive format selection:"), GRID
},
576 {"format", 'H', N_("FORMAT"), 0,
577 N_("create archive of the given format"), GRID
+1 },
579 {NULL
, 0, NULL
, 0, N_("FORMAT is one of the following:"), GRID
+2 },
580 {" v7", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("old V7 tar format"),
582 {" oldgnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
583 N_("GNU format as per tar <= 1.12"), GRID
+3 },
584 {" gnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
585 N_("GNU tar 1.13.x format"), GRID
+3 },
586 {" ustar", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
587 N_("POSIX 1003.1-1988 (ustar) format"), GRID
+3 },
588 {" pax", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
589 N_("POSIX 1003.1-2001 (pax) format"), GRID
+3 },
590 {" posix", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("same as pax"), GRID
+3 },
592 {"old-archive", OLD_ARCHIVE_OPTION
, 0, 0, /* FIXME */
593 N_("same as --format=v7"), GRID
+8 },
594 {"portability", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
595 {"posix", POSIX_OPTION
, 0, 0,
596 N_("same as --format=posix"), GRID
+8 },
597 {"pax-option", PAX_OPTION
, N_("keyword[[:]=value][,keyword[[:]=value]]..."), 0,
598 N_("control pax keywords"), GRID
+8 },
599 {"label", 'V', N_("TEXT"), 0,
600 N_("create archive with volume name TEXT; at list/extract time, use TEXT as a globbing pattern for volume name"), GRID
+8 },
605 N_("Compression options:"), GRID
},
606 {"auto-compress", 'a', 0, 0,
607 N_("use archive suffix to determine the compression program"), GRID
+1 },
608 {"no-auto-compress", NO_AUTO_COMPRESS_OPTION
, 0, 0,
609 N_("do not use archive suffix to determine the compression program"),
612 N_("filter the archive through bzip2"), GRID
+1 },
614 N_("filter the archive through gzip"), GRID
+1 },
615 {"gunzip", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
616 {"ungzip", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
617 {"compress", 'Z', 0, 0,
618 N_("filter the archive through compress"), GRID
+1 },
619 {"uncompress", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
620 {"lzma", LZMA_OPTION
, 0, 0,
621 N_("filter the archive through lzma"), GRID
+1 },
622 {"lzop", LZOP_OPTION
, 0, 0,
623 N_("filter the archive through lzop"), GRID
+8 },
625 N_("filter the archive through xz"), GRID
+8 },
626 {"use-compress-program", 'I', N_("PROG"), 0,
627 N_("filter through PROG (must accept -d)"), GRID
+1 },
632 N_("Local file selection:"), GRID
},
634 {"add-file", ARGP_KEY_ARG
, N_("FILE"), 0,
635 N_("add given FILE to the archive (useful if its name starts with a dash)"), GRID
+1 },
636 {"directory", 'C', N_("DIR"), 0,
637 N_("change to directory DIR"), GRID
+1 },
638 {"files-from", 'T', N_("FILE"), 0,
639 N_("get names to extract or create from FILE"), GRID
+1 },
640 {"null", NULL_OPTION
, 0, 0,
641 N_("-T reads null-terminated names, disable -C"), GRID
+1 },
642 {"no-null", NO_NULL_OPTION
, 0, 0,
643 N_("disable the effect of the previous --null option"), GRID
+1 },
644 {"unquote", UNQUOTE_OPTION
, 0, 0,
645 N_("unquote filenames read with -T (default)"), GRID
+1 },
646 {"no-unquote", NO_UNQUOTE_OPTION
, 0, 0,
647 N_("do not unquote filenames read with -T"), GRID
+1 },
648 {"exclude", EXCLUDE_OPTION
, N_("PATTERN"), 0,
649 N_("exclude files, given as a PATTERN"), GRID
+1 },
650 {"exclude-from", 'X', N_("FILE"), 0,
651 N_("exclude patterns listed in FILE"), GRID
+1 },
652 {"exclude-caches", EXCLUDE_CACHES_OPTION
, 0, 0,
653 N_("exclude contents of directories containing CACHEDIR.TAG, "
654 "except for the tag file itself"), GRID
+1 },
655 {"exclude-caches-under", EXCLUDE_CACHES_UNDER_OPTION
, 0, 0,
656 N_("exclude everything under directories containing CACHEDIR.TAG"),
658 {"exclude-caches-all", EXCLUDE_CACHES_ALL_OPTION
, 0, 0,
659 N_("exclude directories containing CACHEDIR.TAG"), GRID
+1 },
660 {"exclude-tag", EXCLUDE_TAG_OPTION
, N_("FILE"), 0,
661 N_("exclude contents of directories containing FILE, except"
662 " for FILE itself"), GRID
+1 },
663 {"exclude-tag-under", EXCLUDE_TAG_UNDER_OPTION
, N_("FILE"), 0,
664 N_("exclude everything under directories containing FILE"), GRID
+1 },
665 {"exclude-tag-all", EXCLUDE_TAG_ALL_OPTION
, N_("FILE"), 0,
666 N_("exclude directories containing FILE"), GRID
+1 },
667 {"exclude-vcs", EXCLUDE_VCS_OPTION
, NULL
, 0,
668 N_("exclude version control system directories"), GRID
+1 },
669 {"exclude-backups", EXCLUDE_BACKUPS_OPTION
, NULL
, 0,
670 N_("exclude backup and lock files"), GRID
+1 },
671 {"no-recursion", NO_RECURSION_OPTION
, 0, 0,
672 N_("avoid descending automatically in directories"), GRID
+1 },
673 {"one-file-system", ONE_FILE_SYSTEM_OPTION
, 0, 0,
674 N_("stay in local file system when creating archive"), GRID
+1 },
675 {"recursion", RECURSION_OPTION
, 0, 0,
676 N_("recurse into directories (default)"), GRID
+1 },
677 {"absolute-names", 'P', 0, 0,
678 N_("don't strip leading `/'s from file names"), GRID
+1 },
679 {"dereference", 'h', 0, 0,
680 N_("follow symlinks; archive and dump the files they point to"), GRID
+1 },
681 {"hard-dereference", HARD_DEREFERENCE_OPTION
, 0, 0,
682 N_("follow hard links; archive and dump the files they refer to"), GRID
+1 },
683 {"starting-file", 'K', N_("MEMBER-NAME"), 0,
684 N_("begin at member MEMBER-NAME in the archive"), GRID
+1 },
685 {"newer", 'N', N_("DATE-OR-FILE"), 0,
686 N_("only store files newer than DATE-OR-FILE"), GRID
+1 },
687 {"after-date", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
688 {"newer-mtime", NEWER_MTIME_OPTION
, N_("DATE"), 0,
689 N_("compare date and time when data changed only"), GRID
+1 },
690 {"backup", BACKUP_OPTION
, N_("CONTROL"), OPTION_ARG_OPTIONAL
,
691 N_("backup before removal, choose version CONTROL"), GRID
+1 },
692 {"suffix", SUFFIX_OPTION
, N_("STRING"), 0,
693 N_("backup before removal, override usual suffix ('~' unless overridden by environment variable SIMPLE_BACKUP_SUFFIX)"), GRID
+1 },
698 N_("File name transformations:"), GRID
},
699 {"strip-components", STRIP_COMPONENTS_OPTION
, N_("NUMBER"), 0,
700 N_("strip NUMBER leading components from file names on extraction"),
702 {"transform", TRANSFORM_OPTION
, N_("EXPRESSION"), 0,
703 N_("use sed replace EXPRESSION to transform file names"), GRID
+1 },
704 {"xform", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
709 N_("File name matching options (affect both exclude and include patterns):"),
711 {"ignore-case", IGNORE_CASE_OPTION
, 0, 0,
712 N_("ignore case"), GRID
+1 },
713 {"anchored", ANCHORED_OPTION
, 0, 0,
714 N_("patterns match file name start"), GRID
+1 },
715 {"no-anchored", NO_ANCHORED_OPTION
, 0, 0,
716 N_("patterns match after any `/' (default for exclusion)"), GRID
+1 },
717 {"no-ignore-case", NO_IGNORE_CASE_OPTION
, 0, 0,
718 N_("case sensitive matching (default)"), GRID
+1 },
719 {"wildcards", WILDCARDS_OPTION
, 0, 0,
720 N_("use wildcards (default for exclusion)"), GRID
+1 },
721 {"no-wildcards", NO_WILDCARDS_OPTION
, 0, 0,
722 N_("verbatim string matching"), GRID
+1 },
723 {"no-wildcards-match-slash", NO_WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
724 N_("wildcards do not match `/'"), GRID
+1 },
725 {"wildcards-match-slash", WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
726 N_("wildcards match `/' (default for exclusion)"), GRID
+1 },
731 N_("Informative output:"), GRID
},
733 {"verbose", 'v', 0, 0,
734 N_("verbosely list files processed"), GRID
+1 },
735 {"warning", WARNING_OPTION
, N_("KEYWORD"), 0,
736 N_("warning control"), GRID
+1 },
737 {"checkpoint", CHECKPOINT_OPTION
, N_("NUMBER"), OPTION_ARG_OPTIONAL
,
738 N_("display progress messages every NUMBERth record (default 10)"),
740 {"checkpoint-action", CHECKPOINT_ACTION_OPTION
, N_("ACTION"), 0,
741 N_("execute ACTION on each checkpoint"),
743 {"check-links", 'l', 0, 0,
744 N_("print a message if not all links are dumped"), GRID
+1 },
745 {"totals", TOTALS_OPTION
, N_("SIGNAL"), OPTION_ARG_OPTIONAL
,
746 N_("print total bytes after processing the archive; "
747 "with an argument - print total bytes when this SIGNAL is delivered; "
748 "Allowed signals are: SIGHUP, SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; "
749 "the names without SIG prefix are also accepted"), GRID
+1 },
750 {"utc", UTC_OPTION
, 0, 0,
751 N_("print file modification dates in UTC"), GRID
+1 },
752 {"index-file", INDEX_FILE_OPTION
, N_("FILE"), 0,
753 N_("send verbose output to FILE"), GRID
+1 },
754 {"block-number", 'R', 0, 0,
755 N_("show block number within archive with each message"), GRID
+1 },
756 {"interactive", 'w', 0, 0,
757 N_("ask for confirmation for every action"), GRID
+1 },
758 {"confirmation", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
759 {"show-defaults", SHOW_DEFAULTS_OPTION
, 0, 0,
760 N_("show tar defaults"), GRID
+1 },
761 {"show-omitted-dirs", SHOW_OMITTED_DIRS_OPTION
, 0, 0,
762 N_("when listing or extracting, list each directory that does not match search criteria"), GRID
+1 },
763 {"show-transformed-names", SHOW_TRANSFORMED_NAMES_OPTION
, 0, 0,
764 N_("show file or archive names after transformation"),
766 {"show-stored-names", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
767 {"quoting-style", QUOTING_STYLE_OPTION
, N_("STYLE"), 0,
768 N_("set name quoting style; see below for valid STYLE values"), GRID
+1 },
769 {"quote-chars", QUOTE_CHARS_OPTION
, N_("STRING"), 0,
770 N_("additionally quote characters from STRING"), GRID
+1 },
771 {"no-quote-chars", NO_QUOTE_CHARS_OPTION
, N_("STRING"), 0,
772 N_("disable quoting for characters from STRING"), GRID
+1 },
777 N_("Compatibility options:"), GRID
},
780 N_("when creating, same as --old-archive; when extracting, same as --no-same-owner"), GRID
+1 },
785 N_("Other options:"), GRID
},
787 {"restrict", RESTRICT_OPTION
, 0, 0,
788 N_("disable use of some potentially harmful options"), -1 },
794 static char const *const atime_preserve_args
[] =
796 "replace", "system", NULL
799 static enum atime_preserve
const atime_preserve_types
[] =
801 replace_atime_preserve
, system_atime_preserve
804 /* Make sure atime_preserve_types has as much entries as atime_preserve_args
805 (minus 1 for NULL guard) */
806 ARGMATCH_VERIFY (atime_preserve_args
, atime_preserve_types
);
808 /* Wildcard matching settings */
811 default_wildcards
, /* For exclusion == enable_wildcards,
812 for inclusion == disable_wildcards */
817 struct tar_args
/* Variables used during option parsing */
819 struct textual_date
*textual_date
; /* Keeps the arguments to --newer-mtime
820 and/or --date option if they are
822 enum wildcards wildcards
; /* Wildcard settings (--wildcards/
824 int matching_flags
; /* exclude_fnmatch options */
825 int include_anchored
; /* Pattern anchoring options used for
827 bool o_option
; /* True if -o option was given */
828 bool pax_option
; /* True if --pax-option was given */
829 char const *backup_suffix_string
; /* --suffix option argument */
830 char const *version_control_string
; /* --backup option argument */
831 bool input_files
; /* True if some input files where given */
832 int compress_autodetect
; /* True if compression autodetection should
833 be attempted when creating archives */
837 #define MAKE_EXCL_OPTIONS(args) \
838 ((((args)->wildcards != disable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
839 | (args)->matching_flags \
842 #define MAKE_INCL_OPTIONS(args) \
843 ((((args)->wildcards == enable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
844 | (args)->include_anchored \
845 | (args)->matching_flags \
848 static char const * const vcs_file_table
[] = {
880 static char const * const backup_file_table
[] = {
888 add_exclude_array (char const * const * fv
)
892 for (i
= 0; fv
[i
]; i
++)
893 add_exclude (excluded
, fv
[i
], 0);
898 # define DECL_SHOW_DEFAULT_SETTINGS(stream, printer) \
901 "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s", \
902 archive_format_string (DEFAULT_ARCHIVE_FORMAT), \
903 DEFAULT_ARCHIVE, DEFAULT_BLOCKING, \
904 quoting_style_args[DEFAULT_QUOTING_STYLE], \
905 DEFAULT_RMT_COMMAND); \
906 printer (stream, " --rsh-command=%s", REMOTE_SHELL); \
907 printer (stream, "\n"); \
910 # define DECL_SHOW_DEFAULT_SETTINGS(stream, printer) \
913 "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s", \
914 archive_format_string (DEFAULT_ARCHIVE_FORMAT), \
915 DEFAULT_ARCHIVE, DEFAULT_BLOCKING, \
916 quoting_style_args[DEFAULT_QUOTING_STYLE], \
917 DEFAULT_RMT_COMMAND); \
918 printer (stream, "\n"); \
923 show_default_settings (FILE *fp
)
924 DECL_SHOW_DEFAULT_SETTINGS(fp
, fprintf
)
927 show_default_settings_fs (argp_fmtstream_t fs
)
928 DECL_SHOW_DEFAULT_SETTINGS(fs
, argp_fmtstream_printf
)
931 set_subcommand_option (enum subcommand subcommand
)
933 if (subcommand_option
!= UNKNOWN_SUBCOMMAND
934 && subcommand_option
!= subcommand
)
936 _("You may not specify more than one `-Acdtrux' option")));
938 subcommand_option
= subcommand
;
942 set_use_compress_program_option (const char *string
)
944 if (use_compress_program_option
945 && strcmp (use_compress_program_option
, string
) != 0)
946 USAGE_ERROR ((0, 0, _("Conflicting compression options")));
948 use_compress_program_option
= string
;
955 print_total_stats ();
956 #ifndef HAVE_SIGACTION
957 signal (signo
, sigstat
);
962 stat_on_signal (int signo
)
964 #ifdef HAVE_SIGACTION
965 struct sigaction act
;
966 act
.sa_handler
= sigstat
;
967 sigemptyset (&act
.sa_mask
);
969 sigaction (signo
, &act
, NULL
);
971 signal (signo
, sigstat
);
976 set_stat_signal (const char *name
)
983 { "SIGUSR1", SIGUSR1
},
985 { "SIGUSR2", SIGUSR2
},
987 { "SIGHUP", SIGHUP
},
989 { "SIGINT", SIGINT
},
991 { "SIGQUIT", SIGQUIT
},
996 for (p
= sigtab
; p
< sigtab
+ sizeof (sigtab
) / sizeof (sigtab
[0]); p
++)
997 if (strcmp (p
->name
, name
) == 0)
999 stat_on_signal (p
->signo
);
1002 FATAL_ERROR ((0, 0, _("Unknown signal name: %s"), name
));
1008 struct textual_date
*next
;
1009 struct timespec
*ts
;
1015 get_date_or_file (struct tar_args
*args
, const char *option
,
1016 const char *str
, struct timespec
*ts
)
1018 if (FILE_SYSTEM_PREFIX_LEN (str
) != 0
1023 if (deref_stat (dereference_option
, str
, &st
) != 0)
1026 USAGE_ERROR ((0, 0, _("Date sample file not found")));
1028 *ts
= get_stat_mtime (&st
);
1032 if (! get_date (ts
, str
, NULL
))
1034 WARN ((0, 0, _("Substituting %s for unknown date format %s"),
1035 tartime (*ts
, false), quote (str
)));
1040 struct textual_date
*p
= xmalloc (sizeof (*p
));
1044 p
->next
= args
->textual_date
;
1045 args
->textual_date
= p
;
1051 report_textual_dates (struct tar_args
*args
)
1053 struct textual_date
*p
;
1054 for (p
= args
->textual_date
; p
; )
1056 struct textual_date
*next
= p
->next
;
1057 char const *treated_as
= tartime (*p
->ts
, true);
1058 if (strcmp (p
->date
, treated_as
) != 0)
1059 WARN ((0, 0, _("Option %s: Treating date `%s' as %s"),
1060 p
->option
, p
->date
, treated_as
));
1068 /* Either NL or NUL, as decided by the --null option. */
1069 static char filename_terminator
;
1071 enum read_file_list_state
/* Result of reading file name from the list file */
1073 file_list_success
, /* OK, name read successfully */
1074 file_list_end
, /* End of list file */
1075 file_list_zero
, /* Zero separator encountered where it should not */
1076 file_list_skip
/* Empty (zero-length) entry encountered, skip it */
1079 /* Read from FP a sequence of characters up to TERM and put them
1082 static enum read_file_list_state
1083 read_name_from_file (FILE *fp
, struct obstack
*stk
, int term
)
1088 for (c
= getc (fp
); c
!= EOF
&& c
!= term
; c
= getc (fp
))
1092 /* We have read a zero separator. The file possibly is
1094 return file_list_zero
;
1096 obstack_1grow (stk
, c
);
1100 if (counter
== 0 && c
!= EOF
)
1101 return file_list_skip
;
1103 obstack_1grow (stk
, 0);
1105 return (counter
== 0 && c
== EOF
) ? file_list_end
: file_list_success
;
1109 static bool files_from_option
; /* When set, tar will not refuse to create
1111 static struct obstack argv_stk
; /* Storage for additional command line options
1112 read using -T option */
1114 /* Prevent recursive inclusion of the same file */
1117 struct file_id_list
*next
;
1122 static struct file_id_list
*file_id_list
;
1125 add_file_id (const char *filename
)
1127 struct file_id_list
*p
;
1130 if (stat (filename
, &st
))
1131 stat_fatal (filename
);
1132 for (p
= file_id_list
; p
; p
= p
->next
)
1133 if (p
->ino
== st
.st_ino
&& p
->dev
== st
.st_dev
)
1135 FATAL_ERROR ((0, 0, _("%s: file list already read"),
1136 quotearg_colon (filename
)));
1138 p
= xmalloc (sizeof *p
);
1139 p
->next
= file_id_list
;
1145 /* Default density numbers for [0-9][lmh] device specifications */
1147 #ifndef LOW_DENSITY_NUM
1148 # define LOW_DENSITY_NUM 0
1151 #ifndef MID_DENSITY_NUM
1152 # define MID_DENSITY_NUM 8
1155 #ifndef HIGH_DENSITY_NUM
1156 # define HIGH_DENSITY_NUM 16
1160 update_argv (const char *filename
, struct argp_state
*state
)
1163 size_t count
= 0, i
;
1167 bool is_stdin
= false;
1168 enum read_file_list_state read_state
;
1169 int term
= filename_terminator
;
1171 if (!strcmp (filename
, "-"))
1174 request_stdin ("-T");
1179 add_file_id (filename
);
1180 if ((fp
= fopen (filename
, "r")) == NULL
)
1181 open_fatal (filename
);
1184 while ((read_state
= read_name_from_file (fp
, &argv_stk
, term
))
1189 case file_list_success
:
1193 case file_list_end
: /* won't happen, just to pacify gcc */
1196 case file_list_zero
:
1200 WARNOPT (WARN_FILENAME_WITH_NULS
,
1201 (0, 0, N_("%s: file name read contains nul character"),
1202 quotearg_colon (filename
)));
1204 /* Prepare new stack contents */
1205 size
= obstack_object_size (&argv_stk
);
1206 p
= obstack_finish (&argv_stk
);
1207 for (; size
> 0; size
--, p
++)
1209 obstack_1grow (&argv_stk
, *p
);
1211 obstack_1grow (&argv_stk
, '\n');
1212 obstack_1grow (&argv_stk
, 0);
1214 /* Read rest of files using new filename terminator */
1219 case file_list_skip
:
1230 start
= obstack_finish (&argv_stk
);
1233 for (p
= start
; *p
; p
+= strlen (p
) + 1)
1237 new_argc
= state
->argc
+ count
;
1238 new_argv
= xmalloc (sizeof (state
->argv
[0]) * (new_argc
+ 1));
1239 memcpy (new_argv
, state
->argv
, sizeof (state
->argv
[0]) * (state
->argc
+ 1));
1240 state
->argv
= new_argv
;
1241 memmove (&state
->argv
[state
->next
+ count
], &state
->argv
[state
->next
],
1242 (state
->argc
- state
->next
+ 1) * sizeof (state
->argv
[0]));
1244 state
->argc
= new_argc
;
1246 for (i
= state
->next
, p
= start
; *p
; p
+= strlen (p
) + 1, i
++)
1248 if (term
== 0 && p
[0] == '-')
1249 state
->argv
[i
++] = "--add-file";
1256 tar_help (struct argp_state
*state
)
1258 argp_fmtstream_t fs
;
1259 state
->flags
|= ARGP_NO_EXIT
;
1260 argp_state_help (state
, state
->out_stream
,
1261 ARGP_HELP_STD_HELP
& ~ARGP_HELP_BUG_ADDR
);
1262 /* FIXME: use struct uparams.rmargin (from argp-help.c) instead of 79 */
1263 fs
= argp_make_fmtstream (state
->out_stream
, 0, 79, 0);
1265 argp_fmtstream_printf (fs
, "\n%s\n\n",
1266 _("Valid arguments for --quoting-style options are:"));
1267 tar_list_quoting_styles (fs
, " ");
1269 argp_fmtstream_puts (fs
, _("\n*This* tar defaults to:\n"));
1270 show_default_settings_fs (fs
);
1271 argp_fmtstream_putc (fs
, '\n');
1272 argp_fmtstream_printf (fs
, _("Report bugs to %s.\n"),
1273 argp_program_bug_address
);
1274 argp_fmtstream_free (fs
);
1278 parse_opt (int key
, char *arg
, struct argp_state
*state
)
1280 struct tar_args
*args
= state
->input
;
1285 /* File name or non-parsed option, because of ARGP_IN_ORDER */
1286 name_add_name (arg
, MAKE_INCL_OPTIONS (args
));
1287 args
->input_files
= true;
1291 set_subcommand_option (CAT_SUBCOMMAND
);
1295 args
->compress_autodetect
= true;
1298 case NO_AUTO_COMPRESS_OPTION
:
1299 args
->compress_autodetect
= false;
1305 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1306 && u
== (blocking_factor
= u
)
1307 && 0 < blocking_factor
1308 && u
== (record_size
= u
* BLOCKSIZE
) / BLOCKSIZE
))
1309 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1310 _("Invalid blocking factor")));
1315 /* Try to reblock input records. For reading 4.2BSD pipes. */
1317 /* It would surely make sense to exchange -B and -R, but it seems
1318 that -B has been used for a long while in Sun tar and most
1319 BSD-derived systems. This is a consequence of the block/record
1320 terminology confusion. */
1322 read_full_records_option
= true;
1326 set_subcommand_option (CREATE_SUBCOMMAND
);
1334 set_subcommand_option (DIFF_SUBCOMMAND
);
1338 if (archive_names
== allocated_archive_names
)
1339 archive_name_array
= x2nrealloc (archive_name_array
,
1340 &allocated_archive_names
,
1341 sizeof (archive_name_array
[0]));
1343 archive_name_array
[archive_names
++] = arg
;
1347 /* Since -F is only useful with -M, make it implied. Run this
1348 script at the end of each tape. */
1350 info_script_option
= arg
;
1351 multi_volume_option
= true;
1355 listed_incremental_option
= arg
;
1356 after_date_option
= true;
1360 /* We are making an incremental dump (FIXME: are we?); save
1361 directories at the beginning of the archive, and include in each
1362 directory its contents. */
1364 incremental_option
= true;
1368 /* Follow symbolic links. */
1369 dereference_option
= true;
1372 case HARD_DEREFERENCE_OPTION
:
1373 hard_dereference_option
= true;
1377 /* Ignore zero blocks (eofs). This can't be the default,
1378 because Unix tar writes two blocks of zeros, then pads out
1379 the record with garbage. */
1381 ignore_zeros_option
= true;
1385 set_use_compress_program_option ("bzip2");
1389 set_use_compress_program_option ("xz");
1393 /* Don't replace existing files. */
1394 old_files_option
= KEEP_OLD_FILES
;
1398 starting_file_option
= true;
1399 addname (arg
, 0, true, NULL
);
1402 case ONE_FILE_SYSTEM_OPTION
:
1403 /* When dumping directories, don't dump files/subdirectories
1404 that are on other filesystems. */
1405 one_file_system_option
= true;
1409 check_links_option
= 1;
1415 if (xstrtoumax (arg
, 0, 10, &u
, "") != LONGINT_OK
)
1416 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1417 _("Invalid tape length")));
1418 tape_length_option
= 1024 * (tarlong
) u
;
1419 multi_volume_option
= true;
1426 incremental_level
= strtoul (arg
, &p
, 10);
1428 USAGE_ERROR ((0, 0, _("Invalid incremental level value")));
1433 set_use_compress_program_option ("lzma");
1437 set_use_compress_program_option ("lzop");
1441 touch_option
= true;
1445 /* Make multivolume archive: when we can't write any more into
1446 the archive, re-open it, and continue writing. */
1448 multi_volume_option
= true;
1452 get_date_or_file (args
, "--mtime", arg
, &mtime_option
);
1453 set_mtime_option
= true;
1460 case NO_SEEK_OPTION
:
1465 after_date_option
= true;
1468 case NEWER_MTIME_OPTION
:
1469 if (NEWER_OPTION_INITIALIZED (newer_mtime_option
))
1470 USAGE_ERROR ((0, 0, _("More than one threshold date")));
1471 get_date_or_file (args
,
1472 key
== NEWER_MTIME_OPTION
? "--newer-mtime"
1473 : "--after-date", arg
, &newer_mtime_option
);
1477 args
->o_option
= true;
1481 to_stdout_option
= true;
1485 same_permissions_option
= true;
1489 absolute_names_option
= true;
1493 set_subcommand_option (APPEND_SUBCOMMAND
);
1497 /* Print block numbers for debugging bad tar archives. */
1499 /* It would surely make sense to exchange -B and -R, but it seems
1500 that -B has been used for a long while in Sun tar and most
1501 BSD-derived systems. This is a consequence of the block/record
1502 terminology confusion. */
1504 block_number_option
= true;
1508 /* Names to extract are sorted. */
1510 same_order_option
= true;
1514 sparse_option
= true;
1517 case SPARSE_VERSION_OPTION
:
1518 sparse_option
= true;
1521 tar_sparse_major
= strtoul (arg
, &p
, 10);
1525 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1526 tar_sparse_minor
= strtoul (p
+ 1, &p
, 10);
1528 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1534 set_subcommand_option (LIST_SUBCOMMAND
);
1538 case TEST_LABEL_OPTION
:
1539 set_subcommand_option (LIST_SUBCOMMAND
);
1540 test_label_option
= true;
1544 update_argv (arg
, state
);
1545 /* Indicate we've been given -T option. This is for backward
1546 compatibility only, so that `tar cfT archive /dev/null will
1548 files_from_option
= true;
1552 set_subcommand_option (UPDATE_SUBCOMMAND
);
1556 old_files_option
= UNLINK_FIRST_OLD_FILES
;
1565 warning_option
|= WARN_VERBOSE_WARNINGS
;
1569 volume_label_option
= arg
;
1573 interactive_option
= true;
1577 verify_option
= true;
1581 set_subcommand_option (EXTRACT_SUBCOMMAND
);
1585 if (add_exclude_file (add_exclude
, excluded
, arg
,
1586 MAKE_EXCL_OPTIONS (args
), '\n')
1590 FATAL_ERROR ((0, e
, "%s", quotearg_colon (arg
)));
1595 set_use_compress_program_option ("gzip");
1599 set_use_compress_program_option ("compress");
1602 case ANCHORED_OPTION
:
1603 args
->matching_flags
|= EXCLUDE_ANCHORED
;
1606 case ATIME_PRESERVE_OPTION
:
1607 atime_preserve_option
=
1609 ? XARGMATCH ("--atime-preserve", arg
,
1610 atime_preserve_args
, atime_preserve_types
)
1611 : replace_atime_preserve
);
1612 if (! O_NOATIME
&& atime_preserve_option
== system_atime_preserve
)
1614 _("--atime-preserve='system' is not supported"
1615 " on this platform")));
1618 case CHECK_DEVICE_OPTION
:
1619 check_device_option
= true;
1622 case NO_CHECK_DEVICE_OPTION
:
1623 check_device_option
= false;
1626 case CHECKPOINT_OPTION
:
1633 checkpoint_compile_action (".");
1636 checkpoint_option
= strtoul (arg
, &p
, 0);
1639 _("--checkpoint value is not an integer")));
1642 checkpoint_option
= DEFAULT_CHECKPOINT
;
1645 case CHECKPOINT_ACTION_OPTION
:
1646 checkpoint_compile_action (arg
);
1650 backup_option
= true;
1652 args
->version_control_string
= arg
;
1655 case DELAY_DIRECTORY_RESTORE_OPTION
:
1656 delay_directory_restore_option
= true;
1659 case NO_DELAY_DIRECTORY_RESTORE_OPTION
:
1660 delay_directory_restore_option
= false;
1664 set_subcommand_option (DELETE_SUBCOMMAND
);
1667 case EXCLUDE_BACKUPS_OPTION
:
1668 add_exclude_array (backup_file_table
);
1671 case EXCLUDE_OPTION
:
1672 add_exclude (excluded
, arg
, MAKE_EXCL_OPTIONS (args
));
1675 case EXCLUDE_CACHES_OPTION
:
1676 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_contents
,
1680 case EXCLUDE_CACHES_UNDER_OPTION
:
1681 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_under
,
1685 case EXCLUDE_CACHES_ALL_OPTION
:
1686 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_all
,
1690 case EXCLUDE_TAG_OPTION
:
1691 add_exclusion_tag (arg
, exclusion_tag_contents
, NULL
);
1694 case EXCLUDE_TAG_UNDER_OPTION
:
1695 add_exclusion_tag (arg
, exclusion_tag_under
, NULL
);
1698 case EXCLUDE_TAG_ALL_OPTION
:
1699 add_exclusion_tag (arg
, exclusion_tag_all
, NULL
);
1702 case EXCLUDE_VCS_OPTION
:
1703 add_exclude_array (vcs_file_table
);
1706 case FORCE_LOCAL_OPTION
:
1707 force_local_option
= true;
1711 set_archive_format (arg
);
1714 case INDEX_FILE_OPTION
:
1715 index_file_name
= arg
;
1718 case IGNORE_CASE_OPTION
:
1719 args
->matching_flags
|= FNM_CASEFOLD
;
1722 case IGNORE_COMMAND_ERROR_OPTION
:
1723 ignore_command_error_option
= true;
1726 case IGNORE_FAILED_READ_OPTION
:
1727 ignore_failed_read_option
= true;
1730 case KEEP_NEWER_FILES_OPTION
:
1731 old_files_option
= KEEP_NEWER_FILES
;
1735 if (! (strlen (arg
) < GNAME_FIELD_SIZE
1736 && gname_to_gid (arg
, &group_option
)))
1739 if (xstrtoumax (arg
, 0, 10, &g
, "") == LONGINT_OK
1743 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1744 _("%s: Invalid group")));
1749 mode_option
= mode_compile (arg
);
1751 FATAL_ERROR ((0, 0, _("Invalid mode given on option")));
1752 initial_umask
= umask (0);
1753 umask (initial_umask
);
1756 case NO_ANCHORED_OPTION
:
1757 args
->include_anchored
= 0; /* Clear the default for comman line args */
1758 args
->matching_flags
&= ~ EXCLUDE_ANCHORED
;
1761 case NO_IGNORE_CASE_OPTION
:
1762 args
->matching_flags
&= ~ FNM_CASEFOLD
;
1765 case NO_IGNORE_COMMAND_ERROR_OPTION
:
1766 ignore_command_error_option
= false;
1769 case NO_OVERWRITE_DIR_OPTION
:
1770 old_files_option
= NO_OVERWRITE_DIR_OLD_FILES
;
1773 case NO_QUOTE_CHARS_OPTION
:
1775 set_char_quoting (NULL
, *arg
, 0);
1778 case NO_WILDCARDS_OPTION
:
1779 args
->wildcards
= disable_wildcards
;
1782 case NO_WILDCARDS_MATCH_SLASH_OPTION
:
1783 args
->matching_flags
|= FNM_FILE_NAME
;
1787 filename_terminator
= '\0';
1790 case NO_NULL_OPTION
:
1791 filename_terminator
= '\n';
1794 case NUMERIC_OWNER_OPTION
:
1795 numeric_owner_option
= true;
1798 case OCCURRENCE_OPTION
:
1800 occurrence_option
= 1;
1804 if (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
)
1805 occurrence_option
= u
;
1807 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1808 _("Invalid number")));
1812 case OVERWRITE_DIR_OPTION
:
1813 old_files_option
= DEFAULT_OLD_FILES
;
1816 case OVERWRITE_OPTION
:
1817 old_files_option
= OVERWRITE_OLD_FILES
;
1821 if (! (strlen (arg
) < UNAME_FIELD_SIZE
1822 && uname_to_uid (arg
, &owner_option
)))
1825 if (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1829 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1830 _("Invalid owner")));
1834 case QUOTE_CHARS_OPTION
:
1836 set_char_quoting (NULL
, *arg
, 1);
1839 case QUOTING_STYLE_OPTION
:
1840 tar_set_quoting_style (arg
);
1844 args
->pax_option
= true;
1845 xheader_set_option (arg
);
1849 set_archive_format ("posix");
1852 case PRESERVE_OPTION
:
1853 /* FIXME: What it is good for? */
1854 same_permissions_option
= true;
1855 same_order_option
= true;
1856 WARN ((0, 0, _("The --preserve option is deprecated, "
1857 "use --preserve-permissions --preserve-order instead")));
1860 case RECORD_SIZE_OPTION
:
1863 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1864 && u
== (size_t) u
))
1865 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1866 _("Invalid record size")));
1868 if (record_size
% BLOCKSIZE
!= 0)
1869 USAGE_ERROR ((0, 0, _("Record size must be a multiple of %d."),
1871 blocking_factor
= record_size
/ BLOCKSIZE
;
1875 case RECURSIVE_UNLINK_OPTION
:
1876 recursive_unlink_option
= true;
1879 case REMOVE_FILES_OPTION
:
1880 remove_files_option
= true;
1883 case RESTRICT_OPTION
:
1884 restrict_option
= true;
1887 case RMT_COMMAND_OPTION
:
1891 case RSH_COMMAND_OPTION
:
1892 rsh_command_option
= arg
;
1895 case SHOW_DEFAULTS_OPTION
:
1896 show_default_settings (stdout
);
1900 case STRIP_COMPONENTS_OPTION
:
1903 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1904 && u
== (size_t) u
))
1905 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1906 _("Invalid number of elements")));
1907 strip_name_components
= u
;
1911 case SHOW_OMITTED_DIRS_OPTION
:
1912 show_omitted_dirs_option
= true;
1915 case SHOW_TRANSFORMED_NAMES_OPTION
:
1916 show_transformed_names_option
= true;
1920 backup_option
= true;
1921 args
->backup_suffix_string
= arg
;
1924 case TO_COMMAND_OPTION
:
1925 if (to_command_option
)
1926 USAGE_ERROR ((0, 0, _("Only one --to-command option allowed")));
1927 to_command_option
= arg
;
1932 set_stat_signal (arg
);
1934 totals_option
= true;
1937 case TRANSFORM_OPTION
:
1938 set_transform_expr (arg
);
1942 set_use_compress_program_option (arg
);
1945 case VOLNO_FILE_OPTION
:
1946 volno_file_option
= arg
;
1949 case WILDCARDS_OPTION
:
1950 args
->wildcards
= enable_wildcards
;
1953 case WILDCARDS_MATCH_SLASH_OPTION
:
1954 args
->matching_flags
&= ~ FNM_FILE_NAME
;
1957 case NO_RECURSION_OPTION
:
1958 recursion_option
= 0;
1961 case NO_SAME_OWNER_OPTION
:
1962 same_owner_option
= -1;
1965 case NO_SAME_PERMISSIONS_OPTION
:
1966 same_permissions_option
= -1;
1969 case RECURSION_OPTION
:
1970 recursion_option
= FNM_LEADING_DIR
;
1973 case SAME_OWNER_OPTION
:
1974 same_owner_option
= 1;
1977 case UNQUOTE_OPTION
:
1978 unquote_option
= true;
1981 case NO_UNQUOTE_OPTION
:
1982 unquote_option
= false;
1985 case WARNING_OPTION
:
1986 set_warning_option (arg
);
1998 #ifdef DEVICE_PREFIX
2000 int device
= key
- '0';
2002 static char buf
[sizeof DEVICE_PREFIX
+ 10];
2006 argp_error (state
, _("Malformed density argument: %s"), quote (arg
));
2008 strcpy (buf
, DEVICE_PREFIX
);
2009 cursor
= buf
+ strlen (buf
);
2011 #ifdef DENSITY_LETTER
2013 sprintf (cursor
, "%d%c", device
, arg
[0]);
2015 #else /* not DENSITY_LETTER */
2020 device
+= LOW_DENSITY_NUM
;
2024 device
+= MID_DENSITY_NUM
;
2028 device
+= HIGH_DENSITY_NUM
;
2032 argp_error (state
, _("Unknown density: `%c'"), arg
[0]);
2034 sprintf (cursor
, "%d", device
);
2036 #endif /* not DENSITY_LETTER */
2038 if (archive_names
== allocated_archive_names
)
2039 archive_name_array
= x2nrealloc (archive_name_array
,
2040 &allocated_archive_names
,
2041 sizeof (archive_name_array
[0]));
2042 archive_name_array
[archive_names
++] = xstrdup (buf
);
2046 #else /* not DEVICE_PREFIX */
2049 _("Options `-[0-7][lmh]' not supported by *this* tar"));
2051 #endif /* not DEVICE_PREFIX */
2054 return ARGP_ERR_UNKNOWN
;
2059 static struct argp argp
= {
2072 argp_help (&argp
, stderr
, ARGP_HELP_SEE
, (char*) program_name
);
2077 /* Parse the options for tar. */
2079 static struct argp_option
*
2080 find_argp_option (struct argp_option
*o
, int letter
)
2087 && o
->doc
== NULL
); o
++)
2088 if (o
->key
== letter
)
2093 static const char *tar_authors
[] = {
2100 decode_options (int argc
, char **argv
)
2103 struct tar_args args
;
2105 argp_version_setup ("tar", tar_authors
);
2107 /* Set some default option values. */
2108 args
.textual_date
= NULL
;
2109 args
.wildcards
= default_wildcards
;
2110 args
.matching_flags
= 0;
2111 args
.include_anchored
= EXCLUDE_ANCHORED
;
2112 args
.o_option
= false;
2113 args
.pax_option
= false;
2114 args
.backup_suffix_string
= getenv ("SIMPLE_BACKUP_SUFFIX");
2115 args
.version_control_string
= 0;
2116 args
.input_files
= false;
2117 args
.compress_autodetect
= false;
2119 subcommand_option
= UNKNOWN_SUBCOMMAND
;
2120 archive_format
= DEFAULT_FORMAT
;
2121 blocking_factor
= DEFAULT_BLOCKING
;
2122 record_size
= DEFAULT_BLOCKING
* BLOCKSIZE
;
2123 excluded
= new_exclude ();
2124 newer_mtime_option
.tv_sec
= TYPE_MINIMUM (time_t);
2125 newer_mtime_option
.tv_nsec
= -1;
2126 recursion_option
= FNM_LEADING_DIR
;
2127 unquote_option
= true;
2128 tar_sparse_major
= 1;
2129 tar_sparse_minor
= 0;
2134 check_device_option
= true;
2136 incremental_level
= -1;
2140 /* Convert old-style tar call by exploding option element and rearranging
2141 options accordingly. */
2143 if (argc
> 1 && argv
[1][0] != '-')
2145 int new_argc
; /* argc value for rearranged arguments */
2146 char **new_argv
; /* argv value for rearranged arguments */
2147 char *const *in
; /* cursor into original argv */
2148 char **out
; /* cursor into rearranged argv */
2149 const char *letter
; /* cursor into old option letters */
2150 char buffer
[3]; /* constructed option buffer */
2152 /* Initialize a constructed option. */
2157 /* Allocate a new argument array, and copy program name in it. */
2159 new_argc
= argc
- 1 + strlen (argv
[1]);
2160 new_argv
= xmalloc ((new_argc
+ 1) * sizeof (char *));
2165 /* Copy each old letter option as a separate option, and have the
2166 corresponding argument moved next to it. */
2168 for (letter
= *in
++; *letter
; letter
++)
2170 struct argp_option
*opt
;
2172 buffer
[1] = *letter
;
2173 *out
++ = xstrdup (buffer
);
2174 opt
= find_argp_option (options
, *letter
);
2175 if (opt
&& opt
->arg
)
2177 if (in
< argv
+ argc
)
2180 USAGE_ERROR ((0, 0, _("Old option `%c' requires an argument."),
2185 /* Copy all remaining options. */
2187 while (in
< argv
+ argc
)
2191 /* Replace the old option list by the new one. */
2197 /* Parse all options and non-options as they appear. */
2199 prepend_default_options (getenv ("TAR_OPTIONS"), &argc
, &argv
);
2201 if (argp_parse (&argp
, argc
, argv
, ARGP_IN_ORDER
, &idx
, &args
))
2202 exit (TAREXIT_FAILURE
);
2205 /* Special handling for 'o' option:
2207 GNU tar used to say "output old format".
2208 UNIX98 tar says don't chown files after extracting (we use
2209 "--no-same-owner" for this).
2211 The old GNU tar semantics is retained when used with --create
2212 option, otherwise UNIX98 semantics is assumed */
2216 if (subcommand_option
== CREATE_SUBCOMMAND
)
2218 /* GNU Tar <= 1.13 compatibility */
2219 set_archive_format ("v7");
2223 /* UNIX98 compatibility */
2224 same_owner_option
= -1;
2228 /* Handle operands after any "--" argument. */
2229 for (; idx
< argc
; idx
++)
2231 name_add_name (argv
[idx
], MAKE_INCL_OPTIONS (&args
));
2232 args
.input_files
= true;
2235 /* Warn about implicit use of the wildcards in command line arguments.
2237 warn_regex_usage
= args
.wildcards
== default_wildcards
;
2239 /* Derive option values and check option consistency. */
2241 if (archive_format
== DEFAULT_FORMAT
)
2243 if (args
.pax_option
)
2244 archive_format
= POSIX_FORMAT
;
2246 archive_format
= DEFAULT_ARCHIVE_FORMAT
;
2249 if ((volume_label_option
&& subcommand_option
== CREATE_SUBCOMMAND
)
2250 || incremental_option
2251 || multi_volume_option
2253 assert_format (FORMAT_MASK (OLDGNU_FORMAT
)
2254 | FORMAT_MASK (GNU_FORMAT
)
2255 | FORMAT_MASK (POSIX_FORMAT
));
2257 if (occurrence_option
)
2259 if (!args
.input_files
)
2261 _("--occurrence is meaningless without a file list")));
2262 if (subcommand_option
!= DELETE_SUBCOMMAND
2263 && subcommand_option
!= DIFF_SUBCOMMAND
2264 && subcommand_option
!= EXTRACT_SUBCOMMAND
2265 && subcommand_option
!= LIST_SUBCOMMAND
)
2267 _("--occurrence cannot be used in the requested operation mode")));
2270 if (archive_names
== 0)
2272 /* If no archive file name given, try TAPE from the environment, or
2273 else, DEFAULT_ARCHIVE from the configuration process. */
2276 archive_name_array
[0] = getenv ("TAPE");
2277 if (! archive_name_array
[0])
2278 archive_name_array
[0] = DEFAULT_ARCHIVE
;
2281 /* Allow multiple archives only with `-M'. */
2283 if (archive_names
> 1 && !multi_volume_option
)
2285 _("Multiple archive files require `-M' option")));
2287 if (listed_incremental_option
2288 && NEWER_OPTION_INITIALIZED (newer_mtime_option
))
2290 _("Cannot combine --listed-incremental with --newer")));
2291 if (incremental_level
!= -1 && !listed_incremental_option
)
2293 _("--level is meaningless without --listed-incremental")));
2295 if (volume_label_option
)
2297 if (archive_format
== GNU_FORMAT
|| archive_format
== OLDGNU_FORMAT
)
2299 size_t volume_label_max_len
=
2300 (sizeof current_header
->header
.name
2301 - 1 /* for trailing '\0' */
2302 - (multi_volume_option
2303 ? (sizeof " Volume "
2304 - 1 /* for null at end of " Volume " */
2305 + INT_STRLEN_BOUND (int) /* for volume number */
2306 - 1 /* for sign, as 0 <= volno */)
2308 if (volume_label_max_len
< strlen (volume_label_option
))
2310 ngettext ("%s: Volume label is too long (limit is %lu byte)",
2311 "%s: Volume label is too long (limit is %lu bytes)",
2312 volume_label_max_len
),
2313 quotearg_colon (volume_label_option
),
2314 (unsigned long) volume_label_max_len
));
2317 Label length in PAX format is limited by the volume size. */
2322 if (multi_volume_option
)
2323 USAGE_ERROR ((0, 0, _("Cannot verify multi-volume archives")));
2324 if (use_compress_program_option
)
2325 USAGE_ERROR ((0, 0, _("Cannot verify compressed archives")));
2328 if (use_compress_program_option
)
2330 if (multi_volume_option
)
2331 USAGE_ERROR ((0, 0, _("Cannot use multi-volume compressed archives")));
2332 if (subcommand_option
== UPDATE_SUBCOMMAND
2333 || subcommand_option
== APPEND_SUBCOMMAND
2334 || subcommand_option
== DELETE_SUBCOMMAND
)
2335 USAGE_ERROR ((0, 0, _("Cannot update compressed archives")));
2336 if (subcommand_option
== CAT_SUBCOMMAND
)
2337 USAGE_ERROR ((0, 0, _("Cannot concatenate compressed archives")));
2340 /* It is no harm to use --pax-option on non-pax archives in archive
2341 reading mode. It may even be useful, since it allows to override
2342 file attributes from tar headers. Therefore I allow such usage.
2345 && archive_format
!= POSIX_FORMAT
2346 && (subcommand_option
!= EXTRACT_SUBCOMMAND
2347 || subcommand_option
!= DIFF_SUBCOMMAND
2348 || subcommand_option
!= LIST_SUBCOMMAND
))
2349 USAGE_ERROR ((0, 0, _("--pax-option can be used only on POSIX archives")));
2351 /* If ready to unlink hierarchies, so we are for simpler files. */
2352 if (recursive_unlink_option
)
2353 old_files_option
= UNLINK_FIRST_OLD_FILES
;
2356 if (test_label_option
)
2358 /* --test-label is silent if the user has specified the label name to
2360 if (!args
.input_files
)
2363 else if (utc_option
)
2366 if (tape_length_option
&& tape_length_option
< record_size
)
2367 USAGE_ERROR ((0, 0, _("Volume length cannot be less than record size")));
2369 if (same_order_option
&& listed_incremental_option
)
2370 USAGE_ERROR ((0, 0, _("--preserve-order is not compatible with "
2371 "--listed-incremental")));
2373 /* Forbid using -c with no input files whatsoever. Check that `-f -',
2374 explicit or implied, is used correctly. */
2376 switch (subcommand_option
)
2378 case CREATE_SUBCOMMAND
:
2379 if (!args
.input_files
&& !files_from_option
)
2381 _("Cowardly refusing to create an empty archive")));
2382 if (args
.compress_autodetect
&& archive_names
2383 && strcmp (archive_name_array
[0], "-"))
2384 set_comression_program_by_suffix (archive_name_array
[0],
2385 use_compress_program_option
);
2388 case EXTRACT_SUBCOMMAND
:
2389 case LIST_SUBCOMMAND
:
2390 case DIFF_SUBCOMMAND
:
2391 for (archive_name_cursor
= archive_name_array
;
2392 archive_name_cursor
< archive_name_array
+ archive_names
;
2393 archive_name_cursor
++)
2394 if (!strcmp (*archive_name_cursor
, "-"))
2395 request_stdin ("-f");
2398 case CAT_SUBCOMMAND
:
2399 case UPDATE_SUBCOMMAND
:
2400 case APPEND_SUBCOMMAND
:
2401 for (archive_name_cursor
= archive_name_array
;
2402 archive_name_cursor
< archive_name_array
+ archive_names
;
2403 archive_name_cursor
++)
2404 if (!strcmp (*archive_name_cursor
, "-"))
2406 _("Options `-Aru' are incompatible with `-f -'")));
2412 /* Initialize stdlis */
2413 if (index_file_name
)
2415 stdlis
= fopen (index_file_name
, "w");
2417 open_error (index_file_name
);
2420 stdlis
= to_stdout_option
? stderr
: stdout
;
2422 archive_name_cursor
= archive_name_array
;
2424 /* Prepare for generating backup names. */
2426 if (args
.backup_suffix_string
)
2427 simple_backup_suffix
= xstrdup (args
.backup_suffix_string
);
2431 backup_type
= xget_version ("--backup", args
.version_control_string
);
2432 /* No backup is needed either if explicitely disabled or if
2433 the extracted files are not being written to disk. */
2434 if (backup_type
== no_backups
|| EXTRACT_OVER_PIPE
)
2435 backup_option
= false;
2438 checkpoint_finish_compile ();
2441 report_textual_dates (&args
);
2447 /* Main routine for tar. */
2449 main (int argc
, char **argv
)
2452 program_name
= argv
[0];
2454 setlocale (LC_ALL
, "");
2455 bindtextdomain (PACKAGE
, LOCALEDIR
);
2456 textdomain (PACKAGE
);
2458 exit_failure
= TAREXIT_FAILURE
;
2459 exit_status
= TAREXIT_SUCCESS
;
2460 filename_terminator
= '\n';
2461 set_quoting_style (0, DEFAULT_QUOTING_STYLE
);
2463 /* Make sure we have first three descriptors available */
2466 /* Pre-allocate a few structures. */
2468 allocated_archive_names
= 10;
2469 archive_name_array
=
2470 xmalloc (sizeof (const char *) * allocated_archive_names
);
2473 obstack_init (&argv_stk
);
2475 /* Ensure default behavior for some signals */
2476 signal (SIGPIPE
, SIG_DFL
);
2477 /* System V fork+wait does not work if SIGCHLD is ignored. */
2478 signal (SIGCHLD
, SIG_DFL
);
2480 /* Try to disable the ability to unlink a directory. */
2481 priv_set_remove_linkdir ();
2483 /* Decode options. */
2485 decode_options (argc
, argv
);
2489 /* Main command execution. */
2491 if (volno_file_option
)
2492 init_volume_number ();
2494 switch (subcommand_option
)
2496 case UNKNOWN_SUBCOMMAND
:
2498 _("You must specify one of the `-Acdtrux' options")));
2500 case CAT_SUBCOMMAND
:
2501 case UPDATE_SUBCOMMAND
:
2502 case APPEND_SUBCOMMAND
:
2506 case DELETE_SUBCOMMAND
:
2507 delete_archive_members ();
2510 case CREATE_SUBCOMMAND
:
2514 case EXTRACT_SUBCOMMAND
:
2516 read_and (extract_archive
);
2518 /* FIXME: should extract_finish () even if an ordinary signal is
2524 case LIST_SUBCOMMAND
:
2525 read_and (list_archive
);
2528 case DIFF_SUBCOMMAND
:
2530 read_and (diff_archive
);
2535 print_total_stats ();
2537 if (check_links_option
)
2540 if (volno_file_option
)
2541 closeout_volume_number ();
2543 /* Dispose of allocated memory, and return. */
2545 free (archive_name_array
);
2548 if (exit_status
== TAREXIT_FAILURE
)
2549 error (0, 0, _("Exiting with failure status due to previous errors"));
2551 if (stdlis
== stdout
)
2553 else if (ferror (stderr
) || fclose (stderr
) != 0)
2554 set_exit_status (TAREXIT_FAILURE
);
2560 tar_stat_init (struct tar_stat_info
*st
)
2562 memset (st
, 0, sizeof (*st
));
2566 tar_stat_destroy (struct tar_stat_info
*st
)
2568 free (st
->orig_file_name
);
2569 free (st
->file_name
);
2570 free (st
->link_name
);
2573 free (st
->sparse_map
);
2575 xheader_destroy (&st
->xhdr
);
2576 memset (st
, 0, sizeof (*st
));
2579 /* Format mask for all available formats that support nanosecond
2580 timestamp resolution. */
2581 #define NS_PRECISION_FORMAT_MASK FORMAT_MASK (POSIX_FORMAT)
2583 /* Same as timespec_cmp, but ignore nanoseconds if current archive
2584 format does not provide sufficient resolution. */
2586 tar_timespec_cmp (struct timespec a
, struct timespec b
)
2588 if (!(FORMAT_MASK (current_format
) & NS_PRECISION_FORMAT_MASK
))
2589 a
.tv_nsec
= b
.tv_nsec
= 0;
2590 return timespec_cmp (a
, b
);
2593 /* Set tar exit status to VAL, unless it is already indicating
2594 a more serious condition. This relies on the fact that the
2595 values of TAREXIT_ constants are ranged by severity. */
2597 set_exit_status (int val
)
2599 if (val
> exit_status
)