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. */
28 #if ! defined SIGCHLD && defined SIGCLD
29 # define SIGCHLD SIGCLD
32 /* The following causes "common.h" to produce definitions of all the global
33 variables, rather than just "extern" declarations of them. GNU tar does
34 depend on the system loader to preset all GLOBAL variables to neutral (or
35 zero) values; explicit initialization is usually not done. */
41 #include <localedir.h>
45 #include <version-etc.h>
49 /* Local declarations. */
51 #ifndef DEFAULT_ARCHIVE_FORMAT
52 # define DEFAULT_ARCHIVE_FORMAT GNU_FORMAT
55 #ifndef DEFAULT_ARCHIVE
56 # define DEFAULT_ARCHIVE "tar.out"
59 #ifndef DEFAULT_BLOCKING
60 # define DEFAULT_BLOCKING 20
66 /* Name of option using stdin. */
67 static const char *stdin_used_by
;
69 /* Doesn't return if stdin already requested. */
71 request_stdin (const char *option
)
74 USAGE_ERROR ((0, 0, _("Options `-%s' and `-%s' both want standard input"),
75 stdin_used_by
, option
));
77 stdin_used_by
= option
;
80 extern int rpmatch (char const *response
);
82 /* Returns true if and only if the user typed an affirmative response. */
84 confirm (const char *message_action
, const char *message_name
)
86 static FILE *confirm_file
;
87 static int confirm_file_EOF
;
92 if (archive
== 0 || stdin_used_by
)
94 confirm_file
= fopen (TTY_NAME
, "r");
96 open_fatal (TTY_NAME
);
100 request_stdin ("-w");
101 confirm_file
= stdin
;
105 fprintf (stdlis
, "%s %s?", message_action
, quote (message_name
));
108 if (!confirm_file_EOF
)
110 char *response
= NULL
;
111 size_t response_size
= 0;
112 if (getline (&response
, &response_size
, confirm_file
) < 0)
113 confirm_file_EOF
= 1;
115 status
= rpmatch (response
) > 0;
119 if (confirm_file_EOF
)
121 fputc ('\n', stdlis
);
128 static struct fmttab
{
130 enum archive_format fmt
;
133 { "oldgnu", OLDGNU_FORMAT
},
134 { "ustar", USTAR_FORMAT
},
135 { "posix", POSIX_FORMAT
},
136 #if 0 /* not fully supported yet */
137 { "star", STAR_FORMAT
},
139 { "gnu", GNU_FORMAT
},
140 { "pax", POSIX_FORMAT
}, /* An alias for posix */
145 set_archive_format (char const *name
)
147 struct fmttab
const *p
;
149 for (p
= fmttab
; strcmp (p
->name
, name
) != 0; )
151 USAGE_ERROR ((0, 0, _("%s: Invalid archive format"),
152 quotearg_colon (name
)));
154 archive_format
= p
->fmt
;
158 archive_format_string (enum archive_format fmt
)
160 struct fmttab
const *p
;
162 for (p
= fmttab
; p
->name
; p
++)
168 #define FORMAT_MASK(n) (1<<(n))
171 assert_format(unsigned fmt_mask
)
173 if ((FORMAT_MASK (archive_format
) & fmt_mask
) == 0)
175 _("GNU features wanted on incompatible archive format")));
179 subcommand_string (enum subcommand c
)
183 case UNKNOWN_SUBCOMMAND
:
186 case APPEND_SUBCOMMAND
:
192 case CREATE_SUBCOMMAND
:
195 case DELETE_SUBCOMMAND
:
198 case DIFF_SUBCOMMAND
:
201 case EXTRACT_SUBCOMMAND
:
204 case LIST_SUBCOMMAND
:
207 case UPDATE_SUBCOMMAND
:
216 tar_list_quoting_styles (FILE *fp
, char *prefix
)
220 for (i
= 0; quoting_style_args
[i
]; i
++)
221 fprintf (fp
, "%s%s\n", prefix
, quoting_style_args
[i
]);
225 tar_set_quoting_style (char *arg
)
229 for (i
= 0; quoting_style_args
[i
]; i
++)
230 if (strcmp (arg
, quoting_style_args
[i
]) == 0)
232 set_quoting_style (NULL
, i
);
236 _("Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."), arg
));
244 ANCHORED_OPTION
= CHAR_MAX
+ 1,
245 ATIME_PRESERVE_OPTION
,
249 DELAY_DIRECTORY_RESTORE_OPTION
,
251 EXCLUDE_CACHES_OPTION
,
257 IGNORE_COMMAND_ERROR_OPTION
,
258 IGNORE_FAILED_READ_OPTION
,
260 KEEP_NEWER_FILES_OPTION
,
264 NO_DELAY_DIRECTORY_RESTORE_OPTION
,
265 NO_IGNORE_CASE_OPTION
,
266 NO_IGNORE_COMMAND_ERROR_OPTION
,
267 NO_OVERWRITE_DIR_OPTION
,
268 NO_QUOTE_CHARS_OPTION
,
270 NO_SAME_OWNER_OPTION
,
271 NO_SAME_PERMISSIONS_OPTION
,
273 NO_WILDCARDS_MATCH_SLASH_OPTION
,
276 NUMERIC_OWNER_OPTION
,
279 ONE_FILE_SYSTEM_OPTION
,
286 QUOTING_STYLE_OPTION
,
289 RECURSIVE_UNLINK_OPTION
,
295 SHOW_DEFAULTS_OPTION
,
296 SHOW_OMITTED_DIRS_OPTION
,
297 SHOW_STORED_NAMES_OPTION
,
298 STRIP_COMPONENTS_OPTION
,
305 USE_COMPRESS_PROGRAM_OPTION
,
309 WILDCARDS_MATCH_SLASH_OPTION
,
313 const char *argp_program_version
= "tar (" PACKAGE_NAME
") " VERSION
;
314 const char *argp_program_bug_address
= "<" PACKAGE_BUGREPORT
">";
315 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\
318 tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n\
319 tar -tvf archive.tar # List all files in archive.tar verbosely.\n\
320 tar -xf archive.tar # Extract all files from archive.tar.\n\
321 \vThe backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
322 The version control may be set with --backup or VERSION_CONTROL, values are:\n\n\
323 none, off never make backups\n\
324 t, numbered make numbered backups\n\
325 nil, existing numbered if numbered backups exist, simple otherwise\n\
326 never, simple always make simple backups\n");
331 Available option letters are DEIJQY and aeqy. Consider the following
334 [For Solaris tar compatibility =/= Is it important at all?]
335 e exit immediately with a nonzero exit status if unexpected errors occur
336 E use extended headers (--format=posix)
338 [q alias for --occurrence=1 =/= this would better be used for quiet?]
339 [I same as T =/= will harm star compatibility]
341 y per-file gzip compression
342 Y per-block gzip compression */
344 static struct argp_option options
[] = {
347 N_("Main operation mode:"), GRID
},
350 N_("list the contents of an archive"), GRID
+1 },
351 {"extract", 'x', 0, 0,
352 N_("extract files from an archive"), GRID
+1 },
353 {"get", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
354 {"create", 'c', 0, 0,
355 N_("create a new archive"), GRID
+1 },
357 N_("find differences between archive and file system"), GRID
+1 },
358 {"compare", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
359 {"append", 'r', 0, 0,
360 N_("append files to the end of an archive"), GRID
+1 },
361 {"update", 'u', 0, 0,
362 N_("only append files newer than copy in archive"), GRID
+1 },
363 {"catenate", 'A', 0, 0,
364 N_("append tar files to an archive"), GRID
+1 },
365 {"concatenate", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
366 {"delete", DELETE_OPTION
, 0, 0,
367 N_("delete from the archive (not on mag tapes!)"), GRID
+1 },
368 {"test-label", TEST_LABEL_OPTION
, NULL
, 0,
369 N_("Test archive volume label and exit"), GRID
+1 },
374 N_("Operation modifiers:"), GRID
},
376 {"sparse", 'S', 0, 0,
377 N_("handle sparse files efficiently"), GRID
+1 },
378 {"incremental", 'G', 0, 0,
379 N_("handle old GNU-format incremental backup"), GRID
+1 },
380 {"listed-incremental", 'g', N_("FILE"), 0,
381 N_("handle new GNU-format incremental backup"), GRID
+1 },
382 {"ignore-failed-read", IGNORE_FAILED_READ_OPTION
, 0, 0,
383 N_("do not exit with nonzero on unreadable files"), GRID
+1 },
384 {"occurrence", OCCURRENCE_OPTION
, N_("NUMBER"), OPTION_ARG_OPTIONAL
,
385 N_("process only the NUMBERth occurrence of each file in the archive. This option is valid only in conjunction with one of the subcommands --delete, --diff, --extract or --list and when a list of files is given either on the command line or via -T option. NUMBER defaults to 1."), GRID
+1 },
386 {"seek", 'n', NULL
, 0,
387 N_("archive is seekable"), GRID
+1 },
392 N_("Overwrite control:\n"), GRID
+1 },
394 {"verify", 'W', 0, 0,
395 N_("attempt to verify the archive after writing it"), GRID
+1 },
396 {"remove-files", REMOVE_FILES_OPTION
, 0, 0,
397 N_("remove files after adding them to the archive"), GRID
+1 },
398 {"keep-old-files", 'k', 0, 0,
399 N_("don't replace existing files when extracting"), GRID
+1 },
400 {"keep-newer-files", KEEP_NEWER_FILES_OPTION
, 0, 0,
401 N_("don't replace existing files that are newer than their archive copies"), GRID
+1 },
402 {"overwrite", OVERWRITE_OPTION
, 0, 0,
403 N_("overwrite existing files when extracting"), GRID
+1 },
404 {"unlink-first", 'U', 0, 0,
405 N_("remove each file prior to extracting over it"), GRID
+1 },
406 {"recursive-unlink", RECURSIVE_UNLINK_OPTION
, 0, 0,
407 N_("empty hierarchies prior to extracting directory"), GRID
+1 },
408 {"no-overwrite-dir", NO_OVERWRITE_DIR_OPTION
, 0, 0,
409 N_("preserve metadata of existing directories"), GRID
+1 },
414 N_("Select output stream:"), GRID
},
416 {"to-stdout", 'O', 0, 0,
417 N_("extract files to standard output"), GRID
+1 },
418 {"to-command", TO_COMMAND_OPTION
, N_("COMMAND"), 0,
419 N_("pipe extracted files to another program"), GRID
+1 },
420 {"ignore-command-error", IGNORE_COMMAND_ERROR_OPTION
, 0, 0,
421 N_("ignore exit codes of children"), GRID
+1 },
422 {"no-ignore-command-error", NO_IGNORE_COMMAND_ERROR_OPTION
, 0, 0,
423 N_("treat non-zero exit codes of children as error"), GRID
+1 },
428 N_("Handling of file attributes:"), GRID
},
430 {"owner", OWNER_OPTION
, N_("NAME"), 0,
431 N_("force NAME as owner for added files"), GRID
+1 },
432 {"group", GROUP_OPTION
, N_("NAME"), 0,
433 N_("force NAME as group for added files"), GRID
+1 },
434 {"mode", MODE_OPTION
, N_("CHANGES"), 0,
435 N_("force (symbolic) mode CHANGES for added files"), GRID
+1 },
436 {"atime-preserve", ATIME_PRESERVE_OPTION
,
437 N_("METHOD"), OPTION_ARG_OPTIONAL
,
438 N_("preserve access times on dumped files, either by restoring the times"
439 " after reading (METHOD='replace'; default) or by not setting the times"
440 " in the first place (METHOD='system')"), GRID
+1 },
442 N_("don't extract file modified time"), GRID
+1 },
443 {"same-owner", SAME_OWNER_OPTION
, 0, 0,
444 N_("try extracting files with the same ownership"), GRID
+1 },
445 {"no-same-owner", NO_SAME_OWNER_OPTION
, 0, 0,
446 N_("extract files as yourself"), GRID
+1 },
447 {"numeric-owner", NUMERIC_OWNER_OPTION
, 0, 0,
448 N_("always use numbers for user/group names"), GRID
+1 },
449 {"preserve-permissions", 'p', 0, 0,
450 N_("extract information about file permissions (default for superuser)"),
452 {"same-permissions", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
453 {"no-same-permissions", NO_SAME_PERMISSIONS_OPTION
, 0, 0,
454 N_("apply the user's umask when extracting permissions from the archive (default for ordinary users)"), GRID
+1 },
455 {"preserve-order", 's', 0, 0,
456 N_("sort names to extract to match archive"), GRID
+1 },
457 {"same-order", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
458 {"preserve", PRESERVE_OPTION
, 0, 0,
459 N_("same as both -p and -s"), GRID
+1 },
460 {"delay-directory-restore", DELAY_DIRECTORY_RESTORE_OPTION
, 0, 0,
461 N_("Delay setting modification times and permissions of extracted directories until the end of extraction."), GRID
+1 },
462 {"no-delay-directory-restore", NO_DELAY_DIRECTORY_RESTORE_OPTION
, 0, 0,
463 N_("Cancel the effect of --delay-directory-restore option."), GRID
+1 },
468 N_("Device selection and switching:\n"), GRID
+1 },
470 {"file", 'f', N_("ARCHIVE"), 0,
471 N_("use archive file or device ARCHIVE"), GRID
+1 },
472 {"force-local", FORCE_LOCAL_OPTION
, 0, 0,
473 N_("archive file is local even if it has a colon"), GRID
+1 },
474 {"rmt-command", RMT_COMMAND_OPTION
, N_("COMMAND"), 0,
475 N_("use given rmt COMMAND instead of rmt"), GRID
+1 },
476 {"rsh-command", RSH_COMMAND_OPTION
, N_("COMMAND"), 0,
477 N_("use remote COMMAND instead of rsh"), GRID
+1 },
479 {"-[0-7][lmh]", 0, NULL
, OPTION_DOC
, /* It is OK, since `name' will never be
481 N_("specify drive and density"), GRID
+1 },
483 {NULL
, '0', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
484 {NULL
, '1', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
485 {NULL
, '2', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
486 {NULL
, '3', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
487 {NULL
, '4', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
488 {NULL
, '5', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
489 {NULL
, '6', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
490 {NULL
, '7', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
491 {NULL
, '8', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
492 {NULL
, '9', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
494 {"multi-volume", 'M', 0, 0,
495 N_("create/list/extract multi-volume archive"), GRID
+1 },
496 {"tape-length", 'L', N_("NUMBER"), 0,
497 N_("change tape after writing NUMBER x 1024 bytes"), GRID
+1 },
498 {"info-script", 'F', N_("NAME"), 0,
499 N_("run script at end of each tape (implies -M)"), GRID
+1 },
500 {"new-volume-script", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
501 {"volno-file", VOLNO_FILE_OPTION
, N_("FILE"), 0,
502 N_("use/update the volume number in FILE"), GRID
+1 },
507 N_("Device blocking:"), GRID
+1 },
509 {"blocking-factor", 'b', N_("BLOCKS"), 0,
510 N_("BLOCKS x 512 bytes per record"), GRID
+1 },
511 {"record-size", RECORD_SIZE_OPTION
, N_("NUMBER"), 0,
512 N_("NUMBER of bytes per record, multiple of 512"), GRID
+1 },
513 {"ignore-zeros", 'i', 0, 0,
514 N_("ignore zeroed blocks in archive (means EOF)"), GRID
+1 },
515 {"read-full-records", 'B', 0, 0,
516 N_("reblock as we read (for 4.2BSD pipes)"), GRID
+1 },
521 N_("Archive format selection:"), GRID
},
523 {"format", 'H', N_("FORMAT"), 0,
524 N_("create archive of the given format."), GRID
+1 },
526 {NULL
, 0, NULL
, 0, N_("FORMAT is one of the following:"), GRID
+2 },
527 {" v7", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("old V7 tar format"),
529 {" oldgnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
530 N_("GNU format as per tar <= 1.12"), GRID
+3 },
531 {" gnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
532 N_("GNU tar 1.13.x format"), GRID
+3 },
533 {" ustar", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
534 N_("POSIX 1003.1-1988 (ustar) format"), GRID
+3 },
535 {" pax", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
536 N_("POSIX 1003.1-2001 (pax) format"), GRID
+3 },
537 {" posix", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("same as pax"), GRID
+3 },
539 {"old-archive", OLD_ARCHIVE_OPTION
, 0, 0, /* FIXME */
540 N_("same as --format=v7"), GRID
+8 },
541 {"portability", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
542 {"posix", POSIX_OPTION
, 0, 0,
543 N_("same as --format=posix"), GRID
+8 },
544 {"pax-option", PAX_OPTION
, N_("keyword[[:]=value][,keyword[[:]=value], ...]"), 0,
545 N_("control pax keywords"), GRID
+8 },
546 {"label", 'V', N_("TEXT"), 0,
547 N_("create archive with volume name TEXT. At list/extract time, use TEXT as a globbing pattern for volume name"), GRID
+8 },
549 N_("filter the archive through bzip2"), GRID
+8 },
551 N_("filter the archive through gzip"), GRID
+8 },
552 {"gunzip", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
553 {"ungzip", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
554 {"compress", 'Z', 0, 0,
555 N_("filter the archive through compress"), GRID
+8 },
556 {"uncompress", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
557 {"use-compress-program", USE_COMPRESS_PROGRAM_OPTION
, N_("PROG"), 0,
558 N_("filter through PROG (must accept -d)"), GRID
+8 },
563 N_("Local file selection:"), GRID
},
565 {"add-file", ARGP_KEY_ARG
, N_("FILE"), 0,
566 N_("add given FILE to the archive (useful if its name starts with a dash)"), GRID
+1 },
567 {"directory", 'C', N_("DIR"), 0,
568 N_("change to directory DIR"), GRID
+1 },
569 {"files-from", 'T', N_("FILE"), 0,
570 N_("get names to extract or create from FILE"), GRID
+1 },
571 {"null", NULL_OPTION
, 0, 0,
572 N_("-T reads null-terminated names, disable -C"), GRID
+1 },
573 {"unquote", UNQUOTE_OPTION
, 0, 0,
574 N_("unquote filenames read with -T (default)"), GRID
+1 },
575 {"no-unquote", NO_UNQUOTE_OPTION
, 0, 0,
576 N_("do not unquote filenames read with -T"), GRID
+1 },
577 {"exclude", EXCLUDE_OPTION
, N_("PATTERN"), 0,
578 N_("exclude files, given as a PATTERN"), GRID
+1 },
579 {"exclude-from", 'X', N_("FILE"), 0,
580 N_("exclude patterns listed in FILE"), GRID
+1 },
581 {"exclude-caches", EXCLUDE_CACHES_OPTION
, 0, 0,
582 N_("exclude directories containing a cache tag"), GRID
+1 },
583 {"ignore-case", IGNORE_CASE_OPTION
, 0, 0,
584 N_("exclusion ignores case"), GRID
+1 },
585 {"anchored", ANCHORED_OPTION
, 0, 0,
586 N_("exclude patterns match file name start"), GRID
+1 },
587 {"no-anchored", NO_ANCHORED_OPTION
, 0, 0,
588 N_("exclude patterns match after any `/' (default)"), GRID
+1 },
589 {"no-ignore-case", NO_IGNORE_CASE_OPTION
, 0, 0,
590 N_("exclusion is case sensitive (default)"), GRID
+1 },
591 {"no-wildcards", NO_WILDCARDS_OPTION
, 0, 0,
592 N_("exclude patterns are plain strings"), GRID
+1 },
593 {"no-wildcards-match-slash", NO_WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
594 N_("exclude pattern wildcards do not match `/'"), GRID
+1 },
595 {"no-recursion", NO_RECURSION_OPTION
, 0, 0,
596 N_("avoid descending automatically in directories"), GRID
+1 },
597 {"one-file-system", ONE_FILE_SYSTEM_OPTION
, 0, 0,
598 N_("stay in local file system when creating archive"), GRID
+1 },
599 {NULL
, 'l', 0, OPTION_HIDDEN
, "", GRID
+1 },
600 {"recursion", RECURSION_OPTION
, 0, 0,
601 N_("recurse into directories (default)"), GRID
+1 },
602 {"absolute-names", 'P', 0, 0,
603 N_("don't strip leading `/'s from file names"), GRID
+1 },
604 {"dereference", 'h', 0, 0,
605 N_("follow symlinks; archive and dump the files they point to"), GRID
+1 },
606 {"starting-file", 'K', N_("MEMBER-NAME"), 0,
607 N_("begin at member MEMBER-NAME in the archive"), GRID
+1 },
608 {"strip-components", STRIP_COMPONENTS_OPTION
, N_("NUMBER"), 0,
609 N_("strip NUMBER leading components from file names"), GRID
+1 },
610 {"newer", 'N', N_("DATE-OR-FILE"), 0,
611 N_("only store files newer than DATE-OR-FILE"), GRID
+1 },
612 {"newer-mtime", NEWER_MTIME_OPTION
, N_("DATE"), 0,
613 N_("compare date and time when data changed only"), GRID
+1 },
614 {"after-date", 'N', N_("DATE"), 0,
615 N_("same as -N"), GRID
+1 },
616 {"backup", BACKUP_OPTION
, N_("CONTROL"), OPTION_ARG_OPTIONAL
,
617 N_("backup before removal, choose version CONTROL"), GRID
+1 },
618 {"suffix", SUFFIX_OPTION
, N_("STRING"), 0,
619 N_("backup before removal, override usual suffix ('~' unless overridden by environment variable SIMPLE_BACKUP_SUFFIX)"), GRID
+1 },
620 {"wildcards", WILDCARDS_OPTION
, 0, 0,
621 N_("exclude patterns use wildcards (default)"), GRID
+1 },
622 {"wildcards-match-slash", WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
623 N_("exclude pattern wildcards match `/' (default)"), GRID
+1 },
628 N_("Informative output:"), GRID
},
630 {"verbose", 'v', 0, 0,
631 N_("verbosely list files processed"), GRID
+1 },
632 {"checkpoint", CHECKPOINT_OPTION
, 0, 0,
633 N_("display progress messages every 10th record"), GRID
+1 },
634 {"check-links", CHECK_LINKS_OPTION
, 0, 0,
635 N_("print a message if not all links are dumped"), GRID
+1 },
636 {"totals", TOTALS_OPTION
, 0, 0,
637 N_("print total bytes written while creating archive"), GRID
+1 },
638 {"utc", UTC_OPTION
, 0, 0,
639 N_("print file modification dates in UTC"), GRID
+1 },
640 {"index-file", INDEX_FILE_OPTION
, N_("FILE"), 0,
641 N_("send verbose output to FILE"), GRID
+1 },
642 {"block-number", 'R', 0, 0,
643 N_("show block number within archive with each message"), GRID
+1 },
644 {"interactive", 'w', 0, 0,
645 N_("ask for confirmation for every action"), GRID
+1 },
646 {"confirmation", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
647 {"show-defaults", SHOW_DEFAULTS_OPTION
, 0, 0,
648 N_("Show tar defaults"), GRID
+1 },
649 {"show-omitted-dirs", SHOW_OMITTED_DIRS_OPTION
, 0, 0,
650 N_("When listing or extracting, list each directory that does not match search criteria"), GRID
+1 },
651 {"show-stored-names", SHOW_STORED_NAMES_OPTION
, 0, 0,
652 N_("When creating archive in verbose mode, list member names as stored in the archive"),
654 {"quoting-style", QUOTING_STYLE_OPTION
, N_("STYLE"), 0,
655 N_("Set name quoting style. See below for valid STYLE values."), GRID
+1 },
656 {"quote-chars", QUOTE_CHARS_OPTION
, N_("STRING"), 0,
657 N_("Additionally quote characters from STRING"), GRID
+1 },
658 {"no-quote-chars", NO_QUOTE_CHARS_OPTION
, N_("STRING"), 0,
659 N_("Disable quoting for characters from STRING"), GRID
+1 },
664 N_("Compatibility options:"), GRID
},
667 N_("when creating, same as --old-archive. When extracting, same as --no-same-owner"), GRID
+1 },
672 N_("Other options:"), GRID
},
674 {"restrict", RESTRICT_OPTION
, 0, 0,
675 N_("Restrict use of some potentially harmful options"), -1 },
677 {"help", '?', 0, 0, N_("Give this help list"), -1},
678 {"usage", USAGE_OPTION
, 0, 0, N_("Give a short usage message"), -1},
679 {"version", VERSION_OPTION
, 0, 0, N_("Print program version"), -1},
680 /* FIXME -V (--label) conflicts with the default short option for
682 {"HANG", HANG_OPTION
, "SECS", OPTION_ARG_OPTIONAL
| OPTION_HIDDEN
,
683 N_("Hang for SECS seconds (default 3600)"), 0},
689 static char const *const atime_preserve_args
[] =
691 "replace", "system", NULL
693 static enum atime_preserve
const atime_preserve_types
[] =
695 replace_atime_preserve
, system_atime_preserve
697 ARGMATCH_VERIFY (atime_preserve_args
, atime_preserve_types
);
701 char const *textual_date_option
;
705 char const *backup_suffix_string
;
706 char const *version_control_string
;
711 show_default_settings (FILE *stream
)
714 "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s",
715 archive_format_string (DEFAULT_ARCHIVE_FORMAT
),
716 DEFAULT_ARCHIVE
, DEFAULT_BLOCKING
,
717 quoting_style_args
[DEFAULT_QUOTING_STYLE
],
718 DEFAULT_RMT_COMMAND
);
720 fprintf (stream
, " --rsh-command=%s", REMOTE_SHELL
);
722 fprintf (stream
, "\n");
726 set_subcommand_option (enum subcommand subcommand
)
728 if (subcommand_option
!= UNKNOWN_SUBCOMMAND
729 && subcommand_option
!= subcommand
)
731 _("You may not specify more than one `-Acdtrux' option")));
733 subcommand_option
= subcommand
;
737 set_use_compress_program_option (const char *string
)
739 if (use_compress_program_option
740 && strcmp (use_compress_program_option
, string
) != 0)
741 USAGE_ERROR ((0, 0, _("Conflicting compression options")));
743 use_compress_program_option
= string
;
746 static volatile int _argp_hang
;
748 enum read_file_list_state
/* Result of reading file name from the list file */
750 file_list_success
, /* OK, name read successfully */
751 file_list_end
, /* End of list file */
752 file_list_zero
/* Zero separator encountered where it should not */
755 /* Read from FP a sequence of characters up to FILENAME_TERMINATOR and put them
758 static enum read_file_list_state
759 read_name_from_file (FILE *fp
, struct obstack
*stk
)
764 for (c
= getc (fp
); c
!= EOF
&& c
!= filename_terminator
; c
= getc (fp
))
768 /* We have read a zero separator. The file possibly is
770 /* FATAL_ERROR((0, 0, N_("file name contains null character"))); */
771 return file_list_zero
;
773 obstack_1grow (stk
, c
);
777 obstack_1grow (stk
, 0);
779 return (counter
== 0 && c
== EOF
) ? file_list_end
: file_list_success
;
783 static bool files_from_option
; /* When set, tar will not refuse to create
785 static struct obstack argv_stk
; /* Storage for additional command line options
786 read using -T option */
788 /* Prevent recursive inclusion of the same file */
791 struct file_id_list
*next
;
796 static struct file_id_list
*file_id_list
;
799 add_file_id (const char *filename
)
801 struct file_id_list
*p
;
804 if (stat (filename
, &st
))
805 stat_fatal (filename
);
806 for (p
= file_id_list
; p
; p
= p
->next
)
807 if (p
->ino
== st
.st_ino
&& p
->dev
== st
.st_dev
)
809 FATAL_ERROR ((0, 0, _("%s: file list already read"),
810 quotearg_colon (filename
)));
812 p
= xmalloc (sizeof *p
);
813 p
->next
= file_id_list
;
819 /* Default density numbers for [0-9][lmh] device specifications */
821 #ifndef LOW_DENSITY_NUM
822 # define LOW_DENSITY_NUM 0
825 #ifndef MID_DENSITY_NUM
826 # define MID_DENSITY_NUM 8
829 #ifndef HIGH_DENSITY_NUM
830 # define HIGH_DENSITY_NUM 16
834 update_argv (const char *filename
, struct argp_state
*state
)
841 bool is_stdin
= false;
842 enum read_file_list_state read_state
;
844 if (!strcmp (filename
, "-"))
847 request_stdin ("-T");
852 add_file_id (filename
);
853 if ((fp
= fopen (filename
, "r")) == NULL
)
854 open_fatal (filename
);
857 while ((read_state
= read_name_from_file (fp
, &argv_stk
)) == file_list_success
)
860 if (read_state
== file_list_zero
)
864 WARN ((0, 0, N_("%s: file name read contains nul character"),
865 quotearg_colon (filename
)));
867 /* Prepare new stack contents */
868 size
= obstack_object_size (&argv_stk
);
869 p
= obstack_finish (&argv_stk
);
870 for (; size
> 0; size
--, p
++)
872 obstack_1grow (&argv_stk
, *p
);
874 obstack_1grow (&argv_stk
, '\n');
875 obstack_1grow (&argv_stk
, 0);
878 /* Read rest of files using new filename terminator */
879 filename_terminator
= 0;
880 while (read_name_from_file (fp
, &argv_stk
) == file_list_success
)
890 start
= obstack_finish (&argv_stk
);
892 if (filename_terminator
== 0)
893 for (p
= start
; *p
; p
+= strlen (p
) + 1)
897 new_argc
= state
->argc
+ count
;
898 new_argv
= xmalloc (sizeof (state
->argv
[0]) * (new_argc
+ 1));
899 memcpy (new_argv
, state
->argv
, sizeof (state
->argv
[0]) * (state
->argc
+ 1));
900 state
->argv
= new_argv
;
901 memmove (&state
->argv
[state
->next
+ count
], &state
->argv
[state
->next
],
902 (state
->argc
- state
->next
+ 1) * sizeof (state
->argv
[0]));
904 state
->argc
= new_argc
;
906 for (i
= state
->next
, p
= start
; *p
; p
+= strlen (p
) + 1, i
++)
908 if (filename_terminator
== 0 && p
[0] == '-')
909 state
->argv
[i
++] = "--add-file";
916 parse_opt (int key
, char *arg
, struct argp_state
*state
)
918 struct tar_args
*args
= state
->input
;
923 /* File name or non-parsed option, because of ARGP_IN_ORDER */
929 set_subcommand_option (CAT_SUBCOMMAND
);
935 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
936 && u
== (blocking_factor
= u
)
937 && 0 < blocking_factor
938 && u
== (record_size
= u
* BLOCKSIZE
) / BLOCKSIZE
))
939 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
940 _("Invalid blocking factor")));
945 /* Try to reblock input records. For reading 4.2BSD pipes. */
947 /* It would surely make sense to exchange -B and -R, but it seems
948 that -B has been used for a long while in Sun tar and most
949 BSD-derived systems. This is a consequence of the block/record
950 terminology confusion. */
952 read_full_records_option
= true;
956 set_subcommand_option (CREATE_SUBCOMMAND
);
965 set_subcommand_option (DIFF_SUBCOMMAND
);
969 if (archive_names
== allocated_archive_names
)
971 allocated_archive_names
*= 2;
973 xrealloc (archive_name_array
,
974 sizeof (const char *) * allocated_archive_names
);
976 archive_name_array
[archive_names
++] = arg
;
980 /* Since -F is only useful with -M, make it implied. Run this
981 script at the end of each tape. */
983 info_script_option
= arg
;
984 multi_volume_option
= true;
988 listed_incremental_option
= arg
;
989 after_date_option
= true;
993 /* We are making an incremental dump (FIXME: are we?); save
994 directories at the beginning of the archive, and include in each
995 directory its contents. */
997 incremental_option
= true;
1001 /* Follow symbolic links. */
1002 dereference_option
= true;
1006 /* Ignore zero blocks (eofs). This can't be the default,
1007 because Unix tar writes two blocks of zeros, then pads out
1008 the record with garbage. */
1010 ignore_zeros_option
= true;
1015 _("Warning: the -I option is not supported;"
1016 " perhaps you meant -j or -T?")));
1020 set_use_compress_program_option ("bzip2");
1024 /* Don't replace existing files. */
1025 old_files_option
= KEEP_OLD_FILES
;
1029 starting_file_option
= true;
1034 /* Historically equivalent to --one-file-system. This usage is
1035 incompatible with UNIX98 and POSIX specs and therefore is
1036 deprecated. The semantics of -l option will be changed in
1037 future versions. See TODO.
1040 _("Semantics of -l option will change in the future releases.")));
1042 _("Please use --one-file-system option instead.")));
1044 case ONE_FILE_SYSTEM_OPTION
:
1045 /* When dumping directories, don't dump files/subdirectories
1046 that are on other filesystems. */
1047 one_file_system_option
= true;
1053 if (xstrtoumax (arg
, 0, 10, &u
, "") != LONGINT_OK
)
1054 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1055 _("Invalid tape length")));
1056 tape_length_option
= 1024 * (tarlong
) u
;
1057 multi_volume_option
= true;
1062 touch_option
= true;
1066 /* Make multivolume archive: when we can't write any more into
1067 the archive, re-open it, and continue writing. */
1069 multi_volume_option
= true;
1073 seekable_archive
= true;
1077 after_date_option
= true;
1080 case NEWER_MTIME_OPTION
:
1081 if (NEWER_OPTION_INITIALIZED (newer_mtime_option
))
1082 USAGE_ERROR ((0, 0, _("More than one threshold date")));
1084 if (FILE_SYSTEM_PREFIX_LEN (arg
) != 0
1089 if (deref_stat (dereference_option
, arg
, &st
) != 0)
1092 USAGE_ERROR ((0, 0, _("Date sample file not found")));
1094 newer_mtime_option
= get_stat_mtime (&st
);
1098 if (! get_date (&newer_mtime_option
, arg
, NULL
))
1100 WARN ((0, 0, _("Substituting %s for unknown date format %s"),
1101 tartime (newer_mtime_option
, false), quote (arg
)));
1102 newer_mtime_option
.tv_nsec
= 0;
1105 args
->textual_date_option
= arg
;
1111 args
->o_option
= true;
1115 to_stdout_option
= true;
1119 same_permissions_option
= true;
1123 absolute_names_option
= true;
1127 set_subcommand_option (APPEND_SUBCOMMAND
);
1131 /* Print block numbers for debugging bad tar archives. */
1133 /* It would surely make sense to exchange -B and -R, but it seems
1134 that -B has been used for a long while in Sun tar ans most
1135 BSD-derived systems. This is a consequence of the block/record
1136 terminology confusion. */
1138 block_number_option
= true;
1142 /* Names to extr are sorted. */
1144 same_order_option
= true;
1148 sparse_option
= true;
1152 set_subcommand_option (LIST_SUBCOMMAND
);
1156 case TEST_LABEL_OPTION
:
1157 set_subcommand_option (LIST_SUBCOMMAND
);
1158 test_label_option
= true;
1162 update_argv (arg
, state
);
1163 /* Indicate we've been given -T option. This is for backward
1164 compatibility only, so that `tar cfT archive /dev/null will
1166 files_from_option
= true;
1170 set_subcommand_option (UPDATE_SUBCOMMAND
);
1174 old_files_option
= UNLINK_FIRST_OLD_FILES
;
1186 volume_label_option
= arg
;
1190 interactive_option
= true;
1194 verify_option
= true;
1198 set_subcommand_option (EXTRACT_SUBCOMMAND
);
1202 if (add_exclude_file (add_exclude
, excluded
, arg
,
1203 args
->exclude_options
| recursion_option
, '\n')
1207 FATAL_ERROR ((0, e
, "%s", quotearg_colon (arg
)));
1212 set_use_compress_program_option ("gzip");
1216 set_use_compress_program_option ("compress");
1219 case ANCHORED_OPTION
:
1220 args
->exclude_options
|= EXCLUDE_ANCHORED
;
1223 case ATIME_PRESERVE_OPTION
:
1224 atime_preserve_option
=
1226 ? XARGMATCH ("--atime-preserve", arg
,
1227 atime_preserve_args
, atime_preserve_types
)
1228 : replace_atime_preserve
);
1229 if (! O_NOATIME
&& atime_preserve_option
== system_atime_preserve
)
1231 _("--atime-preserve='system' is not supported"
1232 " on this platform")));
1235 case CHECKPOINT_OPTION
:
1236 checkpoint_option
= true;
1240 backup_option
= true;
1242 args
->version_control_string
= arg
;
1245 case DELAY_DIRECTORY_RESTORE_OPTION
:
1246 delay_directory_restore_option
= true;
1249 case NO_DELAY_DIRECTORY_RESTORE_OPTION
:
1250 delay_directory_restore_option
= false;
1254 set_subcommand_option (DELETE_SUBCOMMAND
);
1257 case EXCLUDE_OPTION
:
1258 add_exclude (excluded
, arg
, args
->exclude_options
| recursion_option
);
1261 case EXCLUDE_CACHES_OPTION
:
1262 exclude_caches_option
= true;
1265 case FORCE_LOCAL_OPTION
:
1266 force_local_option
= true;
1270 set_archive_format (arg
);
1273 case INDEX_FILE_OPTION
:
1274 index_file_name
= arg
;
1277 case IGNORE_CASE_OPTION
:
1278 args
->exclude_options
|= FNM_CASEFOLD
;
1281 case IGNORE_COMMAND_ERROR_OPTION
:
1282 ignore_command_error_option
= true;
1285 case IGNORE_FAILED_READ_OPTION
:
1286 ignore_failed_read_option
= true;
1289 case KEEP_NEWER_FILES_OPTION
:
1290 old_files_option
= KEEP_NEWER_FILES
;
1294 if (! (strlen (arg
) < GNAME_FIELD_SIZE
1295 && gname_to_gid (arg
, &group_option
)))
1298 if (xstrtoumax (arg
, 0, 10, &g
, "") == LONGINT_OK
1302 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1303 _("%s: Invalid group")));
1308 mode_option
= mode_compile (arg
);
1310 FATAL_ERROR ((0, 0, _("Invalid mode given on option")));
1311 initial_umask
= umask (0);
1312 umask (initial_umask
);
1315 case NO_ANCHORED_OPTION
:
1316 args
->exclude_options
&= ~ EXCLUDE_ANCHORED
;
1319 case NO_IGNORE_CASE_OPTION
:
1320 args
->exclude_options
&= ~ FNM_CASEFOLD
;
1323 case NO_IGNORE_COMMAND_ERROR_OPTION
:
1324 ignore_command_error_option
= false;
1327 case NO_OVERWRITE_DIR_OPTION
:
1328 old_files_option
= NO_OVERWRITE_DIR_OLD_FILES
;
1331 case NO_QUOTE_CHARS_OPTION
:
1333 set_char_quoting (NULL
, *arg
, 0);
1336 case NO_WILDCARDS_OPTION
:
1337 args
->exclude_options
&= ~ EXCLUDE_WILDCARDS
;
1340 case NO_WILDCARDS_MATCH_SLASH_OPTION
:
1341 args
->exclude_options
|= FNM_FILE_NAME
;
1345 filename_terminator
= '\0';
1348 case NUMERIC_OWNER_OPTION
:
1349 numeric_owner_option
= true;
1352 case OCCURRENCE_OPTION
:
1354 occurrence_option
= 1;
1358 if (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
)
1359 occurrence_option
= u
;
1361 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1362 _("Invalid number")));
1366 case OVERWRITE_OPTION
:
1367 old_files_option
= OVERWRITE_OLD_FILES
;
1371 if (! (strlen (arg
) < UNAME_FIELD_SIZE
1372 && uname_to_uid (arg
, &owner_option
)))
1375 if (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1379 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1380 _("Invalid owner")));
1384 case QUOTE_CHARS_OPTION
:
1386 set_char_quoting (NULL
, *arg
, 1);
1389 case QUOTING_STYLE_OPTION
:
1390 tar_set_quoting_style (arg
);
1395 xheader_set_option (arg
);
1399 set_archive_format ("posix");
1402 case PRESERVE_OPTION
:
1403 same_permissions_option
= true;
1404 same_order_option
= true;
1407 case RECORD_SIZE_OPTION
:
1410 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1411 && u
== (size_t) u
))
1412 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1413 _("Invalid record size")));
1415 if (record_size
% BLOCKSIZE
!= 0)
1416 USAGE_ERROR ((0, 0, _("Record size must be a multiple of %d."),
1418 blocking_factor
= record_size
/ BLOCKSIZE
;
1422 case RECURSIVE_UNLINK_OPTION
:
1423 recursive_unlink_option
= true;
1426 case REMOVE_FILES_OPTION
:
1427 remove_files_option
= true;
1430 case RESTRICT_OPTION
:
1431 restrict_option
= true;
1434 case RMT_COMMAND_OPTION
:
1438 case RSH_COMMAND_OPTION
:
1439 rsh_command_option
= arg
;
1442 case SHOW_DEFAULTS_OPTION
:
1443 show_default_settings (stdout
);
1446 case STRIP_COMPONENTS_OPTION
:
1449 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1450 && u
== (size_t) u
))
1451 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1452 _("Invalid number of elements")));
1453 strip_name_components
= u
;
1457 case SHOW_OMITTED_DIRS_OPTION
:
1458 show_omitted_dirs_option
= true;
1461 case SHOW_STORED_NAMES_OPTION
:
1462 show_stored_names_option
= true;
1466 backup_option
= true;
1467 args
->backup_suffix_string
= arg
;
1470 case TO_COMMAND_OPTION
:
1471 if (to_command_option
)
1472 USAGE_ERROR ((0, 0, _("Only one --to-command option allowed")));
1473 to_command_option
= arg
;
1477 totals_option
= true;
1480 case USE_COMPRESS_PROGRAM_OPTION
:
1481 set_use_compress_program_option (arg
);
1484 case VOLNO_FILE_OPTION
:
1485 volno_file_option
= arg
;
1488 case WILDCARDS_OPTION
:
1489 args
->exclude_options
|= EXCLUDE_WILDCARDS
;
1492 case WILDCARDS_MATCH_SLASH_OPTION
:
1493 args
->exclude_options
&= ~ FNM_FILE_NAME
;
1496 case CHECK_LINKS_OPTION
:
1497 check_links_option
= 1;
1500 case NO_RECURSION_OPTION
:
1501 recursion_option
= 0;
1504 case NO_SAME_OWNER_OPTION
:
1505 same_owner_option
= -1;
1508 case NO_SAME_PERMISSIONS_OPTION
:
1509 same_permissions_option
= -1;
1512 case RECURSION_OPTION
:
1513 recursion_option
= FNM_LEADING_DIR
;
1516 case SAME_OWNER_OPTION
:
1517 same_owner_option
= 1;
1520 case UNQUOTE_OPTION
:
1521 unquote_option
= true;
1524 case NO_UNQUOTE_OPTION
:
1525 unquote_option
= false;
1537 #ifdef DEVICE_PREFIX
1539 int device
= key
- '0';
1541 static char buf
[sizeof DEVICE_PREFIX
+ 10];
1545 argp_error (state
, _("Malformed density argument: %s"), quote (arg
));
1547 strcpy (buf
, DEVICE_PREFIX
);
1548 cursor
= buf
+ strlen (buf
);
1550 #ifdef DENSITY_LETTER
1552 sprintf (cursor
, "%d%c", device
, arg
[0]);
1554 #else /* not DENSITY_LETTER */
1559 device
+= LOW_DENSITY_NUM
;
1563 device
+= MID_DENSITY_NUM
;
1567 device
+= HIGH_DENSITY_NUM
;
1571 argp_error (state
, _("Unknown density: `%c'"), arg
[0]);
1573 sprintf (cursor
, "%d", device
);
1575 #endif /* not DENSITY_LETTER */
1577 if (archive_names
== allocated_archive_names
)
1579 allocated_archive_names
*= 2;
1580 archive_name_array
=
1581 xrealloc (archive_name_array
,
1582 sizeof (const char *) * allocated_archive_names
);
1584 archive_name_array
[archive_names
++] = xstrdup (buf
);
1588 #else /* not DEVICE_PREFIX */
1591 _("Options `-[0-7][lmh]' not supported by *this* tar"));
1593 #endif /* not DEVICE_PREFIX */
1596 state
->flags
|= ARGP_NO_EXIT
;
1597 argp_state_help (state
, state
->out_stream
,
1598 ARGP_HELP_STD_HELP
& ~ARGP_HELP_BUG_ADDR
);
1599 fprintf (state
->out_stream
, "\n%s\n\n",
1600 _("Valid arguments for --quoting-style options are:"));
1601 tar_list_quoting_styles (state
->out_stream
, " ");
1603 fprintf (state
->out_stream
, _("\n*This* tar defaults to:\n"));
1604 show_default_settings (state
->out_stream
);
1605 fprintf (state
->out_stream
, "\n");
1606 fprintf (state
->out_stream
, _("Report bugs to %s.\n"),
1607 argp_program_bug_address
);
1611 argp_state_help (state
, state
->out_stream
,
1612 ARGP_HELP_USAGE
| ARGP_HELP_EXIT_OK
);
1615 case VERSION_OPTION
:
1616 version_etc (state
->out_stream
, "tar", PACKAGE_NAME
, VERSION
,
1617 "John Gilmore", "Jay Fenlason", (char *) NULL
);
1621 _argp_hang
= atoi (arg
? arg
: "3600");
1622 while (_argp_hang
-- > 0)
1627 return ARGP_ERR_UNKNOWN
;
1632 static struct argp argp
= {
1645 argp_help (&argp
, stderr
, ARGP_HELP_SEE
, (char*) program_name
);
1649 /* Parse the options for tar. */
1651 static struct argp_option
*
1652 find_argp_option (struct argp_option
*options
, int letter
)
1655 !(options
->name
== NULL
1656 && options
->key
== 0
1657 && options
->arg
== 0
1658 && options
->flags
== 0
1659 && options
->doc
== NULL
); options
++)
1660 if (options
->key
== letter
)
1666 decode_options (int argc
, char **argv
)
1669 struct tar_args args
;
1671 /* Set some default option values. */
1672 args
.textual_date_option
= NULL
;
1673 args
.exclude_options
= EXCLUDE_WILDCARDS
;
1675 args
.pax_option
= 0;
1676 args
.backup_suffix_string
= getenv ("SIMPLE_BACKUP_SUFFIX");
1677 args
.version_control_string
= 0;
1678 args
.input_files
= 0;
1680 subcommand_option
= UNKNOWN_SUBCOMMAND
;
1681 archive_format
= DEFAULT_FORMAT
;
1682 blocking_factor
= DEFAULT_BLOCKING
;
1683 record_size
= DEFAULT_BLOCKING
* BLOCKSIZE
;
1684 excluded
= new_exclude ();
1685 newer_mtime_option
.tv_sec
= TYPE_MINIMUM (time_t);
1686 newer_mtime_option
.tv_nsec
= -1;
1687 recursion_option
= FNM_LEADING_DIR
;
1688 unquote_option
= true;
1693 /* Convert old-style tar call by exploding option element and rearranging
1694 options accordingly. */
1696 if (argc
> 1 && argv
[1][0] != '-')
1698 int new_argc
; /* argc value for rearranged arguments */
1699 char **new_argv
; /* argv value for rearranged arguments */
1700 char *const *in
; /* cursor into original argv */
1701 char **out
; /* cursor into rearranged argv */
1702 const char *letter
; /* cursor into old option letters */
1703 char buffer
[3]; /* constructed option buffer */
1705 /* Initialize a constructed option. */
1710 /* Allocate a new argument array, and copy program name in it. */
1712 new_argc
= argc
- 1 + strlen (argv
[1]);
1713 new_argv
= xmalloc ((new_argc
+ 1) * sizeof (char *));
1718 /* Copy each old letter option as a separate option, and have the
1719 corresponding argument moved next to it. */
1721 for (letter
= *in
++; *letter
; letter
++)
1723 struct argp_option
*opt
;
1725 buffer
[1] = *letter
;
1726 *out
++ = xstrdup (buffer
);
1727 opt
= find_argp_option (options
, *letter
);
1728 if (opt
&& opt
->arg
)
1730 if (in
< argv
+ argc
)
1733 USAGE_ERROR ((0, 0, _("Old option `%c' requires an argument."),
1738 /* Copy all remaining options. */
1740 while (in
< argv
+ argc
)
1744 /* Replace the old option list by the new one. */
1750 /* Parse all options and non-options as they appear. */
1752 prepend_default_options (getenv ("TAR_OPTIONS"), &argc
, &argv
);
1754 if (argp_parse (&argp
, argc
, argv
, ARGP_IN_ORDER
|ARGP_NO_HELP
,
1759 /* Special handling for 'o' option:
1761 GNU tar used to say "output old format".
1762 UNIX98 tar says don't chown files after extracting (we use
1763 "--no-same-owner" for this).
1765 The old GNU tar semantics is retained when used with --create
1766 option, otherwise UNIX98 semantics is assumed */
1770 if (subcommand_option
== CREATE_SUBCOMMAND
)
1772 /* GNU Tar <= 1.13 compatibility */
1773 set_archive_format ("v7");
1777 /* UNIX98 compatibility */
1778 same_owner_option
= -1;
1782 /* Handle operands after any "--" argument. */
1783 for (; index
< argc
; index
++)
1785 name_add (argv
[index
]);
1789 /* Derive option values and check option consistency. */
1791 if (archive_format
== DEFAULT_FORMAT
)
1793 if (args
.pax_option
)
1794 archive_format
= POSIX_FORMAT
;
1796 archive_format
= DEFAULT_ARCHIVE_FORMAT
;
1799 if ((volume_label_option
&& subcommand_option
== CREATE_SUBCOMMAND
)
1800 || incremental_option
1801 || multi_volume_option
1803 assert_format (FORMAT_MASK (OLDGNU_FORMAT
)
1804 | FORMAT_MASK (GNU_FORMAT
)
1805 | FORMAT_MASK (POSIX_FORMAT
));
1807 if (multi_volume_option
1808 && archive_format
== POSIX_FORMAT
1809 && subcommand_option
== CREATE_SUBCOMMAND
1810 && !tape_length_option
)
1812 _("creating multi-volume archives in posix format requires using --tape-length (-L) option")));
1814 if (occurrence_option
)
1816 if (!args
.input_files
)
1818 _("--occurrence is meaningless without a file list")));
1819 if (subcommand_option
!= DELETE_SUBCOMMAND
1820 && subcommand_option
!= DIFF_SUBCOMMAND
1821 && subcommand_option
!= EXTRACT_SUBCOMMAND
1822 && subcommand_option
!= LIST_SUBCOMMAND
)
1824 _("--occurrence cannot be used in the requested operation mode")));
1827 if (seekable_archive
&& subcommand_option
== DELETE_SUBCOMMAND
)
1829 /* The current code in delete.c is based on the assumption that
1830 skip_member() reads all data from the archive. So, we should
1831 make sure it won't use seeks. On the other hand, the same code
1832 depends on the ability to backspace a record in the archive,
1833 so setting seekable_archive to false is technically incorrect.
1834 However, it is tested only in skip_member(), so it's not a
1836 seekable_archive
= false;
1839 if (archive_names
== 0)
1841 /* If no archive file name given, try TAPE from the environment, or
1842 else, DEFAULT_ARCHIVE from the configuration process. */
1845 archive_name_array
[0] = getenv ("TAPE");
1846 if (! archive_name_array
[0])
1847 archive_name_array
[0] = DEFAULT_ARCHIVE
;
1850 /* Allow multiple archives only with `-M'. */
1852 if (archive_names
> 1 && !multi_volume_option
)
1854 _("Multiple archive files require `-M' option")));
1856 if (listed_incremental_option
1857 && NEWER_OPTION_INITIALIZED (newer_mtime_option
))
1859 _("Cannot combine --listed-incremental with --newer")));
1861 if (volume_label_option
)
1863 if (archive_format
== GNU_FORMAT
|| archive_format
== OLDGNU_FORMAT
)
1865 size_t volume_label_max_len
=
1866 (sizeof current_header
->header
.name
1867 - 1 /* for trailing '\0' */
1868 - (multi_volume_option
1869 ? (sizeof " Volume "
1870 - 1 /* for null at end of " Volume " */
1871 + INT_STRLEN_BOUND (int) /* for volume number */
1872 - 1 /* for sign, as 0 <= volno */)
1874 if (volume_label_max_len
< strlen (volume_label_option
))
1876 ngettext ("%s: Volume label is too long (limit is %lu byte)",
1877 "%s: Volume label is too long (limit is %lu bytes)",
1878 volume_label_max_len
),
1879 quotearg_colon (volume_label_option
),
1880 (unsigned long) volume_label_max_len
));
1883 Label length in PAX format is limited by the volume size. */
1888 if (multi_volume_option
)
1889 USAGE_ERROR ((0, 0, _("Cannot verify multi-volume archives")));
1890 if (use_compress_program_option
)
1891 USAGE_ERROR ((0, 0, _("Cannot verify compressed archives")));
1894 if (use_compress_program_option
)
1896 if (multi_volume_option
)
1897 USAGE_ERROR ((0, 0, _("Cannot use multi-volume compressed archives")));
1898 if (subcommand_option
== UPDATE_SUBCOMMAND
1899 || subcommand_option
== APPEND_SUBCOMMAND
1900 || subcommand_option
== DELETE_SUBCOMMAND
)
1901 USAGE_ERROR ((0, 0, _("Cannot update compressed archives")));
1902 if (subcommand_option
== CAT_SUBCOMMAND
)
1903 USAGE_ERROR ((0, 0, _("Cannot concatenate compressed archives")));
1906 /* It is no harm to use --pax-option on non-pax archives in archive
1907 reading mode. It may even be useful, since it allows to override
1908 file attributes from tar headers. Therefore I allow such usage.
1911 && archive_format
!= POSIX_FORMAT
1912 && (subcommand_option
!= EXTRACT_SUBCOMMAND
1913 || subcommand_option
!= DIFF_SUBCOMMAND
1914 || subcommand_option
!= LIST_SUBCOMMAND
))
1915 USAGE_ERROR ((0, 0, _("--pax-option can be used only on POSIX archives")));
1917 /* If ready to unlink hierarchies, so we are for simpler files. */
1918 if (recursive_unlink_option
)
1919 old_files_option
= UNLINK_FIRST_OLD_FILES
;
1922 if (test_label_option
)
1924 /* --test-label is silent if the user has specified the label name to
1926 if (args
.input_files
== 0)
1929 else if (utc_option
)
1932 /* Forbid using -c with no input files whatsoever. Check that `-f -',
1933 explicit or implied, is used correctly. */
1935 switch (subcommand_option
)
1937 case CREATE_SUBCOMMAND
:
1938 if (args
.input_files
== 0 && !files_from_option
)
1940 _("Cowardly refusing to create an empty archive")));
1943 case EXTRACT_SUBCOMMAND
:
1944 case LIST_SUBCOMMAND
:
1945 case DIFF_SUBCOMMAND
:
1946 for (archive_name_cursor
= archive_name_array
;
1947 archive_name_cursor
< archive_name_array
+ archive_names
;
1948 archive_name_cursor
++)
1949 if (!strcmp (*archive_name_cursor
, "-"))
1950 request_stdin ("-f");
1953 case CAT_SUBCOMMAND
:
1954 case UPDATE_SUBCOMMAND
:
1955 case APPEND_SUBCOMMAND
:
1956 for (archive_name_cursor
= archive_name_array
;
1957 archive_name_cursor
< archive_name_array
+ archive_names
;
1958 archive_name_cursor
++)
1959 if (!strcmp (*archive_name_cursor
, "-"))
1961 _("Options `-Aru' are incompatible with `-f -'")));
1967 archive_name_cursor
= archive_name_array
;
1969 /* Prepare for generating backup names. */
1971 if (args
.backup_suffix_string
)
1972 simple_backup_suffix
= xstrdup (args
.backup_suffix_string
);
1976 backup_type
= xget_version ("--backup", args
.version_control_string
);
1977 /* No backup is needed either if explicitely disabled or if
1978 the extracted files are not being written to disk. */
1979 if (backup_type
== no_backups
|| EXTRACT_OVER_PIPE
)
1980 backup_option
= false;
1983 if (verbose_option
&& args
.textual_date_option
)
1985 char const *treated_as
= tartime (newer_mtime_option
, true);
1986 if (strcmp (args
.textual_date_option
, treated_as
) != 0)
1987 WARN ((0, 0, _("Treating date `%s' as %s"),
1988 args
.textual_date_option
, treated_as
));
1995 /* Main routine for tar. */
1997 main (int argc
, char **argv
)
2000 program_name
= argv
[0];
2002 setlocale (LC_ALL
, "");
2003 bindtextdomain (PACKAGE
, LOCALEDIR
);
2004 textdomain (PACKAGE
);
2006 exit_status
= TAREXIT_SUCCESS
;
2007 filename_terminator
= '\n';
2008 set_quoting_style (0, DEFAULT_QUOTING_STYLE
);
2010 /* Make sure we have first three descriptors available */
2013 /* Pre-allocate a few structures. */
2015 allocated_archive_names
= 10;
2016 archive_name_array
=
2017 xmalloc (sizeof (const char *) * allocated_archive_names
);
2020 obstack_init (&argv_stk
);
2023 /* System V fork+wait does not work if SIGCHLD is ignored. */
2024 signal (SIGCHLD
, SIG_DFL
);
2029 /* Decode options. */
2031 decode_options (argc
, argv
);
2034 /* Main command execution. */
2036 if (volno_file_option
)
2037 init_volume_number ();
2039 switch (subcommand_option
)
2041 case UNKNOWN_SUBCOMMAND
:
2043 _("You must specify one of the `-Acdtrux' options")));
2045 case CAT_SUBCOMMAND
:
2046 case UPDATE_SUBCOMMAND
:
2047 case APPEND_SUBCOMMAND
:
2051 case DELETE_SUBCOMMAND
:
2052 delete_archive_members ();
2055 case CREATE_SUBCOMMAND
:
2058 print_total_written ();
2061 case EXTRACT_SUBCOMMAND
:
2063 read_and (extract_archive
);
2065 /* FIXME: should extract_finish () even if an ordinary signal is
2071 case LIST_SUBCOMMAND
:
2072 read_and (list_archive
);
2075 case DIFF_SUBCOMMAND
:
2077 read_and (diff_archive
);
2081 if (check_links_option
)
2084 if (volno_file_option
)
2085 closeout_volume_number ();
2087 /* Dispose of allocated memory, and return. */
2089 free (archive_name_array
);
2092 if (stdlis
!= stderr
&& (ferror (stdlis
) || fclose (stdlis
) != 0))
2093 FATAL_ERROR ((0, 0, _("Error in writing to standard output")));
2094 if (exit_status
== TAREXIT_FAILURE
)
2095 error (0, 0, _("Error exit delayed from previous errors"));
2096 if (ferror (stderr
) || fclose (stderr
) != 0)
2097 exit_status
= TAREXIT_FAILURE
;
2102 tar_stat_init (struct tar_stat_info
*st
)
2104 memset (st
, 0, sizeof (*st
));
2108 tar_stat_destroy (struct tar_stat_info
*st
)
2110 free (st
->orig_file_name
);
2111 free (st
->file_name
);
2112 free (st
->link_name
);
2115 free (st
->sparse_map
);
2117 memset (st
, 0, sizeof (*st
));
2120 /* Format mask for all available formats that support nanosecond
2121 timestamp resolution. */
2122 #define NS_PRECISION_FORMAT_MASK FORMAT_MASK (POSIX_FORMAT)
2124 /* Same as timespec_cmp, but ignore nanoseconds if current archive
2125 format does not provide sufficient resolution. */
2127 tar_timespec_cmp (struct timespec a
, struct timespec b
)
2129 if (!(FORMAT_MASK (current_format
) & NS_PRECISION_FORMAT_MASK
))
2130 a
.tv_nsec
= b
.tv_nsec
= 0;
2131 return timespec_cmp (a
, b
);