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>
46 #include <parse-datetime.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
:
217 case TEST_LABEL_SUBCOMMAND
:
218 return "--test-label";
224 tar_list_quoting_styles (struct obstack
*stk
, char const *prefix
)
227 size_t prefixlen
= strlen (prefix
);
229 for (i
= 0; quoting_style_args
[i
]; i
++)
231 obstack_grow (stk
, prefix
, prefixlen
);
232 obstack_grow (stk
, quoting_style_args
[i
],
233 strlen (quoting_style_args
[i
]));
234 obstack_1grow (stk
, '\n');
239 tar_set_quoting_style (char *arg
)
243 for (i
= 0; quoting_style_args
[i
]; i
++)
244 if (strcmp (arg
, quoting_style_args
[i
]) == 0)
246 set_quoting_style (NULL
, i
);
250 _("Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."), arg
, program_invocation_short_name
));
258 ANCHORED_OPTION
= CHAR_MAX
+ 1,
259 ATIME_PRESERVE_OPTION
,
263 CHECKPOINT_ACTION_OPTION
,
264 DELAY_DIRECTORY_RESTORE_OPTION
,
265 HARD_DEREFERENCE_OPTION
,
267 EXCLUDE_BACKUPS_OPTION
,
268 EXCLUDE_CACHES_OPTION
,
269 EXCLUDE_CACHES_UNDER_OPTION
,
270 EXCLUDE_CACHES_ALL_OPTION
,
273 EXCLUDE_TAG_UNDER_OPTION
,
274 EXCLUDE_TAG_ALL_OPTION
,
280 IGNORE_COMMAND_ERROR_OPTION
,
281 IGNORE_FAILED_READ_OPTION
,
283 KEEP_NEWER_FILES_OPTION
,
292 NO_AUTO_COMPRESS_OPTION
,
293 NO_CHECK_DEVICE_OPTION
,
294 NO_DELAY_DIRECTORY_RESTORE_OPTION
,
295 NO_IGNORE_CASE_OPTION
,
296 NO_IGNORE_COMMAND_ERROR_OPTION
,
298 NO_OVERWRITE_DIR_OPTION
,
299 NO_QUOTE_CHARS_OPTION
,
301 NO_SAME_OWNER_OPTION
,
302 NO_SAME_PERMISSIONS_OPTION
,
305 NO_WILDCARDS_MATCH_SLASH_OPTION
,
308 NUMERIC_OWNER_OPTION
,
311 ONE_FILE_SYSTEM_OPTION
,
312 OVERWRITE_DIR_OPTION
,
319 QUOTING_STYLE_OPTION
,
322 RECURSIVE_UNLINK_OPTION
,
328 SHOW_DEFAULTS_OPTION
,
329 SHOW_OMITTED_DIRS_OPTION
,
330 SHOW_TRANSFORMED_NAMES_OPTION
,
331 SKIP_OLD_FILES_OPTION
,
332 SPARSE_VERSION_OPTION
,
333 STRIP_COMPONENTS_OPTION
,
343 WILDCARDS_MATCH_SLASH_OPTION
,
347 const char *argp_program_version
= "tar (" PACKAGE_NAME
") " VERSION
;
348 const char *argp_program_bug_address
= "<" PACKAGE_BUGREPORT
">";
349 static char const doc
[] = N_("\
350 GNU `tar' saves many files together into a single tape or disk archive, \
351 and can restore individual files from the archive.\n\
354 tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n\
355 tar -tvf archive.tar # List all files in archive.tar verbosely.\n\
356 tar -xf archive.tar # Extract all files from archive.tar.\n")
358 N_("The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
359 The version control may be set with --backup or VERSION_CONTROL, values are:\n\n\
360 none, off never make backups\n\
361 t, numbered make numbered backups\n\
362 nil, existing numbered if numbered backups exist, simple otherwise\n\
363 never, simple always make simple backups\n");
368 Available option letters are DEQY and eqy. Consider the following
371 [For Solaris tar compatibility =/= Is it important at all?]
372 e exit immediately with a nonzero exit status if unexpected errors occur
373 E use extended headers (--format=posix)
375 [q alias for --occurrence=1 =/= this would better be used for quiet?]
377 y per-file gzip compression
378 Y per-block gzip compression.
380 Additionally, the 'n' letter is assigned for option --seek, which
381 is probably not needed and should be marked as deprecated, so that
382 -n may become available in the future.
385 static struct argp_option options
[] = {
388 N_("Main operation mode:"), GRID
},
391 N_("list the contents of an archive"), GRID
+1 },
392 {"extract", 'x', 0, 0,
393 N_("extract files from an archive"), GRID
+1 },
394 {"get", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
395 {"create", 'c', 0, 0,
396 N_("create a new archive"), GRID
+1 },
398 N_("find differences between archive and file system"), GRID
+1 },
399 {"compare", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
400 {"append", 'r', 0, 0,
401 N_("append files to the end of an archive"), GRID
+1 },
402 {"update", 'u', 0, 0,
403 N_("only append files newer than copy in archive"), GRID
+1 },
404 {"catenate", 'A', 0, 0,
405 N_("append tar files to an archive"), GRID
+1 },
406 {"concatenate", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
407 {"delete", DELETE_OPTION
, 0, 0,
408 N_("delete from the archive (not on mag tapes!)"), GRID
+1 },
409 {"test-label", TEST_LABEL_OPTION
, NULL
, 0,
410 N_("test the archive volume label and exit"), GRID
+1 },
415 N_("Operation modifiers:"), GRID
},
417 {"sparse", 'S', 0, 0,
418 N_("handle sparse files efficiently"), GRID
+1 },
419 {"sparse-version", SPARSE_VERSION_OPTION
, N_("MAJOR[.MINOR]"), 0,
420 N_("set version of the sparse format to use (implies --sparse)"), GRID
+1},
421 {"incremental", 'G', 0, 0,
422 N_("handle old GNU-format incremental backup"), GRID
+1 },
423 {"listed-incremental", 'g', N_("FILE"), 0,
424 N_("handle new GNU-format incremental backup"), GRID
+1 },
425 {"level", LEVEL_OPTION
, N_("NUMBER"), 0,
426 N_("dump level for created listed-incremental archive"), GRID
+1 },
427 {"ignore-failed-read", IGNORE_FAILED_READ_OPTION
, 0, 0,
428 N_("do not exit with nonzero on unreadable files"), GRID
+1 },
429 {"occurrence", OCCURRENCE_OPTION
, N_("NUMBER"), OPTION_ARG_OPTIONAL
,
430 N_("process only the NUMBERth occurrence of each file in the archive;"
431 " this option is valid only in conjunction with one of the subcommands"
432 " --delete, --diff, --extract or --list and when a list of files"
433 " is given either on the command line or via the -T option;"
434 " NUMBER defaults to 1"), GRID
+1 },
435 {"seek", 'n', NULL
, 0,
436 N_("archive is seekable"), GRID
+1 },
437 {"no-seek", NO_SEEK_OPTION
, NULL
, 0,
438 N_("archive is not seekable"), GRID
+1 },
439 {"no-check-device", NO_CHECK_DEVICE_OPTION
, NULL
, 0,
440 N_("do not check device numbers when creating incremental archives"),
442 {"check-device", CHECK_DEVICE_OPTION
, NULL
, 0,
443 N_("check device numbers when creating incremental archives (default)"),
449 N_("Overwrite control:"), GRID
},
451 {"verify", 'W', 0, 0,
452 N_("attempt to verify the archive after writing it"), GRID
+1 },
453 {"remove-files", REMOVE_FILES_OPTION
, 0, 0,
454 N_("remove files after adding them to the archive"), GRID
+1 },
455 {"keep-old-files", 'k', 0, 0,
456 N_("don't replace existing files when extracting, "
457 "treat them as errors"), GRID
+1 },
458 {"skip-old-files", SKIP_OLD_FILES_OPTION
, 0, 0,
459 N_("don't replace existing files when extracting, silently skip over them"),
461 {"keep-newer-files", KEEP_NEWER_FILES_OPTION
, 0, 0,
462 N_("don't replace existing files that are newer than their archive copies"), GRID
+1 },
463 {"overwrite", OVERWRITE_OPTION
, 0, 0,
464 N_("overwrite existing files when extracting"), GRID
+1 },
465 {"unlink-first", 'U', 0, 0,
466 N_("remove each file prior to extracting over it"), GRID
+1 },
467 {"recursive-unlink", RECURSIVE_UNLINK_OPTION
, 0, 0,
468 N_("empty hierarchies prior to extracting directory"), GRID
+1 },
469 {"no-overwrite-dir", NO_OVERWRITE_DIR_OPTION
, 0, 0,
470 N_("preserve metadata of existing directories"), GRID
+1 },
471 {"overwrite-dir", OVERWRITE_DIR_OPTION
, 0, 0,
472 N_("overwrite metadata of existing directories when extracting (default)"),
478 N_("Select output stream:"), GRID
},
480 {"to-stdout", 'O', 0, 0,
481 N_("extract files to standard output"), GRID
+1 },
482 {"to-command", TO_COMMAND_OPTION
, N_("COMMAND"), 0,
483 N_("pipe extracted files to another program"), GRID
+1 },
484 {"ignore-command-error", IGNORE_COMMAND_ERROR_OPTION
, 0, 0,
485 N_("ignore exit codes of children"), GRID
+1 },
486 {"no-ignore-command-error", NO_IGNORE_COMMAND_ERROR_OPTION
, 0, 0,
487 N_("treat non-zero exit codes of children as error"), GRID
+1 },
492 N_("Handling of file attributes:"), GRID
},
494 {"owner", OWNER_OPTION
, N_("NAME"), 0,
495 N_("force NAME as owner for added files"), GRID
+1 },
496 {"group", GROUP_OPTION
, N_("NAME"), 0,
497 N_("force NAME as group for added files"), GRID
+1 },
498 {"mtime", MTIME_OPTION
, N_("DATE-OR-FILE"), 0,
499 N_("set mtime for added files from DATE-OR-FILE"), GRID
+1 },
500 {"mode", MODE_OPTION
, N_("CHANGES"), 0,
501 N_("force (symbolic) mode CHANGES for added files"), GRID
+1 },
502 {"atime-preserve", ATIME_PRESERVE_OPTION
,
503 N_("METHOD"), OPTION_ARG_OPTIONAL
,
504 N_("preserve access times on dumped files, either by restoring the times"
505 " after reading (METHOD='replace'; default) or by not setting the times"
506 " in the first place (METHOD='system')"), GRID
+1 },
508 N_("don't extract file modified time"), GRID
+1 },
509 {"same-owner", SAME_OWNER_OPTION
, 0, 0,
510 N_("try extracting files with the same ownership as exists in the archive (default for superuser)"), GRID
+1 },
511 {"no-same-owner", NO_SAME_OWNER_OPTION
, 0, 0,
512 N_("extract files as yourself (default for ordinary users)"), GRID
+1 },
513 {"numeric-owner", NUMERIC_OWNER_OPTION
, 0, 0,
514 N_("always use numbers for user/group names"), GRID
+1 },
515 {"preserve-permissions", 'p', 0, 0,
516 N_("extract information about file permissions (default for superuser)"),
518 {"same-permissions", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
519 {"no-same-permissions", NO_SAME_PERMISSIONS_OPTION
, 0, 0,
520 N_("apply the user's umask when extracting permissions from the archive (default for ordinary users)"), GRID
+1 },
521 {"preserve-order", 's', 0, 0,
522 N_("sort names to extract to match archive"), GRID
+1 },
523 {"same-order", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
524 {"preserve", PRESERVE_OPTION
, 0, 0,
525 N_("same as both -p and -s"), GRID
+1 },
526 {"delay-directory-restore", DELAY_DIRECTORY_RESTORE_OPTION
, 0, 0,
527 N_("delay setting modification times and permissions of extracted"
528 " directories until the end of extraction"), GRID
+1 },
529 {"no-delay-directory-restore", NO_DELAY_DIRECTORY_RESTORE_OPTION
, 0, 0,
530 N_("cancel the effect of --delay-directory-restore option"), GRID
+1 },
535 N_("Device selection and switching:"), GRID
},
537 {"file", 'f', N_("ARCHIVE"), 0,
538 N_("use archive file or device ARCHIVE"), GRID
+1 },
539 {"force-local", FORCE_LOCAL_OPTION
, 0, 0,
540 N_("archive file is local even if it has a colon"), GRID
+1 },
541 {"rmt-command", RMT_COMMAND_OPTION
, N_("COMMAND"), 0,
542 N_("use given rmt COMMAND instead of rmt"), GRID
+1 },
543 {"rsh-command", RSH_COMMAND_OPTION
, N_("COMMAND"), 0,
544 N_("use remote COMMAND instead of rsh"), GRID
+1 },
546 {"-[0-7][lmh]", 0, NULL
, OPTION_DOC
, /* It is OK, since `name' will never be
548 N_("specify drive and density"), GRID
+1 },
550 {NULL
, '0', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
551 {NULL
, '1', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
552 {NULL
, '2', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
553 {NULL
, '3', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
554 {NULL
, '4', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
555 {NULL
, '5', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
556 {NULL
, '6', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
557 {NULL
, '7', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
558 {NULL
, '8', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
559 {NULL
, '9', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
561 {"multi-volume", 'M', 0, 0,
562 N_("create/list/extract multi-volume archive"), GRID
+1 },
563 {"tape-length", 'L', N_("NUMBER"), 0,
564 N_("change tape after writing NUMBER x 1024 bytes"), GRID
+1 },
565 {"info-script", 'F', N_("NAME"), 0,
566 N_("run script at end of each tape (implies -M)"), GRID
+1 },
567 {"new-volume-script", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
568 {"volno-file", VOLNO_FILE_OPTION
, N_("FILE"), 0,
569 N_("use/update the volume number in FILE"), GRID
+1 },
574 N_("Device blocking:"), GRID
},
576 {"blocking-factor", 'b', N_("BLOCKS"), 0,
577 N_("BLOCKS x 512 bytes per record"), GRID
+1 },
578 {"record-size", RECORD_SIZE_OPTION
, N_("NUMBER"), 0,
579 N_("NUMBER of bytes per record, multiple of 512"), GRID
+1 },
580 {"ignore-zeros", 'i', 0, 0,
581 N_("ignore zeroed blocks in archive (means EOF)"), GRID
+1 },
582 {"read-full-records", 'B', 0, 0,
583 N_("reblock as we read (for 4.2BSD pipes)"), GRID
+1 },
588 N_("Archive format selection:"), GRID
},
590 {"format", 'H', N_("FORMAT"), 0,
591 N_("create archive of the given format"), GRID
+1 },
593 {NULL
, 0, NULL
, 0, N_("FORMAT is one of the following:"), GRID
+2 },
594 {" v7", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("old V7 tar format"),
596 {" oldgnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
597 N_("GNU format as per tar <= 1.12"), GRID
+3 },
598 {" gnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
599 N_("GNU tar 1.13.x format"), GRID
+3 },
600 {" ustar", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
601 N_("POSIX 1003.1-1988 (ustar) format"), GRID
+3 },
602 {" pax", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
603 N_("POSIX 1003.1-2001 (pax) format"), GRID
+3 },
604 {" posix", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("same as pax"), GRID
+3 },
606 {"old-archive", OLD_ARCHIVE_OPTION
, 0, 0, /* FIXME */
607 N_("same as --format=v7"), GRID
+8 },
608 {"portability", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
609 {"posix", POSIX_OPTION
, 0, 0,
610 N_("same as --format=posix"), GRID
+8 },
611 {"pax-option", PAX_OPTION
, N_("keyword[[:]=value][,keyword[[:]=value]]..."), 0,
612 N_("control pax keywords"), GRID
+8 },
613 {"label", 'V', N_("TEXT"), 0,
614 N_("create archive with volume name TEXT; at list/extract time, use TEXT as a globbing pattern for volume name"), GRID
+8 },
619 N_("Compression options:"), GRID
},
620 {"auto-compress", 'a', 0, 0,
621 N_("use archive suffix to determine the compression program"), GRID
+1 },
622 {"no-auto-compress", NO_AUTO_COMPRESS_OPTION
, 0, 0,
623 N_("do not use archive suffix to determine the compression program"),
625 {"use-compress-program", 'I', N_("PROG"), 0,
626 N_("filter through PROG (must accept -d)"), GRID
+1 },
627 /* Note: docstrings for the options below are generated by tar_help_filter */
628 {"bzip2", 'j', 0, 0, NULL
, GRID
+1 },
629 {"gzip", 'z', 0, 0, NULL
, GRID
+1 },
630 {"gunzip", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
631 {"ungzip", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
632 {"compress", 'Z', 0, 0, NULL
, GRID
+1 },
633 {"uncompress", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
634 {"lzip", LZIP_OPTION
, 0, 0, NULL
, GRID
+1 },
635 {"lzma", LZMA_OPTION
, 0, 0, NULL
, GRID
+1 },
636 {"lzop", LZOP_OPTION
, 0, 0, NULL
, GRID
+1 },
637 {"xz", 'J', 0, 0, NULL
, GRID
+1 },
642 N_("Local file selection:"), GRID
},
644 {"add-file", ARGP_KEY_ARG
, N_("FILE"), 0,
645 N_("add given FILE to the archive (useful if its name starts with a dash)"), GRID
+1 },
646 {"directory", 'C', N_("DIR"), 0,
647 N_("change to directory DIR"), GRID
+1 },
648 {"files-from", 'T', N_("FILE"), 0,
649 N_("get names to extract or create from FILE"), GRID
+1 },
650 {"null", NULL_OPTION
, 0, 0,
651 N_("-T reads null-terminated names, disable -C"), GRID
+1 },
652 {"no-null", NO_NULL_OPTION
, 0, 0,
653 N_("disable the effect of the previous --null option"), GRID
+1 },
654 {"unquote", UNQUOTE_OPTION
, 0, 0,
655 N_("unquote filenames read with -T (default)"), GRID
+1 },
656 {"no-unquote", NO_UNQUOTE_OPTION
, 0, 0,
657 N_("do not unquote filenames read with -T"), GRID
+1 },
658 {"exclude", EXCLUDE_OPTION
, N_("PATTERN"), 0,
659 N_("exclude files, given as a PATTERN"), GRID
+1 },
660 {"exclude-from", 'X', N_("FILE"), 0,
661 N_("exclude patterns listed in FILE"), GRID
+1 },
662 {"exclude-caches", EXCLUDE_CACHES_OPTION
, 0, 0,
663 N_("exclude contents of directories containing CACHEDIR.TAG, "
664 "except for the tag file itself"), GRID
+1 },
665 {"exclude-caches-under", EXCLUDE_CACHES_UNDER_OPTION
, 0, 0,
666 N_("exclude everything under directories containing CACHEDIR.TAG"),
668 {"exclude-caches-all", EXCLUDE_CACHES_ALL_OPTION
, 0, 0,
669 N_("exclude directories containing CACHEDIR.TAG"), GRID
+1 },
670 {"exclude-tag", EXCLUDE_TAG_OPTION
, N_("FILE"), 0,
671 N_("exclude contents of directories containing FILE, except"
672 " for FILE itself"), GRID
+1 },
673 {"exclude-tag-under", EXCLUDE_TAG_UNDER_OPTION
, N_("FILE"), 0,
674 N_("exclude everything under directories containing FILE"), GRID
+1 },
675 {"exclude-tag-all", EXCLUDE_TAG_ALL_OPTION
, N_("FILE"), 0,
676 N_("exclude directories containing FILE"), GRID
+1 },
677 {"exclude-vcs", EXCLUDE_VCS_OPTION
, NULL
, 0,
678 N_("exclude version control system directories"), GRID
+1 },
679 {"exclude-backups", EXCLUDE_BACKUPS_OPTION
, NULL
, 0,
680 N_("exclude backup and lock files"), GRID
+1 },
681 {"no-recursion", NO_RECURSION_OPTION
, 0, 0,
682 N_("avoid descending automatically in directories"), GRID
+1 },
683 {"one-file-system", ONE_FILE_SYSTEM_OPTION
, 0, 0,
684 N_("stay in local file system when creating archive"), GRID
+1 },
685 {"recursion", RECURSION_OPTION
, 0, 0,
686 N_("recurse into directories (default)"), GRID
+1 },
687 {"absolute-names", 'P', 0, 0,
688 N_("don't strip leading `/'s from file names"), GRID
+1 },
689 {"dereference", 'h', 0, 0,
690 N_("follow symlinks; archive and dump the files they point to"), GRID
+1 },
691 {"hard-dereference", HARD_DEREFERENCE_OPTION
, 0, 0,
692 N_("follow hard links; archive and dump the files they refer to"), GRID
+1 },
693 {"starting-file", 'K', N_("MEMBER-NAME"), 0,
694 N_("begin at member MEMBER-NAME in the archive"), GRID
+1 },
695 {"newer", 'N', N_("DATE-OR-FILE"), 0,
696 N_("only store files newer than DATE-OR-FILE"), GRID
+1 },
697 {"after-date", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
698 {"newer-mtime", NEWER_MTIME_OPTION
, N_("DATE"), 0,
699 N_("compare date and time when data changed only"), GRID
+1 },
700 {"backup", BACKUP_OPTION
, N_("CONTROL"), OPTION_ARG_OPTIONAL
,
701 N_("backup before removal, choose version CONTROL"), GRID
+1 },
702 {"suffix", SUFFIX_OPTION
, N_("STRING"), 0,
703 N_("backup before removal, override usual suffix ('~' unless overridden by environment variable SIMPLE_BACKUP_SUFFIX)"), GRID
+1 },
708 N_("File name transformations:"), GRID
},
709 {"strip-components", STRIP_COMPONENTS_OPTION
, N_("NUMBER"), 0,
710 N_("strip NUMBER leading components from file names on extraction"),
712 {"transform", TRANSFORM_OPTION
, N_("EXPRESSION"), 0,
713 N_("use sed replace EXPRESSION to transform file names"), GRID
+1 },
714 {"xform", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
719 N_("File name matching options (affect both exclude and include patterns):"),
721 {"ignore-case", IGNORE_CASE_OPTION
, 0, 0,
722 N_("ignore case"), GRID
+1 },
723 {"anchored", ANCHORED_OPTION
, 0, 0,
724 N_("patterns match file name start"), GRID
+1 },
725 {"no-anchored", NO_ANCHORED_OPTION
, 0, 0,
726 N_("patterns match after any `/' (default for exclusion)"), GRID
+1 },
727 {"no-ignore-case", NO_IGNORE_CASE_OPTION
, 0, 0,
728 N_("case sensitive matching (default)"), GRID
+1 },
729 {"wildcards", WILDCARDS_OPTION
, 0, 0,
730 N_("use wildcards (default for exclusion)"), GRID
+1 },
731 {"no-wildcards", NO_WILDCARDS_OPTION
, 0, 0,
732 N_("verbatim string matching"), GRID
+1 },
733 {"no-wildcards-match-slash", NO_WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
734 N_("wildcards do not match `/'"), GRID
+1 },
735 {"wildcards-match-slash", WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
736 N_("wildcards match `/' (default for exclusion)"), GRID
+1 },
741 N_("Informative output:"), GRID
},
743 {"verbose", 'v', 0, 0,
744 N_("verbosely list files processed"), GRID
+1 },
745 {"warning", WARNING_OPTION
, N_("KEYWORD"), 0,
746 N_("warning control"), GRID
+1 },
747 {"checkpoint", CHECKPOINT_OPTION
, N_("NUMBER"), OPTION_ARG_OPTIONAL
,
748 N_("display progress messages every NUMBERth record (default 10)"),
750 {"checkpoint-action", CHECKPOINT_ACTION_OPTION
, N_("ACTION"), 0,
751 N_("execute ACTION on each checkpoint"),
753 {"check-links", 'l', 0, 0,
754 N_("print a message if not all links are dumped"), GRID
+1 },
755 {"totals", TOTALS_OPTION
, N_("SIGNAL"), OPTION_ARG_OPTIONAL
,
756 N_("print total bytes after processing the archive; "
757 "with an argument - print total bytes when this SIGNAL is delivered; "
758 "Allowed signals are: SIGHUP, SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; "
759 "the names without SIG prefix are also accepted"), GRID
+1 },
760 {"utc", UTC_OPTION
, 0, 0,
761 N_("print file modification times in UTC"), GRID
+1 },
762 {"full-time", FULL_TIME_OPTION
, 0, 0,
763 N_("print file time to its full resolution"), GRID
+1 },
764 {"index-file", INDEX_FILE_OPTION
, N_("FILE"), 0,
765 N_("send verbose output to FILE"), GRID
+1 },
766 {"block-number", 'R', 0, 0,
767 N_("show block number within archive with each message"), GRID
+1 },
768 {"interactive", 'w', 0, 0,
769 N_("ask for confirmation for every action"), GRID
+1 },
770 {"confirmation", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
771 {"show-defaults", SHOW_DEFAULTS_OPTION
, 0, 0,
772 N_("show tar defaults"), GRID
+1 },
773 {"show-omitted-dirs", SHOW_OMITTED_DIRS_OPTION
, 0, 0,
774 N_("when listing or extracting, list each directory that does not match search criteria"), GRID
+1 },
775 {"show-transformed-names", SHOW_TRANSFORMED_NAMES_OPTION
, 0, 0,
776 N_("show file or archive names after transformation"),
778 {"show-stored-names", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
779 {"quoting-style", QUOTING_STYLE_OPTION
, N_("STYLE"), 0,
780 N_("set name quoting style; see below for valid STYLE values"), GRID
+1 },
781 {"quote-chars", QUOTE_CHARS_OPTION
, N_("STRING"), 0,
782 N_("additionally quote characters from STRING"), GRID
+1 },
783 {"no-quote-chars", NO_QUOTE_CHARS_OPTION
, N_("STRING"), 0,
784 N_("disable quoting for characters from STRING"), GRID
+1 },
789 N_("Compatibility options:"), GRID
},
792 N_("when creating, same as --old-archive; when extracting, same as --no-same-owner"), GRID
+1 },
797 N_("Other options:"), GRID
},
799 {"restrict", RESTRICT_OPTION
, 0, 0,
800 N_("disable use of some potentially harmful options"), -1 },
806 static char const *const atime_preserve_args
[] =
808 "replace", "system", NULL
811 static enum atime_preserve
const atime_preserve_types
[] =
813 replace_atime_preserve
, system_atime_preserve
816 /* Make sure atime_preserve_types has as much entries as atime_preserve_args
817 (minus 1 for NULL guard) */
818 ARGMATCH_VERIFY (atime_preserve_args
, atime_preserve_types
);
820 /* Wildcard matching settings */
823 default_wildcards
, /* For exclusion == enable_wildcards,
824 for inclusion == disable_wildcards */
829 struct tar_args
/* Variables used during option parsing */
831 struct textual_date
*textual_date
; /* Keeps the arguments to --newer-mtime
832 and/or --date option if they are
834 enum wildcards wildcards
; /* Wildcard settings (--wildcards/
836 int matching_flags
; /* exclude_fnmatch options */
837 int include_anchored
; /* Pattern anchoring options used for
839 bool o_option
; /* True if -o option was given */
840 bool pax_option
; /* True if --pax-option was given */
841 char const *backup_suffix_string
; /* --suffix option argument */
842 char const *version_control_string
; /* --backup option argument */
843 bool input_files
; /* True if some input files where given */
844 int compress_autodetect
; /* True if compression autodetection should
845 be attempted when creating archives */
849 #define MAKE_EXCL_OPTIONS(args) \
850 ((((args)->wildcards != disable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
851 | (args)->matching_flags \
854 #define MAKE_INCL_OPTIONS(args) \
855 ((((args)->wildcards == enable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
856 | (args)->include_anchored \
857 | (args)->matching_flags \
860 static char const * const vcs_file_table
[] = {
892 static char const * const backup_file_table
[] = {
900 add_exclude_array (char const * const * fv
, int options
)
904 for (i
= 0; fv
[i
]; i
++)
905 add_exclude (excluded
, fv
[i
], options
);
910 format_default_settings (void)
913 "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s"
918 archive_format_string (DEFAULT_ARCHIVE_FORMAT
),
919 DEFAULT_ARCHIVE
, DEFAULT_BLOCKING
,
920 quoting_style_args
[DEFAULT_QUOTING_STYLE
],
930 set_subcommand_option (enum subcommand subcommand
)
932 if (subcommand_option
!= UNKNOWN_SUBCOMMAND
933 && subcommand_option
!= subcommand
)
935 _("You may not specify more than one `-Acdtrux' or `--test-label' option")));
937 subcommand_option
= subcommand
;
941 set_use_compress_program_option (const char *string
)
943 if (use_compress_program_option
944 && strcmp (use_compress_program_option
, string
) != 0)
945 USAGE_ERROR ((0, 0, _("Conflicting compression options")));
947 use_compress_program_option
= string
;
954 print_total_stats ();
955 #ifndef HAVE_SIGACTION
956 signal (signo
, sigstat
);
961 stat_on_signal (int signo
)
963 #ifdef HAVE_SIGACTION
965 # define SA_RESTART 0
967 struct sigaction act
;
968 act
.sa_handler
= sigstat
;
969 sigemptyset (&act
.sa_mask
);
970 act
.sa_flags
= SA_RESTART
;
971 sigaction (signo
, &act
, NULL
);
973 signal (signo
, sigstat
);
978 set_stat_signal (const char *name
)
985 { "SIGUSR1", SIGUSR1
},
987 { "SIGUSR2", SIGUSR2
},
989 { "SIGHUP", SIGHUP
},
991 { "SIGINT", SIGINT
},
993 { "SIGQUIT", SIGQUIT
},
996 struct sigtab
const *p
;
998 for (p
= sigtab
; p
< sigtab
+ sizeof (sigtab
) / sizeof (sigtab
[0]); p
++)
999 if (strcmp (p
->name
, name
) == 0)
1001 stat_on_signal (p
->signo
);
1004 FATAL_ERROR ((0, 0, _("Unknown signal name: %s"), name
));
1010 struct textual_date
*next
;
1017 get_date_or_file (struct tar_args
*args
, const char *option
,
1018 const char *str
, struct timespec
*ts
)
1020 if (FILE_SYSTEM_PREFIX_LEN (str
) != 0
1025 if (stat (str
, &st
) != 0)
1028 USAGE_ERROR ((0, 0, _("Date sample file not found")));
1030 *ts
= get_stat_mtime (&st
);
1034 if (! parse_datetime (ts
, str
, NULL
))
1036 WARN ((0, 0, _("Substituting %s for unknown date format %s"),
1037 tartime (*ts
, false), quote (str
)));
1043 struct textual_date
*p
= xmalloc (sizeof (*p
));
1046 p
->date
= xstrdup (str
);
1047 p
->next
= args
->textual_date
;
1048 args
->textual_date
= p
;
1055 report_textual_dates (struct tar_args
*args
)
1057 struct textual_date
*p
;
1058 for (p
= args
->textual_date
; p
; )
1060 struct textual_date
*next
= p
->next
;
1063 char const *treated_as
= tartime (p
->ts
, true);
1064 if (strcmp (p
->date
, treated_as
) != 0)
1065 WARN ((0, 0, _("Option %s: Treating date `%s' as %s"),
1066 p
->option
, p
->date
, treated_as
));
1076 /* Either NL or NUL, as decided by the --null option. */
1077 static char filename_terminator
;
1079 enum read_file_list_state
/* Result of reading file name from the list file */
1081 file_list_success
, /* OK, name read successfully */
1082 file_list_end
, /* End of list file */
1083 file_list_zero
, /* Zero separator encountered where it should not */
1084 file_list_skip
/* Empty (zero-length) entry encountered, skip it */
1087 /* Read from FP a sequence of characters up to TERM and put them
1090 static enum read_file_list_state
1091 read_name_from_file (FILE *fp
, struct obstack
*stk
, int term
)
1096 for (c
= getc (fp
); c
!= EOF
&& c
!= term
; c
= getc (fp
))
1100 /* We have read a zero separator. The file possibly is
1102 return file_list_zero
;
1104 obstack_1grow (stk
, c
);
1108 if (counter
== 0 && c
!= EOF
)
1109 return file_list_skip
;
1111 obstack_1grow (stk
, 0);
1113 return (counter
== 0 && c
== EOF
) ? file_list_end
: file_list_success
;
1117 static bool files_from_option
; /* When set, tar will not refuse to create
1119 static struct obstack argv_stk
; /* Storage for additional command line options
1120 read using -T option */
1122 /* Prevent recursive inclusion of the same file */
1125 struct file_id_list
*next
;
1130 static struct file_id_list
*file_id_list
;
1133 add_file_id (const char *filename
)
1135 struct file_id_list
*p
;
1138 if (stat (filename
, &st
))
1139 stat_fatal (filename
);
1140 for (p
= file_id_list
; p
; p
= p
->next
)
1141 if (p
->ino
== st
.st_ino
&& p
->dev
== st
.st_dev
)
1143 FATAL_ERROR ((0, 0, _("%s: file list already read"),
1144 quotearg_colon (filename
)));
1146 p
= xmalloc (sizeof *p
);
1147 p
->next
= file_id_list
;
1153 /* Default density numbers for [0-9][lmh] device specifications */
1155 #ifndef LOW_DENSITY_NUM
1156 # define LOW_DENSITY_NUM 0
1159 #ifndef MID_DENSITY_NUM
1160 # define MID_DENSITY_NUM 8
1163 #ifndef HIGH_DENSITY_NUM
1164 # define HIGH_DENSITY_NUM 16
1168 update_argv (const char *filename
, struct argp_state
*state
)
1171 size_t count
= 0, i
;
1175 bool is_stdin
= false;
1176 enum read_file_list_state read_state
;
1177 int term
= filename_terminator
;
1179 if (!strcmp (filename
, "-"))
1182 request_stdin ("-T");
1187 add_file_id (filename
);
1188 if ((fp
= fopen (filename
, "r")) == NULL
)
1189 open_fatal (filename
);
1192 while ((read_state
= read_name_from_file (fp
, &argv_stk
, term
))
1197 case file_list_success
:
1201 case file_list_end
: /* won't happen, just to pacify gcc */
1204 case file_list_zero
:
1208 WARNOPT (WARN_FILENAME_WITH_NULS
,
1209 (0, 0, N_("%s: file name read contains nul character"),
1210 quotearg_colon (filename
)));
1212 /* Prepare new stack contents */
1213 size
= obstack_object_size (&argv_stk
);
1214 p
= obstack_finish (&argv_stk
);
1215 for (; size
> 0; size
--, p
++)
1217 obstack_1grow (&argv_stk
, *p
);
1219 obstack_1grow (&argv_stk
, '\n');
1220 obstack_1grow (&argv_stk
, 0);
1222 /* Read rest of files using new filename terminator */
1227 case file_list_skip
:
1238 start
= obstack_finish (&argv_stk
);
1241 for (p
= start
; *p
; p
+= strlen (p
) + 1)
1245 new_argc
= state
->argc
+ count
;
1246 new_argv
= xmalloc (sizeof (state
->argv
[0]) * (new_argc
+ 1));
1247 memcpy (new_argv
, state
->argv
, sizeof (state
->argv
[0]) * (state
->argc
+ 1));
1248 state
->argv
= new_argv
;
1249 memmove (&state
->argv
[state
->next
+ count
], &state
->argv
[state
->next
],
1250 (state
->argc
- state
->next
+ 1) * sizeof (state
->argv
[0]));
1252 state
->argc
= new_argc
;
1254 for (i
= state
->next
, p
= start
; *p
; p
+= strlen (p
) + 1, i
++)
1256 if (term
== 0 && p
[0] == '-')
1257 state
->argv
[i
++] = "--add-file";
1264 tar_help_filter (int key
, const char *text
, void *input
)
1276 s
= xasprintf (_("filter the archive through %s"), BZIP2_PROGRAM
);
1280 s
= xasprintf (_("filter the archive through %s"), GZIP_PROGRAM
);
1284 s
= xasprintf (_("filter the archive through %s"), COMPRESS_PROGRAM
);
1288 s
= xasprintf (_("filter the archive through %s"), LZIP_PROGRAM
);
1292 s
= xasprintf (_("filter the archive through %s"), LZMA_PROGRAM
);
1296 s
= xasprintf (_("filter the archive through %s"), XZ_PROGRAM
);
1299 case ARGP_KEY_HELP_EXTRA
:
1303 obstack_init (&stk
);
1304 tstr
= _("Valid arguments for the --quoting-style option are:");
1305 obstack_grow (&stk
, tstr
, strlen (tstr
));
1306 obstack_grow (&stk
, "\n\n", 2);
1307 tar_list_quoting_styles (&stk
, " ");
1308 tstr
= _("\n*This* tar defaults to:\n");
1309 obstack_grow (&stk
, tstr
, strlen (tstr
));
1310 s
= format_default_settings ();
1311 obstack_grow (&stk
, s
, strlen (s
));
1312 obstack_1grow (&stk
, '\n');
1313 obstack_1grow (&stk
, 0);
1314 s
= xstrdup (obstack_finish (&stk
));
1315 obstack_free (&stk
, NULL
);
1322 expand_pax_option (struct tar_args
*targs
, const char *arg
)
1327 obstack_init (&stk
);
1330 size_t seglen
= strcspn (arg
, ",");
1331 char *p
= memchr (arg
, '=', seglen
);
1334 size_t len
= p
- arg
+ 1;
1335 obstack_grow (&stk
, arg
, len
);
1337 for (++p
; *p
&& isspace ((unsigned char) *p
); p
++)
1339 if (*p
== '{' && p
[len
-1] == '}')
1342 char *tmp
= xmalloc (len
);
1343 memcpy (tmp
, p
+ 1, len
-2);
1345 if (get_date_or_file (targs
, "--pax-option", tmp
, &ts
) == 0)
1347 char buf
[UINTMAX_STRSIZE_BOUND
], *s
;
1348 s
= umaxtostr (ts
.tv_sec
, buf
);
1349 obstack_grow (&stk
, s
, strlen (s
));
1352 obstack_grow (&stk
, p
, len
);
1356 obstack_grow (&stk
, p
, len
);
1359 obstack_grow (&stk
, arg
, seglen
);
1364 obstack_1grow (&stk
, *arg
);
1368 obstack_1grow (&stk
, 0);
1369 res
= xstrdup (obstack_finish (&stk
));
1370 obstack_free (&stk
, NULL
);
1376 parse_owner_group (char *arg
, uintmax_t field_max
, char const **name_option
)
1379 uintmax_t u
= UINTMAX_MAX
;
1381 char const *name
= 0;
1382 char const *invalid_num
= 0;
1383 char *colon
= strchr (arg
, ':');
1387 char const *num
= colon
+ 1;
1391 if (num
&& (! (xstrtoumax (num
, &end
, 10, &u
, "") == LONGINT_OK
1392 && u
<= field_max
)))
1398 switch ('0' <= *arg
&& *arg
<= '9'
1399 ? xstrtoumax (arg
, &end
, 10, &u1
, "")
1407 if (u1
<= field_max
)
1413 case LONGINT_OVERFLOW
:
1420 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (invalid_num
),
1421 _("Invalid owner or group ID")));
1423 *name_option
= name
;
1427 #define TAR_SIZE_SUFFIXES "bBcGgkKMmPTtw"
1430 parse_opt (int key
, char *arg
, struct argp_state
*state
)
1432 struct tar_args
*args
= state
->input
;
1437 /* File name or non-parsed option, because of ARGP_IN_ORDER */
1438 name_add_name (arg
, MAKE_INCL_OPTIONS (args
));
1439 args
->input_files
= true;
1443 set_subcommand_option (CAT_SUBCOMMAND
);
1447 args
->compress_autodetect
= true;
1450 case NO_AUTO_COMPRESS_OPTION
:
1451 args
->compress_autodetect
= false;
1457 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1458 && u
== (blocking_factor
= u
)
1459 && 0 < blocking_factor
1460 && u
== (record_size
= u
* BLOCKSIZE
) / BLOCKSIZE
))
1461 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1462 _("Invalid blocking factor")));
1467 /* Try to reblock input records. For reading 4.2BSD pipes. */
1469 /* It would surely make sense to exchange -B and -R, but it seems
1470 that -B has been used for a long while in Sun tar and most
1471 BSD-derived systems. This is a consequence of the block/record
1472 terminology confusion. */
1474 read_full_records_option
= true;
1478 set_subcommand_option (CREATE_SUBCOMMAND
);
1486 set_subcommand_option (DIFF_SUBCOMMAND
);
1490 if (archive_names
== allocated_archive_names
)
1491 archive_name_array
= x2nrealloc (archive_name_array
,
1492 &allocated_archive_names
,
1493 sizeof (archive_name_array
[0]));
1495 archive_name_array
[archive_names
++] = arg
;
1499 /* Since -F is only useful with -M, make it implied. Run this
1500 script at the end of each tape. */
1502 info_script_option
= arg
;
1503 multi_volume_option
= true;
1506 case FULL_TIME_OPTION
:
1507 full_time_option
= true;
1511 listed_incremental_option
= arg
;
1512 after_date_option
= true;
1516 /* We are making an incremental dump (FIXME: are we?); save
1517 directories at the beginning of the archive, and include in each
1518 directory its contents. */
1520 incremental_option
= true;
1524 /* Follow symbolic links. */
1525 dereference_option
= true;
1528 case HARD_DEREFERENCE_OPTION
:
1529 hard_dereference_option
= true;
1533 /* Ignore zero blocks (eofs). This can't be the default,
1534 because Unix tar writes two blocks of zeros, then pads out
1535 the record with garbage. */
1537 ignore_zeros_option
= true;
1541 set_use_compress_program_option (BZIP2_PROGRAM
);
1545 set_use_compress_program_option (XZ_PROGRAM
);
1549 /* Don't replace existing files. */
1550 old_files_option
= KEEP_OLD_FILES
;
1554 starting_file_option
= true;
1555 addname (arg
, 0, true, NULL
);
1558 case ONE_FILE_SYSTEM_OPTION
:
1559 /* When dumping directories, don't dump files/subdirectories
1560 that are on other filesystems. */
1561 one_file_system_option
= true;
1565 check_links_option
= 1;
1573 if (xstrtoumax (arg
, &p
, 10, &u
, TAR_SIZE_SUFFIXES
) != LONGINT_OK
)
1574 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1575 _("Invalid tape length")));
1576 if (p
> arg
&& !strchr (TAR_SIZE_SUFFIXES
, p
[-1]))
1577 tape_length_option
= 1024 * (tarlong
) u
;
1579 tape_length_option
= (tarlong
) u
;
1580 multi_volume_option
= true;
1587 incremental_level
= strtoul (arg
, &p
, 10);
1589 USAGE_ERROR ((0, 0, _("Invalid incremental level value")));
1594 set_use_compress_program_option (LZIP_PROGRAM
);
1598 set_use_compress_program_option (LZMA_PROGRAM
);
1602 set_use_compress_program_option (LZOP_PROGRAM
);
1606 touch_option
= true;
1610 /* Make multivolume archive: when we can't write any more into
1611 the archive, re-open it, and continue writing. */
1613 multi_volume_option
= true;
1617 get_date_or_file (args
, "--mtime", arg
, &mtime_option
);
1618 set_mtime_option
= true;
1625 case NO_SEEK_OPTION
:
1630 after_date_option
= true;
1633 case NEWER_MTIME_OPTION
:
1634 if (NEWER_OPTION_INITIALIZED (newer_mtime_option
))
1635 USAGE_ERROR ((0, 0, _("More than one threshold date")));
1636 get_date_or_file (args
,
1637 key
== NEWER_MTIME_OPTION
? "--newer-mtime"
1638 : "--after-date", arg
, &newer_mtime_option
);
1642 args
->o_option
= true;
1646 to_stdout_option
= true;
1650 same_permissions_option
= true;
1654 absolute_names_option
= true;
1658 set_subcommand_option (APPEND_SUBCOMMAND
);
1662 /* Print block numbers for debugging bad tar archives. */
1664 /* It would surely make sense to exchange -B and -R, but it seems
1665 that -B has been used for a long while in Sun tar and most
1666 BSD-derived systems. This is a consequence of the block/record
1667 terminology confusion. */
1669 block_number_option
= true;
1673 /* Names to extract are sorted. */
1675 same_order_option
= true;
1679 sparse_option
= true;
1682 case SKIP_OLD_FILES_OPTION
:
1683 old_files_option
= SKIP_OLD_FILES
;
1686 case SPARSE_VERSION_OPTION
:
1687 sparse_option
= true;
1690 tar_sparse_major
= strtoul (arg
, &p
, 10);
1694 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1695 tar_sparse_minor
= strtoul (p
+ 1, &p
, 10);
1697 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1703 set_subcommand_option (LIST_SUBCOMMAND
);
1707 case TEST_LABEL_OPTION
:
1708 set_subcommand_option (TEST_LABEL_SUBCOMMAND
);
1712 update_argv (arg
, state
);
1713 /* Indicate we've been given -T option. This is for backward
1714 compatibility only, so that `tar cfT archive /dev/null will
1716 files_from_option
= true;
1720 set_subcommand_option (UPDATE_SUBCOMMAND
);
1724 old_files_option
= UNLINK_FIRST_OLD_FILES
;
1733 warning_option
|= WARN_VERBOSE_WARNINGS
;
1737 volume_label_option
= arg
;
1741 interactive_option
= true;
1745 verify_option
= true;
1749 set_subcommand_option (EXTRACT_SUBCOMMAND
);
1753 if (add_exclude_file (add_exclude
, excluded
, arg
,
1754 MAKE_EXCL_OPTIONS (args
), '\n')
1758 FATAL_ERROR ((0, e
, "%s", quotearg_colon (arg
)));
1763 set_use_compress_program_option (GZIP_PROGRAM
);
1767 set_use_compress_program_option (COMPRESS_PROGRAM
);
1770 case ANCHORED_OPTION
:
1771 args
->matching_flags
|= EXCLUDE_ANCHORED
;
1774 case ATIME_PRESERVE_OPTION
:
1775 atime_preserve_option
=
1777 ? XARGMATCH ("--atime-preserve", arg
,
1778 atime_preserve_args
, atime_preserve_types
)
1779 : replace_atime_preserve
);
1780 if (! O_NOATIME
&& atime_preserve_option
== system_atime_preserve
)
1782 _("--atime-preserve='system' is not supported"
1783 " on this platform")));
1786 case CHECK_DEVICE_OPTION
:
1787 check_device_option
= true;
1790 case NO_CHECK_DEVICE_OPTION
:
1791 check_device_option
= false;
1794 case CHECKPOINT_OPTION
:
1801 checkpoint_compile_action (".");
1804 checkpoint_option
= strtoul (arg
, &p
, 0);
1807 _("--checkpoint value is not an integer")));
1810 checkpoint_option
= DEFAULT_CHECKPOINT
;
1813 case CHECKPOINT_ACTION_OPTION
:
1814 checkpoint_compile_action (arg
);
1818 backup_option
= true;
1820 args
->version_control_string
= arg
;
1823 case DELAY_DIRECTORY_RESTORE_OPTION
:
1824 delay_directory_restore_option
= true;
1827 case NO_DELAY_DIRECTORY_RESTORE_OPTION
:
1828 delay_directory_restore_option
= false;
1832 set_subcommand_option (DELETE_SUBCOMMAND
);
1835 case EXCLUDE_BACKUPS_OPTION
:
1836 add_exclude_array (backup_file_table
, EXCLUDE_WILDCARDS
);
1839 case EXCLUDE_OPTION
:
1840 add_exclude (excluded
, arg
, MAKE_EXCL_OPTIONS (args
));
1843 case EXCLUDE_CACHES_OPTION
:
1844 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_contents
,
1848 case EXCLUDE_CACHES_UNDER_OPTION
:
1849 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_under
,
1853 case EXCLUDE_CACHES_ALL_OPTION
:
1854 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_all
,
1858 case EXCLUDE_TAG_OPTION
:
1859 add_exclusion_tag (arg
, exclusion_tag_contents
, NULL
);
1862 case EXCLUDE_TAG_UNDER_OPTION
:
1863 add_exclusion_tag (arg
, exclusion_tag_under
, NULL
);
1866 case EXCLUDE_TAG_ALL_OPTION
:
1867 add_exclusion_tag (arg
, exclusion_tag_all
, NULL
);
1870 case EXCLUDE_VCS_OPTION
:
1871 add_exclude_array (vcs_file_table
, 0);
1874 case FORCE_LOCAL_OPTION
:
1875 force_local_option
= true;
1879 set_archive_format (arg
);
1882 case INDEX_FILE_OPTION
:
1883 index_file_name
= arg
;
1886 case IGNORE_CASE_OPTION
:
1887 args
->matching_flags
|= FNM_CASEFOLD
;
1890 case IGNORE_COMMAND_ERROR_OPTION
:
1891 ignore_command_error_option
= true;
1894 case IGNORE_FAILED_READ_OPTION
:
1895 ignore_failed_read_option
= true;
1898 case KEEP_NEWER_FILES_OPTION
:
1899 old_files_option
= KEEP_NEWER_FILES
;
1904 uintmax_t u
= parse_owner_group (arg
, TYPE_MAXIMUM (gid_t
),
1905 &group_name_option
);
1906 if (u
== UINTMAX_MAX
)
1909 if (group_name_option
)
1910 gname_to_gid (group_name_option
, &group_option
);
1918 mode_option
= mode_compile (arg
);
1920 FATAL_ERROR ((0, 0, _("Invalid mode given on option")));
1921 initial_umask
= umask (0);
1922 umask (initial_umask
);
1925 case NO_ANCHORED_OPTION
:
1926 args
->include_anchored
= 0; /* Clear the default for comman line args */
1927 args
->matching_flags
&= ~ EXCLUDE_ANCHORED
;
1930 case NO_IGNORE_CASE_OPTION
:
1931 args
->matching_flags
&= ~ FNM_CASEFOLD
;
1934 case NO_IGNORE_COMMAND_ERROR_OPTION
:
1935 ignore_command_error_option
= false;
1938 case NO_OVERWRITE_DIR_OPTION
:
1939 old_files_option
= NO_OVERWRITE_DIR_OLD_FILES
;
1942 case NO_QUOTE_CHARS_OPTION
:
1944 set_char_quoting (NULL
, *arg
, 0);
1947 case NO_WILDCARDS_OPTION
:
1948 args
->wildcards
= disable_wildcards
;
1951 case NO_WILDCARDS_MATCH_SLASH_OPTION
:
1952 args
->matching_flags
|= FNM_FILE_NAME
;
1956 filename_terminator
= '\0';
1959 case NO_NULL_OPTION
:
1960 filename_terminator
= '\n';
1963 case NUMERIC_OWNER_OPTION
:
1964 numeric_owner_option
= true;
1967 case OCCURRENCE_OPTION
:
1969 occurrence_option
= 1;
1973 if (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
)
1974 occurrence_option
= u
;
1976 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1977 _("Invalid number")));
1981 case OVERWRITE_DIR_OPTION
:
1982 old_files_option
= DEFAULT_OLD_FILES
;
1985 case OVERWRITE_OPTION
:
1986 old_files_option
= OVERWRITE_OLD_FILES
;
1991 uintmax_t u
= parse_owner_group (arg
, TYPE_MAXIMUM (uid_t
),
1992 &owner_name_option
);
1993 if (u
== UINTMAX_MAX
)
1996 if (owner_name_option
)
1997 uname_to_uid (owner_name_option
, &owner_option
);
2004 case QUOTE_CHARS_OPTION
:
2006 set_char_quoting (NULL
, *arg
, 1);
2009 case QUOTING_STYLE_OPTION
:
2010 tar_set_quoting_style (arg
);
2015 char *tmp
= expand_pax_option (args
, arg
);
2016 args
->pax_option
= true;
2017 xheader_set_option (tmp
);
2023 set_archive_format ("posix");
2026 case PRESERVE_OPTION
:
2027 /* FIXME: What it is good for? */
2028 same_permissions_option
= true;
2029 same_order_option
= true;
2030 WARN ((0, 0, _("The --preserve option is deprecated, "
2031 "use --preserve-permissions --preserve-order instead")));
2034 case RECORD_SIZE_OPTION
:
2038 if (! (xstrtoumax (arg
, NULL
, 10, &u
, TAR_SIZE_SUFFIXES
) == LONGINT_OK
2039 && u
== (size_t) u
))
2040 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
2041 _("Invalid record size")));
2043 if (record_size
% BLOCKSIZE
!= 0)
2044 USAGE_ERROR ((0, 0, _("Record size must be a multiple of %d."),
2046 blocking_factor
= record_size
/ BLOCKSIZE
;
2050 case RECURSIVE_UNLINK_OPTION
:
2051 recursive_unlink_option
= true;
2054 case REMOVE_FILES_OPTION
:
2055 remove_files_option
= true;
2058 case RESTRICT_OPTION
:
2059 restrict_option
= true;
2062 case RMT_COMMAND_OPTION
:
2066 case RSH_COMMAND_OPTION
:
2067 rsh_command_option
= arg
;
2070 case SHOW_DEFAULTS_OPTION
:
2072 char *s
= format_default_settings ();
2079 case STRIP_COMPONENTS_OPTION
:
2082 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
2083 && u
== (size_t) u
))
2084 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
2085 _("Invalid number of elements")));
2086 strip_name_components
= u
;
2090 case SHOW_OMITTED_DIRS_OPTION
:
2091 show_omitted_dirs_option
= true;
2094 case SHOW_TRANSFORMED_NAMES_OPTION
:
2095 show_transformed_names_option
= true;
2099 backup_option
= true;
2100 args
->backup_suffix_string
= arg
;
2103 case TO_COMMAND_OPTION
:
2104 if (to_command_option
)
2105 USAGE_ERROR ((0, 0, _("Only one --to-command option allowed")));
2106 to_command_option
= arg
;
2111 set_stat_signal (arg
);
2113 totals_option
= true;
2116 case TRANSFORM_OPTION
:
2117 set_transform_expr (arg
);
2121 set_use_compress_program_option (arg
);
2124 case VOLNO_FILE_OPTION
:
2125 volno_file_option
= arg
;
2128 case WILDCARDS_OPTION
:
2129 args
->wildcards
= enable_wildcards
;
2132 case WILDCARDS_MATCH_SLASH_OPTION
:
2133 args
->matching_flags
&= ~ FNM_FILE_NAME
;
2136 case NO_RECURSION_OPTION
:
2137 recursion_option
= 0;
2140 case NO_SAME_OWNER_OPTION
:
2141 same_owner_option
= -1;
2144 case NO_SAME_PERMISSIONS_OPTION
:
2145 same_permissions_option
= -1;
2148 case RECURSION_OPTION
:
2149 recursion_option
= FNM_LEADING_DIR
;
2152 case SAME_OWNER_OPTION
:
2153 same_owner_option
= 1;
2156 case UNQUOTE_OPTION
:
2157 unquote_option
= true;
2160 case NO_UNQUOTE_OPTION
:
2161 unquote_option
= false;
2164 case WARNING_OPTION
:
2165 set_warning_option (arg
);
2177 #ifdef DEVICE_PREFIX
2179 int device
= key
- '0';
2181 static char buf
[sizeof DEVICE_PREFIX
+ 10];
2185 argp_error (state
, _("Malformed density argument: %s"), quote (arg
));
2187 strcpy (buf
, DEVICE_PREFIX
);
2188 cursor
= buf
+ strlen (buf
);
2190 #ifdef DENSITY_LETTER
2192 sprintf (cursor
, "%d%c", device
, arg
[0]);
2194 #else /* not DENSITY_LETTER */
2199 device
+= LOW_DENSITY_NUM
;
2203 device
+= MID_DENSITY_NUM
;
2207 device
+= HIGH_DENSITY_NUM
;
2211 argp_error (state
, _("Unknown density: `%c'"), arg
[0]);
2213 sprintf (cursor
, "%d", device
);
2215 #endif /* not DENSITY_LETTER */
2217 if (archive_names
== allocated_archive_names
)
2218 archive_name_array
= x2nrealloc (archive_name_array
,
2219 &allocated_archive_names
,
2220 sizeof (archive_name_array
[0]));
2221 archive_name_array
[archive_names
++] = xstrdup (buf
);
2225 #else /* not DEVICE_PREFIX */
2228 _("Options `-[0-7][lmh]' not supported by *this* tar"));
2230 #endif /* not DEVICE_PREFIX */
2233 return ARGP_ERR_UNKNOWN
;
2238 static struct argp argp
= {
2251 argp_help (&argp
, stderr
, ARGP_HELP_SEE
, (char*) program_name
);
2256 /* Parse the options for tar. */
2258 static struct argp_option
*
2259 find_argp_option (struct argp_option
*o
, int letter
)
2266 && o
->doc
== NULL
); o
++)
2267 if (o
->key
== letter
)
2272 static const char *tar_authors
[] = {
2279 decode_options (int argc
, char **argv
)
2282 struct tar_args args
;
2284 argp_version_setup ("tar", tar_authors
);
2286 /* Set some default option values. */
2287 args
.textual_date
= NULL
;
2288 args
.wildcards
= default_wildcards
;
2289 args
.matching_flags
= 0;
2290 args
.include_anchored
= EXCLUDE_ANCHORED
;
2291 args
.o_option
= false;
2292 args
.pax_option
= false;
2293 args
.backup_suffix_string
= getenv ("SIMPLE_BACKUP_SUFFIX");
2294 args
.version_control_string
= 0;
2295 args
.input_files
= false;
2296 args
.compress_autodetect
= false;
2298 subcommand_option
= UNKNOWN_SUBCOMMAND
;
2299 archive_format
= DEFAULT_FORMAT
;
2300 blocking_factor
= DEFAULT_BLOCKING
;
2301 record_size
= DEFAULT_BLOCKING
* BLOCKSIZE
;
2302 excluded
= new_exclude ();
2303 newer_mtime_option
.tv_sec
= TYPE_MINIMUM (time_t);
2304 newer_mtime_option
.tv_nsec
= -1;
2305 recursion_option
= FNM_LEADING_DIR
;
2306 unquote_option
= true;
2307 tar_sparse_major
= 1;
2308 tar_sparse_minor
= 0;
2310 owner_option
= -1; owner_name_option
= NULL
;
2311 group_option
= -1; group_name_option
= NULL
;
2313 check_device_option
= true;
2315 incremental_level
= -1;
2319 /* Convert old-style tar call by exploding option element and rearranging
2320 options accordingly. */
2322 if (argc
> 1 && argv
[1][0] != '-')
2324 int new_argc
; /* argc value for rearranged arguments */
2325 char **new_argv
; /* argv value for rearranged arguments */
2326 char *const *in
; /* cursor into original argv */
2327 char **out
; /* cursor into rearranged argv */
2328 const char *letter
; /* cursor into old option letters */
2329 char buffer
[3]; /* constructed option buffer */
2331 /* Initialize a constructed option. */
2336 /* Allocate a new argument array, and copy program name in it. */
2338 new_argc
= argc
- 1 + strlen (argv
[1]);
2339 new_argv
= xmalloc ((new_argc
+ 1) * sizeof (char *));
2344 /* Copy each old letter option as a separate option, and have the
2345 corresponding argument moved next to it. */
2347 for (letter
= *in
++; *letter
; letter
++)
2349 struct argp_option
*opt
;
2351 buffer
[1] = *letter
;
2352 *out
++ = xstrdup (buffer
);
2353 opt
= find_argp_option (options
, *letter
);
2354 if (opt
&& opt
->arg
)
2356 if (in
< argv
+ argc
)
2359 USAGE_ERROR ((0, 0, _("Old option `%c' requires an argument."),
2364 /* Copy all remaining options. */
2366 while (in
< argv
+ argc
)
2370 /* Replace the old option list by the new one. */
2376 /* Parse all options and non-options as they appear. */
2378 prepend_default_options (getenv ("TAR_OPTIONS"), &argc
, &argv
);
2380 if (argp_parse (&argp
, argc
, argv
, ARGP_IN_ORDER
, &idx
, &args
))
2381 exit (TAREXIT_FAILURE
);
2384 /* Special handling for 'o' option:
2386 GNU tar used to say "output old format".
2387 UNIX98 tar says don't chown files after extracting (we use
2388 "--no-same-owner" for this).
2390 The old GNU tar semantics is retained when used with --create
2391 option, otherwise UNIX98 semantics is assumed */
2395 if (subcommand_option
== CREATE_SUBCOMMAND
)
2397 /* GNU Tar <= 1.13 compatibility */
2398 set_archive_format ("v7");
2402 /* UNIX98 compatibility */
2403 same_owner_option
= -1;
2407 /* Handle operands after any "--" argument. */
2408 for (; idx
< argc
; idx
++)
2410 name_add_name (argv
[idx
], MAKE_INCL_OPTIONS (&args
));
2411 args
.input_files
= true;
2414 /* Warn about implicit use of the wildcards in command line arguments.
2416 warn_regex_usage
= args
.wildcards
== default_wildcards
;
2418 /* Derive option values and check option consistency. */
2420 if (archive_format
== DEFAULT_FORMAT
)
2422 if (args
.pax_option
)
2423 archive_format
= POSIX_FORMAT
;
2425 archive_format
= DEFAULT_ARCHIVE_FORMAT
;
2428 if ((volume_label_option
&& subcommand_option
== CREATE_SUBCOMMAND
)
2429 || incremental_option
2430 || multi_volume_option
2432 assert_format (FORMAT_MASK (OLDGNU_FORMAT
)
2433 | FORMAT_MASK (GNU_FORMAT
)
2434 | FORMAT_MASK (POSIX_FORMAT
));
2436 if (occurrence_option
)
2438 if (!args
.input_files
)
2440 _("--occurrence is meaningless without a file list")));
2441 if (subcommand_option
!= DELETE_SUBCOMMAND
2442 && subcommand_option
!= DIFF_SUBCOMMAND
2443 && subcommand_option
!= EXTRACT_SUBCOMMAND
2444 && subcommand_option
!= LIST_SUBCOMMAND
)
2446 _("--occurrence cannot be used in the requested operation mode")));
2449 if (archive_names
== 0)
2451 /* If no archive file name given, try TAPE from the environment, or
2452 else, DEFAULT_ARCHIVE from the configuration process. */
2455 archive_name_array
[0] = getenv ("TAPE");
2456 if (! archive_name_array
[0])
2457 archive_name_array
[0] = DEFAULT_ARCHIVE
;
2460 /* Allow multiple archives only with `-M'. */
2462 if (archive_names
> 1 && !multi_volume_option
)
2464 _("Multiple archive files require `-M' option")));
2466 if (listed_incremental_option
2467 && NEWER_OPTION_INITIALIZED (newer_mtime_option
))
2469 _("Cannot combine --listed-incremental with --newer")));
2470 if (incremental_level
!= -1 && !listed_incremental_option
)
2472 _("--level is meaningless without --listed-incremental")));
2474 if (volume_label_option
)
2476 if (archive_format
== GNU_FORMAT
|| archive_format
== OLDGNU_FORMAT
)
2478 size_t volume_label_max_len
=
2479 (sizeof current_header
->header
.name
2480 - 1 /* for trailing '\0' */
2481 - (multi_volume_option
2482 ? (sizeof " Volume "
2483 - 1 /* for null at end of " Volume " */
2484 + INT_STRLEN_BOUND (int) /* for volume number */
2485 - 1 /* for sign, as 0 <= volno */)
2487 if (volume_label_max_len
< strlen (volume_label_option
))
2489 ngettext ("%s: Volume label is too long (limit is %lu byte)",
2490 "%s: Volume label is too long (limit is %lu bytes)",
2491 volume_label_max_len
),
2492 quotearg_colon (volume_label_option
),
2493 (unsigned long) volume_label_max_len
));
2496 Label length in PAX format is limited by the volume size. */
2501 if (multi_volume_option
)
2502 USAGE_ERROR ((0, 0, _("Cannot verify multi-volume archives")));
2503 if (use_compress_program_option
)
2504 USAGE_ERROR ((0, 0, _("Cannot verify compressed archives")));
2507 if (use_compress_program_option
)
2509 if (multi_volume_option
)
2510 USAGE_ERROR ((0, 0, _("Cannot use multi-volume compressed archives")));
2511 if (subcommand_option
== UPDATE_SUBCOMMAND
2512 || subcommand_option
== APPEND_SUBCOMMAND
2513 || subcommand_option
== DELETE_SUBCOMMAND
)
2514 USAGE_ERROR ((0, 0, _("Cannot update compressed archives")));
2515 if (subcommand_option
== CAT_SUBCOMMAND
)
2516 USAGE_ERROR ((0, 0, _("Cannot concatenate compressed archives")));
2519 /* It is no harm to use --pax-option on non-pax archives in archive
2520 reading mode. It may even be useful, since it allows to override
2521 file attributes from tar headers. Therefore I allow such usage.
2524 && archive_format
!= POSIX_FORMAT
2525 && (subcommand_option
!= EXTRACT_SUBCOMMAND
2526 || subcommand_option
!= DIFF_SUBCOMMAND
2527 || subcommand_option
!= LIST_SUBCOMMAND
))
2528 USAGE_ERROR ((0, 0, _("--pax-option can be used only on POSIX archives")));
2530 /* If ready to unlink hierarchies, so we are for simpler files. */
2531 if (recursive_unlink_option
)
2532 old_files_option
= UNLINK_FIRST_OLD_FILES
;
2534 /* Flags for accessing files to be read from or copied into. POSIX says
2535 O_NONBLOCK has unspecified effect on most types of files, but in
2536 practice it never harms and sometimes helps. */
2538 int base_open_flags
=
2539 (O_BINARY
| O_CLOEXEC
| O_NOCTTY
| O_NONBLOCK
2540 | (dereference_option
? 0 : O_NOFOLLOW
)
2541 | (atime_preserve_option
== system_atime_preserve
? O_NOATIME
: 0));
2542 open_read_flags
= O_RDONLY
| base_open_flags
;
2543 open_searchdir_flags
= O_SEARCH
| O_DIRECTORY
| base_open_flags
;
2545 fstatat_flags
= dereference_option
? 0 : AT_SYMLINK_NOFOLLOW
;
2547 if (subcommand_option
== TEST_LABEL_SUBCOMMAND
)
2549 /* --test-label is silent if the user has specified the label name to
2551 if (!args
.input_files
)
2554 else if (utc_option
)
2557 if (tape_length_option
&& tape_length_option
< record_size
)
2558 USAGE_ERROR ((0, 0, _("Volume length cannot be less than record size")));
2560 if (same_order_option
&& listed_incremental_option
)
2561 USAGE_ERROR ((0, 0, _("--preserve-order is not compatible with "
2562 "--listed-incremental")));
2564 /* Forbid using -c with no input files whatsoever. Check that `-f -',
2565 explicit or implied, is used correctly. */
2567 switch (subcommand_option
)
2569 case CREATE_SUBCOMMAND
:
2570 if (!args
.input_files
&& !files_from_option
)
2572 _("Cowardly refusing to create an empty archive")));
2573 if (args
.compress_autodetect
&& archive_names
2574 && strcmp (archive_name_array
[0], "-"))
2575 set_compression_program_by_suffix (archive_name_array
[0],
2576 use_compress_program_option
);
2579 case EXTRACT_SUBCOMMAND
:
2580 case LIST_SUBCOMMAND
:
2581 case DIFF_SUBCOMMAND
:
2582 case TEST_LABEL_SUBCOMMAND
:
2583 for (archive_name_cursor
= archive_name_array
;
2584 archive_name_cursor
< archive_name_array
+ archive_names
;
2585 archive_name_cursor
++)
2586 if (!strcmp (*archive_name_cursor
, "-"))
2587 request_stdin ("-f");
2590 case CAT_SUBCOMMAND
:
2591 case UPDATE_SUBCOMMAND
:
2592 case APPEND_SUBCOMMAND
:
2593 for (archive_name_cursor
= archive_name_array
;
2594 archive_name_cursor
< archive_name_array
+ archive_names
;
2595 archive_name_cursor
++)
2596 if (!strcmp (*archive_name_cursor
, "-"))
2598 _("Options `-Aru' are incompatible with `-f -'")));
2604 /* Initialize stdlis */
2605 if (index_file_name
)
2607 stdlis
= fopen (index_file_name
, "w");
2609 open_error (index_file_name
);
2612 stdlis
= to_stdout_option
? stderr
: stdout
;
2614 archive_name_cursor
= archive_name_array
;
2616 /* Prepare for generating backup names. */
2618 if (args
.backup_suffix_string
)
2619 simple_backup_suffix
= xstrdup (args
.backup_suffix_string
);
2623 backup_type
= xget_version ("--backup", args
.version_control_string
);
2624 /* No backup is needed either if explicitely disabled or if
2625 the extracted files are not being written to disk. */
2626 if (backup_type
== no_backups
|| EXTRACT_OVER_PIPE
)
2627 backup_option
= false;
2630 checkpoint_finish_compile ();
2632 report_textual_dates (&args
);
2638 /* Main routine for tar. */
2640 main (int argc
, char **argv
)
2643 set_program_name (argv
[0]);
2645 setlocale (LC_ALL
, "");
2646 bindtextdomain (PACKAGE
, LOCALEDIR
);
2647 textdomain (PACKAGE
);
2649 exit_failure
= TAREXIT_FAILURE
;
2650 exit_status
= TAREXIT_SUCCESS
;
2651 filename_terminator
= '\n';
2652 set_quoting_style (0, DEFAULT_QUOTING_STYLE
);
2654 /* Make sure we have first three descriptors available */
2657 /* Pre-allocate a few structures. */
2659 allocated_archive_names
= 10;
2660 archive_name_array
=
2661 xmalloc (sizeof (const char *) * allocated_archive_names
);
2664 obstack_init (&argv_stk
);
2666 /* System V fork+wait does not work if SIGCHLD is ignored. */
2667 signal (SIGCHLD
, SIG_DFL
);
2669 /* Try to disable the ability to unlink a directory. */
2670 priv_set_remove_linkdir ();
2672 /* Decode options. */
2674 decode_options (argc
, argv
);
2678 /* Main command execution. */
2680 if (volno_file_option
)
2681 init_volume_number ();
2683 switch (subcommand_option
)
2685 case UNKNOWN_SUBCOMMAND
:
2687 _("You must specify one of the `-Acdtrux' or `--test-label' options")));
2689 case CAT_SUBCOMMAND
:
2690 case UPDATE_SUBCOMMAND
:
2691 case APPEND_SUBCOMMAND
:
2695 case DELETE_SUBCOMMAND
:
2696 delete_archive_members ();
2699 case CREATE_SUBCOMMAND
:
2703 case EXTRACT_SUBCOMMAND
:
2705 read_and (extract_archive
);
2707 /* FIXME: should extract_finish () even if an ordinary signal is
2713 case LIST_SUBCOMMAND
:
2714 read_and (list_archive
);
2717 case DIFF_SUBCOMMAND
:
2719 read_and (diff_archive
);
2722 case TEST_LABEL_SUBCOMMAND
:
2723 test_archive_label ();
2727 print_total_stats ();
2729 if (check_links_option
)
2732 if (volno_file_option
)
2733 closeout_volume_number ();
2735 /* Dispose of allocated memory, and return. */
2737 free (archive_name_array
);
2740 if (exit_status
== TAREXIT_FAILURE
)
2741 error (0, 0, _("Exiting with failure status due to previous errors"));
2743 if (stdlis
== stdout
)
2745 else if (ferror (stderr
) || fclose (stderr
) != 0)
2746 set_exit_status (TAREXIT_FAILURE
);
2752 tar_stat_init (struct tar_stat_info
*st
)
2754 memset (st
, 0, sizeof (*st
));
2757 /* Close the stream or file descriptor associated with ST, and remove
2758 all traces of it from ST. Return true if successful, false (with a
2759 diagnostic) otherwise. */
2761 tar_stat_close (struct tar_stat_info
*st
)
2763 int status
= (st
->dirstream
? closedir (st
->dirstream
)
2764 : 0 < st
->fd
? close (st
->fd
)
2773 close_diag (st
->orig_file_name
);
2779 tar_stat_destroy (struct tar_stat_info
*st
)
2781 tar_stat_close (st
);
2782 free (st
->orig_file_name
);
2783 free (st
->file_name
);
2784 free (st
->link_name
);
2787 free (st
->sparse_map
);
2789 xheader_destroy (&st
->xhdr
);
2790 memset (st
, 0, sizeof (*st
));
2793 /* Format mask for all available formats that support nanosecond
2794 timestamp resolution. */
2795 #define NS_PRECISION_FORMAT_MASK FORMAT_MASK (POSIX_FORMAT)
2797 /* Same as timespec_cmp, but ignore nanoseconds if current archive
2798 format does not provide sufficient resolution. */
2800 tar_timespec_cmp (struct timespec a
, struct timespec b
)
2802 if (!(FORMAT_MASK (current_format
) & NS_PRECISION_FORMAT_MASK
))
2803 a
.tv_nsec
= b
.tv_nsec
= 0;
2804 return timespec_cmp (a
, b
);
2807 /* Set tar exit status to VAL, unless it is already indicating
2808 a more serious condition. This relies on the fact that the
2809 values of TAREXIT_ constants are ranged by severity. */
2811 set_exit_status (int val
)
2813 if (val
> exit_status
)