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>
30 #if ! defined SIGCHLD && defined SIGCLD
31 # define SIGCHLD SIGCLD
34 /* The following causes "common.h" to produce definitions of all the global
35 variables, rather than just "extern" declarations of them. GNU tar does
36 depend on the system loader to preset all GLOBAL variables to neutral (or
37 zero) values; explicit initialization is usually not done. */
43 #include <configmake.h>
47 #include <rmt-command.h>
50 #include <version-etc.h>
54 /* Local declarations. */
56 #ifndef DEFAULT_ARCHIVE_FORMAT
57 # define DEFAULT_ARCHIVE_FORMAT GNU_FORMAT
60 #ifndef DEFAULT_ARCHIVE
61 # define DEFAULT_ARCHIVE "tar.out"
64 #ifndef DEFAULT_BLOCKING
65 # define DEFAULT_BLOCKING 20
71 /* Name of option using stdin. */
72 static const char *stdin_used_by
;
74 /* Doesn't return if stdin already requested. */
76 request_stdin (const char *option
)
79 USAGE_ERROR ((0, 0, _("Options `-%s' and `-%s' both want standard input"),
80 stdin_used_by
, option
));
82 stdin_used_by
= option
;
85 extern int rpmatch (char const *response
);
87 /* Returns true if and only if the user typed an affirmative response. */
89 confirm (const char *message_action
, const char *message_name
)
91 static FILE *confirm_file
;
92 static int confirm_file_EOF
;
97 if (archive
== 0 || stdin_used_by
)
99 confirm_file
= fopen (TTY_NAME
, "r");
101 open_fatal (TTY_NAME
);
105 request_stdin ("-w");
106 confirm_file
= stdin
;
110 fprintf (stdlis
, "%s %s?", message_action
, quote (message_name
));
113 if (!confirm_file_EOF
)
115 char *response
= NULL
;
116 size_t response_size
= 0;
117 if (getline (&response
, &response_size
, confirm_file
) < 0)
118 confirm_file_EOF
= 1;
120 status
= rpmatch (response
) > 0;
124 if (confirm_file_EOF
)
126 fputc ('\n', stdlis
);
133 static struct fmttab
{
135 enum archive_format fmt
;
138 { "oldgnu", OLDGNU_FORMAT
},
139 { "ustar", USTAR_FORMAT
},
140 { "posix", POSIX_FORMAT
},
141 #if 0 /* not fully supported yet */
142 { "star", STAR_FORMAT
},
144 { "gnu", GNU_FORMAT
},
145 { "pax", POSIX_FORMAT
}, /* An alias for posix */
150 set_archive_format (char const *name
)
152 struct fmttab
const *p
;
154 for (p
= fmttab
; strcmp (p
->name
, name
) != 0; )
156 USAGE_ERROR ((0, 0, _("%s: Invalid archive format"),
157 quotearg_colon (name
)));
159 archive_format
= p
->fmt
;
163 archive_format_string (enum archive_format fmt
)
165 struct fmttab
const *p
;
167 for (p
= fmttab
; p
->name
; p
++)
173 #define FORMAT_MASK(n) (1<<(n))
176 assert_format(unsigned fmt_mask
)
178 if ((FORMAT_MASK (archive_format
) & fmt_mask
) == 0)
180 _("GNU features wanted on incompatible archive format")));
184 subcommand_string (enum subcommand c
)
188 case UNKNOWN_SUBCOMMAND
:
191 case APPEND_SUBCOMMAND
:
197 case CREATE_SUBCOMMAND
:
200 case DELETE_SUBCOMMAND
:
203 case DIFF_SUBCOMMAND
:
206 case EXTRACT_SUBCOMMAND
:
209 case LIST_SUBCOMMAND
:
212 case UPDATE_SUBCOMMAND
:
221 tar_list_quoting_styles (argp_fmtstream_t fs
, char *prefix
)
225 for (i
= 0; quoting_style_args
[i
]; i
++)
226 argp_fmtstream_printf (fs
, "%s%s\n", prefix
, quoting_style_args
[i
]);
230 tar_set_quoting_style (char *arg
)
234 for (i
= 0; quoting_style_args
[i
]; i
++)
235 if (strcmp (arg
, quoting_style_args
[i
]) == 0)
237 set_quoting_style (NULL
, i
);
241 _("Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."), arg
, program_invocation_short_name
));
249 ANCHORED_OPTION
= CHAR_MAX
+ 1,
250 ATIME_PRESERVE_OPTION
,
254 CHECKPOINT_ACTION_OPTION
,
255 DELAY_DIRECTORY_RESTORE_OPTION
,
256 HARD_DEREFERENCE_OPTION
,
258 EXCLUDE_CACHES_OPTION
,
259 EXCLUDE_CACHES_UNDER_OPTION
,
260 EXCLUDE_CACHES_ALL_OPTION
,
263 EXCLUDE_TAG_UNDER_OPTION
,
264 EXCLUDE_TAG_ALL_OPTION
,
270 IGNORE_COMMAND_ERROR_OPTION
,
271 IGNORE_FAILED_READ_OPTION
,
273 KEEP_NEWER_FILES_OPTION
,
280 NO_AUTO_COMPRESS_OPTION
,
281 NO_CHECK_DEVICE_OPTION
,
282 NO_DELAY_DIRECTORY_RESTORE_OPTION
,
283 NO_IGNORE_CASE_OPTION
,
284 NO_IGNORE_COMMAND_ERROR_OPTION
,
286 NO_OVERWRITE_DIR_OPTION
,
287 NO_QUOTE_CHARS_OPTION
,
289 NO_SAME_OWNER_OPTION
,
290 NO_SAME_PERMISSIONS_OPTION
,
292 NO_WILDCARDS_MATCH_SLASH_OPTION
,
295 NUMERIC_OWNER_OPTION
,
298 ONE_FILE_SYSTEM_OPTION
,
299 OVERWRITE_DIR_OPTION
,
306 QUOTING_STYLE_OPTION
,
309 RECURSIVE_UNLINK_OPTION
,
315 SHOW_DEFAULTS_OPTION
,
316 SHOW_OMITTED_DIRS_OPTION
,
317 SHOW_TRANSFORMED_NAMES_OPTION
,
318 SPARSE_VERSION_OPTION
,
319 STRIP_COMPONENTS_OPTION
,
330 WILDCARDS_MATCH_SLASH_OPTION
,
334 const char *argp_program_version
= "tar (" PACKAGE_NAME
") " VERSION
;
335 const char *argp_program_bug_address
= "<" PACKAGE_BUGREPORT
">";
336 static char const doc
[] = N_("\
337 GNU `tar' saves many files together into a single tape or disk archive, \
338 and can restore individual files from the archive.\n\
341 tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n\
342 tar -tvf archive.tar # List all files in archive.tar verbosely.\n\
343 tar -xf archive.tar # Extract all files from archive.tar.\n")
345 N_("The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
346 The version control may be set with --backup or VERSION_CONTROL, values are:\n\n\
347 none, off never make backups\n\
348 t, numbered make numbered backups\n\
349 nil, existing numbered if numbered backups exist, simple otherwise\n\
350 never, simple always make simple backups\n");
355 Available option letters are DEQY and eqy. Consider the following
358 [For Solaris tar compatibility =/= Is it important at all?]
359 e exit immediately with a nonzero exit status if unexpected errors occur
360 E use extended headers (--format=posix)
362 [q alias for --occurrence=1 =/= this would better be used for quiet?]
364 y per-file gzip compression
365 Y per-block gzip compression */
367 static struct argp_option options
[] = {
370 N_("Main operation mode:"), GRID
},
373 N_("list the contents of an archive"), GRID
+1 },
374 {"extract", 'x', 0, 0,
375 N_("extract files from an archive"), GRID
+1 },
376 {"get", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
377 {"create", 'c', 0, 0,
378 N_("create a new archive"), GRID
+1 },
380 N_("find differences between archive and file system"), GRID
+1 },
381 {"compare", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
382 {"append", 'r', 0, 0,
383 N_("append files to the end of an archive"), GRID
+1 },
384 {"update", 'u', 0, 0,
385 N_("only append files newer than copy in archive"), GRID
+1 },
386 {"catenate", 'A', 0, 0,
387 N_("append tar files to an archive"), GRID
+1 },
388 {"concatenate", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
389 {"delete", DELETE_OPTION
, 0, 0,
390 N_("delete from the archive (not on mag tapes!)"), GRID
+1 },
391 {"test-label", TEST_LABEL_OPTION
, NULL
, 0,
392 N_("test the archive volume label and exit"), GRID
+1 },
397 N_("Operation modifiers:"), GRID
},
399 {"sparse", 'S', 0, 0,
400 N_("handle sparse files efficiently"), GRID
+1 },
401 {"sparse-version", SPARSE_VERSION_OPTION
, N_("MAJOR[.MINOR]"), 0,
402 N_("set version of the sparse format to use (implies --sparse)"), GRID
+1},
403 {"incremental", 'G', 0, 0,
404 N_("handle old GNU-format incremental backup"), GRID
+1 },
405 {"listed-incremental", 'g', N_("FILE"), 0,
406 N_("handle new GNU-format incremental backup"), GRID
+1 },
407 {"ignore-failed-read", IGNORE_FAILED_READ_OPTION
, 0, 0,
408 N_("do not exit with nonzero on unreadable files"), GRID
+1 },
409 {"occurrence", OCCURRENCE_OPTION
, N_("NUMBER"), OPTION_ARG_OPTIONAL
,
410 N_("process only the NUMBERth occurrence of each file in the archive;"
411 " this option is valid only in conjunction with one of the subcommands"
412 " --delete, --diff, --extract or --list and when a list of files"
413 " is given either on the command line or via the -T option;"
414 " NUMBER defaults to 1"), GRID
+1 },
415 {"seek", 'n', NULL
, 0,
416 N_("archive is seekable"), GRID
+1 },
417 {"no-check-device", NO_CHECK_DEVICE_OPTION
, NULL
, 0,
418 N_("do not check device numbers when creating incremental archives"),
420 {"check-device", CHECK_DEVICE_OPTION
, NULL
, 0,
421 N_("check device numbers when creating incremental archives (default)"),
427 N_("Overwrite control:"), GRID
},
429 {"verify", 'W', 0, 0,
430 N_("attempt to verify the archive after writing it"), GRID
+1 },
431 {"remove-files", REMOVE_FILES_OPTION
, 0, 0,
432 N_("remove files after adding them to the archive"), GRID
+1 },
433 {"keep-old-files", 'k', 0, 0,
434 N_("don't replace existing files when extracting"), GRID
+1 },
435 {"keep-newer-files", KEEP_NEWER_FILES_OPTION
, 0, 0,
436 N_("don't replace existing files that are newer than their archive copies"), GRID
+1 },
437 {"overwrite", OVERWRITE_OPTION
, 0, 0,
438 N_("overwrite existing files when extracting"), GRID
+1 },
439 {"unlink-first", 'U', 0, 0,
440 N_("remove each file prior to extracting over it"), GRID
+1 },
441 {"recursive-unlink", RECURSIVE_UNLINK_OPTION
, 0, 0,
442 N_("empty hierarchies prior to extracting directory"), GRID
+1 },
443 {"no-overwrite-dir", NO_OVERWRITE_DIR_OPTION
, 0, 0,
444 N_("preserve metadata of existing directories"), GRID
+1 },
445 {"overwrite-dir", OVERWRITE_DIR_OPTION
, 0, 0,
446 N_("overwrite metadata of existing directories when extracting (default)"),
452 N_("Select output stream:"), GRID
},
454 {"to-stdout", 'O', 0, 0,
455 N_("extract files to standard output"), GRID
+1 },
456 {"to-command", TO_COMMAND_OPTION
, N_("COMMAND"), 0,
457 N_("pipe extracted files to another program"), GRID
+1 },
458 {"ignore-command-error", IGNORE_COMMAND_ERROR_OPTION
, 0, 0,
459 N_("ignore exit codes of children"), GRID
+1 },
460 {"no-ignore-command-error", NO_IGNORE_COMMAND_ERROR_OPTION
, 0, 0,
461 N_("treat non-zero exit codes of children as error"), GRID
+1 },
466 N_("Handling of file attributes:"), GRID
},
468 {"owner", OWNER_OPTION
, N_("NAME"), 0,
469 N_("force NAME as owner for added files"), GRID
+1 },
470 {"group", GROUP_OPTION
, N_("NAME"), 0,
471 N_("force NAME as group for added files"), GRID
+1 },
472 {"mtime", MTIME_OPTION
, N_("DATE-OR-FILE"), 0,
473 N_("set mtime for added files from DATE-OR-FILE"), GRID
+1 },
474 {"mode", MODE_OPTION
, N_("CHANGES"), 0,
475 N_("force (symbolic) mode CHANGES for added files"), GRID
+1 },
476 {"atime-preserve", ATIME_PRESERVE_OPTION
,
477 N_("METHOD"), OPTION_ARG_OPTIONAL
,
478 N_("preserve access times on dumped files, either by restoring the times"
479 " after reading (METHOD='replace'; default) or by not setting the times"
480 " in the first place (METHOD='system')"), GRID
+1 },
482 N_("don't extract file modified time"), GRID
+1 },
483 {"same-owner", SAME_OWNER_OPTION
, 0, 0,
484 N_("try extracting files with the same ownership"), GRID
+1 },
485 {"no-same-owner", NO_SAME_OWNER_OPTION
, 0, 0,
486 N_("extract files as yourself"), GRID
+1 },
487 {"numeric-owner", NUMERIC_OWNER_OPTION
, 0, 0,
488 N_("always use numbers for user/group names"), GRID
+1 },
489 {"preserve-permissions", 'p', 0, 0,
490 N_("extract information about file permissions (default for superuser)"),
492 {"same-permissions", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
493 {"no-same-permissions", NO_SAME_PERMISSIONS_OPTION
, 0, 0,
494 N_("apply the user's umask when extracting permissions from the archive (default for ordinary users)"), GRID
+1 },
495 {"preserve-order", 's', 0, 0,
496 N_("sort names to extract to match archive"), GRID
+1 },
497 {"same-order", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
498 {"preserve", PRESERVE_OPTION
, 0, 0,
499 N_("same as both -p and -s"), GRID
+1 },
500 {"delay-directory-restore", DELAY_DIRECTORY_RESTORE_OPTION
, 0, 0,
501 N_("delay setting modification times and permissions of extracted"
502 " directories until the end of extraction"), GRID
+1 },
503 {"no-delay-directory-restore", NO_DELAY_DIRECTORY_RESTORE_OPTION
, 0, 0,
504 N_("cancel the effect of --delay-directory-restore option"), GRID
+1 },
509 N_("Device selection and switching:"), GRID
},
511 {"file", 'f', N_("ARCHIVE"), 0,
512 N_("use archive file or device ARCHIVE"), GRID
+1 },
513 {"force-local", FORCE_LOCAL_OPTION
, 0, 0,
514 N_("archive file is local even if it has a colon"), GRID
+1 },
515 {"rmt-command", RMT_COMMAND_OPTION
, N_("COMMAND"), 0,
516 N_("use given rmt COMMAND instead of rmt"), GRID
+1 },
517 {"rsh-command", RSH_COMMAND_OPTION
, N_("COMMAND"), 0,
518 N_("use remote COMMAND instead of rsh"), GRID
+1 },
520 {"-[0-7][lmh]", 0, NULL
, OPTION_DOC
, /* It is OK, since `name' will never be
522 N_("specify drive and density"), GRID
+1 },
524 {NULL
, '0', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
525 {NULL
, '1', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
526 {NULL
, '2', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
527 {NULL
, '3', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
528 {NULL
, '4', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
529 {NULL
, '5', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
530 {NULL
, '6', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
531 {NULL
, '7', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
532 {NULL
, '8', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
533 {NULL
, '9', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
535 {"multi-volume", 'M', 0, 0,
536 N_("create/list/extract multi-volume archive"), GRID
+1 },
537 {"tape-length", 'L', N_("NUMBER"), 0,
538 N_("change tape after writing NUMBER x 1024 bytes"), GRID
+1 },
539 {"info-script", 'F', N_("NAME"), 0,
540 N_("run script at end of each tape (implies -M)"), GRID
+1 },
541 {"new-volume-script", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
542 {"volno-file", VOLNO_FILE_OPTION
, N_("FILE"), 0,
543 N_("use/update the volume number in FILE"), GRID
+1 },
548 N_("Device blocking:"), GRID
},
550 {"blocking-factor", 'b', N_("BLOCKS"), 0,
551 N_("BLOCKS x 512 bytes per record"), GRID
+1 },
552 {"record-size", RECORD_SIZE_OPTION
, N_("NUMBER"), 0,
553 N_("NUMBER of bytes per record, multiple of 512"), GRID
+1 },
554 {"ignore-zeros", 'i', 0, 0,
555 N_("ignore zeroed blocks in archive (means EOF)"), GRID
+1 },
556 {"read-full-records", 'B', 0, 0,
557 N_("reblock as we read (for 4.2BSD pipes)"), GRID
+1 },
562 N_("Archive format selection:"), GRID
},
564 {"format", 'H', N_("FORMAT"), 0,
565 N_("create archive of the given format"), GRID
+1 },
567 {NULL
, 0, NULL
, 0, N_("FORMAT is one of the following:"), GRID
+2 },
568 {" v7", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("old V7 tar format"),
570 {" oldgnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
571 N_("GNU format as per tar <= 1.12"), GRID
+3 },
572 {" gnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
573 N_("GNU tar 1.13.x format"), GRID
+3 },
574 {" ustar", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
575 N_("POSIX 1003.1-1988 (ustar) format"), GRID
+3 },
576 {" pax", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
577 N_("POSIX 1003.1-2001 (pax) format"), GRID
+3 },
578 {" posix", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("same as pax"), GRID
+3 },
580 {"old-archive", OLD_ARCHIVE_OPTION
, 0, 0, /* FIXME */
581 N_("same as --format=v7"), GRID
+8 },
582 {"portability", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
583 {"posix", POSIX_OPTION
, 0, 0,
584 N_("same as --format=posix"), GRID
+8 },
585 {"pax-option", PAX_OPTION
, N_("keyword[[:]=value][,keyword[[:]=value]]..."), 0,
586 N_("control pax keywords"), GRID
+8 },
587 {"label", 'V', N_("TEXT"), 0,
588 N_("create archive with volume name TEXT; at list/extract time, use TEXT as a globbing pattern for volume name"), GRID
+8 },
593 N_("Compression options:"), GRID
},
594 {"auto-compress", 'a', 0, 0,
595 N_("use archive suffix to determine the compression program"), GRID
+1 },
596 {"no-auto-compress", NO_AUTO_COMPRESS_OPTION
, 0, 0,
597 N_("do not use archive suffix to determine the compression program"),
600 N_("filter the archive through bzip2"), GRID
+1 },
602 N_("filter the archive through gzip"), GRID
+1 },
603 {"gunzip", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
604 {"ungzip", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
605 {"compress", 'Z', 0, 0,
606 N_("filter the archive through compress"), GRID
+1 },
607 {"uncompress", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
608 {"lzma", LZMA_OPTION
, 0, 0,
609 N_("filter the archive through lzma"), GRID
+1 },
610 {"lzop", LZOP_OPTION
, 0, 0,
611 N_("filter the archive through lzop"), GRID
+8 },
613 N_("filter the archive through xz"), GRID
+8 },
614 {"use-compress-program", 'I', N_("PROG"), 0,
615 N_("filter through PROG (must accept -d)"), GRID
+1 },
620 N_("Local file selection:"), GRID
},
622 {"add-file", ARGP_KEY_ARG
, N_("FILE"), 0,
623 N_("add given FILE to the archive (useful if its name starts with a dash)"), GRID
+1 },
624 {"directory", 'C', N_("DIR"), 0,
625 N_("change to directory DIR"), GRID
+1 },
626 {"files-from", 'T', N_("FILE"), 0,
627 N_("get names to extract or create from FILE"), GRID
+1 },
628 {"null", NULL_OPTION
, 0, 0,
629 N_("-T reads null-terminated names, disable -C"), GRID
+1 },
630 {"no-null", NO_NULL_OPTION
, 0, 0,
631 N_("disable the effect of the previous --null option"), GRID
+1 },
632 {"unquote", UNQUOTE_OPTION
, 0, 0,
633 N_("unquote filenames read with -T (default)"), GRID
+1 },
634 {"no-unquote", NO_UNQUOTE_OPTION
, 0, 0,
635 N_("do not unquote filenames read with -T"), GRID
+1 },
636 {"exclude", EXCLUDE_OPTION
, N_("PATTERN"), 0,
637 N_("exclude files, given as a PATTERN"), GRID
+1 },
638 {"exclude-from", 'X', N_("FILE"), 0,
639 N_("exclude patterns listed in FILE"), GRID
+1 },
640 {"exclude-caches", EXCLUDE_CACHES_OPTION
, 0, 0,
641 N_("exclude contents of directories containing CACHEDIR.TAG, "
642 "except for the tag file itself"), GRID
+1 },
643 {"exclude-caches-under", EXCLUDE_CACHES_UNDER_OPTION
, 0, 0,
644 N_("exclude everything under directories containing CACHEDIR.TAG"),
646 {"exclude-caches-all", EXCLUDE_CACHES_ALL_OPTION
, 0, 0,
647 N_("exclude directories containing CACHEDIR.TAG"), GRID
+1 },
648 {"exclude-tag", EXCLUDE_TAG_OPTION
, N_("FILE"), 0,
649 N_("exclude contents of directories containing FILE, except"
650 " for FILE itself"), GRID
+1 },
651 {"exclude-tag-under", EXCLUDE_TAG_UNDER_OPTION
, N_("FILE"), 0,
652 N_("exclude everything under directories containing FILE"), GRID
+1 },
653 {"exclude-tag-all", EXCLUDE_TAG_ALL_OPTION
, N_("FILE"), 0,
654 N_("exclude directories containing FILE"), GRID
+1 },
655 {"exclude-vcs", EXCLUDE_VCS_OPTION
, NULL
, 0,
656 N_("exclude version control system directories"), GRID
+1 },
657 {"no-recursion", NO_RECURSION_OPTION
, 0, 0,
658 N_("avoid descending automatically in directories"), GRID
+1 },
659 {"one-file-system", ONE_FILE_SYSTEM_OPTION
, 0, 0,
660 N_("stay in local file system when creating archive"), GRID
+1 },
661 {"recursion", RECURSION_OPTION
, 0, 0,
662 N_("recurse into directories (default)"), GRID
+1 },
663 {"absolute-names", 'P', 0, 0,
664 N_("don't strip leading `/'s from file names"), GRID
+1 },
665 {"dereference", 'h', 0, 0,
666 N_("follow symlinks; archive and dump the files they point to"), GRID
+1 },
667 {"hard-dereference", HARD_DEREFERENCE_OPTION
, 0, 0,
668 N_("follow hard links; archive and dump the files they refer to"), GRID
+1 },
669 {"starting-file", 'K', N_("MEMBER-NAME"), 0,
670 N_("begin at member MEMBER-NAME in the archive"), GRID
+1 },
671 {"newer", 'N', N_("DATE-OR-FILE"), 0,
672 N_("only store files newer than DATE-OR-FILE"), GRID
+1 },
673 {"after-date", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
674 {"newer-mtime", NEWER_MTIME_OPTION
, N_("DATE"), 0,
675 N_("compare date and time when data changed only"), GRID
+1 },
676 {"backup", BACKUP_OPTION
, N_("CONTROL"), OPTION_ARG_OPTIONAL
,
677 N_("backup before removal, choose version CONTROL"), GRID
+1 },
678 {"suffix", SUFFIX_OPTION
, N_("STRING"), 0,
679 N_("backup before removal, override usual suffix ('~' unless overridden by environment variable SIMPLE_BACKUP_SUFFIX)"), GRID
+1 },
684 N_("File name transformations:"), GRID
},
685 {"strip-components", STRIP_COMPONENTS_OPTION
, N_("NUMBER"), 0,
686 N_("strip NUMBER leading components from file names on extraction"),
688 {"transform", TRANSFORM_OPTION
, N_("EXPRESSION"), 0,
689 N_("use sed replace EXPRESSION to transform file names"), GRID
+1 },
690 {"xform", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
695 N_("File name matching options (affect both exclude and include patterns):"),
697 {"ignore-case", IGNORE_CASE_OPTION
, 0, 0,
698 N_("ignore case"), GRID
+1 },
699 {"anchored", ANCHORED_OPTION
, 0, 0,
700 N_("patterns match file name start"), GRID
+1 },
701 {"no-anchored", NO_ANCHORED_OPTION
, 0, 0,
702 N_("patterns match after any `/' (default for exclusion)"), GRID
+1 },
703 {"no-ignore-case", NO_IGNORE_CASE_OPTION
, 0, 0,
704 N_("case sensitive matching (default)"), GRID
+1 },
705 {"wildcards", WILDCARDS_OPTION
, 0, 0,
706 N_("use wildcards (default for exclusion)"), GRID
+1 },
707 {"no-wildcards", NO_WILDCARDS_OPTION
, 0, 0,
708 N_("verbatim string matching"), GRID
+1 },
709 {"no-wildcards-match-slash", NO_WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
710 N_("wildcards do not match `/'"), GRID
+1 },
711 {"wildcards-match-slash", WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
712 N_("wildcards match `/' (default for exclusion)"), GRID
+1 },
717 N_("Informative output:"), GRID
},
719 {"verbose", 'v', 0, 0,
720 N_("verbosely list files processed"), GRID
+1 },
721 {"checkpoint", CHECKPOINT_OPTION
, N_("NUMBER"), OPTION_ARG_OPTIONAL
,
722 N_("display progress messages every NUMBERth record (default 10)"),
724 {"checkpoint-action", CHECKPOINT_ACTION_OPTION
, N_("ACTION"), 0,
725 N_("execute ACTION on each checkpoint"),
727 {"check-links", 'l', 0, 0,
728 N_("print a message if not all links are dumped"), GRID
+1 },
729 {"totals", TOTALS_OPTION
, N_("SIGNAL"), OPTION_ARG_OPTIONAL
,
730 N_("print total bytes after processing the archive; "
731 "with an argument - print total bytes when this SIGNAL is delivered; "
732 "Allowed signals are: SIGHUP, SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; "
733 "the names without SIG prefix are also accepted"), GRID
+1 },
734 {"utc", UTC_OPTION
, 0, 0,
735 N_("print file modification dates in UTC"), GRID
+1 },
736 {"index-file", INDEX_FILE_OPTION
, N_("FILE"), 0,
737 N_("send verbose output to FILE"), GRID
+1 },
738 {"block-number", 'R', 0, 0,
739 N_("show block number within archive with each message"), GRID
+1 },
740 {"interactive", 'w', 0, 0,
741 N_("ask for confirmation for every action"), GRID
+1 },
742 {"confirmation", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
743 {"show-defaults", SHOW_DEFAULTS_OPTION
, 0, 0,
744 N_("show tar defaults"), GRID
+1 },
745 {"show-omitted-dirs", SHOW_OMITTED_DIRS_OPTION
, 0, 0,
746 N_("when listing or extracting, list each directory that does not match search criteria"), GRID
+1 },
747 {"show-transformed-names", SHOW_TRANSFORMED_NAMES_OPTION
, 0, 0,
748 N_("show file or archive names after transformation"),
750 {"show-stored-names", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
751 {"quoting-style", QUOTING_STYLE_OPTION
, N_("STYLE"), 0,
752 N_("set name quoting style; see below for valid STYLE values"), GRID
+1 },
753 {"quote-chars", QUOTE_CHARS_OPTION
, N_("STRING"), 0,
754 N_("additionally quote characters from STRING"), GRID
+1 },
755 {"no-quote-chars", NO_QUOTE_CHARS_OPTION
, N_("STRING"), 0,
756 N_("disable quoting for characters from STRING"), GRID
+1 },
761 N_("Compatibility options:"), GRID
},
764 N_("when creating, same as --old-archive; when extracting, same as --no-same-owner"), GRID
+1 },
769 N_("Other options:"), GRID
},
771 {"restrict", RESTRICT_OPTION
, 0, 0,
772 N_("disable use of some potentially harmful options"), -1 },
774 {"help", '?', 0, 0, N_("give this help list"), -1},
775 {"usage", USAGE_OPTION
, 0, 0, N_("give a short usage message"), -1},
776 {"version", VERSION_OPTION
, 0, 0, N_("print program version"), -1},
777 /* FIXME -V (--label) conflicts with the default short option for
779 {"HANG", HANG_OPTION
, "SECS", OPTION_ARG_OPTIONAL
| OPTION_HIDDEN
,
780 N_("hang for SECS seconds (default 3600)"), 0},
786 static char const *const atime_preserve_args
[] =
788 "replace", "system", NULL
791 static enum atime_preserve
const atime_preserve_types
[] =
793 replace_atime_preserve
, system_atime_preserve
796 /* Make sure atime_preserve_types has as much entries as atime_preserve_args
797 (minus 1 for NULL guard) */
798 ARGMATCH_VERIFY (atime_preserve_args
, atime_preserve_types
);
800 /* Wildcard matching settings */
803 default_wildcards
, /* For exclusion == enable_wildcards,
804 for inclusion == disable_wildcards */
809 struct tar_args
/* Variables used during option parsing */
811 struct textual_date
*textual_date
; /* Keeps the arguments to --newer-mtime
812 and/or --date option if they are
814 enum wildcards wildcards
; /* Wildcard settings (--wildcards/
816 int matching_flags
; /* exclude_fnmatch options */
817 int include_anchored
; /* Pattern anchoring options used for
819 bool o_option
; /* True if -o option was given */
820 bool pax_option
; /* True if --pax-option was given */
821 char const *backup_suffix_string
; /* --suffix option argument */
822 char const *version_control_string
; /* --backup option argument */
823 bool input_files
; /* True if some input files where given */
824 int compress_autodetect
; /* True if compression autodetection should
825 be attempted when creating archives */
829 #define MAKE_EXCL_OPTIONS(args) \
830 ((((args)->wildcards != disable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
831 | (args)->matching_flags \
834 #define MAKE_INCL_OPTIONS(args) \
835 ((((args)->wildcards == enable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
836 | (args)->include_anchored \
837 | (args)->matching_flags \
844 static char *vcs_file
[] = {
876 for (i
= 0; vcs_file
[i
]; i
++)
877 add_exclude (excluded
, vcs_file
[i
], 0);
882 # define DECL_SHOW_DEFAULT_SETTINGS(stream, printer) \
885 "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s", \
886 archive_format_string (DEFAULT_ARCHIVE_FORMAT), \
887 DEFAULT_ARCHIVE, DEFAULT_BLOCKING, \
888 quoting_style_args[DEFAULT_QUOTING_STYLE], \
889 DEFAULT_RMT_COMMAND); \
890 printer (stream, " --rsh-command=%s", REMOTE_SHELL); \
891 printer (stream, "\n"); \
894 # define DECL_SHOW_DEFAULT_SETTINGS(stream, printer) \
897 "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s", \
898 archive_format_string (DEFAULT_ARCHIVE_FORMAT), \
899 DEFAULT_ARCHIVE, DEFAULT_BLOCKING, \
900 quoting_style_args[DEFAULT_QUOTING_STYLE], \
901 DEFAULT_RMT_COMMAND); \
902 printer (stream, "\n"); \
907 show_default_settings (FILE *fp
)
908 DECL_SHOW_DEFAULT_SETTINGS(fp
, fprintf
)
911 show_default_settings_fs (argp_fmtstream_t fs
)
912 DECL_SHOW_DEFAULT_SETTINGS(fs
, argp_fmtstream_printf
)
915 set_subcommand_option (enum subcommand subcommand
)
917 if (subcommand_option
!= UNKNOWN_SUBCOMMAND
918 && subcommand_option
!= subcommand
)
920 _("You may not specify more than one `-Acdtrux' option")));
922 subcommand_option
= subcommand
;
926 set_use_compress_program_option (const char *string
)
928 if (use_compress_program_option
929 && strcmp (use_compress_program_option
, string
) != 0)
930 USAGE_ERROR ((0, 0, _("Conflicting compression options")));
932 use_compress_program_option
= string
;
939 print_total_stats ();
940 #ifndef HAVE_SIGACTION
941 signal (signo
, sigstat
);
946 stat_on_signal (int signo
)
948 #ifdef HAVE_SIGACTION
949 struct sigaction act
;
950 act
.sa_handler
= sigstat
;
951 sigemptyset (&act
.sa_mask
);
953 sigaction (signo
, &act
, NULL
);
955 signal (signo
, sigstat
);
960 set_stat_signal (const char *name
)
967 { "SIGUSR1", SIGUSR1
},
969 { "SIGUSR2", SIGUSR2
},
971 { "SIGHUP", SIGHUP
},
973 { "SIGINT", SIGINT
},
975 { "SIGQUIT", SIGQUIT
},
980 for (p
= sigtab
; p
< sigtab
+ sizeof (sigtab
) / sizeof (sigtab
[0]); p
++)
981 if (strcmp (p
->name
, name
) == 0)
983 stat_on_signal (p
->signo
);
986 FATAL_ERROR ((0, 0, _("Unknown signal name: %s"), name
));
992 struct textual_date
*next
;
999 get_date_or_file (struct tar_args
*args
, const char *option
,
1000 const char *str
, struct timespec
*ts
)
1002 if (FILE_SYSTEM_PREFIX_LEN (str
) != 0
1007 if (deref_stat (dereference_option
, str
, &st
) != 0)
1010 USAGE_ERROR ((0, 0, _("Date sample file not found")));
1012 *ts
= get_stat_mtime (&st
);
1016 if (! get_date (ts
, str
, NULL
))
1018 WARN ((0, 0, _("Substituting %s for unknown date format %s"),
1019 tartime (*ts
, false), quote (str
)));
1024 struct textual_date
*p
= xmalloc (sizeof (*p
));
1028 p
->next
= args
->textual_date
;
1029 args
->textual_date
= p
;
1035 report_textual_dates (struct tar_args
*args
)
1037 struct textual_date
*p
;
1038 for (p
= args
->textual_date
; p
; )
1040 struct textual_date
*next
= p
->next
;
1041 char const *treated_as
= tartime (*p
->ts
, true);
1042 if (strcmp (p
->date
, treated_as
) != 0)
1043 WARN ((0, 0, _("Option %s: Treating date `%s' as %s"),
1044 p
->option
, p
->date
, treated_as
));
1051 static volatile int _argp_hang
;
1053 /* Either NL or NUL, as decided by the --null option. */
1054 static char filename_terminator
;
1056 enum read_file_list_state
/* Result of reading file name from the list file */
1058 file_list_success
, /* OK, name read successfully */
1059 file_list_end
, /* End of list file */
1060 file_list_zero
, /* Zero separator encountered where it should not */
1061 file_list_skip
/* Empty (zero-length) entry encountered, skip it */
1064 /* Read from FP a sequence of characters up to TERM and put them
1067 static enum read_file_list_state
1068 read_name_from_file (FILE *fp
, struct obstack
*stk
, int term
)
1073 for (c
= getc (fp
); c
!= EOF
&& c
!= term
; c
= getc (fp
))
1077 /* We have read a zero separator. The file possibly is
1079 return file_list_zero
;
1081 obstack_1grow (stk
, c
);
1085 if (counter
== 0 && c
!= EOF
)
1086 return file_list_skip
;
1088 obstack_1grow (stk
, 0);
1090 return (counter
== 0 && c
== EOF
) ? file_list_end
: file_list_success
;
1094 static bool files_from_option
; /* When set, tar will not refuse to create
1096 static struct obstack argv_stk
; /* Storage for additional command line options
1097 read using -T option */
1099 /* Prevent recursive inclusion of the same file */
1102 struct file_id_list
*next
;
1107 static struct file_id_list
*file_id_list
;
1110 add_file_id (const char *filename
)
1112 struct file_id_list
*p
;
1115 if (stat (filename
, &st
))
1116 stat_fatal (filename
);
1117 for (p
= file_id_list
; p
; p
= p
->next
)
1118 if (p
->ino
== st
.st_ino
&& p
->dev
== st
.st_dev
)
1120 FATAL_ERROR ((0, 0, _("%s: file list already read"),
1121 quotearg_colon (filename
)));
1123 p
= xmalloc (sizeof *p
);
1124 p
->next
= file_id_list
;
1130 /* Default density numbers for [0-9][lmh] device specifications */
1132 #ifndef LOW_DENSITY_NUM
1133 # define LOW_DENSITY_NUM 0
1136 #ifndef MID_DENSITY_NUM
1137 # define MID_DENSITY_NUM 8
1140 #ifndef HIGH_DENSITY_NUM
1141 # define HIGH_DENSITY_NUM 16
1145 update_argv (const char *filename
, struct argp_state
*state
)
1148 size_t count
= 0, i
;
1152 bool is_stdin
= false;
1153 enum read_file_list_state read_state
;
1154 int term
= filename_terminator
;
1156 if (!strcmp (filename
, "-"))
1159 request_stdin ("-T");
1164 add_file_id (filename
);
1165 if ((fp
= fopen (filename
, "r")) == NULL
)
1166 open_fatal (filename
);
1169 while ((read_state
= read_name_from_file (fp
, &argv_stk
, term
))
1174 case file_list_success
:
1178 case file_list_end
: /* won't happen, just to pacify gcc */
1181 case file_list_zero
:
1185 WARN ((0, 0, N_("%s: file name read contains nul character"),
1186 quotearg_colon (filename
)));
1188 /* Prepare new stack contents */
1189 size
= obstack_object_size (&argv_stk
);
1190 p
= obstack_finish (&argv_stk
);
1191 for (; size
> 0; size
--, p
++)
1193 obstack_1grow (&argv_stk
, *p
);
1195 obstack_1grow (&argv_stk
, '\n');
1196 obstack_1grow (&argv_stk
, 0);
1198 /* Read rest of files using new filename terminator */
1203 case file_list_skip
:
1214 start
= obstack_finish (&argv_stk
);
1217 for (p
= start
; *p
; p
+= strlen (p
) + 1)
1221 new_argc
= state
->argc
+ count
;
1222 new_argv
= xmalloc (sizeof (state
->argv
[0]) * (new_argc
+ 1));
1223 memcpy (new_argv
, state
->argv
, sizeof (state
->argv
[0]) * (state
->argc
+ 1));
1224 state
->argv
= new_argv
;
1225 memmove (&state
->argv
[state
->next
+ count
], &state
->argv
[state
->next
],
1226 (state
->argc
- state
->next
+ 1) * sizeof (state
->argv
[0]));
1228 state
->argc
= new_argc
;
1230 for (i
= state
->next
, p
= start
; *p
; p
+= strlen (p
) + 1, i
++)
1232 if (term
== 0 && p
[0] == '-')
1233 state
->argv
[i
++] = "--add-file";
1240 tar_help (struct argp_state
*state
)
1242 argp_fmtstream_t fs
;
1243 state
->flags
|= ARGP_NO_EXIT
;
1244 argp_state_help (state
, state
->out_stream
,
1245 ARGP_HELP_STD_HELP
& ~ARGP_HELP_BUG_ADDR
);
1246 /* FIXME: use struct uparams.rmargin (from argp-help.c) instead of 79 */
1247 fs
= argp_make_fmtstream (state
->out_stream
, 0, 79, 0);
1249 argp_fmtstream_printf (fs
, "\n%s\n\n",
1250 _("Valid arguments for --quoting-style options are:"));
1251 tar_list_quoting_styles (fs
, " ");
1253 argp_fmtstream_puts (fs
, _("\n*This* tar defaults to:\n"));
1254 show_default_settings_fs (fs
);
1255 argp_fmtstream_putc (fs
, '\n');
1256 argp_fmtstream_printf (fs
, _("Report bugs to %s.\n"),
1257 argp_program_bug_address
);
1258 argp_fmtstream_free (fs
);
1262 parse_opt (int key
, char *arg
, struct argp_state
*state
)
1264 struct tar_args
*args
= state
->input
;
1269 /* File name or non-parsed option, because of ARGP_IN_ORDER */
1270 name_add_name (arg
, MAKE_INCL_OPTIONS (args
));
1271 args
->input_files
= true;
1275 set_subcommand_option (CAT_SUBCOMMAND
);
1279 args
->compress_autodetect
= true;
1282 case NO_AUTO_COMPRESS_OPTION
:
1283 args
->compress_autodetect
= false;
1289 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1290 && u
== (blocking_factor
= u
)
1291 && 0 < blocking_factor
1292 && u
== (record_size
= u
* BLOCKSIZE
) / BLOCKSIZE
))
1293 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1294 _("Invalid blocking factor")));
1299 /* Try to reblock input records. For reading 4.2BSD pipes. */
1301 /* It would surely make sense to exchange -B and -R, but it seems
1302 that -B has been used for a long while in Sun tar and most
1303 BSD-derived systems. This is a consequence of the block/record
1304 terminology confusion. */
1306 read_full_records_option
= true;
1310 set_subcommand_option (CREATE_SUBCOMMAND
);
1318 set_subcommand_option (DIFF_SUBCOMMAND
);
1322 if (archive_names
== allocated_archive_names
)
1323 archive_name_array
= x2nrealloc (archive_name_array
,
1324 &allocated_archive_names
,
1325 sizeof (archive_name_array
[0]));
1327 archive_name_array
[archive_names
++] = arg
;
1331 /* Since -F is only useful with -M, make it implied. Run this
1332 script at the end of each tape. */
1334 info_script_option
= arg
;
1335 multi_volume_option
= true;
1339 listed_incremental_option
= arg
;
1340 after_date_option
= true;
1344 /* We are making an incremental dump (FIXME: are we?); save
1345 directories at the beginning of the archive, and include in each
1346 directory its contents. */
1348 incremental_option
= true;
1352 /* Follow symbolic links. */
1353 dereference_option
= true;
1356 case HARD_DEREFERENCE_OPTION
:
1357 hard_dereference_option
= true;
1361 /* Ignore zero blocks (eofs). This can't be the default,
1362 because Unix tar writes two blocks of zeros, then pads out
1363 the record with garbage. */
1365 ignore_zeros_option
= true;
1369 set_use_compress_program_option ("bzip2");
1373 set_use_compress_program_option ("xz");
1377 /* Don't replace existing files. */
1378 old_files_option
= KEEP_OLD_FILES
;
1382 starting_file_option
= true;
1386 case ONE_FILE_SYSTEM_OPTION
:
1387 /* When dumping directories, don't dump files/subdirectories
1388 that are on other filesystems. */
1389 one_file_system_option
= true;
1393 check_links_option
= 1;
1399 if (xstrtoumax (arg
, 0, 10, &u
, "") != LONGINT_OK
)
1400 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1401 _("Invalid tape length")));
1402 tape_length_option
= 1024 * (tarlong
) u
;
1403 multi_volume_option
= true;
1408 set_use_compress_program_option ("lzma");
1412 set_use_compress_program_option ("lzop");
1416 touch_option
= true;
1420 /* Make multivolume archive: when we can't write any more into
1421 the archive, re-open it, and continue writing. */
1423 multi_volume_option
= true;
1427 get_date_or_file (args
, "--mtime", arg
, &mtime_option
);
1428 set_mtime_option
= true;
1432 seekable_archive
= true;
1436 after_date_option
= true;
1439 case NEWER_MTIME_OPTION
:
1440 if (NEWER_OPTION_INITIALIZED (newer_mtime_option
))
1441 USAGE_ERROR ((0, 0, _("More than one threshold date")));
1442 get_date_or_file (args
,
1443 key
== NEWER_MTIME_OPTION
? "--newer-mtime"
1444 : "--after-date", arg
, &newer_mtime_option
);
1448 args
->o_option
= true;
1452 to_stdout_option
= true;
1456 same_permissions_option
= true;
1460 absolute_names_option
= true;
1464 set_subcommand_option (APPEND_SUBCOMMAND
);
1468 /* Print block numbers for debugging bad tar archives. */
1470 /* It would surely make sense to exchange -B and -R, but it seems
1471 that -B has been used for a long while in Sun tar and most
1472 BSD-derived systems. This is a consequence of the block/record
1473 terminology confusion. */
1475 block_number_option
= true;
1479 /* Names to extract are sorted. */
1481 same_order_option
= true;
1485 sparse_option
= true;
1488 case SPARSE_VERSION_OPTION
:
1489 sparse_option
= true;
1492 tar_sparse_major
= strtoul (arg
, &p
, 10);
1496 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1497 tar_sparse_minor
= strtoul (p
+ 1, &p
, 10);
1499 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1505 set_subcommand_option (LIST_SUBCOMMAND
);
1509 case TEST_LABEL_OPTION
:
1510 set_subcommand_option (LIST_SUBCOMMAND
);
1511 test_label_option
= true;
1515 update_argv (arg
, state
);
1516 /* Indicate we've been given -T option. This is for backward
1517 compatibility only, so that `tar cfT archive /dev/null will
1519 files_from_option
= true;
1523 set_subcommand_option (UPDATE_SUBCOMMAND
);
1527 old_files_option
= UNLINK_FIRST_OLD_FILES
;
1539 volume_label_option
= arg
;
1543 interactive_option
= true;
1547 verify_option
= true;
1551 set_subcommand_option (EXTRACT_SUBCOMMAND
);
1555 if (add_exclude_file (add_exclude
, excluded
, arg
,
1556 MAKE_EXCL_OPTIONS (args
), '\n')
1560 FATAL_ERROR ((0, e
, "%s", quotearg_colon (arg
)));
1565 set_use_compress_program_option ("gzip");
1569 set_use_compress_program_option ("compress");
1572 case ANCHORED_OPTION
:
1573 args
->matching_flags
|= EXCLUDE_ANCHORED
;
1576 case ATIME_PRESERVE_OPTION
:
1577 atime_preserve_option
=
1579 ? XARGMATCH ("--atime-preserve", arg
,
1580 atime_preserve_args
, atime_preserve_types
)
1581 : replace_atime_preserve
);
1582 if (! O_NOATIME
&& atime_preserve_option
== system_atime_preserve
)
1584 _("--atime-preserve='system' is not supported"
1585 " on this platform")));
1588 case CHECK_DEVICE_OPTION
:
1589 check_device_option
= true;
1592 case NO_CHECK_DEVICE_OPTION
:
1593 check_device_option
= false;
1596 case CHECKPOINT_OPTION
:
1603 checkpoint_compile_action (".");
1606 checkpoint_option
= strtoul (arg
, &p
, 0);
1609 _("--checkpoint value is not an integer")));
1612 checkpoint_option
= DEFAULT_CHECKPOINT
;
1615 case CHECKPOINT_ACTION_OPTION
:
1616 checkpoint_compile_action (arg
);
1620 backup_option
= true;
1622 args
->version_control_string
= arg
;
1625 case DELAY_DIRECTORY_RESTORE_OPTION
:
1626 delay_directory_restore_option
= true;
1629 case NO_DELAY_DIRECTORY_RESTORE_OPTION
:
1630 delay_directory_restore_option
= false;
1634 set_subcommand_option (DELETE_SUBCOMMAND
);
1637 case EXCLUDE_OPTION
:
1638 add_exclude (excluded
, arg
, MAKE_EXCL_OPTIONS (args
));
1641 case EXCLUDE_CACHES_OPTION
:
1642 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_contents
,
1646 case EXCLUDE_CACHES_UNDER_OPTION
:
1647 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_under
,
1651 case EXCLUDE_CACHES_ALL_OPTION
:
1652 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_all
,
1656 case EXCLUDE_TAG_OPTION
:
1657 add_exclusion_tag (arg
, exclusion_tag_contents
, NULL
);
1660 case EXCLUDE_TAG_UNDER_OPTION
:
1661 add_exclusion_tag (arg
, exclusion_tag_under
, NULL
);
1664 case EXCLUDE_TAG_ALL_OPTION
:
1665 add_exclusion_tag (arg
, exclusion_tag_all
, NULL
);
1668 case EXCLUDE_VCS_OPTION
:
1669 exclude_vcs_files ();
1672 case FORCE_LOCAL_OPTION
:
1673 force_local_option
= true;
1677 set_archive_format (arg
);
1680 case INDEX_FILE_OPTION
:
1681 index_file_name
= arg
;
1684 case IGNORE_CASE_OPTION
:
1685 args
->matching_flags
|= FNM_CASEFOLD
;
1688 case IGNORE_COMMAND_ERROR_OPTION
:
1689 ignore_command_error_option
= true;
1692 case IGNORE_FAILED_READ_OPTION
:
1693 ignore_failed_read_option
= true;
1696 case KEEP_NEWER_FILES_OPTION
:
1697 old_files_option
= KEEP_NEWER_FILES
;
1701 if (! (strlen (arg
) < GNAME_FIELD_SIZE
1702 && gname_to_gid (arg
, &group_option
)))
1705 if (xstrtoumax (arg
, 0, 10, &g
, "") == LONGINT_OK
1709 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1710 _("%s: Invalid group")));
1715 mode_option
= mode_compile (arg
);
1717 FATAL_ERROR ((0, 0, _("Invalid mode given on option")));
1718 initial_umask
= umask (0);
1719 umask (initial_umask
);
1722 case NO_ANCHORED_OPTION
:
1723 args
->include_anchored
= 0; /* Clear the default for comman line args */
1724 args
->matching_flags
&= ~ EXCLUDE_ANCHORED
;
1727 case NO_IGNORE_CASE_OPTION
:
1728 args
->matching_flags
&= ~ FNM_CASEFOLD
;
1731 case NO_IGNORE_COMMAND_ERROR_OPTION
:
1732 ignore_command_error_option
= false;
1735 case NO_OVERWRITE_DIR_OPTION
:
1736 old_files_option
= NO_OVERWRITE_DIR_OLD_FILES
;
1739 case NO_QUOTE_CHARS_OPTION
:
1741 set_char_quoting (NULL
, *arg
, 0);
1744 case NO_WILDCARDS_OPTION
:
1745 args
->wildcards
= disable_wildcards
;
1748 case NO_WILDCARDS_MATCH_SLASH_OPTION
:
1749 args
->matching_flags
|= FNM_FILE_NAME
;
1753 filename_terminator
= '\0';
1756 case NO_NULL_OPTION
:
1757 filename_terminator
= '\n';
1760 case NUMERIC_OWNER_OPTION
:
1761 numeric_owner_option
= true;
1764 case OCCURRENCE_OPTION
:
1766 occurrence_option
= 1;
1770 if (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
)
1771 occurrence_option
= u
;
1773 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1774 _("Invalid number")));
1778 case OVERWRITE_DIR_OPTION
:
1779 old_files_option
= DEFAULT_OLD_FILES
;
1782 case OVERWRITE_OPTION
:
1783 old_files_option
= OVERWRITE_OLD_FILES
;
1787 if (! (strlen (arg
) < UNAME_FIELD_SIZE
1788 && uname_to_uid (arg
, &owner_option
)))
1791 if (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1795 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1796 _("Invalid owner")));
1800 case QUOTE_CHARS_OPTION
:
1802 set_char_quoting (NULL
, *arg
, 1);
1805 case QUOTING_STYLE_OPTION
:
1806 tar_set_quoting_style (arg
);
1810 args
->pax_option
= true;
1811 xheader_set_option (arg
);
1815 set_archive_format ("posix");
1818 case PRESERVE_OPTION
:
1819 /* FIXME: What it is good for? */
1820 same_permissions_option
= true;
1821 same_order_option
= true;
1822 WARN ((0, 0, _("The --preserve option is deprecated, "
1823 "use --preserve-permissions --preserve-order instead")));
1826 case RECORD_SIZE_OPTION
:
1829 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1830 && u
== (size_t) u
))
1831 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1832 _("Invalid record size")));
1834 if (record_size
% BLOCKSIZE
!= 0)
1835 USAGE_ERROR ((0, 0, _("Record size must be a multiple of %d."),
1837 blocking_factor
= record_size
/ BLOCKSIZE
;
1841 case RECURSIVE_UNLINK_OPTION
:
1842 recursive_unlink_option
= true;
1845 case REMOVE_FILES_OPTION
:
1846 remove_files_option
= true;
1849 case RESTRICT_OPTION
:
1850 restrict_option
= true;
1853 case RMT_COMMAND_OPTION
:
1857 case RSH_COMMAND_OPTION
:
1858 rsh_command_option
= arg
;
1861 case SHOW_DEFAULTS_OPTION
:
1862 show_default_settings (stdout
);
1866 case STRIP_COMPONENTS_OPTION
:
1869 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1870 && u
== (size_t) u
))
1871 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1872 _("Invalid number of elements")));
1873 strip_name_components
= u
;
1877 case SHOW_OMITTED_DIRS_OPTION
:
1878 show_omitted_dirs_option
= true;
1881 case SHOW_TRANSFORMED_NAMES_OPTION
:
1882 show_transformed_names_option
= true;
1886 backup_option
= true;
1887 args
->backup_suffix_string
= arg
;
1890 case TO_COMMAND_OPTION
:
1891 if (to_command_option
)
1892 USAGE_ERROR ((0, 0, _("Only one --to-command option allowed")));
1893 to_command_option
= arg
;
1898 set_stat_signal (arg
);
1900 totals_option
= true;
1903 case TRANSFORM_OPTION
:
1904 set_transform_expr (arg
);
1908 set_use_compress_program_option (arg
);
1911 case VOLNO_FILE_OPTION
:
1912 volno_file_option
= arg
;
1915 case WILDCARDS_OPTION
:
1916 args
->wildcards
= enable_wildcards
;
1919 case WILDCARDS_MATCH_SLASH_OPTION
:
1920 args
->matching_flags
&= ~ FNM_FILE_NAME
;
1923 case NO_RECURSION_OPTION
:
1924 recursion_option
= 0;
1927 case NO_SAME_OWNER_OPTION
:
1928 same_owner_option
= -1;
1931 case NO_SAME_PERMISSIONS_OPTION
:
1932 same_permissions_option
= -1;
1935 case RECURSION_OPTION
:
1936 recursion_option
= FNM_LEADING_DIR
;
1939 case SAME_OWNER_OPTION
:
1940 same_owner_option
= 1;
1943 case UNQUOTE_OPTION
:
1944 unquote_option
= true;
1947 case NO_UNQUOTE_OPTION
:
1948 unquote_option
= false;
1960 #ifdef DEVICE_PREFIX
1962 int device
= key
- '0';
1964 static char buf
[sizeof DEVICE_PREFIX
+ 10];
1968 argp_error (state
, _("Malformed density argument: %s"), quote (arg
));
1970 strcpy (buf
, DEVICE_PREFIX
);
1971 cursor
= buf
+ strlen (buf
);
1973 #ifdef DENSITY_LETTER
1975 sprintf (cursor
, "%d%c", device
, arg
[0]);
1977 #else /* not DENSITY_LETTER */
1982 device
+= LOW_DENSITY_NUM
;
1986 device
+= MID_DENSITY_NUM
;
1990 device
+= HIGH_DENSITY_NUM
;
1994 argp_error (state
, _("Unknown density: `%c'"), arg
[0]);
1996 sprintf (cursor
, "%d", device
);
1998 #endif /* not DENSITY_LETTER */
2000 if (archive_names
== allocated_archive_names
)
2001 archive_name_array
= x2nrealloc (archive_name_array
,
2002 &allocated_archive_names
,
2003 sizeof (archive_name_array
[0]));
2004 archive_name_array
[archive_names
++] = xstrdup (buf
);
2008 #else /* not DEVICE_PREFIX */
2011 _("Options `-[0-7][lmh]' not supported by *this* tar"));
2013 #endif /* not DEVICE_PREFIX */
2021 argp_state_help (state
, state
->out_stream
, ARGP_HELP_USAGE
);
2025 case VERSION_OPTION
:
2026 version_etc (state
->out_stream
, "tar", PACKAGE_NAME
, VERSION
,
2027 "John Gilmore", "Jay Fenlason", (char *) NULL
);
2032 _argp_hang
= atoi (arg
? arg
: "3600");
2033 while (_argp_hang
-- > 0)
2038 return ARGP_ERR_UNKNOWN
;
2043 static struct argp argp
= {
2056 argp_help (&argp
, stderr
, ARGP_HELP_SEE
, (char*) program_name
);
2061 /* Parse the options for tar. */
2063 static struct argp_option
*
2064 find_argp_option (struct argp_option
*o
, int letter
)
2071 && o
->doc
== NULL
); o
++)
2072 if (o
->key
== letter
)
2078 decode_options (int argc
, char **argv
)
2081 struct tar_args args
;
2083 /* Set some default option values. */
2084 args
.textual_date
= NULL
;
2085 args
.wildcards
= default_wildcards
;
2086 args
.matching_flags
= 0;
2087 args
.include_anchored
= EXCLUDE_ANCHORED
;
2088 args
.o_option
= false;
2089 args
.pax_option
= false;
2090 args
.backup_suffix_string
= getenv ("SIMPLE_BACKUP_SUFFIX");
2091 args
.version_control_string
= 0;
2092 args
.input_files
= false;
2093 args
.compress_autodetect
= false;
2095 subcommand_option
= UNKNOWN_SUBCOMMAND
;
2096 archive_format
= DEFAULT_FORMAT
;
2097 blocking_factor
= DEFAULT_BLOCKING
;
2098 record_size
= DEFAULT_BLOCKING
* BLOCKSIZE
;
2099 excluded
= new_exclude ();
2100 newer_mtime_option
.tv_sec
= TYPE_MINIMUM (time_t);
2101 newer_mtime_option
.tv_nsec
= -1;
2102 recursion_option
= FNM_LEADING_DIR
;
2103 unquote_option
= true;
2104 tar_sparse_major
= 1;
2105 tar_sparse_minor
= 0;
2110 check_device_option
= true;
2112 /* Convert old-style tar call by exploding option element and rearranging
2113 options accordingly. */
2115 if (argc
> 1 && argv
[1][0] != '-')
2117 int new_argc
; /* argc value for rearranged arguments */
2118 char **new_argv
; /* argv value for rearranged arguments */
2119 char *const *in
; /* cursor into original argv */
2120 char **out
; /* cursor into rearranged argv */
2121 const char *letter
; /* cursor into old option letters */
2122 char buffer
[3]; /* constructed option buffer */
2124 /* Initialize a constructed option. */
2129 /* Allocate a new argument array, and copy program name in it. */
2131 new_argc
= argc
- 1 + strlen (argv
[1]);
2132 new_argv
= xmalloc ((new_argc
+ 1) * sizeof (char *));
2137 /* Copy each old letter option as a separate option, and have the
2138 corresponding argument moved next to it. */
2140 for (letter
= *in
++; *letter
; letter
++)
2142 struct argp_option
*opt
;
2144 buffer
[1] = *letter
;
2145 *out
++ = xstrdup (buffer
);
2146 opt
= find_argp_option (options
, *letter
);
2147 if (opt
&& opt
->arg
)
2149 if (in
< argv
+ argc
)
2152 USAGE_ERROR ((0, 0, _("Old option `%c' requires an argument."),
2157 /* Copy all remaining options. */
2159 while (in
< argv
+ argc
)
2163 /* Replace the old option list by the new one. */
2169 /* Parse all options and non-options as they appear. */
2171 prepend_default_options (getenv ("TAR_OPTIONS"), &argc
, &argv
);
2173 if (argp_parse (&argp
, argc
, argv
, ARGP_IN_ORDER
|ARGP_NO_HELP
,
2175 exit (TAREXIT_FAILURE
);
2178 /* Special handling for 'o' option:
2180 GNU tar used to say "output old format".
2181 UNIX98 tar says don't chown files after extracting (we use
2182 "--no-same-owner" for this).
2184 The old GNU tar semantics is retained when used with --create
2185 option, otherwise UNIX98 semantics is assumed */
2189 if (subcommand_option
== CREATE_SUBCOMMAND
)
2191 /* GNU Tar <= 1.13 compatibility */
2192 set_archive_format ("v7");
2196 /* UNIX98 compatibility */
2197 same_owner_option
= -1;
2201 /* Handle operands after any "--" argument. */
2202 for (; idx
< argc
; idx
++)
2204 name_add_name (argv
[idx
], MAKE_INCL_OPTIONS (&args
));
2205 args
.input_files
= true;
2208 /* Warn about implicit use of the wildcards in command line arguments.
2210 warn_regex_usage
= args
.wildcards
== default_wildcards
;
2212 /* Derive option values and check option consistency. */
2214 if (archive_format
== DEFAULT_FORMAT
)
2216 if (args
.pax_option
)
2217 archive_format
= POSIX_FORMAT
;
2219 archive_format
= DEFAULT_ARCHIVE_FORMAT
;
2222 if ((volume_label_option
&& subcommand_option
== CREATE_SUBCOMMAND
)
2223 || incremental_option
2224 || multi_volume_option
2226 assert_format (FORMAT_MASK (OLDGNU_FORMAT
)
2227 | FORMAT_MASK (GNU_FORMAT
)
2228 | FORMAT_MASK (POSIX_FORMAT
));
2230 if (occurrence_option
)
2232 if (!args
.input_files
)
2234 _("--occurrence is meaningless without a file list")));
2235 if (subcommand_option
!= DELETE_SUBCOMMAND
2236 && subcommand_option
!= DIFF_SUBCOMMAND
2237 && subcommand_option
!= EXTRACT_SUBCOMMAND
2238 && subcommand_option
!= LIST_SUBCOMMAND
)
2240 _("--occurrence cannot be used in the requested operation mode")));
2243 if (seekable_archive
&& subcommand_option
== DELETE_SUBCOMMAND
)
2245 /* The current code in delete.c is based on the assumption that
2246 skip_member() reads all data from the archive. So, we should
2247 make sure it won't use seeks. On the other hand, the same code
2248 depends on the ability to backspace a record in the archive,
2249 so setting seekable_archive to false is technically incorrect.
2250 However, it is tested only in skip_member(), so it's not a
2252 seekable_archive
= false;
2255 if (archive_names
== 0)
2257 /* If no archive file name given, try TAPE from the environment, or
2258 else, DEFAULT_ARCHIVE from the configuration process. */
2261 archive_name_array
[0] = getenv ("TAPE");
2262 if (! archive_name_array
[0])
2263 archive_name_array
[0] = DEFAULT_ARCHIVE
;
2266 /* Allow multiple archives only with `-M'. */
2268 if (archive_names
> 1 && !multi_volume_option
)
2270 _("Multiple archive files require `-M' option")));
2272 if (listed_incremental_option
2273 && NEWER_OPTION_INITIALIZED (newer_mtime_option
))
2275 _("Cannot combine --listed-incremental with --newer")));
2277 if (volume_label_option
)
2279 if (archive_format
== GNU_FORMAT
|| archive_format
== OLDGNU_FORMAT
)
2281 size_t volume_label_max_len
=
2282 (sizeof current_header
->header
.name
2283 - 1 /* for trailing '\0' */
2284 - (multi_volume_option
2285 ? (sizeof " Volume "
2286 - 1 /* for null at end of " Volume " */
2287 + INT_STRLEN_BOUND (int) /* for volume number */
2288 - 1 /* for sign, as 0 <= volno */)
2290 if (volume_label_max_len
< strlen (volume_label_option
))
2292 ngettext ("%s: Volume label is too long (limit is %lu byte)",
2293 "%s: Volume label is too long (limit is %lu bytes)",
2294 volume_label_max_len
),
2295 quotearg_colon (volume_label_option
),
2296 (unsigned long) volume_label_max_len
));
2299 Label length in PAX format is limited by the volume size. */
2304 if (multi_volume_option
)
2305 USAGE_ERROR ((0, 0, _("Cannot verify multi-volume archives")));
2306 if (use_compress_program_option
)
2307 USAGE_ERROR ((0, 0, _("Cannot verify compressed archives")));
2310 if (use_compress_program_option
)
2312 if (multi_volume_option
)
2313 USAGE_ERROR ((0, 0, _("Cannot use multi-volume compressed archives")));
2314 if (subcommand_option
== UPDATE_SUBCOMMAND
2315 || subcommand_option
== APPEND_SUBCOMMAND
2316 || subcommand_option
== DELETE_SUBCOMMAND
)
2317 USAGE_ERROR ((0, 0, _("Cannot update compressed archives")));
2318 if (subcommand_option
== CAT_SUBCOMMAND
)
2319 USAGE_ERROR ((0, 0, _("Cannot concatenate compressed archives")));
2322 /* It is no harm to use --pax-option on non-pax archives in archive
2323 reading mode. It may even be useful, since it allows to override
2324 file attributes from tar headers. Therefore I allow such usage.
2327 && archive_format
!= POSIX_FORMAT
2328 && (subcommand_option
!= EXTRACT_SUBCOMMAND
2329 || subcommand_option
!= DIFF_SUBCOMMAND
2330 || subcommand_option
!= LIST_SUBCOMMAND
))
2331 USAGE_ERROR ((0, 0, _("--pax-option can be used only on POSIX archives")));
2333 /* If ready to unlink hierarchies, so we are for simpler files. */
2334 if (recursive_unlink_option
)
2335 old_files_option
= UNLINK_FIRST_OLD_FILES
;
2338 if (test_label_option
)
2340 /* --test-label is silent if the user has specified the label name to
2342 if (!args
.input_files
)
2345 else if (utc_option
)
2348 if (tape_length_option
&& tape_length_option
< record_size
)
2349 USAGE_ERROR ((0, 0, _("Volume length cannot be less than record size")));
2351 if (same_order_option
&& listed_incremental_option
)
2352 USAGE_ERROR ((0, 0, _("--preserve-order is not compatible with "
2353 "--listed-incremental")));
2355 /* Forbid using -c with no input files whatsoever. Check that `-f -',
2356 explicit or implied, is used correctly. */
2358 switch (subcommand_option
)
2360 case CREATE_SUBCOMMAND
:
2361 if (!args
.input_files
&& !files_from_option
)
2363 _("Cowardly refusing to create an empty archive")));
2364 if (args
.compress_autodetect
&& archive_names
2365 && strcmp (archive_name_array
[0], "-"))
2366 set_comression_program_by_suffix (archive_name_array
[0],
2367 use_compress_program_option
);
2370 case EXTRACT_SUBCOMMAND
:
2371 case LIST_SUBCOMMAND
:
2372 case DIFF_SUBCOMMAND
:
2373 for (archive_name_cursor
= archive_name_array
;
2374 archive_name_cursor
< archive_name_array
+ archive_names
;
2375 archive_name_cursor
++)
2376 if (!strcmp (*archive_name_cursor
, "-"))
2377 request_stdin ("-f");
2380 case CAT_SUBCOMMAND
:
2381 case UPDATE_SUBCOMMAND
:
2382 case APPEND_SUBCOMMAND
:
2383 for (archive_name_cursor
= archive_name_array
;
2384 archive_name_cursor
< archive_name_array
+ archive_names
;
2385 archive_name_cursor
++)
2386 if (!strcmp (*archive_name_cursor
, "-"))
2388 _("Options `-Aru' are incompatible with `-f -'")));
2394 /* Initialize stdlis */
2395 if (index_file_name
)
2397 stdlis
= fopen (index_file_name
, "w");
2399 open_error (index_file_name
);
2402 stdlis
= to_stdout_option
? stderr
: stdout
;
2404 archive_name_cursor
= archive_name_array
;
2406 /* Prepare for generating backup names. */
2408 if (args
.backup_suffix_string
)
2409 simple_backup_suffix
= xstrdup (args
.backup_suffix_string
);
2413 backup_type
= xget_version ("--backup", args
.version_control_string
);
2414 /* No backup is needed either if explicitely disabled or if
2415 the extracted files are not being written to disk. */
2416 if (backup_type
== no_backups
|| EXTRACT_OVER_PIPE
)
2417 backup_option
= false;
2420 checkpoint_finish_compile ();
2423 report_textual_dates (&args
);
2429 /* Main routine for tar. */
2431 main (int argc
, char **argv
)
2434 program_name
= argv
[0];
2436 setlocale (LC_ALL
, "");
2437 bindtextdomain (PACKAGE
, LOCALEDIR
);
2438 textdomain (PACKAGE
);
2440 exit_failure
= TAREXIT_FAILURE
;
2441 exit_status
= TAREXIT_SUCCESS
;
2442 filename_terminator
= '\n';
2443 set_quoting_style (0, DEFAULT_QUOTING_STYLE
);
2445 /* Make sure we have first three descriptors available */
2448 /* Pre-allocate a few structures. */
2450 allocated_archive_names
= 10;
2451 archive_name_array
=
2452 xmalloc (sizeof (const char *) * allocated_archive_names
);
2455 obstack_init (&argv_stk
);
2458 /* System V fork+wait does not work if SIGCHLD is ignored. */
2459 signal (SIGCHLD
, SIG_DFL
);
2462 /* Decode options. */
2464 decode_options (argc
, argv
);
2468 /* Main command execution. */
2470 if (volno_file_option
)
2471 init_volume_number ();
2473 switch (subcommand_option
)
2475 case UNKNOWN_SUBCOMMAND
:
2477 _("You must specify one of the `-Acdtrux' options")));
2479 case CAT_SUBCOMMAND
:
2480 case UPDATE_SUBCOMMAND
:
2481 case APPEND_SUBCOMMAND
:
2485 case DELETE_SUBCOMMAND
:
2486 delete_archive_members ();
2489 case CREATE_SUBCOMMAND
:
2493 case EXTRACT_SUBCOMMAND
:
2495 read_and (extract_archive
);
2497 /* FIXME: should extract_finish () even if an ordinary signal is
2503 case LIST_SUBCOMMAND
:
2504 read_and (list_archive
);
2507 case DIFF_SUBCOMMAND
:
2509 read_and (diff_archive
);
2514 print_total_stats ();
2516 if (check_links_option
)
2519 if (volno_file_option
)
2520 closeout_volume_number ();
2522 /* Dispose of allocated memory, and return. */
2524 free (archive_name_array
);
2527 if (exit_status
== TAREXIT_FAILURE
)
2528 error (0, 0, _("Exiting with failure status due to previous errors"));
2530 if (stdlis
== stdout
)
2532 else if (ferror (stderr
) || fclose (stderr
) != 0)
2533 exit_status
= TAREXIT_FAILURE
;
2539 tar_stat_init (struct tar_stat_info
*st
)
2541 memset (st
, 0, sizeof (*st
));
2545 tar_stat_destroy (struct tar_stat_info
*st
)
2547 free (st
->orig_file_name
);
2548 free (st
->file_name
);
2549 free (st
->link_name
);
2552 free (st
->sparse_map
);
2554 xheader_destroy (&st
->xhdr
);
2555 memset (st
, 0, sizeof (*st
));
2558 /* Format mask for all available formats that support nanosecond
2559 timestamp resolution. */
2560 #define NS_PRECISION_FORMAT_MASK FORMAT_MASK (POSIX_FORMAT)
2562 /* Same as timespec_cmp, but ignore nanoseconds if current archive
2563 format does not provide sufficient resolution. */
2565 tar_timespec_cmp (struct timespec a
, struct timespec b
)
2567 if (!(FORMAT_MASK (current_format
) & NS_PRECISION_FORMAT_MASK
))
2568 a
.tv_nsec
= b
.tv_nsec
= 0;
2569 return timespec_cmp (a
, b
);