1 /* A tar (tape archiver) program.
3 Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000,
4 2001, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
6 Written by John Gilmore, starting 1985-08-25.
8 This program is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by the
10 Free Software Foundation; either version 2, or (at your option) any later
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
16 Public License for more details.
18 You should have received a copy of the GNU General Public License along
19 with this program; if not, write to the Free Software Foundation, Inc.,
20 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
27 #include <argp-namefrob.h>
28 #include <argp-fmtstream.h>
31 #if ! defined SIGCHLD && defined SIGCLD
32 # define SIGCHLD SIGCLD
35 /* The following causes "common.h" to produce definitions of all the global
36 variables, rather than just "extern" declarations of them. GNU tar does
37 depend on the system loader to preset all GLOBAL variables to neutral (or
38 zero) values; explicit initialization is usually not done. */
46 #include <localedir.h>
50 #include <version-etc.h>
54 /* Local declarations. */
56 #ifndef DEFAULT_ARCHIVE_FORMAT
57 # define DEFAULT_ARCHIVE_FORMAT GNU_FORMAT
60 #ifndef DEFAULT_ARCHIVE
61 # define DEFAULT_ARCHIVE "tar.out"
64 #ifndef DEFAULT_BLOCKING
65 # define DEFAULT_BLOCKING 20
71 /* Name of option using stdin. */
72 static const char *stdin_used_by
;
74 /* Doesn't return if stdin already requested. */
76 request_stdin (const char *option
)
79 USAGE_ERROR ((0, 0, _("Options `-%s' and `-%s' both want standard input"),
80 stdin_used_by
, option
));
82 stdin_used_by
= option
;
85 extern int rpmatch (char const *response
);
87 /* Returns true if and only if the user typed an affirmative response. */
89 confirm (const char *message_action
, const char *message_name
)
91 static FILE *confirm_file
;
92 static int confirm_file_EOF
;
97 if (archive
== 0 || stdin_used_by
)
99 confirm_file
= fopen (TTY_NAME
, "r");
101 open_fatal (TTY_NAME
);
105 request_stdin ("-w");
106 confirm_file
= stdin
;
110 fprintf (stdlis
, "%s %s?", message_action
, quote (message_name
));
113 if (!confirm_file_EOF
)
115 char *response
= NULL
;
116 size_t response_size
= 0;
117 if (getline (&response
, &response_size
, confirm_file
) < 0)
118 confirm_file_EOF
= 1;
120 status
= rpmatch (response
) > 0;
124 if (confirm_file_EOF
)
126 fputc ('\n', stdlis
);
133 static struct fmttab
{
135 enum archive_format fmt
;
138 { "oldgnu", OLDGNU_FORMAT
},
139 { "ustar", USTAR_FORMAT
},
140 { "posix", POSIX_FORMAT
},
141 #if 0 /* not fully supported yet */
142 { "star", STAR_FORMAT
},
144 { "gnu", GNU_FORMAT
},
145 { "pax", POSIX_FORMAT
}, /* An alias for posix */
150 set_archive_format (char const *name
)
152 struct fmttab
const *p
;
154 for (p
= fmttab
; strcmp (p
->name
, name
) != 0; )
156 USAGE_ERROR ((0, 0, _("%s: Invalid archive format"),
157 quotearg_colon (name
)));
159 archive_format
= p
->fmt
;
163 archive_format_string (enum archive_format fmt
)
165 struct fmttab
const *p
;
167 for (p
= fmttab
; p
->name
; p
++)
173 #define FORMAT_MASK(n) (1<<(n))
176 assert_format(unsigned fmt_mask
)
178 if ((FORMAT_MASK (archive_format
) & fmt_mask
) == 0)
180 _("GNU features wanted on incompatible archive format")));
184 subcommand_string (enum subcommand c
)
188 case UNKNOWN_SUBCOMMAND
:
191 case APPEND_SUBCOMMAND
:
197 case CREATE_SUBCOMMAND
:
200 case DELETE_SUBCOMMAND
:
203 case DIFF_SUBCOMMAND
:
206 case EXTRACT_SUBCOMMAND
:
209 case LIST_SUBCOMMAND
:
212 case UPDATE_SUBCOMMAND
:
221 tar_list_quoting_styles (argp_fmtstream_t fs
, char *prefix
)
225 for (i
= 0; quoting_style_args
[i
]; i
++)
226 argp_fmtstream_printf (fs
, "%s%s\n", prefix
, quoting_style_args
[i
]);
230 tar_set_quoting_style (char *arg
)
234 for (i
= 0; quoting_style_args
[i
]; i
++)
235 if (strcmp (arg
, quoting_style_args
[i
]) == 0)
237 set_quoting_style (NULL
, i
);
241 _("Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."), arg
, program_invocation_short_name
));
249 ANCHORED_OPTION
= CHAR_MAX
+ 1,
250 ATIME_PRESERVE_OPTION
,
253 DELAY_DIRECTORY_RESTORE_OPTION
,
255 EXCLUDE_CACHES_OPTION
,
261 IGNORE_COMMAND_ERROR_OPTION
,
262 IGNORE_FAILED_READ_OPTION
,
264 KEEP_NEWER_FILES_OPTION
,
269 NO_DELAY_DIRECTORY_RESTORE_OPTION
,
270 NO_IGNORE_CASE_OPTION
,
271 NO_IGNORE_COMMAND_ERROR_OPTION
,
272 NO_OVERWRITE_DIR_OPTION
,
273 NO_QUOTE_CHARS_OPTION
,
275 NO_SAME_OWNER_OPTION
,
276 NO_SAME_PERMISSIONS_OPTION
,
278 NO_WILDCARDS_MATCH_SLASH_OPTION
,
281 NUMERIC_OWNER_OPTION
,
284 ONE_FILE_SYSTEM_OPTION
,
285 OVERWRITE_DIR_OPTION
,
292 QUOTING_STYLE_OPTION
,
295 RECURSIVE_UNLINK_OPTION
,
301 SHOW_DEFAULTS_OPTION
,
302 SHOW_OMITTED_DIRS_OPTION
,
303 SHOW_TRANSFORMED_NAMES_OPTION
,
304 STRIP_COMPONENTS_OPTION
,
312 USE_COMPRESS_PROGRAM_OPTION
,
316 WILDCARDS_MATCH_SLASH_OPTION
,
320 const char *argp_program_version
= "tar (" PACKAGE_NAME
") " VERSION
;
321 const char *argp_program_bug_address
= "<" PACKAGE_BUGREPORT
">";
322 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\
325 tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n\
326 tar -tvf archive.tar # List all files in archive.tar verbosely.\n\
327 tar -xf archive.tar # Extract all files from archive.tar.\n\
328 \vThe backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
329 The version control may be set with --backup or VERSION_CONTROL, values are:\n\n\
330 none, off never make backups\n\
331 t, numbered make numbered backups\n\
332 nil, existing numbered if numbered backups exist, simple otherwise\n\
333 never, simple always make simple backups\n");
338 Available option letters are DEIJQY and aeqy. Consider the following
341 [For Solaris tar compatibility =/= Is it important at all?]
342 e exit immediately with a nonzero exit status if unexpected errors occur
343 E use extended headers (--format=posix)
345 [q alias for --occurrence=1 =/= this would better be used for quiet?]
346 [I same as T =/= will harm star compatibility]
348 y per-file gzip compression
349 Y per-block gzip compression */
351 static struct argp_option options
[] = {
354 N_("Main operation mode:"), GRID
},
357 N_("list the contents of an archive"), GRID
+1 },
358 {"extract", 'x', 0, 0,
359 N_("extract files from an archive"), GRID
+1 },
360 {"get", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
361 {"create", 'c', 0, 0,
362 N_("create a new archive"), GRID
+1 },
364 N_("find differences between archive and file system"), GRID
+1 },
365 {"compare", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
366 {"append", 'r', 0, 0,
367 N_("append files to the end of an archive"), GRID
+1 },
368 {"update", 'u', 0, 0,
369 N_("only append files newer than copy in archive"), GRID
+1 },
370 {"catenate", 'A', 0, 0,
371 N_("append tar files to an archive"), GRID
+1 },
372 {"concatenate", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
373 {"delete", DELETE_OPTION
, 0, 0,
374 N_("delete from the archive (not on mag tapes!)"), GRID
+1 },
375 {"test-label", TEST_LABEL_OPTION
, NULL
, 0,
376 N_("test the archive volume label and exit"), GRID
+1 },
381 N_("Operation modifiers:"), GRID
},
383 {"sparse", 'S', 0, 0,
384 N_("handle sparse files efficiently"), GRID
+1 },
385 {"incremental", 'G', 0, 0,
386 N_("handle old GNU-format incremental backup"), GRID
+1 },
387 {"listed-incremental", 'g', N_("FILE"), 0,
388 N_("handle new GNU-format incremental backup"), GRID
+1 },
389 {"ignore-failed-read", IGNORE_FAILED_READ_OPTION
, 0, 0,
390 N_("do not exit with nonzero on unreadable files"), GRID
+1 },
391 {"occurrence", OCCURRENCE_OPTION
, N_("NUMBER"), OPTION_ARG_OPTIONAL
,
392 N_("process only the NUMBERth occurrence of each file in the archive;"
393 " this option is valid only in conjunction with one of the subcommands"
394 " --delete, --diff, --extract or --list and when a list of files"
395 " is given either on the command line or via the -T option;"
396 " NUMBER defaults to 1"), GRID
+1 },
397 {"seek", 'n', NULL
, 0,
398 N_("archive is seekable"), GRID
+1 },
403 N_("Overwrite control:\n"), GRID
+1 },
405 {"verify", 'W', 0, 0,
406 N_("attempt to verify the archive after writing it"), GRID
+1 },
407 {"remove-files", REMOVE_FILES_OPTION
, 0, 0,
408 N_("remove files after adding them to the archive"), GRID
+1 },
409 {"keep-old-files", 'k', 0, 0,
410 N_("don't replace existing files when extracting"), GRID
+1 },
411 {"keep-newer-files", KEEP_NEWER_FILES_OPTION
, 0, 0,
412 N_("don't replace existing files that are newer than their archive copies"), GRID
+1 },
413 {"overwrite", OVERWRITE_OPTION
, 0, 0,
414 N_("overwrite existing files when extracting"), GRID
+1 },
415 {"unlink-first", 'U', 0, 0,
416 N_("remove each file prior to extracting over it"), GRID
+1 },
417 {"recursive-unlink", RECURSIVE_UNLINK_OPTION
, 0, 0,
418 N_("empty hierarchies prior to extracting directory"), GRID
+1 },
419 {"no-overwrite-dir", NO_OVERWRITE_DIR_OPTION
, 0, 0,
420 N_("preserve metadata of existing directories"), GRID
+1 },
421 {"overwrite-dir", OVERWRITE_DIR_OPTION
, 0, 0,
422 N_("overwrite metadata of existing directories when extracting (default)"),
428 N_("Select output stream:"), GRID
},
430 {"to-stdout", 'O', 0, 0,
431 N_("extract files to standard output"), GRID
+1 },
432 {"to-command", TO_COMMAND_OPTION
, N_("COMMAND"), 0,
433 N_("pipe extracted files to another program"), GRID
+1 },
434 {"ignore-command-error", IGNORE_COMMAND_ERROR_OPTION
, 0, 0,
435 N_("ignore exit codes of children"), GRID
+1 },
436 {"no-ignore-command-error", NO_IGNORE_COMMAND_ERROR_OPTION
, 0, 0,
437 N_("treat non-zero exit codes of children as error"), GRID
+1 },
442 N_("Handling of file attributes:"), GRID
},
444 {"owner", OWNER_OPTION
, N_("NAME"), 0,
445 N_("force NAME as owner for added files"), GRID
+1 },
446 {"group", GROUP_OPTION
, N_("NAME"), 0,
447 N_("force NAME as group for added files"), GRID
+1 },
448 {"mtime", MTIME_OPTION
, N_("DATE-OR-FILE"), 0,
449 N_("set mtime for added files from DATE-OR-FILE"), GRID
+1 },
450 {"mode", MODE_OPTION
, N_("CHANGES"), 0,
451 N_("force (symbolic) mode CHANGES for added files"), GRID
+1 },
452 {"atime-preserve", ATIME_PRESERVE_OPTION
,
453 N_("METHOD"), OPTION_ARG_OPTIONAL
,
454 N_("preserve access times on dumped files, either by restoring the times"
455 " after reading (METHOD='replace'; default) or by not setting the times"
456 " in the first place (METHOD='system')"), GRID
+1 },
458 N_("don't extract file modified time"), GRID
+1 },
459 {"same-owner", SAME_OWNER_OPTION
, 0, 0,
460 N_("try extracting files with the same ownership"), GRID
+1 },
461 {"no-same-owner", NO_SAME_OWNER_OPTION
, 0, 0,
462 N_("extract files as yourself"), GRID
+1 },
463 {"numeric-owner", NUMERIC_OWNER_OPTION
, 0, 0,
464 N_("always use numbers for user/group names"), GRID
+1 },
465 {"preserve-permissions", 'p', 0, 0,
466 N_("extract information about file permissions (default for superuser)"),
468 {"same-permissions", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
469 {"no-same-permissions", NO_SAME_PERMISSIONS_OPTION
, 0, 0,
470 N_("apply the user's umask when extracting permissions from the archive (default for ordinary users)"), GRID
+1 },
471 {"preserve-order", 's', 0, 0,
472 N_("sort names to extract to match archive"), GRID
+1 },
473 {"same-order", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
474 {"preserve", PRESERVE_OPTION
, 0, 0,
475 N_("same as both -p and -s"), GRID
+1 },
476 {"delay-directory-restore", DELAY_DIRECTORY_RESTORE_OPTION
, 0, 0,
477 N_("delay setting modification times and permissions of extracted"
478 " directories until the end of extraction"), GRID
+1 },
479 {"no-delay-directory-restore", NO_DELAY_DIRECTORY_RESTORE_OPTION
, 0, 0,
480 N_("cancel the effect of --delay-directory-restore option"), GRID
+1 },
485 N_("Device selection and switching:\n"), GRID
+1 },
487 {"file", 'f', N_("ARCHIVE"), 0,
488 N_("use archive file or device ARCHIVE"), GRID
+1 },
489 {"force-local", FORCE_LOCAL_OPTION
, 0, 0,
490 N_("archive file is local even if it has a colon"), GRID
+1 },
491 {"rmt-command", RMT_COMMAND_OPTION
, N_("COMMAND"), 0,
492 N_("use given rmt COMMAND instead of rmt"), GRID
+1 },
493 {"rsh-command", RSH_COMMAND_OPTION
, N_("COMMAND"), 0,
494 N_("use remote COMMAND instead of rsh"), GRID
+1 },
496 {"-[0-7][lmh]", 0, NULL
, OPTION_DOC
, /* It is OK, since `name' will never be
498 N_("specify drive and density"), GRID
+1 },
500 {NULL
, '0', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
501 {NULL
, '1', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
502 {NULL
, '2', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
503 {NULL
, '3', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
504 {NULL
, '4', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
505 {NULL
, '5', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
506 {NULL
, '6', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
507 {NULL
, '7', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
508 {NULL
, '8', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
509 {NULL
, '9', NULL
, OPTION_HIDDEN
, NULL
, GRID
+1 },
511 {"multi-volume", 'M', 0, 0,
512 N_("create/list/extract multi-volume archive"), GRID
+1 },
513 {"tape-length", 'L', N_("NUMBER"), 0,
514 N_("change tape after writing NUMBER x 1024 bytes"), GRID
+1 },
515 {"info-script", 'F', N_("NAME"), 0,
516 N_("run script at end of each tape (implies -M)"), GRID
+1 },
517 {"new-volume-script", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
518 {"volno-file", VOLNO_FILE_OPTION
, N_("FILE"), 0,
519 N_("use/update the volume number in FILE"), GRID
+1 },
524 N_("Device blocking:"), GRID
+1 },
526 {"blocking-factor", 'b', N_("BLOCKS"), 0,
527 N_("BLOCKS x 512 bytes per record"), GRID
+1 },
528 {"record-size", RECORD_SIZE_OPTION
, N_("NUMBER"), 0,
529 N_("NUMBER of bytes per record, multiple of 512"), GRID
+1 },
530 {"ignore-zeros", 'i', 0, 0,
531 N_("ignore zeroed blocks in archive (means EOF)"), GRID
+1 },
532 {"read-full-records", 'B', 0, 0,
533 N_("reblock as we read (for 4.2BSD pipes)"), GRID
+1 },
538 N_("Archive format selection:"), GRID
},
540 {"format", 'H', N_("FORMAT"), 0,
541 N_("create archive of the given format"), GRID
+1 },
543 {NULL
, 0, NULL
, 0, N_("FORMAT is one of the following:"), GRID
+2 },
544 {" v7", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("old V7 tar format"),
546 {" oldgnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
547 N_("GNU format as per tar <= 1.12"), GRID
+3 },
548 {" gnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
549 N_("GNU tar 1.13.x format"), GRID
+3 },
550 {" ustar", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
551 N_("POSIX 1003.1-1988 (ustar) format"), GRID
+3 },
552 {" pax", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
553 N_("POSIX 1003.1-2001 (pax) format"), GRID
+3 },
554 {" posix", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("same as pax"), GRID
+3 },
556 {"old-archive", OLD_ARCHIVE_OPTION
, 0, 0, /* FIXME */
557 N_("same as --format=v7"), GRID
+8 },
558 {"portability", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
559 {"posix", POSIX_OPTION
, 0, 0,
560 N_("same as --format=posix"), GRID
+8 },
561 {"pax-option", PAX_OPTION
, N_("keyword[[:]=value][,keyword[[:]=value]]..."), 0,
562 N_("control pax keywords"), GRID
+8 },
563 {"label", 'V', N_("TEXT"), 0,
564 N_("create archive with volume name TEXT; at list/extract time, use TEXT as a globbing pattern for volume name"), GRID
+8 },
566 N_("filter the archive through bzip2"), GRID
+8 },
568 N_("filter the archive through gzip"), GRID
+8 },
569 {"gunzip", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
570 {"ungzip", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
571 {"compress", 'Z', 0, 0,
572 N_("filter the archive through compress"), GRID
+8 },
573 {"uncompress", 0, 0, OPTION_ALIAS
, NULL
, GRID
+8 },
574 {"use-compress-program", USE_COMPRESS_PROGRAM_OPTION
, N_("PROG"), 0,
575 N_("filter through PROG (must accept -d)"), GRID
+8 },
580 N_("Local file selection:"), GRID
},
582 {"add-file", ARGP_KEY_ARG
, N_("FILE"), 0,
583 N_("add given FILE to the archive (useful if its name starts with a dash)"), GRID
+1 },
584 {"directory", 'C', N_("DIR"), 0,
585 N_("change to directory DIR"), GRID
+1 },
586 {"files-from", 'T', N_("FILE"), 0,
587 N_("get names to extract or create from FILE"), GRID
+1 },
588 {"null", NULL_OPTION
, 0, 0,
589 N_("-T reads null-terminated names, disable -C"), GRID
+1 },
590 {"unquote", UNQUOTE_OPTION
, 0, 0,
591 N_("unquote filenames read with -T (default)"), GRID
+1 },
592 {"no-unquote", NO_UNQUOTE_OPTION
, 0, 0,
593 N_("do not unquote filenames read with -T"), GRID
+1 },
594 {"exclude", EXCLUDE_OPTION
, N_("PATTERN"), 0,
595 N_("exclude files, given as a PATTERN"), GRID
+1 },
596 {"exclude-from", 'X', N_("FILE"), 0,
597 N_("exclude patterns listed in FILE"), GRID
+1 },
598 {"exclude-caches", EXCLUDE_CACHES_OPTION
, 0, 0,
599 N_("exclude directories containing a cache tag"), GRID
+1 },
600 {"no-recursion", NO_RECURSION_OPTION
, 0, 0,
601 N_("avoid descending automatically in directories"), GRID
+1 },
602 {"one-file-system", ONE_FILE_SYSTEM_OPTION
, 0, 0,
603 N_("stay in local file system when creating archive"), GRID
+1 },
604 {"recursion", RECURSION_OPTION
, 0, 0,
605 N_("recurse into directories (default)"), GRID
+1 },
606 {"absolute-names", 'P', 0, 0,
607 N_("don't strip leading `/'s from file names"), GRID
+1 },
608 {"dereference", 'h', 0, 0,
609 N_("follow symlinks; archive and dump the files they point to"), GRID
+1 },
610 {"starting-file", 'K', N_("MEMBER-NAME"), 0,
611 N_("begin at member MEMBER-NAME in the archive"), GRID
+1 },
612 {"newer", 'N', N_("DATE-OR-FILE"), 0,
613 N_("only store files newer than DATE-OR-FILE"), GRID
+1 },
614 {"after-date", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
615 {"newer-mtime", NEWER_MTIME_OPTION
, N_("DATE"), 0,
616 N_("compare date and time when data changed only"), GRID
+1 },
617 {"backup", BACKUP_OPTION
, N_("CONTROL"), OPTION_ARG_OPTIONAL
,
618 N_("backup before removal, choose version CONTROL"), GRID
+1 },
619 {"suffix", SUFFIX_OPTION
, N_("STRING"), 0,
620 N_("backup before removal, override usual suffix ('~' unless overridden by environment variable SIMPLE_BACKUP_SUFFIX)"), GRID
+1 },
625 N_("File name transformations:"), GRID
},
626 {"strip-components", STRIP_COMPONENTS_OPTION
, N_("NUMBER"), 0,
627 N_("strip NUMBER leading components from file names on extraction"),
629 {"transform", TRANSFORM_OPTION
, N_("EXPRESSION"), 0,
630 N_("Use sed replace EXPRESSION to transform file names"), GRID
+1 },
635 N_("File name matching options (affect both exclude and include patterns):"),
637 {"ignore-case", IGNORE_CASE_OPTION
, 0, 0,
638 N_("ignore case"), GRID
+1 },
639 {"anchored", ANCHORED_OPTION
, 0, 0,
640 N_("patterns match file name start"), GRID
+1 },
641 {"no-anchored", NO_ANCHORED_OPTION
, 0, 0,
642 N_("patterns match after any `/' (default for exclusion)"), GRID
+1 },
643 {"no-ignore-case", NO_IGNORE_CASE_OPTION
, 0, 0,
644 N_("case sensitive matching (default)"), GRID
+1 },
645 {"wildcards", WILDCARDS_OPTION
, 0, 0,
646 N_("use wildcards (default for exclusion)"), GRID
+1 },
647 {"no-wildcards", NO_WILDCARDS_OPTION
, 0, 0,
648 N_("verbatim string matching"), GRID
+1 },
649 {"no-wildcards-match-slash", NO_WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
650 N_("wildcards do not match `/'"), GRID
+1 },
651 {"wildcards-match-slash", WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
652 N_("wildcards match `/' (default for exclusion)"), GRID
+1 },
657 N_("Informative output:"), GRID
},
659 {"verbose", 'v', 0, 0,
660 N_("verbosely list files processed"), GRID
+1 },
661 {"checkpoint", CHECKPOINT_OPTION
, N_("[.]NUMBER"), OPTION_ARG_OPTIONAL
,
662 N_("display progress messages every NUMBERth record (default 10)"),
664 {"check-links", 'l', 0, 0,
665 N_("print a message if not all links are dumped"), GRID
+1 },
666 {"totals", TOTALS_OPTION
, N_("SIGNAL"), OPTION_ARG_OPTIONAL
,
667 N_("print total bytes after processing the archive; "
668 "with an argument - print total bytes when this SIGNAL is delivered; "
669 "Allowed signals are: SIGHUP, SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; "
670 "the names without SIG prefix are also accepted"), GRID
+1 },
671 {"utc", UTC_OPTION
, 0, 0,
672 N_("print file modification dates in UTC"), GRID
+1 },
673 {"index-file", INDEX_FILE_OPTION
, N_("FILE"), 0,
674 N_("send verbose output to FILE"), GRID
+1 },
675 {"block-number", 'R', 0, 0,
676 N_("show block number within archive with each message"), GRID
+1 },
677 {"interactive", 'w', 0, 0,
678 N_("ask for confirmation for every action"), GRID
+1 },
679 {"confirmation", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
680 {"show-defaults", SHOW_DEFAULTS_OPTION
, 0, 0,
681 N_("show tar defaults"), GRID
+1 },
682 {"show-omitted-dirs", SHOW_OMITTED_DIRS_OPTION
, 0, 0,
683 N_("when listing or extracting, list each directory that does not match search criteria"), GRID
+1 },
684 {"show-transformed-names", SHOW_TRANSFORMED_NAMES_OPTION
, 0, 0,
685 N_("show file or archive names after transformation"),
687 {"show-stored-names", 0, 0, OPTION_ALIAS
, NULL
, GRID
+1 },
688 {"quoting-style", QUOTING_STYLE_OPTION
, N_("STYLE"), 0,
689 N_("set name quoting style; see below for valid STYLE values"), GRID
+1 },
690 {"quote-chars", QUOTE_CHARS_OPTION
, N_("STRING"), 0,
691 N_("additionally quote characters from STRING"), GRID
+1 },
692 {"no-quote-chars", NO_QUOTE_CHARS_OPTION
, N_("STRING"), 0,
693 N_("disable quoting for characters from STRING"), GRID
+1 },
698 N_("Compatibility options:"), GRID
},
701 N_("when creating, same as --old-archive; when extracting, same as --no-same-owner"), GRID
+1 },
706 N_("Other options:"), GRID
},
708 {"restrict", RESTRICT_OPTION
, 0, 0,
709 N_("disable use of some potentially harmful options"), -1 },
711 {"help", '?', 0, 0, N_("give this help list"), -1},
712 {"usage", USAGE_OPTION
, 0, 0, N_("give a short usage message"), -1},
713 {"version", VERSION_OPTION
, 0, 0, N_("print program version"), -1},
714 /* FIXME -V (--label) conflicts with the default short option for
716 {"HANG", HANG_OPTION
, "SECS", OPTION_ARG_OPTIONAL
| OPTION_HIDDEN
,
717 N_("hang for SECS seconds (default 3600)"), 0},
723 static char const *const atime_preserve_args
[] =
725 "replace", "system", NULL
728 static enum atime_preserve
const atime_preserve_types
[] =
730 replace_atime_preserve
, system_atime_preserve
733 /* Make sure atime_preserve_types has as much entries as atime_preserve_args
734 (minus 1 for NULL guard) */
735 ARGMATCH_VERIFY (atime_preserve_args
, atime_preserve_types
);
737 /* Wildcard matching settings */
740 default_wildcards
, /* For exclusion == enable_wildcards,
741 for inclusion == disable_wildcards */
746 struct tar_args
/* Variables used during option parsing */
748 struct textual_date
*textual_date
; /* Keeps the arguments to --newer-mtime
749 and/or --date option if they are
751 enum wildcards wildcards
; /* Wildcard settings (--wildcards/
753 int matching_flags
; /* exclude_fnmatch options */
754 int include_anchored
; /* Pattern anchoring options used for
756 bool o_option
; /* True if -o option was given */
757 bool pax_option
; /* True if --pax-option was given */
758 char const *backup_suffix_string
; /* --suffix option argument */
759 char const *version_control_string
; /* --backup option argument */
760 bool input_files
; /* True if some input files where given */
763 #define MAKE_EXCL_OPTIONS(args) \
764 ((((args)->wildcards != disable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
765 | (args)->matching_flags \
768 #define MAKE_INCL_OPTIONS(args) \
769 ((((args)->wildcards == enable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
770 | (args)->include_anchored \
771 | (args)->matching_flags \
775 # define DECL_SHOW_DEFAULT_SETTINGS(stream, printer) \
778 "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s", \
779 archive_format_string (DEFAULT_ARCHIVE_FORMAT), \
780 DEFAULT_ARCHIVE, DEFAULT_BLOCKING, \
781 quoting_style_args[DEFAULT_QUOTING_STYLE], \
782 DEFAULT_RMT_COMMAND); \
783 printer (stream, " --rsh-command=%s", REMOTE_SHELL); \
784 printer (stream, "\n"); \
787 # define DECL_SHOW_DEFAULT_SETTINGS(stream, printer) \
790 "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s", \
791 archive_format_string (DEFAULT_ARCHIVE_FORMAT), \
792 DEFAULT_ARCHIVE, DEFAULT_BLOCKING, \
793 quoting_style_args[DEFAULT_QUOTING_STYLE], \
794 DEFAULT_RMT_COMMAND); \
795 printer (stream, "\n"); \
800 show_default_settings (FILE *fp
)
801 DECL_SHOW_DEFAULT_SETTINGS(fp
, fprintf
)
804 show_default_settings_fs (argp_fmtstream_t fs
)
805 DECL_SHOW_DEFAULT_SETTINGS(fs
, argp_fmtstream_printf
)
808 set_subcommand_option (enum subcommand subcommand
)
810 if (subcommand_option
!= UNKNOWN_SUBCOMMAND
811 && subcommand_option
!= subcommand
)
813 _("You may not specify more than one `-Acdtrux' option")));
815 subcommand_option
= subcommand
;
819 set_use_compress_program_option (const char *string
)
821 if (use_compress_program_option
822 && strcmp (use_compress_program_option
, string
) != 0)
823 USAGE_ERROR ((0, 0, _("Conflicting compression options")));
825 use_compress_program_option
= string
;
832 print_total_stats ();
833 #ifndef HAVE_SIGACTION
834 signal (signo
, sigstat
);
839 stat_on_signal (int signo
)
841 #ifdef HAVE_SIGACTION
842 struct sigaction act
;
843 act
.sa_handler
= sigstat
;
844 sigemptyset (&act
.sa_mask
);
846 sigaction (signo
, &act
, NULL
);
848 signal (signo
, sigstat
);
853 set_stat_signal (const char *name
)
860 { "SIGUSR1", SIGUSR1
},
862 { "SIGUSR2", SIGUSR2
},
864 { "SIGHUP", SIGHUP
},
866 { "SIGINT", SIGINT
},
868 { "SIGQUIT", SIGQUIT
},
873 for (p
= sigtab
; p
< sigtab
+ sizeof (sigtab
) / sizeof (sigtab
[0]); p
++)
874 if (strcmp (p
->name
, name
) == 0)
876 stat_on_signal (p
->signo
);
879 FATAL_ERROR ((0, 0, _("Unknown signal name: %s"), name
));
885 struct textual_date
*next
;
892 get_date_or_file (struct tar_args
*args
, const char *option
,
893 const char *str
, struct timespec
*ts
)
895 if (FILE_SYSTEM_PREFIX_LEN (str
) != 0
900 if (deref_stat (dereference_option
, str
, &st
) != 0)
903 USAGE_ERROR ((0, 0, _("Date sample file not found")));
905 *ts
= get_stat_mtime (&st
);
909 if (! get_date (ts
, str
, NULL
))
911 WARN ((0, 0, _("Substituting %s for unknown date format %s"),
912 tartime (*ts
, false), quote (str
)));
917 struct textual_date
*p
= xmalloc (sizeof (*p
));
921 p
->next
= args
->textual_date
;
922 args
->textual_date
= p
;
928 report_textual_dates (struct tar_args
*args
)
930 struct textual_date
*p
;
931 for (p
= args
->textual_date
; p
; )
933 struct textual_date
*next
= p
->next
;
934 char const *treated_as
= tartime (*p
->ts
, true);
935 if (strcmp (p
->date
, treated_as
) != 0)
936 WARN ((0, 0, _("Option %s: Treating date `%s' as %s"),
937 p
->option
, p
->date
, treated_as
));
944 static volatile int _argp_hang
;
946 enum read_file_list_state
/* Result of reading file name from the list file */
948 file_list_success
, /* OK, name read successfully */
949 file_list_end
, /* End of list file */
950 file_list_zero
/* Zero separator encountered where it should not */
953 /* Read from FP a sequence of characters up to FILENAME_TERMINATOR and put them
956 static enum read_file_list_state
957 read_name_from_file (FILE *fp
, struct obstack
*stk
)
962 for (c
= getc (fp
); c
!= EOF
&& c
!= filename_terminator
; c
= getc (fp
))
966 /* We have read a zero separator. The file possibly is
968 /* FATAL_ERROR((0, 0, N_("file name contains null character"))); */
969 return file_list_zero
;
971 obstack_1grow (stk
, c
);
975 obstack_1grow (stk
, 0);
977 return (counter
== 0 && c
== EOF
) ? file_list_end
: file_list_success
;
981 static bool files_from_option
; /* When set, tar will not refuse to create
983 static struct obstack argv_stk
; /* Storage for additional command line options
984 read using -T option */
986 /* Prevent recursive inclusion of the same file */
989 struct file_id_list
*next
;
994 static struct file_id_list
*file_id_list
;
997 add_file_id (const char *filename
)
999 struct file_id_list
*p
;
1002 if (stat (filename
, &st
))
1003 stat_fatal (filename
);
1004 for (p
= file_id_list
; p
; p
= p
->next
)
1005 if (p
->ino
== st
.st_ino
&& p
->dev
== st
.st_dev
)
1007 FATAL_ERROR ((0, 0, _("%s: file list already read"),
1008 quotearg_colon (filename
)));
1010 p
= xmalloc (sizeof *p
);
1011 p
->next
= file_id_list
;
1017 /* Default density numbers for [0-9][lmh] device specifications */
1019 #ifndef LOW_DENSITY_NUM
1020 # define LOW_DENSITY_NUM 0
1023 #ifndef MID_DENSITY_NUM
1024 # define MID_DENSITY_NUM 8
1027 #ifndef HIGH_DENSITY_NUM
1028 # define HIGH_DENSITY_NUM 16
1032 update_argv (const char *filename
, struct argp_state
*state
)
1035 size_t count
= 0, i
;
1039 bool is_stdin
= false;
1040 enum read_file_list_state read_state
;
1042 if (!strcmp (filename
, "-"))
1045 request_stdin ("-T");
1050 add_file_id (filename
);
1051 if ((fp
= fopen (filename
, "r")) == NULL
)
1052 open_fatal (filename
);
1055 while ((read_state
= read_name_from_file (fp
, &argv_stk
)) == file_list_success
)
1058 if (read_state
== file_list_zero
)
1062 WARN ((0, 0, N_("%s: file name read contains nul character"),
1063 quotearg_colon (filename
)));
1065 /* Prepare new stack contents */
1066 size
= obstack_object_size (&argv_stk
);
1067 p
= obstack_finish (&argv_stk
);
1068 for (; size
> 0; size
--, p
++)
1070 obstack_1grow (&argv_stk
, *p
);
1072 obstack_1grow (&argv_stk
, '\n');
1073 obstack_1grow (&argv_stk
, 0);
1076 /* Read rest of files using new filename terminator */
1077 filename_terminator
= 0;
1078 while (read_name_from_file (fp
, &argv_stk
) == file_list_success
)
1088 start
= obstack_finish (&argv_stk
);
1090 if (filename_terminator
== 0)
1091 for (p
= start
; *p
; p
+= strlen (p
) + 1)
1095 new_argc
= state
->argc
+ count
;
1096 new_argv
= xmalloc (sizeof (state
->argv
[0]) * (new_argc
+ 1));
1097 memcpy (new_argv
, state
->argv
, sizeof (state
->argv
[0]) * (state
->argc
+ 1));
1098 state
->argv
= new_argv
;
1099 memmove (&state
->argv
[state
->next
+ count
], &state
->argv
[state
->next
],
1100 (state
->argc
- state
->next
+ 1) * sizeof (state
->argv
[0]));
1102 state
->argc
= new_argc
;
1104 for (i
= state
->next
, p
= start
; *p
; p
+= strlen (p
) + 1, i
++)
1106 if (filename_terminator
== 0 && p
[0] == '-')
1107 state
->argv
[i
++] = "--add-file";
1114 tar_help (struct argp_state
*state
)
1116 argp_fmtstream_t fs
;
1117 state
->flags
|= ARGP_NO_EXIT
;
1118 argp_state_help (state
, state
->out_stream
,
1119 ARGP_HELP_STD_HELP
& ~ARGP_HELP_BUG_ADDR
);
1120 /* FIXME: use struct uparams.rmargin (from argp-help.c) instead of 79 */
1121 fs
= argp_make_fmtstream (state
->out_stream
, 0, 79, 0);
1123 argp_fmtstream_printf (fs
, "\n%s\n\n",
1124 _("Valid arguments for --quoting-style options are:"));
1125 tar_list_quoting_styles (fs
, " ");
1127 argp_fmtstream_puts (fs
, _("\n*This* tar defaults to:\n"));
1128 show_default_settings_fs (fs
);
1129 argp_fmtstream_putc (fs
, '\n');
1130 argp_fmtstream_printf (fs
, _("Report bugs to %s.\n"),
1131 argp_program_bug_address
);
1132 argp_fmtstream_free (fs
);
1136 parse_opt (int key
, char *arg
, struct argp_state
*state
)
1138 struct tar_args
*args
= state
->input
;
1143 /* File name or non-parsed option, because of ARGP_IN_ORDER */
1144 name_add_name (arg
, MAKE_INCL_OPTIONS (args
));
1145 args
->input_files
= true;
1149 set_subcommand_option (CAT_SUBCOMMAND
);
1155 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1156 && u
== (blocking_factor
= u
)
1157 && 0 < blocking_factor
1158 && u
== (record_size
= u
* BLOCKSIZE
) / BLOCKSIZE
))
1159 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1160 _("Invalid blocking factor")));
1165 /* Try to reblock input records. For reading 4.2BSD pipes. */
1167 /* It would surely make sense to exchange -B and -R, but it seems
1168 that -B has been used for a long while in Sun tar and most
1169 BSD-derived systems. This is a consequence of the block/record
1170 terminology confusion. */
1172 read_full_records_option
= true;
1176 set_subcommand_option (CREATE_SUBCOMMAND
);
1184 set_subcommand_option (DIFF_SUBCOMMAND
);
1188 if (archive_names
== allocated_archive_names
)
1189 archive_name_array
= x2nrealloc (archive_name_array
,
1190 &allocated_archive_names
,
1191 sizeof (archive_name_array
[0]));
1193 archive_name_array
[archive_names
++] = arg
;
1197 /* Since -F is only useful with -M, make it implied. Run this
1198 script at the end of each tape. */
1200 info_script_option
= arg
;
1201 multi_volume_option
= true;
1205 listed_incremental_option
= arg
;
1206 after_date_option
= true;
1210 /* We are making an incremental dump (FIXME: are we?); save
1211 directories at the beginning of the archive, and include in each
1212 directory its contents. */
1214 incremental_option
= true;
1218 /* Follow symbolic links. */
1219 dereference_option
= true;
1223 /* Ignore zero blocks (eofs). This can't be the default,
1224 because Unix tar writes two blocks of zeros, then pads out
1225 the record with garbage. */
1227 ignore_zeros_option
= true;
1232 _("Warning: the -I option is not supported;"
1233 " perhaps you meant -j or -T?")));
1237 set_use_compress_program_option ("bzip2");
1241 /* Don't replace existing files. */
1242 old_files_option
= KEEP_OLD_FILES
;
1246 starting_file_option
= true;
1250 case ONE_FILE_SYSTEM_OPTION
:
1251 /* When dumping directories, don't dump files/subdirectories
1252 that are on other filesystems. */
1253 one_file_system_option
= true;
1257 check_links_option
= 1;
1263 if (xstrtoumax (arg
, 0, 10, &u
, "") != LONGINT_OK
)
1264 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1265 _("Invalid tape length")));
1266 tape_length_option
= 1024 * (tarlong
) u
;
1267 multi_volume_option
= true;
1272 touch_option
= true;
1276 /* Make multivolume archive: when we can't write any more into
1277 the archive, re-open it, and continue writing. */
1279 multi_volume_option
= true;
1283 get_date_or_file (args
, "--mtime", arg
, &mtime_option
);
1284 set_mtime_option
= true;
1288 seekable_archive
= true;
1292 after_date_option
= true;
1295 case NEWER_MTIME_OPTION
:
1296 if (NEWER_OPTION_INITIALIZED (newer_mtime_option
))
1297 USAGE_ERROR ((0, 0, _("More than one threshold date")));
1298 get_date_or_file (args
,
1299 key
== NEWER_MTIME_OPTION
? "--newer-mtime"
1300 : "--after-date", arg
, &newer_mtime_option
);
1304 args
->o_option
= true;
1308 to_stdout_option
= true;
1312 same_permissions_option
= true;
1316 absolute_names_option
= true;
1320 set_subcommand_option (APPEND_SUBCOMMAND
);
1324 /* Print block numbers for debugging bad tar archives. */
1326 /* It would surely make sense to exchange -B and -R, but it seems
1327 that -B has been used for a long while in Sun tar ans most
1328 BSD-derived systems. This is a consequence of the block/record
1329 terminology confusion. */
1331 block_number_option
= true;
1335 /* Names to extr are sorted. */
1337 same_order_option
= true;
1341 sparse_option
= true;
1345 set_subcommand_option (LIST_SUBCOMMAND
);
1349 case TEST_LABEL_OPTION
:
1350 set_subcommand_option (LIST_SUBCOMMAND
);
1351 test_label_option
= true;
1355 update_argv (arg
, state
);
1356 /* Indicate we've been given -T option. This is for backward
1357 compatibility only, so that `tar cfT archive /dev/null will
1359 files_from_option
= true;
1363 set_subcommand_option (UPDATE_SUBCOMMAND
);
1367 old_files_option
= UNLINK_FIRST_OLD_FILES
;
1379 volume_label_option
= arg
;
1383 interactive_option
= true;
1387 verify_option
= true;
1391 set_subcommand_option (EXTRACT_SUBCOMMAND
);
1395 if (add_exclude_file (add_exclude
, excluded
, arg
,
1396 MAKE_EXCL_OPTIONS (args
), '\n')
1400 FATAL_ERROR ((0, e
, "%s", quotearg_colon (arg
)));
1405 set_use_compress_program_option ("gzip");
1409 set_use_compress_program_option ("compress");
1412 case ANCHORED_OPTION
:
1413 args
->matching_flags
|= EXCLUDE_ANCHORED
;
1416 case ATIME_PRESERVE_OPTION
:
1417 atime_preserve_option
=
1419 ? XARGMATCH ("--atime-preserve", arg
,
1420 atime_preserve_args
, atime_preserve_types
)
1421 : replace_atime_preserve
);
1422 if (! O_NOATIME
&& atime_preserve_option
== system_atime_preserve
)
1424 _("--atime-preserve='system' is not supported"
1425 " on this platform")));
1428 case CHECKPOINT_OPTION
:
1435 checkpoint_style
= checkpoint_dot
;
1438 checkpoint_option
= strtoul (arg
, &p
, 0);
1441 _("--checkpoint value is not an integer")));
1444 checkpoint_option
= 10;
1448 backup_option
= true;
1450 args
->version_control_string
= arg
;
1453 case DELAY_DIRECTORY_RESTORE_OPTION
:
1454 delay_directory_restore_option
= true;
1457 case NO_DELAY_DIRECTORY_RESTORE_OPTION
:
1458 delay_directory_restore_option
= false;
1462 set_subcommand_option (DELETE_SUBCOMMAND
);
1465 case EXCLUDE_OPTION
:
1466 add_exclude (excluded
, arg
, MAKE_EXCL_OPTIONS (args
));
1469 case EXCLUDE_CACHES_OPTION
:
1470 exclude_caches_option
= true;
1473 case FORCE_LOCAL_OPTION
:
1474 force_local_option
= true;
1478 set_archive_format (arg
);
1481 case INDEX_FILE_OPTION
:
1482 index_file_name
= arg
;
1485 case IGNORE_CASE_OPTION
:
1486 args
->matching_flags
|= FNM_CASEFOLD
;
1489 case IGNORE_COMMAND_ERROR_OPTION
:
1490 ignore_command_error_option
= true;
1493 case IGNORE_FAILED_READ_OPTION
:
1494 ignore_failed_read_option
= true;
1497 case KEEP_NEWER_FILES_OPTION
:
1498 old_files_option
= KEEP_NEWER_FILES
;
1502 if (! (strlen (arg
) < GNAME_FIELD_SIZE
1503 && gname_to_gid (arg
, &group_option
)))
1506 if (xstrtoumax (arg
, 0, 10, &g
, "") == LONGINT_OK
1510 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1511 _("%s: Invalid group")));
1516 mode_option
= mode_compile (arg
);
1518 FATAL_ERROR ((0, 0, _("Invalid mode given on option")));
1519 initial_umask
= umask (0);
1520 umask (initial_umask
);
1523 case NO_ANCHORED_OPTION
:
1524 args
->include_anchored
= 0; /* Clear the default for comman line args */
1525 args
->matching_flags
&= ~ EXCLUDE_ANCHORED
;
1528 case NO_IGNORE_CASE_OPTION
:
1529 args
->matching_flags
&= ~ FNM_CASEFOLD
;
1532 case NO_IGNORE_COMMAND_ERROR_OPTION
:
1533 ignore_command_error_option
= false;
1536 case NO_OVERWRITE_DIR_OPTION
:
1537 old_files_option
= NO_OVERWRITE_DIR_OLD_FILES
;
1540 case NO_QUOTE_CHARS_OPTION
:
1542 set_char_quoting (NULL
, *arg
, 0);
1545 case NO_WILDCARDS_OPTION
:
1546 args
->wildcards
= disable_wildcards
;
1549 case NO_WILDCARDS_MATCH_SLASH_OPTION
:
1550 args
->matching_flags
|= FNM_FILE_NAME
;
1554 filename_terminator
= '\0';
1557 case NUMERIC_OWNER_OPTION
:
1558 numeric_owner_option
= true;
1561 case OCCURRENCE_OPTION
:
1563 occurrence_option
= 1;
1567 if (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
)
1568 occurrence_option
= u
;
1570 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1571 _("Invalid number")));
1575 case OVERWRITE_DIR_OPTION
:
1576 old_files_option
= DEFAULT_OLD_FILES
;
1579 case OVERWRITE_OPTION
:
1580 old_files_option
= OVERWRITE_OLD_FILES
;
1584 if (! (strlen (arg
) < UNAME_FIELD_SIZE
1585 && uname_to_uid (arg
, &owner_option
)))
1588 if (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1592 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1593 _("Invalid owner")));
1597 case QUOTE_CHARS_OPTION
:
1599 set_char_quoting (NULL
, *arg
, 1);
1602 case QUOTING_STYLE_OPTION
:
1603 tar_set_quoting_style (arg
);
1607 args
->pax_option
= true;
1608 xheader_set_option (arg
);
1612 set_archive_format ("posix");
1615 case PRESERVE_OPTION
:
1616 /* FIXME: What it is good for? */
1617 same_permissions_option
= true;
1618 same_order_option
= true;
1621 case RECORD_SIZE_OPTION
:
1624 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1625 && u
== (size_t) u
))
1626 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1627 _("Invalid record size")));
1629 if (record_size
% BLOCKSIZE
!= 0)
1630 USAGE_ERROR ((0, 0, _("Record size must be a multiple of %d."),
1632 blocking_factor
= record_size
/ BLOCKSIZE
;
1636 case RECURSIVE_UNLINK_OPTION
:
1637 recursive_unlink_option
= true;
1640 case REMOVE_FILES_OPTION
:
1641 remove_files_option
= true;
1644 case RESTRICT_OPTION
:
1645 restrict_option
= true;
1648 case RMT_COMMAND_OPTION
:
1652 case RSH_COMMAND_OPTION
:
1653 rsh_command_option
= arg
;
1656 case SHOW_DEFAULTS_OPTION
:
1657 show_default_settings (stdout
);
1661 case STRIP_COMPONENTS_OPTION
:
1664 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1665 && u
== (size_t) u
))
1666 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1667 _("Invalid number of elements")));
1668 strip_name_components
= u
;
1672 case SHOW_OMITTED_DIRS_OPTION
:
1673 show_omitted_dirs_option
= true;
1676 case SHOW_TRANSFORMED_NAMES_OPTION
:
1677 show_transformed_names_option
= true;
1681 backup_option
= true;
1682 args
->backup_suffix_string
= arg
;
1685 case TO_COMMAND_OPTION
:
1686 if (to_command_option
)
1687 USAGE_ERROR ((0, 0, _("Only one --to-command option allowed")));
1688 to_command_option
= arg
;
1693 set_stat_signal (arg
);
1695 totals_option
= true;
1698 case TRANSFORM_OPTION
:
1699 set_transform_expr (arg
);
1702 case USE_COMPRESS_PROGRAM_OPTION
:
1703 set_use_compress_program_option (arg
);
1706 case VOLNO_FILE_OPTION
:
1707 volno_file_option
= arg
;
1710 case WILDCARDS_OPTION
:
1711 args
->wildcards
= enable_wildcards
;
1714 case WILDCARDS_MATCH_SLASH_OPTION
:
1715 args
->matching_flags
&= ~ FNM_FILE_NAME
;
1718 case NO_RECURSION_OPTION
:
1719 recursion_option
= 0;
1722 case NO_SAME_OWNER_OPTION
:
1723 same_owner_option
= -1;
1726 case NO_SAME_PERMISSIONS_OPTION
:
1727 same_permissions_option
= -1;
1730 case RECURSION_OPTION
:
1731 recursion_option
= FNM_LEADING_DIR
;
1734 case SAME_OWNER_OPTION
:
1735 same_owner_option
= 1;
1738 case UNQUOTE_OPTION
:
1739 unquote_option
= true;
1742 case NO_UNQUOTE_OPTION
:
1743 unquote_option
= false;
1755 #ifdef DEVICE_PREFIX
1757 int device
= key
- '0';
1759 static char buf
[sizeof DEVICE_PREFIX
+ 10];
1763 argp_error (state
, _("Malformed density argument: %s"), quote (arg
));
1765 strcpy (buf
, DEVICE_PREFIX
);
1766 cursor
= buf
+ strlen (buf
);
1768 #ifdef DENSITY_LETTER
1770 sprintf (cursor
, "%d%c", device
, arg
[0]);
1772 #else /* not DENSITY_LETTER */
1777 device
+= LOW_DENSITY_NUM
;
1781 device
+= MID_DENSITY_NUM
;
1785 device
+= HIGH_DENSITY_NUM
;
1789 argp_error (state
, _("Unknown density: `%c'"), arg
[0]);
1791 sprintf (cursor
, "%d", device
);
1793 #endif /* not DENSITY_LETTER */
1795 if (archive_names
== allocated_archive_names
)
1796 archive_name_array
= x2nrealloc (archive_name_array
,
1797 &allocated_archive_names
,
1798 sizeof (archive_name_array
[0]));
1799 archive_name_array
[archive_names
++] = xstrdup (buf
);
1803 #else /* not DEVICE_PREFIX */
1806 _("Options `-[0-7][lmh]' not supported by *this* tar"));
1808 #endif /* not DEVICE_PREFIX */
1816 argp_state_help (state
, state
->out_stream
, ARGP_HELP_USAGE
);
1820 case VERSION_OPTION
:
1821 version_etc (state
->out_stream
, "tar", PACKAGE_NAME
, VERSION
,
1822 "John Gilmore", "Jay Fenlason", (char *) NULL
);
1827 _argp_hang
= atoi (arg
? arg
: "3600");
1828 while (_argp_hang
-- > 0)
1833 return ARGP_ERR_UNKNOWN
;
1838 static struct argp argp
= {
1851 argp_help (&argp
, stderr
, ARGP_HELP_SEE
, (char*) program_name
);
1856 /* Parse the options for tar. */
1858 static struct argp_option
*
1859 find_argp_option (struct argp_option
*options
, int letter
)
1862 !(options
->name
== NULL
1863 && options
->key
== 0
1864 && options
->arg
== 0
1865 && options
->flags
== 0
1866 && options
->doc
== NULL
); options
++)
1867 if (options
->key
== letter
)
1873 decode_options (int argc
, char **argv
)
1876 struct tar_args args
;
1878 /* Set some default option values. */
1879 args
.textual_date
= NULL
;
1880 args
.wildcards
= default_wildcards
;
1881 args
.matching_flags
= 0;
1882 args
.include_anchored
= EXCLUDE_ANCHORED
;
1883 args
.o_option
= false;
1884 args
.pax_option
= false;
1885 args
.backup_suffix_string
= getenv ("SIMPLE_BACKUP_SUFFIX");
1886 args
.version_control_string
= 0;
1887 args
.input_files
= false;
1889 subcommand_option
= UNKNOWN_SUBCOMMAND
;
1890 archive_format
= DEFAULT_FORMAT
;
1891 blocking_factor
= DEFAULT_BLOCKING
;
1892 record_size
= DEFAULT_BLOCKING
* BLOCKSIZE
;
1893 excluded
= new_exclude ();
1894 newer_mtime_option
.tv_sec
= TYPE_MINIMUM (time_t);
1895 newer_mtime_option
.tv_nsec
= -1;
1896 recursion_option
= FNM_LEADING_DIR
;
1897 unquote_option
= true;
1902 /* Convert old-style tar call by exploding option element and rearranging
1903 options accordingly. */
1905 if (argc
> 1 && argv
[1][0] != '-')
1907 int new_argc
; /* argc value for rearranged arguments */
1908 char **new_argv
; /* argv value for rearranged arguments */
1909 char *const *in
; /* cursor into original argv */
1910 char **out
; /* cursor into rearranged argv */
1911 const char *letter
; /* cursor into old option letters */
1912 char buffer
[3]; /* constructed option buffer */
1914 /* Initialize a constructed option. */
1919 /* Allocate a new argument array, and copy program name in it. */
1921 new_argc
= argc
- 1 + strlen (argv
[1]);
1922 new_argv
= xmalloc ((new_argc
+ 1) * sizeof (char *));
1927 /* Copy each old letter option as a separate option, and have the
1928 corresponding argument moved next to it. */
1930 for (letter
= *in
++; *letter
; letter
++)
1932 struct argp_option
*opt
;
1934 buffer
[1] = *letter
;
1935 *out
++ = xstrdup (buffer
);
1936 opt
= find_argp_option (options
, *letter
);
1937 if (opt
&& opt
->arg
)
1939 if (in
< argv
+ argc
)
1942 USAGE_ERROR ((0, 0, _("Old option `%c' requires an argument."),
1947 /* Copy all remaining options. */
1949 while (in
< argv
+ argc
)
1953 /* Replace the old option list by the new one. */
1959 /* Parse all options and non-options as they appear. */
1961 prepend_default_options (getenv ("TAR_OPTIONS"), &argc
, &argv
);
1963 if (argp_parse (&argp
, argc
, argv
, ARGP_IN_ORDER
|ARGP_NO_HELP
,
1965 exit (TAREXIT_FAILURE
);
1968 /* Special handling for 'o' option:
1970 GNU tar used to say "output old format".
1971 UNIX98 tar says don't chown files after extracting (we use
1972 "--no-same-owner" for this).
1974 The old GNU tar semantics is retained when used with --create
1975 option, otherwise UNIX98 semantics is assumed */
1979 if (subcommand_option
== CREATE_SUBCOMMAND
)
1981 /* GNU Tar <= 1.13 compatibility */
1982 set_archive_format ("v7");
1986 /* UNIX98 compatibility */
1987 same_owner_option
= -1;
1991 /* Handle operands after any "--" argument. */
1992 for (; index
< argc
; index
++)
1994 name_add_name (argv
[index
], MAKE_INCL_OPTIONS (&args
));
1995 args
.input_files
= true;
1998 /* Warn about implicit use of the wildcards in command line arguments.
2000 warn_regex_usage
= args
.wildcards
== default_wildcards
;
2002 /* Derive option values and check option consistency. */
2004 if (archive_format
== DEFAULT_FORMAT
)
2006 if (args
.pax_option
)
2007 archive_format
= POSIX_FORMAT
;
2009 archive_format
= DEFAULT_ARCHIVE_FORMAT
;
2012 if ((volume_label_option
&& subcommand_option
== CREATE_SUBCOMMAND
)
2013 || incremental_option
2014 || multi_volume_option
2016 assert_format (FORMAT_MASK (OLDGNU_FORMAT
)
2017 | FORMAT_MASK (GNU_FORMAT
)
2018 | FORMAT_MASK (POSIX_FORMAT
));
2020 if (multi_volume_option
2021 && archive_format
== POSIX_FORMAT
2022 && subcommand_option
== CREATE_SUBCOMMAND
2023 && !tape_length_option
)
2025 _("creating multi-volume archives in posix format requires using --tape-length (-L) option")));
2027 if (occurrence_option
)
2029 if (!args
.input_files
)
2031 _("--occurrence is meaningless without a file list")));
2032 if (subcommand_option
!= DELETE_SUBCOMMAND
2033 && subcommand_option
!= DIFF_SUBCOMMAND
2034 && subcommand_option
!= EXTRACT_SUBCOMMAND
2035 && subcommand_option
!= LIST_SUBCOMMAND
)
2037 _("--occurrence cannot be used in the requested operation mode")));
2040 if (seekable_archive
&& subcommand_option
== DELETE_SUBCOMMAND
)
2042 /* The current code in delete.c is based on the assumption that
2043 skip_member() reads all data from the archive. So, we should
2044 make sure it won't use seeks. On the other hand, the same code
2045 depends on the ability to backspace a record in the archive,
2046 so setting seekable_archive to false is technically incorrect.
2047 However, it is tested only in skip_member(), so it's not a
2049 seekable_archive
= false;
2052 if (archive_names
== 0)
2054 /* If no archive file name given, try TAPE from the environment, or
2055 else, DEFAULT_ARCHIVE from the configuration process. */
2058 archive_name_array
[0] = getenv ("TAPE");
2059 if (! archive_name_array
[0])
2060 archive_name_array
[0] = DEFAULT_ARCHIVE
;
2063 /* Allow multiple archives only with `-M'. */
2065 if (archive_names
> 1 && !multi_volume_option
)
2067 _("Multiple archive files require `-M' option")));
2069 if (listed_incremental_option
2070 && NEWER_OPTION_INITIALIZED (newer_mtime_option
))
2072 _("Cannot combine --listed-incremental with --newer")));
2074 if (volume_label_option
)
2076 if (archive_format
== GNU_FORMAT
|| archive_format
== OLDGNU_FORMAT
)
2078 size_t volume_label_max_len
=
2079 (sizeof current_header
->header
.name
2080 - 1 /* for trailing '\0' */
2081 - (multi_volume_option
2082 ? (sizeof " Volume "
2083 - 1 /* for null at end of " Volume " */
2084 + INT_STRLEN_BOUND (int) /* for volume number */
2085 - 1 /* for sign, as 0 <= volno */)
2087 if (volume_label_max_len
< strlen (volume_label_option
))
2089 ngettext ("%s: Volume label is too long (limit is %lu byte)",
2090 "%s: Volume label is too long (limit is %lu bytes)",
2091 volume_label_max_len
),
2092 quotearg_colon (volume_label_option
),
2093 (unsigned long) volume_label_max_len
));
2096 Label length in PAX format is limited by the volume size. */
2101 if (multi_volume_option
)
2102 USAGE_ERROR ((0, 0, _("Cannot verify multi-volume archives")));
2103 if (use_compress_program_option
)
2104 USAGE_ERROR ((0, 0, _("Cannot verify compressed archives")));
2107 if (use_compress_program_option
)
2109 if (multi_volume_option
)
2110 USAGE_ERROR ((0, 0, _("Cannot use multi-volume compressed archives")));
2111 if (subcommand_option
== UPDATE_SUBCOMMAND
2112 || subcommand_option
== APPEND_SUBCOMMAND
2113 || subcommand_option
== DELETE_SUBCOMMAND
)
2114 USAGE_ERROR ((0, 0, _("Cannot update compressed archives")));
2115 if (subcommand_option
== CAT_SUBCOMMAND
)
2116 USAGE_ERROR ((0, 0, _("Cannot concatenate compressed archives")));
2119 /* It is no harm to use --pax-option on non-pax archives in archive
2120 reading mode. It may even be useful, since it allows to override
2121 file attributes from tar headers. Therefore I allow such usage.
2124 && archive_format
!= POSIX_FORMAT
2125 && (subcommand_option
!= EXTRACT_SUBCOMMAND
2126 || subcommand_option
!= DIFF_SUBCOMMAND
2127 || subcommand_option
!= LIST_SUBCOMMAND
))
2128 USAGE_ERROR ((0, 0, _("--pax-option can be used only on POSIX archives")));
2130 /* If ready to unlink hierarchies, so we are for simpler files. */
2131 if (recursive_unlink_option
)
2132 old_files_option
= UNLINK_FIRST_OLD_FILES
;
2135 if (test_label_option
)
2137 /* --test-label is silent if the user has specified the label name to
2139 if (!args
.input_files
)
2142 else if (utc_option
)
2145 /* Forbid using -c with no input files whatsoever. Check that `-f -',
2146 explicit or implied, is used correctly. */
2148 switch (subcommand_option
)
2150 case CREATE_SUBCOMMAND
:
2151 if (!args
.input_files
&& !files_from_option
)
2153 _("Cowardly refusing to create an empty archive")));
2156 case EXTRACT_SUBCOMMAND
:
2157 case LIST_SUBCOMMAND
:
2158 case DIFF_SUBCOMMAND
:
2159 for (archive_name_cursor
= archive_name_array
;
2160 archive_name_cursor
< archive_name_array
+ archive_names
;
2161 archive_name_cursor
++)
2162 if (!strcmp (*archive_name_cursor
, "-"))
2163 request_stdin ("-f");
2166 case CAT_SUBCOMMAND
:
2167 case UPDATE_SUBCOMMAND
:
2168 case APPEND_SUBCOMMAND
:
2169 for (archive_name_cursor
= archive_name_array
;
2170 archive_name_cursor
< archive_name_array
+ archive_names
;
2171 archive_name_cursor
++)
2172 if (!strcmp (*archive_name_cursor
, "-"))
2174 _("Options `-Aru' are incompatible with `-f -'")));
2180 archive_name_cursor
= archive_name_array
;
2182 /* Prepare for generating backup names. */
2184 if (args
.backup_suffix_string
)
2185 simple_backup_suffix
= xstrdup (args
.backup_suffix_string
);
2189 backup_type
= xget_version ("--backup", args
.version_control_string
);
2190 /* No backup is needed either if explicitely disabled or if
2191 the extracted files are not being written to disk. */
2192 if (backup_type
== no_backups
|| EXTRACT_OVER_PIPE
)
2193 backup_option
= false;
2197 report_textual_dates (&args
);
2203 /* Main routine for tar. */
2205 main (int argc
, char **argv
)
2208 program_name
= argv
[0];
2210 setlocale (LC_ALL
, "");
2211 bindtextdomain (PACKAGE
, LOCALEDIR
);
2212 textdomain (PACKAGE
);
2214 exit_failure
= TAREXIT_FAILURE
;
2215 exit_status
= TAREXIT_SUCCESS
;
2216 filename_terminator
= '\n';
2217 set_quoting_style (0, DEFAULT_QUOTING_STYLE
);
2219 /* Make sure we have first three descriptors available */
2222 /* Pre-allocate a few structures. */
2224 allocated_archive_names
= 10;
2225 archive_name_array
=
2226 xmalloc (sizeof (const char *) * allocated_archive_names
);
2229 obstack_init (&argv_stk
);
2232 /* System V fork+wait does not work if SIGCHLD is ignored. */
2233 signal (SIGCHLD
, SIG_DFL
);
2236 /* Decode options. */
2238 decode_options (argc
, argv
);
2241 /* Main command execution. */
2243 if (volno_file_option
)
2244 init_volume_number ();
2246 switch (subcommand_option
)
2248 case UNKNOWN_SUBCOMMAND
:
2250 _("You must specify one of the `-Acdtrux' options")));
2252 case CAT_SUBCOMMAND
:
2253 case UPDATE_SUBCOMMAND
:
2254 case APPEND_SUBCOMMAND
:
2258 case DELETE_SUBCOMMAND
:
2259 delete_archive_members ();
2262 case CREATE_SUBCOMMAND
:
2266 case EXTRACT_SUBCOMMAND
:
2268 read_and (extract_archive
);
2270 /* FIXME: should extract_finish () even if an ordinary signal is
2276 case LIST_SUBCOMMAND
:
2277 read_and (list_archive
);
2280 case DIFF_SUBCOMMAND
:
2282 read_and (diff_archive
);
2287 print_total_stats ();
2289 if (check_links_option
)
2292 if (volno_file_option
)
2293 closeout_volume_number ();
2295 /* Dispose of allocated memory, and return. */
2297 free (archive_name_array
);
2300 if (stdlis
== stdout
)
2303 if (exit_status
== TAREXIT_FAILURE
)
2304 error (0, 0, _("Error exit delayed from previous errors"));
2305 if (ferror (stderr
) || fclose (stderr
) != 0)
2306 exit_status
= TAREXIT_FAILURE
;
2311 tar_stat_init (struct tar_stat_info
*st
)
2313 memset (st
, 0, sizeof (*st
));
2317 tar_stat_destroy (struct tar_stat_info
*st
)
2319 free (st
->orig_file_name
);
2320 free (st
->file_name
);
2321 free (st
->link_name
);
2324 free (st
->sparse_map
);
2326 memset (st
, 0, sizeof (*st
));
2329 /* Format mask for all available formats that support nanosecond
2330 timestamp resolution. */
2331 #define NS_PRECISION_FORMAT_MASK FORMAT_MASK (POSIX_FORMAT)
2333 /* Same as timespec_cmp, but ignore nanoseconds if current archive
2334 format does not provide sufficient resolution. */
2336 tar_timespec_cmp (struct timespec a
, struct timespec b
)
2338 if (!(FORMAT_MASK (current_format
) & NS_PRECISION_FORMAT_MASK
))
2339 a
.tv_nsec
= b
.tv_nsec
= 0;
2340 return timespec_cmp (a
, b
);