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>
48 /* Local declarations. */
50 #ifndef DEFAULT_ARCHIVE_FORMAT
51 # define DEFAULT_ARCHIVE_FORMAT GNU_FORMAT
54 #ifndef DEFAULT_ARCHIVE
55 # define DEFAULT_ARCHIVE "tar.out"
58 #ifndef DEFAULT_BLOCKING
59 # define DEFAULT_BLOCKING 20
65 /* Name of option using stdin. */
66 static const char *stdin_used_by
;
68 /* Doesn't return if stdin already requested. */
70 request_stdin (const char *option
)
73 USAGE_ERROR ((0, 0, _("Options `-%s' and `-%s' both want standard input"),
74 stdin_used_by
, option
));
76 stdin_used_by
= option
;
79 extern int rpmatch (char const *response
);
81 /* Returns true if and only if the user typed an affirmative response. */
83 confirm (const char *message_action
, const char *message_name
)
85 static FILE *confirm_file
;
86 static int confirm_file_EOF
;
91 if (archive
== 0 || stdin_used_by
)
93 confirm_file
= fopen (TTY_NAME
, "r");
95 open_fatal (TTY_NAME
);
100 confirm_file
= stdin
;
104 fprintf (stdlis
, "%s %s?", message_action
, quote (message_name
));
107 if (!confirm_file_EOF
)
109 char *response
= NULL
;
110 size_t response_size
= 0;
111 if (getline (&response
, &response_size
, confirm_file
) < 0)
112 confirm_file_EOF
= 1;
114 status
= rpmatch (response
) > 0;
118 if (confirm_file_EOF
)
120 fputc ('\n', stdlis
);
127 static struct fmttab
{
129 enum archive_format fmt
;
132 { "oldgnu", OLDGNU_FORMAT
},
133 { "ustar", USTAR_FORMAT
},
134 { "posix", POSIX_FORMAT
},
135 #if 0 /* not fully supported yet */
136 { "star", STAR_FORMAT
},
138 { "gnu", GNU_FORMAT
},
139 { "pax", POSIX_FORMAT
}, /* An alias for posix */
144 set_archive_format (char const *name
)
146 struct fmttab
const *p
;
148 for (p
= fmttab
; strcmp (p
->name
, name
) != 0; )
150 USAGE_ERROR ((0, 0, _("%s: Invalid archive format"),
151 quotearg_colon (name
)));
153 archive_format
= p
->fmt
;
157 archive_format_string (enum archive_format fmt
)
159 struct fmttab
const *p
;
161 for (p
= fmttab
; p
->name
; p
++)
167 #define FORMAT_MASK(n) (1<<(n))
170 assert_format(unsigned fmt_mask
)
172 if ((FORMAT_MASK (archive_format
) & fmt_mask
) == 0)
174 _("GNU features wanted on incompatible archive format")));
178 subcommand_string (enum subcommand c
)
182 case UNKNOWN_SUBCOMMAND
:
185 case APPEND_SUBCOMMAND
:
191 case CREATE_SUBCOMMAND
:
194 case DELETE_SUBCOMMAND
:
197 case DIFF_SUBCOMMAND
:
200 case EXTRACT_SUBCOMMAND
:
203 case LIST_SUBCOMMAND
:
206 case UPDATE_SUBCOMMAND
:
215 tar_list_quoting_styles (FILE *fp
, char *prefix
)
219 for (i
= 0; quoting_style_args
[i
]; i
++)
220 fprintf (fp
, "%s%s\n", prefix
, quoting_style_args
[i
]);
224 tar_set_quoting_style (char *arg
)
228 for (i
= 0; quoting_style_args
[i
]; i
++)
229 if (strcmp (arg
, quoting_style_args
[i
]) == 0)
231 set_quoting_style (NULL
, i
);
235 _("Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."), arg
));
243 ANCHORED_OPTION
= CHAR_MAX
+ 1,
244 ATIME_PRESERVE_OPTION
,
248 DELAY_DIRECTORY_RESTORE_OPTION
,
250 EXCLUDE_CACHES_OPTION
,
256 IGNORE_COMMAND_ERROR_OPTION
,
257 IGNORE_FAILED_READ_OPTION
,
259 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 {"license", LICENSE_OPTION
, 0, 0, N_("Print license and exit"), -1},
680 {"version", VERSION_OPTION
, 0, 0, N_("Print program version"), -1},
681 /* FIXME -V (--label) conflicts with the default short option for
683 {"HANG", HANG_OPTION
, "SECS", OPTION_ARG_OPTIONAL
| OPTION_HIDDEN
,
684 N_("Hang for SECS seconds (default 3600)"), 0},
690 static char const *const atime_preserve_args
[] =
692 "replace", "system", NULL
694 static enum atime_preserve
const atime_preserve_types
[] =
696 replace_atime_preserve
, system_atime_preserve
698 ARGMATCH_VERIFY (atime_preserve_args
, atime_preserve_types
);
702 char const *textual_date_option
;
706 char const *backup_suffix_string
;
707 char const *version_control_string
;
712 show_default_settings (FILE *stream
)
715 "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s",
716 archive_format_string (DEFAULT_ARCHIVE_FORMAT
),
717 DEFAULT_ARCHIVE
, DEFAULT_BLOCKING
,
718 quoting_style_args
[DEFAULT_QUOTING_STYLE
],
719 DEFAULT_RMT_COMMAND
);
721 fprintf (stream
, " --rsh-command=%s", REMOTE_SHELL
);
723 fprintf (stream
, "\n");
727 set_subcommand_option (enum subcommand subcommand
)
729 if (subcommand_option
!= UNKNOWN_SUBCOMMAND
730 && subcommand_option
!= subcommand
)
732 _("You may not specify more than one `-Acdtrux' option")));
734 subcommand_option
= subcommand
;
738 set_use_compress_program_option (const char *string
)
740 if (use_compress_program_option
741 && strcmp (use_compress_program_option
, string
) != 0)
742 USAGE_ERROR ((0, 0, _("Conflicting compression options")));
744 use_compress_program_option
= string
;
750 printf ("tar (%s) %s\n%s\n", PACKAGE_NAME
, PACKAGE_VERSION
,
751 "Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1999, \n\
752 2000, 2001, 2003, 2004, 2005 Free Software Foundation, Inc.\n");
753 puts (_("Based on the work of John Gilmore and Jay Fenlason. See AUTHORS\n\
754 for complete list of authors.\n"));
755 printf (_(" GNU tar is free software; you can redistribute it and/or modify\n"
756 " it under the terms of the GNU General Public License as published by\n"
757 " the Free Software Foundation; either version 2 of the License, or\n"
758 " (at your option) any later version.\n"
760 " GNU tar is distributed in the hope that it will be useful,\n"
761 " but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
762 " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
763 " GNU General Public License for more details.\n"
765 " You should have received a copy of the GNU General Public License\n"
766 " along with GNU tar; if not, write to the Free Software Foundation,\n"
767 " Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA\n\n"));
771 static volatile int _argp_hang
;
773 enum read_file_list_state
/* Result of reading file name from the list file */
775 file_list_success
, /* OK, name read successfully */
776 file_list_end
, /* End of list file */
777 file_list_zero
/* Zero separator encountered where it should not */
780 /* Read from FP a sequence of characters up to FILENAME_TERMINATOR and put them
783 static enum read_file_list_state
784 read_name_from_file (FILE *fp
, struct obstack
*stk
)
789 for (c
= getc (fp
); c
!= EOF
&& c
!= filename_terminator
; c
= getc (fp
))
793 /* We have read a zero separator. The file possibly is
795 /* FATAL_ERROR((0, 0, N_("file name contains null character"))); */
796 return file_list_zero
;
798 obstack_1grow (stk
, c
);
802 obstack_1grow (stk
, 0);
804 return (counter
== 0 && c
== EOF
) ? file_list_end
: file_list_success
;
808 static bool files_from_option
; /* When set, tar will not refuse to create
810 static struct obstack argv_stk
; /* Storage for additional command line options
811 read using -T option */
813 /* Prevent recursive inclusion of the same file */
816 struct file_id_list
*next
;
821 static struct file_id_list
*file_id_list
;
824 add_file_id (const char *filename
)
826 struct file_id_list
*p
;
829 if (stat (filename
, &st
))
830 stat_fatal (filename
);
831 for (p
= file_id_list
; p
; p
= p
->next
)
832 if (p
->ino
== st
.st_ino
&& p
->dev
== st
.st_dev
)
834 FATAL_ERROR ((0, 0, _("%s: file list already read"),
835 quotearg_colon (filename
)));
837 p
= xmalloc (sizeof *p
);
838 p
->next
= file_id_list
;
844 /* Default density numbers for [0-9][lmh] device specifications */
846 #ifndef LOW_DENSITY_NUM
847 # define LOW_DENSITY_NUM 0
850 #ifndef MID_DENSITY_NUM
851 # define MID_DENSITY_NUM 8
854 #ifndef HIGH_DENSITY_NUM
855 # define HIGH_DENSITY_NUM 16
859 update_argv (const char *filename
, struct argp_state
*state
)
866 bool is_stdin
= false;
867 enum read_file_list_state read_state
;
869 if (!strcmp (filename
, "-"))
872 request_stdin ("-T");
877 add_file_id (filename
);
878 if ((fp
= fopen (filename
, "r")) == NULL
)
879 open_fatal (filename
);
882 while ((read_state
= read_name_from_file (fp
, &argv_stk
)) == file_list_success
)
885 if (read_state
== file_list_zero
)
889 WARN ((0, 0, N_("%s: file name read contains nul character"),
890 quotearg_colon (filename
)));
892 /* Prepare new stack contents */
893 size
= obstack_object_size (&argv_stk
);
894 p
= obstack_finish (&argv_stk
);
895 for (; size
> 0; size
--, p
++)
897 obstack_1grow (&argv_stk
, *p
);
899 obstack_1grow (&argv_stk
, '\n');
900 obstack_1grow (&argv_stk
, 0);
903 /* Read rest of files using new filename terminator */
904 filename_terminator
= 0;
905 while (read_name_from_file (fp
, &argv_stk
) == file_list_success
)
915 start
= obstack_finish (&argv_stk
);
917 if (filename_terminator
== 0)
918 for (p
= start
; *p
; p
+= strlen (p
) + 1)
922 new_argc
= state
->argc
+ count
;
923 new_argv
= xmalloc (sizeof (state
->argv
[0]) * (new_argc
+ 1));
924 memcpy (new_argv
, state
->argv
, sizeof (state
->argv
[0]) * (state
->argc
+ 1));
925 state
->argv
= new_argv
;
926 memmove (&state
->argv
[state
->next
+ count
], &state
->argv
[state
->next
],
927 (state
->argc
- state
->next
+ 1) * sizeof (state
->argv
[0]));
929 state
->argc
= new_argc
;
931 for (i
= state
->next
, p
= start
; *p
; p
+= strlen (p
) + 1, i
++)
933 if (filename_terminator
== 0 && p
[0] == '-')
934 state
->argv
[i
++] = "--add-file";
941 parse_opt (int key
, char *arg
, struct argp_state
*state
)
943 struct tar_args
*args
= state
->input
;
948 /* File name or non-parsed option, because of ARGP_IN_ORDER */
954 set_subcommand_option (CAT_SUBCOMMAND
);
960 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
961 && u
== (blocking_factor
= u
)
962 && 0 < blocking_factor
963 && u
== (record_size
= u
* BLOCKSIZE
) / BLOCKSIZE
))
964 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
965 _("Invalid blocking factor")));
970 /* Try to reblock input records. For reading 4.2BSD pipes. */
972 /* It would surely make sense to exchange -B and -R, but it seems
973 that -B has been used for a long while in Sun tar and most
974 BSD-derived systems. This is a consequence of the block/record
975 terminology confusion. */
977 read_full_records_option
= true;
981 set_subcommand_option (CREATE_SUBCOMMAND
);
990 set_subcommand_option (DIFF_SUBCOMMAND
);
994 if (archive_names
== allocated_archive_names
)
996 allocated_archive_names
*= 2;
998 xrealloc (archive_name_array
,
999 sizeof (const char *) * allocated_archive_names
);
1001 archive_name_array
[archive_names
++] = arg
;
1005 /* Since -F is only useful with -M, make it implied. Run this
1006 script at the end of each tape. */
1008 info_script_option
= arg
;
1009 multi_volume_option
= true;
1013 listed_incremental_option
= arg
;
1014 after_date_option
= true;
1018 /* We are making an incremental dump (FIXME: are we?); save
1019 directories at the beginning of the archive, and include in each
1020 directory its contents. */
1022 incremental_option
= true;
1026 /* Follow symbolic links. */
1027 dereference_option
= true;
1031 /* Ignore zero blocks (eofs). This can't be the default,
1032 because Unix tar writes two blocks of zeros, then pads out
1033 the record with garbage. */
1035 ignore_zeros_option
= true;
1040 _("Warning: the -I option is not supported;"
1041 " perhaps you meant -j or -T?")));
1045 set_use_compress_program_option ("bzip2");
1049 /* Don't replace existing files. */
1050 old_files_option
= KEEP_OLD_FILES
;
1054 starting_file_option
= true;
1059 /* Historically equivalent to --one-file-system. This usage is
1060 incompatible with UNIX98 and POSIX specs and therefore is
1061 deprecated. The semantics of -l option will be changed in
1062 future versions. See TODO.
1065 _("Semantics of -l option will change in the future releases.")));
1067 _("Please use --one-file-system option instead.")));
1069 case ONE_FILE_SYSTEM_OPTION
:
1070 /* When dumping directories, don't dump files/subdirectories
1071 that are on other filesystems. */
1072 one_file_system_option
= true;
1078 if (xstrtoumax (arg
, 0, 10, &u
, "") != LONGINT_OK
)
1079 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1080 _("Invalid tape length")));
1081 tape_length_option
= 1024 * (tarlong
) u
;
1082 multi_volume_option
= true;
1087 touch_option
= true;
1091 /* Make multivolume archive: when we can't write any more into
1092 the archive, re-open it, and continue writing. */
1094 multi_volume_option
= true;
1098 seekable_archive
= true;
1102 after_date_option
= true;
1105 case NEWER_MTIME_OPTION
:
1106 if (NEWER_OPTION_INITIALIZED (newer_mtime_option
))
1107 USAGE_ERROR ((0, 0, _("More than one threshold date")));
1109 if (FILE_SYSTEM_PREFIX_LEN (arg
) != 0
1114 if (deref_stat (dereference_option
, arg
, &st
) != 0)
1117 USAGE_ERROR ((0, 0, _("Date sample file not found")));
1119 newer_mtime_option
= get_stat_mtime (&st
);
1123 if (! get_date (&newer_mtime_option
, arg
, NULL
))
1125 WARN ((0, 0, _("Substituting %s for unknown date format %s"),
1126 tartime (newer_mtime_option
, false), quote (arg
)));
1127 newer_mtime_option
.tv_nsec
= 0;
1130 args
->textual_date_option
= arg
;
1136 args
->o_option
= true;
1140 to_stdout_option
= true;
1144 same_permissions_option
= true;
1148 absolute_names_option
= true;
1152 set_subcommand_option (APPEND_SUBCOMMAND
);
1156 /* Print block numbers for debugging bad tar archives. */
1158 /* It would surely make sense to exchange -B and -R, but it seems
1159 that -B has been used for a long while in Sun tar ans most
1160 BSD-derived systems. This is a consequence of the block/record
1161 terminology confusion. */
1163 block_number_option
= true;
1167 /* Names to extr are sorted. */
1169 same_order_option
= true;
1173 sparse_option
= true;
1177 set_subcommand_option (LIST_SUBCOMMAND
);
1181 case TEST_LABEL_OPTION
:
1182 set_subcommand_option (LIST_SUBCOMMAND
);
1183 test_label_option
= true;
1187 update_argv (arg
, state
);
1188 /* Indicate we've been given -T option. This is for backward
1189 compatibility only, so that `tar cfT archive /dev/null will
1191 files_from_option
= true;
1195 set_subcommand_option (UPDATE_SUBCOMMAND
);
1199 old_files_option
= UNLINK_FIRST_OLD_FILES
;
1211 volume_label_option
= arg
;
1215 interactive_option
= true;
1219 verify_option
= true;
1223 set_subcommand_option (EXTRACT_SUBCOMMAND
);
1227 if (add_exclude_file (add_exclude
, excluded
, arg
,
1228 args
->exclude_options
| recursion_option
, '\n')
1232 FATAL_ERROR ((0, e
, "%s", quotearg_colon (arg
)));
1237 set_use_compress_program_option ("gzip");
1241 set_use_compress_program_option ("compress");
1244 case ANCHORED_OPTION
:
1245 args
->exclude_options
|= EXCLUDE_ANCHORED
;
1248 case ATIME_PRESERVE_OPTION
:
1249 atime_preserve_option
=
1251 ? XARGMATCH ("--atime-preserve", arg
,
1252 atime_preserve_args
, atime_preserve_types
)
1253 : replace_atime_preserve
);
1254 if (! O_NOATIME
&& atime_preserve_option
== system_atime_preserve
)
1256 _("--atime-preserve='system' is not supported"
1257 " on this platform")));
1260 case CHECKPOINT_OPTION
:
1261 checkpoint_option
= true;
1265 backup_option
= true;
1267 args
->version_control_string
= arg
;
1270 case DELAY_DIRECTORY_RESTORE_OPTION
:
1271 delay_directory_restore_option
= true;
1274 case NO_DELAY_DIRECTORY_RESTORE_OPTION
:
1275 delay_directory_restore_option
= false;
1279 set_subcommand_option (DELETE_SUBCOMMAND
);
1282 case EXCLUDE_OPTION
:
1283 add_exclude (excluded
, arg
, args
->exclude_options
| recursion_option
);
1286 case EXCLUDE_CACHES_OPTION
:
1287 exclude_caches_option
= true;
1290 case FORCE_LOCAL_OPTION
:
1291 force_local_option
= true;
1295 set_archive_format (arg
);
1298 case INDEX_FILE_OPTION
:
1299 index_file_name
= arg
;
1302 case IGNORE_CASE_OPTION
:
1303 args
->exclude_options
|= FNM_CASEFOLD
;
1306 case IGNORE_COMMAND_ERROR_OPTION
:
1307 ignore_command_error_option
= true;
1310 case IGNORE_FAILED_READ_OPTION
:
1311 ignore_failed_read_option
= true;
1314 case KEEP_NEWER_FILES_OPTION
:
1315 old_files_option
= KEEP_NEWER_FILES
;
1319 if (! (strlen (arg
) < GNAME_FIELD_SIZE
1320 && gname_to_gid (arg
, &group_option
)))
1323 if (xstrtoumax (arg
, 0, 10, &g
, "") == LONGINT_OK
1327 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1328 _("%s: Invalid group")));
1333 mode_option
= mode_compile (arg
);
1335 FATAL_ERROR ((0, 0, _("Invalid mode given on option")));
1336 initial_umask
= umask (0);
1337 umask (initial_umask
);
1340 case NO_ANCHORED_OPTION
:
1341 args
->exclude_options
&= ~ EXCLUDE_ANCHORED
;
1344 case NO_IGNORE_CASE_OPTION
:
1345 args
->exclude_options
&= ~ FNM_CASEFOLD
;
1348 case NO_IGNORE_COMMAND_ERROR_OPTION
:
1349 ignore_command_error_option
= false;
1352 case NO_OVERWRITE_DIR_OPTION
:
1353 old_files_option
= NO_OVERWRITE_DIR_OLD_FILES
;
1356 case NO_QUOTE_CHARS_OPTION
:
1358 set_char_quoting (NULL
, *arg
, 0);
1361 case NO_WILDCARDS_OPTION
:
1362 args
->exclude_options
&= ~ EXCLUDE_WILDCARDS
;
1365 case NO_WILDCARDS_MATCH_SLASH_OPTION
:
1366 args
->exclude_options
|= FNM_FILE_NAME
;
1370 filename_terminator
= '\0';
1373 case NUMERIC_OWNER_OPTION
:
1374 numeric_owner_option
= true;
1377 case OCCURRENCE_OPTION
:
1379 occurrence_option
= 1;
1383 if (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
)
1384 occurrence_option
= u
;
1386 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1387 _("Invalid number")));
1391 case OVERWRITE_OPTION
:
1392 old_files_option
= OVERWRITE_OLD_FILES
;
1396 if (! (strlen (arg
) < UNAME_FIELD_SIZE
1397 && uname_to_uid (arg
, &owner_option
)))
1400 if (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1404 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1405 _("Invalid owner")));
1409 case QUOTE_CHARS_OPTION
:
1411 set_char_quoting (NULL
, *arg
, 1);
1414 case QUOTING_STYLE_OPTION
:
1415 tar_set_quoting_style (arg
);
1420 xheader_set_option (arg
);
1424 set_archive_format ("posix");
1427 case PRESERVE_OPTION
:
1428 same_permissions_option
= true;
1429 same_order_option
= true;
1432 case RECORD_SIZE_OPTION
:
1435 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1436 && u
== (size_t) u
))
1437 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1438 _("Invalid record size")));
1440 if (record_size
% BLOCKSIZE
!= 0)
1441 USAGE_ERROR ((0, 0, _("Record size must be a multiple of %d."),
1443 blocking_factor
= record_size
/ BLOCKSIZE
;
1447 case RECURSIVE_UNLINK_OPTION
:
1448 recursive_unlink_option
= true;
1451 case REMOVE_FILES_OPTION
:
1452 remove_files_option
= true;
1455 case RESTRICT_OPTION
:
1456 restrict_option
= true;
1459 case RMT_COMMAND_OPTION
:
1463 case RSH_COMMAND_OPTION
:
1464 rsh_command_option
= arg
;
1467 case SHOW_DEFAULTS_OPTION
:
1468 show_default_settings (stdout
);
1471 case STRIP_COMPONENTS_OPTION
:
1474 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1475 && u
== (size_t) u
))
1476 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1477 _("Invalid number of elements")));
1478 strip_name_components
= u
;
1482 case SHOW_OMITTED_DIRS_OPTION
:
1483 show_omitted_dirs_option
= true;
1486 case SHOW_STORED_NAMES_OPTION
:
1487 show_stored_names_option
= true;
1491 backup_option
= true;
1492 args
->backup_suffix_string
= arg
;
1495 case TO_COMMAND_OPTION
:
1496 if (to_command_option
)
1497 USAGE_ERROR ((0, 0, _("Only one --to-command option allowed")));
1498 to_command_option
= arg
;
1502 totals_option
= true;
1505 case USE_COMPRESS_PROGRAM_OPTION
:
1506 set_use_compress_program_option (arg
);
1509 case VOLNO_FILE_OPTION
:
1510 volno_file_option
= arg
;
1513 case WILDCARDS_OPTION
:
1514 args
->exclude_options
|= EXCLUDE_WILDCARDS
;
1517 case WILDCARDS_MATCH_SLASH_OPTION
:
1518 args
->exclude_options
&= ~ FNM_FILE_NAME
;
1521 case CHECK_LINKS_OPTION
:
1522 check_links_option
= 1;
1525 case NO_RECURSION_OPTION
:
1526 recursion_option
= 0;
1529 case NO_SAME_OWNER_OPTION
:
1530 same_owner_option
= -1;
1533 case NO_SAME_PERMISSIONS_OPTION
:
1534 same_permissions_option
= -1;
1537 case RECURSION_OPTION
:
1538 recursion_option
= FNM_LEADING_DIR
;
1541 case SAME_OWNER_OPTION
:
1542 same_owner_option
= 1;
1545 case UNQUOTE_OPTION
:
1546 unquote_option
= true;
1549 case NO_UNQUOTE_OPTION
:
1550 unquote_option
= false;
1562 #ifdef DEVICE_PREFIX
1564 int device
= key
- '0';
1566 static char buf
[sizeof DEVICE_PREFIX
+ 10];
1570 argp_error (state
, _("Malformed density argument: %s"), quote (arg
));
1572 strcpy (buf
, DEVICE_PREFIX
);
1573 cursor
= buf
+ strlen (buf
);
1575 #ifdef DENSITY_LETTER
1577 sprintf (cursor
, "%d%c", device
, arg
[0]);
1579 #else /* not DENSITY_LETTER */
1584 device
+= LOW_DENSITY_NUM
;
1588 device
+= MID_DENSITY_NUM
;
1592 device
+= HIGH_DENSITY_NUM
;
1596 argp_error (state
, _("Unknown density: `%c'"), arg
[0]);
1598 sprintf (cursor
, "%d", device
);
1600 #endif /* not DENSITY_LETTER */
1602 if (archive_names
== allocated_archive_names
)
1604 allocated_archive_names
*= 2;
1605 archive_name_array
=
1606 xrealloc (archive_name_array
,
1607 sizeof (const char *) * allocated_archive_names
);
1609 archive_name_array
[archive_names
++] = xstrdup (buf
);
1613 #else /* not DEVICE_PREFIX */
1616 _("Options `-[0-7][lmh]' not supported by *this* tar"));
1618 #endif /* not DEVICE_PREFIX */
1621 state
->flags
|= ARGP_NO_EXIT
;
1622 argp_state_help (state
, state
->out_stream
,
1623 ARGP_HELP_STD_HELP
& ~ARGP_HELP_BUG_ADDR
);
1624 fprintf (state
->out_stream
, "\n%s\n\n",
1625 _("Valid arguments for --quoting-style options are:"));
1626 tar_list_quoting_styles (state
->out_stream
, " ");
1628 fprintf (state
->out_stream
, _("\n*This* tar defaults to:\n"));
1629 show_default_settings (state
->out_stream
);
1630 fprintf (state
->out_stream
, "\n");
1631 fprintf (state
->out_stream
, _("Report bugs to %s.\n"),
1632 argp_program_bug_address
);
1636 argp_state_help (state
, state
->out_stream
,
1637 ARGP_HELP_USAGE
| ARGP_HELP_EXIT_OK
);
1640 case VERSION_OPTION
:
1641 fprintf (state
->out_stream
, "%s\n", argp_program_version
);
1644 case LICENSE_OPTION
:
1649 _argp_hang
= atoi (arg
? arg
: "3600");
1650 while (_argp_hang
-- > 0)
1655 return ARGP_ERR_UNKNOWN
;
1660 static struct argp argp
= {
1673 argp_help (&argp
, stderr
, ARGP_HELP_SEE
, (char*) program_name
);
1677 /* Parse the options for tar. */
1679 static struct argp_option
*
1680 find_argp_option (struct argp_option
*options
, int letter
)
1683 !(options
->name
== NULL
1684 && options
->key
== 0
1685 && options
->arg
== 0
1686 && options
->flags
== 0
1687 && options
->doc
== NULL
); options
++)
1688 if (options
->key
== letter
)
1694 decode_options (int argc
, char **argv
)
1697 struct tar_args args
;
1699 /* Set some default option values. */
1700 args
.textual_date_option
= NULL
;
1701 args
.exclude_options
= EXCLUDE_WILDCARDS
;
1703 args
.pax_option
= 0;
1704 args
.backup_suffix_string
= getenv ("SIMPLE_BACKUP_SUFFIX");
1705 args
.version_control_string
= 0;
1706 args
.input_files
= 0;
1708 subcommand_option
= UNKNOWN_SUBCOMMAND
;
1709 archive_format
= DEFAULT_FORMAT
;
1710 blocking_factor
= DEFAULT_BLOCKING
;
1711 record_size
= DEFAULT_BLOCKING
* BLOCKSIZE
;
1712 excluded
= new_exclude ();
1713 newer_mtime_option
.tv_sec
= TYPE_MINIMUM (time_t);
1714 newer_mtime_option
.tv_nsec
= -1;
1715 recursion_option
= FNM_LEADING_DIR
;
1716 unquote_option
= true;
1721 /* Convert old-style tar call by exploding option element and rearranging
1722 options accordingly. */
1724 if (argc
> 1 && argv
[1][0] != '-')
1726 int new_argc
; /* argc value for rearranged arguments */
1727 char **new_argv
; /* argv value for rearranged arguments */
1728 char *const *in
; /* cursor into original argv */
1729 char **out
; /* cursor into rearranged argv */
1730 const char *letter
; /* cursor into old option letters */
1731 char buffer
[3]; /* constructed option buffer */
1733 /* Initialize a constructed option. */
1738 /* Allocate a new argument array, and copy program name in it. */
1740 new_argc
= argc
- 1 + strlen (argv
[1]);
1741 new_argv
= xmalloc ((new_argc
+ 1) * sizeof (char *));
1746 /* Copy each old letter option as a separate option, and have the
1747 corresponding argument moved next to it. */
1749 for (letter
= *in
++; *letter
; letter
++)
1751 struct argp_option
*opt
;
1753 buffer
[1] = *letter
;
1754 *out
++ = xstrdup (buffer
);
1755 opt
= find_argp_option (options
, *letter
);
1756 if (opt
&& opt
->arg
)
1758 if (in
< argv
+ argc
)
1761 USAGE_ERROR ((0, 0, _("Old option `%c' requires an argument."),
1766 /* Copy all remaining options. */
1768 while (in
< argv
+ argc
)
1772 /* Replace the old option list by the new one. */
1778 /* Parse all options and non-options as they appear. */
1780 prepend_default_options (getenv ("TAR_OPTIONS"), &argc
, &argv
);
1782 if (argp_parse (&argp
, argc
, argv
, ARGP_IN_ORDER
|ARGP_NO_HELP
,
1787 /* Special handling for 'o' option:
1789 GNU tar used to say "output old format".
1790 UNIX98 tar says don't chown files after extracting (we use
1791 "--no-same-owner" for this).
1793 The old GNU tar semantics is retained when used with --create
1794 option, otherwise UNIX98 semantics is assumed */
1798 if (subcommand_option
== CREATE_SUBCOMMAND
)
1800 /* GNU Tar <= 1.13 compatibility */
1801 set_archive_format ("v7");
1805 /* UNIX98 compatibility */
1806 same_owner_option
= -1;
1810 /* Handle operands after any "--" argument. */
1811 for (; index
< argc
; index
++)
1813 name_add (argv
[index
]);
1817 /* Derive option values and check option consistency. */
1819 if (archive_format
== DEFAULT_FORMAT
)
1821 if (args
.pax_option
)
1822 archive_format
= POSIX_FORMAT
;
1824 archive_format
= DEFAULT_ARCHIVE_FORMAT
;
1827 if ((volume_label_option
&& subcommand_option
== CREATE_SUBCOMMAND
)
1828 || incremental_option
1829 || multi_volume_option
1831 assert_format (FORMAT_MASK (OLDGNU_FORMAT
)
1832 | FORMAT_MASK (GNU_FORMAT
)
1833 | FORMAT_MASK (POSIX_FORMAT
));
1835 if (multi_volume_option
1836 && archive_format
== POSIX_FORMAT
1837 && subcommand_option
== CREATE_SUBCOMMAND
1838 && !tape_length_option
)
1840 _("creating multi-volume archives in posix format requires using --tape-length (-L) option")));
1842 if (occurrence_option
)
1844 if (!args
.input_files
)
1846 _("--occurrence is meaningless without a file list")));
1847 if (subcommand_option
!= DELETE_SUBCOMMAND
1848 && subcommand_option
!= DIFF_SUBCOMMAND
1849 && subcommand_option
!= EXTRACT_SUBCOMMAND
1850 && subcommand_option
!= LIST_SUBCOMMAND
)
1852 _("--occurrence cannot be used in the requested operation mode")));
1855 if (seekable_archive
&& subcommand_option
== DELETE_SUBCOMMAND
)
1857 /* The current code in delete.c is based on the assumption that
1858 skip_member() reads all data from the archive. So, we should
1859 make sure it won't use seeks. On the other hand, the same code
1860 depends on the ability to backspace a record in the archive,
1861 so setting seekable_archive to false is technically incorrect.
1862 However, it is tested only in skip_member(), so it's not a
1864 seekable_archive
= false;
1867 if (archive_names
== 0)
1869 /* If no archive file name given, try TAPE from the environment, or
1870 else, DEFAULT_ARCHIVE from the configuration process. */
1873 archive_name_array
[0] = getenv ("TAPE");
1874 if (! archive_name_array
[0])
1875 archive_name_array
[0] = DEFAULT_ARCHIVE
;
1878 /* Allow multiple archives only with `-M'. */
1880 if (archive_names
> 1 && !multi_volume_option
)
1882 _("Multiple archive files require `-M' option")));
1884 if (listed_incremental_option
1885 && NEWER_OPTION_INITIALIZED (newer_mtime_option
))
1887 _("Cannot combine --listed-incremental with --newer")));
1889 if (volume_label_option
)
1891 if (archive_format
== GNU_FORMAT
|| archive_format
== OLDGNU_FORMAT
)
1893 size_t volume_label_max_len
=
1894 (sizeof current_header
->header
.name
1895 - 1 /* for trailing '\0' */
1896 - (multi_volume_option
1897 ? (sizeof " Volume "
1898 - 1 /* for null at end of " Volume " */
1899 + INT_STRLEN_BOUND (int) /* for volume number */
1900 - 1 /* for sign, as 0 <= volno */)
1902 if (volume_label_max_len
< strlen (volume_label_option
))
1904 ngettext ("%s: Volume label is too long (limit is %lu byte)",
1905 "%s: Volume label is too long (limit is %lu bytes)",
1906 volume_label_max_len
),
1907 quotearg_colon (volume_label_option
),
1908 (unsigned long) volume_label_max_len
));
1911 Label length in PAX format is limited by the volume size. */
1916 if (multi_volume_option
)
1917 USAGE_ERROR ((0, 0, _("Cannot verify multi-volume archives")));
1918 if (use_compress_program_option
)
1919 USAGE_ERROR ((0, 0, _("Cannot verify compressed archives")));
1922 if (use_compress_program_option
)
1924 if (multi_volume_option
)
1925 USAGE_ERROR ((0, 0, _("Cannot use multi-volume compressed archives")));
1926 if (subcommand_option
== UPDATE_SUBCOMMAND
1927 || subcommand_option
== APPEND_SUBCOMMAND
1928 || subcommand_option
== DELETE_SUBCOMMAND
)
1929 USAGE_ERROR ((0, 0, _("Cannot update compressed archives")));
1930 if (subcommand_option
== CAT_SUBCOMMAND
)
1931 USAGE_ERROR ((0, 0, _("Cannot concatenate compressed archives")));
1934 /* It is no harm to use --pax-option on non-pax archives in archive
1935 reading mode. It may even be useful, since it allows to override
1936 file attributes from tar headers. Therefore I allow such usage.
1939 && archive_format
!= POSIX_FORMAT
1940 && (subcommand_option
!= EXTRACT_SUBCOMMAND
1941 || subcommand_option
!= DIFF_SUBCOMMAND
1942 || subcommand_option
!= LIST_SUBCOMMAND
))
1943 USAGE_ERROR ((0, 0, _("--pax-option can be used only on POSIX archives")));
1945 /* If ready to unlink hierarchies, so we are for simpler files. */
1946 if (recursive_unlink_option
)
1947 old_files_option
= UNLINK_FIRST_OLD_FILES
;
1950 if (test_label_option
)
1952 /* --test-label is silent if the user has specified the label name to
1954 if (args
.input_files
== 0)
1957 else if (utc_option
)
1960 /* Forbid using -c with no input files whatsoever. Check that `-f -',
1961 explicit or implied, is used correctly. */
1963 switch (subcommand_option
)
1965 case CREATE_SUBCOMMAND
:
1966 if (args
.input_files
== 0 && !files_from_option
)
1968 _("Cowardly refusing to create an empty archive")));
1971 case EXTRACT_SUBCOMMAND
:
1972 case LIST_SUBCOMMAND
:
1973 case DIFF_SUBCOMMAND
:
1974 for (archive_name_cursor
= archive_name_array
;
1975 archive_name_cursor
< archive_name_array
+ archive_names
;
1976 archive_name_cursor
++)
1977 if (!strcmp (*archive_name_cursor
, "-"))
1978 request_stdin ("-f");
1981 case CAT_SUBCOMMAND
:
1982 case UPDATE_SUBCOMMAND
:
1983 case APPEND_SUBCOMMAND
:
1984 for (archive_name_cursor
= archive_name_array
;
1985 archive_name_cursor
< archive_name_array
+ archive_names
;
1986 archive_name_cursor
++)
1987 if (!strcmp (*archive_name_cursor
, "-"))
1989 _("Options `-Aru' are incompatible with `-f -'")));
1995 archive_name_cursor
= archive_name_array
;
1997 /* Prepare for generating backup names. */
1999 if (args
.backup_suffix_string
)
2000 simple_backup_suffix
= xstrdup (args
.backup_suffix_string
);
2004 backup_type
= xget_version ("--backup", args
.version_control_string
);
2005 /* No backup is needed either if explicitely disabled or if
2006 the extracted files are not being written to disk. */
2007 if (backup_type
== no_backups
|| EXTRACT_OVER_PIPE
)
2008 backup_option
= false;
2011 if (verbose_option
&& args
.textual_date_option
)
2013 char const *treated_as
= tartime (newer_mtime_option
, true);
2014 if (strcmp (args
.textual_date_option
, treated_as
) != 0)
2015 WARN ((0, 0, _("Treating date `%s' as %s"),
2016 args
.textual_date_option
, treated_as
));
2023 /* Main routine for tar. */
2025 main (int argc
, char **argv
)
2028 program_name
= argv
[0];
2030 setlocale (LC_ALL
, "");
2031 bindtextdomain (PACKAGE
, LOCALEDIR
);
2032 textdomain (PACKAGE
);
2034 exit_status
= TAREXIT_SUCCESS
;
2035 filename_terminator
= '\n';
2036 set_quoting_style (0, DEFAULT_QUOTING_STYLE
);
2038 /* Make sure we have first three descriptors available */
2041 /* Pre-allocate a few structures. */
2043 allocated_archive_names
= 10;
2044 archive_name_array
=
2045 xmalloc (sizeof (const char *) * allocated_archive_names
);
2048 obstack_init (&argv_stk
);
2051 /* System V fork+wait does not work if SIGCHLD is ignored. */
2052 signal (SIGCHLD
, SIG_DFL
);
2057 /* Decode options. */
2059 decode_options (argc
, argv
);
2062 /* Main command execution. */
2064 if (volno_file_option
)
2065 init_volume_number ();
2067 switch (subcommand_option
)
2069 case UNKNOWN_SUBCOMMAND
:
2071 _("You must specify one of the `-Acdtrux' options")));
2073 case CAT_SUBCOMMAND
:
2074 case UPDATE_SUBCOMMAND
:
2075 case APPEND_SUBCOMMAND
:
2079 case DELETE_SUBCOMMAND
:
2080 delete_archive_members ();
2083 case CREATE_SUBCOMMAND
:
2086 print_total_written ();
2089 case EXTRACT_SUBCOMMAND
:
2091 read_and (extract_archive
);
2093 /* FIXME: should extract_finish () even if an ordinary signal is
2099 case LIST_SUBCOMMAND
:
2100 read_and (list_archive
);
2103 case DIFF_SUBCOMMAND
:
2105 read_and (diff_archive
);
2109 if (check_links_option
)
2112 if (volno_file_option
)
2113 closeout_volume_number ();
2115 /* Dispose of allocated memory, and return. */
2117 free (archive_name_array
);
2120 if (stdlis
!= stderr
&& (ferror (stdlis
) || fclose (stdlis
) != 0))
2121 FATAL_ERROR ((0, 0, _("Error in writing to standard output")));
2122 if (exit_status
== TAREXIT_FAILURE
)
2123 error (0, 0, _("Error exit delayed from previous errors"));
2124 if (ferror (stderr
) || fclose (stderr
) != 0)
2125 exit_status
= TAREXIT_FAILURE
;
2130 tar_stat_init (struct tar_stat_info
*st
)
2132 memset (st
, 0, sizeof (*st
));
2136 tar_stat_destroy (struct tar_stat_info
*st
)
2138 free (st
->orig_file_name
);
2139 free (st
->file_name
);
2140 free (st
->link_name
);
2143 free (st
->sparse_map
);
2145 memset (st
, 0, sizeof (*st
));
2148 /* Format mask for all available formats that support nanosecond
2149 timestamp resolution. */
2150 #define NS_PRECISION_FORMAT_MASK FORMAT_MASK (POSIX_FORMAT)
2152 /* Same as timespec_cmp, but ignore nanoseconds if current archive
2153 format does not provide sufficient resolution. */
2155 tar_timespec_cmp (struct timespec a
, struct timespec b
)
2157 if (!(FORMAT_MASK (current_format
) & NS_PRECISION_FORMAT_MASK
))
2158 a
.tv_nsec
= b
.tv_nsec
= 0;
2159 return timespec_cmp (a
, b
);