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_TRANSFORMED_NAMES_OPTION
,
301 STRIP_COMPONENTS_OPTION
,
309 USE_COMPRESS_PROGRAM_OPTION
,
313 WILDCARDS_MATCH_SLASH_OPTION
,
317 const char *argp_program_version
= "tar (" PACKAGE_NAME
") " VERSION
;
318 const char *argp_program_bug_address
= "<" PACKAGE_BUGREPORT
">";
319 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\
322 tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n\
323 tar -tvf archive.tar # List all files in archive.tar verbosely.\n\
324 tar -xf archive.tar # Extract all files from archive.tar.\n\
325 \vThe backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
326 The version control may be set with --backup or VERSION_CONTROL, values are:\n\n\
327 none, off never make backups\n\
328 t, numbered make numbered backups\n\
329 nil, existing numbered if numbered backups exist, simple otherwise\n\
330 never, simple always make simple backups\n");
335 Available option letters are DEIJQY and aeqy. Consider the following
338 [For Solaris tar compatibility =/= Is it important at all?]
339 e exit immediately with a nonzero exit status if unexpected errors occur
340 E use extended headers (--format=posix)
342 [q alias for --occurrence=1 =/= this would better be used for quiet?]
343 [I same as T =/= will harm star compatibility]
345 y per-file gzip compression
346 Y per-block gzip compression */
348 static struct argp_option options
[] = {
351 N_("Main operation mode:"), GRID
},
354 N_("list the contents of an archive"), GRID
+1 },
355 {"extract", 'x', 0, 0,
356 N_("extract files from an archive"), GRID
+1 },
357 {"get", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
358 {"create", 'c', 0, 0,
359 N_("create a new archive"), GRID
+1 },
361 N_("find differences between archive and file system"), GRID
+1 },
362 {"compare", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
363 {"append", 'r', 0, 0,
364 N_("append files to the end of an archive"), GRID
+1 },
365 {"update", 'u', 0, 0,
366 N_("only append files newer than copy in archive"), GRID
+1 },
367 {"catenate", 'A', 0, 0,
368 N_("append tar files to an archive"), GRID
+1 },
369 {"concatenate", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
370 {"delete", DELETE_OPTION
, 0, 0,
371 N_("delete from the archive (not on mag tapes!)"), GRID
+1 },
372 {"test-label", TEST_LABEL_OPTION
, NULL
, 0,
373 N_("test the archive volume label and exit"), GRID
+1 },
378 N_("Operation modifiers:"), GRID
},
380 {"sparse", 'S', 0, 0,
381 N_("handle sparse files efficiently"), GRID
+1 },
382 {"incremental", 'G', 0, 0,
383 N_("handle old GNU-format incremental backup"), GRID
+1 },
384 {"listed-incremental", 'g', N_("FILE"), 0,
385 N_("handle new GNU-format incremental backup"), GRID
+1 },
386 {"ignore-failed-read", IGNORE_FAILED_READ_OPTION
, 0, 0,
387 N_("do not exit with nonzero on unreadable files"), GRID
+1 },
388 {"occurrence", OCCURRENCE_OPTION
, N_("NUMBER"), OPTION_ARG_OPTIONAL
,
389 N_("process only the NUMBERth occurrence of each file in the archive;"
390 " this option is valid only in conjunction with one of the subcommands"
391 " --delete, --diff, --extract or --list and when a list of files"
392 " is given either on the command line or via the -T option;"
393 " NUMBER defaults to 1"), GRID
+1 },
394 {"seek", 'n', NULL
, 0,
395 N_("archive is seekable"), GRID
+1 },
400 N_("Overwrite control:\n"), GRID
+1 },
402 {"verify", 'W', 0, 0,
403 N_("attempt to verify the archive after writing it"), GRID
+1 },
404 {"remove-files", REMOVE_FILES_OPTION
, 0, 0,
405 N_("remove files after adding them to the archive"), GRID
+1 },
406 {"keep-old-files", 'k', 0, 0,
407 N_("don't replace existing files when extracting"), GRID
+1 },
408 {"keep-newer-files", KEEP_NEWER_FILES_OPTION
, 0, 0,
409 N_("don't replace existing files that are newer than their archive copies"), GRID
+1 },
410 {"overwrite", OVERWRITE_OPTION
, 0, 0,
411 N_("overwrite existing files when extracting"), GRID
+1 },
412 {"unlink-first", 'U', 0, 0,
413 N_("remove each file prior to extracting over it"), GRID
+1 },
414 {"recursive-unlink", RECURSIVE_UNLINK_OPTION
, 0, 0,
415 N_("empty hierarchies prior to extracting directory"), GRID
+1 },
416 {"no-overwrite-dir", NO_OVERWRITE_DIR_OPTION
, 0, 0,
417 N_("preserve metadata of existing directories"), GRID
+1 },
422 N_("Select output stream:"), GRID
},
424 {"to-stdout", 'O', 0, 0,
425 N_("extract files to standard output"), GRID
+1 },
426 {"to-command", TO_COMMAND_OPTION
, N_("COMMAND"), 0,
427 N_("pipe extracted files to another program"), GRID
+1 },
428 {"ignore-command-error", IGNORE_COMMAND_ERROR_OPTION
, 0, 0,
429 N_("ignore exit codes of children"), GRID
+1 },
430 {"no-ignore-command-error", NO_IGNORE_COMMAND_ERROR_OPTION
, 0, 0,
431 N_("treat non-zero exit codes of children as error"), GRID
+1 },
436 N_("Handling of file attributes:"), GRID
},
438 {"owner", OWNER_OPTION
, N_("NAME"), 0,
439 N_("force NAME as owner for added files"), GRID
+1 },
440 {"group", GROUP_OPTION
, N_("NAME"), 0,
441 N_("force NAME as group for added files"), GRID
+1 },
442 {"mode", MODE_OPTION
, N_("CHANGES"), 0,
443 N_("force (symbolic) mode CHANGES for added files"), GRID
+1 },
444 {"atime-preserve", ATIME_PRESERVE_OPTION
,
445 N_("METHOD"), OPTION_ARG_OPTIONAL
,
446 N_("preserve access times on dumped files, either by restoring the times"
447 " after reading (METHOD='replace'; default) or by not setting the times"
448 " in the first place (METHOD='system')"), GRID
+1 },
450 N_("don't extract file modified time"), GRID
+1 },
451 {"same-owner", SAME_OWNER_OPTION
, 0, 0,
452 N_("try extracting files with the same ownership"), GRID
+1 },
453 {"no-same-owner", NO_SAME_OWNER_OPTION
, 0, 0,
454 N_("extract files as yourself"), GRID
+1 },
455 {"numeric-owner", NUMERIC_OWNER_OPTION
, 0, 0,
456 N_("always use numbers for user/group names"), GRID
+1 },
457 {"preserve-permissions", 'p', 0, 0,
458 N_("extract information about file permissions (default for superuser)"),
460 {"same-permissions", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
461 {"no-same-permissions", NO_SAME_PERMISSIONS_OPTION
, 0, 0,
462 N_("apply the user's umask when extracting permissions from the archive (default for ordinary users)"), GRID
+1 },
463 {"preserve-order", 's', 0, 0,
464 N_("sort names to extract to match archive"), GRID
+1 },
465 {"same-order", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
466 {"preserve", PRESERVE_OPTION
, 0, 0,
467 N_("same as both -p and -s"), GRID
+1 },
468 {"delay-directory-restore", DELAY_DIRECTORY_RESTORE_OPTION
, 0, 0,
469 N_("delay setting modification times and permissions of extracted"
470 " directories until the end of extraction"), GRID
+1 },
471 {"no-delay-directory-restore", NO_DELAY_DIRECTORY_RESTORE_OPTION
, 0, 0,
472 N_("cancel the effect of --delay-directory-restore option"), GRID
+1 },
477 N_("Device selection and switching:\n"), GRID
+1 },
479 {"file", 'f', N_("ARCHIVE"), 0,
480 N_("use archive file or device ARCHIVE"), GRID
+1 },
481 {"force-local", FORCE_LOCAL_OPTION
, 0, 0,
482 N_("archive file is local even if it has a colon"), GRID
+1 },
483 {"rmt-command", RMT_COMMAND_OPTION
, N_("COMMAND"), 0,
484 N_("use given rmt COMMAND instead of rmt"), GRID
+1 },
485 {"rsh-command", RSH_COMMAND_OPTION
, N_("COMMAND"), 0,
486 N_("use remote COMMAND instead of rsh"), GRID
+1 },
488 {"-[0-7][lmh]", 0, NULL
, OPTION_DOC
, /* It is OK, since `name' will never be
490 N_("specify drive and density"), GRID
+1 },
492 {NULL
, '0', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
493 {NULL
, '1', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
494 {NULL
, '2', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
495 {NULL
, '3', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
496 {NULL
, '4', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
497 {NULL
, '5', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
498 {NULL
, '6', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
499 {NULL
, '7', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
500 {NULL
, '8', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
501 {NULL
, '9', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
503 {"multi-volume", 'M', 0, 0,
504 N_("create/list/extract multi-volume archive"), GRID
+1 },
505 {"tape-length", 'L', N_("NUMBER"), 0,
506 N_("change tape after writing NUMBER x 1024 bytes"), GRID
+1 },
507 {"info-script", 'F', N_("NAME"), 0,
508 N_("run script at end of each tape (implies -M)"), GRID
+1 },
509 {"new-volume-script", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
510 {"volno-file", VOLNO_FILE_OPTION
, N_("FILE"), 0,
511 N_("use/update the volume number in FILE"), GRID
+1 },
516 N_("Device blocking:"), GRID
+1 },
518 {"blocking-factor", 'b', N_("BLOCKS"), 0,
519 N_("BLOCKS x 512 bytes per record"), GRID
+1 },
520 {"record-size", RECORD_SIZE_OPTION
, N_("NUMBER"), 0,
521 N_("NUMBER of bytes per record, multiple of 512"), GRID
+1 },
522 {"ignore-zeros", 'i', 0, 0,
523 N_("ignore zeroed blocks in archive (means EOF)"), GRID
+1 },
524 {"read-full-records", 'B', 0, 0,
525 N_("reblock as we read (for 4.2BSD pipes)"), GRID
+1 },
530 N_("Archive format selection:"), GRID
},
532 {"format", 'H', N_("FORMAT"), 0,
533 N_("create archive of the given format"), GRID
+1 },
535 {NULL
, 0, NULL
, 0, N_("FORMAT is one of the following:"), GRID
+2 },
536 {" v7", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("old V7 tar format"),
538 {" oldgnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
539 N_("GNU format as per tar <= 1.12"), GRID
+3 },
540 {" gnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
541 N_("GNU tar 1.13.x format"), GRID
+3 },
542 {" ustar", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
543 N_("POSIX 1003.1-1988 (ustar) format"), GRID
+3 },
544 {" pax", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
545 N_("POSIX 1003.1-2001 (pax) format"), GRID
+3 },
546 {" posix", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("same as pax"), GRID
+3 },
548 {"old-archive", OLD_ARCHIVE_OPTION
, 0, 0, /* FIXME */
549 N_("same as --format=v7"), GRID
+8 },
550 {"portability", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
551 {"posix", POSIX_OPTION
, 0, 0,
552 N_("same as --format=posix"), GRID
+8 },
553 {"pax-option", PAX_OPTION
, N_("keyword[[:]=value][,keyword[[:]=value]]..."), 0,
554 N_("control pax keywords"), GRID
+8 },
555 {"label", 'V', N_("TEXT"), 0,
556 N_("create archive with volume name TEXT; at list/extract time, use TEXT as a globbing pattern for volume name"), GRID
+8 },
558 N_("filter the archive through bzip2"), GRID
+8 },
560 N_("filter the archive through gzip"), GRID
+8 },
561 {"gunzip", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
562 {"ungzip", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
563 {"compress", 'Z', 0, 0,
564 N_("filter the archive through compress"), GRID
+8 },
565 {"uncompress", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
566 {"use-compress-program", USE_COMPRESS_PROGRAM_OPTION
, N_("PROG"), 0,
567 N_("filter through PROG (must accept -d)"), GRID
+8 },
572 N_("Local file selection:"), GRID
},
574 {"add-file", ARGP_KEY_ARG
, N_("FILE"), 0,
575 N_("add given FILE to the archive (useful if its name starts with a dash)"), GRID
+1 },
576 {"directory", 'C', N_("DIR"), 0,
577 N_("change to directory DIR"), GRID
+1 },
578 {"files-from", 'T', N_("FILE"), 0,
579 N_("get names to extract or create from FILE"), GRID
+1 },
580 {"null", NULL_OPTION
, 0, 0,
581 N_("-T reads null-terminated names, disable -C"), GRID
+1 },
582 {"unquote", UNQUOTE_OPTION
, 0, 0,
583 N_("unquote filenames read with -T (default)"), GRID
+1 },
584 {"no-unquote", NO_UNQUOTE_OPTION
, 0, 0,
585 N_("do not unquote filenames read with -T"), GRID
+1 },
586 {"exclude", EXCLUDE_OPTION
, N_("PATTERN"), 0,
587 N_("exclude files, given as a PATTERN"), GRID
+1 },
588 {"exclude-from", 'X', N_("FILE"), 0,
589 N_("exclude patterns listed in FILE"), GRID
+1 },
590 {"exclude-caches", EXCLUDE_CACHES_OPTION
, 0, 0,
591 N_("exclude directories containing a cache tag"), GRID
+1 },
592 {"no-recursion", NO_RECURSION_OPTION
, 0, 0,
593 N_("avoid descending automatically in directories"), GRID
+1 },
594 {"one-file-system", ONE_FILE_SYSTEM_OPTION
, 0, 0,
595 N_("stay in local file system when creating archive"), GRID
+1 },
596 {"recursion", RECURSION_OPTION
, 0, 0,
597 N_("recurse into directories (default)"), GRID
+1 },
598 {"absolute-names", 'P', 0, 0,
599 N_("don't strip leading `/'s from file names"), GRID
+1 },
600 {"dereference", 'h', 0, 0,
601 N_("follow symlinks; archive and dump the files they point to"), GRID
+1 },
602 {"starting-file", 'K', N_("MEMBER-NAME"), 0,
603 N_("begin at member MEMBER-NAME in the archive"), GRID
+1 },
604 {"strip-components", STRIP_COMPONENTS_OPTION
, N_("NUMBER"), 0,
605 N_("strip NUMBER leading components from file names"), GRID
+1 },
606 {"newer", 'N', N_("DATE-OR-FILE"), 0,
607 N_("only store files newer than DATE-OR-FILE"), GRID
+1 },
608 {"newer-mtime", NEWER_MTIME_OPTION
, N_("DATE"), 0,
609 N_("compare date and time when data changed only"), GRID
+1 },
610 {"after-date", 'N', N_("DATE"), 0,
611 N_("same as -N"), GRID
+1 },
612 {"backup", BACKUP_OPTION
, N_("CONTROL"), OPTION_ARG_OPTIONAL
,
613 N_("backup before removal, choose version CONTROL"), GRID
+1 },
614 {"suffix", SUFFIX_OPTION
, N_("STRING"), 0,
615 N_("backup before removal, override usual suffix ('~' unless overridden by environment variable SIMPLE_BACKUP_SUFFIX)"), GRID
+1 },
616 {"transform", TRANSFORM_OPTION
, N_("EXPR"), 0,
617 N_("Use EXPR to transform member names"), GRID
+1 },
622 N_("File name matching options (affect both exclude and include patterns):"),
624 {"ignore-case", IGNORE_CASE_OPTION
, 0, 0,
625 N_("ignore case"), GRID
+1 },
626 {"anchored", ANCHORED_OPTION
, 0, 0,
627 N_("patterns match file name start"), GRID
+1 },
628 {"no-anchored", NO_ANCHORED_OPTION
, 0, 0,
629 N_("patterns match after any `/' (default for exclusion)"), GRID
+1 },
630 {"no-ignore-case", NO_IGNORE_CASE_OPTION
, 0, 0,
631 N_("case sensitive matching (default)"), GRID
+1 },
632 {"wildcards", WILDCARDS_OPTION
, 0, 0,
633 N_("use wildcards (default for exclusion)"), GRID
+1 },
634 {"no-wildcards", NO_WILDCARDS_OPTION
, 0, 0,
635 N_("verbatim string matching"), GRID
+1 },
636 {"no-wildcards-match-slash", NO_WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
637 N_("wildcards do not match `/'"), GRID
+1 },
638 {"wildcards-match-slash", WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
639 N_("wildcards match `/' (default for exclusion)"), GRID
+1 },
644 N_("Informative output:"), GRID
},
646 {"verbose", 'v', 0, 0,
647 N_("verbosely list files processed"), GRID
+1 },
648 {"checkpoint", CHECKPOINT_OPTION
, 0, 0,
649 N_("display progress messages every 10th record"), GRID
+1 },
650 {"check-links", 'l', 0, 0,
651 N_("print a message if not all links are dumped"), GRID
+1 },
652 {"totals", TOTALS_OPTION
, 0, 0,
653 N_("print total bytes written while creating archive"), GRID
+1 },
654 {"utc", UTC_OPTION
, 0, 0,
655 N_("print file modification dates in UTC"), GRID
+1 },
656 {"index-file", INDEX_FILE_OPTION
, N_("FILE"), 0,
657 N_("send verbose output to FILE"), GRID
+1 },
658 {"block-number", 'R', 0, 0,
659 N_("show block number within archive with each message"), GRID
+1 },
660 {"interactive", 'w', 0, 0,
661 N_("ask for confirmation for every action"), GRID
+1 },
662 {"confirmation", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
663 {"show-defaults", SHOW_DEFAULTS_OPTION
, 0, 0,
664 N_("show tar defaults"), GRID
+1 },
665 {"show-omitted-dirs", SHOW_OMITTED_DIRS_OPTION
, 0, 0,
666 N_("when listing or extracting, list each directory that does not match search criteria"), GRID
+1 },
667 {"show-transformed-names", SHOW_TRANSFORMED_NAMES_OPTION
, 0, 0,
668 N_("show file or archive names after transformation"),
670 {"show-stored-names", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
671 {"quoting-style", QUOTING_STYLE_OPTION
, N_("STYLE"), 0,
672 N_("set name quoting style; see below for valid STYLE values"), GRID
+1 },
673 {"quote-chars", QUOTE_CHARS_OPTION
, N_("STRING"), 0,
674 N_("additionally quote characters from STRING"), GRID
+1 },
675 {"no-quote-chars", NO_QUOTE_CHARS_OPTION
, N_("STRING"), 0,
676 N_("disable quoting for characters from STRING"), GRID
+1 },
681 N_("Compatibility options:"), GRID
},
684 N_("when creating, same as --old-archive; when extracting, same as --no-same-owner"), GRID
+1 },
689 N_("Other options:"), GRID
},
691 {"restrict", RESTRICT_OPTION
, 0, 0,
692 N_("disable use of some potentially harmful options"), -1 },
694 {"help", '?', 0, 0, N_("give this help list"), -1},
695 {"usage", USAGE_OPTION
, 0, 0, N_("give a short usage message"), -1},
696 {"version", VERSION_OPTION
, 0, 0, N_("print program version"), -1},
697 /* FIXME -V (--label) conflicts with the default short option for
699 {"HANG", HANG_OPTION
, "SECS", OPTION_ARG_OPTIONAL
| OPTION_HIDDEN
,
700 N_("hang for SECS seconds (default 3600)"), 0},
706 static char const *const atime_preserve_args
[] =
708 "replace", "system", NULL
711 static enum atime_preserve
const atime_preserve_types
[] =
713 replace_atime_preserve
, system_atime_preserve
716 ARGMATCH_VERIFY (atime_preserve_args
, atime_preserve_types
);
718 /* Wildcard matching settings */
721 default_wildcards
, /* For exclusion == enable_wildcards,
722 for inclusion == disable_wildcards */
727 struct tar_args
/* Variables used during option parsing */
729 char const *textual_date_option
; /* Keeps the argument to --newer-mtime
730 option if it represents a textual date */
731 enum wildcards wildcards
; /* Wildcard settings (--wildcards/
733 int matching_flags
; /* exclude_fnmatch options */
734 int include_anchored
; /* Pattern anchoring options used for
736 bool o_option
; /* True if -o option was given */
737 bool pax_option
; /* True if --pax-option was given */
738 char const *backup_suffix_string
; /* --suffix option argument */
739 char const *version_control_string
; /* --backup option argument */
740 bool input_files
; /* True if some input files where given */
743 #define MAKE_EXCL_OPTIONS(args) \
744 ((((args)->wildcards != disable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
745 | (args)->matching_flags \
748 #define MAKE_INCL_OPTIONS(args) \
749 ((((args)->wildcards == enable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
750 | (args)->include_anchored \
751 | (args)->matching_flags \
755 show_default_settings (FILE *stream
)
758 "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s",
759 archive_format_string (DEFAULT_ARCHIVE_FORMAT
),
760 DEFAULT_ARCHIVE
, DEFAULT_BLOCKING
,
761 quoting_style_args
[DEFAULT_QUOTING_STYLE
],
762 DEFAULT_RMT_COMMAND
);
764 fprintf (stream
, " --rsh-command=%s", REMOTE_SHELL
);
766 fprintf (stream
, "\n");
770 set_subcommand_option (enum subcommand subcommand
)
772 if (subcommand_option
!= UNKNOWN_SUBCOMMAND
773 && subcommand_option
!= subcommand
)
775 _("You may not specify more than one `-Acdtrux' option")));
777 subcommand_option
= subcommand
;
781 set_use_compress_program_option (const char *string
)
783 if (use_compress_program_option
784 && strcmp (use_compress_program_option
, string
) != 0)
785 USAGE_ERROR ((0, 0, _("Conflicting compression options")));
787 use_compress_program_option
= string
;
790 static volatile int _argp_hang
;
792 enum read_file_list_state
/* Result of reading file name from the list file */
794 file_list_success
, /* OK, name read successfully */
795 file_list_end
, /* End of list file */
796 file_list_zero
/* Zero separator encountered where it should not */
799 /* Read from FP a sequence of characters up to FILENAME_TERMINATOR and put them
802 static enum read_file_list_state
803 read_name_from_file (FILE *fp
, struct obstack
*stk
)
808 for (c
= getc (fp
); c
!= EOF
&& c
!= filename_terminator
; c
= getc (fp
))
812 /* We have read a zero separator. The file possibly is
814 /* FATAL_ERROR((0, 0, N_("file name contains null character"))); */
815 return file_list_zero
;
817 obstack_1grow (stk
, c
);
821 obstack_1grow (stk
, 0);
823 return (counter
== 0 && c
== EOF
) ? file_list_end
: file_list_success
;
827 static bool files_from_option
; /* When set, tar will not refuse to create
829 static struct obstack argv_stk
; /* Storage for additional command line options
830 read using -T option */
832 /* Prevent recursive inclusion of the same file */
835 struct file_id_list
*next
;
840 static struct file_id_list
*file_id_list
;
843 add_file_id (const char *filename
)
845 struct file_id_list
*p
;
848 if (stat (filename
, &st
))
849 stat_fatal (filename
);
850 for (p
= file_id_list
; p
; p
= p
->next
)
851 if (p
->ino
== st
.st_ino
&& p
->dev
== st
.st_dev
)
853 FATAL_ERROR ((0, 0, _("%s: file list already read"),
854 quotearg_colon (filename
)));
856 p
= xmalloc (sizeof *p
);
857 p
->next
= file_id_list
;
863 /* Default density numbers for [0-9][lmh] device specifications */
865 #ifndef LOW_DENSITY_NUM
866 # define LOW_DENSITY_NUM 0
869 #ifndef MID_DENSITY_NUM
870 # define MID_DENSITY_NUM 8
873 #ifndef HIGH_DENSITY_NUM
874 # define HIGH_DENSITY_NUM 16
878 update_argv (const char *filename
, struct argp_state
*state
)
885 bool is_stdin
= false;
886 enum read_file_list_state read_state
;
888 if (!strcmp (filename
, "-"))
891 request_stdin ("-T");
896 add_file_id (filename
);
897 if ((fp
= fopen (filename
, "r")) == NULL
)
898 open_fatal (filename
);
901 while ((read_state
= read_name_from_file (fp
, &argv_stk
)) == file_list_success
)
904 if (read_state
== file_list_zero
)
908 WARN ((0, 0, N_("%s: file name read contains nul character"),
909 quotearg_colon (filename
)));
911 /* Prepare new stack contents */
912 size
= obstack_object_size (&argv_stk
);
913 p
= obstack_finish (&argv_stk
);
914 for (; size
> 0; size
--, p
++)
916 obstack_1grow (&argv_stk
, *p
);
918 obstack_1grow (&argv_stk
, '\n');
919 obstack_1grow (&argv_stk
, 0);
922 /* Read rest of files using new filename terminator */
923 filename_terminator
= 0;
924 while (read_name_from_file (fp
, &argv_stk
) == file_list_success
)
934 start
= obstack_finish (&argv_stk
);
936 if (filename_terminator
== 0)
937 for (p
= start
; *p
; p
+= strlen (p
) + 1)
941 new_argc
= state
->argc
+ count
;
942 new_argv
= xmalloc (sizeof (state
->argv
[0]) * (new_argc
+ 1));
943 memcpy (new_argv
, state
->argv
, sizeof (state
->argv
[0]) * (state
->argc
+ 1));
944 state
->argv
= new_argv
;
945 memmove (&state
->argv
[state
->next
+ count
], &state
->argv
[state
->next
],
946 (state
->argc
- state
->next
+ 1) * sizeof (state
->argv
[0]));
948 state
->argc
= new_argc
;
950 for (i
= state
->next
, p
= start
; *p
; p
+= strlen (p
) + 1, i
++)
952 if (filename_terminator
== 0 && p
[0] == '-')
953 state
->argv
[i
++] = "--add-file";
960 parse_opt (int key
, char *arg
, struct argp_state
*state
)
962 struct tar_args
*args
= state
->input
;
967 /* File name or non-parsed option, because of ARGP_IN_ORDER */
968 name_add_name (arg
, MAKE_INCL_OPTIONS (args
));
969 args
->input_files
= true;
973 set_subcommand_option (CAT_SUBCOMMAND
);
979 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
980 && u
== (blocking_factor
= u
)
981 && 0 < blocking_factor
982 && u
== (record_size
= u
* BLOCKSIZE
) / BLOCKSIZE
))
983 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
984 _("Invalid blocking factor")));
989 /* Try to reblock input records. For reading 4.2BSD pipes. */
991 /* It would surely make sense to exchange -B and -R, but it seems
992 that -B has been used for a long while in Sun tar and most
993 BSD-derived systems. This is a consequence of the block/record
994 terminology confusion. */
996 read_full_records_option
= true;
1000 set_subcommand_option (CREATE_SUBCOMMAND
);
1008 set_subcommand_option (DIFF_SUBCOMMAND
);
1012 if (archive_names
== allocated_archive_names
)
1013 archive_name_array
= x2nrealloc (archive_name_array
,
1014 &allocated_archive_names
,
1015 sizeof (archive_name_array
[0]));
1017 archive_name_array
[archive_names
++] = arg
;
1021 /* Since -F is only useful with -M, make it implied. Run this
1022 script at the end of each tape. */
1024 info_script_option
= arg
;
1025 multi_volume_option
= true;
1029 listed_incremental_option
= arg
;
1030 after_date_option
= true;
1034 /* We are making an incremental dump (FIXME: are we?); save
1035 directories at the beginning of the archive, and include in each
1036 directory its contents. */
1038 incremental_option
= true;
1042 /* Follow symbolic links. */
1043 dereference_option
= true;
1047 /* Ignore zero blocks (eofs). This can't be the default,
1048 because Unix tar writes two blocks of zeros, then pads out
1049 the record with garbage. */
1051 ignore_zeros_option
= true;
1056 _("Warning: the -I option is not supported;"
1057 " perhaps you meant -j or -T?")));
1061 set_use_compress_program_option ("bzip2");
1065 /* Don't replace existing files. */
1066 old_files_option
= KEEP_OLD_FILES
;
1070 starting_file_option
= true;
1074 case ONE_FILE_SYSTEM_OPTION
:
1075 /* When dumping directories, don't dump files/subdirectories
1076 that are on other filesystems. */
1077 one_file_system_option
= true;
1081 check_links_option
= 1;
1087 if (xstrtoumax (arg
, 0, 10, &u
, "") != LONGINT_OK
)
1088 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1089 _("Invalid tape length")));
1090 tape_length_option
= 1024 * (tarlong
) u
;
1091 multi_volume_option
= true;
1096 touch_option
= true;
1100 /* Make multivolume archive: when we can't write any more into
1101 the archive, re-open it, and continue writing. */
1103 multi_volume_option
= true;
1107 seekable_archive
= true;
1111 after_date_option
= true;
1114 case NEWER_MTIME_OPTION
:
1115 if (NEWER_OPTION_INITIALIZED (newer_mtime_option
))
1116 USAGE_ERROR ((0, 0, _("More than one threshold date")));
1118 if (FILE_SYSTEM_PREFIX_LEN (arg
) != 0
1123 if (deref_stat (dereference_option
, arg
, &st
) != 0)
1126 USAGE_ERROR ((0, 0, _("Date sample file not found")));
1128 newer_mtime_option
= get_stat_mtime (&st
);
1132 if (! get_date (&newer_mtime_option
, arg
, NULL
))
1134 WARN ((0, 0, _("Substituting %s for unknown date format %s"),
1135 tartime (newer_mtime_option
, false), quote (arg
)));
1136 newer_mtime_option
.tv_nsec
= 0;
1139 args
->textual_date_option
= arg
;
1145 args
->o_option
= true;
1149 to_stdout_option
= true;
1153 same_permissions_option
= true;
1157 absolute_names_option
= true;
1161 set_subcommand_option (APPEND_SUBCOMMAND
);
1165 /* Print block numbers for debugging bad tar archives. */
1167 /* It would surely make sense to exchange -B and -R, but it seems
1168 that -B has been used for a long while in Sun tar ans most
1169 BSD-derived systems. This is a consequence of the block/record
1170 terminology confusion. */
1172 block_number_option
= true;
1176 /* Names to extr are sorted. */
1178 same_order_option
= true;
1182 sparse_option
= true;
1186 set_subcommand_option (LIST_SUBCOMMAND
);
1190 case TEST_LABEL_OPTION
:
1191 set_subcommand_option (LIST_SUBCOMMAND
);
1192 test_label_option
= true;
1196 update_argv (arg
, state
);
1197 /* Indicate we've been given -T option. This is for backward
1198 compatibility only, so that `tar cfT archive /dev/null will
1200 files_from_option
= true;
1204 set_subcommand_option (UPDATE_SUBCOMMAND
);
1208 old_files_option
= UNLINK_FIRST_OLD_FILES
;
1220 volume_label_option
= arg
;
1224 interactive_option
= true;
1228 verify_option
= true;
1232 set_subcommand_option (EXTRACT_SUBCOMMAND
);
1236 if (add_exclude_file (add_exclude
, excluded
, arg
,
1237 MAKE_EXCL_OPTIONS (args
), '\n')
1241 FATAL_ERROR ((0, e
, "%s", quotearg_colon (arg
)));
1246 set_use_compress_program_option ("gzip");
1250 set_use_compress_program_option ("compress");
1253 case ANCHORED_OPTION
:
1254 args
->matching_flags
|= EXCLUDE_ANCHORED
;
1257 case ATIME_PRESERVE_OPTION
:
1258 atime_preserve_option
=
1260 ? XARGMATCH ("--atime-preserve", arg
,
1261 atime_preserve_args
, atime_preserve_types
)
1262 : replace_atime_preserve
);
1263 if (! O_NOATIME
&& atime_preserve_option
== system_atime_preserve
)
1265 _("--atime-preserve='system' is not supported"
1266 " on this platform")));
1269 case CHECKPOINT_OPTION
:
1270 checkpoint_option
= true;
1274 backup_option
= true;
1276 args
->version_control_string
= arg
;
1279 case DELAY_DIRECTORY_RESTORE_OPTION
:
1280 delay_directory_restore_option
= true;
1283 case NO_DELAY_DIRECTORY_RESTORE_OPTION
:
1284 delay_directory_restore_option
= false;
1288 set_subcommand_option (DELETE_SUBCOMMAND
);
1291 case EXCLUDE_OPTION
:
1292 add_exclude (excluded
, arg
, MAKE_EXCL_OPTIONS (args
));
1295 case EXCLUDE_CACHES_OPTION
:
1296 exclude_caches_option
= true;
1299 case FORCE_LOCAL_OPTION
:
1300 force_local_option
= true;
1304 set_archive_format (arg
);
1307 case INDEX_FILE_OPTION
:
1308 index_file_name
= arg
;
1311 case IGNORE_CASE_OPTION
:
1312 args
->matching_flags
|= FNM_CASEFOLD
;
1315 case IGNORE_COMMAND_ERROR_OPTION
:
1316 ignore_command_error_option
= true;
1319 case IGNORE_FAILED_READ_OPTION
:
1320 ignore_failed_read_option
= true;
1323 case KEEP_NEWER_FILES_OPTION
:
1324 old_files_option
= KEEP_NEWER_FILES
;
1328 if (! (strlen (arg
) < GNAME_FIELD_SIZE
1329 && gname_to_gid (arg
, &group_option
)))
1332 if (xstrtoumax (arg
, 0, 10, &g
, "") == LONGINT_OK
1336 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1337 _("%s: Invalid group")));
1342 mode_option
= mode_compile (arg
);
1344 FATAL_ERROR ((0, 0, _("Invalid mode given on option")));
1345 initial_umask
= umask (0);
1346 umask (initial_umask
);
1349 case NO_ANCHORED_OPTION
:
1350 args
->include_anchored
= 0; /* Clear the default for comman line args */
1351 args
->matching_flags
&= ~ EXCLUDE_ANCHORED
;
1354 case NO_IGNORE_CASE_OPTION
:
1355 args
->matching_flags
&= ~ FNM_CASEFOLD
;
1358 case NO_IGNORE_COMMAND_ERROR_OPTION
:
1359 ignore_command_error_option
= false;
1362 case NO_OVERWRITE_DIR_OPTION
:
1363 old_files_option
= NO_OVERWRITE_DIR_OLD_FILES
;
1366 case NO_QUOTE_CHARS_OPTION
:
1368 set_char_quoting (NULL
, *arg
, 0);
1371 case NO_WILDCARDS_OPTION
:
1372 args
->wildcards
= disable_wildcards
;
1375 case NO_WILDCARDS_MATCH_SLASH_OPTION
:
1376 args
->matching_flags
|= FNM_FILE_NAME
;
1380 filename_terminator
= '\0';
1383 case NUMERIC_OWNER_OPTION
:
1384 numeric_owner_option
= true;
1387 case OCCURRENCE_OPTION
:
1389 occurrence_option
= 1;
1393 if (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
)
1394 occurrence_option
= u
;
1396 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1397 _("Invalid number")));
1401 case OVERWRITE_OPTION
:
1402 old_files_option
= OVERWRITE_OLD_FILES
;
1406 if (! (strlen (arg
) < UNAME_FIELD_SIZE
1407 && uname_to_uid (arg
, &owner_option
)))
1410 if (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1414 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1415 _("Invalid owner")));
1419 case QUOTE_CHARS_OPTION
:
1421 set_char_quoting (NULL
, *arg
, 1);
1424 case QUOTING_STYLE_OPTION
:
1425 tar_set_quoting_style (arg
);
1429 args
->pax_option
= true;
1430 xheader_set_option (arg
);
1434 set_archive_format ("posix");
1437 case PRESERVE_OPTION
:
1438 /* FIXME: What it is good for? */
1439 same_permissions_option
= true;
1440 same_order_option
= true;
1443 case RECORD_SIZE_OPTION
:
1446 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1447 && u
== (size_t) u
))
1448 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1449 _("Invalid record size")));
1451 if (record_size
% BLOCKSIZE
!= 0)
1452 USAGE_ERROR ((0, 0, _("Record size must be a multiple of %d."),
1454 blocking_factor
= record_size
/ BLOCKSIZE
;
1458 case RECURSIVE_UNLINK_OPTION
:
1459 recursive_unlink_option
= true;
1462 case REMOVE_FILES_OPTION
:
1463 remove_files_option
= true;
1466 case RESTRICT_OPTION
:
1467 restrict_option
= true;
1470 case RMT_COMMAND_OPTION
:
1474 case RSH_COMMAND_OPTION
:
1475 rsh_command_option
= arg
;
1478 case SHOW_DEFAULTS_OPTION
:
1479 show_default_settings (stdout
);
1483 case STRIP_COMPONENTS_OPTION
:
1486 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1487 && u
== (size_t) u
))
1488 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1489 _("Invalid number of elements")));
1490 strip_name_components
= u
;
1494 case SHOW_OMITTED_DIRS_OPTION
:
1495 show_omitted_dirs_option
= true;
1498 case SHOW_TRANSFORMED_NAMES_OPTION
:
1499 show_transformed_names_option
= true;
1503 backup_option
= true;
1504 args
->backup_suffix_string
= arg
;
1507 case TO_COMMAND_OPTION
:
1508 if (to_command_option
)
1509 USAGE_ERROR ((0, 0, _("Only one --to-command option allowed")));
1510 to_command_option
= arg
;
1514 totals_option
= true;
1517 case TRANSFORM_OPTION
:
1518 set_transform_expr (arg
);
1521 case USE_COMPRESS_PROGRAM_OPTION
:
1522 set_use_compress_program_option (arg
);
1525 case VOLNO_FILE_OPTION
:
1526 volno_file_option
= arg
;
1529 case WILDCARDS_OPTION
:
1530 args
->wildcards
= enable_wildcards
;
1533 case WILDCARDS_MATCH_SLASH_OPTION
:
1534 args
->matching_flags
&= ~ FNM_FILE_NAME
;
1537 case NO_RECURSION_OPTION
:
1538 recursion_option
= 0;
1541 case NO_SAME_OWNER_OPTION
:
1542 same_owner_option
= -1;
1545 case NO_SAME_PERMISSIONS_OPTION
:
1546 same_permissions_option
= -1;
1549 case RECURSION_OPTION
:
1550 recursion_option
= FNM_LEADING_DIR
;
1553 case SAME_OWNER_OPTION
:
1554 same_owner_option
= 1;
1557 case UNQUOTE_OPTION
:
1558 unquote_option
= true;
1561 case NO_UNQUOTE_OPTION
:
1562 unquote_option
= false;
1574 #ifdef DEVICE_PREFIX
1576 int device
= key
- '0';
1578 static char buf
[sizeof DEVICE_PREFIX
+ 10];
1582 argp_error (state
, _("Malformed density argument: %s"), quote (arg
));
1584 strcpy (buf
, DEVICE_PREFIX
);
1585 cursor
= buf
+ strlen (buf
);
1587 #ifdef DENSITY_LETTER
1589 sprintf (cursor
, "%d%c", device
, arg
[0]);
1591 #else /* not DENSITY_LETTER */
1596 device
+= LOW_DENSITY_NUM
;
1600 device
+= MID_DENSITY_NUM
;
1604 device
+= HIGH_DENSITY_NUM
;
1608 argp_error (state
, _("Unknown density: `%c'"), arg
[0]);
1610 sprintf (cursor
, "%d", device
);
1612 #endif /* not DENSITY_LETTER */
1614 if (archive_names
== allocated_archive_names
)
1615 archive_name_array
= x2nrealloc (archive_name_array
,
1616 &allocated_archive_names
,
1617 sizeof (archive_name_array
[0]));
1618 archive_name_array
[archive_names
++] = xstrdup (buf
);
1622 #else /* not DEVICE_PREFIX */
1625 _("Options `-[0-7][lmh]' not supported by *this* tar"));
1627 #endif /* not DEVICE_PREFIX */
1630 state
->flags
|= ARGP_NO_EXIT
;
1631 argp_state_help (state
, state
->out_stream
,
1632 ARGP_HELP_STD_HELP
& ~ARGP_HELP_BUG_ADDR
);
1633 fprintf (state
->out_stream
, "\n%s\n\n",
1634 _("Valid arguments for --quoting-style options are:"));
1635 tar_list_quoting_styles (state
->out_stream
, " ");
1637 fprintf (state
->out_stream
, _("\n*This* tar defaults to:\n"));
1638 show_default_settings (state
->out_stream
);
1639 fprintf (state
->out_stream
, "\n");
1640 fprintf (state
->out_stream
, _("Report bugs to %s.\n"),
1641 argp_program_bug_address
);
1646 argp_state_help (state
, state
->out_stream
, ARGP_HELP_USAGE
);
1650 case VERSION_OPTION
:
1651 version_etc (state
->out_stream
, "tar", PACKAGE_NAME
, VERSION
,
1652 "John Gilmore", "Jay Fenlason", (char *) NULL
);
1657 _argp_hang
= atoi (arg
? arg
: "3600");
1658 while (_argp_hang
-- > 0)
1663 return ARGP_ERR_UNKNOWN
;
1668 static struct argp argp
= {
1681 argp_help (&argp
, stderr
, ARGP_HELP_SEE
, (char*) program_name
);
1686 /* Parse the options for tar. */
1688 static struct argp_option
*
1689 find_argp_option (struct argp_option
*options
, int letter
)
1692 !(options
->name
== NULL
1693 && options
->key
== 0
1694 && options
->arg
== 0
1695 && options
->flags
== 0
1696 && options
->doc
== NULL
); options
++)
1697 if (options
->key
== letter
)
1703 decode_options (int argc
, char **argv
)
1706 struct tar_args args
;
1708 /* Set some default option values. */
1709 args
.textual_date_option
= NULL
;
1710 args
.wildcards
= default_wildcards
;
1711 args
.matching_flags
= 0;
1712 args
.include_anchored
= EXCLUDE_ANCHORED
;
1713 args
.o_option
= false;
1714 args
.pax_option
= false;
1715 args
.backup_suffix_string
= getenv ("SIMPLE_BACKUP_SUFFIX");
1716 args
.version_control_string
= 0;
1717 args
.input_files
= false;
1719 subcommand_option
= UNKNOWN_SUBCOMMAND
;
1720 archive_format
= DEFAULT_FORMAT
;
1721 blocking_factor
= DEFAULT_BLOCKING
;
1722 record_size
= DEFAULT_BLOCKING
* BLOCKSIZE
;
1723 excluded
= new_exclude ();
1724 newer_mtime_option
.tv_sec
= TYPE_MINIMUM (time_t);
1725 newer_mtime_option
.tv_nsec
= -1;
1726 recursion_option
= FNM_LEADING_DIR
;
1727 unquote_option
= true;
1732 /* Convert old-style tar call by exploding option element and rearranging
1733 options accordingly. */
1735 if (argc
> 1 && argv
[1][0] != '-')
1737 int new_argc
; /* argc value for rearranged arguments */
1738 char **new_argv
; /* argv value for rearranged arguments */
1739 char *const *in
; /* cursor into original argv */
1740 char **out
; /* cursor into rearranged argv */
1741 const char *letter
; /* cursor into old option letters */
1742 char buffer
[3]; /* constructed option buffer */
1744 /* Initialize a constructed option. */
1749 /* Allocate a new argument array, and copy program name in it. */
1751 new_argc
= argc
- 1 + strlen (argv
[1]);
1752 new_argv
= xmalloc ((new_argc
+ 1) * sizeof (char *));
1757 /* Copy each old letter option as a separate option, and have the
1758 corresponding argument moved next to it. */
1760 for (letter
= *in
++; *letter
; letter
++)
1762 struct argp_option
*opt
;
1764 buffer
[1] = *letter
;
1765 *out
++ = xstrdup (buffer
);
1766 opt
= find_argp_option (options
, *letter
);
1767 if (opt
&& opt
->arg
)
1769 if (in
< argv
+ argc
)
1772 USAGE_ERROR ((0, 0, _("Old option `%c' requires an argument."),
1777 /* Copy all remaining options. */
1779 while (in
< argv
+ argc
)
1783 /* Replace the old option list by the new one. */
1789 /* Parse all options and non-options as they appear. */
1791 prepend_default_options (getenv ("TAR_OPTIONS"), &argc
, &argv
);
1793 if (argp_parse (&argp
, argc
, argv
, ARGP_IN_ORDER
|ARGP_NO_HELP
,
1795 exit (TAREXIT_FAILURE
);
1798 /* Special handling for 'o' option:
1800 GNU tar used to say "output old format".
1801 UNIX98 tar says don't chown files after extracting (we use
1802 "--no-same-owner" for this).
1804 The old GNU tar semantics is retained when used with --create
1805 option, otherwise UNIX98 semantics is assumed */
1809 if (subcommand_option
== CREATE_SUBCOMMAND
)
1811 /* GNU Tar <= 1.13 compatibility */
1812 set_archive_format ("v7");
1816 /* UNIX98 compatibility */
1817 same_owner_option
= -1;
1821 /* Handle operands after any "--" argument. */
1822 for (; index
< argc
; index
++)
1824 name_add_name (argv
[index
], MAKE_INCL_OPTIONS (&args
));
1825 args
.input_files
= true;
1828 /* Warn about implicit use of the wildcards in command line arguments.
1830 warn_regex_usage
= args
.wildcards
== default_wildcards
;
1832 /* Derive option values and check option consistency. */
1834 if (archive_format
== DEFAULT_FORMAT
)
1836 if (args
.pax_option
)
1837 archive_format
= POSIX_FORMAT
;
1839 archive_format
= DEFAULT_ARCHIVE_FORMAT
;
1842 if ((volume_label_option
&& subcommand_option
== CREATE_SUBCOMMAND
)
1843 || incremental_option
1844 || multi_volume_option
1846 assert_format (FORMAT_MASK (OLDGNU_FORMAT
)
1847 | FORMAT_MASK (GNU_FORMAT
)
1848 | FORMAT_MASK (POSIX_FORMAT
));
1850 if (multi_volume_option
1851 && archive_format
== POSIX_FORMAT
1852 && subcommand_option
== CREATE_SUBCOMMAND
1853 && !tape_length_option
)
1855 _("creating multi-volume archives in posix format requires using --tape-length (-L) option")));
1857 if (occurrence_option
)
1859 if (!args
.input_files
)
1861 _("--occurrence is meaningless without a file list")));
1862 if (subcommand_option
!= DELETE_SUBCOMMAND
1863 && subcommand_option
!= DIFF_SUBCOMMAND
1864 && subcommand_option
!= EXTRACT_SUBCOMMAND
1865 && subcommand_option
!= LIST_SUBCOMMAND
)
1867 _("--occurrence cannot be used in the requested operation mode")));
1870 if (seekable_archive
&& subcommand_option
== DELETE_SUBCOMMAND
)
1872 /* The current code in delete.c is based on the assumption that
1873 skip_member() reads all data from the archive. So, we should
1874 make sure it won't use seeks. On the other hand, the same code
1875 depends on the ability to backspace a record in the archive,
1876 so setting seekable_archive to false is technically incorrect.
1877 However, it is tested only in skip_member(), so it's not a
1879 seekable_archive
= false;
1882 if (archive_names
== 0)
1884 /* If no archive file name given, try TAPE from the environment, or
1885 else, DEFAULT_ARCHIVE from the configuration process. */
1888 archive_name_array
[0] = getenv ("TAPE");
1889 if (! archive_name_array
[0])
1890 archive_name_array
[0] = DEFAULT_ARCHIVE
;
1893 /* Allow multiple archives only with `-M'. */
1895 if (archive_names
> 1 && !multi_volume_option
)
1897 _("Multiple archive files require `-M' option")));
1899 if (listed_incremental_option
1900 && NEWER_OPTION_INITIALIZED (newer_mtime_option
))
1902 _("Cannot combine --listed-incremental with --newer")));
1904 if (volume_label_option
)
1906 if (archive_format
== GNU_FORMAT
|| archive_format
== OLDGNU_FORMAT
)
1908 size_t volume_label_max_len
=
1909 (sizeof current_header
->header
.name
1910 - 1 /* for trailing '\0' */
1911 - (multi_volume_option
1912 ? (sizeof " Volume "
1913 - 1 /* for null at end of " Volume " */
1914 + INT_STRLEN_BOUND (int) /* for volume number */
1915 - 1 /* for sign, as 0 <= volno */)
1917 if (volume_label_max_len
< strlen (volume_label_option
))
1919 ngettext ("%s: Volume label is too long (limit is %lu byte)",
1920 "%s: Volume label is too long (limit is %lu bytes)",
1921 volume_label_max_len
),
1922 quotearg_colon (volume_label_option
),
1923 (unsigned long) volume_label_max_len
));
1926 Label length in PAX format is limited by the volume size. */
1931 if (multi_volume_option
)
1932 USAGE_ERROR ((0, 0, _("Cannot verify multi-volume archives")));
1933 if (use_compress_program_option
)
1934 USAGE_ERROR ((0, 0, _("Cannot verify compressed archives")));
1937 if (use_compress_program_option
)
1939 if (multi_volume_option
)
1940 USAGE_ERROR ((0, 0, _("Cannot use multi-volume compressed archives")));
1941 if (subcommand_option
== UPDATE_SUBCOMMAND
1942 || subcommand_option
== APPEND_SUBCOMMAND
1943 || subcommand_option
== DELETE_SUBCOMMAND
)
1944 USAGE_ERROR ((0, 0, _("Cannot update compressed archives")));
1945 if (subcommand_option
== CAT_SUBCOMMAND
)
1946 USAGE_ERROR ((0, 0, _("Cannot concatenate compressed archives")));
1949 /* It is no harm to use --pax-option on non-pax archives in archive
1950 reading mode. It may even be useful, since it allows to override
1951 file attributes from tar headers. Therefore I allow such usage.
1954 && archive_format
!= POSIX_FORMAT
1955 && (subcommand_option
!= EXTRACT_SUBCOMMAND
1956 || subcommand_option
!= DIFF_SUBCOMMAND
1957 || subcommand_option
!= LIST_SUBCOMMAND
))
1958 USAGE_ERROR ((0, 0, _("--pax-option can be used only on POSIX archives")));
1960 /* If ready to unlink hierarchies, so we are for simpler files. */
1961 if (recursive_unlink_option
)
1962 old_files_option
= UNLINK_FIRST_OLD_FILES
;
1965 if (test_label_option
)
1967 /* --test-label is silent if the user has specified the label name to
1969 if (!args
.input_files
)
1972 else if (utc_option
)
1975 /* Forbid using -c with no input files whatsoever. Check that `-f -',
1976 explicit or implied, is used correctly. */
1978 switch (subcommand_option
)
1980 case CREATE_SUBCOMMAND
:
1981 if (!args
.input_files
&& !files_from_option
)
1983 _("Cowardly refusing to create an empty archive")));
1986 case EXTRACT_SUBCOMMAND
:
1987 case LIST_SUBCOMMAND
:
1988 case DIFF_SUBCOMMAND
:
1989 for (archive_name_cursor
= archive_name_array
;
1990 archive_name_cursor
< archive_name_array
+ archive_names
;
1991 archive_name_cursor
++)
1992 if (!strcmp (*archive_name_cursor
, "-"))
1993 request_stdin ("-f");
1996 case CAT_SUBCOMMAND
:
1997 case UPDATE_SUBCOMMAND
:
1998 case APPEND_SUBCOMMAND
:
1999 for (archive_name_cursor
= archive_name_array
;
2000 archive_name_cursor
< archive_name_array
+ archive_names
;
2001 archive_name_cursor
++)
2002 if (!strcmp (*archive_name_cursor
, "-"))
2004 _("Options `-Aru' are incompatible with `-f -'")));
2010 archive_name_cursor
= archive_name_array
;
2012 /* Prepare for generating backup names. */
2014 if (args
.backup_suffix_string
)
2015 simple_backup_suffix
= xstrdup (args
.backup_suffix_string
);
2019 backup_type
= xget_version ("--backup", args
.version_control_string
);
2020 /* No backup is needed either if explicitely disabled or if
2021 the extracted files are not being written to disk. */
2022 if (backup_type
== no_backups
|| EXTRACT_OVER_PIPE
)
2023 backup_option
= false;
2026 if (verbose_option
&& args
.textual_date_option
)
2028 char const *treated_as
= tartime (newer_mtime_option
, true);
2029 if (strcmp (args
.textual_date_option
, treated_as
) != 0)
2030 WARN ((0, 0, _("Treating date `%s' as %s"),
2031 args
.textual_date_option
, treated_as
));
2038 /* Main routine for tar. */
2040 main (int argc
, char **argv
)
2043 program_name
= argv
[0];
2045 setlocale (LC_ALL
, "");
2046 bindtextdomain (PACKAGE
, LOCALEDIR
);
2047 textdomain (PACKAGE
);
2049 exit_failure
= TAREXIT_FAILURE
;
2050 exit_status
= TAREXIT_SUCCESS
;
2051 filename_terminator
= '\n';
2052 set_quoting_style (0, DEFAULT_QUOTING_STYLE
);
2054 /* Make sure we have first three descriptors available */
2057 /* Pre-allocate a few structures. */
2059 allocated_archive_names
= 10;
2060 archive_name_array
=
2061 xmalloc (sizeof (const char *) * allocated_archive_names
);
2064 obstack_init (&argv_stk
);
2067 /* System V fork+wait does not work if SIGCHLD is ignored. */
2068 signal (SIGCHLD
, SIG_DFL
);
2071 /* Decode options. */
2073 decode_options (argc
, argv
);
2076 /* Main command execution. */
2078 if (volno_file_option
)
2079 init_volume_number ();
2081 switch (subcommand_option
)
2083 case UNKNOWN_SUBCOMMAND
:
2085 _("You must specify one of the `-Acdtrux' options")));
2087 case CAT_SUBCOMMAND
:
2088 case UPDATE_SUBCOMMAND
:
2089 case APPEND_SUBCOMMAND
:
2093 case DELETE_SUBCOMMAND
:
2094 delete_archive_members ();
2097 case CREATE_SUBCOMMAND
:
2100 print_total_written ();
2103 case EXTRACT_SUBCOMMAND
:
2105 read_and (extract_archive
);
2107 /* FIXME: should extract_finish () even if an ordinary signal is
2113 case LIST_SUBCOMMAND
:
2114 read_and (list_archive
);
2117 case DIFF_SUBCOMMAND
:
2119 read_and (diff_archive
);
2123 if (check_links_option
)
2126 if (volno_file_option
)
2127 closeout_volume_number ();
2129 /* Dispose of allocated memory, and return. */
2131 free (archive_name_array
);
2134 if (stdlis
== stdout
)
2137 if (exit_status
== TAREXIT_FAILURE
)
2138 error (0, 0, _("Error exit delayed from previous errors"));
2139 if (ferror (stderr
) || fclose (stderr
) != 0)
2140 exit_status
= TAREXIT_FAILURE
;
2145 tar_stat_init (struct tar_stat_info
*st
)
2147 memset (st
, 0, sizeof (*st
));
2151 tar_stat_destroy (struct tar_stat_info
*st
)
2153 free (st
->orig_file_name
);
2154 free (st
->file_name
);
2155 free (st
->link_name
);
2158 free (st
->sparse_map
);
2160 memset (st
, 0, sizeof (*st
));
2163 /* Format mask for all available formats that support nanosecond
2164 timestamp resolution. */
2165 #define NS_PRECISION_FORMAT_MASK FORMAT_MASK (POSIX_FORMAT)
2167 /* Same as timespec_cmp, but ignore nanoseconds if current archive
2168 format does not provide sufficient resolution. */
2170 tar_timespec_cmp (struct timespec a
, struct timespec b
)
2172 if (!(FORMAT_MASK (current_format
) & NS_PRECISION_FORMAT_MASK
))
2173 a
.tv_nsec
= b
.tv_nsec
= 0;
2174 return timespec_cmp (a
, b
);