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 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
,
253 DELAY_DIRECTORY_RESTORE_OPTION
,
255 EXCLUDE_CACHES_OPTION
,
256 EXCLUDE_CACHES_UNDER_OPTION
,
257 EXCLUDE_CACHES_ALL_OPTION
,
260 EXCLUDE_TAG_UNDER_OPTION
,
261 EXCLUDE_TAG_ALL_OPTION
,
267 IGNORE_COMMAND_ERROR_OPTION
,
268 IGNORE_FAILED_READ_OPTION
,
270 KEEP_NEWER_FILES_OPTION
,
275 NO_DELAY_DIRECTORY_RESTORE_OPTION
,
276 NO_IGNORE_CASE_OPTION
,
277 NO_IGNORE_COMMAND_ERROR_OPTION
,
278 NO_OVERWRITE_DIR_OPTION
,
279 NO_QUOTE_CHARS_OPTION
,
281 NO_SAME_OWNER_OPTION
,
282 NO_SAME_PERMISSIONS_OPTION
,
284 NO_WILDCARDS_MATCH_SLASH_OPTION
,
287 NUMERIC_OWNER_OPTION
,
290 ONE_FILE_SYSTEM_OPTION
,
291 OVERWRITE_DIR_OPTION
,
298 QUOTING_STYLE_OPTION
,
301 RECURSIVE_UNLINK_OPTION
,
307 SHOW_DEFAULTS_OPTION
,
308 SHOW_OMITTED_DIRS_OPTION
,
309 SHOW_TRANSFORMED_NAMES_OPTION
,
310 SPARSE_VERSION_OPTION
,
311 STRIP_COMPONENTS_OPTION
,
319 USE_COMPRESS_PROGRAM_OPTION
,
323 WILDCARDS_MATCH_SLASH_OPTION
,
327 const char *argp_program_version
= "tar (" PACKAGE_NAME
") " VERSION
;
328 const char *argp_program_bug_address
= "<" PACKAGE_BUGREPORT
">";
329 static char const doc
[] = N_("\
330 GNU `tar' saves many files together into a single tape or disk archive, \
331 and can restore individual files from the archive.\n\
334 tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n\
335 tar -tvf archive.tar # List all files in archive.tar verbosely.\n\
336 tar -xf archive.tar # Extract all files from archive.tar.\n")
338 N_("The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
339 The version control may be set with --backup or VERSION_CONTROL, values are:\n\n\
340 none, off never make backups\n\
341 t, numbered make numbered backups\n\
342 nil, existing numbered if numbered backups exist, simple otherwise\n\
343 never, simple always make simple backups\n");
348 Available option letters are DEIJQY and aeqy. Consider the following
351 [For Solaris tar compatibility =/= Is it important at all?]
352 e exit immediately with a nonzero exit status if unexpected errors occur
353 E use extended headers (--format=posix)
355 [q alias for --occurrence=1 =/= this would better be used for quiet?]
356 [I same as T =/= will harm star compatibility]
358 y per-file gzip compression
359 Y per-block gzip compression */
361 static struct argp_option options
[] = {
364 N_("Main operation mode:"), GRID
},
367 N_("list the contents of an archive"), GRID
+1 },
368 {"extract", 'x', 0, 0,
369 N_("extract files from an archive"), GRID
+1 },
370 {"get", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
371 {"create", 'c', 0, 0,
372 N_("create a new archive"), GRID
+1 },
374 N_("find differences between archive and file system"), GRID
+1 },
375 {"compare", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
376 {"append", 'r', 0, 0,
377 N_("append files to the end of an archive"), GRID
+1 },
378 {"update", 'u', 0, 0,
379 N_("only append files newer than copy in archive"), GRID
+1 },
380 {"catenate", 'A', 0, 0,
381 N_("append tar files to an archive"), GRID
+1 },
382 {"concatenate", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
383 {"delete", DELETE_OPTION
, 0, 0,
384 N_("delete from the archive (not on mag tapes!)"), GRID
+1 },
385 {"test-label", TEST_LABEL_OPTION
, NULL
, 0,
386 N_("test the archive volume label and exit"), GRID
+1 },
391 N_("Operation modifiers:"), GRID
},
393 {"sparse", 'S', 0, 0,
394 N_("handle sparse files efficiently"), GRID
+1 },
395 {"sparse-version", SPARSE_VERSION_OPTION
, N_("MAJOR[.MINOR]"), 0,
396 N_("set version of the sparse format to use (implies --sparse)"), GRID
+1},
397 {"incremental", 'G', 0, 0,
398 N_("handle old GNU-format incremental backup"), GRID
+1 },
399 {"listed-incremental", 'g', N_("FILE"), 0,
400 N_("handle new GNU-format incremental backup"), GRID
+1 },
401 {"ignore-failed-read", IGNORE_FAILED_READ_OPTION
, 0, 0,
402 N_("do not exit with nonzero on unreadable files"), GRID
+1 },
403 {"occurrence", OCCURRENCE_OPTION
, N_("NUMBER"), OPTION_ARG_OPTIONAL
,
404 N_("process only the NUMBERth occurrence of each file in the archive;"
405 " this option is valid only in conjunction with one of the subcommands"
406 " --delete, --diff, --extract or --list and when a list of files"
407 " is given either on the command line or via the -T option;"
408 " NUMBER defaults to 1"), GRID
+1 },
409 {"seek", 'n', NULL
, 0,
410 N_("archive is seekable"), GRID
+1 },
415 N_("Overwrite control:"), GRID
},
417 {"verify", 'W', 0, 0,
418 N_("attempt to verify the archive after writing it"), GRID
+1 },
419 {"remove-files", REMOVE_FILES_OPTION
, 0, 0,
420 N_("remove files after adding them to the archive"), GRID
+1 },
421 {"keep-old-files", 'k', 0, 0,
422 N_("don't replace existing files when extracting"), GRID
+1 },
423 {"keep-newer-files", KEEP_NEWER_FILES_OPTION
, 0, 0,
424 N_("don't replace existing files that are newer than their archive copies"), GRID
+1 },
425 {"overwrite", OVERWRITE_OPTION
, 0, 0,
426 N_("overwrite existing files when extracting"), GRID
+1 },
427 {"unlink-first", 'U', 0, 0,
428 N_("remove each file prior to extracting over it"), GRID
+1 },
429 {"recursive-unlink", RECURSIVE_UNLINK_OPTION
, 0, 0,
430 N_("empty hierarchies prior to extracting directory"), GRID
+1 },
431 {"no-overwrite-dir", NO_OVERWRITE_DIR_OPTION
, 0, 0,
432 N_("preserve metadata of existing directories"), GRID
+1 },
433 {"overwrite-dir", OVERWRITE_DIR_OPTION
, 0, 0,
434 N_("overwrite metadata of existing directories when extracting (default)"),
440 N_("Select output stream:"), GRID
},
442 {"to-stdout", 'O', 0, 0,
443 N_("extract files to standard output"), GRID
+1 },
444 {"to-command", TO_COMMAND_OPTION
, N_("COMMAND"), 0,
445 N_("pipe extracted files to another program"), GRID
+1 },
446 {"ignore-command-error", IGNORE_COMMAND_ERROR_OPTION
, 0, 0,
447 N_("ignore exit codes of children"), GRID
+1 },
448 {"no-ignore-command-error", NO_IGNORE_COMMAND_ERROR_OPTION
, 0, 0,
449 N_("treat non-zero exit codes of children as error"), GRID
+1 },
454 N_("Handling of file attributes:"), GRID
},
456 {"owner", OWNER_OPTION
, N_("NAME"), 0,
457 N_("force NAME as owner for added files"), GRID
+1 },
458 {"group", GROUP_OPTION
, N_("NAME"), 0,
459 N_("force NAME as group for added files"), GRID
+1 },
460 {"mtime", MTIME_OPTION
, N_("DATE-OR-FILE"), 0,
461 N_("set mtime for added files from DATE-OR-FILE"), GRID
+1 },
462 {"mode", MODE_OPTION
, N_("CHANGES"), 0,
463 N_("force (symbolic) mode CHANGES for added files"), GRID
+1 },
464 {"atime-preserve", ATIME_PRESERVE_OPTION
,
465 N_("METHOD"), OPTION_ARG_OPTIONAL
,
466 N_("preserve access times on dumped files, either by restoring the times"
467 " after reading (METHOD='replace'; default) or by not setting the times"
468 " in the first place (METHOD='system')"), GRID
+1 },
470 N_("don't extract file modified time"), GRID
+1 },
471 {"same-owner", SAME_OWNER_OPTION
, 0, 0,
472 N_("try extracting files with the same ownership"), GRID
+1 },
473 {"no-same-owner", NO_SAME_OWNER_OPTION
, 0, 0,
474 N_("extract files as yourself"), GRID
+1 },
475 {"numeric-owner", NUMERIC_OWNER_OPTION
, 0, 0,
476 N_("always use numbers for user/group names"), GRID
+1 },
477 {"preserve-permissions", 'p', 0, 0,
478 N_("extract information about file permissions (default for superuser)"),
480 {"same-permissions", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
481 {"no-same-permissions", NO_SAME_PERMISSIONS_OPTION
, 0, 0,
482 N_("apply the user's umask when extracting permissions from the archive (default for ordinary users)"), GRID
+1 },
483 {"preserve-order", 's', 0, 0,
484 N_("sort names to extract to match archive"), GRID
+1 },
485 {"same-order", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
486 {"preserve", PRESERVE_OPTION
, 0, 0,
487 N_("same as both -p and -s"), GRID
+1 },
488 {"delay-directory-restore", DELAY_DIRECTORY_RESTORE_OPTION
, 0, 0,
489 N_("delay setting modification times and permissions of extracted"
490 " directories until the end of extraction"), GRID
+1 },
491 {"no-delay-directory-restore", NO_DELAY_DIRECTORY_RESTORE_OPTION
, 0, 0,
492 N_("cancel the effect of --delay-directory-restore option"), GRID
+1 },
497 N_("Device selection and switching:"), GRID
},
499 {"file", 'f', N_("ARCHIVE"), 0,
500 N_("use archive file or device ARCHIVE"), GRID
+1 },
501 {"force-local", FORCE_LOCAL_OPTION
, 0, 0,
502 N_("archive file is local even if it has a colon"), GRID
+1 },
503 {"rmt-command", RMT_COMMAND_OPTION
, N_("COMMAND"), 0,
504 N_("use given rmt COMMAND instead of rmt"), GRID
+1 },
505 {"rsh-command", RSH_COMMAND_OPTION
, N_("COMMAND"), 0,
506 N_("use remote COMMAND instead of rsh"), GRID
+1 },
508 {"-[0-7][lmh]", 0, NULL
, OPTION_DOC
, /* It is OK, since `name' will never be
510 N_("specify drive and density"), GRID
+1 },
512 {NULL
, '0', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
513 {NULL
, '1', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
514 {NULL
, '2', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
515 {NULL
, '3', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
516 {NULL
, '4', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
517 {NULL
, '5', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
518 {NULL
, '6', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
519 {NULL
, '7', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
520 {NULL
, '8', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
521 {NULL
, '9', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
523 {"multi-volume", 'M', 0, 0,
524 N_("create/list/extract multi-volume archive"), GRID
+1 },
525 {"tape-length", 'L', N_("NUMBER"), 0,
526 N_("change tape after writing NUMBER x 1024 bytes"), GRID
+1 },
527 {"info-script", 'F', N_("NAME"), 0,
528 N_("run script at end of each tape (implies -M)"), GRID
+1 },
529 {"new-volume-script", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
530 {"volno-file", VOLNO_FILE_OPTION
, N_("FILE"), 0,
531 N_("use/update the volume number in FILE"), GRID
+1 },
536 N_("Device blocking:"), GRID
},
538 {"blocking-factor", 'b', N_("BLOCKS"), 0,
539 N_("BLOCKS x 512 bytes per record"), GRID
+1 },
540 {"record-size", RECORD_SIZE_OPTION
, N_("NUMBER"), 0,
541 N_("NUMBER of bytes per record, multiple of 512"), GRID
+1 },
542 {"ignore-zeros", 'i', 0, 0,
543 N_("ignore zeroed blocks in archive (means EOF)"), GRID
+1 },
544 {"read-full-records", 'B', 0, 0,
545 N_("reblock as we read (for 4.2BSD pipes)"), GRID
+1 },
550 N_("Archive format selection:"), GRID
},
552 {"format", 'H', N_("FORMAT"), 0,
553 N_("create archive of the given format"), GRID
+1 },
555 {NULL
, 0, NULL
, 0, N_("FORMAT is one of the following:"), GRID
+2 },
556 {" v7", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("old V7 tar format"),
558 {" oldgnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
559 N_("GNU format as per tar <= 1.12"), GRID
+3 },
560 {" gnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
561 N_("GNU tar 1.13.x format"), GRID
+3 },
562 {" ustar", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
563 N_("POSIX 1003.1-1988 (ustar) format"), GRID
+3 },
564 {" pax", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
565 N_("POSIX 1003.1-2001 (pax) format"), GRID
+3 },
566 {" posix", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("same as pax"), GRID
+3 },
568 {"old-archive", OLD_ARCHIVE_OPTION
, 0, 0, /* FIXME */
569 N_("same as --format=v7"), GRID
+8 },
570 {"portability", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
571 {"posix", POSIX_OPTION
, 0, 0,
572 N_("same as --format=posix"), GRID
+8 },
573 {"pax-option", PAX_OPTION
, N_("keyword[[:]=value][,keyword[[:]=value]]..."), 0,
574 N_("control pax keywords"), GRID
+8 },
575 {"label", 'V', N_("TEXT"), 0,
576 N_("create archive with volume name TEXT; at list/extract time, use TEXT as a globbing pattern for volume name"), GRID
+8 },
578 N_("filter the archive through bzip2"), GRID
+8 },
580 N_("filter the archive through gzip"), GRID
+8 },
581 {"gunzip", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
582 {"ungzip", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
583 {"compress", 'Z', 0, 0,
584 N_("filter the archive through compress"), GRID
+8 },
585 {"uncompress", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
586 {"use-compress-program", USE_COMPRESS_PROGRAM_OPTION
, N_("PROG"), 0,
587 N_("filter through PROG (must accept -d)"), GRID
+8 },
592 N_("Local file selection:"), GRID
},
594 {"add-file", ARGP_KEY_ARG
, N_("FILE"), 0,
595 N_("add given FILE to the archive (useful if its name starts with a dash)"), GRID
+1 },
596 {"directory", 'C', N_("DIR"), 0,
597 N_("change to directory DIR"), GRID
+1 },
598 {"files-from", 'T', N_("FILE"), 0,
599 N_("get names to extract or create from FILE"), GRID
+1 },
600 {"null", NULL_OPTION
, 0, 0,
601 N_("-T reads null-terminated names, disable -C"), GRID
+1 },
602 {"unquote", UNQUOTE_OPTION
, 0, 0,
603 N_("unquote filenames read with -T (default)"), GRID
+1 },
604 {"no-unquote", NO_UNQUOTE_OPTION
, 0, 0,
605 N_("do not unquote filenames read with -T"), GRID
+1 },
606 {"exclude", EXCLUDE_OPTION
, N_("PATTERN"), 0,
607 N_("exclude files, given as a PATTERN"), GRID
+1 },
608 {"exclude-from", 'X', N_("FILE"), 0,
609 N_("exclude patterns listed in FILE"), GRID
+1 },
610 {"exclude-caches", EXCLUDE_CACHES_OPTION
, 0, 0,
611 N_("exclude contents of directories containing CACHEDIR.TAG, "
612 "except for the tag file itself"), GRID
+1 },
613 {"exclude-caches-under", EXCLUDE_CACHES_UNDER_OPTION
, 0, 0,
614 N_("exclude everything under directories containing CACHEDIR.TAG"),
616 {"exclude-caches-all", EXCLUDE_CACHES_ALL_OPTION
, 0, 0,
617 N_("exclude directories containing CACHEDIR.TAG"), GRID
+1 },
618 {"exclude-tag", EXCLUDE_TAG_OPTION
, N_("FILE"), 0,
619 N_("exclude contents of directories containing FILE, except"
620 " for FILE itself"), GRID
+1 },
621 {"exclude-tag-under", EXCLUDE_TAG_UNDER_OPTION
, N_("FILE"), 0,
622 N_("exclude everything under directories containing FILE"), GRID
+1 },
623 {"exclude-tag-all", EXCLUDE_TAG_ALL_OPTION
, N_("FILE"), 0,
624 N_("exclude directories containing FILE"), GRID
+1 },
625 {"exclude-vcs", EXCLUDE_VCS_OPTION
, NULL
, 0,
626 N_("exclude version control system directories"), GRID
+1 },
627 {"no-recursion", NO_RECURSION_OPTION
, 0, 0,
628 N_("avoid descending automatically in directories"), GRID
+1 },
629 {"one-file-system", ONE_FILE_SYSTEM_OPTION
, 0, 0,
630 N_("stay in local file system when creating archive"), GRID
+1 },
631 {"recursion", RECURSION_OPTION
, 0, 0,
632 N_("recurse into directories (default)"), GRID
+1 },
633 {"absolute-names", 'P', 0, 0,
634 N_("don't strip leading `/'s from file names"), GRID
+1 },
635 {"dereference", 'h', 0, 0,
636 N_("follow symlinks; archive and dump the files they point to"), GRID
+1 },
637 {"starting-file", 'K', N_("MEMBER-NAME"), 0,
638 N_("begin at member MEMBER-NAME in the archive"), GRID
+1 },
639 {"newer", 'N', N_("DATE-OR-FILE"), 0,
640 N_("only store files newer than DATE-OR-FILE"), GRID
+1 },
641 {"after-date", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
642 {"newer-mtime", NEWER_MTIME_OPTION
, N_("DATE"), 0,
643 N_("compare date and time when data changed only"), GRID
+1 },
644 {"backup", BACKUP_OPTION
, N_("CONTROL"), OPTION_ARG_OPTIONAL
,
645 N_("backup before removal, choose version CONTROL"), GRID
+1 },
646 {"suffix", SUFFIX_OPTION
, N_("STRING"), 0,
647 N_("backup before removal, override usual suffix ('~' unless overridden by environment variable SIMPLE_BACKUP_SUFFIX)"), GRID
+1 },
652 N_("File name transformations:"), GRID
},
653 {"strip-components", STRIP_COMPONENTS_OPTION
, N_("NUMBER"), 0,
654 N_("strip NUMBER leading components from file names on extraction"),
656 {"transform", TRANSFORM_OPTION
, N_("EXPRESSION"), 0,
657 N_("use sed replace EXPRESSION to transform file names"), GRID
+1 },
662 N_("File name matching options (affect both exclude and include patterns):"),
664 {"ignore-case", IGNORE_CASE_OPTION
, 0, 0,
665 N_("ignore case"), GRID
+1 },
666 {"anchored", ANCHORED_OPTION
, 0, 0,
667 N_("patterns match file name start"), GRID
+1 },
668 {"no-anchored", NO_ANCHORED_OPTION
, 0, 0,
669 N_("patterns match after any `/' (default for exclusion)"), GRID
+1 },
670 {"no-ignore-case", NO_IGNORE_CASE_OPTION
, 0, 0,
671 N_("case sensitive matching (default)"), GRID
+1 },
672 {"wildcards", WILDCARDS_OPTION
, 0, 0,
673 N_("use wildcards (default for exclusion)"), GRID
+1 },
674 {"no-wildcards", NO_WILDCARDS_OPTION
, 0, 0,
675 N_("verbatim string matching"), GRID
+1 },
676 {"no-wildcards-match-slash", NO_WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
677 N_("wildcards do not match `/'"), GRID
+1 },
678 {"wildcards-match-slash", WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
679 N_("wildcards match `/' (default for exclusion)"), GRID
+1 },
684 N_("Informative output:"), GRID
},
686 {"verbose", 'v', 0, 0,
687 N_("verbosely list files processed"), GRID
+1 },
688 {"checkpoint", CHECKPOINT_OPTION
, N_("[.]NUMBER"), OPTION_ARG_OPTIONAL
,
689 N_("display progress messages every NUMBERth record (default 10)"),
691 {"check-links", 'l', 0, 0,
692 N_("print a message if not all links are dumped"), GRID
+1 },
693 {"totals", TOTALS_OPTION
, N_("SIGNAL"), OPTION_ARG_OPTIONAL
,
694 N_("print total bytes after processing the archive; "
695 "with an argument - print total bytes when this SIGNAL is delivered; "
696 "Allowed signals are: SIGHUP, SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; "
697 "the names without SIG prefix are also accepted"), GRID
+1 },
698 {"utc", UTC_OPTION
, 0, 0,
699 N_("print file modification dates in UTC"), GRID
+1 },
700 {"index-file", INDEX_FILE_OPTION
, N_("FILE"), 0,
701 N_("send verbose output to FILE"), GRID
+1 },
702 {"block-number", 'R', 0, 0,
703 N_("show block number within archive with each message"), GRID
+1 },
704 {"interactive", 'w', 0, 0,
705 N_("ask for confirmation for every action"), GRID
+1 },
706 {"confirmation", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
707 {"show-defaults", SHOW_DEFAULTS_OPTION
, 0, 0,
708 N_("show tar defaults"), GRID
+1 },
709 {"show-omitted-dirs", SHOW_OMITTED_DIRS_OPTION
, 0, 0,
710 N_("when listing or extracting, list each directory that does not match search criteria"), GRID
+1 },
711 {"show-transformed-names", SHOW_TRANSFORMED_NAMES_OPTION
, 0, 0,
712 N_("show file or archive names after transformation"),
714 {"show-stored-names", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
715 {"quoting-style", QUOTING_STYLE_OPTION
, N_("STYLE"), 0,
716 N_("set name quoting style; see below for valid STYLE values"), GRID
+1 },
717 {"quote-chars", QUOTE_CHARS_OPTION
, N_("STRING"), 0,
718 N_("additionally quote characters from STRING"), GRID
+1 },
719 {"no-quote-chars", NO_QUOTE_CHARS_OPTION
, N_("STRING"), 0,
720 N_("disable quoting for characters from STRING"), GRID
+1 },
725 N_("Compatibility options:"), GRID
},
728 N_("when creating, same as --old-archive; when extracting, same as --no-same-owner"), GRID
+1 },
733 N_("Other options:"), GRID
},
735 {"restrict", RESTRICT_OPTION
, 0, 0,
736 N_("disable use of some potentially harmful options"), -1 },
738 {"help", '?', 0, 0, N_("give this help list"), -1},
739 {"usage", USAGE_OPTION
, 0, 0, N_("give a short usage message"), -1},
740 {"version", VERSION_OPTION
, 0, 0, N_("print program version"), -1},
741 /* FIXME -V (--label) conflicts with the default short option for
743 {"HANG", HANG_OPTION
, "SECS", OPTION_ARG_OPTIONAL
| OPTION_HIDDEN
,
744 N_("hang for SECS seconds (default 3600)"), 0},
750 static char const *const atime_preserve_args
[] =
752 "replace", "system", NULL
755 static enum atime_preserve
const atime_preserve_types
[] =
757 replace_atime_preserve
, system_atime_preserve
760 /* Make sure atime_preserve_types has as much entries as atime_preserve_args
761 (minus 1 for NULL guard) */
762 ARGMATCH_VERIFY (atime_preserve_args
, atime_preserve_types
);
764 /* Wildcard matching settings */
767 default_wildcards
, /* For exclusion == enable_wildcards,
768 for inclusion == disable_wildcards */
773 struct tar_args
/* Variables used during option parsing */
775 struct textual_date
*textual_date
; /* Keeps the arguments to --newer-mtime
776 and/or --date option if they are
778 enum wildcards wildcards
; /* Wildcard settings (--wildcards/
780 int matching_flags
; /* exclude_fnmatch options */
781 int include_anchored
; /* Pattern anchoring options used for
783 bool o_option
; /* True if -o option was given */
784 bool pax_option
; /* True if --pax-option was given */
785 char const *backup_suffix_string
; /* --suffix option argument */
786 char const *version_control_string
; /* --backup option argument */
787 bool input_files
; /* True if some input files where given */
791 #define MAKE_EXCL_OPTIONS(args) \
792 ((((args)->wildcards != disable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
793 | (args)->matching_flags \
796 #define MAKE_INCL_OPTIONS(args) \
797 ((((args)->wildcards == enable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
798 | (args)->include_anchored \
799 | (args)->matching_flags \
806 static char *vcs_file
[] = {
828 for (i
= 0; vcs_file
[i
]; i
++)
829 add_exclude (excluded
, vcs_file
[i
], 0);
834 # define DECL_SHOW_DEFAULT_SETTINGS(stream, printer) \
837 "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s", \
838 archive_format_string (DEFAULT_ARCHIVE_FORMAT), \
839 DEFAULT_ARCHIVE, DEFAULT_BLOCKING, \
840 quoting_style_args[DEFAULT_QUOTING_STYLE], \
841 DEFAULT_RMT_COMMAND); \
842 printer (stream, " --rsh-command=%s", REMOTE_SHELL); \
843 printer (stream, "\n"); \
846 # define DECL_SHOW_DEFAULT_SETTINGS(stream, printer) \
849 "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s", \
850 archive_format_string (DEFAULT_ARCHIVE_FORMAT), \
851 DEFAULT_ARCHIVE, DEFAULT_BLOCKING, \
852 quoting_style_args[DEFAULT_QUOTING_STYLE], \
853 DEFAULT_RMT_COMMAND); \
854 printer (stream, "\n"); \
859 show_default_settings (FILE *fp
)
860 DECL_SHOW_DEFAULT_SETTINGS(fp
, fprintf
)
863 show_default_settings_fs (argp_fmtstream_t fs
)
864 DECL_SHOW_DEFAULT_SETTINGS(fs
, argp_fmtstream_printf
)
867 set_subcommand_option (enum subcommand subcommand
)
869 if (subcommand_option
!= UNKNOWN_SUBCOMMAND
870 && subcommand_option
!= subcommand
)
872 _("You may not specify more than one `-Acdtrux' option")));
874 subcommand_option
= subcommand
;
878 set_use_compress_program_option (const char *string
)
880 if (use_compress_program_option
881 && strcmp (use_compress_program_option
, string
) != 0)
882 USAGE_ERROR ((0, 0, _("Conflicting compression options")));
884 use_compress_program_option
= string
;
891 print_total_stats ();
892 #ifndef HAVE_SIGACTION
893 signal (signo
, sigstat
);
898 stat_on_signal (int signo
)
900 #ifdef HAVE_SIGACTION
901 struct sigaction act
;
902 act
.sa_handler
= sigstat
;
903 sigemptyset (&act
.sa_mask
);
905 sigaction (signo
, &act
, NULL
);
907 signal (signo
, sigstat
);
912 set_stat_signal (const char *name
)
919 { "SIGUSR1", SIGUSR1
},
921 { "SIGUSR2", SIGUSR2
},
923 { "SIGHUP", SIGHUP
},
925 { "SIGINT", SIGINT
},
927 { "SIGQUIT", SIGQUIT
},
932 for (p
= sigtab
; p
< sigtab
+ sizeof (sigtab
) / sizeof (sigtab
[0]); p
++)
933 if (strcmp (p
->name
, name
) == 0)
935 stat_on_signal (p
->signo
);
938 FATAL_ERROR ((0, 0, _("Unknown signal name: %s"), name
));
944 struct textual_date
*next
;
951 get_date_or_file (struct tar_args
*args
, const char *option
,
952 const char *str
, struct timespec
*ts
)
954 if (FILE_SYSTEM_PREFIX_LEN (str
) != 0
959 if (deref_stat (dereference_option
, str
, &st
) != 0)
962 USAGE_ERROR ((0, 0, _("Date sample file not found")));
964 *ts
= get_stat_mtime (&st
);
968 if (! get_date (ts
, str
, NULL
))
970 WARN ((0, 0, _("Substituting %s for unknown date format %s"),
971 tartime (*ts
, false), quote (str
)));
976 struct textual_date
*p
= xmalloc (sizeof (*p
));
980 p
->next
= args
->textual_date
;
981 args
->textual_date
= p
;
987 report_textual_dates (struct tar_args
*args
)
989 struct textual_date
*p
;
990 for (p
= args
->textual_date
; p
; )
992 struct textual_date
*next
= p
->next
;
993 char const *treated_as
= tartime (*p
->ts
, true);
994 if (strcmp (p
->date
, treated_as
) != 0)
995 WARN ((0, 0, _("Option %s: Treating date `%s' as %s"),
996 p
->option
, p
->date
, treated_as
));
1003 static volatile int _argp_hang
;
1005 enum read_file_list_state
/* Result of reading file name from the list file */
1007 file_list_success
, /* OK, name read successfully */
1008 file_list_end
, /* End of list file */
1009 file_list_zero
, /* Zero separator encountered where it should not */
1010 file_list_skip
/* Empty (zero-length) entry encountered, skip it */
1013 /* Read from FP a sequence of characters up to FILENAME_TERMINATOR and put them
1016 static enum read_file_list_state
1017 read_name_from_file (FILE *fp
, struct obstack
*stk
)
1022 for (c
= getc (fp
); c
!= EOF
&& c
!= filename_terminator
; c
= getc (fp
))
1026 /* We have read a zero separator. The file possibly is
1028 return file_list_zero
;
1030 obstack_1grow (stk
, c
);
1034 if (counter
== 0 && c
!= EOF
)
1035 return file_list_skip
;
1037 obstack_1grow (stk
, 0);
1039 return (counter
== 0 && c
== EOF
) ? file_list_end
: file_list_success
;
1043 static bool files_from_option
; /* When set, tar will not refuse to create
1045 static struct obstack argv_stk
; /* Storage for additional command line options
1046 read using -T option */
1048 /* Prevent recursive inclusion of the same file */
1051 struct file_id_list
*next
;
1056 static struct file_id_list
*file_id_list
;
1059 add_file_id (const char *filename
)
1061 struct file_id_list
*p
;
1064 if (stat (filename
, &st
))
1065 stat_fatal (filename
);
1066 for (p
= file_id_list
; p
; p
= p
->next
)
1067 if (p
->ino
== st
.st_ino
&& p
->dev
== st
.st_dev
)
1069 FATAL_ERROR ((0, 0, _("%s: file list already read"),
1070 quotearg_colon (filename
)));
1072 p
= xmalloc (sizeof *p
);
1073 p
->next
= file_id_list
;
1079 /* Default density numbers for [0-9][lmh] device specifications */
1081 #ifndef LOW_DENSITY_NUM
1082 # define LOW_DENSITY_NUM 0
1085 #ifndef MID_DENSITY_NUM
1086 # define MID_DENSITY_NUM 8
1089 #ifndef HIGH_DENSITY_NUM
1090 # define HIGH_DENSITY_NUM 16
1094 update_argv (const char *filename
, struct argp_state
*state
)
1097 size_t count
= 0, i
;
1101 bool is_stdin
= false;
1102 enum read_file_list_state read_state
;
1104 if (!strcmp (filename
, "-"))
1107 request_stdin ("-T");
1112 add_file_id (filename
);
1113 if ((fp
= fopen (filename
, "r")) == NULL
)
1114 open_fatal (filename
);
1117 while ((read_state
= read_name_from_file (fp
, &argv_stk
)) != file_list_end
)
1121 case file_list_success
:
1125 case file_list_end
: /* won't happen, just to pacify gcc */
1128 case file_list_zero
:
1132 WARN ((0, 0, N_("%s: file name read contains nul character"),
1133 quotearg_colon (filename
)));
1135 /* Prepare new stack contents */
1136 size
= obstack_object_size (&argv_stk
);
1137 p
= obstack_finish (&argv_stk
);
1138 for (; size
> 0; size
--, p
++)
1140 obstack_1grow (&argv_stk
, *p
);
1142 obstack_1grow (&argv_stk
, '\n');
1143 obstack_1grow (&argv_stk
, 0);
1145 /* Read rest of files using new filename terminator */
1146 filename_terminator
= 0;
1150 case file_list_skip
:
1161 start
= obstack_finish (&argv_stk
);
1163 if (filename_terminator
== 0)
1164 for (p
= start
; *p
; p
+= strlen (p
) + 1)
1168 new_argc
= state
->argc
+ count
;
1169 new_argv
= xmalloc (sizeof (state
->argv
[0]) * (new_argc
+ 1));
1170 memcpy (new_argv
, state
->argv
, sizeof (state
->argv
[0]) * (state
->argc
+ 1));
1171 state
->argv
= new_argv
;
1172 memmove (&state
->argv
[state
->next
+ count
], &state
->argv
[state
->next
],
1173 (state
->argc
- state
->next
+ 1) * sizeof (state
->argv
[0]));
1175 state
->argc
= new_argc
;
1177 for (i
= state
->next
, p
= start
; *p
; p
+= strlen (p
) + 1, i
++)
1179 if (filename_terminator
== 0 && p
[0] == '-')
1180 state
->argv
[i
++] = "--add-file";
1187 tar_help (struct argp_state
*state
)
1189 argp_fmtstream_t fs
;
1190 state
->flags
|= ARGP_NO_EXIT
;
1191 argp_state_help (state
, state
->out_stream
,
1192 ARGP_HELP_STD_HELP
& ~ARGP_HELP_BUG_ADDR
);
1193 /* FIXME: use struct uparams.rmargin (from argp-help.c) instead of 79 */
1194 fs
= argp_make_fmtstream (state
->out_stream
, 0, 79, 0);
1196 argp_fmtstream_printf (fs
, "\n%s\n\n",
1197 _("Valid arguments for --quoting-style options are:"));
1198 tar_list_quoting_styles (fs
, " ");
1200 argp_fmtstream_puts (fs
, _("\n*This* tar defaults to:\n"));
1201 show_default_settings_fs (fs
);
1202 argp_fmtstream_putc (fs
, '\n');
1203 argp_fmtstream_printf (fs
, _("Report bugs to %s.\n"),
1204 argp_program_bug_address
);
1205 argp_fmtstream_free (fs
);
1209 parse_opt (int key
, char *arg
, struct argp_state
*state
)
1211 struct tar_args
*args
= state
->input
;
1216 /* File name or non-parsed option, because of ARGP_IN_ORDER */
1217 name_add_name (arg
, MAKE_INCL_OPTIONS (args
));
1218 args
->input_files
= true;
1222 set_subcommand_option (CAT_SUBCOMMAND
);
1228 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1229 && u
== (blocking_factor
= u
)
1230 && 0 < blocking_factor
1231 && u
== (record_size
= u
* BLOCKSIZE
) / BLOCKSIZE
))
1232 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1233 _("Invalid blocking factor")));
1238 /* Try to reblock input records. For reading 4.2BSD pipes. */
1240 /* It would surely make sense to exchange -B and -R, but it seems
1241 that -B has been used for a long while in Sun tar and most
1242 BSD-derived systems. This is a consequence of the block/record
1243 terminology confusion. */
1245 read_full_records_option
= true;
1249 set_subcommand_option (CREATE_SUBCOMMAND
);
1257 set_subcommand_option (DIFF_SUBCOMMAND
);
1261 if (archive_names
== allocated_archive_names
)
1262 archive_name_array
= x2nrealloc (archive_name_array
,
1263 &allocated_archive_names
,
1264 sizeof (archive_name_array
[0]));
1266 archive_name_array
[archive_names
++] = arg
;
1270 /* Since -F is only useful with -M, make it implied. Run this
1271 script at the end of each tape. */
1273 info_script_option
= arg
;
1274 multi_volume_option
= true;
1278 listed_incremental_option
= arg
;
1279 after_date_option
= true;
1283 /* We are making an incremental dump (FIXME: are we?); save
1284 directories at the beginning of the archive, and include in each
1285 directory its contents. */
1287 incremental_option
= true;
1291 /* Follow symbolic links. */
1292 dereference_option
= true;
1296 /* Ignore zero blocks (eofs). This can't be the default,
1297 because Unix tar writes two blocks of zeros, then pads out
1298 the record with garbage. */
1300 ignore_zeros_option
= true;
1305 _("Warning: the -I option is not supported;"
1306 " perhaps you meant -j or -T?")));
1310 set_use_compress_program_option ("bzip2");
1314 /* Don't replace existing files. */
1315 old_files_option
= KEEP_OLD_FILES
;
1319 starting_file_option
= true;
1323 case ONE_FILE_SYSTEM_OPTION
:
1324 /* When dumping directories, don't dump files/subdirectories
1325 that are on other filesystems. */
1326 one_file_system_option
= true;
1330 check_links_option
= 1;
1336 if (xstrtoumax (arg
, 0, 10, &u
, "") != LONGINT_OK
)
1337 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1338 _("Invalid tape length")));
1339 tape_length_option
= 1024 * (tarlong
) u
;
1340 multi_volume_option
= true;
1345 touch_option
= true;
1349 /* Make multivolume archive: when we can't write any more into
1350 the archive, re-open it, and continue writing. */
1352 multi_volume_option
= true;
1356 get_date_or_file (args
, "--mtime", arg
, &mtime_option
);
1357 set_mtime_option
= true;
1361 seekable_archive
= true;
1365 after_date_option
= true;
1368 case NEWER_MTIME_OPTION
:
1369 if (NEWER_OPTION_INITIALIZED (newer_mtime_option
))
1370 USAGE_ERROR ((0, 0, _("More than one threshold date")));
1371 get_date_or_file (args
,
1372 key
== NEWER_MTIME_OPTION
? "--newer-mtime"
1373 : "--after-date", arg
, &newer_mtime_option
);
1377 args
->o_option
= true;
1381 to_stdout_option
= true;
1385 same_permissions_option
= true;
1389 absolute_names_option
= true;
1393 set_subcommand_option (APPEND_SUBCOMMAND
);
1397 /* Print block numbers for debugging bad tar archives. */
1399 /* It would surely make sense to exchange -B and -R, but it seems
1400 that -B has been used for a long while in Sun tar and most
1401 BSD-derived systems. This is a consequence of the block/record
1402 terminology confusion. */
1404 block_number_option
= true;
1408 /* Names to extract are sorted. */
1410 same_order_option
= true;
1414 sparse_option
= true;
1417 case SPARSE_VERSION_OPTION
:
1418 sparse_option
= true;
1421 tar_sparse_major
= strtoul (arg
, &p
, 10);
1425 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1426 tar_sparse_minor
= strtoul (p
+ 1, &p
, 10);
1428 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1434 set_subcommand_option (LIST_SUBCOMMAND
);
1438 case TEST_LABEL_OPTION
:
1439 set_subcommand_option (LIST_SUBCOMMAND
);
1440 test_label_option
= true;
1444 update_argv (arg
, state
);
1445 /* Indicate we've been given -T option. This is for backward
1446 compatibility only, so that `tar cfT archive /dev/null will
1448 files_from_option
= true;
1452 set_subcommand_option (UPDATE_SUBCOMMAND
);
1456 old_files_option
= UNLINK_FIRST_OLD_FILES
;
1468 volume_label_option
= arg
;
1472 interactive_option
= true;
1476 verify_option
= true;
1480 set_subcommand_option (EXTRACT_SUBCOMMAND
);
1484 if (add_exclude_file (add_exclude
, excluded
, arg
,
1485 MAKE_EXCL_OPTIONS (args
), '\n')
1489 FATAL_ERROR ((0, e
, "%s", quotearg_colon (arg
)));
1494 set_use_compress_program_option ("gzip");
1498 set_use_compress_program_option ("compress");
1501 case ANCHORED_OPTION
:
1502 args
->matching_flags
|= EXCLUDE_ANCHORED
;
1505 case ATIME_PRESERVE_OPTION
:
1506 atime_preserve_option
=
1508 ? XARGMATCH ("--atime-preserve", arg
,
1509 atime_preserve_args
, atime_preserve_types
)
1510 : replace_atime_preserve
);
1511 if (! O_NOATIME
&& atime_preserve_option
== system_atime_preserve
)
1513 _("--atime-preserve='system' is not supported"
1514 " on this platform")));
1517 case CHECKPOINT_OPTION
:
1524 checkpoint_style
= checkpoint_dot
;
1527 checkpoint_option
= strtoul (arg
, &p
, 0);
1530 _("--checkpoint value is not an integer")));
1533 checkpoint_option
= 10;
1537 backup_option
= true;
1539 args
->version_control_string
= arg
;
1542 case DELAY_DIRECTORY_RESTORE_OPTION
:
1543 delay_directory_restore_option
= true;
1546 case NO_DELAY_DIRECTORY_RESTORE_OPTION
:
1547 delay_directory_restore_option
= false;
1551 set_subcommand_option (DELETE_SUBCOMMAND
);
1554 case EXCLUDE_OPTION
:
1555 add_exclude (excluded
, arg
, MAKE_EXCL_OPTIONS (args
));
1558 case EXCLUDE_CACHES_OPTION
:
1559 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_contents
,
1563 case EXCLUDE_CACHES_UNDER_OPTION
:
1564 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_under
,
1568 case EXCLUDE_CACHES_ALL_OPTION
:
1569 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_all
,
1573 case EXCLUDE_TAG_OPTION
:
1574 add_exclusion_tag (arg
, exclusion_tag_contents
, NULL
);
1577 case EXCLUDE_TAG_UNDER_OPTION
:
1578 add_exclusion_tag (arg
, exclusion_tag_under
, NULL
);
1581 case EXCLUDE_TAG_ALL_OPTION
:
1582 add_exclusion_tag (arg
, exclusion_tag_all
, NULL
);
1585 case EXCLUDE_VCS_OPTION
:
1586 exclude_vcs_files ();
1589 case FORCE_LOCAL_OPTION
:
1590 force_local_option
= true;
1594 set_archive_format (arg
);
1597 case INDEX_FILE_OPTION
:
1598 index_file_name
= arg
;
1601 case IGNORE_CASE_OPTION
:
1602 args
->matching_flags
|= FNM_CASEFOLD
;
1605 case IGNORE_COMMAND_ERROR_OPTION
:
1606 ignore_command_error_option
= true;
1609 case IGNORE_FAILED_READ_OPTION
:
1610 ignore_failed_read_option
= true;
1613 case KEEP_NEWER_FILES_OPTION
:
1614 old_files_option
= KEEP_NEWER_FILES
;
1618 if (! (strlen (arg
) < GNAME_FIELD_SIZE
1619 && gname_to_gid (arg
, &group_option
)))
1622 if (xstrtoumax (arg
, 0, 10, &g
, "") == LONGINT_OK
1626 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1627 _("%s: Invalid group")));
1632 mode_option
= mode_compile (arg
);
1634 FATAL_ERROR ((0, 0, _("Invalid mode given on option")));
1635 initial_umask
= umask (0);
1636 umask (initial_umask
);
1639 case NO_ANCHORED_OPTION
:
1640 args
->include_anchored
= 0; /* Clear the default for comman line args */
1641 args
->matching_flags
&= ~ EXCLUDE_ANCHORED
;
1644 case NO_IGNORE_CASE_OPTION
:
1645 args
->matching_flags
&= ~ FNM_CASEFOLD
;
1648 case NO_IGNORE_COMMAND_ERROR_OPTION
:
1649 ignore_command_error_option
= false;
1652 case NO_OVERWRITE_DIR_OPTION
:
1653 old_files_option
= NO_OVERWRITE_DIR_OLD_FILES
;
1656 case NO_QUOTE_CHARS_OPTION
:
1658 set_char_quoting (NULL
, *arg
, 0);
1661 case NO_WILDCARDS_OPTION
:
1662 args
->wildcards
= disable_wildcards
;
1665 case NO_WILDCARDS_MATCH_SLASH_OPTION
:
1666 args
->matching_flags
|= FNM_FILE_NAME
;
1670 filename_terminator
= '\0';
1673 case NUMERIC_OWNER_OPTION
:
1674 numeric_owner_option
= true;
1677 case OCCURRENCE_OPTION
:
1679 occurrence_option
= 1;
1683 if (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
)
1684 occurrence_option
= u
;
1686 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1687 _("Invalid number")));
1691 case OVERWRITE_DIR_OPTION
:
1692 old_files_option
= DEFAULT_OLD_FILES
;
1695 case OVERWRITE_OPTION
:
1696 old_files_option
= OVERWRITE_OLD_FILES
;
1700 if (! (strlen (arg
) < UNAME_FIELD_SIZE
1701 && uname_to_uid (arg
, &owner_option
)))
1704 if (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1708 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1709 _("Invalid owner")));
1713 case QUOTE_CHARS_OPTION
:
1715 set_char_quoting (NULL
, *arg
, 1);
1718 case QUOTING_STYLE_OPTION
:
1719 tar_set_quoting_style (arg
);
1723 args
->pax_option
= true;
1724 xheader_set_option (arg
);
1728 set_archive_format ("posix");
1731 case PRESERVE_OPTION
:
1732 /* FIXME: What it is good for? */
1733 same_permissions_option
= true;
1734 same_order_option
= true;
1737 case RECORD_SIZE_OPTION
:
1740 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1741 && u
== (size_t) u
))
1742 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1743 _("Invalid record size")));
1745 if (record_size
% BLOCKSIZE
!= 0)
1746 USAGE_ERROR ((0, 0, _("Record size must be a multiple of %d."),
1748 blocking_factor
= record_size
/ BLOCKSIZE
;
1752 case RECURSIVE_UNLINK_OPTION
:
1753 recursive_unlink_option
= true;
1756 case REMOVE_FILES_OPTION
:
1757 remove_files_option
= true;
1760 case RESTRICT_OPTION
:
1761 restrict_option
= true;
1764 case RMT_COMMAND_OPTION
:
1768 case RSH_COMMAND_OPTION
:
1769 rsh_command_option
= arg
;
1772 case SHOW_DEFAULTS_OPTION
:
1773 show_default_settings (stdout
);
1777 case STRIP_COMPONENTS_OPTION
:
1780 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1781 && u
== (size_t) u
))
1782 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1783 _("Invalid number of elements")));
1784 strip_name_components
= u
;
1788 case SHOW_OMITTED_DIRS_OPTION
:
1789 show_omitted_dirs_option
= true;
1792 case SHOW_TRANSFORMED_NAMES_OPTION
:
1793 show_transformed_names_option
= true;
1797 backup_option
= true;
1798 args
->backup_suffix_string
= arg
;
1801 case TO_COMMAND_OPTION
:
1802 if (to_command_option
)
1803 USAGE_ERROR ((0, 0, _("Only one --to-command option allowed")));
1804 to_command_option
= arg
;
1809 set_stat_signal (arg
);
1811 totals_option
= true;
1814 case TRANSFORM_OPTION
:
1815 set_transform_expr (arg
);
1818 case USE_COMPRESS_PROGRAM_OPTION
:
1819 set_use_compress_program_option (arg
);
1822 case VOLNO_FILE_OPTION
:
1823 volno_file_option
= arg
;
1826 case WILDCARDS_OPTION
:
1827 args
->wildcards
= enable_wildcards
;
1830 case WILDCARDS_MATCH_SLASH_OPTION
:
1831 args
->matching_flags
&= ~ FNM_FILE_NAME
;
1834 case NO_RECURSION_OPTION
:
1835 recursion_option
= 0;
1838 case NO_SAME_OWNER_OPTION
:
1839 same_owner_option
= -1;
1842 case NO_SAME_PERMISSIONS_OPTION
:
1843 same_permissions_option
= -1;
1846 case RECURSION_OPTION
:
1847 recursion_option
= FNM_LEADING_DIR
;
1850 case SAME_OWNER_OPTION
:
1851 same_owner_option
= 1;
1854 case UNQUOTE_OPTION
:
1855 unquote_option
= true;
1858 case NO_UNQUOTE_OPTION
:
1859 unquote_option
= false;
1871 #ifdef DEVICE_PREFIX
1873 int device
= key
- '0';
1875 static char buf
[sizeof DEVICE_PREFIX
+ 10];
1879 argp_error (state
, _("Malformed density argument: %s"), quote (arg
));
1881 strcpy (buf
, DEVICE_PREFIX
);
1882 cursor
= buf
+ strlen (buf
);
1884 #ifdef DENSITY_LETTER
1886 sprintf (cursor
, "%d%c", device
, arg
[0]);
1888 #else /* not DENSITY_LETTER */
1893 device
+= LOW_DENSITY_NUM
;
1897 device
+= MID_DENSITY_NUM
;
1901 device
+= HIGH_DENSITY_NUM
;
1905 argp_error (state
, _("Unknown density: `%c'"), arg
[0]);
1907 sprintf (cursor
, "%d", device
);
1909 #endif /* not DENSITY_LETTER */
1911 if (archive_names
== allocated_archive_names
)
1912 archive_name_array
= x2nrealloc (archive_name_array
,
1913 &allocated_archive_names
,
1914 sizeof (archive_name_array
[0]));
1915 archive_name_array
[archive_names
++] = xstrdup (buf
);
1919 #else /* not DEVICE_PREFIX */
1922 _("Options `-[0-7][lmh]' not supported by *this* tar"));
1924 #endif /* not DEVICE_PREFIX */
1932 argp_state_help (state
, state
->out_stream
, ARGP_HELP_USAGE
);
1936 case VERSION_OPTION
:
1937 version_etc (state
->out_stream
, "tar", PACKAGE_NAME
, VERSION
,
1938 "John Gilmore", "Jay Fenlason", (char *) NULL
);
1943 _argp_hang
= atoi (arg
? arg
: "3600");
1944 while (_argp_hang
-- > 0)
1949 return ARGP_ERR_UNKNOWN
;
1954 static struct argp argp
= {
1967 argp_help (&argp
, stderr
, ARGP_HELP_SEE
, (char*) program_name
);
1972 /* Parse the options for tar. */
1974 static struct argp_option
*
1975 find_argp_option (struct argp_option
*o
, int letter
)
1982 && o
->doc
== NULL
); o
++)
1983 if (o
->key
== letter
)
1989 decode_options (int argc
, char **argv
)
1992 struct tar_args args
;
1994 /* Set some default option values. */
1995 args
.textual_date
= NULL
;
1996 args
.wildcards
= default_wildcards
;
1997 args
.matching_flags
= 0;
1998 args
.include_anchored
= EXCLUDE_ANCHORED
;
1999 args
.o_option
= false;
2000 args
.pax_option
= false;
2001 args
.backup_suffix_string
= getenv ("SIMPLE_BACKUP_SUFFIX");
2002 args
.version_control_string
= 0;
2003 args
.input_files
= false;
2005 subcommand_option
= UNKNOWN_SUBCOMMAND
;
2006 archive_format
= DEFAULT_FORMAT
;
2007 blocking_factor
= DEFAULT_BLOCKING
;
2008 record_size
= DEFAULT_BLOCKING
* BLOCKSIZE
;
2009 excluded
= new_exclude ();
2010 newer_mtime_option
.tv_sec
= TYPE_MINIMUM (time_t);
2011 newer_mtime_option
.tv_nsec
= -1;
2012 recursion_option
= FNM_LEADING_DIR
;
2013 unquote_option
= true;
2014 tar_sparse_major
= 1;
2015 tar_sparse_minor
= 0;
2020 /* Convert old-style tar call by exploding option element and rearranging
2021 options accordingly. */
2023 if (argc
> 1 && argv
[1][0] != '-')
2025 int new_argc
; /* argc value for rearranged arguments */
2026 char **new_argv
; /* argv value for rearranged arguments */
2027 char *const *in
; /* cursor into original argv */
2028 char **out
; /* cursor into rearranged argv */
2029 const char *letter
; /* cursor into old option letters */
2030 char buffer
[3]; /* constructed option buffer */
2032 /* Initialize a constructed option. */
2037 /* Allocate a new argument array, and copy program name in it. */
2039 new_argc
= argc
- 1 + strlen (argv
[1]);
2040 new_argv
= xmalloc ((new_argc
+ 1) * sizeof (char *));
2045 /* Copy each old letter option as a separate option, and have the
2046 corresponding argument moved next to it. */
2048 for (letter
= *in
++; *letter
; letter
++)
2050 struct argp_option
*opt
;
2052 buffer
[1] = *letter
;
2053 *out
++ = xstrdup (buffer
);
2054 opt
= find_argp_option (options
, *letter
);
2055 if (opt
&& opt
->arg
)
2057 if (in
< argv
+ argc
)
2060 USAGE_ERROR ((0, 0, _("Old option `%c' requires an argument."),
2065 /* Copy all remaining options. */
2067 while (in
< argv
+ argc
)
2071 /* Replace the old option list by the new one. */
2077 /* Parse all options and non-options as they appear. */
2079 prepend_default_options (getenv ("TAR_OPTIONS"), &argc
, &argv
);
2081 if (argp_parse (&argp
, argc
, argv
, ARGP_IN_ORDER
|ARGP_NO_HELP
,
2083 exit (TAREXIT_FAILURE
);
2086 /* Special handling for 'o' option:
2088 GNU tar used to say "output old format".
2089 UNIX98 tar says don't chown files after extracting (we use
2090 "--no-same-owner" for this).
2092 The old GNU tar semantics is retained when used with --create
2093 option, otherwise UNIX98 semantics is assumed */
2097 if (subcommand_option
== CREATE_SUBCOMMAND
)
2099 /* GNU Tar <= 1.13 compatibility */
2100 set_archive_format ("v7");
2104 /* UNIX98 compatibility */
2105 same_owner_option
= -1;
2109 /* Handle operands after any "--" argument. */
2110 for (; idx
< argc
; idx
++)
2112 name_add_name (argv
[idx
], MAKE_INCL_OPTIONS (&args
));
2113 args
.input_files
= true;
2116 /* Warn about implicit use of the wildcards in command line arguments.
2118 warn_regex_usage
= args
.wildcards
== default_wildcards
;
2120 /* Derive option values and check option consistency. */
2122 if (archive_format
== DEFAULT_FORMAT
)
2124 if (args
.pax_option
)
2125 archive_format
= POSIX_FORMAT
;
2127 archive_format
= DEFAULT_ARCHIVE_FORMAT
;
2130 if ((volume_label_option
&& subcommand_option
== CREATE_SUBCOMMAND
)
2131 || incremental_option
2132 || multi_volume_option
2134 assert_format (FORMAT_MASK (OLDGNU_FORMAT
)
2135 | FORMAT_MASK (GNU_FORMAT
)
2136 | FORMAT_MASK (POSIX_FORMAT
));
2138 if (occurrence_option
)
2140 if (!args
.input_files
)
2142 _("--occurrence is meaningless without a file list")));
2143 if (subcommand_option
!= DELETE_SUBCOMMAND
2144 && subcommand_option
!= DIFF_SUBCOMMAND
2145 && subcommand_option
!= EXTRACT_SUBCOMMAND
2146 && subcommand_option
!= LIST_SUBCOMMAND
)
2148 _("--occurrence cannot be used in the requested operation mode")));
2151 if (seekable_archive
&& subcommand_option
== DELETE_SUBCOMMAND
)
2153 /* The current code in delete.c is based on the assumption that
2154 skip_member() reads all data from the archive. So, we should
2155 make sure it won't use seeks. On the other hand, the same code
2156 depends on the ability to backspace a record in the archive,
2157 so setting seekable_archive to false is technically incorrect.
2158 However, it is tested only in skip_member(), so it's not a
2160 seekable_archive
= false;
2163 if (archive_names
== 0)
2165 /* If no archive file name given, try TAPE from the environment, or
2166 else, DEFAULT_ARCHIVE from the configuration process. */
2169 archive_name_array
[0] = getenv ("TAPE");
2170 if (! archive_name_array
[0])
2171 archive_name_array
[0] = DEFAULT_ARCHIVE
;
2174 /* Allow multiple archives only with `-M'. */
2176 if (archive_names
> 1 && !multi_volume_option
)
2178 _("Multiple archive files require `-M' option")));
2180 if (listed_incremental_option
2181 && NEWER_OPTION_INITIALIZED (newer_mtime_option
))
2183 _("Cannot combine --listed-incremental with --newer")));
2185 if (volume_label_option
)
2187 if (archive_format
== GNU_FORMAT
|| archive_format
== OLDGNU_FORMAT
)
2189 size_t volume_label_max_len
=
2190 (sizeof current_header
->header
.name
2191 - 1 /* for trailing '\0' */
2192 - (multi_volume_option
2193 ? (sizeof " Volume "
2194 - 1 /* for null at end of " Volume " */
2195 + INT_STRLEN_BOUND (int) /* for volume number */
2196 - 1 /* for sign, as 0 <= volno */)
2198 if (volume_label_max_len
< strlen (volume_label_option
))
2200 ngettext ("%s: Volume label is too long (limit is %lu byte)",
2201 "%s: Volume label is too long (limit is %lu bytes)",
2202 volume_label_max_len
),
2203 quotearg_colon (volume_label_option
),
2204 (unsigned long) volume_label_max_len
));
2207 Label length in PAX format is limited by the volume size. */
2212 if (multi_volume_option
)
2213 USAGE_ERROR ((0, 0, _("Cannot verify multi-volume archives")));
2214 if (use_compress_program_option
)
2215 USAGE_ERROR ((0, 0, _("Cannot verify compressed archives")));
2218 if (use_compress_program_option
)
2220 if (multi_volume_option
)
2221 USAGE_ERROR ((0, 0, _("Cannot use multi-volume compressed archives")));
2222 if (subcommand_option
== UPDATE_SUBCOMMAND
2223 || subcommand_option
== APPEND_SUBCOMMAND
2224 || subcommand_option
== DELETE_SUBCOMMAND
)
2225 USAGE_ERROR ((0, 0, _("Cannot update compressed archives")));
2226 if (subcommand_option
== CAT_SUBCOMMAND
)
2227 USAGE_ERROR ((0, 0, _("Cannot concatenate compressed archives")));
2230 /* It is no harm to use --pax-option on non-pax archives in archive
2231 reading mode. It may even be useful, since it allows to override
2232 file attributes from tar headers. Therefore I allow such usage.
2235 && archive_format
!= POSIX_FORMAT
2236 && (subcommand_option
!= EXTRACT_SUBCOMMAND
2237 || subcommand_option
!= DIFF_SUBCOMMAND
2238 || subcommand_option
!= LIST_SUBCOMMAND
))
2239 USAGE_ERROR ((0, 0, _("--pax-option can be used only on POSIX archives")));
2241 /* If ready to unlink hierarchies, so we are for simpler files. */
2242 if (recursive_unlink_option
)
2243 old_files_option
= UNLINK_FIRST_OLD_FILES
;
2246 if (test_label_option
)
2248 /* --test-label is silent if the user has specified the label name to
2250 if (!args
.input_files
)
2253 else if (utc_option
)
2256 /* Forbid using -c with no input files whatsoever. Check that `-f -',
2257 explicit or implied, is used correctly. */
2259 switch (subcommand_option
)
2261 case CREATE_SUBCOMMAND
:
2262 if (!args
.input_files
&& !files_from_option
)
2264 _("Cowardly refusing to create an empty archive")));
2267 case EXTRACT_SUBCOMMAND
:
2268 case LIST_SUBCOMMAND
:
2269 case DIFF_SUBCOMMAND
:
2270 for (archive_name_cursor
= archive_name_array
;
2271 archive_name_cursor
< archive_name_array
+ archive_names
;
2272 archive_name_cursor
++)
2273 if (!strcmp (*archive_name_cursor
, "-"))
2274 request_stdin ("-f");
2277 case CAT_SUBCOMMAND
:
2278 case UPDATE_SUBCOMMAND
:
2279 case APPEND_SUBCOMMAND
:
2280 for (archive_name_cursor
= archive_name_array
;
2281 archive_name_cursor
< archive_name_array
+ archive_names
;
2282 archive_name_cursor
++)
2283 if (!strcmp (*archive_name_cursor
, "-"))
2285 _("Options `-Aru' are incompatible with `-f -'")));
2291 /* Initialize stdlis */
2292 if (index_file_name
)
2294 stdlis
= fopen (index_file_name
, "w");
2296 open_error (index_file_name
);
2299 stdlis
= to_stdout_option
? stderr
: stdout
;
2301 archive_name_cursor
= archive_name_array
;
2303 /* Prepare for generating backup names. */
2305 if (args
.backup_suffix_string
)
2306 simple_backup_suffix
= xstrdup (args
.backup_suffix_string
);
2310 backup_type
= xget_version ("--backup", args
.version_control_string
);
2311 /* No backup is needed either if explicitely disabled or if
2312 the extracted files are not being written to disk. */
2313 if (backup_type
== no_backups
|| EXTRACT_OVER_PIPE
)
2314 backup_option
= false;
2318 report_textual_dates (&args
);
2324 /* Main routine for tar. */
2326 main (int argc
, char **argv
)
2329 program_name
= argv
[0];
2331 setlocale (LC_ALL
, "");
2332 bindtextdomain (PACKAGE
, LOCALEDIR
);
2333 textdomain (PACKAGE
);
2335 exit_failure
= TAREXIT_FAILURE
;
2336 exit_status
= TAREXIT_SUCCESS
;
2337 filename_terminator
= '\n';
2338 set_quoting_style (0, DEFAULT_QUOTING_STYLE
);
2340 /* Make sure we have first three descriptors available */
2343 /* Pre-allocate a few structures. */
2345 allocated_archive_names
= 10;
2346 archive_name_array
=
2347 xmalloc (sizeof (const char *) * allocated_archive_names
);
2350 obstack_init (&argv_stk
);
2353 /* System V fork+wait does not work if SIGCHLD is ignored. */
2354 signal (SIGCHLD
, SIG_DFL
);
2357 /* Decode options. */
2359 decode_options (argc
, argv
);
2363 /* Main command execution. */
2365 if (volno_file_option
)
2366 init_volume_number ();
2368 switch (subcommand_option
)
2370 case UNKNOWN_SUBCOMMAND
:
2372 _("You must specify one of the `-Acdtrux' options")));
2374 case CAT_SUBCOMMAND
:
2375 case UPDATE_SUBCOMMAND
:
2376 case APPEND_SUBCOMMAND
:
2380 case DELETE_SUBCOMMAND
:
2381 delete_archive_members ();
2384 case CREATE_SUBCOMMAND
:
2388 case EXTRACT_SUBCOMMAND
:
2390 read_and (extract_archive
);
2392 /* FIXME: should extract_finish () even if an ordinary signal is
2398 case LIST_SUBCOMMAND
:
2399 read_and (list_archive
);
2402 case DIFF_SUBCOMMAND
:
2404 read_and (diff_archive
);
2409 print_total_stats ();
2411 if (check_links_option
)
2414 if (volno_file_option
)
2415 closeout_volume_number ();
2417 /* Dispose of allocated memory, and return. */
2419 free (archive_name_array
);
2422 if (exit_status
== TAREXIT_FAILURE
)
2423 error (0, 0, _("Error exit delayed from previous errors"));
2425 if (stdlis
== stdout
)
2427 else if (ferror (stderr
) || fclose (stderr
) != 0)
2428 exit_status
= TAREXIT_FAILURE
;
2434 tar_stat_init (struct tar_stat_info
*st
)
2436 memset (st
, 0, sizeof (*st
));
2440 tar_stat_destroy (struct tar_stat_info
*st
)
2442 free (st
->orig_file_name
);
2443 free (st
->file_name
);
2444 free (st
->link_name
);
2447 free (st
->sparse_map
);
2449 xheader_destroy (&st
->xhdr
);
2450 memset (st
, 0, sizeof (*st
));
2453 /* Format mask for all available formats that support nanosecond
2454 timestamp resolution. */
2455 #define NS_PRECISION_FORMAT_MASK FORMAT_MASK (POSIX_FORMAT)
2457 /* Same as timespec_cmp, but ignore nanoseconds if current archive
2458 format does not provide sufficient resolution. */
2460 tar_timespec_cmp (struct timespec a
, struct timespec b
)
2462 if (!(FORMAT_MASK (current_format
) & NS_PRECISION_FORMAT_MASK
))
2463 a
.tv_nsec
= b
.tv_nsec
= 0;
2464 return timespec_cmp (a
, b
);