1 /* A tar (tape archiver) program.
3 Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000,
4 2001, 2003, 2004, 2005, 2006 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 2, 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. */
27 #include <argp-namefrob.h>
28 #include <argp-fmtstream.h>
31 #if ! defined SIGCHLD && defined SIGCLD
32 # define SIGCHLD SIGCLD
35 /* The following causes "common.h" to produce definitions of all the global
36 variables, rather than just "extern" declarations of them. GNU tar does
37 depend on the system loader to preset all GLOBAL variables to neutral (or
38 zero) values; explicit initialization is usually not done. */
46 #include <localedir.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
,
261 IGNORE_COMMAND_ERROR_OPTION
,
262 IGNORE_FAILED_READ_OPTION
,
264 KEEP_NEWER_FILES_OPTION
,
269 NO_DELAY_DIRECTORY_RESTORE_OPTION
,
270 NO_IGNORE_CASE_OPTION
,
271 NO_IGNORE_COMMAND_ERROR_OPTION
,
272 NO_OVERWRITE_DIR_OPTION
,
273 NO_QUOTE_CHARS_OPTION
,
275 NO_SAME_OWNER_OPTION
,
276 NO_SAME_PERMISSIONS_OPTION
,
278 NO_WILDCARDS_MATCH_SLASH_OPTION
,
281 NUMERIC_OWNER_OPTION
,
284 ONE_FILE_SYSTEM_OPTION
,
285 OVERWRITE_DIR_OPTION
,
292 QUOTING_STYLE_OPTION
,
295 RECURSIVE_UNLINK_OPTION
,
301 SHOW_DEFAULTS_OPTION
,
302 SHOW_OMITTED_DIRS_OPTION
,
303 SHOW_TRANSFORMED_NAMES_OPTION
,
304 SPARSE_VERSION_OPTION
,
305 STRIP_COMPONENTS_OPTION
,
313 USE_COMPRESS_PROGRAM_OPTION
,
317 WILDCARDS_MATCH_SLASH_OPTION
,
321 const char *argp_program_version
= "tar (" PACKAGE_NAME
") " VERSION
;
322 const char *argp_program_bug_address
= "<" PACKAGE_BUGREPORT
">";
323 static char const doc0
[] = N_("\
324 GNU `tar' saves many files together into a single tape or disk archive, \
325 and can restore individual files from the archive.\n\
328 tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n\
329 tar -tvf archive.tar # List all files in archive.tar verbosely.\n\
330 tar -xf archive.tar # Extract all files from archive.tar.\n\
332 static char const doc1
[] = N_("\
333 The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
334 The version control may be set with --backup or VERSION_CONTROL, values are:\n\n\
335 none, off never make backups\n\
336 t, numbered make numbered backups\n\
337 nil, existing numbered if numbered backups exist, simple otherwise\n\
338 never, simple always make simple backups\n");
343 Available option letters are DEIJQY and aeqy. Consider the following
346 [For Solaris tar compatibility =/= Is it important at all?]
347 e exit immediately with a nonzero exit status if unexpected errors occur
348 E use extended headers (--format=posix)
350 [q alias for --occurrence=1 =/= this would better be used for quiet?]
351 [I same as T =/= will harm star compatibility]
353 y per-file gzip compression
354 Y per-block gzip compression */
356 static struct argp_option options
[] = {
359 N_("Main operation mode:"), GRID
},
362 N_("list the contents of an archive"), GRID
+1 },
363 {"extract", 'x', 0, 0,
364 N_("extract files from an archive"), GRID
+1 },
365 {"get", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
366 {"create", 'c', 0, 0,
367 N_("create a new archive"), GRID
+1 },
369 N_("find differences between archive and file system"), GRID
+1 },
370 {"compare", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
371 {"append", 'r', 0, 0,
372 N_("append files to the end of an archive"), GRID
+1 },
373 {"update", 'u', 0, 0,
374 N_("only append files newer than copy in archive"), GRID
+1 },
375 {"catenate", 'A', 0, 0,
376 N_("append tar files to an archive"), GRID
+1 },
377 {"concatenate", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
378 {"delete", DELETE_OPTION
, 0, 0,
379 N_("delete from the archive (not on mag tapes!)"), GRID
+1 },
380 {"test-label", TEST_LABEL_OPTION
, NULL
, 0,
381 N_("test the archive volume label and exit"), GRID
+1 },
386 N_("Operation modifiers:"), GRID
},
388 {"sparse", 'S', 0, 0,
389 N_("handle sparse files efficiently"), GRID
+1 },
390 {"sparse-version", SPARSE_VERSION_OPTION
, N_("MAJOR[.MINOR]"), 0,
391 N_("set version of the sparse format to use (implies --sparse)"), GRID
+1},
392 {"incremental", 'G', 0, 0,
393 N_("handle old GNU-format incremental backup"), GRID
+1 },
394 {"listed-incremental", 'g', N_("FILE"), 0,
395 N_("handle new GNU-format incremental backup"), GRID
+1 },
396 {"ignore-failed-read", IGNORE_FAILED_READ_OPTION
, 0, 0,
397 N_("do not exit with nonzero on unreadable files"), GRID
+1 },
398 {"occurrence", OCCURRENCE_OPTION
, N_("NUMBER"), OPTION_ARG_OPTIONAL
,
399 N_("process only the NUMBERth occurrence of each file in the archive;"
400 " this option is valid only in conjunction with one of the subcommands"
401 " --delete, --diff, --extract or --list and when a list of files"
402 " is given either on the command line or via the -T option;"
403 " NUMBER defaults to 1"), GRID
+1 },
404 {"seek", 'n', NULL
, 0,
405 N_("archive is seekable"), GRID
+1 },
410 N_("Overwrite control:"), GRID
+1 },
412 {"verify", 'W', 0, 0,
413 N_("attempt to verify the archive after writing it"), GRID
+1 },
414 {"remove-files", REMOVE_FILES_OPTION
, 0, 0,
415 N_("remove files after adding them to the archive"), GRID
+1 },
416 {"keep-old-files", 'k', 0, 0,
417 N_("don't replace existing files when extracting"), GRID
+1 },
418 {"keep-newer-files", KEEP_NEWER_FILES_OPTION
, 0, 0,
419 N_("don't replace existing files that are newer than their archive copies"), GRID
+1 },
420 {"overwrite", OVERWRITE_OPTION
, 0, 0,
421 N_("overwrite existing files when extracting"), GRID
+1 },
422 {"unlink-first", 'U', 0, 0,
423 N_("remove each file prior to extracting over it"), GRID
+1 },
424 {"recursive-unlink", RECURSIVE_UNLINK_OPTION
, 0, 0,
425 N_("empty hierarchies prior to extracting directory"), GRID
+1 },
426 {"no-overwrite-dir", NO_OVERWRITE_DIR_OPTION
, 0, 0,
427 N_("preserve metadata of existing directories"), GRID
+1 },
428 {"overwrite-dir", OVERWRITE_DIR_OPTION
, 0, 0,
429 N_("overwrite metadata of existing directories when extracting (default)"),
435 N_("Select output stream:"), GRID
},
437 {"to-stdout", 'O', 0, 0,
438 N_("extract files to standard output"), GRID
+1 },
439 {"to-command", TO_COMMAND_OPTION
, N_("COMMAND"), 0,
440 N_("pipe extracted files to another program"), GRID
+1 },
441 {"ignore-command-error", IGNORE_COMMAND_ERROR_OPTION
, 0, 0,
442 N_("ignore exit codes of children"), GRID
+1 },
443 {"no-ignore-command-error", NO_IGNORE_COMMAND_ERROR_OPTION
, 0, 0,
444 N_("treat non-zero exit codes of children as error"), GRID
+1 },
449 N_("Handling of file attributes:"), GRID
},
451 {"owner", OWNER_OPTION
, N_("NAME"), 0,
452 N_("force NAME as owner for added files"), GRID
+1 },
453 {"group", GROUP_OPTION
, N_("NAME"), 0,
454 N_("force NAME as group for added files"), GRID
+1 },
455 {"mtime", MTIME_OPTION
, N_("DATE-OR-FILE"), 0,
456 N_("set mtime for added files from DATE-OR-FILE"), GRID
+1 },
457 {"mode", MODE_OPTION
, N_("CHANGES"), 0,
458 N_("force (symbolic) mode CHANGES for added files"), GRID
+1 },
459 {"atime-preserve", ATIME_PRESERVE_OPTION
,
460 N_("METHOD"), OPTION_ARG_OPTIONAL
,
461 N_("preserve access times on dumped files, either by restoring the times"
462 " after reading (METHOD='replace'; default) or by not setting the times"
463 " in the first place (METHOD='system')"), GRID
+1 },
465 N_("don't extract file modified time"), GRID
+1 },
466 {"same-owner", SAME_OWNER_OPTION
, 0, 0,
467 N_("try extracting files with the same ownership"), GRID
+1 },
468 {"no-same-owner", NO_SAME_OWNER_OPTION
, 0, 0,
469 N_("extract files as yourself"), GRID
+1 },
470 {"numeric-owner", NUMERIC_OWNER_OPTION
, 0, 0,
471 N_("always use numbers for user/group names"), GRID
+1 },
472 {"preserve-permissions", 'p', 0, 0,
473 N_("extract information about file permissions (default for superuser)"),
475 {"same-permissions", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
476 {"no-same-permissions", NO_SAME_PERMISSIONS_OPTION
, 0, 0,
477 N_("apply the user's umask when extracting permissions from the archive (default for ordinary users)"), GRID
+1 },
478 {"preserve-order", 's', 0, 0,
479 N_("sort names to extract to match archive"), GRID
+1 },
480 {"same-order", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
481 {"preserve", PRESERVE_OPTION
, 0, 0,
482 N_("same as both -p and -s"), GRID
+1 },
483 {"delay-directory-restore", DELAY_DIRECTORY_RESTORE_OPTION
, 0, 0,
484 N_("delay setting modification times and permissions of extracted"
485 " directories until the end of extraction"), GRID
+1 },
486 {"no-delay-directory-restore", NO_DELAY_DIRECTORY_RESTORE_OPTION
, 0, 0,
487 N_("cancel the effect of --delay-directory-restore option"), GRID
+1 },
492 N_("Device selection and switching:\n"), GRID
+1 },
494 {"file", 'f', N_("ARCHIVE"), 0,
495 N_("use archive file or device ARCHIVE"), GRID
+1 },
496 {"force-local", FORCE_LOCAL_OPTION
, 0, 0,
497 N_("archive file is local even if it has a colon"), GRID
+1 },
498 {"rmt-command", RMT_COMMAND_OPTION
, N_("COMMAND"), 0,
499 N_("use given rmt COMMAND instead of rmt"), GRID
+1 },
500 {"rsh-command", RSH_COMMAND_OPTION
, N_("COMMAND"), 0,
501 N_("use remote COMMAND instead of rsh"), GRID
+1 },
503 {"-[0-7][lmh]", 0, NULL
, OPTION_DOC
, /* It is OK, since `name' will never be
505 N_("specify drive and density"), GRID
+1 },
507 {NULL
, '0', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
508 {NULL
, '1', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
509 {NULL
, '2', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
510 {NULL
, '3', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
511 {NULL
, '4', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
512 {NULL
, '5', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
513 {NULL
, '6', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
514 {NULL
, '7', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
515 {NULL
, '8', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
516 {NULL
, '9', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
518 {"multi-volume", 'M', 0, 0,
519 N_("create/list/extract multi-volume archive"), GRID
+1 },
520 {"tape-length", 'L', N_("NUMBER"), 0,
521 N_("change tape after writing NUMBER x 1024 bytes"), GRID
+1 },
522 {"info-script", 'F', N_("NAME"), 0,
523 N_("run script at end of each tape (implies -M)"), GRID
+1 },
524 {"new-volume-script", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
525 {"volno-file", VOLNO_FILE_OPTION
, N_("FILE"), 0,
526 N_("use/update the volume number in FILE"), GRID
+1 },
531 N_("Device blocking:"), GRID
+1 },
533 {"blocking-factor", 'b', N_("BLOCKS"), 0,
534 N_("BLOCKS x 512 bytes per record"), GRID
+1 },
535 {"record-size", RECORD_SIZE_OPTION
, N_("NUMBER"), 0,
536 N_("NUMBER of bytes per record, multiple of 512"), GRID
+1 },
537 {"ignore-zeros", 'i', 0, 0,
538 N_("ignore zeroed blocks in archive (means EOF)"), GRID
+1 },
539 {"read-full-records", 'B', 0, 0,
540 N_("reblock as we read (for 4.2BSD pipes)"), GRID
+1 },
545 N_("Archive format selection:"), GRID
},
547 {"format", 'H', N_("FORMAT"), 0,
548 N_("create archive of the given format"), GRID
+1 },
550 {NULL
, 0, NULL
, 0, N_("FORMAT is one of the following:"), GRID
+2 },
551 {" v7", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("old V7 tar format"),
553 {" oldgnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
554 N_("GNU format as per tar <= 1.12"), GRID
+3 },
555 {" gnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
556 N_("GNU tar 1.13.x format"), GRID
+3 },
557 {" ustar", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
558 N_("POSIX 1003.1-1988 (ustar) format"), GRID
+3 },
559 {" pax", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
560 N_("POSIX 1003.1-2001 (pax) format"), GRID
+3 },
561 {" posix", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("same as pax"), GRID
+3 },
563 {"old-archive", OLD_ARCHIVE_OPTION
, 0, 0, /* FIXME */
564 N_("same as --format=v7"), GRID
+8 },
565 {"portability", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
566 {"posix", POSIX_OPTION
, 0, 0,
567 N_("same as --format=posix"), GRID
+8 },
568 {"pax-option", PAX_OPTION
, N_("keyword[[:]=value][,keyword[[:]=value]]..."), 0,
569 N_("control pax keywords"), GRID
+8 },
570 {"label", 'V', N_("TEXT"), 0,
571 N_("create archive with volume name TEXT; at list/extract time, use TEXT as a globbing pattern for volume name"), GRID
+8 },
573 N_("filter the archive through bzip2"), GRID
+8 },
575 N_("filter the archive through gzip"), GRID
+8 },
576 {"gunzip", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
577 {"ungzip", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
578 {"compress", 'Z', 0, 0,
579 N_("filter the archive through compress"), GRID
+8 },
580 {"uncompress", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
581 {"use-compress-program", USE_COMPRESS_PROGRAM_OPTION
, N_("PROG"), 0,
582 N_("filter through PROG (must accept -d)"), GRID
+8 },
587 N_("Local file selection:"), GRID
},
589 {"add-file", ARGP_KEY_ARG
, N_("FILE"), 0,
590 N_("add given FILE to the archive (useful if its name starts with a dash)"), GRID
+1 },
591 {"directory", 'C', N_("DIR"), 0,
592 N_("change to directory DIR"), GRID
+1 },
593 {"files-from", 'T', N_("FILE"), 0,
594 N_("get names to extract or create from FILE"), GRID
+1 },
595 {"null", NULL_OPTION
, 0, 0,
596 N_("-T reads null-terminated names, disable -C"), GRID
+1 },
597 {"unquote", UNQUOTE_OPTION
, 0, 0,
598 N_("unquote filenames read with -T (default)"), GRID
+1 },
599 {"no-unquote", NO_UNQUOTE_OPTION
, 0, 0,
600 N_("do not unquote filenames read with -T"), GRID
+1 },
601 {"exclude", EXCLUDE_OPTION
, N_("PATTERN"), 0,
602 N_("exclude files, given as a PATTERN"), GRID
+1 },
603 {"exclude-from", 'X', N_("FILE"), 0,
604 N_("exclude patterns listed in FILE"), GRID
+1 },
605 {"exclude-caches", EXCLUDE_CACHES_OPTION
, 0, 0,
606 N_("exclude directories containing a cache tag"), GRID
+1 },
607 {"no-recursion", NO_RECURSION_OPTION
, 0, 0,
608 N_("avoid descending automatically in directories"), GRID
+1 },
609 {"one-file-system", ONE_FILE_SYSTEM_OPTION
, 0, 0,
610 N_("stay in local file system when creating archive"), GRID
+1 },
611 {"recursion", RECURSION_OPTION
, 0, 0,
612 N_("recurse into directories (default)"), GRID
+1 },
613 {"absolute-names", 'P', 0, 0,
614 N_("don't strip leading `/'s from file names"), GRID
+1 },
615 {"dereference", 'h', 0, 0,
616 N_("follow symlinks; archive and dump the files they point to"), GRID
+1 },
617 {"starting-file", 'K', N_("MEMBER-NAME"), 0,
618 N_("begin at member MEMBER-NAME in the archive"), GRID
+1 },
619 {"newer", 'N', N_("DATE-OR-FILE"), 0,
620 N_("only store files newer than DATE-OR-FILE"), GRID
+1 },
621 {"after-date", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
622 {"newer-mtime", NEWER_MTIME_OPTION
, N_("DATE"), 0,
623 N_("compare date and time when data changed only"), GRID
+1 },
624 {"backup", BACKUP_OPTION
, N_("CONTROL"), OPTION_ARG_OPTIONAL
,
625 N_("backup before removal, choose version CONTROL"), GRID
+1 },
626 {"suffix", SUFFIX_OPTION
, N_("STRING"), 0,
627 N_("backup before removal, override usual suffix ('~' unless overridden by environment variable SIMPLE_BACKUP_SUFFIX)"), GRID
+1 },
632 N_("File name transformations:"), GRID
},
633 {"strip-components", STRIP_COMPONENTS_OPTION
, N_("NUMBER"), 0,
634 N_("strip NUMBER leading components from file names on extraction"),
636 {"transform", TRANSFORM_OPTION
, N_("EXPRESSION"), 0,
637 N_("use sed replace EXPRESSION to transform file names"), GRID
+1 },
642 N_("File name matching options (affect both exclude and include patterns):"),
644 {"ignore-case", IGNORE_CASE_OPTION
, 0, 0,
645 N_("ignore case"), GRID
+1 },
646 {"anchored", ANCHORED_OPTION
, 0, 0,
647 N_("patterns match file name start"), GRID
+1 },
648 {"no-anchored", NO_ANCHORED_OPTION
, 0, 0,
649 N_("patterns match after any `/' (default for exclusion)"), GRID
+1 },
650 {"no-ignore-case", NO_IGNORE_CASE_OPTION
, 0, 0,
651 N_("case sensitive matching (default)"), GRID
+1 },
652 {"wildcards", WILDCARDS_OPTION
, 0, 0,
653 N_("use wildcards (default for exclusion)"), GRID
+1 },
654 {"no-wildcards", NO_WILDCARDS_OPTION
, 0, 0,
655 N_("verbatim string matching"), GRID
+1 },
656 {"no-wildcards-match-slash", NO_WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
657 N_("wildcards do not match `/'"), GRID
+1 },
658 {"wildcards-match-slash", WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
659 N_("wildcards match `/' (default for exclusion)"), GRID
+1 },
664 N_("Informative output:"), GRID
},
666 {"verbose", 'v', 0, 0,
667 N_("verbosely list files processed"), GRID
+1 },
668 {"checkpoint", CHECKPOINT_OPTION
, N_("[.]NUMBER"), OPTION_ARG_OPTIONAL
,
669 N_("display progress messages every NUMBERth record (default 10)"),
671 {"check-links", 'l', 0, 0,
672 N_("print a message if not all links are dumped"), GRID
+1 },
673 {"totals", TOTALS_OPTION
, N_("SIGNAL"), OPTION_ARG_OPTIONAL
,
674 N_("print total bytes after processing the archive; "
675 "with an argument - print total bytes when this SIGNAL is delivered; "
676 "Allowed signals are: SIGHUP, SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; "
677 "the names without SIG prefix are also accepted"), GRID
+1 },
678 {"utc", UTC_OPTION
, 0, 0,
679 N_("print file modification dates in UTC"), GRID
+1 },
680 {"index-file", INDEX_FILE_OPTION
, N_("FILE"), 0,
681 N_("send verbose output to FILE"), GRID
+1 },
682 {"block-number", 'R', 0, 0,
683 N_("show block number within archive with each message"), GRID
+1 },
684 {"interactive", 'w', 0, 0,
685 N_("ask for confirmation for every action"), GRID
+1 },
686 {"confirmation", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
687 {"show-defaults", SHOW_DEFAULTS_OPTION
, 0, 0,
688 N_("show tar defaults"), GRID
+1 },
689 {"show-omitted-dirs", SHOW_OMITTED_DIRS_OPTION
, 0, 0,
690 N_("when listing or extracting, list each directory that does not match search criteria"), GRID
+1 },
691 {"show-transformed-names", SHOW_TRANSFORMED_NAMES_OPTION
, 0, 0,
692 N_("show file or archive names after transformation"),
694 {"show-stored-names", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
695 {"quoting-style", QUOTING_STYLE_OPTION
, N_("STYLE"), 0,
696 N_("set name quoting style; see below for valid STYLE values"), GRID
+1 },
697 {"quote-chars", QUOTE_CHARS_OPTION
, N_("STRING"), 0,
698 N_("additionally quote characters from STRING"), GRID
+1 },
699 {"no-quote-chars", NO_QUOTE_CHARS_OPTION
, N_("STRING"), 0,
700 N_("disable quoting for characters from STRING"), GRID
+1 },
705 N_("Compatibility options:"), GRID
},
708 N_("when creating, same as --old-archive; when extracting, same as --no-same-owner"), GRID
+1 },
713 N_("Other options:"), GRID
},
715 {"restrict", RESTRICT_OPTION
, 0, 0,
716 N_("disable use of some potentially harmful options"), -1 },
718 {"help", '?', 0, 0, N_("give this help list"), -1},
719 {"usage", USAGE_OPTION
, 0, 0, N_("give a short usage message"), -1},
720 {"version", VERSION_OPTION
, 0, 0, N_("print program version"), -1},
721 /* FIXME -V (--label) conflicts with the default short option for
723 {"HANG", HANG_OPTION
, "SECS", OPTION_ARG_OPTIONAL
| OPTION_HIDDEN
,
724 N_("hang for SECS seconds (default 3600)"), 0},
730 static char const *const atime_preserve_args
[] =
732 "replace", "system", NULL
735 static enum atime_preserve
const atime_preserve_types
[] =
737 replace_atime_preserve
, system_atime_preserve
740 /* Make sure atime_preserve_types has as much entries as atime_preserve_args
741 (minus 1 for NULL guard) */
742 ARGMATCH_VERIFY (atime_preserve_args
, atime_preserve_types
);
744 /* Wildcard matching settings */
747 default_wildcards
, /* For exclusion == enable_wildcards,
748 for inclusion == disable_wildcards */
753 struct tar_args
/* Variables used during option parsing */
755 struct textual_date
*textual_date
; /* Keeps the arguments to --newer-mtime
756 and/or --date option if they are
758 enum wildcards wildcards
; /* Wildcard settings (--wildcards/
760 int matching_flags
; /* exclude_fnmatch options */
761 int include_anchored
; /* Pattern anchoring options used for
763 bool o_option
; /* True if -o option was given */
764 bool pax_option
; /* True if --pax-option was given */
765 char const *backup_suffix_string
; /* --suffix option argument */
766 char const *version_control_string
; /* --backup option argument */
767 bool input_files
; /* True if some input files where given */
770 #define MAKE_EXCL_OPTIONS(args) \
771 ((((args)->wildcards != disable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
772 | (args)->matching_flags \
775 #define MAKE_INCL_OPTIONS(args) \
776 ((((args)->wildcards == enable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
777 | (args)->include_anchored \
778 | (args)->matching_flags \
782 # define DECL_SHOW_DEFAULT_SETTINGS(stream, printer) \
785 "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s", \
786 archive_format_string (DEFAULT_ARCHIVE_FORMAT), \
787 DEFAULT_ARCHIVE, DEFAULT_BLOCKING, \
788 quoting_style_args[DEFAULT_QUOTING_STYLE], \
789 DEFAULT_RMT_COMMAND); \
790 printer (stream, " --rsh-command=%s", REMOTE_SHELL); \
791 printer (stream, "\n"); \
794 # define DECL_SHOW_DEFAULT_SETTINGS(stream, printer) \
797 "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s", \
798 archive_format_string (DEFAULT_ARCHIVE_FORMAT), \
799 DEFAULT_ARCHIVE, DEFAULT_BLOCKING, \
800 quoting_style_args[DEFAULT_QUOTING_STYLE], \
801 DEFAULT_RMT_COMMAND); \
802 printer (stream, "\n"); \
807 show_default_settings (FILE *fp
)
808 DECL_SHOW_DEFAULT_SETTINGS(fp
, fprintf
)
811 show_default_settings_fs (argp_fmtstream_t fs
)
812 DECL_SHOW_DEFAULT_SETTINGS(fs
, argp_fmtstream_printf
)
815 set_subcommand_option (enum subcommand subcommand
)
817 if (subcommand_option
!= UNKNOWN_SUBCOMMAND
818 && subcommand_option
!= subcommand
)
820 _("You may not specify more than one `-Acdtrux' option")));
822 subcommand_option
= subcommand
;
826 set_use_compress_program_option (const char *string
)
828 if (use_compress_program_option
829 && strcmp (use_compress_program_option
, string
) != 0)
830 USAGE_ERROR ((0, 0, _("Conflicting compression options")));
832 use_compress_program_option
= string
;
839 print_total_stats ();
840 #ifndef HAVE_SIGACTION
841 signal (signo
, sigstat
);
846 stat_on_signal (int signo
)
848 #ifdef HAVE_SIGACTION
849 struct sigaction act
;
850 act
.sa_handler
= sigstat
;
851 sigemptyset (&act
.sa_mask
);
853 sigaction (signo
, &act
, NULL
);
855 signal (signo
, sigstat
);
860 set_stat_signal (const char *name
)
867 { "SIGUSR1", SIGUSR1
},
869 { "SIGUSR2", SIGUSR2
},
871 { "SIGHUP", SIGHUP
},
873 { "SIGINT", SIGINT
},
875 { "SIGQUIT", SIGQUIT
},
880 for (p
= sigtab
; p
< sigtab
+ sizeof (sigtab
) / sizeof (sigtab
[0]); p
++)
881 if (strcmp (p
->name
, name
) == 0)
883 stat_on_signal (p
->signo
);
886 FATAL_ERROR ((0, 0, _("Unknown signal name: %s"), name
));
892 struct textual_date
*next
;
899 get_date_or_file (struct tar_args
*args
, const char *option
,
900 const char *str
, struct timespec
*ts
)
902 if (FILE_SYSTEM_PREFIX_LEN (str
) != 0
907 if (deref_stat (dereference_option
, str
, &st
) != 0)
910 USAGE_ERROR ((0, 0, _("Date sample file not found")));
912 *ts
= get_stat_mtime (&st
);
916 if (! get_date (ts
, str
, NULL
))
918 WARN ((0, 0, _("Substituting %s for unknown date format %s"),
919 tartime (*ts
, false), quote (str
)));
924 struct textual_date
*p
= xmalloc (sizeof (*p
));
928 p
->next
= args
->textual_date
;
929 args
->textual_date
= p
;
935 report_textual_dates (struct tar_args
*args
)
937 struct textual_date
*p
;
938 for (p
= args
->textual_date
; p
; )
940 struct textual_date
*next
= p
->next
;
941 char const *treated_as
= tartime (*p
->ts
, true);
942 if (strcmp (p
->date
, treated_as
) != 0)
943 WARN ((0, 0, _("Option %s: Treating date `%s' as %s"),
944 p
->option
, p
->date
, treated_as
));
951 static volatile int _argp_hang
;
953 enum read_file_list_state
/* Result of reading file name from the list file */
955 file_list_success
, /* OK, name read successfully */
956 file_list_end
, /* End of list file */
957 file_list_zero
/* Zero separator encountered where it should not */
960 /* Read from FP a sequence of characters up to FILENAME_TERMINATOR and put them
963 static enum read_file_list_state
964 read_name_from_file (FILE *fp
, struct obstack
*stk
)
969 for (c
= getc (fp
); c
!= EOF
&& c
!= filename_terminator
; c
= getc (fp
))
973 /* We have read a zero separator. The file possibly is
975 /* FATAL_ERROR((0, 0, N_("file name contains null character"))); */
976 return file_list_zero
;
978 obstack_1grow (stk
, c
);
982 obstack_1grow (stk
, 0);
984 return (counter
== 0 && c
== EOF
) ? file_list_end
: file_list_success
;
988 static bool files_from_option
; /* When set, tar will not refuse to create
990 static struct obstack argv_stk
; /* Storage for additional command line options
991 read using -T option */
993 /* Prevent recursive inclusion of the same file */
996 struct file_id_list
*next
;
1001 static struct file_id_list
*file_id_list
;
1004 add_file_id (const char *filename
)
1006 struct file_id_list
*p
;
1009 if (stat (filename
, &st
))
1010 stat_fatal (filename
);
1011 for (p
= file_id_list
; p
; p
= p
->next
)
1012 if (p
->ino
== st
.st_ino
&& p
->dev
== st
.st_dev
)
1014 FATAL_ERROR ((0, 0, _("%s: file list already read"),
1015 quotearg_colon (filename
)));
1017 p
= xmalloc (sizeof *p
);
1018 p
->next
= file_id_list
;
1024 /* Default density numbers for [0-9][lmh] device specifications */
1026 #ifndef LOW_DENSITY_NUM
1027 # define LOW_DENSITY_NUM 0
1030 #ifndef MID_DENSITY_NUM
1031 # define MID_DENSITY_NUM 8
1034 #ifndef HIGH_DENSITY_NUM
1035 # define HIGH_DENSITY_NUM 16
1039 update_argv (const char *filename
, struct argp_state
*state
)
1042 size_t count
= 0, i
;
1046 bool is_stdin
= false;
1047 enum read_file_list_state read_state
;
1049 if (!strcmp (filename
, "-"))
1052 request_stdin ("-T");
1057 add_file_id (filename
);
1058 if ((fp
= fopen (filename
, "r")) == NULL
)
1059 open_fatal (filename
);
1062 while ((read_state
= read_name_from_file (fp
, &argv_stk
)) == file_list_success
)
1065 if (read_state
== file_list_zero
)
1069 WARN ((0, 0, N_("%s: file name read contains nul character"),
1070 quotearg_colon (filename
)));
1072 /* Prepare new stack contents */
1073 size
= obstack_object_size (&argv_stk
);
1074 p
= obstack_finish (&argv_stk
);
1075 for (; size
> 0; size
--, p
++)
1077 obstack_1grow (&argv_stk
, *p
);
1079 obstack_1grow (&argv_stk
, '\n');
1080 obstack_1grow (&argv_stk
, 0);
1083 /* Read rest of files using new filename terminator */
1084 filename_terminator
= 0;
1085 while (read_name_from_file (fp
, &argv_stk
) == file_list_success
)
1095 start
= obstack_finish (&argv_stk
);
1097 if (filename_terminator
== 0)
1098 for (p
= start
; *p
; p
+= strlen (p
) + 1)
1102 new_argc
= state
->argc
+ count
;
1103 new_argv
= xmalloc (sizeof (state
->argv
[0]) * (new_argc
+ 1));
1104 memcpy (new_argv
, state
->argv
, sizeof (state
->argv
[0]) * (state
->argc
+ 1));
1105 state
->argv
= new_argv
;
1106 memmove (&state
->argv
[state
->next
+ count
], &state
->argv
[state
->next
],
1107 (state
->argc
- state
->next
+ 1) * sizeof (state
->argv
[0]));
1109 state
->argc
= new_argc
;
1111 for (i
= state
->next
, p
= start
; *p
; p
+= strlen (p
) + 1, i
++)
1113 if (filename_terminator
== 0 && p
[0] == '-')
1114 state
->argv
[i
++] = "--add-file";
1121 tar_help (struct argp_state
*state
)
1123 argp_fmtstream_t fs
;
1124 state
->flags
|= ARGP_NO_EXIT
;
1125 argp_state_help (state
, state
->out_stream
,
1126 ARGP_HELP_STD_HELP
& ~ARGP_HELP_BUG_ADDR
);
1127 /* FIXME: use struct uparams.rmargin (from argp-help.c) instead of 79 */
1128 fs
= argp_make_fmtstream (state
->out_stream
, 0, 79, 0);
1130 argp_fmtstream_printf (fs
, "\n%s\n\n",
1131 _("Valid arguments for --quoting-style options are:"));
1132 tar_list_quoting_styles (fs
, " ");
1134 argp_fmtstream_puts (fs
, _("\n*This* tar defaults to:\n"));
1135 show_default_settings_fs (fs
);
1136 argp_fmtstream_putc (fs
, '\n');
1137 argp_fmtstream_printf (fs
, _("Report bugs to %s.\n"),
1138 argp_program_bug_address
);
1139 argp_fmtstream_free (fs
);
1143 parse_opt (int key
, char *arg
, struct argp_state
*state
)
1145 struct tar_args
*args
= state
->input
;
1150 /* File name or non-parsed option, because of ARGP_IN_ORDER */
1151 name_add_name (arg
, MAKE_INCL_OPTIONS (args
));
1152 args
->input_files
= true;
1156 set_subcommand_option (CAT_SUBCOMMAND
);
1162 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1163 && u
== (blocking_factor
= u
)
1164 && 0 < blocking_factor
1165 && u
== (record_size
= u
* BLOCKSIZE
) / BLOCKSIZE
))
1166 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1167 _("Invalid blocking factor")));
1172 /* Try to reblock input records. For reading 4.2BSD pipes. */
1174 /* It would surely make sense to exchange -B and -R, but it seems
1175 that -B has been used for a long while in Sun tar and most
1176 BSD-derived systems. This is a consequence of the block/record
1177 terminology confusion. */
1179 read_full_records_option
= true;
1183 set_subcommand_option (CREATE_SUBCOMMAND
);
1191 set_subcommand_option (DIFF_SUBCOMMAND
);
1195 if (archive_names
== allocated_archive_names
)
1196 archive_name_array
= x2nrealloc (archive_name_array
,
1197 &allocated_archive_names
,
1198 sizeof (archive_name_array
[0]));
1200 archive_name_array
[archive_names
++] = arg
;
1204 /* Since -F is only useful with -M, make it implied. Run this
1205 script at the end of each tape. */
1207 info_script_option
= arg
;
1208 multi_volume_option
= true;
1212 listed_incremental_option
= arg
;
1213 after_date_option
= true;
1217 /* We are making an incremental dump (FIXME: are we?); save
1218 directories at the beginning of the archive, and include in each
1219 directory its contents. */
1221 incremental_option
= true;
1225 /* Follow symbolic links. */
1226 dereference_option
= true;
1230 /* Ignore zero blocks (eofs). This can't be the default,
1231 because Unix tar writes two blocks of zeros, then pads out
1232 the record with garbage. */
1234 ignore_zeros_option
= true;
1239 _("Warning: the -I option is not supported;"
1240 " perhaps you meant -j or -T?")));
1244 set_use_compress_program_option ("bzip2");
1248 /* Don't replace existing files. */
1249 old_files_option
= KEEP_OLD_FILES
;
1253 starting_file_option
= true;
1257 case ONE_FILE_SYSTEM_OPTION
:
1258 /* When dumping directories, don't dump files/subdirectories
1259 that are on other filesystems. */
1260 one_file_system_option
= true;
1264 check_links_option
= 1;
1270 if (xstrtoumax (arg
, 0, 10, &u
, "") != LONGINT_OK
)
1271 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1272 _("Invalid tape length")));
1273 tape_length_option
= 1024 * (tarlong
) u
;
1274 multi_volume_option
= true;
1279 touch_option
= true;
1283 /* Make multivolume archive: when we can't write any more into
1284 the archive, re-open it, and continue writing. */
1286 multi_volume_option
= true;
1290 get_date_or_file (args
, "--mtime", arg
, &mtime_option
);
1291 set_mtime_option
= true;
1295 seekable_archive
= true;
1299 after_date_option
= true;
1302 case NEWER_MTIME_OPTION
:
1303 if (NEWER_OPTION_INITIALIZED (newer_mtime_option
))
1304 USAGE_ERROR ((0, 0, _("More than one threshold date")));
1305 get_date_or_file (args
,
1306 key
== NEWER_MTIME_OPTION
? "--newer-mtime"
1307 : "--after-date", arg
, &newer_mtime_option
);
1311 args
->o_option
= true;
1315 to_stdout_option
= true;
1319 same_permissions_option
= true;
1323 absolute_names_option
= true;
1327 set_subcommand_option (APPEND_SUBCOMMAND
);
1331 /* Print block numbers for debugging bad tar archives. */
1333 /* It would surely make sense to exchange -B and -R, but it seems
1334 that -B has been used for a long while in Sun tar and most
1335 BSD-derived systems. This is a consequence of the block/record
1336 terminology confusion. */
1338 block_number_option
= true;
1342 /* Names to extract are sorted. */
1344 same_order_option
= true;
1348 sparse_option
= true;
1351 case SPARSE_VERSION_OPTION
:
1352 sparse_option
= true;
1355 tar_sparse_major
= strtoul (arg
, &p
, 10);
1359 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1360 tar_sparse_minor
= strtoul (p
+ 1, &p
, 10);
1362 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1368 set_subcommand_option (LIST_SUBCOMMAND
);
1372 case TEST_LABEL_OPTION
:
1373 set_subcommand_option (LIST_SUBCOMMAND
);
1374 test_label_option
= true;
1378 update_argv (arg
, state
);
1379 /* Indicate we've been given -T option. This is for backward
1380 compatibility only, so that `tar cfT archive /dev/null will
1382 files_from_option
= true;
1386 set_subcommand_option (UPDATE_SUBCOMMAND
);
1390 old_files_option
= UNLINK_FIRST_OLD_FILES
;
1402 volume_label_option
= arg
;
1406 interactive_option
= true;
1410 verify_option
= true;
1414 set_subcommand_option (EXTRACT_SUBCOMMAND
);
1418 if (add_exclude_file (add_exclude
, excluded
, arg
,
1419 MAKE_EXCL_OPTIONS (args
), '\n')
1423 FATAL_ERROR ((0, e
, "%s", quotearg_colon (arg
)));
1428 set_use_compress_program_option ("gzip");
1432 set_use_compress_program_option ("compress");
1435 case ANCHORED_OPTION
:
1436 args
->matching_flags
|= EXCLUDE_ANCHORED
;
1439 case ATIME_PRESERVE_OPTION
:
1440 atime_preserve_option
=
1442 ? XARGMATCH ("--atime-preserve", arg
,
1443 atime_preserve_args
, atime_preserve_types
)
1444 : replace_atime_preserve
);
1445 if (! O_NOATIME
&& atime_preserve_option
== system_atime_preserve
)
1447 _("--atime-preserve='system' is not supported"
1448 " on this platform")));
1451 case CHECKPOINT_OPTION
:
1458 checkpoint_style
= checkpoint_dot
;
1461 checkpoint_option
= strtoul (arg
, &p
, 0);
1464 _("--checkpoint value is not an integer")));
1467 checkpoint_option
= 10;
1471 backup_option
= true;
1473 args
->version_control_string
= arg
;
1476 case DELAY_DIRECTORY_RESTORE_OPTION
:
1477 delay_directory_restore_option
= true;
1480 case NO_DELAY_DIRECTORY_RESTORE_OPTION
:
1481 delay_directory_restore_option
= false;
1485 set_subcommand_option (DELETE_SUBCOMMAND
);
1488 case EXCLUDE_OPTION
:
1489 add_exclude (excluded
, arg
, MAKE_EXCL_OPTIONS (args
));
1492 case EXCLUDE_CACHES_OPTION
:
1493 exclude_caches_option
= true;
1496 case FORCE_LOCAL_OPTION
:
1497 force_local_option
= true;
1501 set_archive_format (arg
);
1504 case INDEX_FILE_OPTION
:
1505 index_file_name
= arg
;
1508 case IGNORE_CASE_OPTION
:
1509 args
->matching_flags
|= FNM_CASEFOLD
;
1512 case IGNORE_COMMAND_ERROR_OPTION
:
1513 ignore_command_error_option
= true;
1516 case IGNORE_FAILED_READ_OPTION
:
1517 ignore_failed_read_option
= true;
1520 case KEEP_NEWER_FILES_OPTION
:
1521 old_files_option
= KEEP_NEWER_FILES
;
1525 if (! (strlen (arg
) < GNAME_FIELD_SIZE
1526 && gname_to_gid (arg
, &group_option
)))
1529 if (xstrtoumax (arg
, 0, 10, &g
, "") == LONGINT_OK
1533 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1534 _("%s: Invalid group")));
1539 mode_option
= mode_compile (arg
);
1541 FATAL_ERROR ((0, 0, _("Invalid mode given on option")));
1542 initial_umask
= umask (0);
1543 umask (initial_umask
);
1546 case NO_ANCHORED_OPTION
:
1547 args
->include_anchored
= 0; /* Clear the default for comman line args */
1548 args
->matching_flags
&= ~ EXCLUDE_ANCHORED
;
1551 case NO_IGNORE_CASE_OPTION
:
1552 args
->matching_flags
&= ~ FNM_CASEFOLD
;
1555 case NO_IGNORE_COMMAND_ERROR_OPTION
:
1556 ignore_command_error_option
= false;
1559 case NO_OVERWRITE_DIR_OPTION
:
1560 old_files_option
= NO_OVERWRITE_DIR_OLD_FILES
;
1563 case NO_QUOTE_CHARS_OPTION
:
1565 set_char_quoting (NULL
, *arg
, 0);
1568 case NO_WILDCARDS_OPTION
:
1569 args
->wildcards
= disable_wildcards
;
1572 case NO_WILDCARDS_MATCH_SLASH_OPTION
:
1573 args
->matching_flags
|= FNM_FILE_NAME
;
1577 filename_terminator
= '\0';
1580 case NUMERIC_OWNER_OPTION
:
1581 numeric_owner_option
= true;
1584 case OCCURRENCE_OPTION
:
1586 occurrence_option
= 1;
1590 if (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
)
1591 occurrence_option
= u
;
1593 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1594 _("Invalid number")));
1598 case OVERWRITE_DIR_OPTION
:
1599 old_files_option
= DEFAULT_OLD_FILES
;
1602 case OVERWRITE_OPTION
:
1603 old_files_option
= OVERWRITE_OLD_FILES
;
1607 if (! (strlen (arg
) < UNAME_FIELD_SIZE
1608 && uname_to_uid (arg
, &owner_option
)))
1611 if (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1615 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1616 _("Invalid owner")));
1620 case QUOTE_CHARS_OPTION
:
1622 set_char_quoting (NULL
, *arg
, 1);
1625 case QUOTING_STYLE_OPTION
:
1626 tar_set_quoting_style (arg
);
1630 args
->pax_option
= true;
1631 xheader_set_option (arg
);
1635 set_archive_format ("posix");
1638 case PRESERVE_OPTION
:
1639 /* FIXME: What it is good for? */
1640 same_permissions_option
= true;
1641 same_order_option
= true;
1644 case RECORD_SIZE_OPTION
:
1647 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1648 && u
== (size_t) u
))
1649 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1650 _("Invalid record size")));
1652 if (record_size
% BLOCKSIZE
!= 0)
1653 USAGE_ERROR ((0, 0, _("Record size must be a multiple of %d."),
1655 blocking_factor
= record_size
/ BLOCKSIZE
;
1659 case RECURSIVE_UNLINK_OPTION
:
1660 recursive_unlink_option
= true;
1663 case REMOVE_FILES_OPTION
:
1664 remove_files_option
= true;
1667 case RESTRICT_OPTION
:
1668 restrict_option
= true;
1671 case RMT_COMMAND_OPTION
:
1675 case RSH_COMMAND_OPTION
:
1676 rsh_command_option
= arg
;
1679 case SHOW_DEFAULTS_OPTION
:
1680 show_default_settings (stdout
);
1684 case STRIP_COMPONENTS_OPTION
:
1687 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1688 && u
== (size_t) u
))
1689 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1690 _("Invalid number of elements")));
1691 strip_name_components
= u
;
1695 case SHOW_OMITTED_DIRS_OPTION
:
1696 show_omitted_dirs_option
= true;
1699 case SHOW_TRANSFORMED_NAMES_OPTION
:
1700 show_transformed_names_option
= true;
1704 backup_option
= true;
1705 args
->backup_suffix_string
= arg
;
1708 case TO_COMMAND_OPTION
:
1709 if (to_command_option
)
1710 USAGE_ERROR ((0, 0, _("Only one --to-command option allowed")));
1711 to_command_option
= arg
;
1716 set_stat_signal (arg
);
1718 totals_option
= true;
1721 case TRANSFORM_OPTION
:
1722 set_transform_expr (arg
);
1725 case USE_COMPRESS_PROGRAM_OPTION
:
1726 set_use_compress_program_option (arg
);
1729 case VOLNO_FILE_OPTION
:
1730 volno_file_option
= arg
;
1733 case WILDCARDS_OPTION
:
1734 args
->wildcards
= enable_wildcards
;
1737 case WILDCARDS_MATCH_SLASH_OPTION
:
1738 args
->matching_flags
&= ~ FNM_FILE_NAME
;
1741 case NO_RECURSION_OPTION
:
1742 recursion_option
= 0;
1745 case NO_SAME_OWNER_OPTION
:
1746 same_owner_option
= -1;
1749 case NO_SAME_PERMISSIONS_OPTION
:
1750 same_permissions_option
= -1;
1753 case RECURSION_OPTION
:
1754 recursion_option
= FNM_LEADING_DIR
;
1757 case SAME_OWNER_OPTION
:
1758 same_owner_option
= 1;
1761 case UNQUOTE_OPTION
:
1762 unquote_option
= true;
1765 case NO_UNQUOTE_OPTION
:
1766 unquote_option
= false;
1778 #ifdef DEVICE_PREFIX
1780 int device
= key
- '0';
1782 static char buf
[sizeof DEVICE_PREFIX
+ 10];
1786 argp_error (state
, _("Malformed density argument: %s"), quote (arg
));
1788 strcpy (buf
, DEVICE_PREFIX
);
1789 cursor
= buf
+ strlen (buf
);
1791 #ifdef DENSITY_LETTER
1793 sprintf (cursor
, "%d%c", device
, arg
[0]);
1795 #else /* not DENSITY_LETTER */
1800 device
+= LOW_DENSITY_NUM
;
1804 device
+= MID_DENSITY_NUM
;
1808 device
+= HIGH_DENSITY_NUM
;
1812 argp_error (state
, _("Unknown density: `%c'"), arg
[0]);
1814 sprintf (cursor
, "%d", device
);
1816 #endif /* not DENSITY_LETTER */
1818 if (archive_names
== allocated_archive_names
)
1819 archive_name_array
= x2nrealloc (archive_name_array
,
1820 &allocated_archive_names
,
1821 sizeof (archive_name_array
[0]));
1822 archive_name_array
[archive_names
++] = xstrdup (buf
);
1826 #else /* not DEVICE_PREFIX */
1829 _("Options `-[0-7][lmh]' not supported by *this* tar"));
1831 #endif /* not DEVICE_PREFIX */
1839 argp_state_help (state
, state
->out_stream
, ARGP_HELP_USAGE
);
1843 case VERSION_OPTION
:
1844 version_etc (state
->out_stream
, "tar", PACKAGE_NAME
, VERSION
,
1845 "John Gilmore", "Jay Fenlason", (char *) NULL
);
1850 _argp_hang
= atoi (arg
? arg
: "3600");
1851 while (_argp_hang
-- > 0)
1856 return ARGP_ERR_UNKNOWN
;
1861 static struct argp argp
= {
1871 /* Initialize the argp documentation. gettext 0.15 dislikes doc
1872 strings containing '\v', so insert '\v' after translation. */
1875 initialize_argp_doc (void)
1877 char const *xdoc0
= _(doc0
); size_t xlen0
= strlen (xdoc0
);
1878 char const *xdoc1
= _(doc1
); size_t xlen1
= strlen (xdoc1
);
1879 char *doc
= xmalloc (xlen0
+ 1 + xlen1
+ 1);
1880 memcpy (doc
, xdoc0
, xlen0
);
1882 memcpy (doc
+ xlen0
+ 1, doc1
, xlen1
+ 1);;
1889 argp_help (&argp
, stderr
, ARGP_HELP_SEE
, (char*) program_name
);
1894 /* Parse the options for tar. */
1896 static struct argp_option
*
1897 find_argp_option (struct argp_option
*options
, int letter
)
1900 !(options
->name
== NULL
1901 && options
->key
== 0
1902 && options
->arg
== 0
1903 && options
->flags
== 0
1904 && options
->doc
== NULL
); options
++)
1905 if (options
->key
== letter
)
1911 decode_options (int argc
, char **argv
)
1914 struct tar_args args
;
1916 /* Set some default option values. */
1917 args
.textual_date
= NULL
;
1918 args
.wildcards
= default_wildcards
;
1919 args
.matching_flags
= 0;
1920 args
.include_anchored
= EXCLUDE_ANCHORED
;
1921 args
.o_option
= false;
1922 args
.pax_option
= false;
1923 args
.backup_suffix_string
= getenv ("SIMPLE_BACKUP_SUFFIX");
1924 args
.version_control_string
= 0;
1925 args
.input_files
= false;
1927 subcommand_option
= UNKNOWN_SUBCOMMAND
;
1928 archive_format
= DEFAULT_FORMAT
;
1929 blocking_factor
= DEFAULT_BLOCKING
;
1930 record_size
= DEFAULT_BLOCKING
* BLOCKSIZE
;
1931 excluded
= new_exclude ();
1932 newer_mtime_option
.tv_sec
= TYPE_MINIMUM (time_t);
1933 newer_mtime_option
.tv_nsec
= -1;
1934 recursion_option
= FNM_LEADING_DIR
;
1935 unquote_option
= true;
1936 tar_sparse_major
= 1;
1937 tar_sparse_minor
= 0;
1942 initialize_argp_doc ();
1944 /* Convert old-style tar call by exploding option element and rearranging
1945 options accordingly. */
1947 if (argc
> 1 && argv
[1][0] != '-')
1949 int new_argc
; /* argc value for rearranged arguments */
1950 char **new_argv
; /* argv value for rearranged arguments */
1951 char *const *in
; /* cursor into original argv */
1952 char **out
; /* cursor into rearranged argv */
1953 const char *letter
; /* cursor into old option letters */
1954 char buffer
[3]; /* constructed option buffer */
1956 /* Initialize a constructed option. */
1961 /* Allocate a new argument array, and copy program name in it. */
1963 new_argc
= argc
- 1 + strlen (argv
[1]);
1964 new_argv
= xmalloc ((new_argc
+ 1) * sizeof (char *));
1969 /* Copy each old letter option as a separate option, and have the
1970 corresponding argument moved next to it. */
1972 for (letter
= *in
++; *letter
; letter
++)
1974 struct argp_option
*opt
;
1976 buffer
[1] = *letter
;
1977 *out
++ = xstrdup (buffer
);
1978 opt
= find_argp_option (options
, *letter
);
1979 if (opt
&& opt
->arg
)
1981 if (in
< argv
+ argc
)
1984 USAGE_ERROR ((0, 0, _("Old option `%c' requires an argument."),
1989 /* Copy all remaining options. */
1991 while (in
< argv
+ argc
)
1995 /* Replace the old option list by the new one. */
2001 /* Parse all options and non-options as they appear. */
2003 prepend_default_options (getenv ("TAR_OPTIONS"), &argc
, &argv
);
2005 if (argp_parse (&argp
, argc
, argv
, ARGP_IN_ORDER
|ARGP_NO_HELP
,
2007 exit (TAREXIT_FAILURE
);
2010 /* Special handling for 'o' option:
2012 GNU tar used to say "output old format".
2013 UNIX98 tar says don't chown files after extracting (we use
2014 "--no-same-owner" for this).
2016 The old GNU tar semantics is retained when used with --create
2017 option, otherwise UNIX98 semantics is assumed */
2021 if (subcommand_option
== CREATE_SUBCOMMAND
)
2023 /* GNU Tar <= 1.13 compatibility */
2024 set_archive_format ("v7");
2028 /* UNIX98 compatibility */
2029 same_owner_option
= -1;
2033 /* Handle operands after any "--" argument. */
2034 for (; index
< argc
; index
++)
2036 name_add_name (argv
[index
], MAKE_INCL_OPTIONS (&args
));
2037 args
.input_files
= true;
2040 /* Warn about implicit use of the wildcards in command line arguments.
2042 warn_regex_usage
= args
.wildcards
== default_wildcards
;
2044 /* Derive option values and check option consistency. */
2046 if (archive_format
== DEFAULT_FORMAT
)
2048 if (args
.pax_option
)
2049 archive_format
= POSIX_FORMAT
;
2051 archive_format
= DEFAULT_ARCHIVE_FORMAT
;
2054 if ((volume_label_option
&& subcommand_option
== CREATE_SUBCOMMAND
)
2055 || incremental_option
2056 || multi_volume_option
2058 assert_format (FORMAT_MASK (OLDGNU_FORMAT
)
2059 | FORMAT_MASK (GNU_FORMAT
)
2060 | FORMAT_MASK (POSIX_FORMAT
));
2062 if (occurrence_option
)
2064 if (!args
.input_files
)
2066 _("--occurrence is meaningless without a file list")));
2067 if (subcommand_option
!= DELETE_SUBCOMMAND
2068 && subcommand_option
!= DIFF_SUBCOMMAND
2069 && subcommand_option
!= EXTRACT_SUBCOMMAND
2070 && subcommand_option
!= LIST_SUBCOMMAND
)
2072 _("--occurrence cannot be used in the requested operation mode")));
2075 if (seekable_archive
&& subcommand_option
== DELETE_SUBCOMMAND
)
2077 /* The current code in delete.c is based on the assumption that
2078 skip_member() reads all data from the archive. So, we should
2079 make sure it won't use seeks. On the other hand, the same code
2080 depends on the ability to backspace a record in the archive,
2081 so setting seekable_archive to false is technically incorrect.
2082 However, it is tested only in skip_member(), so it's not a
2084 seekable_archive
= false;
2087 if (archive_names
== 0)
2089 /* If no archive file name given, try TAPE from the environment, or
2090 else, DEFAULT_ARCHIVE from the configuration process. */
2093 archive_name_array
[0] = getenv ("TAPE");
2094 if (! archive_name_array
[0])
2095 archive_name_array
[0] = DEFAULT_ARCHIVE
;
2098 /* Allow multiple archives only with `-M'. */
2100 if (archive_names
> 1 && !multi_volume_option
)
2102 _("Multiple archive files require `-M' option")));
2104 if (listed_incremental_option
2105 && NEWER_OPTION_INITIALIZED (newer_mtime_option
))
2107 _("Cannot combine --listed-incremental with --newer")));
2109 if (volume_label_option
)
2111 if (archive_format
== GNU_FORMAT
|| archive_format
== OLDGNU_FORMAT
)
2113 size_t volume_label_max_len
=
2114 (sizeof current_header
->header
.name
2115 - 1 /* for trailing '\0' */
2116 - (multi_volume_option
2117 ? (sizeof " Volume "
2118 - 1 /* for null at end of " Volume " */
2119 + INT_STRLEN_BOUND (int) /* for volume number */
2120 - 1 /* for sign, as 0 <= volno */)
2122 if (volume_label_max_len
< strlen (volume_label_option
))
2124 ngettext ("%s: Volume label is too long (limit is %lu byte)",
2125 "%s: Volume label is too long (limit is %lu bytes)",
2126 volume_label_max_len
),
2127 quotearg_colon (volume_label_option
),
2128 (unsigned long) volume_label_max_len
));
2131 Label length in PAX format is limited by the volume size. */
2136 if (multi_volume_option
)
2137 USAGE_ERROR ((0, 0, _("Cannot verify multi-volume archives")));
2138 if (use_compress_program_option
)
2139 USAGE_ERROR ((0, 0, _("Cannot verify compressed archives")));
2142 if (use_compress_program_option
)
2144 if (multi_volume_option
)
2145 USAGE_ERROR ((0, 0, _("Cannot use multi-volume compressed archives")));
2146 if (subcommand_option
== UPDATE_SUBCOMMAND
2147 || subcommand_option
== APPEND_SUBCOMMAND
2148 || subcommand_option
== DELETE_SUBCOMMAND
)
2149 USAGE_ERROR ((0, 0, _("Cannot update compressed archives")));
2150 if (subcommand_option
== CAT_SUBCOMMAND
)
2151 USAGE_ERROR ((0, 0, _("Cannot concatenate compressed archives")));
2154 /* It is no harm to use --pax-option on non-pax archives in archive
2155 reading mode. It may even be useful, since it allows to override
2156 file attributes from tar headers. Therefore I allow such usage.
2159 && archive_format
!= POSIX_FORMAT
2160 && (subcommand_option
!= EXTRACT_SUBCOMMAND
2161 || subcommand_option
!= DIFF_SUBCOMMAND
2162 || subcommand_option
!= LIST_SUBCOMMAND
))
2163 USAGE_ERROR ((0, 0, _("--pax-option can be used only on POSIX archives")));
2165 /* If ready to unlink hierarchies, so we are for simpler files. */
2166 if (recursive_unlink_option
)
2167 old_files_option
= UNLINK_FIRST_OLD_FILES
;
2170 if (test_label_option
)
2172 /* --test-label is silent if the user has specified the label name to
2174 if (!args
.input_files
)
2177 else if (utc_option
)
2180 /* Forbid using -c with no input files whatsoever. Check that `-f -',
2181 explicit or implied, is used correctly. */
2183 switch (subcommand_option
)
2185 case CREATE_SUBCOMMAND
:
2186 if (!args
.input_files
&& !files_from_option
)
2188 _("Cowardly refusing to create an empty archive")));
2191 case EXTRACT_SUBCOMMAND
:
2192 case LIST_SUBCOMMAND
:
2193 case DIFF_SUBCOMMAND
:
2194 for (archive_name_cursor
= archive_name_array
;
2195 archive_name_cursor
< archive_name_array
+ archive_names
;
2196 archive_name_cursor
++)
2197 if (!strcmp (*archive_name_cursor
, "-"))
2198 request_stdin ("-f");
2201 case CAT_SUBCOMMAND
:
2202 case UPDATE_SUBCOMMAND
:
2203 case APPEND_SUBCOMMAND
:
2204 for (archive_name_cursor
= archive_name_array
;
2205 archive_name_cursor
< archive_name_array
+ archive_names
;
2206 archive_name_cursor
++)
2207 if (!strcmp (*archive_name_cursor
, "-"))
2209 _("Options `-Aru' are incompatible with `-f -'")));
2215 /* Initialize stdlis */
2216 if (index_file_name
)
2218 stdlis
= fopen (index_file_name
, "w");
2220 open_error (index_file_name
);
2223 stdlis
= to_stdout_option
? stderr
: stdout
;
2225 archive_name_cursor
= archive_name_array
;
2227 /* Prepare for generating backup names. */
2229 if (args
.backup_suffix_string
)
2230 simple_backup_suffix
= xstrdup (args
.backup_suffix_string
);
2234 backup_type
= xget_version ("--backup", args
.version_control_string
);
2235 /* No backup is needed either if explicitely disabled or if
2236 the extracted files are not being written to disk. */
2237 if (backup_type
== no_backups
|| EXTRACT_OVER_PIPE
)
2238 backup_option
= false;
2242 report_textual_dates (&args
);
2248 /* Main routine for tar. */
2250 main (int argc
, char **argv
)
2253 program_name
= argv
[0];
2255 setlocale (LC_ALL
, "");
2256 bindtextdomain (PACKAGE
, LOCALEDIR
);
2257 textdomain (PACKAGE
);
2259 exit_failure
= TAREXIT_FAILURE
;
2260 exit_status
= TAREXIT_SUCCESS
;
2261 filename_terminator
= '\n';
2262 set_quoting_style (0, DEFAULT_QUOTING_STYLE
);
2264 /* Make sure we have first three descriptors available */
2267 /* Close all inherited open descriptors, except for the first three */
2270 /* Pre-allocate a few structures. */
2272 allocated_archive_names
= 10;
2273 archive_name_array
=
2274 xmalloc (sizeof (const char *) * allocated_archive_names
);
2277 obstack_init (&argv_stk
);
2280 /* System V fork+wait does not work if SIGCHLD is ignored. */
2281 signal (SIGCHLD
, SIG_DFL
);
2284 /* Decode options. */
2286 decode_options (argc
, argv
);
2289 /* Main command execution. */
2291 if (volno_file_option
)
2292 init_volume_number ();
2294 switch (subcommand_option
)
2296 case UNKNOWN_SUBCOMMAND
:
2298 _("You must specify one of the `-Acdtrux' options")));
2300 case CAT_SUBCOMMAND
:
2301 case UPDATE_SUBCOMMAND
:
2302 case APPEND_SUBCOMMAND
:
2306 case DELETE_SUBCOMMAND
:
2307 delete_archive_members ();
2310 case CREATE_SUBCOMMAND
:
2314 case EXTRACT_SUBCOMMAND
:
2316 read_and (extract_archive
);
2318 /* FIXME: should extract_finish () even if an ordinary signal is
2324 case LIST_SUBCOMMAND
:
2325 read_and (list_archive
);
2328 case DIFF_SUBCOMMAND
:
2330 read_and (diff_archive
);
2335 print_total_stats ();
2337 if (check_links_option
)
2340 if (volno_file_option
)
2341 closeout_volume_number ();
2343 /* Dispose of allocated memory, and return. */
2345 free (archive_name_array
);
2348 if (stdlis
== stdout
)
2351 if (exit_status
== TAREXIT_FAILURE
)
2352 error (0, 0, _("Error exit delayed from previous errors"));
2353 if (ferror (stderr
) || fclose (stderr
) != 0)
2354 exit_status
= TAREXIT_FAILURE
;
2359 tar_stat_init (struct tar_stat_info
*st
)
2361 memset (st
, 0, sizeof (*st
));
2365 tar_stat_destroy (struct tar_stat_info
*st
)
2367 free (st
->orig_file_name
);
2368 free (st
->file_name
);
2369 free (st
->link_name
);
2372 free (st
->sparse_map
);
2374 memset (st
, 0, sizeof (*st
));
2377 /* Format mask for all available formats that support nanosecond
2378 timestamp resolution. */
2379 #define NS_PRECISION_FORMAT_MASK FORMAT_MASK (POSIX_FORMAT)
2381 /* Same as timespec_cmp, but ignore nanoseconds if current archive
2382 format does not provide sufficient resolution. */
2384 tar_timespec_cmp (struct timespec a
, struct timespec b
)
2386 if (!(FORMAT_MASK (current_format
) & NS_PRECISION_FORMAT_MASK
))
2387 a
.tv_nsec
= b
.tv_nsec
= 0;
2388 return timespec_cmp (a
, b
);