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 doc
[] = 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 N_("The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
333 The version control may be set with --backup or VERSION_CONTROL, values are:\n\n\
334 none, off never make backups\n\
335 t, numbered make numbered backups\n\
336 nil, existing numbered if numbered backups exist, simple otherwise\n\
337 never, simple always make simple backups\n");
342 Available option letters are DEIJQY and aeqy. Consider the following
345 [For Solaris tar compatibility =/= Is it important at all?]
346 e exit immediately with a nonzero exit status if unexpected errors occur
347 E use extended headers (--format=posix)
349 [q alias for --occurrence=1 =/= this would better be used for quiet?]
350 [I same as T =/= will harm star compatibility]
352 y per-file gzip compression
353 Y per-block gzip compression */
355 static struct argp_option options
[] = {
358 N_("Main operation mode:"), GRID
},
361 N_("list the contents of an archive"), GRID
+1 },
362 {"extract", 'x', 0, 0,
363 N_("extract files from an archive"), GRID
+1 },
364 {"get", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
365 {"create", 'c', 0, 0,
366 N_("create a new archive"), GRID
+1 },
368 N_("find differences between archive and file system"), GRID
+1 },
369 {"compare", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
370 {"append", 'r', 0, 0,
371 N_("append files to the end of an archive"), GRID
+1 },
372 {"update", 'u', 0, 0,
373 N_("only append files newer than copy in archive"), GRID
+1 },
374 {"catenate", 'A', 0, 0,
375 N_("append tar files to an archive"), GRID
+1 },
376 {"concatenate", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
377 {"delete", DELETE_OPTION
, 0, 0,
378 N_("delete from the archive (not on mag tapes!)"), GRID
+1 },
379 {"test-label", TEST_LABEL_OPTION
, NULL
, 0,
380 N_("test the archive volume label and exit"), GRID
+1 },
385 N_("Operation modifiers:"), GRID
},
387 {"sparse", 'S', 0, 0,
388 N_("handle sparse files efficiently"), GRID
+1 },
389 {"sparse-version", SPARSE_VERSION_OPTION
, N_("MAJOR[.MINOR]"), 0,
390 N_("set version of the sparse format to use (implies --sparse)"), GRID
+1},
391 {"incremental", 'G', 0, 0,
392 N_("handle old GNU-format incremental backup"), GRID
+1 },
393 {"listed-incremental", 'g', N_("FILE"), 0,
394 N_("handle new GNU-format incremental backup"), GRID
+1 },
395 {"ignore-failed-read", IGNORE_FAILED_READ_OPTION
, 0, 0,
396 N_("do not exit with nonzero on unreadable files"), GRID
+1 },
397 {"occurrence", OCCURRENCE_OPTION
, N_("NUMBER"), OPTION_ARG_OPTIONAL
,
398 N_("process only the NUMBERth occurrence of each file in the archive;"
399 " this option is valid only in conjunction with one of the subcommands"
400 " --delete, --diff, --extract or --list and when a list of files"
401 " is given either on the command line or via the -T option;"
402 " NUMBER defaults to 1"), GRID
+1 },
403 {"seek", 'n', NULL
, 0,
404 N_("archive is seekable"), GRID
+1 },
409 N_("Overwrite control:"), GRID
+1 },
411 {"verify", 'W', 0, 0,
412 N_("attempt to verify the archive after writing it"), GRID
+1 },
413 {"remove-files", REMOVE_FILES_OPTION
, 0, 0,
414 N_("remove files after adding them to the archive"), GRID
+1 },
415 {"keep-old-files", 'k', 0, 0,
416 N_("don't replace existing files when extracting"), GRID
+1 },
417 {"keep-newer-files", KEEP_NEWER_FILES_OPTION
, 0, 0,
418 N_("don't replace existing files that are newer than their archive copies"), GRID
+1 },
419 {"overwrite", OVERWRITE_OPTION
, 0, 0,
420 N_("overwrite existing files when extracting"), GRID
+1 },
421 {"unlink-first", 'U', 0, 0,
422 N_("remove each file prior to extracting over it"), GRID
+1 },
423 {"recursive-unlink", RECURSIVE_UNLINK_OPTION
, 0, 0,
424 N_("empty hierarchies prior to extracting directory"), GRID
+1 },
425 {"no-overwrite-dir", NO_OVERWRITE_DIR_OPTION
, 0, 0,
426 N_("preserve metadata of existing directories"), GRID
+1 },
427 {"overwrite-dir", OVERWRITE_DIR_OPTION
, 0, 0,
428 N_("overwrite metadata of existing directories when extracting (default)"),
434 N_("Select output stream:"), GRID
},
436 {"to-stdout", 'O', 0, 0,
437 N_("extract files to standard output"), GRID
+1 },
438 {"to-command", TO_COMMAND_OPTION
, N_("COMMAND"), 0,
439 N_("pipe extracted files to another program"), GRID
+1 },
440 {"ignore-command-error", IGNORE_COMMAND_ERROR_OPTION
, 0, 0,
441 N_("ignore exit codes of children"), GRID
+1 },
442 {"no-ignore-command-error", NO_IGNORE_COMMAND_ERROR_OPTION
, 0, 0,
443 N_("treat non-zero exit codes of children as error"), GRID
+1 },
448 N_("Handling of file attributes:"), GRID
},
450 {"owner", OWNER_OPTION
, N_("NAME"), 0,
451 N_("force NAME as owner for added files"), GRID
+1 },
452 {"group", GROUP_OPTION
, N_("NAME"), 0,
453 N_("force NAME as group for added files"), GRID
+1 },
454 {"mtime", MTIME_OPTION
, N_("DATE-OR-FILE"), 0,
455 N_("set mtime for added files from DATE-OR-FILE"), GRID
+1 },
456 {"mode", MODE_OPTION
, N_("CHANGES"), 0,
457 N_("force (symbolic) mode CHANGES for added files"), GRID
+1 },
458 {"atime-preserve", ATIME_PRESERVE_OPTION
,
459 N_("METHOD"), OPTION_ARG_OPTIONAL
,
460 N_("preserve access times on dumped files, either by restoring the times"
461 " after reading (METHOD='replace'; default) or by not setting the times"
462 " in the first place (METHOD='system')"), GRID
+1 },
464 N_("don't extract file modified time"), GRID
+1 },
465 {"same-owner", SAME_OWNER_OPTION
, 0, 0,
466 N_("try extracting files with the same ownership"), GRID
+1 },
467 {"no-same-owner", NO_SAME_OWNER_OPTION
, 0, 0,
468 N_("extract files as yourself"), GRID
+1 },
469 {"numeric-owner", NUMERIC_OWNER_OPTION
, 0, 0,
470 N_("always use numbers for user/group names"), GRID
+1 },
471 {"preserve-permissions", 'p', 0, 0,
472 N_("extract information about file permissions (default for superuser)"),
474 {"same-permissions", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
475 {"no-same-permissions", NO_SAME_PERMISSIONS_OPTION
, 0, 0,
476 N_("apply the user's umask when extracting permissions from the archive (default for ordinary users)"), GRID
+1 },
477 {"preserve-order", 's', 0, 0,
478 N_("sort names to extract to match archive"), GRID
+1 },
479 {"same-order", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
480 {"preserve", PRESERVE_OPTION
, 0, 0,
481 N_("same as both -p and -s"), GRID
+1 },
482 {"delay-directory-restore", DELAY_DIRECTORY_RESTORE_OPTION
, 0, 0,
483 N_("delay setting modification times and permissions of extracted"
484 " directories until the end of extraction"), GRID
+1 },
485 {"no-delay-directory-restore", NO_DELAY_DIRECTORY_RESTORE_OPTION
, 0, 0,
486 N_("cancel the effect of --delay-directory-restore option"), GRID
+1 },
491 N_("Device selection and switching:\n"), GRID
+1 },
493 {"file", 'f', N_("ARCHIVE"), 0,
494 N_("use archive file or device ARCHIVE"), GRID
+1 },
495 {"force-local", FORCE_LOCAL_OPTION
, 0, 0,
496 N_("archive file is local even if it has a colon"), GRID
+1 },
497 {"rmt-command", RMT_COMMAND_OPTION
, N_("COMMAND"), 0,
498 N_("use given rmt COMMAND instead of rmt"), GRID
+1 },
499 {"rsh-command", RSH_COMMAND_OPTION
, N_("COMMAND"), 0,
500 N_("use remote COMMAND instead of rsh"), GRID
+1 },
502 {"-[0-7][lmh]", 0, NULL
, OPTION_DOC
, /* It is OK, since `name' will never be
504 N_("specify drive and density"), GRID
+1 },
506 {NULL
, '0', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
507 {NULL
, '1', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
508 {NULL
, '2', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
509 {NULL
, '3', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
510 {NULL
, '4', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
511 {NULL
, '5', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
512 {NULL
, '6', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
513 {NULL
, '7', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
514 {NULL
, '8', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
515 {NULL
, '9', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
517 {"multi-volume", 'M', 0, 0,
518 N_("create/list/extract multi-volume archive"), GRID
+1 },
519 {"tape-length", 'L', N_("NUMBER"), 0,
520 N_("change tape after writing NUMBER x 1024 bytes"), GRID
+1 },
521 {"info-script", 'F', N_("NAME"), 0,
522 N_("run script at end of each tape (implies -M)"), GRID
+1 },
523 {"new-volume-script", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
524 {"volno-file", VOLNO_FILE_OPTION
, N_("FILE"), 0,
525 N_("use/update the volume number in FILE"), GRID
+1 },
530 N_("Device blocking:"), GRID
+1 },
532 {"blocking-factor", 'b', N_("BLOCKS"), 0,
533 N_("BLOCKS x 512 bytes per record"), GRID
+1 },
534 {"record-size", RECORD_SIZE_OPTION
, N_("NUMBER"), 0,
535 N_("NUMBER of bytes per record, multiple of 512"), GRID
+1 },
536 {"ignore-zeros", 'i', 0, 0,
537 N_("ignore zeroed blocks in archive (means EOF)"), GRID
+1 },
538 {"read-full-records", 'B', 0, 0,
539 N_("reblock as we read (for 4.2BSD pipes)"), GRID
+1 },
544 N_("Archive format selection:"), GRID
},
546 {"format", 'H', N_("FORMAT"), 0,
547 N_("create archive of the given format"), GRID
+1 },
549 {NULL
, 0, NULL
, 0, N_("FORMAT is one of the following:"), GRID
+2 },
550 {" v7", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("old V7 tar format"),
552 {" oldgnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
553 N_("GNU format as per tar <= 1.12"), GRID
+3 },
554 {" gnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
555 N_("GNU tar 1.13.x format"), GRID
+3 },
556 {" ustar", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
557 N_("POSIX 1003.1-1988 (ustar) format"), GRID
+3 },
558 {" pax", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
559 N_("POSIX 1003.1-2001 (pax) format"), GRID
+3 },
560 {" posix", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("same as pax"), GRID
+3 },
562 {"old-archive", OLD_ARCHIVE_OPTION
, 0, 0, /* FIXME */
563 N_("same as --format=v7"), GRID
+8 },
564 {"portability", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
565 {"posix", POSIX_OPTION
, 0, 0,
566 N_("same as --format=posix"), GRID
+8 },
567 {"pax-option", PAX_OPTION
, N_("keyword[[:]=value][,keyword[[:]=value]]..."), 0,
568 N_("control pax keywords"), GRID
+8 },
569 {"label", 'V', N_("TEXT"), 0,
570 N_("create archive with volume name TEXT; at list/extract time, use TEXT as a globbing pattern for volume name"), GRID
+8 },
572 N_("filter the archive through bzip2"), GRID
+8 },
574 N_("filter the archive through gzip"), GRID
+8 },
575 {"gunzip", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
576 {"ungzip", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
577 {"compress", 'Z', 0, 0,
578 N_("filter the archive through compress"), GRID
+8 },
579 {"uncompress", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
580 {"use-compress-program", USE_COMPRESS_PROGRAM_OPTION
, N_("PROG"), 0,
581 N_("filter through PROG (must accept -d)"), GRID
+8 },
586 N_("Local file selection:"), GRID
},
588 {"add-file", ARGP_KEY_ARG
, N_("FILE"), 0,
589 N_("add given FILE to the archive (useful if its name starts with a dash)"), GRID
+1 },
590 {"directory", 'C', N_("DIR"), 0,
591 N_("change to directory DIR"), GRID
+1 },
592 {"files-from", 'T', N_("FILE"), 0,
593 N_("get names to extract or create from FILE"), GRID
+1 },
594 {"null", NULL_OPTION
, 0, 0,
595 N_("-T reads null-terminated names, disable -C"), GRID
+1 },
596 {"unquote", UNQUOTE_OPTION
, 0, 0,
597 N_("unquote filenames read with -T (default)"), GRID
+1 },
598 {"no-unquote", NO_UNQUOTE_OPTION
, 0, 0,
599 N_("do not unquote filenames read with -T"), GRID
+1 },
600 {"exclude", EXCLUDE_OPTION
, N_("PATTERN"), 0,
601 N_("exclude files, given as a PATTERN"), GRID
+1 },
602 {"exclude-from", 'X', N_("FILE"), 0,
603 N_("exclude patterns listed in FILE"), GRID
+1 },
604 {"exclude-caches", EXCLUDE_CACHES_OPTION
, 0, 0,
605 N_("exclude directories containing a cache tag"), GRID
+1 },
606 {"no-recursion", NO_RECURSION_OPTION
, 0, 0,
607 N_("avoid descending automatically in directories"), GRID
+1 },
608 {"one-file-system", ONE_FILE_SYSTEM_OPTION
, 0, 0,
609 N_("stay in local file system when creating archive"), GRID
+1 },
610 {"recursion", RECURSION_OPTION
, 0, 0,
611 N_("recurse into directories (default)"), GRID
+1 },
612 {"absolute-names", 'P', 0, 0,
613 N_("don't strip leading `/'s from file names"), GRID
+1 },
614 {"dereference", 'h', 0, 0,
615 N_("follow symlinks; archive and dump the files they point to"), GRID
+1 },
616 {"starting-file", 'K', N_("MEMBER-NAME"), 0,
617 N_("begin at member MEMBER-NAME in the archive"), GRID
+1 },
618 {"newer", 'N', N_("DATE-OR-FILE"), 0,
619 N_("only store files newer than DATE-OR-FILE"), GRID
+1 },
620 {"after-date", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
621 {"newer-mtime", NEWER_MTIME_OPTION
, N_("DATE"), 0,
622 N_("compare date and time when data changed only"), GRID
+1 },
623 {"backup", BACKUP_OPTION
, N_("CONTROL"), OPTION_ARG_OPTIONAL
,
624 N_("backup before removal, choose version CONTROL"), GRID
+1 },
625 {"suffix", SUFFIX_OPTION
, N_("STRING"), 0,
626 N_("backup before removal, override usual suffix ('~' unless overridden by environment variable SIMPLE_BACKUP_SUFFIX)"), GRID
+1 },
631 N_("File name transformations:"), GRID
},
632 {"strip-components", STRIP_COMPONENTS_OPTION
, N_("NUMBER"), 0,
633 N_("strip NUMBER leading components from file names on extraction"),
635 {"transform", TRANSFORM_OPTION
, N_("EXPRESSION"), 0,
636 N_("use sed replace EXPRESSION to transform file names"), GRID
+1 },
641 N_("File name matching options (affect both exclude and include patterns):"),
643 {"ignore-case", IGNORE_CASE_OPTION
, 0, 0,
644 N_("ignore case"), GRID
+1 },
645 {"anchored", ANCHORED_OPTION
, 0, 0,
646 N_("patterns match file name start"), GRID
+1 },
647 {"no-anchored", NO_ANCHORED_OPTION
, 0, 0,
648 N_("patterns match after any `/' (default for exclusion)"), GRID
+1 },
649 {"no-ignore-case", NO_IGNORE_CASE_OPTION
, 0, 0,
650 N_("case sensitive matching (default)"), GRID
+1 },
651 {"wildcards", WILDCARDS_OPTION
, 0, 0,
652 N_("use wildcards (default for exclusion)"), GRID
+1 },
653 {"no-wildcards", NO_WILDCARDS_OPTION
, 0, 0,
654 N_("verbatim string matching"), GRID
+1 },
655 {"no-wildcards-match-slash", NO_WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
656 N_("wildcards do not match `/'"), GRID
+1 },
657 {"wildcards-match-slash", WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
658 N_("wildcards match `/' (default for exclusion)"), GRID
+1 },
663 N_("Informative output:"), GRID
},
665 {"verbose", 'v', 0, 0,
666 N_("verbosely list files processed"), GRID
+1 },
667 {"checkpoint", CHECKPOINT_OPTION
, N_("[.]NUMBER"), OPTION_ARG_OPTIONAL
,
668 N_("display progress messages every NUMBERth record (default 10)"),
670 {"check-links", 'l', 0, 0,
671 N_("print a message if not all links are dumped"), GRID
+1 },
672 {"totals", TOTALS_OPTION
, N_("SIGNAL"), OPTION_ARG_OPTIONAL
,
673 N_("print total bytes after processing the archive; "
674 "with an argument - print total bytes when this SIGNAL is delivered; "
675 "Allowed signals are: SIGHUP, SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; "
676 "the names without SIG prefix are also accepted"), GRID
+1 },
677 {"utc", UTC_OPTION
, 0, 0,
678 N_("print file modification dates in UTC"), GRID
+1 },
679 {"index-file", INDEX_FILE_OPTION
, N_("FILE"), 0,
680 N_("send verbose output to FILE"), GRID
+1 },
681 {"block-number", 'R', 0, 0,
682 N_("show block number within archive with each message"), GRID
+1 },
683 {"interactive", 'w', 0, 0,
684 N_("ask for confirmation for every action"), GRID
+1 },
685 {"confirmation", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
686 {"show-defaults", SHOW_DEFAULTS_OPTION
, 0, 0,
687 N_("show tar defaults"), GRID
+1 },
688 {"show-omitted-dirs", SHOW_OMITTED_DIRS_OPTION
, 0, 0,
689 N_("when listing or extracting, list each directory that does not match search criteria"), GRID
+1 },
690 {"show-transformed-names", SHOW_TRANSFORMED_NAMES_OPTION
, 0, 0,
691 N_("show file or archive names after transformation"),
693 {"show-stored-names", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
694 {"quoting-style", QUOTING_STYLE_OPTION
, N_("STYLE"), 0,
695 N_("set name quoting style; see below for valid STYLE values"), GRID
+1 },
696 {"quote-chars", QUOTE_CHARS_OPTION
, N_("STRING"), 0,
697 N_("additionally quote characters from STRING"), GRID
+1 },
698 {"no-quote-chars", NO_QUOTE_CHARS_OPTION
, N_("STRING"), 0,
699 N_("disable quoting for characters from STRING"), GRID
+1 },
704 N_("Compatibility options:"), GRID
},
707 N_("when creating, same as --old-archive; when extracting, same as --no-same-owner"), GRID
+1 },
712 N_("Other options:"), GRID
},
714 {"restrict", RESTRICT_OPTION
, 0, 0,
715 N_("disable use of some potentially harmful options"), -1 },
717 {"help", '?', 0, 0, N_("give this help list"), -1},
718 {"usage", USAGE_OPTION
, 0, 0, N_("give a short usage message"), -1},
719 {"version", VERSION_OPTION
, 0, 0, N_("print program version"), -1},
720 /* FIXME -V (--label) conflicts with the default short option for
722 {"HANG", HANG_OPTION
, "SECS", OPTION_ARG_OPTIONAL
| OPTION_HIDDEN
,
723 N_("hang for SECS seconds (default 3600)"), 0},
729 static char const *const atime_preserve_args
[] =
731 "replace", "system", NULL
734 static enum atime_preserve
const atime_preserve_types
[] =
736 replace_atime_preserve
, system_atime_preserve
739 /* Make sure atime_preserve_types has as much entries as atime_preserve_args
740 (minus 1 for NULL guard) */
741 ARGMATCH_VERIFY (atime_preserve_args
, atime_preserve_types
);
743 /* Wildcard matching settings */
746 default_wildcards
, /* For exclusion == enable_wildcards,
747 for inclusion == disable_wildcards */
752 struct tar_args
/* Variables used during option parsing */
754 struct textual_date
*textual_date
; /* Keeps the arguments to --newer-mtime
755 and/or --date option if they are
757 enum wildcards wildcards
; /* Wildcard settings (--wildcards/
759 int matching_flags
; /* exclude_fnmatch options */
760 int include_anchored
; /* Pattern anchoring options used for
762 bool o_option
; /* True if -o option was given */
763 bool pax_option
; /* True if --pax-option was given */
764 char const *backup_suffix_string
; /* --suffix option argument */
765 char const *version_control_string
; /* --backup option argument */
766 bool input_files
; /* True if some input files where given */
769 #define MAKE_EXCL_OPTIONS(args) \
770 ((((args)->wildcards != disable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
771 | (args)->matching_flags \
774 #define MAKE_INCL_OPTIONS(args) \
775 ((((args)->wildcards == enable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
776 | (args)->include_anchored \
777 | (args)->matching_flags \
781 # define DECL_SHOW_DEFAULT_SETTINGS(stream, printer) \
784 "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s", \
785 archive_format_string (DEFAULT_ARCHIVE_FORMAT), \
786 DEFAULT_ARCHIVE, DEFAULT_BLOCKING, \
787 quoting_style_args[DEFAULT_QUOTING_STYLE], \
788 DEFAULT_RMT_COMMAND); \
789 printer (stream, " --rsh-command=%s", REMOTE_SHELL); \
790 printer (stream, "\n"); \
793 # define DECL_SHOW_DEFAULT_SETTINGS(stream, printer) \
796 "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s", \
797 archive_format_string (DEFAULT_ARCHIVE_FORMAT), \
798 DEFAULT_ARCHIVE, DEFAULT_BLOCKING, \
799 quoting_style_args[DEFAULT_QUOTING_STYLE], \
800 DEFAULT_RMT_COMMAND); \
801 printer (stream, "\n"); \
806 show_default_settings (FILE *fp
)
807 DECL_SHOW_DEFAULT_SETTINGS(fp
, fprintf
)
810 show_default_settings_fs (argp_fmtstream_t fs
)
811 DECL_SHOW_DEFAULT_SETTINGS(fs
, argp_fmtstream_printf
)
814 set_subcommand_option (enum subcommand subcommand
)
816 if (subcommand_option
!= UNKNOWN_SUBCOMMAND
817 && subcommand_option
!= subcommand
)
819 _("You may not specify more than one `-Acdtrux' option")));
821 subcommand_option
= subcommand
;
825 set_use_compress_program_option (const char *string
)
827 if (use_compress_program_option
828 && strcmp (use_compress_program_option
, string
) != 0)
829 USAGE_ERROR ((0, 0, _("Conflicting compression options")));
831 use_compress_program_option
= string
;
838 print_total_stats ();
839 #ifndef HAVE_SIGACTION
840 signal (signo
, sigstat
);
845 stat_on_signal (int signo
)
847 #ifdef HAVE_SIGACTION
848 struct sigaction act
;
849 act
.sa_handler
= sigstat
;
850 sigemptyset (&act
.sa_mask
);
852 sigaction (signo
, &act
, NULL
);
854 signal (signo
, sigstat
);
859 set_stat_signal (const char *name
)
866 { "SIGUSR1", SIGUSR1
},
868 { "SIGUSR2", SIGUSR2
},
870 { "SIGHUP", SIGHUP
},
872 { "SIGINT", SIGINT
},
874 { "SIGQUIT", SIGQUIT
},
879 for (p
= sigtab
; p
< sigtab
+ sizeof (sigtab
) / sizeof (sigtab
[0]); p
++)
880 if (strcmp (p
->name
, name
) == 0)
882 stat_on_signal (p
->signo
);
885 FATAL_ERROR ((0, 0, _("Unknown signal name: %s"), name
));
891 struct textual_date
*next
;
898 get_date_or_file (struct tar_args
*args
, const char *option
,
899 const char *str
, struct timespec
*ts
)
901 if (FILE_SYSTEM_PREFIX_LEN (str
) != 0
906 if (deref_stat (dereference_option
, str
, &st
) != 0)
909 USAGE_ERROR ((0, 0, _("Date sample file not found")));
911 *ts
= get_stat_mtime (&st
);
915 if (! get_date (ts
, str
, NULL
))
917 WARN ((0, 0, _("Substituting %s for unknown date format %s"),
918 tartime (*ts
, false), quote (str
)));
923 struct textual_date
*p
= xmalloc (sizeof (*p
));
927 p
->next
= args
->textual_date
;
928 args
->textual_date
= p
;
934 report_textual_dates (struct tar_args
*args
)
936 struct textual_date
*p
;
937 for (p
= args
->textual_date
; p
; )
939 struct textual_date
*next
= p
->next
;
940 char const *treated_as
= tartime (*p
->ts
, true);
941 if (strcmp (p
->date
, treated_as
) != 0)
942 WARN ((0, 0, _("Option %s: Treating date `%s' as %s"),
943 p
->option
, p
->date
, treated_as
));
950 static volatile int _argp_hang
;
952 enum read_file_list_state
/* Result of reading file name from the list file */
954 file_list_success
, /* OK, name read successfully */
955 file_list_end
, /* End of list file */
956 file_list_zero
/* Zero separator encountered where it should not */
959 /* Read from FP a sequence of characters up to FILENAME_TERMINATOR and put them
962 static enum read_file_list_state
963 read_name_from_file (FILE *fp
, struct obstack
*stk
)
968 for (c
= getc (fp
); c
!= EOF
&& c
!= filename_terminator
; c
= getc (fp
))
972 /* We have read a zero separator. The file possibly is
974 /* FATAL_ERROR((0, 0, N_("file name contains null character"))); */
975 return file_list_zero
;
977 obstack_1grow (stk
, c
);
981 obstack_1grow (stk
, 0);
983 return (counter
== 0 && c
== EOF
) ? file_list_end
: file_list_success
;
987 static bool files_from_option
; /* When set, tar will not refuse to create
989 static struct obstack argv_stk
; /* Storage for additional command line options
990 read using -T option */
992 /* Prevent recursive inclusion of the same file */
995 struct file_id_list
*next
;
1000 static struct file_id_list
*file_id_list
;
1003 add_file_id (const char *filename
)
1005 struct file_id_list
*p
;
1008 if (stat (filename
, &st
))
1009 stat_fatal (filename
);
1010 for (p
= file_id_list
; p
; p
= p
->next
)
1011 if (p
->ino
== st
.st_ino
&& p
->dev
== st
.st_dev
)
1013 FATAL_ERROR ((0, 0, _("%s: file list already read"),
1014 quotearg_colon (filename
)));
1016 p
= xmalloc (sizeof *p
);
1017 p
->next
= file_id_list
;
1023 /* Default density numbers for [0-9][lmh] device specifications */
1025 #ifndef LOW_DENSITY_NUM
1026 # define LOW_DENSITY_NUM 0
1029 #ifndef MID_DENSITY_NUM
1030 # define MID_DENSITY_NUM 8
1033 #ifndef HIGH_DENSITY_NUM
1034 # define HIGH_DENSITY_NUM 16
1038 update_argv (const char *filename
, struct argp_state
*state
)
1041 size_t count
= 0, i
;
1045 bool is_stdin
= false;
1046 enum read_file_list_state read_state
;
1048 if (!strcmp (filename
, "-"))
1051 request_stdin ("-T");
1056 add_file_id (filename
);
1057 if ((fp
= fopen (filename
, "r")) == NULL
)
1058 open_fatal (filename
);
1061 while ((read_state
= read_name_from_file (fp
, &argv_stk
)) == file_list_success
)
1064 if (read_state
== file_list_zero
)
1068 WARN ((0, 0, N_("%s: file name read contains nul character"),
1069 quotearg_colon (filename
)));
1071 /* Prepare new stack contents */
1072 size
= obstack_object_size (&argv_stk
);
1073 p
= obstack_finish (&argv_stk
);
1074 for (; size
> 0; size
--, p
++)
1076 obstack_1grow (&argv_stk
, *p
);
1078 obstack_1grow (&argv_stk
, '\n');
1079 obstack_1grow (&argv_stk
, 0);
1082 /* Read rest of files using new filename terminator */
1083 filename_terminator
= 0;
1084 while (read_name_from_file (fp
, &argv_stk
) == file_list_success
)
1094 start
= obstack_finish (&argv_stk
);
1096 if (filename_terminator
== 0)
1097 for (p
= start
; *p
; p
+= strlen (p
) + 1)
1101 new_argc
= state
->argc
+ count
;
1102 new_argv
= xmalloc (sizeof (state
->argv
[0]) * (new_argc
+ 1));
1103 memcpy (new_argv
, state
->argv
, sizeof (state
->argv
[0]) * (state
->argc
+ 1));
1104 state
->argv
= new_argv
;
1105 memmove (&state
->argv
[state
->next
+ count
], &state
->argv
[state
->next
],
1106 (state
->argc
- state
->next
+ 1) * sizeof (state
->argv
[0]));
1108 state
->argc
= new_argc
;
1110 for (i
= state
->next
, p
= start
; *p
; p
+= strlen (p
) + 1, i
++)
1112 if (filename_terminator
== 0 && p
[0] == '-')
1113 state
->argv
[i
++] = "--add-file";
1120 tar_help (struct argp_state
*state
)
1122 argp_fmtstream_t fs
;
1123 state
->flags
|= ARGP_NO_EXIT
;
1124 argp_state_help (state
, state
->out_stream
,
1125 ARGP_HELP_STD_HELP
& ~ARGP_HELP_BUG_ADDR
);
1126 /* FIXME: use struct uparams.rmargin (from argp-help.c) instead of 79 */
1127 fs
= argp_make_fmtstream (state
->out_stream
, 0, 79, 0);
1129 argp_fmtstream_printf (fs
, "\n%s\n\n",
1130 _("Valid arguments for --quoting-style options are:"));
1131 tar_list_quoting_styles (fs
, " ");
1133 argp_fmtstream_puts (fs
, _("\n*This* tar defaults to:\n"));
1134 show_default_settings_fs (fs
);
1135 argp_fmtstream_putc (fs
, '\n');
1136 argp_fmtstream_printf (fs
, _("Report bugs to %s.\n"),
1137 argp_program_bug_address
);
1138 argp_fmtstream_free (fs
);
1142 parse_opt (int key
, char *arg
, struct argp_state
*state
)
1144 struct tar_args
*args
= state
->input
;
1149 /* File name or non-parsed option, because of ARGP_IN_ORDER */
1150 name_add_name (arg
, MAKE_INCL_OPTIONS (args
));
1151 args
->input_files
= true;
1155 set_subcommand_option (CAT_SUBCOMMAND
);
1161 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1162 && u
== (blocking_factor
= u
)
1163 && 0 < blocking_factor
1164 && u
== (record_size
= u
* BLOCKSIZE
) / BLOCKSIZE
))
1165 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1166 _("Invalid blocking factor")));
1171 /* Try to reblock input records. For reading 4.2BSD pipes. */
1173 /* It would surely make sense to exchange -B and -R, but it seems
1174 that -B has been used for a long while in Sun tar and most
1175 BSD-derived systems. This is a consequence of the block/record
1176 terminology confusion. */
1178 read_full_records_option
= true;
1182 set_subcommand_option (CREATE_SUBCOMMAND
);
1190 set_subcommand_option (DIFF_SUBCOMMAND
);
1194 if (archive_names
== allocated_archive_names
)
1195 archive_name_array
= x2nrealloc (archive_name_array
,
1196 &allocated_archive_names
,
1197 sizeof (archive_name_array
[0]));
1199 archive_name_array
[archive_names
++] = arg
;
1203 /* Since -F is only useful with -M, make it implied. Run this
1204 script at the end of each tape. */
1206 info_script_option
= arg
;
1207 multi_volume_option
= true;
1211 listed_incremental_option
= arg
;
1212 after_date_option
= true;
1216 /* We are making an incremental dump (FIXME: are we?); save
1217 directories at the beginning of the archive, and include in each
1218 directory its contents. */
1220 incremental_option
= true;
1224 /* Follow symbolic links. */
1225 dereference_option
= true;
1229 /* Ignore zero blocks (eofs). This can't be the default,
1230 because Unix tar writes two blocks of zeros, then pads out
1231 the record with garbage. */
1233 ignore_zeros_option
= true;
1238 _("Warning: the -I option is not supported;"
1239 " perhaps you meant -j or -T?")));
1243 set_use_compress_program_option ("bzip2");
1247 /* Don't replace existing files. */
1248 old_files_option
= KEEP_OLD_FILES
;
1252 starting_file_option
= true;
1256 case ONE_FILE_SYSTEM_OPTION
:
1257 /* When dumping directories, don't dump files/subdirectories
1258 that are on other filesystems. */
1259 one_file_system_option
= true;
1263 check_links_option
= 1;
1269 if (xstrtoumax (arg
, 0, 10, &u
, "") != LONGINT_OK
)
1270 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1271 _("Invalid tape length")));
1272 tape_length_option
= 1024 * (tarlong
) u
;
1273 multi_volume_option
= true;
1278 touch_option
= true;
1282 /* Make multivolume archive: when we can't write any more into
1283 the archive, re-open it, and continue writing. */
1285 multi_volume_option
= true;
1289 get_date_or_file (args
, "--mtime", arg
, &mtime_option
);
1290 set_mtime_option
= true;
1294 seekable_archive
= true;
1298 after_date_option
= true;
1301 case NEWER_MTIME_OPTION
:
1302 if (NEWER_OPTION_INITIALIZED (newer_mtime_option
))
1303 USAGE_ERROR ((0, 0, _("More than one threshold date")));
1304 get_date_or_file (args
,
1305 key
== NEWER_MTIME_OPTION
? "--newer-mtime"
1306 : "--after-date", arg
, &newer_mtime_option
);
1310 args
->o_option
= true;
1314 to_stdout_option
= true;
1318 same_permissions_option
= true;
1322 absolute_names_option
= true;
1326 set_subcommand_option (APPEND_SUBCOMMAND
);
1330 /* Print block numbers for debugging bad tar archives. */
1332 /* It would surely make sense to exchange -B and -R, but it seems
1333 that -B has been used for a long while in Sun tar and most
1334 BSD-derived systems. This is a consequence of the block/record
1335 terminology confusion. */
1337 block_number_option
= true;
1341 /* Names to extract are sorted. */
1343 same_order_option
= true;
1347 sparse_option
= true;
1350 case SPARSE_VERSION_OPTION
:
1351 sparse_option
= true;
1354 tar_sparse_major
= strtoul (arg
, &p
, 10);
1358 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1359 tar_sparse_minor
= strtoul (p
+ 1, &p
, 10);
1361 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1367 set_subcommand_option (LIST_SUBCOMMAND
);
1371 case TEST_LABEL_OPTION
:
1372 set_subcommand_option (LIST_SUBCOMMAND
);
1373 test_label_option
= true;
1377 update_argv (arg
, state
);
1378 /* Indicate we've been given -T option. This is for backward
1379 compatibility only, so that `tar cfT archive /dev/null will
1381 files_from_option
= true;
1385 set_subcommand_option (UPDATE_SUBCOMMAND
);
1389 old_files_option
= UNLINK_FIRST_OLD_FILES
;
1401 volume_label_option
= arg
;
1405 interactive_option
= true;
1409 verify_option
= true;
1413 set_subcommand_option (EXTRACT_SUBCOMMAND
);
1417 if (add_exclude_file (add_exclude
, excluded
, arg
,
1418 MAKE_EXCL_OPTIONS (args
), '\n')
1422 FATAL_ERROR ((0, e
, "%s", quotearg_colon (arg
)));
1427 set_use_compress_program_option ("gzip");
1431 set_use_compress_program_option ("compress");
1434 case ANCHORED_OPTION
:
1435 args
->matching_flags
|= EXCLUDE_ANCHORED
;
1438 case ATIME_PRESERVE_OPTION
:
1439 atime_preserve_option
=
1441 ? XARGMATCH ("--atime-preserve", arg
,
1442 atime_preserve_args
, atime_preserve_types
)
1443 : replace_atime_preserve
);
1444 if (! O_NOATIME
&& atime_preserve_option
== system_atime_preserve
)
1446 _("--atime-preserve='system' is not supported"
1447 " on this platform")));
1450 case CHECKPOINT_OPTION
:
1457 checkpoint_style
= checkpoint_dot
;
1460 checkpoint_option
= strtoul (arg
, &p
, 0);
1463 _("--checkpoint value is not an integer")));
1466 checkpoint_option
= 10;
1470 backup_option
= true;
1472 args
->version_control_string
= arg
;
1475 case DELAY_DIRECTORY_RESTORE_OPTION
:
1476 delay_directory_restore_option
= true;
1479 case NO_DELAY_DIRECTORY_RESTORE_OPTION
:
1480 delay_directory_restore_option
= false;
1484 set_subcommand_option (DELETE_SUBCOMMAND
);
1487 case EXCLUDE_OPTION
:
1488 add_exclude (excluded
, arg
, MAKE_EXCL_OPTIONS (args
));
1491 case EXCLUDE_CACHES_OPTION
:
1492 exclude_caches_option
= true;
1495 case FORCE_LOCAL_OPTION
:
1496 force_local_option
= true;
1500 set_archive_format (arg
);
1503 case INDEX_FILE_OPTION
:
1504 index_file_name
= arg
;
1507 case IGNORE_CASE_OPTION
:
1508 args
->matching_flags
|= FNM_CASEFOLD
;
1511 case IGNORE_COMMAND_ERROR_OPTION
:
1512 ignore_command_error_option
= true;
1515 case IGNORE_FAILED_READ_OPTION
:
1516 ignore_failed_read_option
= true;
1519 case KEEP_NEWER_FILES_OPTION
:
1520 old_files_option
= KEEP_NEWER_FILES
;
1524 if (! (strlen (arg
) < GNAME_FIELD_SIZE
1525 && gname_to_gid (arg
, &group_option
)))
1528 if (xstrtoumax (arg
, 0, 10, &g
, "") == LONGINT_OK
1532 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1533 _("%s: Invalid group")));
1538 mode_option
= mode_compile (arg
);
1540 FATAL_ERROR ((0, 0, _("Invalid mode given on option")));
1541 initial_umask
= umask (0);
1542 umask (initial_umask
);
1545 case NO_ANCHORED_OPTION
:
1546 args
->include_anchored
= 0; /* Clear the default for comman line args */
1547 args
->matching_flags
&= ~ EXCLUDE_ANCHORED
;
1550 case NO_IGNORE_CASE_OPTION
:
1551 args
->matching_flags
&= ~ FNM_CASEFOLD
;
1554 case NO_IGNORE_COMMAND_ERROR_OPTION
:
1555 ignore_command_error_option
= false;
1558 case NO_OVERWRITE_DIR_OPTION
:
1559 old_files_option
= NO_OVERWRITE_DIR_OLD_FILES
;
1562 case NO_QUOTE_CHARS_OPTION
:
1564 set_char_quoting (NULL
, *arg
, 0);
1567 case NO_WILDCARDS_OPTION
:
1568 args
->wildcards
= disable_wildcards
;
1571 case NO_WILDCARDS_MATCH_SLASH_OPTION
:
1572 args
->matching_flags
|= FNM_FILE_NAME
;
1576 filename_terminator
= '\0';
1579 case NUMERIC_OWNER_OPTION
:
1580 numeric_owner_option
= true;
1583 case OCCURRENCE_OPTION
:
1585 occurrence_option
= 1;
1589 if (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
)
1590 occurrence_option
= u
;
1592 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1593 _("Invalid number")));
1597 case OVERWRITE_DIR_OPTION
:
1598 old_files_option
= DEFAULT_OLD_FILES
;
1601 case OVERWRITE_OPTION
:
1602 old_files_option
= OVERWRITE_OLD_FILES
;
1606 if (! (strlen (arg
) < UNAME_FIELD_SIZE
1607 && uname_to_uid (arg
, &owner_option
)))
1610 if (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1614 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1615 _("Invalid owner")));
1619 case QUOTE_CHARS_OPTION
:
1621 set_char_quoting (NULL
, *arg
, 1);
1624 case QUOTING_STYLE_OPTION
:
1625 tar_set_quoting_style (arg
);
1629 args
->pax_option
= true;
1630 xheader_set_option (arg
);
1634 set_archive_format ("posix");
1637 case PRESERVE_OPTION
:
1638 /* FIXME: What it is good for? */
1639 same_permissions_option
= true;
1640 same_order_option
= true;
1643 case RECORD_SIZE_OPTION
:
1646 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1647 && u
== (size_t) u
))
1648 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1649 _("Invalid record size")));
1651 if (record_size
% BLOCKSIZE
!= 0)
1652 USAGE_ERROR ((0, 0, _("Record size must be a multiple of %d."),
1654 blocking_factor
= record_size
/ BLOCKSIZE
;
1658 case RECURSIVE_UNLINK_OPTION
:
1659 recursive_unlink_option
= true;
1662 case REMOVE_FILES_OPTION
:
1663 remove_files_option
= true;
1666 case RESTRICT_OPTION
:
1667 restrict_option
= true;
1670 case RMT_COMMAND_OPTION
:
1674 case RSH_COMMAND_OPTION
:
1675 rsh_command_option
= arg
;
1678 case SHOW_DEFAULTS_OPTION
:
1679 show_default_settings (stdout
);
1683 case STRIP_COMPONENTS_OPTION
:
1686 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1687 && u
== (size_t) u
))
1688 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1689 _("Invalid number of elements")));
1690 strip_name_components
= u
;
1694 case SHOW_OMITTED_DIRS_OPTION
:
1695 show_omitted_dirs_option
= true;
1698 case SHOW_TRANSFORMED_NAMES_OPTION
:
1699 show_transformed_names_option
= true;
1703 backup_option
= true;
1704 args
->backup_suffix_string
= arg
;
1707 case TO_COMMAND_OPTION
:
1708 if (to_command_option
)
1709 USAGE_ERROR ((0, 0, _("Only one --to-command option allowed")));
1710 to_command_option
= arg
;
1715 set_stat_signal (arg
);
1717 totals_option
= true;
1720 case TRANSFORM_OPTION
:
1721 set_transform_expr (arg
);
1724 case USE_COMPRESS_PROGRAM_OPTION
:
1725 set_use_compress_program_option (arg
);
1728 case VOLNO_FILE_OPTION
:
1729 volno_file_option
= arg
;
1732 case WILDCARDS_OPTION
:
1733 args
->wildcards
= enable_wildcards
;
1736 case WILDCARDS_MATCH_SLASH_OPTION
:
1737 args
->matching_flags
&= ~ FNM_FILE_NAME
;
1740 case NO_RECURSION_OPTION
:
1741 recursion_option
= 0;
1744 case NO_SAME_OWNER_OPTION
:
1745 same_owner_option
= -1;
1748 case NO_SAME_PERMISSIONS_OPTION
:
1749 same_permissions_option
= -1;
1752 case RECURSION_OPTION
:
1753 recursion_option
= FNM_LEADING_DIR
;
1756 case SAME_OWNER_OPTION
:
1757 same_owner_option
= 1;
1760 case UNQUOTE_OPTION
:
1761 unquote_option
= true;
1764 case NO_UNQUOTE_OPTION
:
1765 unquote_option
= false;
1777 #ifdef DEVICE_PREFIX
1779 int device
= key
- '0';
1781 static char buf
[sizeof DEVICE_PREFIX
+ 10];
1785 argp_error (state
, _("Malformed density argument: %s"), quote (arg
));
1787 strcpy (buf
, DEVICE_PREFIX
);
1788 cursor
= buf
+ strlen (buf
);
1790 #ifdef DENSITY_LETTER
1792 sprintf (cursor
, "%d%c", device
, arg
[0]);
1794 #else /* not DENSITY_LETTER */
1799 device
+= LOW_DENSITY_NUM
;
1803 device
+= MID_DENSITY_NUM
;
1807 device
+= HIGH_DENSITY_NUM
;
1811 argp_error (state
, _("Unknown density: `%c'"), arg
[0]);
1813 sprintf (cursor
, "%d", device
);
1815 #endif /* not DENSITY_LETTER */
1817 if (archive_names
== allocated_archive_names
)
1818 archive_name_array
= x2nrealloc (archive_name_array
,
1819 &allocated_archive_names
,
1820 sizeof (archive_name_array
[0]));
1821 archive_name_array
[archive_names
++] = xstrdup (buf
);
1825 #else /* not DEVICE_PREFIX */
1828 _("Options `-[0-7][lmh]' not supported by *this* tar"));
1830 #endif /* not DEVICE_PREFIX */
1838 argp_state_help (state
, state
->out_stream
, ARGP_HELP_USAGE
);
1842 case VERSION_OPTION
:
1843 version_etc (state
->out_stream
, "tar", PACKAGE_NAME
, VERSION
,
1844 "John Gilmore", "Jay Fenlason", (char *) NULL
);
1849 _argp_hang
= atoi (arg
? arg
: "3600");
1850 while (_argp_hang
-- > 0)
1855 return ARGP_ERR_UNKNOWN
;
1860 static struct argp argp
= {
1873 argp_help (&argp
, stderr
, ARGP_HELP_SEE
, (char*) program_name
);
1878 /* Parse the options for tar. */
1880 static struct argp_option
*
1881 find_argp_option (struct argp_option
*options
, int letter
)
1884 !(options
->name
== NULL
1885 && options
->key
== 0
1886 && options
->arg
== 0
1887 && options
->flags
== 0
1888 && options
->doc
== NULL
); options
++)
1889 if (options
->key
== letter
)
1895 decode_options (int argc
, char **argv
)
1898 struct tar_args args
;
1900 /* Set some default option values. */
1901 args
.textual_date
= NULL
;
1902 args
.wildcards
= default_wildcards
;
1903 args
.matching_flags
= 0;
1904 args
.include_anchored
= EXCLUDE_ANCHORED
;
1905 args
.o_option
= false;
1906 args
.pax_option
= false;
1907 args
.backup_suffix_string
= getenv ("SIMPLE_BACKUP_SUFFIX");
1908 args
.version_control_string
= 0;
1909 args
.input_files
= false;
1911 subcommand_option
= UNKNOWN_SUBCOMMAND
;
1912 archive_format
= DEFAULT_FORMAT
;
1913 blocking_factor
= DEFAULT_BLOCKING
;
1914 record_size
= DEFAULT_BLOCKING
* BLOCKSIZE
;
1915 excluded
= new_exclude ();
1916 newer_mtime_option
.tv_sec
= TYPE_MINIMUM (time_t);
1917 newer_mtime_option
.tv_nsec
= -1;
1918 recursion_option
= FNM_LEADING_DIR
;
1919 unquote_option
= true;
1920 tar_sparse_major
= 1;
1921 tar_sparse_minor
= 0;
1926 /* Convert old-style tar call by exploding option element and rearranging
1927 options accordingly. */
1929 if (argc
> 1 && argv
[1][0] != '-')
1931 int new_argc
; /* argc value for rearranged arguments */
1932 char **new_argv
; /* argv value for rearranged arguments */
1933 char *const *in
; /* cursor into original argv */
1934 char **out
; /* cursor into rearranged argv */
1935 const char *letter
; /* cursor into old option letters */
1936 char buffer
[3]; /* constructed option buffer */
1938 /* Initialize a constructed option. */
1943 /* Allocate a new argument array, and copy program name in it. */
1945 new_argc
= argc
- 1 + strlen (argv
[1]);
1946 new_argv
= xmalloc ((new_argc
+ 1) * sizeof (char *));
1951 /* Copy each old letter option as a separate option, and have the
1952 corresponding argument moved next to it. */
1954 for (letter
= *in
++; *letter
; letter
++)
1956 struct argp_option
*opt
;
1958 buffer
[1] = *letter
;
1959 *out
++ = xstrdup (buffer
);
1960 opt
= find_argp_option (options
, *letter
);
1961 if (opt
&& opt
->arg
)
1963 if (in
< argv
+ argc
)
1966 USAGE_ERROR ((0, 0, _("Old option `%c' requires an argument."),
1971 /* Copy all remaining options. */
1973 while (in
< argv
+ argc
)
1977 /* Replace the old option list by the new one. */
1983 /* Parse all options and non-options as they appear. */
1985 prepend_default_options (getenv ("TAR_OPTIONS"), &argc
, &argv
);
1987 if (argp_parse (&argp
, argc
, argv
, ARGP_IN_ORDER
|ARGP_NO_HELP
,
1989 exit (TAREXIT_FAILURE
);
1992 /* Special handling for 'o' option:
1994 GNU tar used to say "output old format".
1995 UNIX98 tar says don't chown files after extracting (we use
1996 "--no-same-owner" for this).
1998 The old GNU tar semantics is retained when used with --create
1999 option, otherwise UNIX98 semantics is assumed */
2003 if (subcommand_option
== CREATE_SUBCOMMAND
)
2005 /* GNU Tar <= 1.13 compatibility */
2006 set_archive_format ("v7");
2010 /* UNIX98 compatibility */
2011 same_owner_option
= -1;
2015 /* Handle operands after any "--" argument. */
2016 for (; index
< argc
; index
++)
2018 name_add_name (argv
[index
], MAKE_INCL_OPTIONS (&args
));
2019 args
.input_files
= true;
2022 /* Warn about implicit use of the wildcards in command line arguments.
2024 warn_regex_usage
= args
.wildcards
== default_wildcards
;
2026 /* Derive option values and check option consistency. */
2028 if (archive_format
== DEFAULT_FORMAT
)
2030 if (args
.pax_option
)
2031 archive_format
= POSIX_FORMAT
;
2033 archive_format
= DEFAULT_ARCHIVE_FORMAT
;
2036 if ((volume_label_option
&& subcommand_option
== CREATE_SUBCOMMAND
)
2037 || incremental_option
2038 || multi_volume_option
2040 assert_format (FORMAT_MASK (OLDGNU_FORMAT
)
2041 | FORMAT_MASK (GNU_FORMAT
)
2042 | FORMAT_MASK (POSIX_FORMAT
));
2044 if (occurrence_option
)
2046 if (!args
.input_files
)
2048 _("--occurrence is meaningless without a file list")));
2049 if (subcommand_option
!= DELETE_SUBCOMMAND
2050 && subcommand_option
!= DIFF_SUBCOMMAND
2051 && subcommand_option
!= EXTRACT_SUBCOMMAND
2052 && subcommand_option
!= LIST_SUBCOMMAND
)
2054 _("--occurrence cannot be used in the requested operation mode")));
2057 if (seekable_archive
&& subcommand_option
== DELETE_SUBCOMMAND
)
2059 /* The current code in delete.c is based on the assumption that
2060 skip_member() reads all data from the archive. So, we should
2061 make sure it won't use seeks. On the other hand, the same code
2062 depends on the ability to backspace a record in the archive,
2063 so setting seekable_archive to false is technically incorrect.
2064 However, it is tested only in skip_member(), so it's not a
2066 seekable_archive
= false;
2069 if (archive_names
== 0)
2071 /* If no archive file name given, try TAPE from the environment, or
2072 else, DEFAULT_ARCHIVE from the configuration process. */
2075 archive_name_array
[0] = getenv ("TAPE");
2076 if (! archive_name_array
[0])
2077 archive_name_array
[0] = DEFAULT_ARCHIVE
;
2080 /* Allow multiple archives only with `-M'. */
2082 if (archive_names
> 1 && !multi_volume_option
)
2084 _("Multiple archive files require `-M' option")));
2086 if (listed_incremental_option
2087 && NEWER_OPTION_INITIALIZED (newer_mtime_option
))
2089 _("Cannot combine --listed-incremental with --newer")));
2091 if (volume_label_option
)
2093 if (archive_format
== GNU_FORMAT
|| archive_format
== OLDGNU_FORMAT
)
2095 size_t volume_label_max_len
=
2096 (sizeof current_header
->header
.name
2097 - 1 /* for trailing '\0' */
2098 - (multi_volume_option
2099 ? (sizeof " Volume "
2100 - 1 /* for null at end of " Volume " */
2101 + INT_STRLEN_BOUND (int) /* for volume number */
2102 - 1 /* for sign, as 0 <= volno */)
2104 if (volume_label_max_len
< strlen (volume_label_option
))
2106 ngettext ("%s: Volume label is too long (limit is %lu byte)",
2107 "%s: Volume label is too long (limit is %lu bytes)",
2108 volume_label_max_len
),
2109 quotearg_colon (volume_label_option
),
2110 (unsigned long) volume_label_max_len
));
2113 Label length in PAX format is limited by the volume size. */
2118 if (multi_volume_option
)
2119 USAGE_ERROR ((0, 0, _("Cannot verify multi-volume archives")));
2120 if (use_compress_program_option
)
2121 USAGE_ERROR ((0, 0, _("Cannot verify compressed archives")));
2124 if (use_compress_program_option
)
2126 if (multi_volume_option
)
2127 USAGE_ERROR ((0, 0, _("Cannot use multi-volume compressed archives")));
2128 if (subcommand_option
== UPDATE_SUBCOMMAND
2129 || subcommand_option
== APPEND_SUBCOMMAND
2130 || subcommand_option
== DELETE_SUBCOMMAND
)
2131 USAGE_ERROR ((0, 0, _("Cannot update compressed archives")));
2132 if (subcommand_option
== CAT_SUBCOMMAND
)
2133 USAGE_ERROR ((0, 0, _("Cannot concatenate compressed archives")));
2136 /* It is no harm to use --pax-option on non-pax archives in archive
2137 reading mode. It may even be useful, since it allows to override
2138 file attributes from tar headers. Therefore I allow such usage.
2141 && archive_format
!= POSIX_FORMAT
2142 && (subcommand_option
!= EXTRACT_SUBCOMMAND
2143 || subcommand_option
!= DIFF_SUBCOMMAND
2144 || subcommand_option
!= LIST_SUBCOMMAND
))
2145 USAGE_ERROR ((0, 0, _("--pax-option can be used only on POSIX archives")));
2147 /* If ready to unlink hierarchies, so we are for simpler files. */
2148 if (recursive_unlink_option
)
2149 old_files_option
= UNLINK_FIRST_OLD_FILES
;
2152 if (test_label_option
)
2154 /* --test-label is silent if the user has specified the label name to
2156 if (!args
.input_files
)
2159 else if (utc_option
)
2162 /* Forbid using -c with no input files whatsoever. Check that `-f -',
2163 explicit or implied, is used correctly. */
2165 switch (subcommand_option
)
2167 case CREATE_SUBCOMMAND
:
2168 if (!args
.input_files
&& !files_from_option
)
2170 _("Cowardly refusing to create an empty archive")));
2173 case EXTRACT_SUBCOMMAND
:
2174 case LIST_SUBCOMMAND
:
2175 case DIFF_SUBCOMMAND
:
2176 for (archive_name_cursor
= archive_name_array
;
2177 archive_name_cursor
< archive_name_array
+ archive_names
;
2178 archive_name_cursor
++)
2179 if (!strcmp (*archive_name_cursor
, "-"))
2180 request_stdin ("-f");
2183 case CAT_SUBCOMMAND
:
2184 case UPDATE_SUBCOMMAND
:
2185 case APPEND_SUBCOMMAND
:
2186 for (archive_name_cursor
= archive_name_array
;
2187 archive_name_cursor
< archive_name_array
+ archive_names
;
2188 archive_name_cursor
++)
2189 if (!strcmp (*archive_name_cursor
, "-"))
2191 _("Options `-Aru' are incompatible with `-f -'")));
2197 /* Initialize stdlis */
2198 if (index_file_name
)
2200 stdlis
= fopen (index_file_name
, "w");
2202 open_error (index_file_name
);
2205 stdlis
= to_stdout_option
? stderr
: stdout
;
2207 archive_name_cursor
= archive_name_array
;
2209 /* Prepare for generating backup names. */
2211 if (args
.backup_suffix_string
)
2212 simple_backup_suffix
= xstrdup (args
.backup_suffix_string
);
2216 backup_type
= xget_version ("--backup", args
.version_control_string
);
2217 /* No backup is needed either if explicitely disabled or if
2218 the extracted files are not being written to disk. */
2219 if (backup_type
== no_backups
|| EXTRACT_OVER_PIPE
)
2220 backup_option
= false;
2224 report_textual_dates (&args
);
2230 /* Main routine for tar. */
2232 main (int argc
, char **argv
)
2235 program_name
= argv
[0];
2237 setlocale (LC_ALL
, "");
2238 bindtextdomain (PACKAGE
, LOCALEDIR
);
2239 textdomain (PACKAGE
);
2241 exit_failure
= TAREXIT_FAILURE
;
2242 exit_status
= TAREXIT_SUCCESS
;
2243 filename_terminator
= '\n';
2244 set_quoting_style (0, DEFAULT_QUOTING_STYLE
);
2246 /* Make sure we have first three descriptors available */
2249 /* Close all inherited open descriptors, except for the first three */
2252 /* Pre-allocate a few structures. */
2254 allocated_archive_names
= 10;
2255 archive_name_array
=
2256 xmalloc (sizeof (const char *) * allocated_archive_names
);
2259 obstack_init (&argv_stk
);
2262 /* System V fork+wait does not work if SIGCHLD is ignored. */
2263 signal (SIGCHLD
, SIG_DFL
);
2266 /* Decode options. */
2268 decode_options (argc
, argv
);
2271 /* Main command execution. */
2273 if (volno_file_option
)
2274 init_volume_number ();
2276 switch (subcommand_option
)
2278 case UNKNOWN_SUBCOMMAND
:
2280 _("You must specify one of the `-Acdtrux' options")));
2282 case CAT_SUBCOMMAND
:
2283 case UPDATE_SUBCOMMAND
:
2284 case APPEND_SUBCOMMAND
:
2288 case DELETE_SUBCOMMAND
:
2289 delete_archive_members ();
2292 case CREATE_SUBCOMMAND
:
2296 case EXTRACT_SUBCOMMAND
:
2298 read_and (extract_archive
);
2300 /* FIXME: should extract_finish () even if an ordinary signal is
2306 case LIST_SUBCOMMAND
:
2307 read_and (list_archive
);
2310 case DIFF_SUBCOMMAND
:
2312 read_and (diff_archive
);
2317 print_total_stats ();
2319 if (check_links_option
)
2322 if (volno_file_option
)
2323 closeout_volume_number ();
2325 /* Dispose of allocated memory, and return. */
2327 free (archive_name_array
);
2330 if (stdlis
== stdout
)
2333 if (exit_status
== TAREXIT_FAILURE
)
2334 error (0, 0, _("Error exit delayed from previous errors"));
2335 if (ferror (stderr
) || fclose (stderr
) != 0)
2336 exit_status
= TAREXIT_FAILURE
;
2341 tar_stat_init (struct tar_stat_info
*st
)
2343 memset (st
, 0, sizeof (*st
));
2347 tar_stat_destroy (struct tar_stat_info
*st
)
2349 free (st
->orig_file_name
);
2350 free (st
->file_name
);
2351 free (st
->link_name
);
2354 free (st
->sparse_map
);
2356 memset (st
, 0, sizeof (*st
));
2359 /* Format mask for all available formats that support nanosecond
2360 timestamp resolution. */
2361 #define NS_PRECISION_FORMAT_MASK FORMAT_MASK (POSIX_FORMAT)
2363 /* Same as timespec_cmp, but ignore nanoseconds if current archive
2364 format does not provide sufficient resolution. */
2366 tar_timespec_cmp (struct timespec a
, struct timespec b
)
2368 if (!(FORMAT_MASK (current_format
) & NS_PRECISION_FORMAT_MASK
))
2369 a
.tv_nsec
= b
.tv_nsec
= 0;
2370 return timespec_cmp (a
, b
);