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. */
44 #include <configmake.h>
48 #include <rmt-command.h>
51 #include <version-etc.h>
55 /* Local declarations. */
57 #ifndef DEFAULT_ARCHIVE_FORMAT
58 # define DEFAULT_ARCHIVE_FORMAT GNU_FORMAT
61 #ifndef DEFAULT_ARCHIVE
62 # define DEFAULT_ARCHIVE "tar.out"
65 #ifndef DEFAULT_BLOCKING
66 # define DEFAULT_BLOCKING 20
72 /* Name of option using stdin. */
73 static const char *stdin_used_by
;
75 /* Doesn't return if stdin already requested. */
77 request_stdin (const char *option
)
80 USAGE_ERROR ((0, 0, _("Options `-%s' and `-%s' both want standard input"),
81 stdin_used_by
, option
));
83 stdin_used_by
= option
;
86 extern int rpmatch (char const *response
);
88 /* Returns true if and only if the user typed an affirmative response. */
90 confirm (const char *message_action
, const char *message_name
)
92 static FILE *confirm_file
;
93 static int confirm_file_EOF
;
98 if (archive
== 0 || stdin_used_by
)
100 confirm_file
= fopen (TTY_NAME
, "r");
102 open_fatal (TTY_NAME
);
106 request_stdin ("-w");
107 confirm_file
= stdin
;
111 fprintf (stdlis
, "%s %s?", message_action
, quote (message_name
));
114 if (!confirm_file_EOF
)
116 char *response
= NULL
;
117 size_t response_size
= 0;
118 if (getline (&response
, &response_size
, confirm_file
) < 0)
119 confirm_file_EOF
= 1;
121 status
= rpmatch (response
) > 0;
125 if (confirm_file_EOF
)
127 fputc ('\n', stdlis
);
134 static struct fmttab
{
136 enum archive_format fmt
;
139 { "oldgnu", OLDGNU_FORMAT
},
140 { "ustar", USTAR_FORMAT
},
141 { "posix", POSIX_FORMAT
},
142 #if 0 /* not fully supported yet */
143 { "star", STAR_FORMAT
},
145 { "gnu", GNU_FORMAT
},
146 { "pax", POSIX_FORMAT
}, /* An alias for posix */
151 set_archive_format (char const *name
)
153 struct fmttab
const *p
;
155 for (p
= fmttab
; strcmp (p
->name
, name
) != 0; )
157 USAGE_ERROR ((0, 0, _("%s: Invalid archive format"),
158 quotearg_colon (name
)));
160 archive_format
= p
->fmt
;
164 archive_format_string (enum archive_format fmt
)
166 struct fmttab
const *p
;
168 for (p
= fmttab
; p
->name
; p
++)
174 #define FORMAT_MASK(n) (1<<(n))
177 assert_format(unsigned fmt_mask
)
179 if ((FORMAT_MASK (archive_format
) & fmt_mask
) == 0)
181 _("GNU features wanted on incompatible archive format")));
185 subcommand_string (enum subcommand c
)
189 case UNKNOWN_SUBCOMMAND
:
192 case APPEND_SUBCOMMAND
:
198 case CREATE_SUBCOMMAND
:
201 case DELETE_SUBCOMMAND
:
204 case DIFF_SUBCOMMAND
:
207 case EXTRACT_SUBCOMMAND
:
210 case LIST_SUBCOMMAND
:
213 case UPDATE_SUBCOMMAND
:
222 tar_list_quoting_styles (argp_fmtstream_t fs
, char *prefix
)
226 for (i
= 0; quoting_style_args
[i
]; i
++)
227 argp_fmtstream_printf (fs
, "%s%s\n", prefix
, quoting_style_args
[i
]);
231 tar_set_quoting_style (char *arg
)
235 for (i
= 0; quoting_style_args
[i
]; i
++)
236 if (strcmp (arg
, quoting_style_args
[i
]) == 0)
238 set_quoting_style (NULL
, i
);
242 _("Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."), arg
, program_invocation_short_name
));
250 ANCHORED_OPTION
= CHAR_MAX
+ 1,
251 ATIME_PRESERVE_OPTION
,
254 DELAY_DIRECTORY_RESTORE_OPTION
,
256 EXCLUDE_CACHES_OPTION
,
263 IGNORE_COMMAND_ERROR_OPTION
,
264 IGNORE_FAILED_READ_OPTION
,
266 KEEP_NEWER_FILES_OPTION
,
271 NO_DELAY_DIRECTORY_RESTORE_OPTION
,
272 NO_IGNORE_CASE_OPTION
,
273 NO_IGNORE_COMMAND_ERROR_OPTION
,
274 NO_OVERWRITE_DIR_OPTION
,
275 NO_QUOTE_CHARS_OPTION
,
277 NO_SAME_OWNER_OPTION
,
278 NO_SAME_PERMISSIONS_OPTION
,
280 NO_WILDCARDS_MATCH_SLASH_OPTION
,
283 NUMERIC_OWNER_OPTION
,
286 ONE_FILE_SYSTEM_OPTION
,
287 OVERWRITE_DIR_OPTION
,
294 QUOTING_STYLE_OPTION
,
297 RECURSIVE_UNLINK_OPTION
,
303 SHOW_DEFAULTS_OPTION
,
304 SHOW_OMITTED_DIRS_OPTION
,
305 SHOW_TRANSFORMED_NAMES_OPTION
,
306 SPARSE_VERSION_OPTION
,
307 STRIP_COMPONENTS_OPTION
,
315 USE_COMPRESS_PROGRAM_OPTION
,
319 WILDCARDS_MATCH_SLASH_OPTION
,
323 const char *argp_program_version
= "tar (" PACKAGE_NAME
") " VERSION
;
324 const char *argp_program_bug_address
= "<" PACKAGE_BUGREPORT
">";
325 static char const doc
[] = N_("\
326 GNU `tar' saves many files together into a single tape or disk archive, \
327 and can restore individual files from the archive.\n\
330 tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n\
331 tar -tvf archive.tar # List all files in archive.tar verbosely.\n\
332 tar -xf archive.tar # Extract all files from archive.tar.\n")
334 N_("The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
335 The version control may be set with --backup or VERSION_CONTROL, values are:\n\n\
336 none, off never make backups\n\
337 t, numbered make numbered backups\n\
338 nil, existing numbered if numbered backups exist, simple otherwise\n\
339 never, simple always make simple backups\n");
344 Available option letters are DEIJQY and aeqy. Consider the following
347 [For Solaris tar compatibility =/= Is it important at all?]
348 e exit immediately with a nonzero exit status if unexpected errors occur
349 E use extended headers (--format=posix)
351 [q alias for --occurrence=1 =/= this would better be used for quiet?]
352 [I same as T =/= will harm star compatibility]
354 y per-file gzip compression
355 Y per-block gzip compression */
357 static struct argp_option options
[] = {
360 N_("Main operation mode:"), GRID
},
363 N_("list the contents of an archive"), GRID
+1 },
364 {"extract", 'x', 0, 0,
365 N_("extract files from an archive"), GRID
+1 },
366 {"get", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
367 {"create", 'c', 0, 0,
368 N_("create a new archive"), GRID
+1 },
370 N_("find differences between archive and file system"), GRID
+1 },
371 {"compare", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
372 {"append", 'r', 0, 0,
373 N_("append files to the end of an archive"), GRID
+1 },
374 {"update", 'u', 0, 0,
375 N_("only append files newer than copy in archive"), GRID
+1 },
376 {"catenate", 'A', 0, 0,
377 N_("append tar files to an archive"), GRID
+1 },
378 {"concatenate", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
379 {"delete", DELETE_OPTION
, 0, 0,
380 N_("delete from the archive (not on mag tapes!)"), GRID
+1 },
381 {"test-label", TEST_LABEL_OPTION
, NULL
, 0,
382 N_("test the archive volume label and exit"), GRID
+1 },
387 N_("Operation modifiers:"), GRID
},
389 {"sparse", 'S', 0, 0,
390 N_("handle sparse files efficiently"), GRID
+1 },
391 {"sparse-version", SPARSE_VERSION_OPTION
, N_("MAJOR[.MINOR]"), 0,
392 N_("set version of the sparse format to use (implies --sparse)"), GRID
+1},
393 {"incremental", 'G', 0, 0,
394 N_("handle old GNU-format incremental backup"), GRID
+1 },
395 {"listed-incremental", 'g', N_("FILE"), 0,
396 N_("handle new GNU-format incremental backup"), GRID
+1 },
397 {"ignore-failed-read", IGNORE_FAILED_READ_OPTION
, 0, 0,
398 N_("do not exit with nonzero on unreadable files"), GRID
+1 },
399 {"occurrence", OCCURRENCE_OPTION
, N_("NUMBER"), OPTION_ARG_OPTIONAL
,
400 N_("process only the NUMBERth occurrence of each file in the archive;"
401 " this option is valid only in conjunction with one of the subcommands"
402 " --delete, --diff, --extract or --list and when a list of files"
403 " is given either on the command line or via the -T option;"
404 " NUMBER defaults to 1"), GRID
+1 },
405 {"seek", 'n', NULL
, 0,
406 N_("archive is seekable"), GRID
+1 },
411 N_("Overwrite control:"), GRID
},
413 {"verify", 'W', 0, 0,
414 N_("attempt to verify the archive after writing it"), GRID
+1 },
415 {"remove-files", REMOVE_FILES_OPTION
, 0, 0,
416 N_("remove files after adding them to the archive"), GRID
+1 },
417 {"keep-old-files", 'k', 0, 0,
418 N_("don't replace existing files when extracting"), GRID
+1 },
419 {"keep-newer-files", KEEP_NEWER_FILES_OPTION
, 0, 0,
420 N_("don't replace existing files that are newer than their archive copies"), GRID
+1 },
421 {"overwrite", OVERWRITE_OPTION
, 0, 0,
422 N_("overwrite existing files when extracting"), GRID
+1 },
423 {"unlink-first", 'U', 0, 0,
424 N_("remove each file prior to extracting over it"), GRID
+1 },
425 {"recursive-unlink", RECURSIVE_UNLINK_OPTION
, 0, 0,
426 N_("empty hierarchies prior to extracting directory"), GRID
+1 },
427 {"no-overwrite-dir", NO_OVERWRITE_DIR_OPTION
, 0, 0,
428 N_("preserve metadata of existing directories"), GRID
+1 },
429 {"overwrite-dir", OVERWRITE_DIR_OPTION
, 0, 0,
430 N_("overwrite metadata of existing directories when extracting (default)"),
436 N_("Select output stream:"), GRID
},
438 {"to-stdout", 'O', 0, 0,
439 N_("extract files to standard output"), GRID
+1 },
440 {"to-command", TO_COMMAND_OPTION
, N_("COMMAND"), 0,
441 N_("pipe extracted files to another program"), GRID
+1 },
442 {"ignore-command-error", IGNORE_COMMAND_ERROR_OPTION
, 0, 0,
443 N_("ignore exit codes of children"), GRID
+1 },
444 {"no-ignore-command-error", NO_IGNORE_COMMAND_ERROR_OPTION
, 0, 0,
445 N_("treat non-zero exit codes of children as error"), GRID
+1 },
450 N_("Handling of file attributes:"), GRID
},
452 {"owner", OWNER_OPTION
, N_("NAME"), 0,
453 N_("force NAME as owner for added files"), GRID
+1 },
454 {"group", GROUP_OPTION
, N_("NAME"), 0,
455 N_("force NAME as group for added files"), GRID
+1 },
456 {"mtime", MTIME_OPTION
, N_("DATE-OR-FILE"), 0,
457 N_("set mtime for added files from DATE-OR-FILE"), GRID
+1 },
458 {"mode", MODE_OPTION
, N_("CHANGES"), 0,
459 N_("force (symbolic) mode CHANGES for added files"), GRID
+1 },
460 {"atime-preserve", ATIME_PRESERVE_OPTION
,
461 N_("METHOD"), OPTION_ARG_OPTIONAL
,
462 N_("preserve access times on dumped files, either by restoring the times"
463 " after reading (METHOD='replace'; default) or by not setting the times"
464 " in the first place (METHOD='system')"), GRID
+1 },
466 N_("don't extract file modified time"), GRID
+1 },
467 {"same-owner", SAME_OWNER_OPTION
, 0, 0,
468 N_("try extracting files with the same ownership"), GRID
+1 },
469 {"no-same-owner", NO_SAME_OWNER_OPTION
, 0, 0,
470 N_("extract files as yourself"), GRID
+1 },
471 {"numeric-owner", NUMERIC_OWNER_OPTION
, 0, 0,
472 N_("always use numbers for user/group names"), GRID
+1 },
473 {"preserve-permissions", 'p', 0, 0,
474 N_("extract information about file permissions (default for superuser)"),
476 {"same-permissions", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
477 {"no-same-permissions", NO_SAME_PERMISSIONS_OPTION
, 0, 0,
478 N_("apply the user's umask when extracting permissions from the archive (default for ordinary users)"), GRID
+1 },
479 {"preserve-order", 's', 0, 0,
480 N_("sort names to extract to match archive"), GRID
+1 },
481 {"same-order", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
482 {"preserve", PRESERVE_OPTION
, 0, 0,
483 N_("same as both -p and -s"), GRID
+1 },
484 {"delay-directory-restore", DELAY_DIRECTORY_RESTORE_OPTION
, 0, 0,
485 N_("delay setting modification times and permissions of extracted"
486 " directories until the end of extraction"), GRID
+1 },
487 {"no-delay-directory-restore", NO_DELAY_DIRECTORY_RESTORE_OPTION
, 0, 0,
488 N_("cancel the effect of --delay-directory-restore option"), GRID
+1 },
493 N_("Device selection and switching:"), GRID
},
495 {"file", 'f', N_("ARCHIVE"), 0,
496 N_("use archive file or device ARCHIVE"), GRID
+1 },
497 {"force-local", FORCE_LOCAL_OPTION
, 0, 0,
498 N_("archive file is local even if it has a colon"), GRID
+1 },
499 {"rmt-command", RMT_COMMAND_OPTION
, N_("COMMAND"), 0,
500 N_("use given rmt COMMAND instead of rmt"), GRID
+1 },
501 {"rsh-command", RSH_COMMAND_OPTION
, N_("COMMAND"), 0,
502 N_("use remote COMMAND instead of rsh"), GRID
+1 },
504 {"-[0-7][lmh]", 0, NULL
, OPTION_DOC
, /* It is OK, since `name' will never be
506 N_("specify drive and density"), GRID
+1 },
508 {NULL
, '0', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
509 {NULL
, '1', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
510 {NULL
, '2', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
511 {NULL
, '3', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
512 {NULL
, '4', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
513 {NULL
, '5', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
514 {NULL
, '6', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
515 {NULL
, '7', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
516 {NULL
, '8', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
517 {NULL
, '9', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
519 {"multi-volume", 'M', 0, 0,
520 N_("create/list/extract multi-volume archive"), GRID
+1 },
521 {"tape-length", 'L', N_("NUMBER"), 0,
522 N_("change tape after writing NUMBER x 1024 bytes"), GRID
+1 },
523 {"info-script", 'F', N_("NAME"), 0,
524 N_("run script at end of each tape (implies -M)"), GRID
+1 },
525 {"new-volume-script", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
526 {"volno-file", VOLNO_FILE_OPTION
, N_("FILE"), 0,
527 N_("use/update the volume number in FILE"), GRID
+1 },
532 N_("Device blocking:"), GRID
},
534 {"blocking-factor", 'b', N_("BLOCKS"), 0,
535 N_("BLOCKS x 512 bytes per record"), GRID
+1 },
536 {"record-size", RECORD_SIZE_OPTION
, N_("NUMBER"), 0,
537 N_("NUMBER of bytes per record, multiple of 512"), GRID
+1 },
538 {"ignore-zeros", 'i', 0, 0,
539 N_("ignore zeroed blocks in archive (means EOF)"), GRID
+1 },
540 {"read-full-records", 'B', 0, 0,
541 N_("reblock as we read (for 4.2BSD pipes)"), GRID
+1 },
546 N_("Archive format selection:"), GRID
},
548 {"format", 'H', N_("FORMAT"), 0,
549 N_("create archive of the given format"), GRID
+1 },
551 {NULL
, 0, NULL
, 0, N_("FORMAT is one of the following:"), GRID
+2 },
552 {" v7", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("old V7 tar format"),
554 {" oldgnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
555 N_("GNU format as per tar <= 1.12"), GRID
+3 },
556 {" gnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
557 N_("GNU tar 1.13.x format"), GRID
+3 },
558 {" ustar", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
559 N_("POSIX 1003.1-1988 (ustar) format"), GRID
+3 },
560 {" pax", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
561 N_("POSIX 1003.1-2001 (pax) format"), GRID
+3 },
562 {" posix", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("same as pax"), GRID
+3 },
564 {"old-archive", OLD_ARCHIVE_OPTION
, 0, 0, /* FIXME */
565 N_("same as --format=v7"), GRID
+8 },
566 {"portability", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
567 {"posix", POSIX_OPTION
, 0, 0,
568 N_("same as --format=posix"), GRID
+8 },
569 {"pax-option", PAX_OPTION
, N_("keyword[[:]=value][,keyword[[:]=value]]..."), 0,
570 N_("control pax keywords"), GRID
+8 },
571 {"label", 'V', N_("TEXT"), 0,
572 N_("create archive with volume name TEXT; at list/extract time, use TEXT as a globbing pattern for volume name"), GRID
+8 },
574 N_("filter the archive through bzip2"), GRID
+8 },
576 N_("filter the archive through gzip"), GRID
+8 },
577 {"gunzip", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
578 {"ungzip", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
579 {"compress", 'Z', 0, 0,
580 N_("filter the archive through compress"), GRID
+8 },
581 {"uncompress", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
582 {"use-compress-program", USE_COMPRESS_PROGRAM_OPTION
, N_("PROG"), 0,
583 N_("filter through PROG (must accept -d)"), GRID
+8 },
588 N_("Local file selection:"), GRID
},
590 {"add-file", ARGP_KEY_ARG
, N_("FILE"), 0,
591 N_("add given FILE to the archive (useful if its name starts with a dash)"), GRID
+1 },
592 {"directory", 'C', N_("DIR"), 0,
593 N_("change to directory DIR"), GRID
+1 },
594 {"files-from", 'T', N_("FILE"), 0,
595 N_("get names to extract or create from FILE"), GRID
+1 },
596 {"null", NULL_OPTION
, 0, 0,
597 N_("-T reads null-terminated names, disable -C"), GRID
+1 },
598 {"unquote", UNQUOTE_OPTION
, 0, 0,
599 N_("unquote filenames read with -T (default)"), GRID
+1 },
600 {"no-unquote", NO_UNQUOTE_OPTION
, 0, 0,
601 N_("do not unquote filenames read with -T"), GRID
+1 },
602 {"exclude", EXCLUDE_OPTION
, N_("PATTERN"), 0,
603 N_("exclude files, given as a PATTERN"), GRID
+1 },
604 {"exclude-from", 'X', N_("FILE"), 0,
605 N_("exclude patterns listed in FILE"), GRID
+1 },
606 {"exclude-caches", EXCLUDE_CACHES_OPTION
, 0, 0,
607 N_("exclude directories containing a cache tag"), GRID
+1 },
608 {"exclude-tag", EXCLUDE_TAG_OPTION
, N_("FILE"), 0,
609 N_("exclude directories containing FILE"), GRID
+1 },
610 {"no-recursion", NO_RECURSION_OPTION
, 0, 0,
611 N_("avoid descending automatically in directories"), GRID
+1 },
612 {"one-file-system", ONE_FILE_SYSTEM_OPTION
, 0, 0,
613 N_("stay in local file system when creating archive"), GRID
+1 },
614 {"recursion", RECURSION_OPTION
, 0, 0,
615 N_("recurse into directories (default)"), GRID
+1 },
616 {"absolute-names", 'P', 0, 0,
617 N_("don't strip leading `/'s from file names"), GRID
+1 },
618 {"dereference", 'h', 0, 0,
619 N_("follow symlinks; archive and dump the files they point to"), GRID
+1 },
620 {"starting-file", 'K', N_("MEMBER-NAME"), 0,
621 N_("begin at member MEMBER-NAME in the archive"), GRID
+1 },
622 {"newer", 'N', N_("DATE-OR-FILE"), 0,
623 N_("only store files newer than DATE-OR-FILE"), GRID
+1 },
624 {"after-date", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
625 {"newer-mtime", NEWER_MTIME_OPTION
, N_("DATE"), 0,
626 N_("compare date and time when data changed only"), GRID
+1 },
627 {"backup", BACKUP_OPTION
, N_("CONTROL"), OPTION_ARG_OPTIONAL
,
628 N_("backup before removal, choose version CONTROL"), GRID
+1 },
629 {"suffix", SUFFIX_OPTION
, N_("STRING"), 0,
630 N_("backup before removal, override usual suffix ('~' unless overridden by environment variable SIMPLE_BACKUP_SUFFIX)"), GRID
+1 },
635 N_("File name transformations:"), GRID
},
636 {"strip-components", STRIP_COMPONENTS_OPTION
, N_("NUMBER"), 0,
637 N_("strip NUMBER leading components from file names on extraction"),
639 {"transform", TRANSFORM_OPTION
, N_("EXPRESSION"), 0,
640 N_("use sed replace EXPRESSION to transform file names"), GRID
+1 },
645 N_("File name matching options (affect both exclude and include patterns):"),
647 {"ignore-case", IGNORE_CASE_OPTION
, 0, 0,
648 N_("ignore case"), GRID
+1 },
649 {"anchored", ANCHORED_OPTION
, 0, 0,
650 N_("patterns match file name start"), GRID
+1 },
651 {"no-anchored", NO_ANCHORED_OPTION
, 0, 0,
652 N_("patterns match after any `/' (default for exclusion)"), GRID
+1 },
653 {"no-ignore-case", NO_IGNORE_CASE_OPTION
, 0, 0,
654 N_("case sensitive matching (default)"), GRID
+1 },
655 {"wildcards", WILDCARDS_OPTION
, 0, 0,
656 N_("use wildcards (default for exclusion)"), GRID
+1 },
657 {"no-wildcards", NO_WILDCARDS_OPTION
, 0, 0,
658 N_("verbatim string matching"), GRID
+1 },
659 {"no-wildcards-match-slash", NO_WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
660 N_("wildcards do not match `/'"), GRID
+1 },
661 {"wildcards-match-slash", WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
662 N_("wildcards match `/' (default for exclusion)"), GRID
+1 },
667 N_("Informative output:"), GRID
},
669 {"verbose", 'v', 0, 0,
670 N_("verbosely list files processed"), GRID
+1 },
671 {"checkpoint", CHECKPOINT_OPTION
, N_("[.]NUMBER"), OPTION_ARG_OPTIONAL
,
672 N_("display progress messages every NUMBERth record (default 10)"),
674 {"check-links", 'l', 0, 0,
675 N_("print a message if not all links are dumped"), GRID
+1 },
676 {"totals", TOTALS_OPTION
, N_("SIGNAL"), OPTION_ARG_OPTIONAL
,
677 N_("print total bytes after processing the archive; "
678 "with an argument - print total bytes when this SIGNAL is delivered; "
679 "Allowed signals are: SIGHUP, SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; "
680 "the names without SIG prefix are also accepted"), GRID
+1 },
681 {"utc", UTC_OPTION
, 0, 0,
682 N_("print file modification dates in UTC"), GRID
+1 },
683 {"index-file", INDEX_FILE_OPTION
, N_("FILE"), 0,
684 N_("send verbose output to FILE"), GRID
+1 },
685 {"block-number", 'R', 0, 0,
686 N_("show block number within archive with each message"), GRID
+1 },
687 {"interactive", 'w', 0, 0,
688 N_("ask for confirmation for every action"), GRID
+1 },
689 {"confirmation", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
690 {"show-defaults", SHOW_DEFAULTS_OPTION
, 0, 0,
691 N_("show tar defaults"), GRID
+1 },
692 {"show-omitted-dirs", SHOW_OMITTED_DIRS_OPTION
, 0, 0,
693 N_("when listing or extracting, list each directory that does not match search criteria"), GRID
+1 },
694 {"show-transformed-names", SHOW_TRANSFORMED_NAMES_OPTION
, 0, 0,
695 N_("show file or archive names after transformation"),
697 {"show-stored-names", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
698 {"quoting-style", QUOTING_STYLE_OPTION
, N_("STYLE"), 0,
699 N_("set name quoting style; see below for valid STYLE values"), GRID
+1 },
700 {"quote-chars", QUOTE_CHARS_OPTION
, N_("STRING"), 0,
701 N_("additionally quote characters from STRING"), GRID
+1 },
702 {"no-quote-chars", NO_QUOTE_CHARS_OPTION
, N_("STRING"), 0,
703 N_("disable quoting for characters from STRING"), GRID
+1 },
708 N_("Compatibility options:"), GRID
},
711 N_("when creating, same as --old-archive; when extracting, same as --no-same-owner"), GRID
+1 },
716 N_("Other options:"), GRID
},
718 {"restrict", RESTRICT_OPTION
, 0, 0,
719 N_("disable use of some potentially harmful options"), -1 },
721 {"help", '?', 0, 0, N_("give this help list"), -1},
722 {"usage", USAGE_OPTION
, 0, 0, N_("give a short usage message"), -1},
723 {"version", VERSION_OPTION
, 0, 0, N_("print program version"), -1},
724 /* FIXME -V (--label) conflicts with the default short option for
726 {"HANG", HANG_OPTION
, "SECS", OPTION_ARG_OPTIONAL
| OPTION_HIDDEN
,
727 N_("hang for SECS seconds (default 3600)"), 0},
733 static char const *const atime_preserve_args
[] =
735 "replace", "system", NULL
738 static enum atime_preserve
const atime_preserve_types
[] =
740 replace_atime_preserve
, system_atime_preserve
743 /* Make sure atime_preserve_types has as much entries as atime_preserve_args
744 (minus 1 for NULL guard) */
745 ARGMATCH_VERIFY (atime_preserve_args
, atime_preserve_types
);
747 /* Wildcard matching settings */
750 default_wildcards
, /* For exclusion == enable_wildcards,
751 for inclusion == disable_wildcards */
756 struct tar_args
/* Variables used during option parsing */
758 struct textual_date
*textual_date
; /* Keeps the arguments to --newer-mtime
759 and/or --date option if they are
761 enum wildcards wildcards
; /* Wildcard settings (--wildcards/
763 int matching_flags
; /* exclude_fnmatch options */
764 int include_anchored
; /* Pattern anchoring options used for
766 bool o_option
; /* True if -o option was given */
767 bool pax_option
; /* True if --pax-option was given */
768 char const *backup_suffix_string
; /* --suffix option argument */
769 char const *version_control_string
; /* --backup option argument */
770 bool input_files
; /* True if some input files where given */
773 #define MAKE_EXCL_OPTIONS(args) \
774 ((((args)->wildcards != disable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
775 | (args)->matching_flags \
778 #define MAKE_INCL_OPTIONS(args) \
779 ((((args)->wildcards == enable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
780 | (args)->include_anchored \
781 | (args)->matching_flags \
785 # define DECL_SHOW_DEFAULT_SETTINGS(stream, printer) \
788 "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s", \
789 archive_format_string (DEFAULT_ARCHIVE_FORMAT), \
790 DEFAULT_ARCHIVE, DEFAULT_BLOCKING, \
791 quoting_style_args[DEFAULT_QUOTING_STYLE], \
792 DEFAULT_RMT_COMMAND); \
793 printer (stream, " --rsh-command=%s", REMOTE_SHELL); \
794 printer (stream, "\n"); \
797 # define DECL_SHOW_DEFAULT_SETTINGS(stream, printer) \
800 "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s", \
801 archive_format_string (DEFAULT_ARCHIVE_FORMAT), \
802 DEFAULT_ARCHIVE, DEFAULT_BLOCKING, \
803 quoting_style_args[DEFAULT_QUOTING_STYLE], \
804 DEFAULT_RMT_COMMAND); \
805 printer (stream, "\n"); \
810 show_default_settings (FILE *fp
)
811 DECL_SHOW_DEFAULT_SETTINGS(fp
, fprintf
)
814 show_default_settings_fs (argp_fmtstream_t fs
)
815 DECL_SHOW_DEFAULT_SETTINGS(fs
, argp_fmtstream_printf
)
818 set_subcommand_option (enum subcommand subcommand
)
820 if (subcommand_option
!= UNKNOWN_SUBCOMMAND
821 && subcommand_option
!= subcommand
)
823 _("You may not specify more than one `-Acdtrux' option")));
825 subcommand_option
= subcommand
;
829 set_use_compress_program_option (const char *string
)
831 if (use_compress_program_option
832 && strcmp (use_compress_program_option
, string
) != 0)
833 USAGE_ERROR ((0, 0, _("Conflicting compression options")));
835 use_compress_program_option
= string
;
842 print_total_stats ();
843 #ifndef HAVE_SIGACTION
844 signal (signo
, sigstat
);
849 stat_on_signal (int signo
)
851 #ifdef HAVE_SIGACTION
852 struct sigaction act
;
853 act
.sa_handler
= sigstat
;
854 sigemptyset (&act
.sa_mask
);
856 sigaction (signo
, &act
, NULL
);
858 signal (signo
, sigstat
);
863 set_stat_signal (const char *name
)
870 { "SIGUSR1", SIGUSR1
},
872 { "SIGUSR2", SIGUSR2
},
874 { "SIGHUP", SIGHUP
},
876 { "SIGINT", SIGINT
},
878 { "SIGQUIT", SIGQUIT
},
883 for (p
= sigtab
; p
< sigtab
+ sizeof (sigtab
) / sizeof (sigtab
[0]); p
++)
884 if (strcmp (p
->name
, name
) == 0)
886 stat_on_signal (p
->signo
);
889 FATAL_ERROR ((0, 0, _("Unknown signal name: %s"), name
));
895 struct textual_date
*next
;
902 get_date_or_file (struct tar_args
*args
, const char *option
,
903 const char *str
, struct timespec
*ts
)
905 if (FILE_SYSTEM_PREFIX_LEN (str
) != 0
910 if (deref_stat (dereference_option
, str
, &st
) != 0)
913 USAGE_ERROR ((0, 0, _("Date sample file not found")));
915 *ts
= get_stat_mtime (&st
);
919 if (! get_date (ts
, str
, NULL
))
921 WARN ((0, 0, _("Substituting %s for unknown date format %s"),
922 tartime (*ts
, false), quote (str
)));
927 struct textual_date
*p
= xmalloc (sizeof (*p
));
931 p
->next
= args
->textual_date
;
932 args
->textual_date
= p
;
938 report_textual_dates (struct tar_args
*args
)
940 struct textual_date
*p
;
941 for (p
= args
->textual_date
; p
; )
943 struct textual_date
*next
= p
->next
;
944 char const *treated_as
= tartime (*p
->ts
, true);
945 if (strcmp (p
->date
, treated_as
) != 0)
946 WARN ((0, 0, _("Option %s: Treating date `%s' as %s"),
947 p
->option
, p
->date
, treated_as
));
954 static volatile int _argp_hang
;
956 enum read_file_list_state
/* Result of reading file name from the list file */
958 file_list_success
, /* OK, name read successfully */
959 file_list_end
, /* End of list file */
960 file_list_zero
, /* Zero separator encountered where it should not */
961 file_list_skip
/* Empty (zero-length) entry encountered, skip it */
964 /* Read from FP a sequence of characters up to FILENAME_TERMINATOR and put them
967 static enum read_file_list_state
968 read_name_from_file (FILE *fp
, struct obstack
*stk
)
973 for (c
= getc (fp
); c
!= EOF
&& c
!= filename_terminator
; c
= getc (fp
))
977 /* We have read a zero separator. The file possibly is
979 return file_list_zero
;
981 obstack_1grow (stk
, c
);
985 if (counter
== 0 && c
!= EOF
)
986 return file_list_skip
;
988 obstack_1grow (stk
, 0);
990 return (counter
== 0 && c
== EOF
) ? file_list_end
: file_list_success
;
994 static bool files_from_option
; /* When set, tar will not refuse to create
996 static struct obstack argv_stk
; /* Storage for additional command line options
997 read using -T option */
999 /* Prevent recursive inclusion of the same file */
1002 struct file_id_list
*next
;
1007 static struct file_id_list
*file_id_list
;
1010 add_file_id (const char *filename
)
1012 struct file_id_list
*p
;
1015 if (stat (filename
, &st
))
1016 stat_fatal (filename
);
1017 for (p
= file_id_list
; p
; p
= p
->next
)
1018 if (p
->ino
== st
.st_ino
&& p
->dev
== st
.st_dev
)
1020 FATAL_ERROR ((0, 0, _("%s: file list already read"),
1021 quotearg_colon (filename
)));
1023 p
= xmalloc (sizeof *p
);
1024 p
->next
= file_id_list
;
1030 /* Default density numbers for [0-9][lmh] device specifications */
1032 #ifndef LOW_DENSITY_NUM
1033 # define LOW_DENSITY_NUM 0
1036 #ifndef MID_DENSITY_NUM
1037 # define MID_DENSITY_NUM 8
1040 #ifndef HIGH_DENSITY_NUM
1041 # define HIGH_DENSITY_NUM 16
1045 update_argv (const char *filename
, struct argp_state
*state
)
1048 size_t count
= 0, i
;
1052 bool is_stdin
= false;
1053 enum read_file_list_state read_state
;
1055 if (!strcmp (filename
, "-"))
1058 request_stdin ("-T");
1063 add_file_id (filename
);
1064 if ((fp
= fopen (filename
, "r")) == NULL
)
1065 open_fatal (filename
);
1068 while ((read_state
= read_name_from_file (fp
, &argv_stk
)) != file_list_end
)
1072 case file_list_success
:
1076 case file_list_end
: /* won't happen, just to pacify gcc */
1079 case file_list_zero
:
1083 WARN ((0, 0, N_("%s: file name read contains nul character"),
1084 quotearg_colon (filename
)));
1086 /* Prepare new stack contents */
1087 size
= obstack_object_size (&argv_stk
);
1088 p
= obstack_finish (&argv_stk
);
1089 for (; size
> 0; size
--, p
++)
1091 obstack_1grow (&argv_stk
, *p
);
1093 obstack_1grow (&argv_stk
, '\n');
1094 obstack_1grow (&argv_stk
, 0);
1096 /* Read rest of files using new filename terminator */
1097 filename_terminator
= 0;
1101 case file_list_skip
:
1112 start
= obstack_finish (&argv_stk
);
1114 if (filename_terminator
== 0)
1115 for (p
= start
; *p
; p
+= strlen (p
) + 1)
1119 new_argc
= state
->argc
+ count
;
1120 new_argv
= xmalloc (sizeof (state
->argv
[0]) * (new_argc
+ 1));
1121 memcpy (new_argv
, state
->argv
, sizeof (state
->argv
[0]) * (state
->argc
+ 1));
1122 state
->argv
= new_argv
;
1123 memmove (&state
->argv
[state
->next
+ count
], &state
->argv
[state
->next
],
1124 (state
->argc
- state
->next
+ 1) * sizeof (state
->argv
[0]));
1126 state
->argc
= new_argc
;
1128 for (i
= state
->next
, p
= start
; *p
; p
+= strlen (p
) + 1, i
++)
1130 if (filename_terminator
== 0 && p
[0] == '-')
1131 state
->argv
[i
++] = "--add-file";
1138 tar_help (struct argp_state
*state
)
1140 argp_fmtstream_t fs
;
1141 state
->flags
|= ARGP_NO_EXIT
;
1142 argp_state_help (state
, state
->out_stream
,
1143 ARGP_HELP_STD_HELP
& ~ARGP_HELP_BUG_ADDR
);
1144 /* FIXME: use struct uparams.rmargin (from argp-help.c) instead of 79 */
1145 fs
= argp_make_fmtstream (state
->out_stream
, 0, 79, 0);
1147 argp_fmtstream_printf (fs
, "\n%s\n\n",
1148 _("Valid arguments for --quoting-style options are:"));
1149 tar_list_quoting_styles (fs
, " ");
1151 argp_fmtstream_puts (fs
, _("\n*This* tar defaults to:\n"));
1152 show_default_settings_fs (fs
);
1153 argp_fmtstream_putc (fs
, '\n');
1154 argp_fmtstream_printf (fs
, _("Report bugs to %s.\n"),
1155 argp_program_bug_address
);
1156 argp_fmtstream_free (fs
);
1160 parse_opt (int key
, char *arg
, struct argp_state
*state
)
1162 struct tar_args
*args
= state
->input
;
1167 /* File name or non-parsed option, because of ARGP_IN_ORDER */
1168 name_add_name (arg
, MAKE_INCL_OPTIONS (args
));
1169 args
->input_files
= true;
1173 set_subcommand_option (CAT_SUBCOMMAND
);
1179 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1180 && u
== (blocking_factor
= u
)
1181 && 0 < blocking_factor
1182 && u
== (record_size
= u
* BLOCKSIZE
) / BLOCKSIZE
))
1183 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1184 _("Invalid blocking factor")));
1189 /* Try to reblock input records. For reading 4.2BSD pipes. */
1191 /* It would surely make sense to exchange -B and -R, but it seems
1192 that -B has been used for a long while in Sun tar and most
1193 BSD-derived systems. This is a consequence of the block/record
1194 terminology confusion. */
1196 read_full_records_option
= true;
1200 set_subcommand_option (CREATE_SUBCOMMAND
);
1208 set_subcommand_option (DIFF_SUBCOMMAND
);
1212 if (archive_names
== allocated_archive_names
)
1213 archive_name_array
= x2nrealloc (archive_name_array
,
1214 &allocated_archive_names
,
1215 sizeof (archive_name_array
[0]));
1217 archive_name_array
[archive_names
++] = arg
;
1221 /* Since -F is only useful with -M, make it implied. Run this
1222 script at the end of each tape. */
1224 info_script_option
= arg
;
1225 multi_volume_option
= true;
1229 listed_incremental_option
= arg
;
1230 after_date_option
= true;
1234 /* We are making an incremental dump (FIXME: are we?); save
1235 directories at the beginning of the archive, and include in each
1236 directory its contents. */
1238 incremental_option
= true;
1242 /* Follow symbolic links. */
1243 dereference_option
= true;
1247 /* Ignore zero blocks (eofs). This can't be the default,
1248 because Unix tar writes two blocks of zeros, then pads out
1249 the record with garbage. */
1251 ignore_zeros_option
= true;
1256 _("Warning: the -I option is not supported;"
1257 " perhaps you meant -j or -T?")));
1261 set_use_compress_program_option ("bzip2");
1265 /* Don't replace existing files. */
1266 old_files_option
= KEEP_OLD_FILES
;
1270 starting_file_option
= true;
1274 case ONE_FILE_SYSTEM_OPTION
:
1275 /* When dumping directories, don't dump files/subdirectories
1276 that are on other filesystems. */
1277 one_file_system_option
= true;
1281 check_links_option
= 1;
1287 if (xstrtoumax (arg
, 0, 10, &u
, "") != LONGINT_OK
)
1288 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1289 _("Invalid tape length")));
1290 tape_length_option
= 1024 * (tarlong
) u
;
1291 multi_volume_option
= true;
1296 touch_option
= true;
1300 /* Make multivolume archive: when we can't write any more into
1301 the archive, re-open it, and continue writing. */
1303 multi_volume_option
= true;
1307 get_date_or_file (args
, "--mtime", arg
, &mtime_option
);
1308 set_mtime_option
= true;
1312 seekable_archive
= true;
1316 after_date_option
= true;
1319 case NEWER_MTIME_OPTION
:
1320 if (NEWER_OPTION_INITIALIZED (newer_mtime_option
))
1321 USAGE_ERROR ((0, 0, _("More than one threshold date")));
1322 get_date_or_file (args
,
1323 key
== NEWER_MTIME_OPTION
? "--newer-mtime"
1324 : "--after-date", arg
, &newer_mtime_option
);
1328 args
->o_option
= true;
1332 to_stdout_option
= true;
1336 same_permissions_option
= true;
1340 absolute_names_option
= true;
1344 set_subcommand_option (APPEND_SUBCOMMAND
);
1348 /* Print block numbers for debugging bad tar archives. */
1350 /* It would surely make sense to exchange -B and -R, but it seems
1351 that -B has been used for a long while in Sun tar and most
1352 BSD-derived systems. This is a consequence of the block/record
1353 terminology confusion. */
1355 block_number_option
= true;
1359 /* Names to extract are sorted. */
1361 same_order_option
= true;
1365 sparse_option
= true;
1368 case SPARSE_VERSION_OPTION
:
1369 sparse_option
= true;
1372 tar_sparse_major
= strtoul (arg
, &p
, 10);
1376 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1377 tar_sparse_minor
= strtoul (p
+ 1, &p
, 10);
1379 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1385 set_subcommand_option (LIST_SUBCOMMAND
);
1389 case TEST_LABEL_OPTION
:
1390 set_subcommand_option (LIST_SUBCOMMAND
);
1391 test_label_option
= true;
1395 update_argv (arg
, state
);
1396 /* Indicate we've been given -T option. This is for backward
1397 compatibility only, so that `tar cfT archive /dev/null will
1399 files_from_option
= true;
1403 set_subcommand_option (UPDATE_SUBCOMMAND
);
1407 old_files_option
= UNLINK_FIRST_OLD_FILES
;
1419 volume_label_option
= arg
;
1423 interactive_option
= true;
1427 verify_option
= true;
1431 set_subcommand_option (EXTRACT_SUBCOMMAND
);
1435 if (add_exclude_file (add_exclude
, excluded
, arg
,
1436 MAKE_EXCL_OPTIONS (args
), '\n')
1440 FATAL_ERROR ((0, e
, "%s", quotearg_colon (arg
)));
1445 set_use_compress_program_option ("gzip");
1449 set_use_compress_program_option ("compress");
1452 case ANCHORED_OPTION
:
1453 args
->matching_flags
|= EXCLUDE_ANCHORED
;
1456 case ATIME_PRESERVE_OPTION
:
1457 atime_preserve_option
=
1459 ? XARGMATCH ("--atime-preserve", arg
,
1460 atime_preserve_args
, atime_preserve_types
)
1461 : replace_atime_preserve
);
1462 if (! O_NOATIME
&& atime_preserve_option
== system_atime_preserve
)
1464 _("--atime-preserve='system' is not supported"
1465 " on this platform")));
1468 case CHECKPOINT_OPTION
:
1475 checkpoint_style
= checkpoint_dot
;
1478 checkpoint_option
= strtoul (arg
, &p
, 0);
1481 _("--checkpoint value is not an integer")));
1484 checkpoint_option
= 10;
1488 backup_option
= true;
1490 args
->version_control_string
= arg
;
1493 case DELAY_DIRECTORY_RESTORE_OPTION
:
1494 delay_directory_restore_option
= true;
1497 case NO_DELAY_DIRECTORY_RESTORE_OPTION
:
1498 delay_directory_restore_option
= false;
1502 set_subcommand_option (DELETE_SUBCOMMAND
);
1505 case EXCLUDE_OPTION
:
1506 add_exclude (excluded
, arg
, MAKE_EXCL_OPTIONS (args
));
1509 case EXCLUDE_CACHES_OPTION
:
1510 exclude_caches_option
= true;
1513 case EXCLUDE_TAG_OPTION
:
1514 add_exclude_tag (arg
);
1517 case FORCE_LOCAL_OPTION
:
1518 force_local_option
= true;
1522 set_archive_format (arg
);
1525 case INDEX_FILE_OPTION
:
1526 index_file_name
= arg
;
1529 case IGNORE_CASE_OPTION
:
1530 args
->matching_flags
|= FNM_CASEFOLD
;
1533 case IGNORE_COMMAND_ERROR_OPTION
:
1534 ignore_command_error_option
= true;
1537 case IGNORE_FAILED_READ_OPTION
:
1538 ignore_failed_read_option
= true;
1541 case KEEP_NEWER_FILES_OPTION
:
1542 old_files_option
= KEEP_NEWER_FILES
;
1546 if (! (strlen (arg
) < GNAME_FIELD_SIZE
1547 && gname_to_gid (arg
, &group_option
)))
1550 if (xstrtoumax (arg
, 0, 10, &g
, "") == LONGINT_OK
1554 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1555 _("%s: Invalid group")));
1560 mode_option
= mode_compile (arg
);
1562 FATAL_ERROR ((0, 0, _("Invalid mode given on option")));
1563 initial_umask
= umask (0);
1564 umask (initial_umask
);
1567 case NO_ANCHORED_OPTION
:
1568 args
->include_anchored
= 0; /* Clear the default for comman line args */
1569 args
->matching_flags
&= ~ EXCLUDE_ANCHORED
;
1572 case NO_IGNORE_CASE_OPTION
:
1573 args
->matching_flags
&= ~ FNM_CASEFOLD
;
1576 case NO_IGNORE_COMMAND_ERROR_OPTION
:
1577 ignore_command_error_option
= false;
1580 case NO_OVERWRITE_DIR_OPTION
:
1581 old_files_option
= NO_OVERWRITE_DIR_OLD_FILES
;
1584 case NO_QUOTE_CHARS_OPTION
:
1586 set_char_quoting (NULL
, *arg
, 0);
1589 case NO_WILDCARDS_OPTION
:
1590 args
->wildcards
= disable_wildcards
;
1593 case NO_WILDCARDS_MATCH_SLASH_OPTION
:
1594 args
->matching_flags
|= FNM_FILE_NAME
;
1598 filename_terminator
= '\0';
1601 case NUMERIC_OWNER_OPTION
:
1602 numeric_owner_option
= true;
1605 case OCCURRENCE_OPTION
:
1607 occurrence_option
= 1;
1611 if (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
)
1612 occurrence_option
= u
;
1614 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1615 _("Invalid number")));
1619 case OVERWRITE_DIR_OPTION
:
1620 old_files_option
= DEFAULT_OLD_FILES
;
1623 case OVERWRITE_OPTION
:
1624 old_files_option
= OVERWRITE_OLD_FILES
;
1628 if (! (strlen (arg
) < UNAME_FIELD_SIZE
1629 && uname_to_uid (arg
, &owner_option
)))
1632 if (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1636 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1637 _("Invalid owner")));
1641 case QUOTE_CHARS_OPTION
:
1643 set_char_quoting (NULL
, *arg
, 1);
1646 case QUOTING_STYLE_OPTION
:
1647 tar_set_quoting_style (arg
);
1651 args
->pax_option
= true;
1652 xheader_set_option (arg
);
1656 set_archive_format ("posix");
1659 case PRESERVE_OPTION
:
1660 /* FIXME: What it is good for? */
1661 same_permissions_option
= true;
1662 same_order_option
= true;
1665 case RECORD_SIZE_OPTION
:
1668 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1669 && u
== (size_t) u
))
1670 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1671 _("Invalid record size")));
1673 if (record_size
% BLOCKSIZE
!= 0)
1674 USAGE_ERROR ((0, 0, _("Record size must be a multiple of %d."),
1676 blocking_factor
= record_size
/ BLOCKSIZE
;
1680 case RECURSIVE_UNLINK_OPTION
:
1681 recursive_unlink_option
= true;
1684 case REMOVE_FILES_OPTION
:
1685 remove_files_option
= true;
1688 case RESTRICT_OPTION
:
1689 restrict_option
= true;
1692 case RMT_COMMAND_OPTION
:
1696 case RSH_COMMAND_OPTION
:
1697 rsh_command_option
= arg
;
1700 case SHOW_DEFAULTS_OPTION
:
1701 show_default_settings (stdout
);
1705 case STRIP_COMPONENTS_OPTION
:
1708 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1709 && u
== (size_t) u
))
1710 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1711 _("Invalid number of elements")));
1712 strip_name_components
= u
;
1716 case SHOW_OMITTED_DIRS_OPTION
:
1717 show_omitted_dirs_option
= true;
1720 case SHOW_TRANSFORMED_NAMES_OPTION
:
1721 show_transformed_names_option
= true;
1725 backup_option
= true;
1726 args
->backup_suffix_string
= arg
;
1729 case TO_COMMAND_OPTION
:
1730 if (to_command_option
)
1731 USAGE_ERROR ((0, 0, _("Only one --to-command option allowed")));
1732 to_command_option
= arg
;
1737 set_stat_signal (arg
);
1739 totals_option
= true;
1742 case TRANSFORM_OPTION
:
1743 set_transform_expr (arg
);
1746 case USE_COMPRESS_PROGRAM_OPTION
:
1747 set_use_compress_program_option (arg
);
1750 case VOLNO_FILE_OPTION
:
1751 volno_file_option
= arg
;
1754 case WILDCARDS_OPTION
:
1755 args
->wildcards
= enable_wildcards
;
1758 case WILDCARDS_MATCH_SLASH_OPTION
:
1759 args
->matching_flags
&= ~ FNM_FILE_NAME
;
1762 case NO_RECURSION_OPTION
:
1763 recursion_option
= 0;
1766 case NO_SAME_OWNER_OPTION
:
1767 same_owner_option
= -1;
1770 case NO_SAME_PERMISSIONS_OPTION
:
1771 same_permissions_option
= -1;
1774 case RECURSION_OPTION
:
1775 recursion_option
= FNM_LEADING_DIR
;
1778 case SAME_OWNER_OPTION
:
1779 same_owner_option
= 1;
1782 case UNQUOTE_OPTION
:
1783 unquote_option
= true;
1786 case NO_UNQUOTE_OPTION
:
1787 unquote_option
= false;
1799 #ifdef DEVICE_PREFIX
1801 int device
= key
- '0';
1803 static char buf
[sizeof DEVICE_PREFIX
+ 10];
1807 argp_error (state
, _("Malformed density argument: %s"), quote (arg
));
1809 strcpy (buf
, DEVICE_PREFIX
);
1810 cursor
= buf
+ strlen (buf
);
1812 #ifdef DENSITY_LETTER
1814 sprintf (cursor
, "%d%c", device
, arg
[0]);
1816 #else /* not DENSITY_LETTER */
1821 device
+= LOW_DENSITY_NUM
;
1825 device
+= MID_DENSITY_NUM
;
1829 device
+= HIGH_DENSITY_NUM
;
1833 argp_error (state
, _("Unknown density: `%c'"), arg
[0]);
1835 sprintf (cursor
, "%d", device
);
1837 #endif /* not DENSITY_LETTER */
1839 if (archive_names
== allocated_archive_names
)
1840 archive_name_array
= x2nrealloc (archive_name_array
,
1841 &allocated_archive_names
,
1842 sizeof (archive_name_array
[0]));
1843 archive_name_array
[archive_names
++] = xstrdup (buf
);
1847 #else /* not DEVICE_PREFIX */
1850 _("Options `-[0-7][lmh]' not supported by *this* tar"));
1852 #endif /* not DEVICE_PREFIX */
1860 argp_state_help (state
, state
->out_stream
, ARGP_HELP_USAGE
);
1864 case VERSION_OPTION
:
1865 version_etc (state
->out_stream
, "tar", PACKAGE_NAME
, VERSION
,
1866 "John Gilmore", "Jay Fenlason", (char *) NULL
);
1871 _argp_hang
= atoi (arg
? arg
: "3600");
1872 while (_argp_hang
-- > 0)
1877 return ARGP_ERR_UNKNOWN
;
1882 static struct argp argp
= {
1895 argp_help (&argp
, stderr
, ARGP_HELP_SEE
, (char*) program_name
);
1900 /* Parse the options for tar. */
1902 static struct argp_option
*
1903 find_argp_option (struct argp_option
*options
, int letter
)
1906 !(options
->name
== NULL
1907 && options
->key
== 0
1908 && options
->arg
== 0
1909 && options
->flags
== 0
1910 && options
->doc
== NULL
); options
++)
1911 if (options
->key
== letter
)
1917 decode_options (int argc
, char **argv
)
1920 struct tar_args args
;
1922 /* Set some default option values. */
1923 args
.textual_date
= NULL
;
1924 args
.wildcards
= default_wildcards
;
1925 args
.matching_flags
= 0;
1926 args
.include_anchored
= EXCLUDE_ANCHORED
;
1927 args
.o_option
= false;
1928 args
.pax_option
= false;
1929 args
.backup_suffix_string
= getenv ("SIMPLE_BACKUP_SUFFIX");
1930 args
.version_control_string
= 0;
1931 args
.input_files
= false;
1933 subcommand_option
= UNKNOWN_SUBCOMMAND
;
1934 archive_format
= DEFAULT_FORMAT
;
1935 blocking_factor
= DEFAULT_BLOCKING
;
1936 record_size
= DEFAULT_BLOCKING
* BLOCKSIZE
;
1937 excluded
= new_exclude ();
1938 newer_mtime_option
.tv_sec
= TYPE_MINIMUM (time_t);
1939 newer_mtime_option
.tv_nsec
= -1;
1940 recursion_option
= FNM_LEADING_DIR
;
1941 unquote_option
= true;
1942 tar_sparse_major
= 1;
1943 tar_sparse_minor
= 0;
1948 /* Convert old-style tar call by exploding option element and rearranging
1949 options accordingly. */
1951 if (argc
> 1 && argv
[1][0] != '-')
1953 int new_argc
; /* argc value for rearranged arguments */
1954 char **new_argv
; /* argv value for rearranged arguments */
1955 char *const *in
; /* cursor into original argv */
1956 char **out
; /* cursor into rearranged argv */
1957 const char *letter
; /* cursor into old option letters */
1958 char buffer
[3]; /* constructed option buffer */
1960 /* Initialize a constructed option. */
1965 /* Allocate a new argument array, and copy program name in it. */
1967 new_argc
= argc
- 1 + strlen (argv
[1]);
1968 new_argv
= xmalloc ((new_argc
+ 1) * sizeof (char *));
1973 /* Copy each old letter option as a separate option, and have the
1974 corresponding argument moved next to it. */
1976 for (letter
= *in
++; *letter
; letter
++)
1978 struct argp_option
*opt
;
1980 buffer
[1] = *letter
;
1981 *out
++ = xstrdup (buffer
);
1982 opt
= find_argp_option (options
, *letter
);
1983 if (opt
&& opt
->arg
)
1985 if (in
< argv
+ argc
)
1988 USAGE_ERROR ((0, 0, _("Old option `%c' requires an argument."),
1993 /* Copy all remaining options. */
1995 while (in
< argv
+ argc
)
1999 /* Replace the old option list by the new one. */
2005 /* Parse all options and non-options as they appear. */
2007 prepend_default_options (getenv ("TAR_OPTIONS"), &argc
, &argv
);
2009 if (argp_parse (&argp
, argc
, argv
, ARGP_IN_ORDER
|ARGP_NO_HELP
,
2011 exit (TAREXIT_FAILURE
);
2014 /* Special handling for 'o' option:
2016 GNU tar used to say "output old format".
2017 UNIX98 tar says don't chown files after extracting (we use
2018 "--no-same-owner" for this).
2020 The old GNU tar semantics is retained when used with --create
2021 option, otherwise UNIX98 semantics is assumed */
2025 if (subcommand_option
== CREATE_SUBCOMMAND
)
2027 /* GNU Tar <= 1.13 compatibility */
2028 set_archive_format ("v7");
2032 /* UNIX98 compatibility */
2033 same_owner_option
= -1;
2037 /* Handle operands after any "--" argument. */
2038 for (; index
< argc
; index
++)
2040 name_add_name (argv
[index
], MAKE_INCL_OPTIONS (&args
));
2041 args
.input_files
= true;
2044 /* Warn about implicit use of the wildcards in command line arguments.
2046 warn_regex_usage
= args
.wildcards
== default_wildcards
;
2048 /* Derive option values and check option consistency. */
2050 if (archive_format
== DEFAULT_FORMAT
)
2052 if (args
.pax_option
)
2053 archive_format
= POSIX_FORMAT
;
2055 archive_format
= DEFAULT_ARCHIVE_FORMAT
;
2058 if ((volume_label_option
&& subcommand_option
== CREATE_SUBCOMMAND
)
2059 || incremental_option
2060 || multi_volume_option
2062 assert_format (FORMAT_MASK (OLDGNU_FORMAT
)
2063 | FORMAT_MASK (GNU_FORMAT
)
2064 | FORMAT_MASK (POSIX_FORMAT
));
2066 if (occurrence_option
)
2068 if (!args
.input_files
)
2070 _("--occurrence is meaningless without a file list")));
2071 if (subcommand_option
!= DELETE_SUBCOMMAND
2072 && subcommand_option
!= DIFF_SUBCOMMAND
2073 && subcommand_option
!= EXTRACT_SUBCOMMAND
2074 && subcommand_option
!= LIST_SUBCOMMAND
)
2076 _("--occurrence cannot be used in the requested operation mode")));
2079 if (seekable_archive
&& subcommand_option
== DELETE_SUBCOMMAND
)
2081 /* The current code in delete.c is based on the assumption that
2082 skip_member() reads all data from the archive. So, we should
2083 make sure it won't use seeks. On the other hand, the same code
2084 depends on the ability to backspace a record in the archive,
2085 so setting seekable_archive to false is technically incorrect.
2086 However, it is tested only in skip_member(), so it's not a
2088 seekable_archive
= false;
2091 if (archive_names
== 0)
2093 /* If no archive file name given, try TAPE from the environment, or
2094 else, DEFAULT_ARCHIVE from the configuration process. */
2097 archive_name_array
[0] = getenv ("TAPE");
2098 if (! archive_name_array
[0])
2099 archive_name_array
[0] = DEFAULT_ARCHIVE
;
2102 /* Allow multiple archives only with `-M'. */
2104 if (archive_names
> 1 && !multi_volume_option
)
2106 _("Multiple archive files require `-M' option")));
2108 if (listed_incremental_option
2109 && NEWER_OPTION_INITIALIZED (newer_mtime_option
))
2111 _("Cannot combine --listed-incremental with --newer")));
2113 if (volume_label_option
)
2115 if (archive_format
== GNU_FORMAT
|| archive_format
== OLDGNU_FORMAT
)
2117 size_t volume_label_max_len
=
2118 (sizeof current_header
->header
.name
2119 - 1 /* for trailing '\0' */
2120 - (multi_volume_option
2121 ? (sizeof " Volume "
2122 - 1 /* for null at end of " Volume " */
2123 + INT_STRLEN_BOUND (int) /* for volume number */
2124 - 1 /* for sign, as 0 <= volno */)
2126 if (volume_label_max_len
< strlen (volume_label_option
))
2128 ngettext ("%s: Volume label is too long (limit is %lu byte)",
2129 "%s: Volume label is too long (limit is %lu bytes)",
2130 volume_label_max_len
),
2131 quotearg_colon (volume_label_option
),
2132 (unsigned long) volume_label_max_len
));
2135 Label length in PAX format is limited by the volume size. */
2140 if (multi_volume_option
)
2141 USAGE_ERROR ((0, 0, _("Cannot verify multi-volume archives")));
2142 if (use_compress_program_option
)
2143 USAGE_ERROR ((0, 0, _("Cannot verify compressed archives")));
2146 if (use_compress_program_option
)
2148 if (multi_volume_option
)
2149 USAGE_ERROR ((0, 0, _("Cannot use multi-volume compressed archives")));
2150 if (subcommand_option
== UPDATE_SUBCOMMAND
2151 || subcommand_option
== APPEND_SUBCOMMAND
2152 || subcommand_option
== DELETE_SUBCOMMAND
)
2153 USAGE_ERROR ((0, 0, _("Cannot update compressed archives")));
2154 if (subcommand_option
== CAT_SUBCOMMAND
)
2155 USAGE_ERROR ((0, 0, _("Cannot concatenate compressed archives")));
2158 /* It is no harm to use --pax-option on non-pax archives in archive
2159 reading mode. It may even be useful, since it allows to override
2160 file attributes from tar headers. Therefore I allow such usage.
2163 && archive_format
!= POSIX_FORMAT
2164 && (subcommand_option
!= EXTRACT_SUBCOMMAND
2165 || subcommand_option
!= DIFF_SUBCOMMAND
2166 || subcommand_option
!= LIST_SUBCOMMAND
))
2167 USAGE_ERROR ((0, 0, _("--pax-option can be used only on POSIX archives")));
2169 /* If ready to unlink hierarchies, so we are for simpler files. */
2170 if (recursive_unlink_option
)
2171 old_files_option
= UNLINK_FIRST_OLD_FILES
;
2174 if (test_label_option
)
2176 /* --test-label is silent if the user has specified the label name to
2178 if (!args
.input_files
)
2181 else if (utc_option
)
2184 /* Forbid using -c with no input files whatsoever. Check that `-f -',
2185 explicit or implied, is used correctly. */
2187 switch (subcommand_option
)
2189 case CREATE_SUBCOMMAND
:
2190 if (!args
.input_files
&& !files_from_option
)
2192 _("Cowardly refusing to create an empty archive")));
2195 case EXTRACT_SUBCOMMAND
:
2196 case LIST_SUBCOMMAND
:
2197 case DIFF_SUBCOMMAND
:
2198 for (archive_name_cursor
= archive_name_array
;
2199 archive_name_cursor
< archive_name_array
+ archive_names
;
2200 archive_name_cursor
++)
2201 if (!strcmp (*archive_name_cursor
, "-"))
2202 request_stdin ("-f");
2205 case CAT_SUBCOMMAND
:
2206 case UPDATE_SUBCOMMAND
:
2207 case APPEND_SUBCOMMAND
:
2208 for (archive_name_cursor
= archive_name_array
;
2209 archive_name_cursor
< archive_name_array
+ archive_names
;
2210 archive_name_cursor
++)
2211 if (!strcmp (*archive_name_cursor
, "-"))
2213 _("Options `-Aru' are incompatible with `-f -'")));
2219 /* Initialize stdlis */
2220 if (index_file_name
)
2222 stdlis
= fopen (index_file_name
, "w");
2224 open_error (index_file_name
);
2227 stdlis
= to_stdout_option
? stderr
: stdout
;
2229 archive_name_cursor
= archive_name_array
;
2231 /* Prepare for generating backup names. */
2233 if (args
.backup_suffix_string
)
2234 simple_backup_suffix
= xstrdup (args
.backup_suffix_string
);
2238 backup_type
= xget_version ("--backup", args
.version_control_string
);
2239 /* No backup is needed either if explicitely disabled or if
2240 the extracted files are not being written to disk. */
2241 if (backup_type
== no_backups
|| EXTRACT_OVER_PIPE
)
2242 backup_option
= false;
2246 report_textual_dates (&args
);
2252 /* Main routine for tar. */
2254 main (int argc
, char **argv
)
2257 program_name
= argv
[0];
2259 setlocale (LC_ALL
, "");
2260 bindtextdomain (PACKAGE
, LOCALEDIR
);
2261 textdomain (PACKAGE
);
2263 exit_failure
= TAREXIT_FAILURE
;
2264 exit_status
= TAREXIT_SUCCESS
;
2265 filename_terminator
= '\n';
2266 set_quoting_style (0, DEFAULT_QUOTING_STYLE
);
2268 /* Make sure we have first three descriptors available */
2271 /* Close all inherited open descriptors, except for the first three */
2274 /* Pre-allocate a few structures. */
2276 allocated_archive_names
= 10;
2277 archive_name_array
=
2278 xmalloc (sizeof (const char *) * allocated_archive_names
);
2281 obstack_init (&argv_stk
);
2284 /* System V fork+wait does not work if SIGCHLD is ignored. */
2285 signal (SIGCHLD
, SIG_DFL
);
2288 /* Decode options. */
2290 decode_options (argc
, argv
);
2293 /* Main command execution. */
2295 if (volno_file_option
)
2296 init_volume_number ();
2298 switch (subcommand_option
)
2300 case UNKNOWN_SUBCOMMAND
:
2302 _("You must specify one of the `-Acdtrux' options")));
2304 case CAT_SUBCOMMAND
:
2305 case UPDATE_SUBCOMMAND
:
2306 case APPEND_SUBCOMMAND
:
2310 case DELETE_SUBCOMMAND
:
2311 delete_archive_members ();
2314 case CREATE_SUBCOMMAND
:
2318 case EXTRACT_SUBCOMMAND
:
2320 read_and (extract_archive
);
2322 /* FIXME: should extract_finish () even if an ordinary signal is
2328 case LIST_SUBCOMMAND
:
2329 read_and (list_archive
);
2332 case DIFF_SUBCOMMAND
:
2334 read_and (diff_archive
);
2339 print_total_stats ();
2341 if (check_links_option
)
2344 if (volno_file_option
)
2345 closeout_volume_number ();
2347 /* Dispose of allocated memory, and return. */
2349 free (archive_name_array
);
2352 if (exit_status
== TAREXIT_FAILURE
)
2353 error (0, 0, _("Error exit delayed from previous errors"));
2355 if (stdlis
== stdout
)
2357 else if (ferror (stderr
) || fclose (stderr
) != 0)
2358 exit_status
= TAREXIT_FAILURE
;
2364 tar_stat_init (struct tar_stat_info
*st
)
2366 memset (st
, 0, sizeof (*st
));
2370 tar_stat_destroy (struct tar_stat_info
*st
)
2372 free (st
->orig_file_name
);
2373 free (st
->file_name
);
2374 free (st
->link_name
);
2377 free (st
->sparse_map
);
2379 memset (st
, 0, sizeof (*st
));
2382 /* Format mask for all available formats that support nanosecond
2383 timestamp resolution. */
2384 #define NS_PRECISION_FORMAT_MASK FORMAT_MASK (POSIX_FORMAT)
2386 /* Same as timespec_cmp, but ignore nanoseconds if current archive
2387 format does not provide sufficient resolution. */
2389 tar_timespec_cmp (struct timespec a
, struct timespec b
)
2391 if (!(FORMAT_MASK (current_format
) & NS_PRECISION_FORMAT_MASK
))
2392 a
.tv_nsec
= b
.tv_nsec
= 0;
2393 return timespec_cmp (a
, b
);