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>
30 #if ! defined SIGCHLD && defined SIGCLD
31 # define SIGCHLD SIGCLD
34 /* The following causes "common.h" to produce definitions of all the global
35 variables, rather than just "extern" declarations of them. GNU tar does
36 depend on the system loader to preset all GLOBAL variables to neutral (or
37 zero) values; explicit initialization is usually not done. */
45 #include <localedir.h>
49 #include <version-etc.h>
53 /* Local declarations. */
55 #ifndef DEFAULT_ARCHIVE_FORMAT
56 # define DEFAULT_ARCHIVE_FORMAT GNU_FORMAT
59 #ifndef DEFAULT_ARCHIVE
60 # define DEFAULT_ARCHIVE "tar.out"
63 #ifndef DEFAULT_BLOCKING
64 # define DEFAULT_BLOCKING 20
70 /* Name of option using stdin. */
71 static const char *stdin_used_by
;
73 /* Doesn't return if stdin already requested. */
75 request_stdin (const char *option
)
78 USAGE_ERROR ((0, 0, _("Options `-%s' and `-%s' both want standard input"),
79 stdin_used_by
, option
));
81 stdin_used_by
= option
;
84 extern int rpmatch (char const *response
);
86 /* Returns true if and only if the user typed an affirmative response. */
88 confirm (const char *message_action
, const char *message_name
)
90 static FILE *confirm_file
;
91 static int confirm_file_EOF
;
96 if (archive
== 0 || stdin_used_by
)
98 confirm_file
= fopen (TTY_NAME
, "r");
100 open_fatal (TTY_NAME
);
104 request_stdin ("-w");
105 confirm_file
= stdin
;
109 fprintf (stdlis
, "%s %s?", message_action
, quote (message_name
));
112 if (!confirm_file_EOF
)
114 char *response
= NULL
;
115 size_t response_size
= 0;
116 if (getline (&response
, &response_size
, confirm_file
) < 0)
117 confirm_file_EOF
= 1;
119 status
= rpmatch (response
) > 0;
123 if (confirm_file_EOF
)
125 fputc ('\n', stdlis
);
132 static struct fmttab
{
134 enum archive_format fmt
;
137 { "oldgnu", OLDGNU_FORMAT
},
138 { "ustar", USTAR_FORMAT
},
139 { "posix", POSIX_FORMAT
},
140 #if 0 /* not fully supported yet */
141 { "star", STAR_FORMAT
},
143 { "gnu", GNU_FORMAT
},
144 { "pax", POSIX_FORMAT
}, /* An alias for posix */
149 set_archive_format (char const *name
)
151 struct fmttab
const *p
;
153 for (p
= fmttab
; strcmp (p
->name
, name
) != 0; )
155 USAGE_ERROR ((0, 0, _("%s: Invalid archive format"),
156 quotearg_colon (name
)));
158 archive_format
= p
->fmt
;
162 archive_format_string (enum archive_format fmt
)
164 struct fmttab
const *p
;
166 for (p
= fmttab
; p
->name
; p
++)
172 #define FORMAT_MASK(n) (1<<(n))
175 assert_format(unsigned fmt_mask
)
177 if ((FORMAT_MASK (archive_format
) & fmt_mask
) == 0)
179 _("GNU features wanted on incompatible archive format")));
183 subcommand_string (enum subcommand c
)
187 case UNKNOWN_SUBCOMMAND
:
190 case APPEND_SUBCOMMAND
:
196 case CREATE_SUBCOMMAND
:
199 case DELETE_SUBCOMMAND
:
202 case DIFF_SUBCOMMAND
:
205 case EXTRACT_SUBCOMMAND
:
208 case LIST_SUBCOMMAND
:
211 case UPDATE_SUBCOMMAND
:
220 tar_list_quoting_styles (FILE *fp
, char *prefix
)
224 for (i
= 0; quoting_style_args
[i
]; i
++)
225 fprintf (fp
, "%s%s\n", prefix
, quoting_style_args
[i
]);
229 tar_set_quoting_style (char *arg
)
233 for (i
= 0; quoting_style_args
[i
]; i
++)
234 if (strcmp (arg
, quoting_style_args
[i
]) == 0)
236 set_quoting_style (NULL
, i
);
240 _("Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."), arg
, program_invocation_short_name
));
248 ANCHORED_OPTION
= CHAR_MAX
+ 1,
249 ATIME_PRESERVE_OPTION
,
252 DELAY_DIRECTORY_RESTORE_OPTION
,
254 EXCLUDE_CACHES_OPTION
,
260 IGNORE_COMMAND_ERROR_OPTION
,
261 IGNORE_FAILED_READ_OPTION
,
263 KEEP_NEWER_FILES_OPTION
,
267 NO_DELAY_DIRECTORY_RESTORE_OPTION
,
268 NO_IGNORE_CASE_OPTION
,
269 NO_IGNORE_COMMAND_ERROR_OPTION
,
270 NO_OVERWRITE_DIR_OPTION
,
271 NO_QUOTE_CHARS_OPTION
,
273 NO_SAME_OWNER_OPTION
,
274 NO_SAME_PERMISSIONS_OPTION
,
276 NO_WILDCARDS_MATCH_SLASH_OPTION
,
279 NUMERIC_OWNER_OPTION
,
282 ONE_FILE_SYSTEM_OPTION
,
289 QUOTING_STYLE_OPTION
,
292 RECURSIVE_UNLINK_OPTION
,
298 SHOW_DEFAULTS_OPTION
,
299 SHOW_OMITTED_DIRS_OPTION
,
300 SHOW_STORED_NAMES_OPTION
,
301 STRIP_COMPONENTS_OPTION
,
308 USE_COMPRESS_PROGRAM_OPTION
,
312 WILDCARDS_MATCH_SLASH_OPTION
,
316 const char *argp_program_version
= "tar (" PACKAGE_NAME
") " VERSION
;
317 const char *argp_program_bug_address
= "<" PACKAGE_BUGREPORT
">";
318 static char doc
[] = N_("GNU `tar' saves many files together into a single tape or disk archive, and can restore individual files from the archive.\n\
321 tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n\
322 tar -tvf archive.tar # List all files in archive.tar verbosely.\n\
323 tar -xf archive.tar # Extract all files from archive.tar.\n\
324 \vThe backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
325 The version control may be set with --backup or VERSION_CONTROL, values are:\n\n\
326 none, off never make backups\n\
327 t, numbered make numbered backups\n\
328 nil, existing numbered if numbered backups exist, simple otherwise\n\
329 never, simple always make simple backups\n");
334 Available option letters are DEIJQY and aeqy. Consider the following
337 [For Solaris tar compatibility =/= Is it important at all?]
338 e exit immediately with a nonzero exit status if unexpected errors occur
339 E use extended headers (--format=posix)
341 [q alias for --occurrence=1 =/= this would better be used for quiet?]
342 [I same as T =/= will harm star compatibility]
344 y per-file gzip compression
345 Y per-block gzip compression */
347 static struct argp_option options
[] = {
350 N_("Main operation mode:"), GRID
},
353 N_("list the contents of an archive"), GRID
+1 },
354 {"extract", 'x', 0, 0,
355 N_("extract files from an archive"), GRID
+1 },
356 {"get", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
357 {"create", 'c', 0, 0,
358 N_("create a new archive"), GRID
+1 },
360 N_("find differences between archive and file system"), GRID
+1 },
361 {"compare", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
362 {"append", 'r', 0, 0,
363 N_("append files to the end of an archive"), GRID
+1 },
364 {"update", 'u', 0, 0,
365 N_("only append files newer than copy in archive"), GRID
+1 },
366 {"catenate", 'A', 0, 0,
367 N_("append tar files to an archive"), GRID
+1 },
368 {"concatenate", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
369 {"delete", DELETE_OPTION
, 0, 0,
370 N_("delete from the archive (not on mag tapes!)"), GRID
+1 },
371 {"test-label", TEST_LABEL_OPTION
, NULL
, 0,
372 N_("test the archive volume label and exit"), GRID
+1 },
377 N_("Operation modifiers:"), GRID
},
379 {"sparse", 'S', 0, 0,
380 N_("handle sparse files efficiently"), GRID
+1 },
381 {"incremental", 'G', 0, 0,
382 N_("handle old GNU-format incremental backup"), GRID
+1 },
383 {"listed-incremental", 'g', N_("FILE"), 0,
384 N_("handle new GNU-format incremental backup"), GRID
+1 },
385 {"ignore-failed-read", IGNORE_FAILED_READ_OPTION
, 0, 0,
386 N_("do not exit with nonzero on unreadable files"), GRID
+1 },
387 {"occurrence", OCCURRENCE_OPTION
, N_("NUMBER"), OPTION_ARG_OPTIONAL
,
388 N_("process only the NUMBERth occurrence of each file in the archive;"
389 " this option is valid only in conjunction with one of the subcommands"
390 " --delete, --diff, --extract or --list and when a list of files"
391 " is given either on the command line or via the -T option;"
392 " NUMBER defaults to 1"), GRID
+1 },
393 {"seek", 'n', NULL
, 0,
394 N_("archive is seekable"), GRID
+1 },
399 N_("Overwrite control:\n"), GRID
+1 },
401 {"verify", 'W', 0, 0,
402 N_("attempt to verify the archive after writing it"), GRID
+1 },
403 {"remove-files", REMOVE_FILES_OPTION
, 0, 0,
404 N_("remove files after adding them to the archive"), GRID
+1 },
405 {"keep-old-files", 'k', 0, 0,
406 N_("don't replace existing files when extracting"), GRID
+1 },
407 {"keep-newer-files", KEEP_NEWER_FILES_OPTION
, 0, 0,
408 N_("don't replace existing files that are newer than their archive copies"), GRID
+1 },
409 {"overwrite", OVERWRITE_OPTION
, 0, 0,
410 N_("overwrite existing files when extracting"), GRID
+1 },
411 {"unlink-first", 'U', 0, 0,
412 N_("remove each file prior to extracting over it"), GRID
+1 },
413 {"recursive-unlink", RECURSIVE_UNLINK_OPTION
, 0, 0,
414 N_("empty hierarchies prior to extracting directory"), GRID
+1 },
415 {"no-overwrite-dir", NO_OVERWRITE_DIR_OPTION
, 0, 0,
416 N_("preserve metadata of existing directories"), GRID
+1 },
421 N_("Select output stream:"), GRID
},
423 {"to-stdout", 'O', 0, 0,
424 N_("extract files to standard output"), GRID
+1 },
425 {"to-command", TO_COMMAND_OPTION
, N_("COMMAND"), 0,
426 N_("pipe extracted files to another program"), GRID
+1 },
427 {"ignore-command-error", IGNORE_COMMAND_ERROR_OPTION
, 0, 0,
428 N_("ignore exit codes of children"), GRID
+1 },
429 {"no-ignore-command-error", NO_IGNORE_COMMAND_ERROR_OPTION
, 0, 0,
430 N_("treat non-zero exit codes of children as error"), GRID
+1 },
435 N_("Handling of file attributes:"), GRID
},
437 {"owner", OWNER_OPTION
, N_("NAME"), 0,
438 N_("force NAME as owner for added files"), GRID
+1 },
439 {"group", GROUP_OPTION
, N_("NAME"), 0,
440 N_("force NAME as group for added files"), GRID
+1 },
441 {"mode", MODE_OPTION
, N_("CHANGES"), 0,
442 N_("force (symbolic) mode CHANGES for added files"), GRID
+1 },
443 {"atime-preserve", ATIME_PRESERVE_OPTION
,
444 N_("METHOD"), OPTION_ARG_OPTIONAL
,
445 N_("preserve access times on dumped files, either by restoring the times"
446 " after reading (METHOD='replace'; default) or by not setting the times"
447 " in the first place (METHOD='system')"), GRID
+1 },
449 N_("don't extract file modified time"), GRID
+1 },
450 {"same-owner", SAME_OWNER_OPTION
, 0, 0,
451 N_("try extracting files with the same ownership"), GRID
+1 },
452 {"no-same-owner", NO_SAME_OWNER_OPTION
, 0, 0,
453 N_("extract files as yourself"), GRID
+1 },
454 {"numeric-owner", NUMERIC_OWNER_OPTION
, 0, 0,
455 N_("always use numbers for user/group names"), GRID
+1 },
456 {"preserve-permissions", 'p', 0, 0,
457 N_("extract information about file permissions (default for superuser)"),
459 {"same-permissions", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
460 {"no-same-permissions", NO_SAME_PERMISSIONS_OPTION
, 0, 0,
461 N_("apply the user's umask when extracting permissions from the archive (default for ordinary users)"), GRID
+1 },
462 {"preserve-order", 's', 0, 0,
463 N_("sort names to extract to match archive"), GRID
+1 },
464 {"same-order", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
465 {"preserve", PRESERVE_OPTION
, 0, 0,
466 N_("same as both -p and -s"), GRID
+1 },
467 {"delay-directory-restore", DELAY_DIRECTORY_RESTORE_OPTION
, 0, 0,
468 N_("delay setting modification times and permissions of extracted"
469 " directories until the end of extraction"), GRID
+1 },
470 {"no-delay-directory-restore", NO_DELAY_DIRECTORY_RESTORE_OPTION
, 0, 0,
471 N_("cancel the effect of --delay-directory-restore option"), GRID
+1 },
476 N_("Device selection and switching:\n"), GRID
+1 },
478 {"file", 'f', N_("ARCHIVE"), 0,
479 N_("use archive file or device ARCHIVE"), GRID
+1 },
480 {"force-local", FORCE_LOCAL_OPTION
, 0, 0,
481 N_("archive file is local even if it has a colon"), GRID
+1 },
482 {"rmt-command", RMT_COMMAND_OPTION
, N_("COMMAND"), 0,
483 N_("use given rmt COMMAND instead of rmt"), GRID
+1 },
484 {"rsh-command", RSH_COMMAND_OPTION
, N_("COMMAND"), 0,
485 N_("use remote COMMAND instead of rsh"), GRID
+1 },
487 {"-[0-7][lmh]", 0, NULL
, OPTION_DOC
, /* It is OK, since `name' will never be
489 N_("specify drive and density"), GRID
+1 },
491 {NULL
, '0', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
492 {NULL
, '1', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
493 {NULL
, '2', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
494 {NULL
, '3', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
495 {NULL
, '4', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
496 {NULL
, '5', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
497 {NULL
, '6', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
498 {NULL
, '7', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
499 {NULL
, '8', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
500 {NULL
, '9', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
502 {"multi-volume", 'M', 0, 0,
503 N_("create/list/extract multi-volume archive"), GRID
+1 },
504 {"tape-length", 'L', N_("NUMBER"), 0,
505 N_("change tape after writing NUMBER x 1024 bytes"), GRID
+1 },
506 {"info-script", 'F', N_("NAME"), 0,
507 N_("run script at end of each tape (implies -M)"), GRID
+1 },
508 {"new-volume-script", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
509 {"volno-file", VOLNO_FILE_OPTION
, N_("FILE"), 0,
510 N_("use/update the volume number in FILE"), GRID
+1 },
515 N_("Device blocking:"), GRID
+1 },
517 {"blocking-factor", 'b', N_("BLOCKS"), 0,
518 N_("BLOCKS x 512 bytes per record"), GRID
+1 },
519 {"record-size", RECORD_SIZE_OPTION
, N_("NUMBER"), 0,
520 N_("NUMBER of bytes per record, multiple of 512"), GRID
+1 },
521 {"ignore-zeros", 'i', 0, 0,
522 N_("ignore zeroed blocks in archive (means EOF)"), GRID
+1 },
523 {"read-full-records", 'B', 0, 0,
524 N_("reblock as we read (for 4.2BSD pipes)"), GRID
+1 },
529 N_("Archive format selection:"), GRID
},
531 {"format", 'H', N_("FORMAT"), 0,
532 N_("create archive of the given format"), GRID
+1 },
534 {NULL
, 0, NULL
, 0, N_("FORMAT is one of the following:"), GRID
+2 },
535 {" v7", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("old V7 tar format"),
537 {" oldgnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
538 N_("GNU format as per tar <= 1.12"), GRID
+3 },
539 {" gnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
540 N_("GNU tar 1.13.x format"), GRID
+3 },
541 {" ustar", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
542 N_("POSIX 1003.1-1988 (ustar) format"), GRID
+3 },
543 {" pax", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
544 N_("POSIX 1003.1-2001 (pax) format"), GRID
+3 },
545 {" posix", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("same as pax"), GRID
+3 },
547 {"old-archive", OLD_ARCHIVE_OPTION
, 0, 0, /* FIXME */
548 N_("same as --format=v7"), GRID
+8 },
549 {"portability", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
550 {"posix", POSIX_OPTION
, 0, 0,
551 N_("same as --format=posix"), GRID
+8 },
552 {"pax-option", PAX_OPTION
, N_("keyword[[:]=value][,keyword[[:]=value]]..."), 0,
553 N_("control pax keywords"), GRID
+8 },
554 {"label", 'V', N_("TEXT"), 0,
555 N_("create archive with volume name TEXT; at list/extract time, use TEXT as a globbing pattern for volume name"), GRID
+8 },
557 N_("filter the archive through bzip2"), GRID
+8 },
559 N_("filter the archive through gzip"), GRID
+8 },
560 {"gunzip", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
561 {"ungzip", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
562 {"compress", 'Z', 0, 0,
563 N_("filter the archive through compress"), GRID
+8 },
564 {"uncompress", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
565 {"use-compress-program", USE_COMPRESS_PROGRAM_OPTION
, N_("PROG"), 0,
566 N_("filter through PROG (must accept -d)"), GRID
+8 },
571 N_("Local file selection:"), GRID
},
573 {"add-file", ARGP_KEY_ARG
, N_("FILE"), 0,
574 N_("add given FILE to the archive (useful if its name starts with a dash)"), GRID
+1 },
575 {"directory", 'C', N_("DIR"), 0,
576 N_("change to directory DIR"), GRID
+1 },
577 {"files-from", 'T', N_("FILE"), 0,
578 N_("get names to extract or create from FILE"), GRID
+1 },
579 {"null", NULL_OPTION
, 0, 0,
580 N_("-T reads null-terminated names, disable -C"), GRID
+1 },
581 {"unquote", UNQUOTE_OPTION
, 0, 0,
582 N_("unquote filenames read with -T (default)"), GRID
+1 },
583 {"no-unquote", NO_UNQUOTE_OPTION
, 0, 0,
584 N_("do not unquote filenames read with -T"), GRID
+1 },
585 {"exclude", EXCLUDE_OPTION
, N_("PATTERN"), 0,
586 N_("exclude files, given as a PATTERN"), GRID
+1 },
587 {"exclude-from", 'X', N_("FILE"), 0,
588 N_("exclude patterns listed in FILE"), GRID
+1 },
589 {"exclude-caches", EXCLUDE_CACHES_OPTION
, 0, 0,
590 N_("exclude directories containing a cache tag"), GRID
+1 },
591 {"no-recursion", NO_RECURSION_OPTION
, 0, 0,
592 N_("avoid descending automatically in directories"), GRID
+1 },
593 {"one-file-system", ONE_FILE_SYSTEM_OPTION
, 0, 0,
594 N_("stay in local file system when creating archive"), GRID
+1 },
595 {"recursion", RECURSION_OPTION
, 0, 0,
596 N_("recurse into directories (default)"), GRID
+1 },
597 {"absolute-names", 'P', 0, 0,
598 N_("don't strip leading `/'s from file names"), GRID
+1 },
599 {"dereference", 'h', 0, 0,
600 N_("follow symlinks; archive and dump the files they point to"), GRID
+1 },
601 {"starting-file", 'K', N_("MEMBER-NAME"), 0,
602 N_("begin at member MEMBER-NAME in the archive"), GRID
+1 },
603 {"strip-components", STRIP_COMPONENTS_OPTION
, N_("NUMBER"), 0,
604 N_("strip NUMBER leading components from file names"), GRID
+1 },
605 {"newer", 'N', N_("DATE-OR-FILE"), 0,
606 N_("only store files newer than DATE-OR-FILE"), GRID
+1 },
607 {"newer-mtime", NEWER_MTIME_OPTION
, N_("DATE"), 0,
608 N_("compare date and time when data changed only"), GRID
+1 },
609 {"after-date", 'N', N_("DATE"), 0,
610 N_("same as -N"), GRID
+1 },
611 {"backup", BACKUP_OPTION
, N_("CONTROL"), OPTION_ARG_OPTIONAL
,
612 N_("backup before removal, choose version CONTROL"), GRID
+1 },
613 {"suffix", SUFFIX_OPTION
, N_("STRING"), 0,
614 N_("backup before removal, override usual suffix ('~' unless overridden by environment variable SIMPLE_BACKUP_SUFFIX)"), GRID
+1 },
619 N_("File name matching options (affect both exclude and include patterns):"),
621 {"ignore-case", IGNORE_CASE_OPTION
, 0, 0,
622 N_("ignore case"), GRID
+1 },
623 {"anchored", ANCHORED_OPTION
, 0, 0,
624 N_("patterns match file name start"), GRID
+1 },
625 {"no-anchored", NO_ANCHORED_OPTION
, 0, 0,
626 N_("patterns match after any `/' (default for exclusion)"), GRID
+1 },
627 {"no-ignore-case", NO_IGNORE_CASE_OPTION
, 0, 0,
628 N_("case sensitive matching (default)"), GRID
+1 },
629 {"wildcards", WILDCARDS_OPTION
, 0, 0,
630 N_("use wildcards (default for exclusion)"), GRID
+1 },
631 {"no-wildcards", NO_WILDCARDS_OPTION
, 0, 0,
632 N_("verbatim string matching"), GRID
+1 },
633 {"no-wildcards-match-slash", NO_WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
634 N_("wildcards do not match `/'"), GRID
+1 },
635 {"wildcards-match-slash", WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
636 N_("wildcards match `/' (default for exclusion)"), GRID
+1 },
641 N_("Informative output:"), GRID
},
643 {"verbose", 'v', 0, 0,
644 N_("verbosely list files processed"), GRID
+1 },
645 {"checkpoint", CHECKPOINT_OPTION
, 0, 0,
646 N_("display progress messages every 10th record"), GRID
+1 },
647 {"check-links", 'l', 0, 0,
648 N_("print a message if not all links are dumped"), GRID
+1 },
649 {"totals", TOTALS_OPTION
, 0, 0,
650 N_("print total bytes written while creating archive"), GRID
+1 },
651 {"utc", UTC_OPTION
, 0, 0,
652 N_("print file modification dates in UTC"), GRID
+1 },
653 {"index-file", INDEX_FILE_OPTION
, N_("FILE"), 0,
654 N_("send verbose output to FILE"), GRID
+1 },
655 {"block-number", 'R', 0, 0,
656 N_("show block number within archive with each message"), GRID
+1 },
657 {"interactive", 'w', 0, 0,
658 N_("ask for confirmation for every action"), GRID
+1 },
659 {"confirmation", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
660 {"show-defaults", SHOW_DEFAULTS_OPTION
, 0, 0,
661 N_("show tar defaults"), GRID
+1 },
662 {"show-omitted-dirs", SHOW_OMITTED_DIRS_OPTION
, 0, 0,
663 N_("when listing or extracting, list each directory that does not match search criteria"), GRID
+1 },
664 {"show-stored-names", SHOW_STORED_NAMES_OPTION
, 0, 0,
665 N_("when creating archive in verbose mode, list member names as stored in the archive"),
667 {"quoting-style", QUOTING_STYLE_OPTION
, N_("STYLE"), 0,
668 N_("set name quoting style; see below for valid STYLE values"), GRID
+1 },
669 {"quote-chars", QUOTE_CHARS_OPTION
, N_("STRING"), 0,
670 N_("additionally quote characters from STRING"), GRID
+1 },
671 {"no-quote-chars", NO_QUOTE_CHARS_OPTION
, N_("STRING"), 0,
672 N_("disable quoting for characters from STRING"), GRID
+1 },
677 N_("Compatibility options:"), GRID
},
680 N_("when creating, same as --old-archive; when extracting, same as --no-same-owner"), GRID
+1 },
685 N_("Other options:"), GRID
},
687 {"restrict", RESTRICT_OPTION
, 0, 0,
688 N_("disable use of some potentially harmful options"), -1 },
690 {"help", '?', 0, 0, N_("give this help list"), -1},
691 {"usage", USAGE_OPTION
, 0, 0, N_("give a short usage message"), -1},
692 {"version", VERSION_OPTION
, 0, 0, N_("print program version"), -1},
693 /* FIXME -V (--label) conflicts with the default short option for
695 {"HANG", HANG_OPTION
, "SECS", OPTION_ARG_OPTIONAL
| OPTION_HIDDEN
,
696 N_("hang for SECS seconds (default 3600)"), 0},
702 static char const *const atime_preserve_args
[] =
704 "replace", "system", NULL
707 static enum atime_preserve
const atime_preserve_types
[] =
709 replace_atime_preserve
, system_atime_preserve
712 ARGMATCH_VERIFY (atime_preserve_args
, atime_preserve_types
);
714 /* Wildcard matching settings */
717 default_wildcards
, /* For exclusion == enable_wildcards,
718 for inclusion == disable_wildcards */
723 struct tar_args
/* Variables used during option parsing */
725 char const *textual_date_option
; /* Keeps the argument to --newer-mtime
726 option if it represents a textual date */
727 enum wildcards wildcards
; /* Wildcard settings (--wildcards/
729 int matching_flags
; /* exclude_fnmatch options */
730 int include_anchored
; /* Pattern anchoring options used for
732 bool o_option
; /* True if -o option was given */
733 bool pax_option
; /* True if --pax-option was given */
734 char const *backup_suffix_string
; /* --suffix option argument */
735 char const *version_control_string
; /* --backup option argument */
736 bool input_files
; /* True if some input files where given */
739 #define MAKE_EXCL_OPTIONS(args) \
740 ((((args)->wildcards != disable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
741 | (args)->matching_flags \
744 #define MAKE_INCL_OPTIONS(args) \
745 ((((args)->wildcards == enable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
746 | (args)->include_anchored \
747 | (args)->matching_flags \
751 show_default_settings (FILE *stream
)
754 "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s",
755 archive_format_string (DEFAULT_ARCHIVE_FORMAT
),
756 DEFAULT_ARCHIVE
, DEFAULT_BLOCKING
,
757 quoting_style_args
[DEFAULT_QUOTING_STYLE
],
758 DEFAULT_RMT_COMMAND
);
760 fprintf (stream
, " --rsh-command=%s", REMOTE_SHELL
);
762 fprintf (stream
, "\n");
766 set_subcommand_option (enum subcommand subcommand
)
768 if (subcommand_option
!= UNKNOWN_SUBCOMMAND
769 && subcommand_option
!= subcommand
)
771 _("You may not specify more than one `-Acdtrux' option")));
773 subcommand_option
= subcommand
;
777 set_use_compress_program_option (const char *string
)
779 if (use_compress_program_option
780 && strcmp (use_compress_program_option
, string
) != 0)
781 USAGE_ERROR ((0, 0, _("Conflicting compression options")));
783 use_compress_program_option
= string
;
786 static volatile int _argp_hang
;
788 enum read_file_list_state
/* Result of reading file name from the list file */
790 file_list_success
, /* OK, name read successfully */
791 file_list_end
, /* End of list file */
792 file_list_zero
/* Zero separator encountered where it should not */
795 /* Read from FP a sequence of characters up to FILENAME_TERMINATOR and put them
798 static enum read_file_list_state
799 read_name_from_file (FILE *fp
, struct obstack
*stk
)
804 for (c
= getc (fp
); c
!= EOF
&& c
!= filename_terminator
; c
= getc (fp
))
808 /* We have read a zero separator. The file possibly is
810 /* FATAL_ERROR((0, 0, N_("file name contains null character"))); */
811 return file_list_zero
;
813 obstack_1grow (stk
, c
);
817 obstack_1grow (stk
, 0);
819 return (counter
== 0 && c
== EOF
) ? file_list_end
: file_list_success
;
823 static bool files_from_option
; /* When set, tar will not refuse to create
825 static struct obstack argv_stk
; /* Storage for additional command line options
826 read using -T option */
828 /* Prevent recursive inclusion of the same file */
831 struct file_id_list
*next
;
836 static struct file_id_list
*file_id_list
;
839 add_file_id (const char *filename
)
841 struct file_id_list
*p
;
844 if (stat (filename
, &st
))
845 stat_fatal (filename
);
846 for (p
= file_id_list
; p
; p
= p
->next
)
847 if (p
->ino
== st
.st_ino
&& p
->dev
== st
.st_dev
)
849 FATAL_ERROR ((0, 0, _("%s: file list already read"),
850 quotearg_colon (filename
)));
852 p
= xmalloc (sizeof *p
);
853 p
->next
= file_id_list
;
859 /* Default density numbers for [0-9][lmh] device specifications */
861 #ifndef LOW_DENSITY_NUM
862 # define LOW_DENSITY_NUM 0
865 #ifndef MID_DENSITY_NUM
866 # define MID_DENSITY_NUM 8
869 #ifndef HIGH_DENSITY_NUM
870 # define HIGH_DENSITY_NUM 16
874 update_argv (const char *filename
, struct argp_state
*state
)
881 bool is_stdin
= false;
882 enum read_file_list_state read_state
;
884 if (!strcmp (filename
, "-"))
887 request_stdin ("-T");
892 add_file_id (filename
);
893 if ((fp
= fopen (filename
, "r")) == NULL
)
894 open_fatal (filename
);
897 while ((read_state
= read_name_from_file (fp
, &argv_stk
)) == file_list_success
)
900 if (read_state
== file_list_zero
)
904 WARN ((0, 0, N_("%s: file name read contains nul character"),
905 quotearg_colon (filename
)));
907 /* Prepare new stack contents */
908 size
= obstack_object_size (&argv_stk
);
909 p
= obstack_finish (&argv_stk
);
910 for (; size
> 0; size
--, p
++)
912 obstack_1grow (&argv_stk
, *p
);
914 obstack_1grow (&argv_stk
, '\n');
915 obstack_1grow (&argv_stk
, 0);
918 /* Read rest of files using new filename terminator */
919 filename_terminator
= 0;
920 while (read_name_from_file (fp
, &argv_stk
) == file_list_success
)
930 start
= obstack_finish (&argv_stk
);
932 if (filename_terminator
== 0)
933 for (p
= start
; *p
; p
+= strlen (p
) + 1)
937 new_argc
= state
->argc
+ count
;
938 new_argv
= xmalloc (sizeof (state
->argv
[0]) * (new_argc
+ 1));
939 memcpy (new_argv
, state
->argv
, sizeof (state
->argv
[0]) * (state
->argc
+ 1));
940 state
->argv
= new_argv
;
941 memmove (&state
->argv
[state
->next
+ count
], &state
->argv
[state
->next
],
942 (state
->argc
- state
->next
+ 1) * sizeof (state
->argv
[0]));
944 state
->argc
= new_argc
;
946 for (i
= state
->next
, p
= start
; *p
; p
+= strlen (p
) + 1, i
++)
948 if (filename_terminator
== 0 && p
[0] == '-')
949 state
->argv
[i
++] = "--add-file";
956 parse_opt (int key
, char *arg
, struct argp_state
*state
)
958 struct tar_args
*args
= state
->input
;
963 /* File name or non-parsed option, because of ARGP_IN_ORDER */
964 name_add_name (arg
, MAKE_INCL_OPTIONS (args
));
965 args
->input_files
= true;
969 set_subcommand_option (CAT_SUBCOMMAND
);
975 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
976 && u
== (blocking_factor
= u
)
977 && 0 < blocking_factor
978 && u
== (record_size
= u
* BLOCKSIZE
) / BLOCKSIZE
))
979 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
980 _("Invalid blocking factor")));
985 /* Try to reblock input records. For reading 4.2BSD pipes. */
987 /* It would surely make sense to exchange -B and -R, but it seems
988 that -B has been used for a long while in Sun tar and most
989 BSD-derived systems. This is a consequence of the block/record
990 terminology confusion. */
992 read_full_records_option
= true;
996 set_subcommand_option (CREATE_SUBCOMMAND
);
1004 set_subcommand_option (DIFF_SUBCOMMAND
);
1008 if (archive_names
== allocated_archive_names
)
1009 archive_name_array
= x2nrealloc (archive_name_array
,
1010 &allocated_archive_names
,
1011 sizeof (archive_name_array
[0]));
1013 archive_name_array
[archive_names
++] = arg
;
1017 /* Since -F is only useful with -M, make it implied. Run this
1018 script at the end of each tape. */
1020 info_script_option
= arg
;
1021 multi_volume_option
= true;
1025 listed_incremental_option
= arg
;
1026 after_date_option
= true;
1030 /* We are making an incremental dump (FIXME: are we?); save
1031 directories at the beginning of the archive, and include in each
1032 directory its contents. */
1034 incremental_option
= true;
1038 /* Follow symbolic links. */
1039 dereference_option
= true;
1043 /* Ignore zero blocks (eofs). This can't be the default,
1044 because Unix tar writes two blocks of zeros, then pads out
1045 the record with garbage. */
1047 ignore_zeros_option
= true;
1052 _("Warning: the -I option is not supported;"
1053 " perhaps you meant -j or -T?")));
1057 set_use_compress_program_option ("bzip2");
1061 /* Don't replace existing files. */
1062 old_files_option
= KEEP_OLD_FILES
;
1066 starting_file_option
= true;
1070 case ONE_FILE_SYSTEM_OPTION
:
1071 /* When dumping directories, don't dump files/subdirectories
1072 that are on other filesystems. */
1073 one_file_system_option
= true;
1077 check_links_option
= 1;
1083 if (xstrtoumax (arg
, 0, 10, &u
, "") != LONGINT_OK
)
1084 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1085 _("Invalid tape length")));
1086 tape_length_option
= 1024 * (tarlong
) u
;
1087 multi_volume_option
= true;
1092 touch_option
= true;
1096 /* Make multivolume archive: when we can't write any more into
1097 the archive, re-open it, and continue writing. */
1099 multi_volume_option
= true;
1103 seekable_archive
= true;
1107 after_date_option
= true;
1110 case NEWER_MTIME_OPTION
:
1111 if (NEWER_OPTION_INITIALIZED (newer_mtime_option
))
1112 USAGE_ERROR ((0, 0, _("More than one threshold date")));
1114 if (FILE_SYSTEM_PREFIX_LEN (arg
) != 0
1119 if (deref_stat (dereference_option
, arg
, &st
) != 0)
1122 USAGE_ERROR ((0, 0, _("Date sample file not found")));
1124 newer_mtime_option
= get_stat_mtime (&st
);
1128 if (! get_date (&newer_mtime_option
, arg
, NULL
))
1130 WARN ((0, 0, _("Substituting %s for unknown date format %s"),
1131 tartime (newer_mtime_option
, false), quote (arg
)));
1132 newer_mtime_option
.tv_nsec
= 0;
1135 args
->textual_date_option
= arg
;
1141 args
->o_option
= true;
1145 to_stdout_option
= true;
1149 same_permissions_option
= true;
1153 absolute_names_option
= true;
1157 set_subcommand_option (APPEND_SUBCOMMAND
);
1161 /* Print block numbers for debugging bad tar archives. */
1163 /* It would surely make sense to exchange -B and -R, but it seems
1164 that -B has been used for a long while in Sun tar ans most
1165 BSD-derived systems. This is a consequence of the block/record
1166 terminology confusion. */
1168 block_number_option
= true;
1172 /* Names to extr are sorted. */
1174 same_order_option
= true;
1178 sparse_option
= true;
1182 set_subcommand_option (LIST_SUBCOMMAND
);
1186 case TEST_LABEL_OPTION
:
1187 set_subcommand_option (LIST_SUBCOMMAND
);
1188 test_label_option
= true;
1192 update_argv (arg
, state
);
1193 /* Indicate we've been given -T option. This is for backward
1194 compatibility only, so that `tar cfT archive /dev/null will
1196 files_from_option
= true;
1200 set_subcommand_option (UPDATE_SUBCOMMAND
);
1204 old_files_option
= UNLINK_FIRST_OLD_FILES
;
1216 volume_label_option
= arg
;
1220 interactive_option
= true;
1224 verify_option
= true;
1228 set_subcommand_option (EXTRACT_SUBCOMMAND
);
1232 if (add_exclude_file (add_exclude
, excluded
, arg
,
1233 MAKE_EXCL_OPTIONS (args
), '\n')
1237 FATAL_ERROR ((0, e
, "%s", quotearg_colon (arg
)));
1242 set_use_compress_program_option ("gzip");
1246 set_use_compress_program_option ("compress");
1249 case ANCHORED_OPTION
:
1250 args
->matching_flags
|= EXCLUDE_ANCHORED
;
1253 case ATIME_PRESERVE_OPTION
:
1254 atime_preserve_option
=
1256 ? XARGMATCH ("--atime-preserve", arg
,
1257 atime_preserve_args
, atime_preserve_types
)
1258 : replace_atime_preserve
);
1259 if (! O_NOATIME
&& atime_preserve_option
== system_atime_preserve
)
1261 _("--atime-preserve='system' is not supported"
1262 " on this platform")));
1265 case CHECKPOINT_OPTION
:
1266 checkpoint_option
= true;
1270 backup_option
= true;
1272 args
->version_control_string
= arg
;
1275 case DELAY_DIRECTORY_RESTORE_OPTION
:
1276 delay_directory_restore_option
= true;
1279 case NO_DELAY_DIRECTORY_RESTORE_OPTION
:
1280 delay_directory_restore_option
= false;
1284 set_subcommand_option (DELETE_SUBCOMMAND
);
1287 case EXCLUDE_OPTION
:
1288 add_exclude (excluded
, arg
, MAKE_EXCL_OPTIONS (args
));
1291 case EXCLUDE_CACHES_OPTION
:
1292 exclude_caches_option
= true;
1295 case FORCE_LOCAL_OPTION
:
1296 force_local_option
= true;
1300 set_archive_format (arg
);
1303 case INDEX_FILE_OPTION
:
1304 index_file_name
= arg
;
1307 case IGNORE_CASE_OPTION
:
1308 args
->matching_flags
|= FNM_CASEFOLD
;
1311 case IGNORE_COMMAND_ERROR_OPTION
:
1312 ignore_command_error_option
= true;
1315 case IGNORE_FAILED_READ_OPTION
:
1316 ignore_failed_read_option
= true;
1319 case KEEP_NEWER_FILES_OPTION
:
1320 old_files_option
= KEEP_NEWER_FILES
;
1324 if (! (strlen (arg
) < GNAME_FIELD_SIZE
1325 && gname_to_gid (arg
, &group_option
)))
1328 if (xstrtoumax (arg
, 0, 10, &g
, "") == LONGINT_OK
1332 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1333 _("%s: Invalid group")));
1338 mode_option
= mode_compile (arg
);
1340 FATAL_ERROR ((0, 0, _("Invalid mode given on option")));
1341 initial_umask
= umask (0);
1342 umask (initial_umask
);
1345 case NO_ANCHORED_OPTION
:
1346 args
->include_anchored
= 0; /* Clear the default for comman line args */
1347 args
->matching_flags
&= ~ EXCLUDE_ANCHORED
;
1350 case NO_IGNORE_CASE_OPTION
:
1351 args
->matching_flags
&= ~ FNM_CASEFOLD
;
1354 case NO_IGNORE_COMMAND_ERROR_OPTION
:
1355 ignore_command_error_option
= false;
1358 case NO_OVERWRITE_DIR_OPTION
:
1359 old_files_option
= NO_OVERWRITE_DIR_OLD_FILES
;
1362 case NO_QUOTE_CHARS_OPTION
:
1364 set_char_quoting (NULL
, *arg
, 0);
1367 case NO_WILDCARDS_OPTION
:
1368 args
->wildcards
= disable_wildcards
;
1371 case NO_WILDCARDS_MATCH_SLASH_OPTION
:
1372 args
->matching_flags
|= FNM_FILE_NAME
;
1376 filename_terminator
= '\0';
1379 case NUMERIC_OWNER_OPTION
:
1380 numeric_owner_option
= true;
1383 case OCCURRENCE_OPTION
:
1385 occurrence_option
= 1;
1389 if (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
)
1390 occurrence_option
= u
;
1392 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1393 _("Invalid number")));
1397 case OVERWRITE_OPTION
:
1398 old_files_option
= OVERWRITE_OLD_FILES
;
1402 if (! (strlen (arg
) < UNAME_FIELD_SIZE
1403 && uname_to_uid (arg
, &owner_option
)))
1406 if (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1410 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1411 _("Invalid owner")));
1415 case QUOTE_CHARS_OPTION
:
1417 set_char_quoting (NULL
, *arg
, 1);
1420 case QUOTING_STYLE_OPTION
:
1421 tar_set_quoting_style (arg
);
1425 args
->pax_option
= true;
1426 xheader_set_option (arg
);
1430 set_archive_format ("posix");
1433 case PRESERVE_OPTION
:
1434 same_permissions_option
= true;
1435 same_order_option
= true;
1438 case RECORD_SIZE_OPTION
:
1441 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1442 && u
== (size_t) u
))
1443 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1444 _("Invalid record size")));
1446 if (record_size
% BLOCKSIZE
!= 0)
1447 USAGE_ERROR ((0, 0, _("Record size must be a multiple of %d."),
1449 blocking_factor
= record_size
/ BLOCKSIZE
;
1453 case RECURSIVE_UNLINK_OPTION
:
1454 recursive_unlink_option
= true;
1457 case REMOVE_FILES_OPTION
:
1458 remove_files_option
= true;
1461 case RESTRICT_OPTION
:
1462 restrict_option
= true;
1465 case RMT_COMMAND_OPTION
:
1469 case RSH_COMMAND_OPTION
:
1470 rsh_command_option
= arg
;
1473 case SHOW_DEFAULTS_OPTION
:
1474 show_default_settings (stdout
);
1478 case STRIP_COMPONENTS_OPTION
:
1481 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1482 && u
== (size_t) u
))
1483 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1484 _("Invalid number of elements")));
1485 strip_name_components
= u
;
1489 case SHOW_OMITTED_DIRS_OPTION
:
1490 show_omitted_dirs_option
= true;
1493 case SHOW_STORED_NAMES_OPTION
:
1494 show_stored_names_option
= true;
1498 backup_option
= true;
1499 args
->backup_suffix_string
= arg
;
1502 case TO_COMMAND_OPTION
:
1503 if (to_command_option
)
1504 USAGE_ERROR ((0, 0, _("Only one --to-command option allowed")));
1505 to_command_option
= arg
;
1509 totals_option
= true;
1512 case USE_COMPRESS_PROGRAM_OPTION
:
1513 set_use_compress_program_option (arg
);
1516 case VOLNO_FILE_OPTION
:
1517 volno_file_option
= arg
;
1520 case WILDCARDS_OPTION
:
1521 args
->wildcards
= enable_wildcards
;
1524 case WILDCARDS_MATCH_SLASH_OPTION
:
1525 args
->matching_flags
&= ~ FNM_FILE_NAME
;
1528 case NO_RECURSION_OPTION
:
1529 recursion_option
= 0;
1532 case NO_SAME_OWNER_OPTION
:
1533 same_owner_option
= -1;
1536 case NO_SAME_PERMISSIONS_OPTION
:
1537 same_permissions_option
= -1;
1540 case RECURSION_OPTION
:
1541 recursion_option
= FNM_LEADING_DIR
;
1544 case SAME_OWNER_OPTION
:
1545 same_owner_option
= 1;
1548 case UNQUOTE_OPTION
:
1549 unquote_option
= true;
1552 case NO_UNQUOTE_OPTION
:
1553 unquote_option
= false;
1565 #ifdef DEVICE_PREFIX
1567 int device
= key
- '0';
1569 static char buf
[sizeof DEVICE_PREFIX
+ 10];
1573 argp_error (state
, _("Malformed density argument: %s"), quote (arg
));
1575 strcpy (buf
, DEVICE_PREFIX
);
1576 cursor
= buf
+ strlen (buf
);
1578 #ifdef DENSITY_LETTER
1580 sprintf (cursor
, "%d%c", device
, arg
[0]);
1582 #else /* not DENSITY_LETTER */
1587 device
+= LOW_DENSITY_NUM
;
1591 device
+= MID_DENSITY_NUM
;
1595 device
+= HIGH_DENSITY_NUM
;
1599 argp_error (state
, _("Unknown density: `%c'"), arg
[0]);
1601 sprintf (cursor
, "%d", device
);
1603 #endif /* not DENSITY_LETTER */
1605 if (archive_names
== allocated_archive_names
)
1606 archive_name_array
= x2nrealloc (archive_name_array
,
1607 &allocated_archive_names
,
1608 sizeof (archive_name_array
[0]));
1609 archive_name_array
[archive_names
++] = xstrdup (buf
);
1613 #else /* not DEVICE_PREFIX */
1616 _("Options `-[0-7][lmh]' not supported by *this* tar"));
1618 #endif /* not DEVICE_PREFIX */
1621 state
->flags
|= ARGP_NO_EXIT
;
1622 argp_state_help (state
, state
->out_stream
,
1623 ARGP_HELP_STD_HELP
& ~ARGP_HELP_BUG_ADDR
);
1624 fprintf (state
->out_stream
, "\n%s\n\n",
1625 _("Valid arguments for --quoting-style options are:"));
1626 tar_list_quoting_styles (state
->out_stream
, " ");
1628 fprintf (state
->out_stream
, _("\n*This* tar defaults to:\n"));
1629 show_default_settings (state
->out_stream
);
1630 fprintf (state
->out_stream
, "\n");
1631 fprintf (state
->out_stream
, _("Report bugs to %s.\n"),
1632 argp_program_bug_address
);
1637 argp_state_help (state
, state
->out_stream
, ARGP_HELP_USAGE
);
1641 case VERSION_OPTION
:
1642 version_etc (state
->out_stream
, "tar", PACKAGE_NAME
, VERSION
,
1643 "John Gilmore", "Jay Fenlason", (char *) NULL
);
1648 _argp_hang
= atoi (arg
? arg
: "3600");
1649 while (_argp_hang
-- > 0)
1654 return ARGP_ERR_UNKNOWN
;
1659 static struct argp argp
= {
1672 argp_help (&argp
, stderr
, ARGP_HELP_SEE
, (char*) program_name
);
1677 /* Parse the options for tar. */
1679 static struct argp_option
*
1680 find_argp_option (struct argp_option
*options
, int letter
)
1683 !(options
->name
== NULL
1684 && options
->key
== 0
1685 && options
->arg
== 0
1686 && options
->flags
== 0
1687 && options
->doc
== NULL
); options
++)
1688 if (options
->key
== letter
)
1694 decode_options (int argc
, char **argv
)
1697 struct tar_args args
;
1699 /* Set some default option values. */
1700 args
.textual_date_option
= NULL
;
1701 args
.wildcards
= default_wildcards
;
1702 args
.matching_flags
= 0;
1703 args
.include_anchored
= EXCLUDE_ANCHORED
;
1704 args
.o_option
= false;
1705 args
.pax_option
= false;
1706 args
.backup_suffix_string
= getenv ("SIMPLE_BACKUP_SUFFIX");
1707 args
.version_control_string
= 0;
1708 args
.input_files
= false;
1710 subcommand_option
= UNKNOWN_SUBCOMMAND
;
1711 archive_format
= DEFAULT_FORMAT
;
1712 blocking_factor
= DEFAULT_BLOCKING
;
1713 record_size
= DEFAULT_BLOCKING
* BLOCKSIZE
;
1714 excluded
= new_exclude ();
1715 newer_mtime_option
.tv_sec
= TYPE_MINIMUM (time_t);
1716 newer_mtime_option
.tv_nsec
= -1;
1717 recursion_option
= FNM_LEADING_DIR
;
1718 unquote_option
= true;
1723 /* Convert old-style tar call by exploding option element and rearranging
1724 options accordingly. */
1726 if (argc
> 1 && argv
[1][0] != '-')
1728 int new_argc
; /* argc value for rearranged arguments */
1729 char **new_argv
; /* argv value for rearranged arguments */
1730 char *const *in
; /* cursor into original argv */
1731 char **out
; /* cursor into rearranged argv */
1732 const char *letter
; /* cursor into old option letters */
1733 char buffer
[3]; /* constructed option buffer */
1735 /* Initialize a constructed option. */
1740 /* Allocate a new argument array, and copy program name in it. */
1742 new_argc
= argc
- 1 + strlen (argv
[1]);
1743 new_argv
= xmalloc ((new_argc
+ 1) * sizeof (char *));
1748 /* Copy each old letter option as a separate option, and have the
1749 corresponding argument moved next to it. */
1751 for (letter
= *in
++; *letter
; letter
++)
1753 struct argp_option
*opt
;
1755 buffer
[1] = *letter
;
1756 *out
++ = xstrdup (buffer
);
1757 opt
= find_argp_option (options
, *letter
);
1758 if (opt
&& opt
->arg
)
1760 if (in
< argv
+ argc
)
1763 USAGE_ERROR ((0, 0, _("Old option `%c' requires an argument."),
1768 /* Copy all remaining options. */
1770 while (in
< argv
+ argc
)
1774 /* Replace the old option list by the new one. */
1780 /* Parse all options and non-options as they appear. */
1782 prepend_default_options (getenv ("TAR_OPTIONS"), &argc
, &argv
);
1784 if (argp_parse (&argp
, argc
, argv
, ARGP_IN_ORDER
|ARGP_NO_HELP
,
1786 exit (TAREXIT_FAILURE
);
1789 /* Special handling for 'o' option:
1791 GNU tar used to say "output old format".
1792 UNIX98 tar says don't chown files after extracting (we use
1793 "--no-same-owner" for this).
1795 The old GNU tar semantics is retained when used with --create
1796 option, otherwise UNIX98 semantics is assumed */
1800 if (subcommand_option
== CREATE_SUBCOMMAND
)
1802 /* GNU Tar <= 1.13 compatibility */
1803 set_archive_format ("v7");
1807 /* UNIX98 compatibility */
1808 same_owner_option
= -1;
1812 /* Handle operands after any "--" argument. */
1813 for (; index
< argc
; index
++)
1815 name_add_name (argv
[index
], MAKE_INCL_OPTIONS (&args
));
1816 args
.input_files
= true;
1819 /* Warn about implicit use of the wildcards in command line arguments.
1821 warn_regex_usage
= args
.wildcards
== default_wildcards
;
1823 /* Derive option values and check option consistency. */
1825 if (archive_format
== DEFAULT_FORMAT
)
1827 if (args
.pax_option
)
1828 archive_format
= POSIX_FORMAT
;
1830 archive_format
= DEFAULT_ARCHIVE_FORMAT
;
1833 if ((volume_label_option
&& subcommand_option
== CREATE_SUBCOMMAND
)
1834 || incremental_option
1835 || multi_volume_option
1837 assert_format (FORMAT_MASK (OLDGNU_FORMAT
)
1838 | FORMAT_MASK (GNU_FORMAT
)
1839 | FORMAT_MASK (POSIX_FORMAT
));
1841 if (multi_volume_option
1842 && archive_format
== POSIX_FORMAT
1843 && subcommand_option
== CREATE_SUBCOMMAND
1844 && !tape_length_option
)
1846 _("creating multi-volume archives in posix format requires using --tape-length (-L) option")));
1848 if (occurrence_option
)
1850 if (!args
.input_files
)
1852 _("--occurrence is meaningless without a file list")));
1853 if (subcommand_option
!= DELETE_SUBCOMMAND
1854 && subcommand_option
!= DIFF_SUBCOMMAND
1855 && subcommand_option
!= EXTRACT_SUBCOMMAND
1856 && subcommand_option
!= LIST_SUBCOMMAND
)
1858 _("--occurrence cannot be used in the requested operation mode")));
1861 if (seekable_archive
&& subcommand_option
== DELETE_SUBCOMMAND
)
1863 /* The current code in delete.c is based on the assumption that
1864 skip_member() reads all data from the archive. So, we should
1865 make sure it won't use seeks. On the other hand, the same code
1866 depends on the ability to backspace a record in the archive,
1867 so setting seekable_archive to false is technically incorrect.
1868 However, it is tested only in skip_member(), so it's not a
1870 seekable_archive
= false;
1873 if (archive_names
== 0)
1875 /* If no archive file name given, try TAPE from the environment, or
1876 else, DEFAULT_ARCHIVE from the configuration process. */
1879 archive_name_array
[0] = getenv ("TAPE");
1880 if (! archive_name_array
[0])
1881 archive_name_array
[0] = DEFAULT_ARCHIVE
;
1884 /* Allow multiple archives only with `-M'. */
1886 if (archive_names
> 1 && !multi_volume_option
)
1888 _("Multiple archive files require `-M' option")));
1890 if (listed_incremental_option
1891 && NEWER_OPTION_INITIALIZED (newer_mtime_option
))
1893 _("Cannot combine --listed-incremental with --newer")));
1895 if (volume_label_option
)
1897 if (archive_format
== GNU_FORMAT
|| archive_format
== OLDGNU_FORMAT
)
1899 size_t volume_label_max_len
=
1900 (sizeof current_header
->header
.name
1901 - 1 /* for trailing '\0' */
1902 - (multi_volume_option
1903 ? (sizeof " Volume "
1904 - 1 /* for null at end of " Volume " */
1905 + INT_STRLEN_BOUND (int) /* for volume number */
1906 - 1 /* for sign, as 0 <= volno */)
1908 if (volume_label_max_len
< strlen (volume_label_option
))
1910 ngettext ("%s: Volume label is too long (limit is %lu byte)",
1911 "%s: Volume label is too long (limit is %lu bytes)",
1912 volume_label_max_len
),
1913 quotearg_colon (volume_label_option
),
1914 (unsigned long) volume_label_max_len
));
1917 Label length in PAX format is limited by the volume size. */
1922 if (multi_volume_option
)
1923 USAGE_ERROR ((0, 0, _("Cannot verify multi-volume archives")));
1924 if (use_compress_program_option
)
1925 USAGE_ERROR ((0, 0, _("Cannot verify compressed archives")));
1928 if (use_compress_program_option
)
1930 if (multi_volume_option
)
1931 USAGE_ERROR ((0, 0, _("Cannot use multi-volume compressed archives")));
1932 if (subcommand_option
== UPDATE_SUBCOMMAND
1933 || subcommand_option
== APPEND_SUBCOMMAND
1934 || subcommand_option
== DELETE_SUBCOMMAND
)
1935 USAGE_ERROR ((0, 0, _("Cannot update compressed archives")));
1936 if (subcommand_option
== CAT_SUBCOMMAND
)
1937 USAGE_ERROR ((0, 0, _("Cannot concatenate compressed archives")));
1940 /* It is no harm to use --pax-option on non-pax archives in archive
1941 reading mode. It may even be useful, since it allows to override
1942 file attributes from tar headers. Therefore I allow such usage.
1945 && archive_format
!= POSIX_FORMAT
1946 && (subcommand_option
!= EXTRACT_SUBCOMMAND
1947 || subcommand_option
!= DIFF_SUBCOMMAND
1948 || subcommand_option
!= LIST_SUBCOMMAND
))
1949 USAGE_ERROR ((0, 0, _("--pax-option can be used only on POSIX archives")));
1951 /* If ready to unlink hierarchies, so we are for simpler files. */
1952 if (recursive_unlink_option
)
1953 old_files_option
= UNLINK_FIRST_OLD_FILES
;
1956 if (test_label_option
)
1958 /* --test-label is silent if the user has specified the label name to
1960 if (!args
.input_files
)
1963 else if (utc_option
)
1966 /* Forbid using -c with no input files whatsoever. Check that `-f -',
1967 explicit or implied, is used correctly. */
1969 switch (subcommand_option
)
1971 case CREATE_SUBCOMMAND
:
1972 if (!args
.input_files
&& !files_from_option
)
1974 _("Cowardly refusing to create an empty archive")));
1977 case EXTRACT_SUBCOMMAND
:
1978 case LIST_SUBCOMMAND
:
1979 case DIFF_SUBCOMMAND
:
1980 for (archive_name_cursor
= archive_name_array
;
1981 archive_name_cursor
< archive_name_array
+ archive_names
;
1982 archive_name_cursor
++)
1983 if (!strcmp (*archive_name_cursor
, "-"))
1984 request_stdin ("-f");
1987 case CAT_SUBCOMMAND
:
1988 case UPDATE_SUBCOMMAND
:
1989 case APPEND_SUBCOMMAND
:
1990 for (archive_name_cursor
= archive_name_array
;
1991 archive_name_cursor
< archive_name_array
+ archive_names
;
1992 archive_name_cursor
++)
1993 if (!strcmp (*archive_name_cursor
, "-"))
1995 _("Options `-Aru' are incompatible with `-f -'")));
2001 archive_name_cursor
= archive_name_array
;
2003 /* Prepare for generating backup names. */
2005 if (args
.backup_suffix_string
)
2006 simple_backup_suffix
= xstrdup (args
.backup_suffix_string
);
2010 backup_type
= xget_version ("--backup", args
.version_control_string
);
2011 /* No backup is needed either if explicitely disabled or if
2012 the extracted files are not being written to disk. */
2013 if (backup_type
== no_backups
|| EXTRACT_OVER_PIPE
)
2014 backup_option
= false;
2017 if (verbose_option
&& args
.textual_date_option
)
2019 char const *treated_as
= tartime (newer_mtime_option
, true);
2020 if (strcmp (args
.textual_date_option
, treated_as
) != 0)
2021 WARN ((0, 0, _("Treating date `%s' as %s"),
2022 args
.textual_date_option
, treated_as
));
2029 /* Main routine for tar. */
2031 main (int argc
, char **argv
)
2034 program_name
= argv
[0];
2036 setlocale (LC_ALL
, "");
2037 bindtextdomain (PACKAGE
, LOCALEDIR
);
2038 textdomain (PACKAGE
);
2040 exit_failure
= TAREXIT_FAILURE
;
2041 exit_status
= TAREXIT_SUCCESS
;
2042 filename_terminator
= '\n';
2043 set_quoting_style (0, DEFAULT_QUOTING_STYLE
);
2045 /* Make sure we have first three descriptors available */
2048 /* Pre-allocate a few structures. */
2050 allocated_archive_names
= 10;
2051 archive_name_array
=
2052 xmalloc (sizeof (const char *) * allocated_archive_names
);
2055 obstack_init (&argv_stk
);
2058 /* System V fork+wait does not work if SIGCHLD is ignored. */
2059 signal (SIGCHLD
, SIG_DFL
);
2062 /* Decode options. */
2064 decode_options (argc
, argv
);
2067 /* Main command execution. */
2069 if (volno_file_option
)
2070 init_volume_number ();
2072 switch (subcommand_option
)
2074 case UNKNOWN_SUBCOMMAND
:
2076 _("You must specify one of the `-Acdtrux' options")));
2078 case CAT_SUBCOMMAND
:
2079 case UPDATE_SUBCOMMAND
:
2080 case APPEND_SUBCOMMAND
:
2084 case DELETE_SUBCOMMAND
:
2085 delete_archive_members ();
2088 case CREATE_SUBCOMMAND
:
2091 print_total_written ();
2094 case EXTRACT_SUBCOMMAND
:
2096 read_and (extract_archive
);
2098 /* FIXME: should extract_finish () even if an ordinary signal is
2104 case LIST_SUBCOMMAND
:
2105 read_and (list_archive
);
2108 case DIFF_SUBCOMMAND
:
2110 read_and (diff_archive
);
2114 if (check_links_option
)
2117 if (volno_file_option
)
2118 closeout_volume_number ();
2120 /* Dispose of allocated memory, and return. */
2122 free (archive_name_array
);
2125 if (stdlis
== stdout
)
2128 if (exit_status
== TAREXIT_FAILURE
)
2129 error (0, 0, _("Error exit delayed from previous errors"));
2130 if (ferror (stderr
) || fclose (stderr
) != 0)
2131 exit_status
= TAREXIT_FAILURE
;
2136 tar_stat_init (struct tar_stat_info
*st
)
2138 memset (st
, 0, sizeof (*st
));
2142 tar_stat_destroy (struct tar_stat_info
*st
)
2144 free (st
->orig_file_name
);
2145 free (st
->file_name
);
2146 free (st
->link_name
);
2149 free (st
->sparse_map
);
2151 memset (st
, 0, sizeof (*st
));
2154 /* Format mask for all available formats that support nanosecond
2155 timestamp resolution. */
2156 #define NS_PRECISION_FORMAT_MASK FORMAT_MASK (POSIX_FORMAT)
2158 /* Same as timespec_cmp, but ignore nanoseconds if current archive
2159 format does not provide sufficient resolution. */
2161 tar_timespec_cmp (struct timespec a
, struct timespec b
)
2163 if (!(FORMAT_MASK (current_format
) & NS_PRECISION_FORMAT_MASK
))
2164 a
.tv_nsec
= b
.tv_nsec
= 0;
2165 return timespec_cmp (a
, b
);