Run alternative decompression programs if the principal one is not available.
[tar.git] / src / tar.c
blob928cfddd44a86220ab444844cac61c10da6495aa
1 /* A tar (tape archiver) program.
3 Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000,
4 2001, 2003, 2004, 2005, 2006, 2007, 2009 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 3, or (at your option) any later
11 version.
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. */
22 #include <system.h>
24 #include <fnmatch.h>
25 #include <argp.h>
26 #include <argp-namefrob.h>
27 #include <argp-fmtstream.h>
28 #include <argp-version-etc.h>
30 #include <signal.h>
31 #if ! defined SIGCHLD && defined SIGCLD
32 # define SIGCHLD SIGCLD
33 #endif
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. */
39 #define GLOBAL
40 #include "common.h"
42 #include <argmatch.h>
43 #include <closeout.h>
44 #include <configmake.h>
45 #include <exitfail.h>
46 #include <parse-datetime.h>
47 #include <rmt.h>
48 #include <rmt-command.h>
49 #include <prepargs.h>
50 #include <quotearg.h>
51 #include <version-etc.h>
52 #include <xstrtol.h>
53 #include <stdopen.h>
54 #include <priv-set.h>
56 /* Local declarations. */
58 #ifndef DEFAULT_ARCHIVE_FORMAT
59 # define DEFAULT_ARCHIVE_FORMAT GNU_FORMAT
60 #endif
62 #ifndef DEFAULT_ARCHIVE
63 # define DEFAULT_ARCHIVE "tar.out"
64 #endif
66 #ifndef DEFAULT_BLOCKING
67 # define DEFAULT_BLOCKING 20
68 #endif
71 /* Miscellaneous. */
73 /* Name of option using stdin. */
74 static const char *stdin_used_by;
76 /* Doesn't return if stdin already requested. */
77 static void
78 request_stdin (const char *option)
80 if (stdin_used_by)
81 USAGE_ERROR ((0, 0, _("Options `-%s' and `-%s' both want standard input"),
82 stdin_used_by, option));
84 stdin_used_by = option;
87 extern int rpmatch (char const *response);
89 /* Returns true if and only if the user typed an affirmative response. */
90 int
91 confirm (const char *message_action, const char *message_name)
93 static FILE *confirm_file;
94 static int confirm_file_EOF;
95 bool status = false;
97 if (!confirm_file)
99 if (archive == 0 || stdin_used_by)
101 confirm_file = fopen (TTY_NAME, "r");
102 if (! confirm_file)
103 open_fatal (TTY_NAME);
105 else
107 request_stdin ("-w");
108 confirm_file = stdin;
112 fprintf (stdlis, "%s %s?", message_action, quote (message_name));
113 fflush (stdlis);
115 if (!confirm_file_EOF)
117 char *response = NULL;
118 size_t response_size = 0;
119 if (getline (&response, &response_size, confirm_file) < 0)
120 confirm_file_EOF = 1;
121 else
122 status = rpmatch (response) > 0;
123 free (response);
126 if (confirm_file_EOF)
128 fputc ('\n', stdlis);
129 fflush (stdlis);
132 return status;
135 static struct fmttab {
136 char const *name;
137 enum archive_format fmt;
138 } const fmttab[] = {
139 { "v7", V7_FORMAT },
140 { "oldgnu", OLDGNU_FORMAT },
141 { "ustar", USTAR_FORMAT },
142 { "posix", POSIX_FORMAT },
143 #if 0 /* not fully supported yet */
144 { "star", STAR_FORMAT },
145 #endif
146 { "gnu", GNU_FORMAT },
147 { "pax", POSIX_FORMAT }, /* An alias for posix */
148 { NULL, 0 }
151 static void
152 set_archive_format (char const *name)
154 struct fmttab const *p;
156 for (p = fmttab; strcmp (p->name, name) != 0; )
157 if (! (++p)->name)
158 USAGE_ERROR ((0, 0, _("%s: Invalid archive format"),
159 quotearg_colon (name)));
161 archive_format = p->fmt;
164 const char *
165 archive_format_string (enum archive_format fmt)
167 struct fmttab const *p;
169 for (p = fmttab; p->name; p++)
170 if (p->fmt == fmt)
171 return p->name;
172 return "unknown?";
175 #define FORMAT_MASK(n) (1<<(n))
177 static void
178 assert_format(unsigned fmt_mask)
180 if ((FORMAT_MASK (archive_format) & fmt_mask) == 0)
181 USAGE_ERROR ((0, 0,
182 _("GNU features wanted on incompatible archive format")));
185 const char *
186 subcommand_string (enum subcommand c)
188 switch (c)
190 case UNKNOWN_SUBCOMMAND:
191 return "unknown?";
193 case APPEND_SUBCOMMAND:
194 return "-r";
196 case CAT_SUBCOMMAND:
197 return "-A";
199 case CREATE_SUBCOMMAND:
200 return "-c";
202 case DELETE_SUBCOMMAND:
203 return "-D";
205 case DIFF_SUBCOMMAND:
206 return "-d";
208 case EXTRACT_SUBCOMMAND:
209 return "-x";
211 case LIST_SUBCOMMAND:
212 return "-t";
214 case UPDATE_SUBCOMMAND:
215 return "-u";
217 case TEST_LABEL_SUBCOMMAND:
218 return "--test-label";
220 abort ();
223 static void
224 tar_list_quoting_styles (struct obstack *stk, char const *prefix)
226 int i;
227 size_t prefixlen = strlen (prefix);
229 for (i = 0; quoting_style_args[i]; i++)
231 obstack_grow (stk, prefix, prefixlen);
232 obstack_grow (stk, quoting_style_args[i],
233 strlen (quoting_style_args[i]));
234 obstack_1grow (stk, '\n');
238 static void
239 tar_set_quoting_style (char *arg)
241 int i;
243 for (i = 0; quoting_style_args[i]; i++)
244 if (strcmp (arg, quoting_style_args[i]) == 0)
246 set_quoting_style (NULL, i);
247 return;
249 FATAL_ERROR ((0, 0,
250 _("Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."), arg, program_invocation_short_name));
254 /* Options. */
256 enum
258 ANCHORED_OPTION = CHAR_MAX + 1,
259 ATIME_PRESERVE_OPTION,
260 BACKUP_OPTION,
261 CHECK_DEVICE_OPTION,
262 CHECKPOINT_OPTION,
263 CHECKPOINT_ACTION_OPTION,
264 DELAY_DIRECTORY_RESTORE_OPTION,
265 HARD_DEREFERENCE_OPTION,
266 DELETE_OPTION,
267 EXCLUDE_BACKUPS_OPTION,
268 EXCLUDE_CACHES_OPTION,
269 EXCLUDE_CACHES_UNDER_OPTION,
270 EXCLUDE_CACHES_ALL_OPTION,
271 EXCLUDE_OPTION,
272 EXCLUDE_TAG_OPTION,
273 EXCLUDE_TAG_UNDER_OPTION,
274 EXCLUDE_TAG_ALL_OPTION,
275 EXCLUDE_VCS_OPTION,
276 FORCE_LOCAL_OPTION,
277 FULL_TIME_OPTION,
278 GROUP_OPTION,
279 IGNORE_CASE_OPTION,
280 IGNORE_COMMAND_ERROR_OPTION,
281 IGNORE_FAILED_READ_OPTION,
282 INDEX_FILE_OPTION,
283 KEEP_NEWER_FILES_OPTION,
284 LEVEL_OPTION,
285 LZIP_OPTION,
286 LZMA_OPTION,
287 LZOP_OPTION,
288 MODE_OPTION,
289 MTIME_OPTION,
290 NEWER_MTIME_OPTION,
291 NO_ANCHORED_OPTION,
292 NO_AUTO_COMPRESS_OPTION,
293 NO_CHECK_DEVICE_OPTION,
294 NO_DELAY_DIRECTORY_RESTORE_OPTION,
295 NO_IGNORE_CASE_OPTION,
296 NO_IGNORE_COMMAND_ERROR_OPTION,
297 NO_NULL_OPTION,
298 NO_OVERWRITE_DIR_OPTION,
299 NO_QUOTE_CHARS_OPTION,
300 NO_RECURSION_OPTION,
301 NO_SAME_OWNER_OPTION,
302 NO_SAME_PERMISSIONS_OPTION,
303 NO_SEEK_OPTION,
304 NO_UNQUOTE_OPTION,
305 NO_WILDCARDS_MATCH_SLASH_OPTION,
306 NO_WILDCARDS_OPTION,
307 NULL_OPTION,
308 NUMERIC_OWNER_OPTION,
309 OCCURRENCE_OPTION,
310 OLD_ARCHIVE_OPTION,
311 ONE_FILE_SYSTEM_OPTION,
312 OVERWRITE_DIR_OPTION,
313 OVERWRITE_OPTION,
314 OWNER_OPTION,
315 PAX_OPTION,
316 POSIX_OPTION,
317 PRESERVE_OPTION,
318 QUOTE_CHARS_OPTION,
319 QUOTING_STYLE_OPTION,
320 RECORD_SIZE_OPTION,
321 RECURSION_OPTION,
322 RECURSIVE_UNLINK_OPTION,
323 REMOVE_FILES_OPTION,
324 RESTRICT_OPTION,
325 RMT_COMMAND_OPTION,
326 RSH_COMMAND_OPTION,
327 SAME_OWNER_OPTION,
328 SHOW_DEFAULTS_OPTION,
329 SHOW_OMITTED_DIRS_OPTION,
330 SHOW_TRANSFORMED_NAMES_OPTION,
331 SPARSE_VERSION_OPTION,
332 STRIP_COMPONENTS_OPTION,
333 SUFFIX_OPTION,
334 TEST_LABEL_OPTION,
335 TOTALS_OPTION,
336 TO_COMMAND_OPTION,
337 TRANSFORM_OPTION,
338 UNQUOTE_OPTION,
339 UTC_OPTION,
340 VOLNO_FILE_OPTION,
341 WARNING_OPTION,
342 WILDCARDS_MATCH_SLASH_OPTION,
343 WILDCARDS_OPTION
346 const char *argp_program_version = "tar (" PACKAGE_NAME ") " VERSION;
347 const char *argp_program_bug_address = "<" PACKAGE_BUGREPORT ">";
348 static char const doc[] = N_("\
349 GNU `tar' saves many files together into a single tape or disk archive, \
350 and can restore individual files from the archive.\n\
352 Examples:\n\
353 tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n\
354 tar -tvf archive.tar # List all files in archive.tar verbosely.\n\
355 tar -xf archive.tar # Extract all files from archive.tar.\n")
356 "\v"
357 N_("The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
358 The version control may be set with --backup or VERSION_CONTROL, values are:\n\n\
359 none, off never make backups\n\
360 t, numbered make numbered backups\n\
361 nil, existing numbered if numbered backups exist, simple otherwise\n\
362 never, simple always make simple backups\n");
365 /* NOTE:
367 Available option letters are DEQY and eqy. Consider the following
368 assignments:
370 [For Solaris tar compatibility =/= Is it important at all?]
371 e exit immediately with a nonzero exit status if unexpected errors occur
372 E use extended headers (--format=posix)
374 [q alias for --occurrence=1 =/= this would better be used for quiet?]
376 y per-file gzip compression
377 Y per-block gzip compression.
379 Additionally, the 'n' letter is assigned for option --seek, which
380 is probably not needed and should be marked as deprecated, so that
381 -n may become available in the future.
384 static struct argp_option options[] = {
385 #define GRID 10
386 {NULL, 0, NULL, 0,
387 N_("Main operation mode:"), GRID },
389 {"list", 't', 0, 0,
390 N_("list the contents of an archive"), GRID+1 },
391 {"extract", 'x', 0, 0,
392 N_("extract files from an archive"), GRID+1 },
393 {"get", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
394 {"create", 'c', 0, 0,
395 N_("create a new archive"), GRID+1 },
396 {"diff", 'd', 0, 0,
397 N_("find differences between archive and file system"), GRID+1 },
398 {"compare", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
399 {"append", 'r', 0, 0,
400 N_("append files to the end of an archive"), GRID+1 },
401 {"update", 'u', 0, 0,
402 N_("only append files newer than copy in archive"), GRID+1 },
403 {"catenate", 'A', 0, 0,
404 N_("append tar files to an archive"), GRID+1 },
405 {"concatenate", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
406 {"delete", DELETE_OPTION, 0, 0,
407 N_("delete from the archive (not on mag tapes!)"), GRID+1 },
408 {"test-label", TEST_LABEL_OPTION, NULL, 0,
409 N_("test the archive volume label and exit"), GRID+1 },
410 #undef GRID
412 #define GRID 20
413 {NULL, 0, NULL, 0,
414 N_("Operation modifiers:"), GRID },
416 {"sparse", 'S', 0, 0,
417 N_("handle sparse files efficiently"), GRID+1 },
418 {"sparse-version", SPARSE_VERSION_OPTION, N_("MAJOR[.MINOR]"), 0,
419 N_("set version of the sparse format to use (implies --sparse)"), GRID+1},
420 {"incremental", 'G', 0, 0,
421 N_("handle old GNU-format incremental backup"), GRID+1 },
422 {"listed-incremental", 'g', N_("FILE"), 0,
423 N_("handle new GNU-format incremental backup"), GRID+1 },
424 {"level", LEVEL_OPTION, N_("NUMBER"), 0,
425 N_("dump level for created listed-incremental archive"), GRID+1 },
426 {"ignore-failed-read", IGNORE_FAILED_READ_OPTION, 0, 0,
427 N_("do not exit with nonzero on unreadable files"), GRID+1 },
428 {"occurrence", OCCURRENCE_OPTION, N_("NUMBER"), OPTION_ARG_OPTIONAL,
429 N_("process only the NUMBERth occurrence of each file in the archive;"
430 " this option is valid only in conjunction with one of the subcommands"
431 " --delete, --diff, --extract or --list and when a list of files"
432 " is given either on the command line or via the -T option;"
433 " NUMBER defaults to 1"), GRID+1 },
434 {"seek", 'n', NULL, 0,
435 N_("archive is seekable"), GRID+1 },
436 {"no-seek", NO_SEEK_OPTION, NULL, 0,
437 N_("archive is not seekable"), GRID+1 },
438 {"no-check-device", NO_CHECK_DEVICE_OPTION, NULL, 0,
439 N_("do not check device numbers when creating incremental archives"),
440 GRID+1 },
441 {"check-device", CHECK_DEVICE_OPTION, NULL, 0,
442 N_("check device numbers when creating incremental archives (default)"),
443 GRID+1 },
444 #undef GRID
446 #define GRID 30
447 {NULL, 0, NULL, 0,
448 N_("Overwrite control:"), GRID },
450 {"verify", 'W', 0, 0,
451 N_("attempt to verify the archive after writing it"), GRID+1 },
452 {"remove-files", REMOVE_FILES_OPTION, 0, 0,
453 N_("remove files after adding them to the archive"), GRID+1 },
454 {"keep-old-files", 'k', 0, 0,
455 N_("don't replace existing files when extracting"), GRID+1 },
456 {"keep-newer-files", KEEP_NEWER_FILES_OPTION, 0, 0,
457 N_("don't replace existing files that are newer than their archive copies"), GRID+1 },
458 {"overwrite", OVERWRITE_OPTION, 0, 0,
459 N_("overwrite existing files when extracting"), GRID+1 },
460 {"unlink-first", 'U', 0, 0,
461 N_("remove each file prior to extracting over it"), GRID+1 },
462 {"recursive-unlink", RECURSIVE_UNLINK_OPTION, 0, 0,
463 N_("empty hierarchies prior to extracting directory"), GRID+1 },
464 {"no-overwrite-dir", NO_OVERWRITE_DIR_OPTION, 0, 0,
465 N_("preserve metadata of existing directories"), GRID+1 },
466 {"overwrite-dir", OVERWRITE_DIR_OPTION, 0, 0,
467 N_("overwrite metadata of existing directories when extracting (default)"),
468 GRID+1 },
469 #undef GRID
471 #define GRID 40
472 {NULL, 0, NULL, 0,
473 N_("Select output stream:"), GRID },
475 {"to-stdout", 'O', 0, 0,
476 N_("extract files to standard output"), GRID+1 },
477 {"to-command", TO_COMMAND_OPTION, N_("COMMAND"), 0,
478 N_("pipe extracted files to another program"), GRID+1 },
479 {"ignore-command-error", IGNORE_COMMAND_ERROR_OPTION, 0, 0,
480 N_("ignore exit codes of children"), GRID+1 },
481 {"no-ignore-command-error", NO_IGNORE_COMMAND_ERROR_OPTION, 0, 0,
482 N_("treat non-zero exit codes of children as error"), GRID+1 },
483 #undef GRID
485 #define GRID 50
486 {NULL, 0, NULL, 0,
487 N_("Handling of file attributes:"), GRID },
489 {"owner", OWNER_OPTION, N_("NAME"), 0,
490 N_("force NAME as owner for added files"), GRID+1 },
491 {"group", GROUP_OPTION, N_("NAME"), 0,
492 N_("force NAME as group for added files"), GRID+1 },
493 {"mtime", MTIME_OPTION, N_("DATE-OR-FILE"), 0,
494 N_("set mtime for added files from DATE-OR-FILE"), GRID+1 },
495 {"mode", MODE_OPTION, N_("CHANGES"), 0,
496 N_("force (symbolic) mode CHANGES for added files"), GRID+1 },
497 {"atime-preserve", ATIME_PRESERVE_OPTION,
498 N_("METHOD"), OPTION_ARG_OPTIONAL,
499 N_("preserve access times on dumped files, either by restoring the times"
500 " after reading (METHOD='replace'; default) or by not setting the times"
501 " in the first place (METHOD='system')"), GRID+1 },
502 {"touch", 'm', 0, 0,
503 N_("don't extract file modified time"), GRID+1 },
504 {"same-owner", SAME_OWNER_OPTION, 0, 0,
505 N_("try extracting files with the same ownership as exists in the archive (default for superuser)"), GRID+1 },
506 {"no-same-owner", NO_SAME_OWNER_OPTION, 0, 0,
507 N_("extract files as yourself (default for ordinary users)"), GRID+1 },
508 {"numeric-owner", NUMERIC_OWNER_OPTION, 0, 0,
509 N_("always use numbers for user/group names"), GRID+1 },
510 {"preserve-permissions", 'p', 0, 0,
511 N_("extract information about file permissions (default for superuser)"),
512 GRID+1 },
513 {"same-permissions", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
514 {"no-same-permissions", NO_SAME_PERMISSIONS_OPTION, 0, 0,
515 N_("apply the user's umask when extracting permissions from the archive (default for ordinary users)"), GRID+1 },
516 {"preserve-order", 's', 0, 0,
517 N_("sort names to extract to match archive"), GRID+1 },
518 {"same-order", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
519 {"preserve", PRESERVE_OPTION, 0, 0,
520 N_("same as both -p and -s"), GRID+1 },
521 {"delay-directory-restore", DELAY_DIRECTORY_RESTORE_OPTION, 0, 0,
522 N_("delay setting modification times and permissions of extracted"
523 " directories until the end of extraction"), GRID+1 },
524 {"no-delay-directory-restore", NO_DELAY_DIRECTORY_RESTORE_OPTION, 0, 0,
525 N_("cancel the effect of --delay-directory-restore option"), GRID+1 },
526 #undef GRID
528 #define GRID 60
529 {NULL, 0, NULL, 0,
530 N_("Device selection and switching:"), GRID },
532 {"file", 'f', N_("ARCHIVE"), 0,
533 N_("use archive file or device ARCHIVE"), GRID+1 },
534 {"force-local", FORCE_LOCAL_OPTION, 0, 0,
535 N_("archive file is local even if it has a colon"), GRID+1 },
536 {"rmt-command", RMT_COMMAND_OPTION, N_("COMMAND"), 0,
537 N_("use given rmt COMMAND instead of rmt"), GRID+1 },
538 {"rsh-command", RSH_COMMAND_OPTION, N_("COMMAND"), 0,
539 N_("use remote COMMAND instead of rsh"), GRID+1 },
540 #ifdef DEVICE_PREFIX
541 {"-[0-7][lmh]", 0, NULL, OPTION_DOC, /* It is OK, since `name' will never be
542 translated */
543 N_("specify drive and density"), GRID+1 },
544 #endif
545 {NULL, '0', NULL, OPTION_HIDDEN, NULL, GRID+1 },
546 {NULL, '1', NULL, OPTION_HIDDEN, NULL, GRID+1 },
547 {NULL, '2', NULL, OPTION_HIDDEN, NULL, GRID+1 },
548 {NULL, '3', NULL, OPTION_HIDDEN, NULL, GRID+1 },
549 {NULL, '4', NULL, OPTION_HIDDEN, NULL, GRID+1 },
550 {NULL, '5', NULL, OPTION_HIDDEN, NULL, GRID+1 },
551 {NULL, '6', NULL, OPTION_HIDDEN, NULL, GRID+1 },
552 {NULL, '7', NULL, OPTION_HIDDEN, NULL, GRID+1 },
553 {NULL, '8', NULL, OPTION_HIDDEN, NULL, GRID+1 },
554 {NULL, '9', NULL, OPTION_HIDDEN, NULL, GRID+1 },
556 {"multi-volume", 'M', 0, 0,
557 N_("create/list/extract multi-volume archive"), GRID+1 },
558 {"tape-length", 'L', N_("NUMBER"), 0,
559 N_("change tape after writing NUMBER x 1024 bytes"), GRID+1 },
560 {"info-script", 'F', N_("NAME"), 0,
561 N_("run script at end of each tape (implies -M)"), GRID+1 },
562 {"new-volume-script", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
563 {"volno-file", VOLNO_FILE_OPTION, N_("FILE"), 0,
564 N_("use/update the volume number in FILE"), GRID+1 },
565 #undef GRID
567 #define GRID 70
568 {NULL, 0, NULL, 0,
569 N_("Device blocking:"), GRID },
571 {"blocking-factor", 'b', N_("BLOCKS"), 0,
572 N_("BLOCKS x 512 bytes per record"), GRID+1 },
573 {"record-size", RECORD_SIZE_OPTION, N_("NUMBER"), 0,
574 N_("NUMBER of bytes per record, multiple of 512"), GRID+1 },
575 {"ignore-zeros", 'i', 0, 0,
576 N_("ignore zeroed blocks in archive (means EOF)"), GRID+1 },
577 {"read-full-records", 'B', 0, 0,
578 N_("reblock as we read (for 4.2BSD pipes)"), GRID+1 },
579 #undef GRID
581 #define GRID 80
582 {NULL, 0, NULL, 0,
583 N_("Archive format selection:"), GRID },
585 {"format", 'H', N_("FORMAT"), 0,
586 N_("create archive of the given format"), GRID+1 },
588 {NULL, 0, NULL, 0, N_("FORMAT is one of the following:"), GRID+2 },
589 {" v7", 0, NULL, OPTION_DOC|OPTION_NO_TRANS, N_("old V7 tar format"),
590 GRID+3 },
591 {" oldgnu", 0, NULL, OPTION_DOC|OPTION_NO_TRANS,
592 N_("GNU format as per tar <= 1.12"), GRID+3 },
593 {" gnu", 0, NULL, OPTION_DOC|OPTION_NO_TRANS,
594 N_("GNU tar 1.13.x format"), GRID+3 },
595 {" ustar", 0, NULL, OPTION_DOC|OPTION_NO_TRANS,
596 N_("POSIX 1003.1-1988 (ustar) format"), GRID+3 },
597 {" pax", 0, NULL, OPTION_DOC|OPTION_NO_TRANS,
598 N_("POSIX 1003.1-2001 (pax) format"), GRID+3 },
599 {" posix", 0, NULL, OPTION_DOC|OPTION_NO_TRANS, N_("same as pax"), GRID+3 },
601 {"old-archive", OLD_ARCHIVE_OPTION, 0, 0, /* FIXME */
602 N_("same as --format=v7"), GRID+8 },
603 {"portability", 0, 0, OPTION_ALIAS, NULL, GRID+8 },
604 {"posix", POSIX_OPTION, 0, 0,
605 N_("same as --format=posix"), GRID+8 },
606 {"pax-option", PAX_OPTION, N_("keyword[[:]=value][,keyword[[:]=value]]..."), 0,
607 N_("control pax keywords"), GRID+8 },
608 {"label", 'V', N_("TEXT"), 0,
609 N_("create archive with volume name TEXT; at list/extract time, use TEXT as a globbing pattern for volume name"), GRID+8 },
610 #undef GRID
612 #define GRID 90
613 {NULL, 0, NULL, 0,
614 N_("Compression options:"), GRID },
615 {"auto-compress", 'a', 0, 0,
616 N_("use archive suffix to determine the compression program"), GRID+1 },
617 {"no-auto-compress", NO_AUTO_COMPRESS_OPTION, 0, 0,
618 N_("do not use archive suffix to determine the compression program"),
619 GRID+1 },
620 {"use-compress-program", 'I', N_("PROG"), 0,
621 N_("filter through PROG (must accept -d)"), GRID+1 },
622 /* Note: docstrings for the options below are generated by tar_help_filter */
623 {"bzip2", 'j', 0, 0, NULL, GRID+1 },
624 {"gzip", 'z', 0, 0, NULL, GRID+1 },
625 {"gunzip", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
626 {"ungzip", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
627 {"compress", 'Z', 0, 0, NULL, GRID+1 },
628 {"uncompress", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
629 {"lzip", LZIP_OPTION, 0, 0, NULL, GRID+1 },
630 {"lzma", LZMA_OPTION, 0, 0, NULL, GRID+1 },
631 {"lzop", LZOP_OPTION, 0, 0, NULL, GRID+1 },
632 {"xz", 'J', 0, 0, NULL, GRID+1 },
633 #undef GRID
635 #define GRID 100
636 {NULL, 0, NULL, 0,
637 N_("Local file selection:"), GRID },
639 {"add-file", ARGP_KEY_ARG, N_("FILE"), 0,
640 N_("add given FILE to the archive (useful if its name starts with a dash)"), GRID+1 },
641 {"directory", 'C', N_("DIR"), 0,
642 N_("change to directory DIR"), GRID+1 },
643 {"files-from", 'T', N_("FILE"), 0,
644 N_("get names to extract or create from FILE"), GRID+1 },
645 {"null", NULL_OPTION, 0, 0,
646 N_("-T reads null-terminated names, disable -C"), GRID+1 },
647 {"no-null", NO_NULL_OPTION, 0, 0,
648 N_("disable the effect of the previous --null option"), GRID+1 },
649 {"unquote", UNQUOTE_OPTION, 0, 0,
650 N_("unquote filenames read with -T (default)"), GRID+1 },
651 {"no-unquote", NO_UNQUOTE_OPTION, 0, 0,
652 N_("do not unquote filenames read with -T"), GRID+1 },
653 {"exclude", EXCLUDE_OPTION, N_("PATTERN"), 0,
654 N_("exclude files, given as a PATTERN"), GRID+1 },
655 {"exclude-from", 'X', N_("FILE"), 0,
656 N_("exclude patterns listed in FILE"), GRID+1 },
657 {"exclude-caches", EXCLUDE_CACHES_OPTION, 0, 0,
658 N_("exclude contents of directories containing CACHEDIR.TAG, "
659 "except for the tag file itself"), GRID+1 },
660 {"exclude-caches-under", EXCLUDE_CACHES_UNDER_OPTION, 0, 0,
661 N_("exclude everything under directories containing CACHEDIR.TAG"),
662 GRID+1 },
663 {"exclude-caches-all", EXCLUDE_CACHES_ALL_OPTION, 0, 0,
664 N_("exclude directories containing CACHEDIR.TAG"), GRID+1 },
665 {"exclude-tag", EXCLUDE_TAG_OPTION, N_("FILE"), 0,
666 N_("exclude contents of directories containing FILE, except"
667 " for FILE itself"), GRID+1 },
668 {"exclude-tag-under", EXCLUDE_TAG_UNDER_OPTION, N_("FILE"), 0,
669 N_("exclude everything under directories containing FILE"), GRID+1 },
670 {"exclude-tag-all", EXCLUDE_TAG_ALL_OPTION, N_("FILE"), 0,
671 N_("exclude directories containing FILE"), GRID+1 },
672 {"exclude-vcs", EXCLUDE_VCS_OPTION, NULL, 0,
673 N_("exclude version control system directories"), GRID+1 },
674 {"exclude-backups", EXCLUDE_BACKUPS_OPTION, NULL, 0,
675 N_("exclude backup and lock files"), GRID+1 },
676 {"no-recursion", NO_RECURSION_OPTION, 0, 0,
677 N_("avoid descending automatically in directories"), GRID+1 },
678 {"one-file-system", ONE_FILE_SYSTEM_OPTION, 0, 0,
679 N_("stay in local file system when creating archive"), GRID+1 },
680 {"recursion", RECURSION_OPTION, 0, 0,
681 N_("recurse into directories (default)"), GRID+1 },
682 {"absolute-names", 'P', 0, 0,
683 N_("don't strip leading `/'s from file names"), GRID+1 },
684 {"dereference", 'h', 0, 0,
685 N_("follow symlinks; archive and dump the files they point to"), GRID+1 },
686 {"hard-dereference", HARD_DEREFERENCE_OPTION, 0, 0,
687 N_("follow hard links; archive and dump the files they refer to"), GRID+1 },
688 {"starting-file", 'K', N_("MEMBER-NAME"), 0,
689 N_("begin at member MEMBER-NAME in the archive"), GRID+1 },
690 {"newer", 'N', N_("DATE-OR-FILE"), 0,
691 N_("only store files newer than DATE-OR-FILE"), GRID+1 },
692 {"after-date", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
693 {"newer-mtime", NEWER_MTIME_OPTION, N_("DATE"), 0,
694 N_("compare date and time when data changed only"), GRID+1 },
695 {"backup", BACKUP_OPTION, N_("CONTROL"), OPTION_ARG_OPTIONAL,
696 N_("backup before removal, choose version CONTROL"), GRID+1 },
697 {"suffix", SUFFIX_OPTION, N_("STRING"), 0,
698 N_("backup before removal, override usual suffix ('~' unless overridden by environment variable SIMPLE_BACKUP_SUFFIX)"), GRID+1 },
699 #undef GRID
701 #define GRID 110
702 {NULL, 0, NULL, 0,
703 N_("File name transformations:"), GRID },
704 {"strip-components", STRIP_COMPONENTS_OPTION, N_("NUMBER"), 0,
705 N_("strip NUMBER leading components from file names on extraction"),
706 GRID+1 },
707 {"transform", TRANSFORM_OPTION, N_("EXPRESSION"), 0,
708 N_("use sed replace EXPRESSION to transform file names"), GRID+1 },
709 {"xform", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
710 #undef GRID
712 #define GRID 120
713 {NULL, 0, NULL, 0,
714 N_("File name matching options (affect both exclude and include patterns):"),
715 GRID },
716 {"ignore-case", IGNORE_CASE_OPTION, 0, 0,
717 N_("ignore case"), GRID+1 },
718 {"anchored", ANCHORED_OPTION, 0, 0,
719 N_("patterns match file name start"), GRID+1 },
720 {"no-anchored", NO_ANCHORED_OPTION, 0, 0,
721 N_("patterns match after any `/' (default for exclusion)"), GRID+1 },
722 {"no-ignore-case", NO_IGNORE_CASE_OPTION, 0, 0,
723 N_("case sensitive matching (default)"), GRID+1 },
724 {"wildcards", WILDCARDS_OPTION, 0, 0,
725 N_("use wildcards (default for exclusion)"), GRID+1 },
726 {"no-wildcards", NO_WILDCARDS_OPTION, 0, 0,
727 N_("verbatim string matching"), GRID+1 },
728 {"no-wildcards-match-slash", NO_WILDCARDS_MATCH_SLASH_OPTION, 0, 0,
729 N_("wildcards do not match `/'"), GRID+1 },
730 {"wildcards-match-slash", WILDCARDS_MATCH_SLASH_OPTION, 0, 0,
731 N_("wildcards match `/' (default for exclusion)"), GRID+1 },
732 #undef GRID
734 #define GRID 130
735 {NULL, 0, NULL, 0,
736 N_("Informative output:"), GRID },
738 {"verbose", 'v', 0, 0,
739 N_("verbosely list files processed"), GRID+1 },
740 {"warning", WARNING_OPTION, N_("KEYWORD"), 0,
741 N_("warning control"), GRID+1 },
742 {"checkpoint", CHECKPOINT_OPTION, N_("NUMBER"), OPTION_ARG_OPTIONAL,
743 N_("display progress messages every NUMBERth record (default 10)"),
744 GRID+1 },
745 {"checkpoint-action", CHECKPOINT_ACTION_OPTION, N_("ACTION"), 0,
746 N_("execute ACTION on each checkpoint"),
747 GRID+1 },
748 {"check-links", 'l', 0, 0,
749 N_("print a message if not all links are dumped"), GRID+1 },
750 {"totals", TOTALS_OPTION, N_("SIGNAL"), OPTION_ARG_OPTIONAL,
751 N_("print total bytes after processing the archive; "
752 "with an argument - print total bytes when this SIGNAL is delivered; "
753 "Allowed signals are: SIGHUP, SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; "
754 "the names without SIG prefix are also accepted"), GRID+1 },
755 {"utc", UTC_OPTION, 0, 0,
756 N_("print file modification times in UTC"), GRID+1 },
757 {"full-time", FULL_TIME_OPTION, 0, 0,
758 N_("print file time to its full resolution"), GRID+1 },
759 {"index-file", INDEX_FILE_OPTION, N_("FILE"), 0,
760 N_("send verbose output to FILE"), GRID+1 },
761 {"block-number", 'R', 0, 0,
762 N_("show block number within archive with each message"), GRID+1 },
763 {"interactive", 'w', 0, 0,
764 N_("ask for confirmation for every action"), GRID+1 },
765 {"confirmation", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
766 {"show-defaults", SHOW_DEFAULTS_OPTION, 0, 0,
767 N_("show tar defaults"), GRID+1 },
768 {"show-omitted-dirs", SHOW_OMITTED_DIRS_OPTION, 0, 0,
769 N_("when listing or extracting, list each directory that does not match search criteria"), GRID+1 },
770 {"show-transformed-names", SHOW_TRANSFORMED_NAMES_OPTION, 0, 0,
771 N_("show file or archive names after transformation"),
772 GRID+1 },
773 {"show-stored-names", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
774 {"quoting-style", QUOTING_STYLE_OPTION, N_("STYLE"), 0,
775 N_("set name quoting style; see below for valid STYLE values"), GRID+1 },
776 {"quote-chars", QUOTE_CHARS_OPTION, N_("STRING"), 0,
777 N_("additionally quote characters from STRING"), GRID+1 },
778 {"no-quote-chars", NO_QUOTE_CHARS_OPTION, N_("STRING"), 0,
779 N_("disable quoting for characters from STRING"), GRID+1 },
780 #undef GRID
782 #define GRID 140
783 {NULL, 0, NULL, 0,
784 N_("Compatibility options:"), GRID },
786 {NULL, 'o', 0, 0,
787 N_("when creating, same as --old-archive; when extracting, same as --no-same-owner"), GRID+1 },
788 #undef GRID
790 #define GRID 150
791 {NULL, 0, NULL, 0,
792 N_("Other options:"), GRID },
794 {"restrict", RESTRICT_OPTION, 0, 0,
795 N_("disable use of some potentially harmful options"), -1 },
796 #undef GRID
798 {0, 0, 0, 0, 0, 0}
801 static char const *const atime_preserve_args[] =
803 "replace", "system", NULL
806 static enum atime_preserve const atime_preserve_types[] =
808 replace_atime_preserve, system_atime_preserve
811 /* Make sure atime_preserve_types has as much entries as atime_preserve_args
812 (minus 1 for NULL guard) */
813 ARGMATCH_VERIFY (atime_preserve_args, atime_preserve_types);
815 /* Wildcard matching settings */
816 enum wildcards
818 default_wildcards, /* For exclusion == enable_wildcards,
819 for inclusion == disable_wildcards */
820 disable_wildcards,
821 enable_wildcards
824 struct tar_args /* Variables used during option parsing */
826 struct textual_date *textual_date; /* Keeps the arguments to --newer-mtime
827 and/or --date option if they are
828 textual dates */
829 enum wildcards wildcards; /* Wildcard settings (--wildcards/
830 --no-wildcards) */
831 int matching_flags; /* exclude_fnmatch options */
832 int include_anchored; /* Pattern anchoring options used for
833 file inclusion */
834 bool o_option; /* True if -o option was given */
835 bool pax_option; /* True if --pax-option was given */
836 char const *backup_suffix_string; /* --suffix option argument */
837 char const *version_control_string; /* --backup option argument */
838 bool input_files; /* True if some input files where given */
839 int compress_autodetect; /* True if compression autodetection should
840 be attempted when creating archives */
844 #define MAKE_EXCL_OPTIONS(args) \
845 ((((args)->wildcards != disable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
846 | (args)->matching_flags \
847 | recursion_option)
849 #define MAKE_INCL_OPTIONS(args) \
850 ((((args)->wildcards == enable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
851 | (args)->include_anchored \
852 | (args)->matching_flags \
853 | recursion_option)
855 static char const * const vcs_file_table[] = {
856 /* CVS: */
857 "CVS",
858 ".cvsignore",
859 /* RCS: */
860 "RCS",
861 /* SCCS: */
862 "SCCS",
863 /* SVN: */
864 ".svn",
865 /* git: */
866 ".git",
867 ".gitignore",
868 /* Arch: */
869 ".arch-ids",
870 "{arch}",
871 "=RELEASE-ID",
872 "=meta-update",
873 "=update",
874 /* Bazaar */
875 ".bzr",
876 ".bzrignore",
877 ".bzrtags",
878 /* Mercurial */
879 ".hg",
880 ".hgignore",
881 ".hgtags",
882 /* darcs */
883 "_darcs",
884 NULL
887 static char const * const backup_file_table[] = {
888 ".#*",
889 "*~",
890 "#*#",
891 NULL
894 static void
895 add_exclude_array (char const * const * fv)
897 int i;
899 for (i = 0; fv[i]; i++)
900 add_exclude (excluded, fv[i], 0);
904 static char *
905 format_default_settings (void)
907 return xasprintf (
908 "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s"
909 #ifdef REMOTE_SHELL
910 " --rsh-command=%s"
911 #endif
913 archive_format_string (DEFAULT_ARCHIVE_FORMAT),
914 DEFAULT_ARCHIVE, DEFAULT_BLOCKING,
915 quoting_style_args[DEFAULT_QUOTING_STYLE],
916 DEFAULT_RMT_COMMAND
917 #ifdef REMOTE_SHELL
918 , REMOTE_SHELL
919 #endif
924 static void
925 set_subcommand_option (enum subcommand subcommand)
927 if (subcommand_option != UNKNOWN_SUBCOMMAND
928 && subcommand_option != subcommand)
929 USAGE_ERROR ((0, 0,
930 _("You may not specify more than one `-Acdtrux' or `--test-label' option")));
932 subcommand_option = subcommand;
935 static void
936 set_use_compress_program_option (const char *string)
938 if (use_compress_program_option
939 && strcmp (use_compress_program_option, string) != 0)
940 USAGE_ERROR ((0, 0, _("Conflicting compression options")));
942 use_compress_program_option = string;
945 static RETSIGTYPE
946 sigstat (int signo)
948 compute_duration ();
949 print_total_stats ();
950 #ifndef HAVE_SIGACTION
951 signal (signo, sigstat);
952 #endif
955 static void
956 stat_on_signal (int signo)
958 #ifdef HAVE_SIGACTION
959 struct sigaction act;
960 act.sa_handler = sigstat;
961 sigemptyset (&act.sa_mask);
962 act.sa_flags = 0;
963 sigaction (signo, &act, NULL);
964 #else
965 signal (signo, sigstat);
966 #endif
969 static void
970 set_stat_signal (const char *name)
972 static struct sigtab
974 char const *name;
975 int signo;
976 } const sigtab[] = {
977 { "SIGUSR1", SIGUSR1 },
978 { "USR1", SIGUSR1 },
979 { "SIGUSR2", SIGUSR2 },
980 { "USR2", SIGUSR2 },
981 { "SIGHUP", SIGHUP },
982 { "HUP", SIGHUP },
983 { "SIGINT", SIGINT },
984 { "INT", SIGINT },
985 { "SIGQUIT", SIGQUIT },
986 { "QUIT", SIGQUIT }
988 struct sigtab const *p;
990 for (p = sigtab; p < sigtab + sizeof (sigtab) / sizeof (sigtab[0]); p++)
991 if (strcmp (p->name, name) == 0)
993 stat_on_signal (p->signo);
994 return;
996 FATAL_ERROR ((0, 0, _("Unknown signal name: %s"), name));
1000 struct textual_date
1002 struct textual_date *next;
1003 struct timespec ts;
1004 const char *option;
1005 char *date;
1008 static int
1009 get_date_or_file (struct tar_args *args, const char *option,
1010 const char *str, struct timespec *ts)
1012 if (FILE_SYSTEM_PREFIX_LEN (str) != 0
1013 || ISSLASH (*str)
1014 || *str == '.')
1016 struct stat st;
1017 if (stat (str, &st) != 0)
1019 stat_error (str);
1020 USAGE_ERROR ((0, 0, _("Date sample file not found")));
1022 *ts = get_stat_mtime (&st);
1024 else
1026 if (! parse_datetime (ts, str, NULL))
1028 WARN ((0, 0, _("Substituting %s for unknown date format %s"),
1029 tartime (*ts, false), quote (str)));
1030 ts->tv_nsec = 0;
1031 return 1;
1033 else
1035 struct textual_date *p = xmalloc (sizeof (*p));
1036 p->ts = *ts;
1037 p->option = option;
1038 p->date = xstrdup (str);
1039 p->next = args->textual_date;
1040 args->textual_date = p;
1043 return 0;
1046 static void
1047 report_textual_dates (struct tar_args *args)
1049 struct textual_date *p;
1050 for (p = args->textual_date; p; )
1052 struct textual_date *next = p->next;
1053 if (verbose_option)
1055 char const *treated_as = tartime (p->ts, true);
1056 if (strcmp (p->date, treated_as) != 0)
1057 WARN ((0, 0, _("Option %s: Treating date `%s' as %s"),
1058 p->option, p->date, treated_as));
1060 free (p->date);
1061 free (p);
1062 p = next;
1068 /* Either NL or NUL, as decided by the --null option. */
1069 static char filename_terminator;
1071 enum read_file_list_state /* Result of reading file name from the list file */
1073 file_list_success, /* OK, name read successfully */
1074 file_list_end, /* End of list file */
1075 file_list_zero, /* Zero separator encountered where it should not */
1076 file_list_skip /* Empty (zero-length) entry encountered, skip it */
1079 /* Read from FP a sequence of characters up to TERM and put them
1080 into STK.
1082 static enum read_file_list_state
1083 read_name_from_file (FILE *fp, struct obstack *stk, int term)
1085 int c;
1086 size_t counter = 0;
1088 for (c = getc (fp); c != EOF && c != term; c = getc (fp))
1090 if (c == 0)
1092 /* We have read a zero separator. The file possibly is
1093 zero-separated */
1094 return file_list_zero;
1096 obstack_1grow (stk, c);
1097 counter++;
1100 if (counter == 0 && c != EOF)
1101 return file_list_skip;
1103 obstack_1grow (stk, 0);
1105 return (counter == 0 && c == EOF) ? file_list_end : file_list_success;
1109 static bool files_from_option; /* When set, tar will not refuse to create
1110 empty archives */
1111 static struct obstack argv_stk; /* Storage for additional command line options
1112 read using -T option */
1114 /* Prevent recursive inclusion of the same file */
1115 struct file_id_list
1117 struct file_id_list *next;
1118 ino_t ino;
1119 dev_t dev;
1122 static struct file_id_list *file_id_list;
1124 static void
1125 add_file_id (const char *filename)
1127 struct file_id_list *p;
1128 struct stat st;
1130 if (stat (filename, &st))
1131 stat_fatal (filename);
1132 for (p = file_id_list; p; p = p->next)
1133 if (p->ino == st.st_ino && p->dev == st.st_dev)
1135 FATAL_ERROR ((0, 0, _("%s: file list already read"),
1136 quotearg_colon (filename)));
1138 p = xmalloc (sizeof *p);
1139 p->next = file_id_list;
1140 p->ino = st.st_ino;
1141 p->dev = st.st_dev;
1142 file_id_list = p;
1145 /* Default density numbers for [0-9][lmh] device specifications */
1147 #ifndef LOW_DENSITY_NUM
1148 # define LOW_DENSITY_NUM 0
1149 #endif
1151 #ifndef MID_DENSITY_NUM
1152 # define MID_DENSITY_NUM 8
1153 #endif
1155 #ifndef HIGH_DENSITY_NUM
1156 # define HIGH_DENSITY_NUM 16
1157 #endif
1159 static void
1160 update_argv (const char *filename, struct argp_state *state)
1162 FILE *fp;
1163 size_t count = 0, i;
1164 char *start, *p;
1165 char **new_argv;
1166 size_t new_argc;
1167 bool is_stdin = false;
1168 enum read_file_list_state read_state;
1169 int term = filename_terminator;
1171 if (!strcmp (filename, "-"))
1173 is_stdin = true;
1174 request_stdin ("-T");
1175 fp = stdin;
1177 else
1179 add_file_id (filename);
1180 if ((fp = fopen (filename, "r")) == NULL)
1181 open_fatal (filename);
1184 while ((read_state = read_name_from_file (fp, &argv_stk, term))
1185 != file_list_end)
1187 switch (read_state)
1189 case file_list_success:
1190 count++;
1191 break;
1193 case file_list_end: /* won't happen, just to pacify gcc */
1194 break;
1196 case file_list_zero:
1198 size_t size;
1200 WARNOPT (WARN_FILENAME_WITH_NULS,
1201 (0, 0, N_("%s: file name read contains nul character"),
1202 quotearg_colon (filename)));
1204 /* Prepare new stack contents */
1205 size = obstack_object_size (&argv_stk);
1206 p = obstack_finish (&argv_stk);
1207 for (; size > 0; size--, p++)
1208 if (*p)
1209 obstack_1grow (&argv_stk, *p);
1210 else
1211 obstack_1grow (&argv_stk, '\n');
1212 obstack_1grow (&argv_stk, 0);
1213 count = 1;
1214 /* Read rest of files using new filename terminator */
1215 term = 0;
1216 break;
1219 case file_list_skip:
1220 break;
1224 if (!is_stdin)
1225 fclose (fp);
1227 if (count == 0)
1228 return;
1230 start = obstack_finish (&argv_stk);
1232 if (term == 0)
1233 for (p = start; *p; p += strlen (p) + 1)
1234 if (p[0] == '-')
1235 count++;
1237 new_argc = state->argc + count;
1238 new_argv = xmalloc (sizeof (state->argv[0]) * (new_argc + 1));
1239 memcpy (new_argv, state->argv, sizeof (state->argv[0]) * (state->argc + 1));
1240 state->argv = new_argv;
1241 memmove (&state->argv[state->next + count], &state->argv[state->next],
1242 (state->argc - state->next + 1) * sizeof (state->argv[0]));
1244 state->argc = new_argc;
1246 for (i = state->next, p = start; *p; p += strlen (p) + 1, i++)
1248 if (term == 0 && p[0] == '-')
1249 state->argv[i++] = "--add-file";
1250 state->argv[i] = p;
1255 static char *
1256 tar_help_filter (int key, const char *text, void *input)
1258 struct obstack stk;
1259 char *s;
1261 switch (key)
1263 default:
1264 s = (char*) text;
1265 break;
1267 case 'j':
1268 s = xasprintf (_("filter the archive through %s"), BZIP2_PROGRAM);
1269 break;
1271 case 'z':
1272 s = xasprintf (_("filter the archive through %s"), GZIP_PROGRAM);
1273 break;
1275 case 'Z':
1276 s = xasprintf (_("filter the archive through %s"), COMPRESS_PROGRAM);
1277 break;
1279 case LZIP_OPTION:
1280 s = xasprintf (_("filter the archive through %s"), LZIP_PROGRAM);
1281 break;
1283 case LZMA_OPTION:
1284 s = xasprintf (_("filter the archive through %s"), LZMA_PROGRAM);
1285 break;
1287 case 'J':
1288 s = xasprintf (_("filter the archive through %s"), XZ_PROGRAM);
1289 break;
1291 case ARGP_KEY_HELP_EXTRA:
1293 const char *tstr;
1295 obstack_init (&stk);
1296 tstr = _("Valid arguments for the --quoting-style option are:");
1297 obstack_grow (&stk, tstr, strlen (tstr));
1298 obstack_grow (&stk, "\n\n", 2);
1299 tar_list_quoting_styles (&stk, " ");
1300 tstr = _("\n*This* tar defaults to:\n");
1301 obstack_grow (&stk, tstr, strlen (tstr));
1302 s = format_default_settings ();
1303 obstack_grow (&stk, s, strlen (s));
1304 obstack_1grow (&stk, '\n');
1305 obstack_1grow (&stk, 0);
1306 s = xstrdup (obstack_finish (&stk));
1307 obstack_free (&stk, NULL);
1310 return s;
1313 static char *
1314 expand_pax_option (struct tar_args *targs, const char *arg)
1316 struct obstack stk;
1317 char *res;
1319 obstack_init (&stk);
1320 while (*arg)
1322 size_t seglen = strcspn (arg, ",");
1323 char *p = memchr (arg, '=', seglen);
1324 if (p)
1326 size_t len = p - arg + 1;
1327 obstack_grow (&stk, arg, len);
1328 len = seglen - len;
1329 for (++p; *p && isspace ((unsigned char) *p); p++)
1330 len--;
1331 if (*p == '{' && p[len-1] == '}')
1333 struct timespec ts;
1334 char *tmp = xmalloc (len);
1335 memcpy (tmp, p + 1, len-2);
1336 tmp[len-2] = 0;
1337 if (get_date_or_file (targs, "--pax-option", tmp, &ts) == 0)
1339 char buf[UINTMAX_STRSIZE_BOUND], *s;
1340 s = umaxtostr (ts.tv_sec, buf);
1341 obstack_grow (&stk, s, strlen (s));
1343 else
1344 obstack_grow (&stk, p, len);
1345 free (tmp);
1347 else
1348 obstack_grow (&stk, p, len);
1350 else
1351 obstack_grow (&stk, arg, seglen);
1353 arg += seglen;
1354 if (*arg)
1356 obstack_1grow (&stk, *arg);
1357 arg++;
1360 obstack_1grow (&stk, 0);
1361 res = xstrdup (obstack_finish (&stk));
1362 obstack_free (&stk, NULL);
1363 return res;
1367 #define TAR_SIZE_SUFFIXES "bBcGgkKMmPTtw"
1369 static error_t
1370 parse_opt (int key, char *arg, struct argp_state *state)
1372 struct tar_args *args = state->input;
1374 switch (key)
1376 case ARGP_KEY_ARG:
1377 /* File name or non-parsed option, because of ARGP_IN_ORDER */
1378 name_add_name (arg, MAKE_INCL_OPTIONS (args));
1379 args->input_files = true;
1380 break;
1382 case 'A':
1383 set_subcommand_option (CAT_SUBCOMMAND);
1384 break;
1386 case 'a':
1387 args->compress_autodetect = true;
1388 break;
1390 case NO_AUTO_COMPRESS_OPTION:
1391 args->compress_autodetect = false;
1392 break;
1394 case 'b':
1396 uintmax_t u;
1397 if (! (xstrtoumax (arg, 0, 10, &u, "") == LONGINT_OK
1398 && u == (blocking_factor = u)
1399 && 0 < blocking_factor
1400 && u == (record_size = u * BLOCKSIZE) / BLOCKSIZE))
1401 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
1402 _("Invalid blocking factor")));
1404 break;
1406 case 'B':
1407 /* Try to reblock input records. For reading 4.2BSD pipes. */
1409 /* It would surely make sense to exchange -B and -R, but it seems
1410 that -B has been used for a long while in Sun tar and most
1411 BSD-derived systems. This is a consequence of the block/record
1412 terminology confusion. */
1414 read_full_records_option = true;
1415 break;
1417 case 'c':
1418 set_subcommand_option (CREATE_SUBCOMMAND);
1419 break;
1421 case 'C':
1422 name_add_dir (arg);
1423 break;
1425 case 'd':
1426 set_subcommand_option (DIFF_SUBCOMMAND);
1427 break;
1429 case 'f':
1430 if (archive_names == allocated_archive_names)
1431 archive_name_array = x2nrealloc (archive_name_array,
1432 &allocated_archive_names,
1433 sizeof (archive_name_array[0]));
1435 archive_name_array[archive_names++] = arg;
1436 break;
1438 case 'F':
1439 /* Since -F is only useful with -M, make it implied. Run this
1440 script at the end of each tape. */
1442 info_script_option = arg;
1443 multi_volume_option = true;
1444 break;
1446 case FULL_TIME_OPTION:
1447 full_time_option = true;
1448 break;
1450 case 'g':
1451 listed_incremental_option = arg;
1452 after_date_option = true;
1453 /* Fall through. */
1455 case 'G':
1456 /* We are making an incremental dump (FIXME: are we?); save
1457 directories at the beginning of the archive, and include in each
1458 directory its contents. */
1460 incremental_option = true;
1461 break;
1463 case 'h':
1464 /* Follow symbolic links. */
1465 dereference_option = true;
1466 break;
1468 case HARD_DEREFERENCE_OPTION:
1469 hard_dereference_option = true;
1470 break;
1472 case 'i':
1473 /* Ignore zero blocks (eofs). This can't be the default,
1474 because Unix tar writes two blocks of zeros, then pads out
1475 the record with garbage. */
1477 ignore_zeros_option = true;
1478 break;
1480 case 'j':
1481 set_use_compress_program_option (BZIP2_PROGRAM);
1482 break;
1484 case 'J':
1485 set_use_compress_program_option (XZ_PROGRAM);
1486 break;
1488 case 'k':
1489 /* Don't replace existing files. */
1490 old_files_option = KEEP_OLD_FILES;
1491 break;
1493 case 'K':
1494 starting_file_option = true;
1495 addname (arg, 0, true, NULL);
1496 break;
1498 case ONE_FILE_SYSTEM_OPTION:
1499 /* When dumping directories, don't dump files/subdirectories
1500 that are on other filesystems. */
1501 one_file_system_option = true;
1502 break;
1504 case 'l':
1505 check_links_option = 1;
1506 break;
1508 case 'L':
1510 uintmax_t u;
1511 char *p;
1513 if (xstrtoumax (arg, &p, 10, &u, TAR_SIZE_SUFFIXES) != LONGINT_OK)
1514 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
1515 _("Invalid tape length")));
1516 if (p > arg && !strchr (TAR_SIZE_SUFFIXES, p[-1]))
1517 tape_length_option = 1024 * (tarlong) u;
1518 else
1519 tape_length_option = (tarlong) u;
1520 multi_volume_option = true;
1522 break;
1524 case LEVEL_OPTION:
1526 char *p;
1527 incremental_level = strtoul (arg, &p, 10);
1528 if (*p)
1529 USAGE_ERROR ((0, 0, _("Invalid incremental level value")));
1531 break;
1533 case LZIP_OPTION:
1534 set_use_compress_program_option (LZIP_PROGRAM);
1535 break;
1537 case LZMA_OPTION:
1538 set_use_compress_program_option (LZMA_PROGRAM);
1539 break;
1541 case LZOP_OPTION:
1542 set_use_compress_program_option (LZOP_PROGRAM);
1543 break;
1545 case 'm':
1546 touch_option = true;
1547 break;
1549 case 'M':
1550 /* Make multivolume archive: when we can't write any more into
1551 the archive, re-open it, and continue writing. */
1553 multi_volume_option = true;
1554 break;
1556 case MTIME_OPTION:
1557 get_date_or_file (args, "--mtime", arg, &mtime_option);
1558 set_mtime_option = true;
1559 break;
1561 case 'n':
1562 seek_option = 1;
1563 break;
1565 case NO_SEEK_OPTION:
1566 seek_option = 0;
1567 break;
1569 case 'N':
1570 after_date_option = true;
1571 /* Fall through. */
1573 case NEWER_MTIME_OPTION:
1574 if (NEWER_OPTION_INITIALIZED (newer_mtime_option))
1575 USAGE_ERROR ((0, 0, _("More than one threshold date")));
1576 get_date_or_file (args,
1577 key == NEWER_MTIME_OPTION ? "--newer-mtime"
1578 : "--after-date", arg, &newer_mtime_option);
1579 break;
1581 case 'o':
1582 args->o_option = true;
1583 break;
1585 case 'O':
1586 to_stdout_option = true;
1587 break;
1589 case 'p':
1590 same_permissions_option = true;
1591 break;
1593 case 'P':
1594 absolute_names_option = true;
1595 break;
1597 case 'r':
1598 set_subcommand_option (APPEND_SUBCOMMAND);
1599 break;
1601 case 'R':
1602 /* Print block numbers for debugging bad tar archives. */
1604 /* It would surely make sense to exchange -B and -R, but it seems
1605 that -B has been used for a long while in Sun tar and most
1606 BSD-derived systems. This is a consequence of the block/record
1607 terminology confusion. */
1609 block_number_option = true;
1610 break;
1612 case 's':
1613 /* Names to extract are sorted. */
1615 same_order_option = true;
1616 break;
1618 case 'S':
1619 sparse_option = true;
1620 break;
1622 case SPARSE_VERSION_OPTION:
1623 sparse_option = true;
1625 char *p;
1626 tar_sparse_major = strtoul (arg, &p, 10);
1627 if (*p)
1629 if (*p != '.')
1630 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1631 tar_sparse_minor = strtoul (p + 1, &p, 10);
1632 if (*p)
1633 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1636 break;
1638 case 't':
1639 set_subcommand_option (LIST_SUBCOMMAND);
1640 verbose_option++;
1641 break;
1643 case TEST_LABEL_OPTION:
1644 set_subcommand_option (TEST_LABEL_SUBCOMMAND);
1645 break;
1647 case 'T':
1648 update_argv (arg, state);
1649 /* Indicate we've been given -T option. This is for backward
1650 compatibility only, so that `tar cfT archive /dev/null will
1651 succeed */
1652 files_from_option = true;
1653 break;
1655 case 'u':
1656 set_subcommand_option (UPDATE_SUBCOMMAND);
1657 break;
1659 case 'U':
1660 old_files_option = UNLINK_FIRST_OLD_FILES;
1661 break;
1663 case UTC_OPTION:
1664 utc_option = true;
1665 break;
1667 case 'v':
1668 verbose_option++;
1669 warning_option |= WARN_VERBOSE_WARNINGS;
1670 break;
1672 case 'V':
1673 volume_label_option = arg;
1674 break;
1676 case 'w':
1677 interactive_option = true;
1678 break;
1680 case 'W':
1681 verify_option = true;
1682 break;
1684 case 'x':
1685 set_subcommand_option (EXTRACT_SUBCOMMAND);
1686 break;
1688 case 'X':
1689 if (add_exclude_file (add_exclude, excluded, arg,
1690 MAKE_EXCL_OPTIONS (args), '\n')
1691 != 0)
1693 int e = errno;
1694 FATAL_ERROR ((0, e, "%s", quotearg_colon (arg)));
1696 break;
1698 case 'z':
1699 set_use_compress_program_option (GZIP_PROGRAM);
1700 break;
1702 case 'Z':
1703 set_use_compress_program_option (COMPRESS_PROGRAM);
1704 break;
1706 case ANCHORED_OPTION:
1707 args->matching_flags |= EXCLUDE_ANCHORED;
1708 break;
1710 case ATIME_PRESERVE_OPTION:
1711 atime_preserve_option =
1712 (arg
1713 ? XARGMATCH ("--atime-preserve", arg,
1714 atime_preserve_args, atime_preserve_types)
1715 : replace_atime_preserve);
1716 if (! O_NOATIME && atime_preserve_option == system_atime_preserve)
1717 FATAL_ERROR ((0, 0,
1718 _("--atime-preserve='system' is not supported"
1719 " on this platform")));
1720 break;
1722 case CHECK_DEVICE_OPTION:
1723 check_device_option = true;
1724 break;
1726 case NO_CHECK_DEVICE_OPTION:
1727 check_device_option = false;
1728 break;
1730 case CHECKPOINT_OPTION:
1731 if (arg)
1733 char *p;
1735 if (*arg == '.')
1737 checkpoint_compile_action (".");
1738 arg++;
1740 checkpoint_option = strtoul (arg, &p, 0);
1741 if (*p)
1742 FATAL_ERROR ((0, 0,
1743 _("--checkpoint value is not an integer")));
1745 else
1746 checkpoint_option = DEFAULT_CHECKPOINT;
1747 break;
1749 case CHECKPOINT_ACTION_OPTION:
1750 checkpoint_compile_action (arg);
1751 break;
1753 case BACKUP_OPTION:
1754 backup_option = true;
1755 if (arg)
1756 args->version_control_string = arg;
1757 break;
1759 case DELAY_DIRECTORY_RESTORE_OPTION:
1760 delay_directory_restore_option = true;
1761 break;
1763 case NO_DELAY_DIRECTORY_RESTORE_OPTION:
1764 delay_directory_restore_option = false;
1765 break;
1767 case DELETE_OPTION:
1768 set_subcommand_option (DELETE_SUBCOMMAND);
1769 break;
1771 case EXCLUDE_BACKUPS_OPTION:
1772 add_exclude_array (backup_file_table);
1773 break;
1775 case EXCLUDE_OPTION:
1776 add_exclude (excluded, arg, MAKE_EXCL_OPTIONS (args));
1777 break;
1779 case EXCLUDE_CACHES_OPTION:
1780 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_contents,
1781 cachedir_file_p);
1782 break;
1784 case EXCLUDE_CACHES_UNDER_OPTION:
1785 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_under,
1786 cachedir_file_p);
1787 break;
1789 case EXCLUDE_CACHES_ALL_OPTION:
1790 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_all,
1791 cachedir_file_p);
1792 break;
1794 case EXCLUDE_TAG_OPTION:
1795 add_exclusion_tag (arg, exclusion_tag_contents, NULL);
1796 break;
1798 case EXCLUDE_TAG_UNDER_OPTION:
1799 add_exclusion_tag (arg, exclusion_tag_under, NULL);
1800 break;
1802 case EXCLUDE_TAG_ALL_OPTION:
1803 add_exclusion_tag (arg, exclusion_tag_all, NULL);
1804 break;
1806 case EXCLUDE_VCS_OPTION:
1807 add_exclude_array (vcs_file_table);
1808 break;
1810 case FORCE_LOCAL_OPTION:
1811 force_local_option = true;
1812 break;
1814 case 'H':
1815 set_archive_format (arg);
1816 break;
1818 case INDEX_FILE_OPTION:
1819 index_file_name = arg;
1820 break;
1822 case IGNORE_CASE_OPTION:
1823 args->matching_flags |= FNM_CASEFOLD;
1824 break;
1826 case IGNORE_COMMAND_ERROR_OPTION:
1827 ignore_command_error_option = true;
1828 break;
1830 case IGNORE_FAILED_READ_OPTION:
1831 ignore_failed_read_option = true;
1832 break;
1834 case KEEP_NEWER_FILES_OPTION:
1835 old_files_option = KEEP_NEWER_FILES;
1836 break;
1838 case GROUP_OPTION:
1839 if (! (strlen (arg) < GNAME_FIELD_SIZE
1840 && gname_to_gid (arg, &group_option)))
1842 uintmax_t g;
1843 if (xstrtoumax (arg, 0, 10, &g, "") == LONGINT_OK
1844 && g == (gid_t) g)
1845 group_option = g;
1846 else
1847 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
1848 _("Invalid group")));
1850 break;
1852 case MODE_OPTION:
1853 mode_option = mode_compile (arg);
1854 if (!mode_option)
1855 FATAL_ERROR ((0, 0, _("Invalid mode given on option")));
1856 initial_umask = umask (0);
1857 umask (initial_umask);
1858 break;
1860 case NO_ANCHORED_OPTION:
1861 args->include_anchored = 0; /* Clear the default for comman line args */
1862 args->matching_flags &= ~ EXCLUDE_ANCHORED;
1863 break;
1865 case NO_IGNORE_CASE_OPTION:
1866 args->matching_flags &= ~ FNM_CASEFOLD;
1867 break;
1869 case NO_IGNORE_COMMAND_ERROR_OPTION:
1870 ignore_command_error_option = false;
1871 break;
1873 case NO_OVERWRITE_DIR_OPTION:
1874 old_files_option = NO_OVERWRITE_DIR_OLD_FILES;
1875 break;
1877 case NO_QUOTE_CHARS_OPTION:
1878 for (;*arg; arg++)
1879 set_char_quoting (NULL, *arg, 0);
1880 break;
1882 case NO_WILDCARDS_OPTION:
1883 args->wildcards = disable_wildcards;
1884 break;
1886 case NO_WILDCARDS_MATCH_SLASH_OPTION:
1887 args->matching_flags |= FNM_FILE_NAME;
1888 break;
1890 case NULL_OPTION:
1891 filename_terminator = '\0';
1892 break;
1894 case NO_NULL_OPTION:
1895 filename_terminator = '\n';
1896 break;
1898 case NUMERIC_OWNER_OPTION:
1899 numeric_owner_option = true;
1900 break;
1902 case OCCURRENCE_OPTION:
1903 if (!arg)
1904 occurrence_option = 1;
1905 else
1907 uintmax_t u;
1908 if (xstrtoumax (arg, 0, 10, &u, "") == LONGINT_OK)
1909 occurrence_option = u;
1910 else
1911 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
1912 _("Invalid number")));
1914 break;
1916 case OVERWRITE_DIR_OPTION:
1917 old_files_option = DEFAULT_OLD_FILES;
1918 break;
1920 case OVERWRITE_OPTION:
1921 old_files_option = OVERWRITE_OLD_FILES;
1922 break;
1924 case OWNER_OPTION:
1925 if (! (strlen (arg) < UNAME_FIELD_SIZE
1926 && uname_to_uid (arg, &owner_option)))
1928 uintmax_t u;
1929 if (xstrtoumax (arg, 0, 10, &u, "") == LONGINT_OK
1930 && u == (uid_t) u)
1931 owner_option = u;
1932 else
1933 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
1934 _("Invalid owner")));
1936 break;
1938 case QUOTE_CHARS_OPTION:
1939 for (;*arg; arg++)
1940 set_char_quoting (NULL, *arg, 1);
1941 break;
1943 case QUOTING_STYLE_OPTION:
1944 tar_set_quoting_style (arg);
1945 break;
1947 case PAX_OPTION:
1949 char *tmp = expand_pax_option (args, arg);
1950 args->pax_option = true;
1951 xheader_set_option (tmp);
1952 free (tmp);
1954 break;
1956 case POSIX_OPTION:
1957 set_archive_format ("posix");
1958 break;
1960 case PRESERVE_OPTION:
1961 /* FIXME: What it is good for? */
1962 same_permissions_option = true;
1963 same_order_option = true;
1964 WARN ((0, 0, _("The --preserve option is deprecated, "
1965 "use --preserve-permissions --preserve-order instead")));
1966 break;
1968 case RECORD_SIZE_OPTION:
1970 uintmax_t u;
1972 if (! (xstrtoumax (arg, NULL, 10, &u, TAR_SIZE_SUFFIXES) == LONGINT_OK
1973 && u == (size_t) u))
1974 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
1975 _("Invalid record size")));
1976 record_size = u;
1977 if (record_size % BLOCKSIZE != 0)
1978 USAGE_ERROR ((0, 0, _("Record size must be a multiple of %d."),
1979 BLOCKSIZE));
1980 blocking_factor = record_size / BLOCKSIZE;
1982 break;
1984 case RECURSIVE_UNLINK_OPTION:
1985 recursive_unlink_option = true;
1986 break;
1988 case REMOVE_FILES_OPTION:
1989 remove_files_option = true;
1990 break;
1992 case RESTRICT_OPTION:
1993 restrict_option = true;
1994 break;
1996 case RMT_COMMAND_OPTION:
1997 rmt_command = arg;
1998 break;
2000 case RSH_COMMAND_OPTION:
2001 rsh_command_option = arg;
2002 break;
2004 case SHOW_DEFAULTS_OPTION:
2006 char *s = format_default_settings ();
2007 printf ("%s\n", s);
2008 close_stdout ();
2009 free (s);
2010 exit (0);
2013 case STRIP_COMPONENTS_OPTION:
2015 uintmax_t u;
2016 if (! (xstrtoumax (arg, 0, 10, &u, "") == LONGINT_OK
2017 && u == (size_t) u))
2018 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
2019 _("Invalid number of elements")));
2020 strip_name_components = u;
2022 break;
2024 case SHOW_OMITTED_DIRS_OPTION:
2025 show_omitted_dirs_option = true;
2026 break;
2028 case SHOW_TRANSFORMED_NAMES_OPTION:
2029 show_transformed_names_option = true;
2030 break;
2032 case SUFFIX_OPTION:
2033 backup_option = true;
2034 args->backup_suffix_string = arg;
2035 break;
2037 case TO_COMMAND_OPTION:
2038 if (to_command_option)
2039 USAGE_ERROR ((0, 0, _("Only one --to-command option allowed")));
2040 to_command_option = arg;
2041 break;
2043 case TOTALS_OPTION:
2044 if (arg)
2045 set_stat_signal (arg);
2046 else
2047 totals_option = true;
2048 break;
2050 case TRANSFORM_OPTION:
2051 set_transform_expr (arg);
2052 break;
2054 case 'I':
2055 set_use_compress_program_option (arg);
2056 break;
2058 case VOLNO_FILE_OPTION:
2059 volno_file_option = arg;
2060 break;
2062 case WILDCARDS_OPTION:
2063 args->wildcards = enable_wildcards;
2064 break;
2066 case WILDCARDS_MATCH_SLASH_OPTION:
2067 args->matching_flags &= ~ FNM_FILE_NAME;
2068 break;
2070 case NO_RECURSION_OPTION:
2071 recursion_option = 0;
2072 break;
2074 case NO_SAME_OWNER_OPTION:
2075 same_owner_option = -1;
2076 break;
2078 case NO_SAME_PERMISSIONS_OPTION:
2079 same_permissions_option = -1;
2080 break;
2082 case RECURSION_OPTION:
2083 recursion_option = FNM_LEADING_DIR;
2084 break;
2086 case SAME_OWNER_OPTION:
2087 same_owner_option = 1;
2088 break;
2090 case UNQUOTE_OPTION:
2091 unquote_option = true;
2092 break;
2094 case NO_UNQUOTE_OPTION:
2095 unquote_option = false;
2096 break;
2098 case WARNING_OPTION:
2099 set_warning_option (arg);
2100 break;
2102 case '0':
2103 case '1':
2104 case '2':
2105 case '3':
2106 case '4':
2107 case '5':
2108 case '6':
2109 case '7':
2111 #ifdef DEVICE_PREFIX
2113 int device = key - '0';
2114 int density;
2115 static char buf[sizeof DEVICE_PREFIX + 10];
2116 char *cursor;
2118 if (arg[1])
2119 argp_error (state, _("Malformed density argument: %s"), quote (arg));
2121 strcpy (buf, DEVICE_PREFIX);
2122 cursor = buf + strlen (buf);
2124 #ifdef DENSITY_LETTER
2126 sprintf (cursor, "%d%c", device, arg[0]);
2128 #else /* not DENSITY_LETTER */
2130 switch (arg[0])
2132 case 'l':
2133 device += LOW_DENSITY_NUM;
2134 break;
2136 case 'm':
2137 device += MID_DENSITY_NUM;
2138 break;
2140 case 'h':
2141 device += HIGH_DENSITY_NUM;
2142 break;
2144 default:
2145 argp_error (state, _("Unknown density: `%c'"), arg[0]);
2147 sprintf (cursor, "%d", device);
2149 #endif /* not DENSITY_LETTER */
2151 if (archive_names == allocated_archive_names)
2152 archive_name_array = x2nrealloc (archive_name_array,
2153 &allocated_archive_names,
2154 sizeof (archive_name_array[0]));
2155 archive_name_array[archive_names++] = xstrdup (buf);
2157 break;
2159 #else /* not DEVICE_PREFIX */
2161 argp_error (state,
2162 _("Options `-[0-7][lmh]' not supported by *this* tar"));
2164 #endif /* not DEVICE_PREFIX */
2166 default:
2167 return ARGP_ERR_UNKNOWN;
2169 return 0;
2172 static struct argp argp = {
2173 options,
2174 parse_opt,
2175 N_("[FILE]..."),
2176 doc,
2177 NULL,
2178 tar_help_filter,
2179 NULL
2182 void
2183 usage (int status)
2185 argp_help (&argp, stderr, ARGP_HELP_SEE, (char*) program_name);
2186 close_stdout ();
2187 exit (status);
2190 /* Parse the options for tar. */
2192 static struct argp_option *
2193 find_argp_option (struct argp_option *o, int letter)
2195 for (;
2196 !(o->name == NULL
2197 && o->key == 0
2198 && o->arg == 0
2199 && o->flags == 0
2200 && o->doc == NULL); o++)
2201 if (o->key == letter)
2202 return o;
2203 return NULL;
2206 static const char *tar_authors[] = {
2207 "John Gilmore",
2208 "Jay Fenlason",
2209 NULL
2212 static void
2213 decode_options (int argc, char **argv)
2215 int idx;
2216 struct tar_args args;
2218 argp_version_setup ("tar", tar_authors);
2220 /* Set some default option values. */
2221 args.textual_date = NULL;
2222 args.wildcards = default_wildcards;
2223 args.matching_flags = 0;
2224 args.include_anchored = EXCLUDE_ANCHORED;
2225 args.o_option = false;
2226 args.pax_option = false;
2227 args.backup_suffix_string = getenv ("SIMPLE_BACKUP_SUFFIX");
2228 args.version_control_string = 0;
2229 args.input_files = false;
2230 args.compress_autodetect = false;
2232 subcommand_option = UNKNOWN_SUBCOMMAND;
2233 archive_format = DEFAULT_FORMAT;
2234 blocking_factor = DEFAULT_BLOCKING;
2235 record_size = DEFAULT_BLOCKING * BLOCKSIZE;
2236 excluded = new_exclude ();
2237 newer_mtime_option.tv_sec = TYPE_MINIMUM (time_t);
2238 newer_mtime_option.tv_nsec = -1;
2239 recursion_option = FNM_LEADING_DIR;
2240 unquote_option = true;
2241 tar_sparse_major = 1;
2242 tar_sparse_minor = 0;
2244 owner_option = -1;
2245 group_option = -1;
2247 check_device_option = true;
2249 incremental_level = -1;
2251 seek_option = -1;
2253 /* Convert old-style tar call by exploding option element and rearranging
2254 options accordingly. */
2256 if (argc > 1 && argv[1][0] != '-')
2258 int new_argc; /* argc value for rearranged arguments */
2259 char **new_argv; /* argv value for rearranged arguments */
2260 char *const *in; /* cursor into original argv */
2261 char **out; /* cursor into rearranged argv */
2262 const char *letter; /* cursor into old option letters */
2263 char buffer[3]; /* constructed option buffer */
2265 /* Initialize a constructed option. */
2267 buffer[0] = '-';
2268 buffer[2] = '\0';
2270 /* Allocate a new argument array, and copy program name in it. */
2272 new_argc = argc - 1 + strlen (argv[1]);
2273 new_argv = xmalloc ((new_argc + 1) * sizeof (char *));
2274 in = argv;
2275 out = new_argv;
2276 *out++ = *in++;
2278 /* Copy each old letter option as a separate option, and have the
2279 corresponding argument moved next to it. */
2281 for (letter = *in++; *letter; letter++)
2283 struct argp_option *opt;
2285 buffer[1] = *letter;
2286 *out++ = xstrdup (buffer);
2287 opt = find_argp_option (options, *letter);
2288 if (opt && opt->arg)
2290 if (in < argv + argc)
2291 *out++ = *in++;
2292 else
2293 USAGE_ERROR ((0, 0, _("Old option `%c' requires an argument."),
2294 *letter));
2298 /* Copy all remaining options. */
2300 while (in < argv + argc)
2301 *out++ = *in++;
2302 *out = 0;
2304 /* Replace the old option list by the new one. */
2306 argc = new_argc;
2307 argv = new_argv;
2310 /* Parse all options and non-options as they appear. */
2312 prepend_default_options (getenv ("TAR_OPTIONS"), &argc, &argv);
2314 if (argp_parse (&argp, argc, argv, ARGP_IN_ORDER, &idx, &args))
2315 exit (TAREXIT_FAILURE);
2318 /* Special handling for 'o' option:
2320 GNU tar used to say "output old format".
2321 UNIX98 tar says don't chown files after extracting (we use
2322 "--no-same-owner" for this).
2324 The old GNU tar semantics is retained when used with --create
2325 option, otherwise UNIX98 semantics is assumed */
2327 if (args.o_option)
2329 if (subcommand_option == CREATE_SUBCOMMAND)
2331 /* GNU Tar <= 1.13 compatibility */
2332 set_archive_format ("v7");
2334 else
2336 /* UNIX98 compatibility */
2337 same_owner_option = -1;
2341 /* Handle operands after any "--" argument. */
2342 for (; idx < argc; idx++)
2344 name_add_name (argv[idx], MAKE_INCL_OPTIONS (&args));
2345 args.input_files = true;
2348 /* Warn about implicit use of the wildcards in command line arguments.
2349 See TODO */
2350 warn_regex_usage = args.wildcards == default_wildcards;
2352 /* Derive option values and check option consistency. */
2354 if (archive_format == DEFAULT_FORMAT)
2356 if (args.pax_option)
2357 archive_format = POSIX_FORMAT;
2358 else
2359 archive_format = DEFAULT_ARCHIVE_FORMAT;
2362 if ((volume_label_option && subcommand_option == CREATE_SUBCOMMAND)
2363 || incremental_option
2364 || multi_volume_option
2365 || sparse_option)
2366 assert_format (FORMAT_MASK (OLDGNU_FORMAT)
2367 | FORMAT_MASK (GNU_FORMAT)
2368 | FORMAT_MASK (POSIX_FORMAT));
2370 if (occurrence_option)
2372 if (!args.input_files)
2373 USAGE_ERROR ((0, 0,
2374 _("--occurrence is meaningless without a file list")));
2375 if (subcommand_option != DELETE_SUBCOMMAND
2376 && subcommand_option != DIFF_SUBCOMMAND
2377 && subcommand_option != EXTRACT_SUBCOMMAND
2378 && subcommand_option != LIST_SUBCOMMAND)
2379 USAGE_ERROR ((0, 0,
2380 _("--occurrence cannot be used in the requested operation mode")));
2383 if (archive_names == 0)
2385 /* If no archive file name given, try TAPE from the environment, or
2386 else, DEFAULT_ARCHIVE from the configuration process. */
2388 archive_names = 1;
2389 archive_name_array[0] = getenv ("TAPE");
2390 if (! archive_name_array[0])
2391 archive_name_array[0] = DEFAULT_ARCHIVE;
2394 /* Allow multiple archives only with `-M'. */
2396 if (archive_names > 1 && !multi_volume_option)
2397 USAGE_ERROR ((0, 0,
2398 _("Multiple archive files require `-M' option")));
2400 if (listed_incremental_option
2401 && NEWER_OPTION_INITIALIZED (newer_mtime_option))
2402 USAGE_ERROR ((0, 0,
2403 _("Cannot combine --listed-incremental with --newer")));
2404 if (incremental_level != -1 && !listed_incremental_option)
2405 WARN ((0, 0,
2406 _("--level is meaningless without --listed-incremental")));
2408 if (volume_label_option)
2410 if (archive_format == GNU_FORMAT || archive_format == OLDGNU_FORMAT)
2412 size_t volume_label_max_len =
2413 (sizeof current_header->header.name
2414 - 1 /* for trailing '\0' */
2415 - (multi_volume_option
2416 ? (sizeof " Volume "
2417 - 1 /* for null at end of " Volume " */
2418 + INT_STRLEN_BOUND (int) /* for volume number */
2419 - 1 /* for sign, as 0 <= volno */)
2420 : 0));
2421 if (volume_label_max_len < strlen (volume_label_option))
2422 USAGE_ERROR ((0, 0,
2423 ngettext ("%s: Volume label is too long (limit is %lu byte)",
2424 "%s: Volume label is too long (limit is %lu bytes)",
2425 volume_label_max_len),
2426 quotearg_colon (volume_label_option),
2427 (unsigned long) volume_label_max_len));
2429 /* else FIXME
2430 Label length in PAX format is limited by the volume size. */
2433 if (verify_option)
2435 if (multi_volume_option)
2436 USAGE_ERROR ((0, 0, _("Cannot verify multi-volume archives")));
2437 if (use_compress_program_option)
2438 USAGE_ERROR ((0, 0, _("Cannot verify compressed archives")));
2441 if (use_compress_program_option)
2443 if (multi_volume_option)
2444 USAGE_ERROR ((0, 0, _("Cannot use multi-volume compressed archives")));
2445 if (subcommand_option == UPDATE_SUBCOMMAND
2446 || subcommand_option == APPEND_SUBCOMMAND
2447 || subcommand_option == DELETE_SUBCOMMAND)
2448 USAGE_ERROR ((0, 0, _("Cannot update compressed archives")));
2449 if (subcommand_option == CAT_SUBCOMMAND)
2450 USAGE_ERROR ((0, 0, _("Cannot concatenate compressed archives")));
2453 /* It is no harm to use --pax-option on non-pax archives in archive
2454 reading mode. It may even be useful, since it allows to override
2455 file attributes from tar headers. Therefore I allow such usage.
2456 --gray */
2457 if (args.pax_option
2458 && archive_format != POSIX_FORMAT
2459 && (subcommand_option != EXTRACT_SUBCOMMAND
2460 || subcommand_option != DIFF_SUBCOMMAND
2461 || subcommand_option != LIST_SUBCOMMAND))
2462 USAGE_ERROR ((0, 0, _("--pax-option can be used only on POSIX archives")));
2464 /* If ready to unlink hierarchies, so we are for simpler files. */
2465 if (recursive_unlink_option)
2466 old_files_option = UNLINK_FIRST_OLD_FILES;
2468 /* Flags for accessing files to be read from or copied into. POSIX says
2469 O_NONBLOCK has unspecified effect on most types of files, but in
2470 practice it never harms and sometimes helps. */
2472 int base_open_flags =
2473 (O_BINARY | O_CLOEXEC | O_NOCTTY | O_NONBLOCK
2474 | (dereference_option ? 0 : O_NOFOLLOW)
2475 | (atime_preserve_option == system_atime_preserve ? O_NOATIME : 0));
2476 open_read_flags = O_RDONLY | base_open_flags;
2477 open_searchdir_flags = O_SEARCH | O_DIRECTORY | base_open_flags;
2479 fstatat_flags = dereference_option ? 0 : AT_SYMLINK_NOFOLLOW;
2481 if (subcommand_option == TEST_LABEL_SUBCOMMAND)
2483 /* --test-label is silent if the user has specified the label name to
2484 compare against. */
2485 if (!args.input_files)
2486 verbose_option++;
2488 else if (utc_option)
2489 verbose_option = 2;
2491 if (tape_length_option && tape_length_option < record_size)
2492 USAGE_ERROR ((0, 0, _("Volume length cannot be less than record size")));
2494 if (same_order_option && listed_incremental_option)
2495 USAGE_ERROR ((0, 0, _("--preserve-order is not compatible with "
2496 "--listed-incremental")));
2498 /* Forbid using -c with no input files whatsoever. Check that `-f -',
2499 explicit or implied, is used correctly. */
2501 switch (subcommand_option)
2503 case CREATE_SUBCOMMAND:
2504 if (!args.input_files && !files_from_option)
2505 USAGE_ERROR ((0, 0,
2506 _("Cowardly refusing to create an empty archive")));
2507 if (args.compress_autodetect && archive_names
2508 && strcmp (archive_name_array[0], "-"))
2509 set_compression_program_by_suffix (archive_name_array[0],
2510 use_compress_program_option);
2511 break;
2513 case EXTRACT_SUBCOMMAND:
2514 case LIST_SUBCOMMAND:
2515 case DIFF_SUBCOMMAND:
2516 case TEST_LABEL_SUBCOMMAND:
2517 for (archive_name_cursor = archive_name_array;
2518 archive_name_cursor < archive_name_array + archive_names;
2519 archive_name_cursor++)
2520 if (!strcmp (*archive_name_cursor, "-"))
2521 request_stdin ("-f");
2522 break;
2524 case CAT_SUBCOMMAND:
2525 case UPDATE_SUBCOMMAND:
2526 case APPEND_SUBCOMMAND:
2527 for (archive_name_cursor = archive_name_array;
2528 archive_name_cursor < archive_name_array + archive_names;
2529 archive_name_cursor++)
2530 if (!strcmp (*archive_name_cursor, "-"))
2531 USAGE_ERROR ((0, 0,
2532 _("Options `-Aru' are incompatible with `-f -'")));
2534 default:
2535 break;
2538 /* Initialize stdlis */
2539 if (index_file_name)
2541 stdlis = fopen (index_file_name, "w");
2542 if (! stdlis)
2543 open_error (index_file_name);
2545 else
2546 stdlis = to_stdout_option ? stderr : stdout;
2548 archive_name_cursor = archive_name_array;
2550 /* Prepare for generating backup names. */
2552 if (args.backup_suffix_string)
2553 simple_backup_suffix = xstrdup (args.backup_suffix_string);
2555 if (backup_option)
2557 backup_type = xget_version ("--backup", args.version_control_string);
2558 /* No backup is needed either if explicitely disabled or if
2559 the extracted files are not being written to disk. */
2560 if (backup_type == no_backups || EXTRACT_OVER_PIPE)
2561 backup_option = false;
2564 checkpoint_finish_compile ();
2566 report_textual_dates (&args);
2570 /* Tar proper. */
2572 /* Main routine for tar. */
2574 main (int argc, char **argv)
2576 set_start_time ();
2577 set_program_name (argv[0]);
2579 setlocale (LC_ALL, "");
2580 bindtextdomain (PACKAGE, LOCALEDIR);
2581 textdomain (PACKAGE);
2583 exit_failure = TAREXIT_FAILURE;
2584 exit_status = TAREXIT_SUCCESS;
2585 filename_terminator = '\n';
2586 set_quoting_style (0, DEFAULT_QUOTING_STYLE);
2588 /* Make sure we have first three descriptors available */
2589 stdopen ();
2591 /* Pre-allocate a few structures. */
2593 allocated_archive_names = 10;
2594 archive_name_array =
2595 xmalloc (sizeof (const char *) * allocated_archive_names);
2596 archive_names = 0;
2598 obstack_init (&argv_stk);
2600 /* System V fork+wait does not work if SIGCHLD is ignored. */
2601 signal (SIGCHLD, SIG_DFL);
2603 /* Try to disable the ability to unlink a directory. */
2604 priv_set_remove_linkdir ();
2606 /* Decode options. */
2608 decode_options (argc, argv);
2610 name_init ();
2612 /* Main command execution. */
2614 if (volno_file_option)
2615 init_volume_number ();
2617 switch (subcommand_option)
2619 case UNKNOWN_SUBCOMMAND:
2620 USAGE_ERROR ((0, 0,
2621 _("You must specify one of the `-Acdtrux' or `--test-label' options")));
2623 case CAT_SUBCOMMAND:
2624 case UPDATE_SUBCOMMAND:
2625 case APPEND_SUBCOMMAND:
2626 update_archive ();
2627 break;
2629 case DELETE_SUBCOMMAND:
2630 delete_archive_members ();
2631 break;
2633 case CREATE_SUBCOMMAND:
2634 create_archive ();
2635 break;
2637 case EXTRACT_SUBCOMMAND:
2638 extr_init ();
2639 read_and (extract_archive);
2641 /* FIXME: should extract_finish () even if an ordinary signal is
2642 received. */
2643 extract_finish ();
2645 break;
2647 case LIST_SUBCOMMAND:
2648 read_and (list_archive);
2649 break;
2651 case DIFF_SUBCOMMAND:
2652 diff_init ();
2653 read_and (diff_archive);
2654 break;
2656 case TEST_LABEL_SUBCOMMAND:
2657 test_archive_label ();
2660 if (totals_option)
2661 print_total_stats ();
2663 if (check_links_option)
2664 check_links ();
2666 if (volno_file_option)
2667 closeout_volume_number ();
2669 /* Dispose of allocated memory, and return. */
2671 free (archive_name_array);
2672 name_term ();
2674 if (exit_status == TAREXIT_FAILURE)
2675 error (0, 0, _("Exiting with failure status due to previous errors"));
2677 if (stdlis == stdout)
2678 close_stdout ();
2679 else if (ferror (stderr) || fclose (stderr) != 0)
2680 set_exit_status (TAREXIT_FAILURE);
2682 return exit_status;
2685 void
2686 tar_stat_init (struct tar_stat_info *st)
2688 memset (st, 0, sizeof (*st));
2691 /* Close the stream or file descriptor associated with ST, and remove
2692 all traces of it from ST. Return true if successful, false (with a
2693 diagnostic) otherwise. */
2694 bool
2695 tar_stat_close (struct tar_stat_info *st)
2697 int status = (st->dirstream ? closedir (st->dirstream)
2698 : 0 < st->fd ? close (st->fd)
2699 : 0);
2700 st->dirstream = 0;
2701 st->fd = 0;
2703 if (status == 0)
2704 return true;
2705 else
2707 close_diag (st->orig_file_name);
2708 return false;
2712 void
2713 tar_stat_destroy (struct tar_stat_info *st)
2715 tar_stat_close (st);
2716 free (st->orig_file_name);
2717 free (st->file_name);
2718 free (st->link_name);
2719 free (st->uname);
2720 free (st->gname);
2721 free (st->sparse_map);
2722 free (st->dumpdir);
2723 xheader_destroy (&st->xhdr);
2724 memset (st, 0, sizeof (*st));
2727 /* Format mask for all available formats that support nanosecond
2728 timestamp resolution. */
2729 #define NS_PRECISION_FORMAT_MASK FORMAT_MASK (POSIX_FORMAT)
2731 /* Same as timespec_cmp, but ignore nanoseconds if current archive
2732 format does not provide sufficient resolution. */
2734 tar_timespec_cmp (struct timespec a, struct timespec b)
2736 if (!(FORMAT_MASK (current_format) & NS_PRECISION_FORMAT_MASK))
2737 a.tv_nsec = b.tv_nsec = 0;
2738 return timespec_cmp (a, b);
2741 /* Set tar exit status to VAL, unless it is already indicating
2742 a more serious condition. This relies on the fact that the
2743 values of TAREXIT_ constants are ranged by severity. */
2744 void
2745 set_exit_status (int val)
2747 if (val > exit_status)
2748 exit_status = val;