Import upstream version 1.28
[debian/tar] / src / tar.c
1 /* A tar (tape archiver) program.
2
3    Copyright 1988, 1992-1997, 1999-2001, 2003-2007, 2012-2014 Free
4    Software Foundation, Inc.
5
6    Written by John Gilmore, starting 1985-08-25.
7
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.
12
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.
17
18    You should have received a copy of the GNU General Public License along
19    with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20
21 #include <system.h>
22
23 #include <fnmatch.h>
24 #include <argp.h>
25 #include <argp-namefrob.h>
26 #include <argp-fmtstream.h>
27 #include <argp-version-etc.h>
28
29 #include <signal.h>
30 #if ! defined SIGCHLD && defined SIGCLD
31 # define SIGCHLD SIGCLD
32 #endif
33
34 /* The following causes "common.h" to produce definitions of all the global
35    variables, rather than just "extern" declarations of them.  GNU tar does
36    depend on the system loader to preset all GLOBAL variables to neutral (or
37    zero) values; explicit initialization is usually not done.  */
38 #define GLOBAL
39 #include "common.h"
40
41 #include <argmatch.h>
42 #include <closeout.h>
43 #include <configmake.h>
44 #include <exitfail.h>
45 #include <parse-datetime.h>
46 #include <rmt.h>
47 #include <rmt-command.h>
48 #include <prepargs.h>
49 #include <quotearg.h>
50 #include <version-etc.h>
51 #include <xstrtol.h>
52 #include <stdopen.h>
53 #include <priv-set.h>
54 #include <savedir.h>
55
56 /* Local declarations.  */
57
58 #ifndef DEFAULT_ARCHIVE_FORMAT
59 # define DEFAULT_ARCHIVE_FORMAT GNU_FORMAT
60 #endif
61
62 #ifndef DEFAULT_ARCHIVE
63 # define DEFAULT_ARCHIVE "tar.out"
64 #endif
65
66 #ifndef DEFAULT_BLOCKING
67 # define DEFAULT_BLOCKING 20
68 #endif
69
70 /* Print a message if not all links are dumped */
71 static int check_links_option;
72
73 /* Number of allocated tape drive names.  */
74 static size_t allocated_archive_names;
75
76 \f
77 /* Miscellaneous.  */
78
79 /* Name of option using stdin.  */
80 static const char *stdin_used_by;
81
82 /* Doesn't return if stdin already requested.  */
83 void
84 request_stdin (const char *option)
85 {
86   if (stdin_used_by)
87     USAGE_ERROR ((0, 0, _("Options '%s' and '%s' both want standard input"),
88                   stdin_used_by, option));
89
90   stdin_used_by = option;
91 }
92
93 extern int rpmatch (char const *response);
94
95 /* Returns true if and only if the user typed an affirmative response.  */
96 int
97 confirm (const char *message_action, const char *message_name)
98 {
99   static FILE *confirm_file;
100   static int confirm_file_EOF;
101   bool status = false;
102
103   if (!confirm_file)
104     {
105       if (archive == 0 || stdin_used_by)
106         {
107           confirm_file = fopen (TTY_NAME, "r");
108           if (! confirm_file)
109             open_fatal (TTY_NAME);
110         }
111       else
112         {
113           request_stdin ("-w");
114           confirm_file = stdin;
115         }
116     }
117
118   fprintf (stdlis, "%s %s?", message_action, quote (message_name));
119   fflush (stdlis);
120
121   if (!confirm_file_EOF)
122     {
123       char *response = NULL;
124       size_t response_size = 0;
125       if (getline (&response, &response_size, confirm_file) < 0)
126         confirm_file_EOF = 1;
127       else
128         status = rpmatch (response) > 0;
129       free (response);
130     }
131
132   if (confirm_file_EOF)
133     {
134       fputc ('\n', stdlis);
135       fflush (stdlis);
136     }
137
138   return status;
139 }
140
141 static struct fmttab {
142   char const *name;
143   enum archive_format fmt;
144 } const fmttab[] = {
145   { "v7",      V7_FORMAT },
146   { "oldgnu",  OLDGNU_FORMAT },
147   { "ustar",   USTAR_FORMAT },
148   { "posix",   POSIX_FORMAT },
149 #if 0 /* not fully supported yet */
150   { "star",    STAR_FORMAT },
151 #endif
152   { "gnu",     GNU_FORMAT },
153   { "pax",     POSIX_FORMAT }, /* An alias for posix */
154   { NULL,      0 }
155 };
156
157 static void
158 set_archive_format (char const *name)
159 {
160   struct fmttab const *p;
161
162   for (p = fmttab; strcmp (p->name, name) != 0; )
163     if (! (++p)->name)
164       USAGE_ERROR ((0, 0, _("%s: Invalid archive format"),
165                     quotearg_colon (name)));
166
167   archive_format = p->fmt;
168 }
169
170 static void
171 set_xattr_option (int value)
172 {
173   if (value == 1)
174     set_archive_format ("posix");
175   xattrs_option = value;
176 }
177
178 const char *
179 archive_format_string (enum archive_format fmt)
180 {
181   struct fmttab const *p;
182
183   for (p = fmttab; p->name; p++)
184     if (p->fmt == fmt)
185       return p->name;
186   return "unknown?";
187 }
188
189 #define FORMAT_MASK(n) (1<<(n))
190
191 static void
192 assert_format(unsigned fmt_mask)
193 {
194   if ((FORMAT_MASK (archive_format) & fmt_mask) == 0)
195     USAGE_ERROR ((0, 0,
196                   _("GNU features wanted on incompatible archive format")));
197 }
198
199 const char *
200 subcommand_string (enum subcommand c)
201 {
202   switch (c)
203     {
204     case UNKNOWN_SUBCOMMAND:
205       return "unknown?";
206
207     case APPEND_SUBCOMMAND:
208       return "-r";
209
210     case CAT_SUBCOMMAND:
211       return "-A";
212
213     case CREATE_SUBCOMMAND:
214       return "-c";
215
216     case DELETE_SUBCOMMAND:
217       return "-D";
218
219     case DIFF_SUBCOMMAND:
220       return "-d";
221
222     case EXTRACT_SUBCOMMAND:
223       return "-x";
224
225     case LIST_SUBCOMMAND:
226       return "-t";
227
228     case UPDATE_SUBCOMMAND:
229       return "-u";
230
231     case TEST_LABEL_SUBCOMMAND:
232       return "--test-label";
233     }
234   abort ();
235 }
236
237 static void
238 tar_list_quoting_styles (struct obstack *stk, char const *prefix)
239 {
240   int i;
241   size_t prefixlen = strlen (prefix);
242
243   for (i = 0; quoting_style_args[i]; i++)
244     {
245       obstack_grow (stk, prefix, prefixlen);
246       obstack_grow (stk, quoting_style_args[i],
247                     strlen (quoting_style_args[i]));
248       obstack_1grow (stk, '\n');
249     }
250 }
251
252 static void
253 tar_set_quoting_style (char *arg)
254 {
255   int i;
256
257   for (i = 0; quoting_style_args[i]; i++)
258     if (strcmp (arg, quoting_style_args[i]) == 0)
259       {
260         set_quoting_style (NULL, i);
261         return;
262       }
263   FATAL_ERROR ((0, 0,
264                 _("Unknown quoting style '%s'. Try '%s --quoting-style=help' to get a list."), arg, program_invocation_short_name));
265 }
266
267 \f
268 /* Options.  */
269
270 enum
271 {
272   ACLS_OPTION = CHAR_MAX + 1,
273   ANCHORED_OPTION,
274   ATIME_PRESERVE_OPTION,
275   BACKUP_OPTION,
276   CHECK_DEVICE_OPTION,
277   CHECKPOINT_OPTION,
278   CHECKPOINT_ACTION_OPTION,
279   DELAY_DIRECTORY_RESTORE_OPTION,
280   HARD_DEREFERENCE_OPTION,
281   DELETE_OPTION,
282   EXCLUDE_BACKUPS_OPTION,
283   EXCLUDE_CACHES_OPTION,
284   EXCLUDE_CACHES_UNDER_OPTION,
285   EXCLUDE_CACHES_ALL_OPTION,
286   EXCLUDE_OPTION,
287   EXCLUDE_IGNORE_OPTION,
288   EXCLUDE_IGNORE_RECURSIVE_OPTION,
289   EXCLUDE_TAG_OPTION,
290   EXCLUDE_TAG_UNDER_OPTION,
291   EXCLUDE_TAG_ALL_OPTION,
292   EXCLUDE_VCS_OPTION,
293   EXCLUDE_VCS_IGNORES_OPTION,
294   FORCE_LOCAL_OPTION,
295   FULL_TIME_OPTION,
296   GROUP_OPTION,
297   IGNORE_CASE_OPTION,
298   IGNORE_COMMAND_ERROR_OPTION,
299   IGNORE_FAILED_READ_OPTION,
300   INDEX_FILE_OPTION,
301   KEEP_DIRECTORY_SYMLINK_OPTION,
302   KEEP_NEWER_FILES_OPTION,
303   LEVEL_OPTION,
304   LZIP_OPTION,
305   LZMA_OPTION,
306   LZOP_OPTION,
307   MODE_OPTION,
308   MTIME_OPTION,
309   NEWER_MTIME_OPTION,
310   NO_ACLS_OPTION,
311   NO_ANCHORED_OPTION,
312   NO_AUTO_COMPRESS_OPTION,
313   NO_CHECK_DEVICE_OPTION,
314   NO_DELAY_DIRECTORY_RESTORE_OPTION,
315   NO_IGNORE_CASE_OPTION,
316   NO_IGNORE_COMMAND_ERROR_OPTION,
317   NO_NULL_OPTION,
318   NO_OVERWRITE_DIR_OPTION,
319   NO_QUOTE_CHARS_OPTION,
320   NO_RECURSION_OPTION,
321   NO_SAME_OWNER_OPTION,
322   NO_SAME_PERMISSIONS_OPTION,
323   NO_SEEK_OPTION,
324   NO_SELINUX_CONTEXT_OPTION,
325   NO_UNQUOTE_OPTION,
326   NO_WILDCARDS_MATCH_SLASH_OPTION,
327   NO_WILDCARDS_OPTION,
328   NO_XATTR_OPTION,
329   NULL_OPTION,
330   NUMERIC_OWNER_OPTION,
331   OCCURRENCE_OPTION,
332   OLD_ARCHIVE_OPTION,
333   ONE_FILE_SYSTEM_OPTION,
334   ONE_TOP_LEVEL_OPTION,
335   OVERWRITE_DIR_OPTION,
336   OVERWRITE_OPTION,
337   OWNER_OPTION,
338   PAX_OPTION,
339   POSIX_OPTION,
340   PRESERVE_OPTION,
341   QUOTE_CHARS_OPTION,
342   QUOTING_STYLE_OPTION,
343   RECORD_SIZE_OPTION,
344   RECURSION_OPTION,
345   RECURSIVE_UNLINK_OPTION,
346   REMOVE_FILES_OPTION,
347   RESTRICT_OPTION,
348   RMT_COMMAND_OPTION,
349   RSH_COMMAND_OPTION,
350   SAME_OWNER_OPTION,
351   SELINUX_CONTEXT_OPTION,
352   SHOW_DEFAULTS_OPTION,
353   SHOW_OMITTED_DIRS_OPTION,
354   SHOW_SNAPSHOT_FIELD_RANGES_OPTION,
355   SHOW_TRANSFORMED_NAMES_OPTION,
356   SKIP_OLD_FILES_OPTION,
357   SORT_OPTION,
358   SPARSE_VERSION_OPTION,
359   STRIP_COMPONENTS_OPTION,
360   SUFFIX_OPTION,
361   TEST_LABEL_OPTION,
362   TOTALS_OPTION,
363   TO_COMMAND_OPTION,
364   TRANSFORM_OPTION,
365   UNQUOTE_OPTION,
366   UTC_OPTION,
367   VOLNO_FILE_OPTION,
368   WARNING_OPTION,
369   WILDCARDS_MATCH_SLASH_OPTION,
370   WILDCARDS_OPTION,
371   XATTR_OPTION,
372   XATTR_EXCLUDE,
373   XATTR_INCLUDE
374 };
375
376 const char *argp_program_version = "tar (" PACKAGE_NAME ") " VERSION;
377 const char *argp_program_bug_address = "<" PACKAGE_BUGREPORT ">";
378 static char const doc[] = N_("\
379 GNU 'tar' saves many files together into a single tape or disk archive, \
380 and can restore individual files from the archive.\n\
381 \n\
382 Examples:\n\
383   tar -cf archive.tar foo bar  # Create archive.tar from files foo and bar.\n\
384   tar -tvf archive.tar         # List all files in archive.tar verbosely.\n\
385   tar -xf archive.tar          # Extract all files from archive.tar.\n")
386 "\v"
387 N_("The backup suffix is '~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
388 The version control may be set with --backup or VERSION_CONTROL, values are:\n\n\
389   none, off       never make backups\n\
390   t, numbered     make numbered backups\n\
391   nil, existing   numbered if numbered backups exist, simple otherwise\n\
392   never, simple   always make simple backups\n");
393
394
395 /* NOTE:
396
397    Available option letters are DEQY and eqy. Consider the following
398    assignments:
399
400    [For Solaris tar compatibility =/= Is it important at all?]
401    e  exit immediately with a nonzero exit status if unexpected errors occur
402    E  use extended headers (--format=posix)
403
404    [q  alias for --occurrence=1 =/= this would better be used for quiet?]
405
406    y  per-file gzip compression
407    Y  per-block gzip compression.
408
409    Additionally, the 'n' letter is assigned for option --seek, which
410    is probably not needed and should be marked as deprecated, so that
411    -n may become available in the future.
412 */
413
414 static struct argp_option options[] = {
415 #define GRID 10
416   {NULL, 0, NULL, 0,
417    N_("Main operation mode:"), GRID },
418
419   {"list", 't', 0, 0,
420    N_("list the contents of an archive"), GRID+1 },
421   {"extract", 'x', 0, 0,
422    N_("extract files from an archive"), GRID+1 },
423   {"get", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
424   {"create", 'c', 0, 0,
425    N_("create a new archive"), GRID+1 },
426   {"diff", 'd', 0, 0,
427    N_("find differences between archive and file system"), GRID+1 },
428   {"compare", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
429   {"append", 'r', 0, 0,
430    N_("append files to the end of an archive"), GRID+1 },
431   {"update", 'u', 0, 0,
432    N_("only append files newer than copy in archive"), GRID+1 },
433   {"catenate", 'A', 0, 0,
434    N_("append tar files to an archive"), GRID+1 },
435   {"concatenate", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
436   {"delete", DELETE_OPTION, 0, 0,
437    N_("delete from the archive (not on mag tapes!)"), GRID+1 },
438   {"test-label", TEST_LABEL_OPTION, NULL, 0,
439    N_("test the archive volume label and exit"), GRID+1 },
440 #undef GRID
441
442 #define GRID 20
443   {NULL, 0, NULL, 0,
444    N_("Operation modifiers:"), GRID },
445
446   {"sparse", 'S', 0, 0,
447    N_("handle sparse files efficiently"), GRID+1 },
448   {"sparse-version", SPARSE_VERSION_OPTION, N_("MAJOR[.MINOR]"), 0,
449    N_("set version of the sparse format to use (implies --sparse)"), GRID+1},
450   {"incremental", 'G', 0, 0,
451    N_("handle old GNU-format incremental backup"), GRID+1 },
452   {"listed-incremental", 'g', N_("FILE"), 0,
453    N_("handle new GNU-format incremental backup"), GRID+1 },
454   {"level", LEVEL_OPTION, N_("NUMBER"), 0,
455    N_("dump level for created listed-incremental archive"), GRID+1 },
456   {"ignore-failed-read", IGNORE_FAILED_READ_OPTION, 0, 0,
457    N_("do not exit with nonzero on unreadable files"), GRID+1 },
458   {"occurrence", OCCURRENCE_OPTION, N_("NUMBER"), OPTION_ARG_OPTIONAL,
459    N_("process only the NUMBERth occurrence of each file in the archive;"
460       " this option is valid only in conjunction with one of the subcommands"
461       " --delete, --diff, --extract or --list and when a list of files"
462       " is given either on the command line or via the -T option;"
463       " NUMBER defaults to 1"), GRID+1 },
464   {"seek", 'n', NULL, 0,
465    N_("archive is seekable"), GRID+1 },
466   {"no-seek", NO_SEEK_OPTION, NULL, 0,
467    N_("archive is not seekable"), GRID+1 },
468   {"no-check-device", NO_CHECK_DEVICE_OPTION, NULL, 0,
469    N_("do not check device numbers when creating incremental archives"),
470    GRID+1 },
471   {"check-device", CHECK_DEVICE_OPTION, NULL, 0,
472    N_("check device numbers when creating incremental archives (default)"),
473    GRID+1 },
474 #undef GRID
475
476 #define GRID 30
477   {NULL, 0, NULL, 0,
478    N_("Overwrite control:"), GRID },
479
480   {"verify", 'W', 0, 0,
481    N_("attempt to verify the archive after writing it"), GRID+1 },
482   {"remove-files", REMOVE_FILES_OPTION, 0, 0,
483    N_("remove files after adding them to the archive"), GRID+1 },
484   {"keep-old-files", 'k', 0, 0,
485    N_("don't replace existing files when extracting, "
486       "treat them as errors"), GRID+1 },
487   {"skip-old-files", SKIP_OLD_FILES_OPTION, 0, 0,
488    N_("don't replace existing files when extracting, silently skip over them"),
489    GRID+1 },
490   {"keep-newer-files", KEEP_NEWER_FILES_OPTION, 0, 0,
491    N_("don't replace existing files that are newer than their archive copies"), GRID+1 },
492   {"overwrite", OVERWRITE_OPTION, 0, 0,
493    N_("overwrite existing files when extracting"), GRID+1 },
494   {"unlink-first", 'U', 0, 0,
495    N_("remove each file prior to extracting over it"), GRID+1 },
496   {"recursive-unlink", RECURSIVE_UNLINK_OPTION, 0, 0,
497    N_("empty hierarchies prior to extracting directory"), GRID+1 },
498   {"no-overwrite-dir", NO_OVERWRITE_DIR_OPTION, 0, 0,
499    N_("preserve metadata of existing directories"), GRID+1 },
500   {"overwrite-dir", OVERWRITE_DIR_OPTION, 0, 0,
501    N_("overwrite metadata of existing directories when extracting (default)"),
502    GRID+1 },
503   {"keep-directory-symlink", KEEP_DIRECTORY_SYMLINK_OPTION, 0, 0,
504    N_("preserve existing symlinks to directories when extracting"),
505    GRID+1 },
506   {"one-top-level", ONE_TOP_LEVEL_OPTION, N_("DIR"), OPTION_ARG_OPTIONAL,
507    N_("create a subdirectory to avoid having loose files extracted"),
508    GRID+1 },
509 #undef GRID
510
511 #define GRID 40
512   {NULL, 0, NULL, 0,
513    N_("Select output stream:"), GRID },
514
515   {"to-stdout", 'O', 0, 0,
516    N_("extract files to standard output"), GRID+1 },
517   {"to-command", TO_COMMAND_OPTION, N_("COMMAND"), 0,
518    N_("pipe extracted files to another program"), GRID+1 },
519   {"ignore-command-error", IGNORE_COMMAND_ERROR_OPTION, 0, 0,
520    N_("ignore exit codes of children"), GRID+1 },
521   {"no-ignore-command-error", NO_IGNORE_COMMAND_ERROR_OPTION, 0, 0,
522    N_("treat non-zero exit codes of children as error"), GRID+1 },
523 #undef GRID
524
525 #define GRID 50
526   {NULL, 0, NULL, 0,
527    N_("Handling of file attributes:"), GRID },
528
529   {"owner", OWNER_OPTION, N_("NAME"), 0,
530    N_("force NAME as owner for added files"), GRID+1 },
531   {"group", GROUP_OPTION, N_("NAME"), 0,
532    N_("force NAME as group for added files"), GRID+1 },
533   {"mtime", MTIME_OPTION, N_("DATE-OR-FILE"), 0,
534    N_("set mtime for added files from DATE-OR-FILE"), GRID+1 },
535   {"mode", MODE_OPTION, N_("CHANGES"), 0,
536    N_("force (symbolic) mode CHANGES for added files"), GRID+1 },
537   {"atime-preserve", ATIME_PRESERVE_OPTION,
538    N_("METHOD"), OPTION_ARG_OPTIONAL,
539    N_("preserve access times on dumped files, either by restoring the times"
540       " after reading (METHOD='replace'; default) or by not setting the times"
541       " in the first place (METHOD='system')"), GRID+1 },
542   {"touch", 'm', 0, 0,
543    N_("don't extract file modified time"), GRID+1 },
544   {"same-owner", SAME_OWNER_OPTION, 0, 0,
545    N_("try extracting files with the same ownership as exists in the archive (default for superuser)"), GRID+1 },
546   {"no-same-owner", NO_SAME_OWNER_OPTION, 0, 0,
547    N_("extract files as yourself (default for ordinary users)"), GRID+1 },
548   {"numeric-owner", NUMERIC_OWNER_OPTION, 0, 0,
549    N_("always use numbers for user/group names"), GRID+1 },
550   {"preserve-permissions", 'p', 0, 0,
551    N_("extract information about file permissions (default for superuser)"),
552    GRID+1 },
553   {"same-permissions", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
554   {"no-same-permissions", NO_SAME_PERMISSIONS_OPTION, 0, 0,
555    N_("apply the user's umask when extracting permissions from the archive (default for ordinary users)"), GRID+1 },
556   {"preserve-order", 's', 0, 0,
557    N_("member arguments are listed in the same order as the "
558       "files in the archive"), GRID+1 },
559   {"same-order", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
560   {"preserve", PRESERVE_OPTION, 0, 0,
561    N_("same as both -p and -s"), GRID+1 },
562   {"delay-directory-restore", DELAY_DIRECTORY_RESTORE_OPTION, 0, 0,
563    N_("delay setting modification times and permissions of extracted"
564       " directories until the end of extraction"), GRID+1 },
565   {"no-delay-directory-restore", NO_DELAY_DIRECTORY_RESTORE_OPTION, 0, 0,
566    N_("cancel the effect of --delay-directory-restore option"), GRID+1 },
567   {"sort", SORT_OPTION, N_("ORDER"), 0,
568 #if D_INO_IN_DIRENT
569    N_("directory sorting order: none (default), name or inode"
570 #else
571    N_("directory sorting order: none (default) or name"
572 #endif
573      ), GRID+1 },
574 #undef GRID
575
576 #define GRID 55
577   {NULL, 0, NULL, 0,
578    N_("Handling of extended file attributes:"), GRID },
579
580   {"xattrs", XATTR_OPTION, 0, 0,
581    N_("Enable extended attributes support"), GRID+1 },
582   {"no-xattrs", NO_XATTR_OPTION, 0, 0,
583    N_("Disable extended attributes support"), GRID+1 },
584   {"xattrs-include", XATTR_INCLUDE, N_("MASK"), 0,
585    N_("specify the include pattern for xattr keys"), GRID+1 },
586   {"xattrs-exclude", XATTR_EXCLUDE, N_("MASK"), 0,
587    N_("specify the exclude pattern for xattr keys"), GRID+1 },
588   {"selinux", SELINUX_CONTEXT_OPTION, 0, 0,
589    N_("Enable the SELinux context support"), GRID+1 },
590   {"no-selinux", NO_SELINUX_CONTEXT_OPTION, 0, 0,
591    N_("Disable the SELinux context support"), GRID+1 },
592   {"acls", ACLS_OPTION, 0, 0,
593    N_("Enable the POSIX ACLs support"), GRID+1 },
594   {"no-acls", NO_ACLS_OPTION, 0, 0,
595    N_("Disable the POSIX ACLs support"), GRID+1 },
596 #undef GRID
597
598 #define GRID 60
599   {NULL, 0, NULL, 0,
600    N_("Device selection and switching:"), GRID },
601
602   {"file", 'f', N_("ARCHIVE"), 0,
603    N_("use archive file or device ARCHIVE"), GRID+1 },
604   {"force-local", FORCE_LOCAL_OPTION, 0, 0,
605    N_("archive file is local even if it has a colon"), GRID+1 },
606   {"rmt-command", RMT_COMMAND_OPTION, N_("COMMAND"), 0,
607    N_("use given rmt COMMAND instead of rmt"), GRID+1 },
608   {"rsh-command", RSH_COMMAND_OPTION, N_("COMMAND"), 0,
609    N_("use remote COMMAND instead of rsh"), GRID+1 },
610 #ifdef DEVICE_PREFIX
611   {"-[0-7][lmh]", 0, NULL, OPTION_DOC, /* It is OK, since 'name' will never be
612                                           translated */
613    N_("specify drive and density"), GRID+1 },
614 #endif
615   {NULL, '0', NULL, OPTION_HIDDEN, NULL, GRID+1 },
616   {NULL, '1', NULL, OPTION_HIDDEN, NULL, GRID+1 },
617   {NULL, '2', NULL, OPTION_HIDDEN, NULL, GRID+1 },
618   {NULL, '3', NULL, OPTION_HIDDEN, NULL, GRID+1 },
619   {NULL, '4', NULL, OPTION_HIDDEN, NULL, GRID+1 },
620   {NULL, '5', NULL, OPTION_HIDDEN, NULL, GRID+1 },
621   {NULL, '6', NULL, OPTION_HIDDEN, NULL, GRID+1 },
622   {NULL, '7', NULL, OPTION_HIDDEN, NULL, GRID+1 },
623   {NULL, '8', NULL, OPTION_HIDDEN, NULL, GRID+1 },
624   {NULL, '9', NULL, OPTION_HIDDEN, NULL, GRID+1 },
625
626   {"multi-volume", 'M', 0, 0,
627    N_("create/list/extract multi-volume archive"), GRID+1 },
628   {"tape-length", 'L', N_("NUMBER"), 0,
629    N_("change tape after writing NUMBER x 1024 bytes"), GRID+1 },
630   {"info-script", 'F', N_("NAME"), 0,
631    N_("run script at end of each tape (implies -M)"), GRID+1 },
632   {"new-volume-script", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
633   {"volno-file", VOLNO_FILE_OPTION, N_("FILE"), 0,
634    N_("use/update the volume number in FILE"), GRID+1 },
635 #undef GRID
636
637 #define GRID 70
638   {NULL, 0, NULL, 0,
639    N_("Device blocking:"), GRID },
640
641   {"blocking-factor", 'b', N_("BLOCKS"), 0,
642    N_("BLOCKS x 512 bytes per record"), GRID+1 },
643   {"record-size", RECORD_SIZE_OPTION, N_("NUMBER"), 0,
644    N_("NUMBER of bytes per record, multiple of 512"), GRID+1 },
645   {"ignore-zeros", 'i', 0, 0,
646    N_("ignore zeroed blocks in archive (means EOF)"), GRID+1 },
647   {"read-full-records", 'B', 0, 0,
648    N_("reblock as we read (for 4.2BSD pipes)"), GRID+1 },
649 #undef GRID
650
651 #define GRID 80
652   {NULL, 0, NULL, 0,
653    N_("Archive format selection:"), GRID },
654
655   {"format", 'H', N_("FORMAT"), 0,
656    N_("create archive of the given format"), GRID+1 },
657
658   {NULL, 0, NULL, 0, N_("FORMAT is one of the following:"), GRID+2 },
659   {"  v7", 0, NULL, OPTION_DOC|OPTION_NO_TRANS, N_("old V7 tar format"),
660    GRID+3 },
661   {"  oldgnu", 0, NULL, OPTION_DOC|OPTION_NO_TRANS,
662    N_("GNU format as per tar <= 1.12"), GRID+3 },
663   {"  gnu", 0, NULL, OPTION_DOC|OPTION_NO_TRANS,
664    N_("GNU tar 1.13.x format"), GRID+3 },
665   {"  ustar", 0, NULL, OPTION_DOC|OPTION_NO_TRANS,
666    N_("POSIX 1003.1-1988 (ustar) format"), GRID+3 },
667   {"  pax", 0, NULL, OPTION_DOC|OPTION_NO_TRANS,
668    N_("POSIX 1003.1-2001 (pax) format"), GRID+3 },
669   {"  posix", 0, NULL, OPTION_DOC|OPTION_NO_TRANS, N_("same as pax"), GRID+3 },
670
671   {"old-archive", OLD_ARCHIVE_OPTION, 0, 0, /* FIXME */
672    N_("same as --format=v7"), GRID+8 },
673   {"portability", 0, 0, OPTION_ALIAS, NULL, GRID+8 },
674   {"posix", POSIX_OPTION, 0, 0,
675    N_("same as --format=posix"), GRID+8 },
676   {"pax-option", PAX_OPTION, N_("keyword[[:]=value][,keyword[[:]=value]]..."), 0,
677    N_("control pax keywords"), GRID+8 },
678   {"label", 'V', N_("TEXT"), 0,
679    N_("create archive with volume name TEXT; at list/extract time, use TEXT as a globbing pattern for volume name"), GRID+8 },
680 #undef GRID
681
682 #define GRID 90
683   {NULL, 0, NULL, 0,
684    N_("Compression options:"), GRID },
685   {"auto-compress", 'a', 0, 0,
686    N_("use archive suffix to determine the compression program"), GRID+1 },
687   {"no-auto-compress", NO_AUTO_COMPRESS_OPTION, 0, 0,
688    N_("do not use archive suffix to determine the compression program"),
689    GRID+1 },
690   {"use-compress-program", 'I', N_("PROG"), 0,
691    N_("filter through PROG (must accept -d)"), GRID+1 },
692   /* Note: docstrings for the options below are generated by tar_help_filter */
693   {"bzip2", 'j', 0, 0, NULL, GRID+1 },
694   {"gzip", 'z', 0, 0, NULL, GRID+1 },
695   {"gunzip", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
696   {"ungzip", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
697   {"compress", 'Z', 0, 0, NULL, GRID+1 },
698   {"uncompress", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
699   {"lzip", LZIP_OPTION, 0, 0, NULL, GRID+1 },
700   {"lzma", LZMA_OPTION, 0, 0, NULL, GRID+1 },
701   {"lzop", LZOP_OPTION, 0, 0, NULL, GRID+1 },
702   {"xz", 'J', 0, 0, NULL, GRID+1 },
703 #undef GRID
704
705 #define GRID 100
706   {NULL, 0, NULL, 0,
707    N_("Local file selection:"), GRID },
708
709   {"add-file", ARGP_KEY_ARG, N_("FILE"), 0,
710    N_("add given FILE to the archive (useful if its name starts with a dash)"), GRID+1 },
711   {"directory", 'C', N_("DIR"), 0,
712    N_("change to directory DIR"), GRID+1 },
713   {"files-from", 'T', N_("FILE"), 0,
714    N_("get names to extract or create from FILE"), GRID+1 },
715   {"null", NULL_OPTION, 0, 0,
716    N_("-T reads null-terminated names, disable -C"), GRID+1 },
717   {"no-null", NO_NULL_OPTION, 0, 0,
718    N_("disable the effect of the previous --null option"), GRID+1 },
719   {"unquote", UNQUOTE_OPTION, 0, 0,
720    N_("unquote input file or member names (default)"), GRID+1 },
721   {"no-unquote", NO_UNQUOTE_OPTION, 0, 0,
722    N_("do not unquote input file or member names"), GRID+1 },
723   {"exclude", EXCLUDE_OPTION, N_("PATTERN"), 0,
724    N_("exclude files, given as a PATTERN"), GRID+1 },
725   {"exclude-from", 'X', N_("FILE"), 0,
726    N_("exclude patterns listed in FILE"), GRID+1 },
727   {"exclude-caches", EXCLUDE_CACHES_OPTION, 0, 0,
728    N_("exclude contents of directories containing CACHEDIR.TAG, "
729       "except for the tag file itself"), GRID+1 },
730   {"exclude-caches-under", EXCLUDE_CACHES_UNDER_OPTION, 0, 0,
731    N_("exclude everything under directories containing CACHEDIR.TAG"),
732    GRID+1 },
733   {"exclude-caches-all", EXCLUDE_CACHES_ALL_OPTION, 0, 0,
734    N_("exclude directories containing CACHEDIR.TAG"), GRID+1 },
735   {"exclude-tag", EXCLUDE_TAG_OPTION, N_("FILE"), 0,
736    N_("exclude contents of directories containing FILE, except"
737       " for FILE itself"), GRID+1 },
738   {"exclude-ignore", EXCLUDE_IGNORE_OPTION, N_("FILE"), 0,
739     N_("read exclude patterns for each directory from FILE, if it exists"),
740    GRID+1 }, 
741   {"exclude-ignore-recursive", EXCLUDE_IGNORE_RECURSIVE_OPTION, N_("FILE"), 0,
742     N_("read exclude patterns for each directory and its subdirectories "
743        "from FILE, if it exists"), GRID+1 },
744   {"exclude-tag-under", EXCLUDE_TAG_UNDER_OPTION, N_("FILE"), 0,
745    N_("exclude everything under directories containing FILE"), GRID+1 },
746   {"exclude-tag-all", EXCLUDE_TAG_ALL_OPTION, N_("FILE"), 0,
747    N_("exclude directories containing FILE"), GRID+1 },
748   {"exclude-vcs", EXCLUDE_VCS_OPTION, NULL, 0,
749    N_("exclude version control system directories"), GRID+1 },
750   {"exclude-vcs-ignores", EXCLUDE_VCS_IGNORES_OPTION, NULL, 0,
751    N_("read exclude patterns from the VCS ignore files"), GRID+1 },
752   {"exclude-backups", EXCLUDE_BACKUPS_OPTION, NULL, 0,
753    N_("exclude backup and lock files"), GRID+1 },
754   {"no-recursion", NO_RECURSION_OPTION, 0, 0,
755    N_("avoid descending automatically in directories"), GRID+1 },
756   {"one-file-system", ONE_FILE_SYSTEM_OPTION, 0, 0,
757    N_("stay in local file system when creating archive"), GRID+1 },
758   {"recursion", RECURSION_OPTION, 0, 0,
759    N_("recurse into directories (default)"), GRID+1 },
760   {"absolute-names", 'P', 0, 0,
761    N_("don't strip leading '/'s from file names"), GRID+1 },
762   {"dereference", 'h', 0, 0,
763    N_("follow symlinks; archive and dump the files they point to"), GRID+1 },
764   {"hard-dereference", HARD_DEREFERENCE_OPTION, 0, 0,
765    N_("follow hard links; archive and dump the files they refer to"), GRID+1 },
766   {"starting-file", 'K', N_("MEMBER-NAME"), 0,
767    N_("begin at member MEMBER-NAME when reading the archive"), GRID+1 },
768   {"newer", 'N', N_("DATE-OR-FILE"), 0,
769    N_("only store files newer than DATE-OR-FILE"), GRID+1 },
770   {"after-date", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
771   {"newer-mtime", NEWER_MTIME_OPTION, N_("DATE"), 0,
772    N_("compare date and time when data changed only"), GRID+1 },
773   {"backup", BACKUP_OPTION, N_("CONTROL"), OPTION_ARG_OPTIONAL,
774    N_("backup before removal, choose version CONTROL"), GRID+1 },
775   {"suffix", SUFFIX_OPTION, N_("STRING"), 0,
776    N_("backup before removal, override usual suffix ('~' unless overridden by environment variable SIMPLE_BACKUP_SUFFIX)"), GRID+1 },
777 #undef GRID
778
779 #define GRID 110
780   {NULL, 0, NULL, 0,
781    N_("File name transformations:"), GRID },
782   {"strip-components", STRIP_COMPONENTS_OPTION, N_("NUMBER"), 0,
783    N_("strip NUMBER leading components from file names on extraction"),
784    GRID+1 },
785   {"transform", TRANSFORM_OPTION, N_("EXPRESSION"), 0,
786    N_("use sed replace EXPRESSION to transform file names"), GRID+1 },
787   {"xform", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
788 #undef GRID
789
790 #define GRID 120
791   {NULL, 0, NULL, 0,
792    N_("File name matching options (affect both exclude and include patterns):"),
793    GRID },
794   {"ignore-case", IGNORE_CASE_OPTION, 0, 0,
795    N_("ignore case"), GRID+1 },
796   {"anchored", ANCHORED_OPTION, 0, 0,
797    N_("patterns match file name start"), GRID+1 },
798   {"no-anchored", NO_ANCHORED_OPTION, 0, 0,
799    N_("patterns match after any '/' (default for exclusion)"), GRID+1 },
800   {"no-ignore-case", NO_IGNORE_CASE_OPTION, 0, 0,
801    N_("case sensitive matching (default)"), GRID+1 },
802   {"wildcards", WILDCARDS_OPTION, 0, 0,
803    N_("use wildcards (default for exclusion)"), GRID+1 },
804   {"no-wildcards", NO_WILDCARDS_OPTION, 0, 0,
805    N_("verbatim string matching"), GRID+1 },
806   {"no-wildcards-match-slash", NO_WILDCARDS_MATCH_SLASH_OPTION, 0, 0,
807    N_("wildcards do not match '/'"), GRID+1 },
808   {"wildcards-match-slash", WILDCARDS_MATCH_SLASH_OPTION, 0, 0,
809    N_("wildcards match '/' (default for exclusion)"), GRID+1 },
810 #undef GRID
811
812 #define GRID 130
813   {NULL, 0, NULL, 0,
814    N_("Informative output:"), GRID },
815
816   {"verbose", 'v', 0, 0,
817    N_("verbosely list files processed"), GRID+1 },
818   {"warning", WARNING_OPTION, N_("KEYWORD"), 0,
819    N_("warning control"), GRID+1 },
820   {"checkpoint", CHECKPOINT_OPTION, N_("NUMBER"), OPTION_ARG_OPTIONAL,
821    N_("display progress messages every NUMBERth record (default 10)"),
822    GRID+1 },
823   {"checkpoint-action", CHECKPOINT_ACTION_OPTION, N_("ACTION"), 0,
824    N_("execute ACTION on each checkpoint"),
825    GRID+1 },
826   {"check-links", 'l', 0, 0,
827    N_("print a message if not all links are dumped"), GRID+1 },
828   {"totals", TOTALS_OPTION, N_("SIGNAL"), OPTION_ARG_OPTIONAL,
829    N_("print total bytes after processing the archive; "
830       "with an argument - print total bytes when this SIGNAL is delivered; "
831       "Allowed signals are: SIGHUP, SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; "
832       "the names without SIG prefix are also accepted"), GRID+1 },
833   {"utc", UTC_OPTION, 0, 0,
834    N_("print file modification times in UTC"), GRID+1 },
835   {"full-time", FULL_TIME_OPTION, 0, 0,
836    N_("print file time to its full resolution"), GRID+1 },
837   {"index-file", INDEX_FILE_OPTION, N_("FILE"), 0,
838    N_("send verbose output to FILE"), GRID+1 },
839   {"block-number", 'R', 0, 0,
840    N_("show block number within archive with each message"), GRID+1 },
841   {"interactive", 'w', 0, 0,
842    N_("ask for confirmation for every action"), GRID+1 },
843   {"confirmation", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
844   {"show-defaults", SHOW_DEFAULTS_OPTION, 0, 0,
845    N_("show tar defaults"), GRID+1 },
846   {"show-snapshot-field-ranges", SHOW_SNAPSHOT_FIELD_RANGES_OPTION, 0, 0,
847    N_("show valid ranges for snapshot-file fields"), GRID+1 },
848   {"show-omitted-dirs", SHOW_OMITTED_DIRS_OPTION, 0, 0,
849    N_("when listing or extracting, list each directory that does not match search criteria"), GRID+1 },
850   {"show-transformed-names", SHOW_TRANSFORMED_NAMES_OPTION, 0, 0,
851    N_("show file or archive names after transformation"),
852    GRID+1 },
853   {"show-stored-names", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
854   {"quoting-style", QUOTING_STYLE_OPTION, N_("STYLE"), 0,
855    N_("set name quoting style; see below for valid STYLE values"), GRID+1 },
856   {"quote-chars", QUOTE_CHARS_OPTION, N_("STRING"), 0,
857    N_("additionally quote characters from STRING"), GRID+1 },
858   {"no-quote-chars", NO_QUOTE_CHARS_OPTION, N_("STRING"), 0,
859    N_("disable quoting for characters from STRING"), GRID+1 },
860 #undef GRID
861
862 #define GRID 140
863   {NULL, 0, NULL, 0,
864    N_("Compatibility options:"), GRID },
865
866   {NULL, 'o', 0, 0,
867    N_("when creating, same as --old-archive; when extracting, same as --no-same-owner"), GRID+1 },
868 #undef GRID
869
870 #define GRID 150
871   {NULL, 0, NULL, 0,
872    N_("Other options:"), GRID },
873
874   {"restrict", RESTRICT_OPTION, 0, 0,
875    N_("disable use of some potentially harmful options"), -1 },
876 #undef GRID
877
878   {0, 0, 0, 0, 0, 0}
879 };
880
881 static char const *const atime_preserve_args[] =
882 {
883   "replace", "system", NULL
884 };
885
886 static enum atime_preserve const atime_preserve_types[] =
887 {
888   replace_atime_preserve, system_atime_preserve
889 };
890
891 /* Make sure atime_preserve_types has as much entries as atime_preserve_args
892    (minus 1 for NULL guard) */
893 ARGMATCH_VERIFY (atime_preserve_args, atime_preserve_types);
894
895 /* Wildcard matching settings */
896 enum wildcards
897   {
898     default_wildcards, /* For exclusion == enable_wildcards,
899                           for inclusion == disable_wildcards */
900     disable_wildcards,
901     enable_wildcards
902   };
903
904 struct tar_args        /* Variables used during option parsing */
905 {
906   struct textual_date *textual_date; /* Keeps the arguments to --newer-mtime
907                                         and/or --date option if they are
908                                         textual dates */
909   enum wildcards wildcards;        /* Wildcard settings (--wildcards/
910                                       --no-wildcards) */
911   int matching_flags;              /* exclude_fnmatch options */
912   int include_anchored;            /* Pattern anchoring options used for
913                                       file inclusion */
914   bool o_option;                   /* True if -o option was given */
915   bool pax_option;                 /* True if --pax-option was given */
916   char const *backup_suffix_string;   /* --suffix option argument */
917   char const *version_control_string; /* --backup option argument */
918   bool input_files;                /* True if some input files where given */
919   int compress_autodetect;         /* True if compression autodetection should
920                                       be attempted when creating archives */
921 };
922
923 \f
924 #define MAKE_EXCL_OPTIONS(args) \
925  ((((args)->wildcards != disable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
926   | (args)->matching_flags \
927   | recursion_option)
928
929 #define MAKE_INCL_OPTIONS(args) \
930  ((((args)->wildcards == enable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
931   | (args)->include_anchored \
932   | (args)->matching_flags \
933   | recursion_option)
934
935 static char const * const vcs_file_table[] = {
936   /* CVS: */
937   "CVS",
938   ".cvsignore",
939   /* RCS: */
940   "RCS",
941   /* SCCS: */
942   "SCCS",
943   /* SVN: */
944   ".svn",
945   /* git: */
946   ".git",
947   ".gitignore",
948   /* Arch: */
949   ".arch-ids",
950   "{arch}",
951   "=RELEASE-ID",
952   "=meta-update",
953   "=update",
954   /* Bazaar */
955   ".bzr",
956   ".bzrignore",
957   ".bzrtags",
958   /* Mercurial */
959   ".hg",
960   ".hgignore",
961   ".hgtags",
962   /* darcs */
963   "_darcs",
964   NULL
965 };
966
967 static char const * const backup_file_table[] = {
968   ".#*",
969   "*~",
970   "#*#",
971   NULL
972 };
973
974 static void
975 add_exclude_array (char const * const * fv, int opts)
976 {
977   int i;
978
979   for (i = 0; fv[i]; i++)
980     add_exclude (excluded, fv[i], opts);
981 }
982
983 \f
984 static char *
985 format_default_settings (void)
986 {
987   return xasprintf (
988             "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s"
989 #ifdef REMOTE_SHELL
990             " --rsh-command=%s"
991 #endif
992             ,
993             archive_format_string (DEFAULT_ARCHIVE_FORMAT),
994             DEFAULT_ARCHIVE, DEFAULT_BLOCKING,
995             quoting_style_args[DEFAULT_QUOTING_STYLE],
996             DEFAULT_RMT_COMMAND
997 #ifdef REMOTE_SHELL
998             , REMOTE_SHELL
999 #endif
1000             );
1001 }
1002
1003 \f
1004 static void
1005 set_subcommand_option (enum subcommand subcommand)
1006 {
1007   if (subcommand_option != UNKNOWN_SUBCOMMAND
1008       && subcommand_option != subcommand)
1009     USAGE_ERROR ((0, 0,
1010                   _("You may not specify more than one '-Acdtrux', '--delete' or  '--test-label' option")));
1011
1012   subcommand_option = subcommand;
1013 }
1014
1015 static void
1016 set_use_compress_program_option (const char *string)
1017 {
1018   if (use_compress_program_option
1019       && strcmp (use_compress_program_option, string) != 0)
1020     USAGE_ERROR ((0, 0, _("Conflicting compression options")));
1021
1022   use_compress_program_option = string;
1023 }
1024 \f
1025 static void
1026 sigstat (int signo)
1027 {
1028   compute_duration ();
1029   print_total_stats ();
1030 #ifndef HAVE_SIGACTION
1031   signal (signo, sigstat);
1032 #endif
1033 }
1034
1035 static void
1036 stat_on_signal (int signo)
1037 {
1038 #ifdef HAVE_SIGACTION
1039 # ifndef SA_RESTART
1040 #  define SA_RESTART 0
1041 # endif
1042   struct sigaction act;
1043   act.sa_handler = sigstat;
1044   sigemptyset (&act.sa_mask);
1045   act.sa_flags = SA_RESTART;
1046   sigaction (signo, &act, NULL);
1047 #else
1048   signal (signo, sigstat);
1049 #endif
1050 }
1051
1052 static void
1053 set_stat_signal (const char *name)
1054 {
1055   static struct sigtab
1056   {
1057     char const *name;
1058     int signo;
1059   } const sigtab[] = {
1060     { "SIGUSR1", SIGUSR1 },
1061     { "USR1", SIGUSR1 },
1062     { "SIGUSR2", SIGUSR2 },
1063     { "USR2", SIGUSR2 },
1064     { "SIGHUP", SIGHUP },
1065     { "HUP", SIGHUP },
1066     { "SIGINT", SIGINT },
1067     { "INT", SIGINT },
1068     { "SIGQUIT", SIGQUIT },
1069     { "QUIT", SIGQUIT }
1070   };
1071   struct sigtab const *p;
1072
1073   for (p = sigtab; p < sigtab + sizeof (sigtab) / sizeof (sigtab[0]); p++)
1074     if (strcmp (p->name, name) == 0)
1075       {
1076         stat_on_signal (p->signo);
1077         return;
1078       }
1079   FATAL_ERROR ((0, 0, _("Unknown signal name: %s"), name));
1080 }
1081
1082 \f
1083 struct textual_date
1084 {
1085   struct textual_date *next;
1086   struct timespec ts;
1087   const char *option;
1088   char *date;
1089 };
1090
1091 static int
1092 get_date_or_file (struct tar_args *args, const char *option,
1093                   const char *str, struct timespec *ts)
1094 {
1095   if (FILE_SYSTEM_PREFIX_LEN (str) != 0
1096       || ISSLASH (*str)
1097       || *str == '.')
1098     {
1099       struct stat st;
1100       if (stat (str, &st) != 0)
1101         {
1102           stat_error (str);
1103           USAGE_ERROR ((0, 0, _("Date sample file not found")));
1104         }
1105       *ts = get_stat_mtime (&st);
1106     }
1107   else
1108     {
1109       if (! parse_datetime (ts, str, NULL))
1110         {
1111           WARN ((0, 0, _("Substituting %s for unknown date format %s"),
1112                  tartime (*ts, false), quote (str)));
1113           ts->tv_nsec = 0;
1114           return 1;
1115         }
1116       else
1117         {
1118           struct textual_date *p = xmalloc (sizeof (*p));
1119           p->ts = *ts;
1120           p->option = option;
1121           p->date = xstrdup (str);
1122           p->next = args->textual_date;
1123           args->textual_date = p;
1124         }
1125     }
1126   return 0;
1127 }
1128
1129 static void
1130 report_textual_dates (struct tar_args *args)
1131 {
1132   struct textual_date *p;
1133   for (p = args->textual_date; p; )
1134     {
1135       struct textual_date *next = p->next;
1136       if (verbose_option)
1137         {
1138           char const *treated_as = tartime (p->ts, true);
1139           if (strcmp (p->date, treated_as) != 0)
1140             WARN ((0, 0, _("Option %s: Treating date '%s' as %s"),
1141                    p->option, p->date, treated_as));
1142         }
1143       free (p->date);
1144       free (p);
1145       p = next;
1146     }
1147 }
1148
1149 \f
1150 static bool files_from_option;  /* When set, tar will not refuse to create
1151                                    empty archives */
1152
1153 /* Default density numbers for [0-9][lmh] device specifications */
1154
1155 #if defined DEVICE_PREFIX && !defined DENSITY_LETTER
1156 # ifndef LOW_DENSITY_NUM
1157 #  define LOW_DENSITY_NUM 0
1158 # endif
1159
1160 # ifndef MID_DENSITY_NUM
1161 #  define MID_DENSITY_NUM 8
1162 # endif
1163
1164 # ifndef HIGH_DENSITY_NUM
1165 #  define HIGH_DENSITY_NUM 16
1166 # endif
1167 #endif
1168
1169 \f
1170 static char *
1171 tar_help_filter (int key, const char *text, void *input)
1172 {
1173   struct obstack stk;
1174   char *s;
1175
1176   switch (key)
1177     {
1178     default:
1179       s = (char*) text;
1180       break;
1181
1182     case 'j':
1183       s = xasprintf (_("filter the archive through %s"), BZIP2_PROGRAM);
1184       break;
1185
1186     case 'z':
1187       s = xasprintf (_("filter the archive through %s"), GZIP_PROGRAM);
1188       break;
1189
1190     case 'Z':
1191       s = xasprintf (_("filter the archive through %s"), COMPRESS_PROGRAM);
1192       break;
1193
1194     case LZIP_OPTION:
1195       s = xasprintf (_("filter the archive through %s"), LZIP_PROGRAM);
1196       break;
1197
1198     case LZMA_OPTION:
1199       s = xasprintf (_("filter the archive through %s"), LZMA_PROGRAM);
1200       break;
1201
1202     case LZOP_OPTION:
1203       s = xasprintf (_("filter the archive through %s"), LZOP_PROGRAM);
1204       
1205     case 'J':
1206       s = xasprintf (_("filter the archive through %s"), XZ_PROGRAM);
1207       break;
1208
1209     case ARGP_KEY_HELP_EXTRA:
1210       {
1211         const char *tstr;
1212
1213         obstack_init (&stk);
1214         tstr = _("Valid arguments for the --quoting-style option are:");
1215         obstack_grow (&stk, tstr, strlen (tstr));
1216         obstack_grow (&stk, "\n\n", 2);
1217         tar_list_quoting_styles (&stk, "  ");
1218         tstr = _("\n*This* tar defaults to:\n");
1219         obstack_grow (&stk, tstr, strlen (tstr));
1220         s = format_default_settings ();
1221         obstack_grow (&stk, s, strlen (s));
1222         obstack_1grow (&stk, '\n');
1223         obstack_1grow (&stk, 0);
1224         s = xstrdup (obstack_finish (&stk));
1225         obstack_free (&stk, NULL);
1226       }
1227     }
1228   return s;
1229 }
1230 \f
1231 static char *
1232 expand_pax_option (struct tar_args *targs, const char *arg)
1233 {
1234   struct obstack stk;
1235   char *res;
1236
1237   obstack_init (&stk);
1238   while (*arg)
1239     {
1240       size_t seglen = strcspn (arg, ",");
1241       char *p = memchr (arg, '=', seglen);
1242       if (p)
1243         {
1244           size_t len = p - arg + 1;
1245           obstack_grow (&stk, arg, len);
1246           len = seglen - len;
1247           for (++p; *p && isspace ((unsigned char) *p); p++)
1248             len--;
1249           if (*p == '{' && p[len-1] == '}')
1250             {
1251               struct timespec ts;
1252               char *tmp = xmalloc (len);
1253               memcpy (tmp, p + 1, len-2);
1254               tmp[len-2] = 0;
1255               if (get_date_or_file (targs, "--pax-option", tmp, &ts) == 0)
1256                 {
1257                   char buf[TIMESPEC_STRSIZE_BOUND];
1258                   char const *s = code_timespec (ts, buf);
1259                   obstack_grow (&stk, s, strlen (s));
1260                 }
1261               else
1262                 obstack_grow (&stk, p, len);
1263               free (tmp);
1264             }
1265           else
1266             obstack_grow (&stk, p, len);
1267         }
1268       else
1269         obstack_grow (&stk, arg, seglen);
1270
1271       arg += seglen;
1272       if (*arg)
1273         {
1274           obstack_1grow (&stk, *arg);
1275           arg++;
1276         }
1277     }
1278   obstack_1grow (&stk, 0);
1279   res = xstrdup (obstack_finish (&stk));
1280   obstack_free (&stk, NULL);
1281   return res;
1282 }
1283
1284 \f
1285 static uintmax_t
1286 parse_owner_group (char *arg, uintmax_t field_max, char const **name_option)
1287 {
1288   uintmax_t u = UINTMAX_MAX;
1289   char *end;
1290   char const *name = 0;
1291   char const *invalid_num = 0;
1292   char *colon = strchr (arg, ':');
1293
1294   if (colon)
1295     {
1296       char const *num = colon + 1;
1297       *colon = '\0';
1298       if (*arg)
1299         name = arg;
1300       if (num && (! (xstrtoumax (num, &end, 10, &u, "") == LONGINT_OK
1301                      && u <= field_max)))
1302         invalid_num = num;
1303     }
1304   else
1305     {
1306       uintmax_t u1;
1307       switch ('0' <= *arg && *arg <= '9'
1308               ? xstrtoumax (arg, &end, 10, &u1, "")
1309               : LONGINT_INVALID)
1310         {
1311         default:
1312           name = arg;
1313           break;
1314
1315         case LONGINT_OK:
1316           if (u1 <= field_max)
1317             {
1318               u = u1;
1319               break;
1320             }
1321           /* Fall through.  */
1322         case LONGINT_OVERFLOW:
1323           invalid_num = arg;
1324           break;
1325         }
1326     }
1327
1328   if (invalid_num)
1329     FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (invalid_num),
1330                   _("Invalid owner or group ID")));
1331   if (name)
1332     *name_option = name;
1333   return u;
1334 }
1335
1336 #define TAR_SIZE_SUFFIXES "bBcGgkKMmPTtw"
1337
1338 /* Either NL or NUL, as decided by the --null option.  */
1339 static char filename_terminator;
1340
1341 static char const *const sort_mode_arg[] = {
1342   "none",
1343   "name",
1344   "inode",
1345   NULL
1346 };
1347
1348 static int sort_mode_flag[] = {
1349     SAVEDIR_SORT_NONE,
1350     SAVEDIR_SORT_NAME,
1351     SAVEDIR_SORT_INODE
1352 };
1353
1354 ARGMATCH_VERIFY (sort_mode_arg, sort_mode_flag);
1355
1356 static error_t
1357 parse_opt (int key, char *arg, struct argp_state *state)
1358 {
1359   struct tar_args *args = state->input;
1360
1361   switch (key)
1362     {
1363     case ARGP_KEY_ARG:
1364       /* File name or non-parsed option, because of ARGP_IN_ORDER */
1365       name_add_name (arg, MAKE_INCL_OPTIONS (args));
1366       args->input_files = true;
1367       break;
1368
1369     case 'A':
1370       set_subcommand_option (CAT_SUBCOMMAND);
1371       break;
1372
1373     case 'a':
1374       args->compress_autodetect = true;
1375       break;
1376
1377     case NO_AUTO_COMPRESS_OPTION:
1378       args->compress_autodetect = false;
1379       break;
1380
1381     case 'b':
1382       {
1383         uintmax_t u;
1384         if (! (xstrtoumax (arg, 0, 10, &u, "") == LONGINT_OK
1385                && u == (blocking_factor = u)
1386                && 0 < blocking_factor
1387                && u == (record_size = u * BLOCKSIZE) / BLOCKSIZE))
1388           USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
1389                         _("Invalid blocking factor")));
1390       }
1391       break;
1392
1393     case 'B':
1394       /* Try to reblock input records.  For reading 4.2BSD pipes.  */
1395
1396       /* It would surely make sense to exchange -B and -R, but it seems
1397          that -B has been used for a long while in Sun tar and most
1398          BSD-derived systems.  This is a consequence of the block/record
1399          terminology confusion.  */
1400
1401       read_full_records_option = true;
1402       break;
1403
1404     case 'c':
1405       set_subcommand_option (CREATE_SUBCOMMAND);
1406       break;
1407
1408     case 'C':
1409       name_add_dir (arg);
1410       break;
1411
1412     case 'd':
1413       set_subcommand_option (DIFF_SUBCOMMAND);
1414       break;
1415
1416     case 'f':
1417       if (archive_names == allocated_archive_names)
1418         archive_name_array = x2nrealloc (archive_name_array,
1419                                          &allocated_archive_names,
1420                                          sizeof (archive_name_array[0]));
1421
1422       archive_name_array[archive_names++] = arg;
1423       break;
1424
1425     case 'F':
1426       /* Since -F is only useful with -M, make it implied.  Run this
1427          script at the end of each tape.  */
1428
1429       info_script_option = arg;
1430       multi_volume_option = true;
1431       break;
1432
1433     case FULL_TIME_OPTION:
1434       full_time_option = true;
1435       break;
1436
1437     case 'g':
1438       listed_incremental_option = arg;
1439       after_date_option = true;
1440       /* Fall through.  */
1441
1442     case 'G':
1443       /* We are making an incremental dump (FIXME: are we?); save
1444          directories at the beginning of the archive, and include in each
1445          directory its contents.  */
1446
1447       incremental_option = true;
1448       break;
1449
1450     case 'h':
1451       /* Follow symbolic links.  */
1452       dereference_option = true;
1453       break;
1454
1455     case HARD_DEREFERENCE_OPTION:
1456       hard_dereference_option = true;
1457       break;
1458
1459     case 'i':
1460       /* Ignore zero blocks (eofs).  This can't be the default,
1461          because Unix tar writes two blocks of zeros, then pads out
1462          the record with garbage.  */
1463
1464       ignore_zeros_option = true;
1465       break;
1466
1467     case 'j':
1468       set_use_compress_program_option (BZIP2_PROGRAM);
1469       break;
1470
1471     case 'J':
1472       set_use_compress_program_option (XZ_PROGRAM);
1473       break;
1474
1475     case 'k':
1476       /* Don't replace existing files.  */
1477       old_files_option = KEEP_OLD_FILES;
1478       break;
1479
1480     case 'K':
1481       starting_file_option = true;
1482       addname (arg, 0, true, NULL);
1483       break;
1484
1485     case ONE_FILE_SYSTEM_OPTION:
1486       /* When dumping directories, don't dump files/subdirectories
1487          that are on other filesystems. */
1488       one_file_system_option = true;
1489       break;
1490
1491     case ONE_TOP_LEVEL_OPTION:
1492       one_top_level_option = true;
1493       one_top_level_dir = arg;
1494       break;
1495
1496     case 'l':
1497       check_links_option = 1;
1498       break;
1499
1500     case 'L':
1501       {
1502         uintmax_t u;
1503         char *p;
1504
1505         if (xstrtoumax (arg, &p, 10, &u, TAR_SIZE_SUFFIXES) != LONGINT_OK)
1506           USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
1507                         _("Invalid tape length")));
1508         if (p > arg && !strchr (TAR_SIZE_SUFFIXES, p[-1]))
1509           tape_length_option = 1024 * (tarlong) u;
1510         else
1511           tape_length_option = (tarlong) u;
1512         multi_volume_option = true;
1513       }
1514       break;
1515
1516     case LEVEL_OPTION:
1517       {
1518         char *p;
1519         incremental_level = strtoul (arg, &p, 10);
1520         if (*p)
1521           USAGE_ERROR ((0, 0, _("Invalid incremental level value")));
1522       }
1523       break;
1524
1525     case LZIP_OPTION:
1526       set_use_compress_program_option (LZIP_PROGRAM);
1527       break;
1528
1529     case LZMA_OPTION:
1530       set_use_compress_program_option (LZMA_PROGRAM);
1531       break;
1532
1533     case LZOP_OPTION:
1534       set_use_compress_program_option (LZOP_PROGRAM);
1535       break;
1536
1537     case 'm':
1538       touch_option = true;
1539       break;
1540
1541     case 'M':
1542       /* Make multivolume archive: when we can't write any more into
1543          the archive, re-open it, and continue writing.  */
1544
1545       multi_volume_option = true;
1546       break;
1547
1548     case MTIME_OPTION:
1549       get_date_or_file (args, "--mtime", arg, &mtime_option);
1550       set_mtime_option = true;
1551       break;
1552
1553     case 'n':
1554       seek_option = 1;
1555       break;
1556
1557     case NO_SEEK_OPTION:
1558       seek_option = 0;
1559       break;
1560
1561     case 'N':
1562       after_date_option = true;
1563       /* Fall through.  */
1564
1565     case NEWER_MTIME_OPTION:
1566       if (NEWER_OPTION_INITIALIZED (newer_mtime_option))
1567         USAGE_ERROR ((0, 0, _("More than one threshold date")));
1568       get_date_or_file (args,
1569                         key == NEWER_MTIME_OPTION ? "--newer-mtime"
1570                         : "--after-date", arg, &newer_mtime_option);
1571       break;
1572
1573     case 'o':
1574       args->o_option = true;
1575       break;
1576
1577     case 'O':
1578       to_stdout_option = true;
1579       break;
1580
1581     case 'p':
1582       same_permissions_option = true;
1583       break;
1584
1585     case 'P':
1586       absolute_names_option = true;
1587       break;
1588
1589     case 'r':
1590       set_subcommand_option (APPEND_SUBCOMMAND);
1591       break;
1592
1593     case 'R':
1594       /* Print block numbers for debugging bad tar archives.  */
1595
1596       /* It would surely make sense to exchange -B and -R, but it seems
1597          that -B has been used for a long while in Sun tar and most
1598          BSD-derived systems.  This is a consequence of the block/record
1599          terminology confusion.  */
1600
1601       block_number_option = true;
1602       break;
1603
1604     case 's':
1605       /* Names to extract are sorted.  */
1606
1607       same_order_option = true;
1608       break;
1609
1610     case 'S':
1611       sparse_option = true;
1612       break;
1613
1614     case SKIP_OLD_FILES_OPTION:
1615       old_files_option = SKIP_OLD_FILES;
1616       break;
1617
1618     case SPARSE_VERSION_OPTION:
1619       sparse_option = true;
1620       {
1621         char *p;
1622         tar_sparse_major = strtoul (arg, &p, 10);
1623         if (*p)
1624           {
1625             if (*p != '.')
1626               USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1627             tar_sparse_minor = strtoul (p + 1, &p, 10);
1628             if (*p)
1629               USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1630           }
1631       }
1632       break;
1633
1634     case 't':
1635       set_subcommand_option (LIST_SUBCOMMAND);
1636       verbose_option++;
1637       break;
1638
1639     case TEST_LABEL_OPTION:
1640       set_subcommand_option (TEST_LABEL_SUBCOMMAND);
1641       break;
1642
1643     case 'T':
1644       name_add_file (arg, filename_terminator);
1645       /* Indicate we've been given -T option. This is for backward
1646          compatibility only, so that `tar cfT archive /dev/null will
1647          succeed */
1648       files_from_option = true;
1649       break;
1650
1651     case 'u':
1652       set_subcommand_option (UPDATE_SUBCOMMAND);
1653       break;
1654
1655     case 'U':
1656       old_files_option = UNLINK_FIRST_OLD_FILES;
1657       break;
1658
1659     case UTC_OPTION:
1660       utc_option = true;
1661       break;
1662
1663     case 'v':
1664       verbose_option++;
1665       warning_option |= WARN_VERBOSE_WARNINGS;
1666       break;
1667
1668     case 'V':
1669       volume_label_option = arg;
1670       break;
1671
1672     case 'w':
1673       interactive_option = true;
1674       break;
1675
1676     case 'W':
1677       verify_option = true;
1678       break;
1679
1680     case 'x':
1681       set_subcommand_option (EXTRACT_SUBCOMMAND);
1682       break;
1683
1684     case 'X':
1685       if (add_exclude_file (add_exclude, excluded, arg,
1686                             MAKE_EXCL_OPTIONS (args), '\n')
1687           != 0)
1688         {
1689           int e = errno;
1690           FATAL_ERROR ((0, e, "%s", quotearg_colon (arg)));
1691         }
1692       break;
1693
1694     case 'z':
1695       set_use_compress_program_option (GZIP_PROGRAM);
1696       break;
1697
1698     case 'Z':
1699       set_use_compress_program_option (COMPRESS_PROGRAM);
1700       break;
1701
1702     case ANCHORED_OPTION:
1703       args->matching_flags |= EXCLUDE_ANCHORED;
1704       break;
1705
1706     case ATIME_PRESERVE_OPTION:
1707       atime_preserve_option =
1708         (arg
1709          ? XARGMATCH ("--atime-preserve", arg,
1710                       atime_preserve_args, atime_preserve_types)
1711          : replace_atime_preserve);
1712       if (! O_NOATIME && atime_preserve_option == system_atime_preserve)
1713         FATAL_ERROR ((0, 0,
1714                       _("--atime-preserve='system' is not supported"
1715                         " on this platform")));
1716       break;
1717
1718     case CHECK_DEVICE_OPTION:
1719       check_device_option = true;
1720       break;
1721
1722     case NO_CHECK_DEVICE_OPTION:
1723       check_device_option = false;
1724       break;
1725
1726     case CHECKPOINT_OPTION:
1727       if (arg)
1728         {
1729           char *p;
1730
1731           if (*arg == '.')
1732             {
1733               checkpoint_compile_action (".");
1734               arg++;
1735             }
1736           checkpoint_option = strtoul (arg, &p, 0);
1737           if (*p)
1738             FATAL_ERROR ((0, 0,
1739                           _("--checkpoint value is not an integer")));
1740         }
1741       else
1742         checkpoint_option = DEFAULT_CHECKPOINT;
1743       break;
1744
1745     case CHECKPOINT_ACTION_OPTION:
1746       checkpoint_compile_action (arg);
1747       break;
1748
1749     case BACKUP_OPTION:
1750       backup_option = true;
1751       if (arg)
1752         args->version_control_string = arg;
1753       break;
1754
1755     case DELAY_DIRECTORY_RESTORE_OPTION:
1756       delay_directory_restore_option = true;
1757       break;
1758
1759     case NO_DELAY_DIRECTORY_RESTORE_OPTION:
1760       delay_directory_restore_option = false;
1761       break;
1762
1763     case DELETE_OPTION:
1764       set_subcommand_option (DELETE_SUBCOMMAND);
1765       break;
1766
1767     case EXCLUDE_BACKUPS_OPTION:
1768       add_exclude_array (backup_file_table, EXCLUDE_WILDCARDS);
1769       break;
1770
1771     case EXCLUDE_OPTION:
1772       add_exclude (excluded, arg, MAKE_EXCL_OPTIONS (args));
1773       break;
1774
1775     case EXCLUDE_CACHES_OPTION:
1776       add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_contents,
1777                          cachedir_file_p);
1778       break;
1779
1780     case EXCLUDE_CACHES_UNDER_OPTION:
1781       add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_under,
1782                          cachedir_file_p);
1783       break;
1784
1785     case EXCLUDE_CACHES_ALL_OPTION:
1786       add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_all,
1787                          cachedir_file_p);
1788       break;
1789
1790     case EXCLUDE_IGNORE_OPTION:
1791       excfile_add (arg, EXCL_NON_RECURSIVE);
1792       break;
1793
1794     case EXCLUDE_IGNORE_RECURSIVE_OPTION:
1795       excfile_add (arg, EXCL_RECURSIVE);
1796       break;
1797       
1798     case EXCLUDE_TAG_OPTION:
1799       add_exclusion_tag (arg, exclusion_tag_contents, NULL);
1800       break;
1801
1802     case EXCLUDE_TAG_UNDER_OPTION:
1803       add_exclusion_tag (arg, exclusion_tag_under, NULL);
1804       break;
1805
1806     case EXCLUDE_TAG_ALL_OPTION:
1807       add_exclusion_tag (arg, exclusion_tag_all, NULL);
1808       break;
1809
1810     case EXCLUDE_VCS_OPTION:
1811       add_exclude_array (vcs_file_table, 0);
1812       break;
1813
1814     case EXCLUDE_VCS_IGNORES_OPTION:
1815       exclude_vcs_ignores ();
1816       break;
1817       
1818     case FORCE_LOCAL_OPTION:
1819       force_local_option = true;
1820       break;
1821
1822     case 'H':
1823       set_archive_format (arg);
1824       break;
1825
1826     case INDEX_FILE_OPTION:
1827       index_file_name = arg;
1828       break;
1829
1830     case IGNORE_CASE_OPTION:
1831       args->matching_flags |= FNM_CASEFOLD;
1832       break;
1833
1834     case IGNORE_COMMAND_ERROR_OPTION:
1835       ignore_command_error_option = true;
1836       break;
1837
1838     case IGNORE_FAILED_READ_OPTION:
1839       ignore_failed_read_option = true;
1840       break;
1841
1842     case KEEP_DIRECTORY_SYMLINK_OPTION:
1843       keep_directory_symlink_option = true;
1844       break;
1845
1846     case KEEP_NEWER_FILES_OPTION:
1847       old_files_option = KEEP_NEWER_FILES;
1848       break;
1849
1850     case GROUP_OPTION:
1851       {
1852         uintmax_t u = parse_owner_group (arg, TYPE_MAXIMUM (gid_t),
1853                                          &group_name_option);
1854         if (u == UINTMAX_MAX)
1855           {
1856             group_option = -1;
1857             if (group_name_option)
1858               gname_to_gid (group_name_option, &group_option);
1859           }
1860         else
1861           group_option = u;
1862       }
1863       break;
1864
1865     case MODE_OPTION:
1866       mode_option = mode_compile (arg);
1867       if (!mode_option)
1868         FATAL_ERROR ((0, 0, _("Invalid mode given on option")));
1869       initial_umask = umask (0);
1870       umask (initial_umask);
1871       break;
1872
1873     case NO_ANCHORED_OPTION:
1874       args->include_anchored = 0; /* Clear the default for comman line args */
1875       args->matching_flags &= ~ EXCLUDE_ANCHORED;
1876       break;
1877
1878     case NO_IGNORE_CASE_OPTION:
1879       args->matching_flags &= ~ FNM_CASEFOLD;
1880       break;
1881
1882     case NO_IGNORE_COMMAND_ERROR_OPTION:
1883       ignore_command_error_option = false;
1884       break;
1885
1886     case NO_OVERWRITE_DIR_OPTION:
1887       old_files_option = NO_OVERWRITE_DIR_OLD_FILES;
1888       break;
1889
1890     case NO_QUOTE_CHARS_OPTION:
1891       for (;*arg; arg++)
1892         set_char_quoting (NULL, *arg, 0);
1893       break;
1894
1895     case NO_WILDCARDS_OPTION:
1896       args->wildcards = disable_wildcards;
1897       break;
1898
1899     case NO_WILDCARDS_MATCH_SLASH_OPTION:
1900       args->matching_flags |= FNM_FILE_NAME;
1901       break;
1902
1903     case NULL_OPTION:
1904       filename_terminator = '\0';
1905       break;
1906
1907     case NO_NULL_OPTION:
1908       filename_terminator = '\n';
1909       break;
1910
1911     case NUMERIC_OWNER_OPTION:
1912       numeric_owner_option = true;
1913       break;
1914
1915     case OCCURRENCE_OPTION:
1916       if (!arg)
1917         occurrence_option = 1;
1918       else
1919         {
1920           uintmax_t u;
1921           if (xstrtoumax (arg, 0, 10, &u, "") == LONGINT_OK)
1922             occurrence_option = u;
1923           else
1924             FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
1925                           _("Invalid number")));
1926         }
1927       break;
1928
1929     case OLD_ARCHIVE_OPTION:
1930       set_archive_format ("v7");
1931       break;
1932
1933     case OVERWRITE_DIR_OPTION:
1934       old_files_option = DEFAULT_OLD_FILES;
1935       break;
1936
1937     case OVERWRITE_OPTION:
1938       old_files_option = OVERWRITE_OLD_FILES;
1939       break;
1940
1941     case OWNER_OPTION:
1942       {
1943         uintmax_t u = parse_owner_group (arg, TYPE_MAXIMUM (uid_t),
1944                                          &owner_name_option);
1945         if (u == UINTMAX_MAX)
1946           {
1947             owner_option = -1;
1948             if (owner_name_option)
1949               uname_to_uid (owner_name_option, &owner_option);
1950           }
1951         else
1952           owner_option = u;
1953       }
1954       break;
1955
1956     case QUOTE_CHARS_OPTION:
1957       for (;*arg; arg++)
1958         set_char_quoting (NULL, *arg, 1);
1959       break;
1960
1961     case QUOTING_STYLE_OPTION:
1962       tar_set_quoting_style (arg);
1963       break;
1964
1965     case PAX_OPTION:
1966       {
1967         char *tmp = expand_pax_option (args, arg);
1968         args->pax_option = true;
1969         xheader_set_option (tmp);
1970         free (tmp);
1971       }
1972       break;
1973
1974     case POSIX_OPTION:
1975       set_archive_format ("posix");
1976       break;
1977
1978     case PRESERVE_OPTION:
1979       /* FIXME: What it is good for? */
1980       same_permissions_option = true;
1981       same_order_option = true;
1982       WARN ((0, 0, _("The --preserve option is deprecated, "
1983                      "use --preserve-permissions --preserve-order instead")));
1984       break;
1985
1986     case RECORD_SIZE_OPTION:
1987       {
1988         uintmax_t u;
1989
1990         if (! (xstrtoumax (arg, NULL, 10, &u, TAR_SIZE_SUFFIXES) == LONGINT_OK
1991                && u == (size_t) u))
1992           USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
1993                         _("Invalid record size")));
1994         record_size = u;
1995         if (record_size % BLOCKSIZE != 0)
1996           USAGE_ERROR ((0, 0, _("Record size must be a multiple of %d."),
1997                         BLOCKSIZE));
1998         blocking_factor = record_size / BLOCKSIZE;
1999       }
2000       break;
2001
2002     case RECURSIVE_UNLINK_OPTION:
2003       recursive_unlink_option = true;
2004       break;
2005
2006     case REMOVE_FILES_OPTION:
2007       remove_files_option = true;
2008       break;
2009
2010     case RESTRICT_OPTION:
2011       restrict_option = true;
2012       break;
2013
2014     case RMT_COMMAND_OPTION:
2015       rmt_command = arg;
2016       break;
2017
2018     case RSH_COMMAND_OPTION:
2019       rsh_command_option = arg;
2020       break;
2021
2022     case SHOW_DEFAULTS_OPTION:
2023       {
2024         char *s = format_default_settings ();
2025         printf ("%s\n", s);
2026         close_stdout ();
2027         free (s);
2028         exit (0);
2029       }
2030
2031     case SHOW_SNAPSHOT_FIELD_RANGES_OPTION:
2032       show_snapshot_field_ranges ();
2033       close_stdout ();
2034       exit (0);
2035
2036     case STRIP_COMPONENTS_OPTION:
2037       {
2038         uintmax_t u;
2039         if (! (xstrtoumax (arg, 0, 10, &u, "") == LONGINT_OK
2040                && u == (size_t) u))
2041           USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
2042                         _("Invalid number of elements")));
2043         strip_name_components = u;
2044       }
2045       break;
2046
2047     case SHOW_OMITTED_DIRS_OPTION:
2048       show_omitted_dirs_option = true;
2049       break;
2050
2051     case SHOW_TRANSFORMED_NAMES_OPTION:
2052       show_transformed_names_option = true;
2053       break;
2054
2055     case SORT_OPTION:
2056       savedir_sort_order = XARGMATCH ("--sort", arg,
2057                                       sort_mode_arg, sort_mode_flag);
2058       break;
2059
2060     case SUFFIX_OPTION:
2061       backup_option = true;
2062       args->backup_suffix_string = arg;
2063       break;
2064
2065     case TO_COMMAND_OPTION:
2066       if (to_command_option)
2067         USAGE_ERROR ((0, 0, _("Only one --to-command option allowed")));
2068       to_command_option = arg;
2069       break;
2070
2071     case TOTALS_OPTION:
2072       if (arg)
2073         set_stat_signal (arg);
2074       else
2075         totals_option = true;
2076       break;
2077
2078     case TRANSFORM_OPTION:
2079       set_transform_expr (arg);
2080       break;
2081
2082     case 'I':
2083       set_use_compress_program_option (arg);
2084       break;
2085
2086     case VOLNO_FILE_OPTION:
2087       volno_file_option = arg;
2088       break;
2089
2090     case WILDCARDS_OPTION:
2091       args->wildcards = enable_wildcards;
2092       break;
2093
2094     case WILDCARDS_MATCH_SLASH_OPTION:
2095       args->matching_flags &= ~ FNM_FILE_NAME;
2096       break;
2097
2098     case NO_RECURSION_OPTION:
2099       recursion_option = 0;
2100       break;
2101
2102     case NO_SAME_OWNER_OPTION:
2103       same_owner_option = -1;
2104       break;
2105
2106     case NO_SAME_PERMISSIONS_OPTION:
2107       same_permissions_option = -1;
2108       break;
2109
2110     case ACLS_OPTION:
2111       set_archive_format ("posix");
2112       acls_option = 1;
2113       break;
2114
2115     case NO_ACLS_OPTION:
2116       acls_option = -1;
2117       break;
2118
2119     case SELINUX_CONTEXT_OPTION:
2120       set_archive_format ("posix");
2121       selinux_context_option = 1;
2122       break;
2123
2124     case NO_SELINUX_CONTEXT_OPTION:
2125       selinux_context_option = -1;
2126       break;
2127
2128     case XATTR_OPTION:
2129       set_xattr_option (1);
2130       break;
2131
2132     case NO_XATTR_OPTION:
2133       set_xattr_option (-1);
2134       break;
2135
2136     case XATTR_INCLUDE:
2137     case XATTR_EXCLUDE:
2138       set_xattr_option (1);
2139       xattrs_mask_add (arg, (key == XATTR_INCLUDE));
2140       break;
2141
2142     case RECURSION_OPTION:
2143       recursion_option = FNM_LEADING_DIR;
2144       break;
2145
2146     case SAME_OWNER_OPTION:
2147       same_owner_option = 1;
2148       break;
2149
2150     case UNQUOTE_OPTION:
2151       unquote_option = true;
2152       break;
2153
2154     case NO_UNQUOTE_OPTION:
2155       unquote_option = false;
2156       break;
2157
2158     case WARNING_OPTION:
2159       set_warning_option (arg);
2160       break;
2161
2162     case '0':
2163     case '1':
2164     case '2':
2165     case '3':
2166     case '4':
2167     case '5':
2168     case '6':
2169     case '7':
2170
2171 #ifdef DEVICE_PREFIX
2172       {
2173         int device = key - '0';
2174         int density;
2175         static char buf[sizeof DEVICE_PREFIX + 10];
2176         char *cursor;
2177
2178         if (arg[1])
2179           argp_error (state, _("Malformed density argument: %s"), quote (arg));
2180
2181         strcpy (buf, DEVICE_PREFIX);
2182         cursor = buf + strlen (buf);
2183
2184 #ifdef DENSITY_LETTER
2185
2186         sprintf (cursor, "%d%c", device, arg[0]);
2187
2188 #else /* not DENSITY_LETTER */
2189
2190         switch (arg[0])
2191           {
2192           case 'l':
2193             device += LOW_DENSITY_NUM;
2194             break;
2195
2196           case 'm':
2197             device += MID_DENSITY_NUM;
2198             break;
2199
2200           case 'h':
2201             device += HIGH_DENSITY_NUM;
2202             break;
2203
2204           default:
2205             argp_error (state, _("Unknown density: '%c'"), arg[0]);
2206           }
2207         sprintf (cursor, "%d", device);
2208
2209 #endif /* not DENSITY_LETTER */
2210
2211         if (archive_names == allocated_archive_names)
2212           archive_name_array = x2nrealloc (archive_name_array,
2213                                            &allocated_archive_names,
2214                                            sizeof (archive_name_array[0]));
2215         archive_name_array[archive_names++] = xstrdup (buf);
2216       }
2217       break;
2218
2219 #else /* not DEVICE_PREFIX */
2220
2221       argp_error (state,
2222                   _("Options '-[0-7][lmh]' not supported by *this* tar"));
2223
2224 #endif /* not DEVICE_PREFIX */
2225
2226     default:
2227       return ARGP_ERR_UNKNOWN;
2228     }
2229   return 0;
2230 }
2231
2232 static struct argp argp = {
2233   options,
2234   parse_opt,
2235   N_("[FILE]..."),
2236   doc,
2237   NULL,
2238   tar_help_filter,
2239   NULL
2240 };
2241
2242 void
2243 usage (int status)
2244 {
2245   argp_help (&argp, stderr, ARGP_HELP_SEE, (char*) program_name);
2246   close_stdout ();
2247   exit (status);
2248 }
2249
2250 /* Parse the options for tar.  */
2251
2252 static struct argp_option *
2253 find_argp_option (struct argp_option *o, int letter)
2254 {
2255   for (;
2256        !(o->name == NULL
2257          && o->key == 0
2258          && o->arg == 0
2259          && o->flags == 0
2260          && o->doc == NULL); o++)
2261     if (o->key == letter)
2262       return o;
2263   return NULL;
2264 }
2265
2266 static const char *tar_authors[] = {
2267   "John Gilmore",
2268   "Jay Fenlason",
2269   NULL
2270 };
2271 \f
2272 /* Subcommand classes */
2273 #define SUBCL_READ    0x01   /* subcommand reads from the archive */
2274 #define SUBCL_WRITE   0x02   /* subcommand writes to the archive */
2275 #define SUBCL_UPDATE  0x04   /* subcommand updates existing archive */
2276 #define SUBCL_TEST    0x08   /* subcommand tests archive header or meta-info */
2277 #define SUBCL_OCCUR   0x10   /* subcommand allows the use of the occurrence
2278                                 option */
2279
2280 static int subcommand_class[] = {
2281   /* UNKNOWN_SUBCOMMAND */     0,
2282   /* APPEND_SUBCOMMAND  */     SUBCL_WRITE|SUBCL_UPDATE,
2283   /* CAT_SUBCOMMAND     */     SUBCL_WRITE,
2284   /* CREATE_SUBCOMMAND  */     SUBCL_WRITE,
2285   /* DELETE_SUBCOMMAND  */     SUBCL_WRITE|SUBCL_UPDATE|SUBCL_OCCUR,
2286   /* DIFF_SUBCOMMAND    */     SUBCL_READ|SUBCL_OCCUR,
2287   /* EXTRACT_SUBCOMMAND */     SUBCL_READ|SUBCL_OCCUR,
2288   /* LIST_SUBCOMMAND    */     SUBCL_READ|SUBCL_OCCUR,
2289   /* UPDATE_SUBCOMMAND  */     SUBCL_WRITE|SUBCL_UPDATE,
2290   /* TEST_LABEL_SUBCOMMAND */  SUBCL_TEST
2291 };
2292
2293 /* Return t if the subcommand_option is in class(es) f */
2294 #define IS_SUBCOMMAND_CLASS(f) (subcommand_class[subcommand_option] & (f))
2295
2296 static struct tar_args args;
2297
2298 static void
2299 option_conflict_error (const char *a, const char *b)
2300 {
2301   /* TRANSLATORS: Both %s in this statement are replaced with
2302      option names. */
2303   USAGE_ERROR ((0, 0, _("'%s' cannot be used with '%s'"), a, b));
2304 }
2305
2306 static void
2307 decode_options (int argc, char **argv)
2308 {
2309   int idx;
2310
2311   argp_version_setup ("tar", tar_authors);
2312
2313   /* Set some default option values.  */
2314   args.textual_date = NULL;
2315   args.wildcards = default_wildcards;
2316   args.matching_flags = 0;
2317   args.include_anchored = EXCLUDE_ANCHORED;
2318   args.o_option = false;
2319   args.pax_option = false;
2320   args.backup_suffix_string = getenv ("SIMPLE_BACKUP_SUFFIX");
2321   args.version_control_string = 0;
2322   args.input_files = false;
2323   args.compress_autodetect = false;
2324
2325   subcommand_option = UNKNOWN_SUBCOMMAND;
2326   archive_format = DEFAULT_FORMAT;
2327   blocking_factor = DEFAULT_BLOCKING;
2328   record_size = DEFAULT_BLOCKING * BLOCKSIZE;
2329   excluded = new_exclude ();
2330   
2331   newer_mtime_option.tv_sec = TYPE_MINIMUM (time_t);
2332   newer_mtime_option.tv_nsec = -1;
2333   recursion_option = FNM_LEADING_DIR;
2334   unquote_option = true;
2335   tar_sparse_major = 1;
2336   tar_sparse_minor = 0;
2337
2338   savedir_sort_order = SAVEDIR_SORT_NONE;
2339   
2340   owner_option = -1; owner_name_option = NULL;
2341   group_option = -1; group_name_option = NULL;
2342
2343   check_device_option = true;
2344
2345   incremental_level = -1;
2346
2347   seek_option = -1;
2348
2349   /* Convert old-style tar call by exploding option element and rearranging
2350      options accordingly.  */
2351
2352   if (argc > 1 && argv[1][0] != '-')
2353     {
2354       int new_argc;             /* argc value for rearranged arguments */
2355       char **new_argv;          /* argv value for rearranged arguments */
2356       char *const *in;          /* cursor into original argv */
2357       char **out;               /* cursor into rearranged argv */
2358       const char *letter;       /* cursor into old option letters */
2359       char buffer[3];           /* constructed option buffer */
2360
2361       /* Initialize a constructed option.  */
2362
2363       buffer[0] = '-';
2364       buffer[2] = '\0';
2365
2366       /* Allocate a new argument array, and copy program name in it.  */
2367
2368       new_argc = argc - 1 + strlen (argv[1]);
2369       new_argv = xmalloc ((new_argc + 1) * sizeof (char *));
2370       in = argv;
2371       out = new_argv;
2372       *out++ = *in++;
2373
2374       /* Copy each old letter option as a separate option, and have the
2375          corresponding argument moved next to it.  */
2376
2377       for (letter = *in++; *letter; letter++)
2378         {
2379           struct argp_option *opt;
2380
2381           buffer[1] = *letter;
2382           *out++ = xstrdup (buffer);
2383           opt = find_argp_option (options, *letter);
2384           if (opt && opt->arg)
2385             {
2386               if (in < argv + argc)
2387                 *out++ = *in++;
2388               else
2389                 USAGE_ERROR ((0, 0, _("Old option '%c' requires an argument."),
2390                               *letter));
2391             }
2392         }
2393
2394       /* Copy all remaining options.  */
2395
2396       while (in < argv + argc)
2397         *out++ = *in++;
2398       *out = 0;
2399
2400       /* Replace the old option list by the new one.  */
2401
2402       argc = new_argc;
2403       argv = new_argv;
2404     }
2405
2406   /* Parse all options and non-options as they appear.  */
2407
2408   prepend_default_options (getenv ("TAR_OPTIONS"), &argc, &argv);
2409
2410   if (argp_parse (&argp, argc, argv, ARGP_IN_ORDER, &idx, &args))
2411     exit (TAREXIT_FAILURE);
2412
2413   /* Special handling for 'o' option:
2414
2415      GNU tar used to say "output old format".
2416      UNIX98 tar says don't chown files after extracting (we use
2417      "--no-same-owner" for this).
2418
2419      The old GNU tar semantics is retained when used with --create
2420      option, otherwise UNIX98 semantics is assumed */
2421
2422   if (args.o_option)
2423     {
2424       if (subcommand_option == CREATE_SUBCOMMAND)
2425         {
2426           /* GNU Tar <= 1.13 compatibility */
2427           set_archive_format ("v7");
2428         }
2429       else
2430         {
2431           /* UNIX98 compatibility */
2432           same_owner_option = -1;
2433         }
2434     }
2435
2436   /* Handle operands after any "--" argument.  */
2437   for (; idx < argc; idx++)
2438     {
2439       name_add_name (argv[idx], MAKE_INCL_OPTIONS (&args));
2440       args.input_files = true;
2441     }
2442
2443   /* Warn about implicit use of the wildcards in command line arguments.
2444      See TODO */
2445   warn_regex_usage = args.wildcards == default_wildcards;
2446
2447   /* Derive option values and check option consistency.  */
2448
2449   if (archive_format == DEFAULT_FORMAT)
2450     {
2451       if (args.pax_option)
2452         archive_format = POSIX_FORMAT;
2453       else
2454         archive_format = DEFAULT_ARCHIVE_FORMAT;
2455     }
2456
2457   if ((volume_label_option && subcommand_option == CREATE_SUBCOMMAND)
2458       || incremental_option
2459       || multi_volume_option
2460       || sparse_option)
2461     assert_format (FORMAT_MASK (OLDGNU_FORMAT)
2462                    | FORMAT_MASK (GNU_FORMAT)
2463                    | FORMAT_MASK (POSIX_FORMAT));
2464
2465   if (occurrence_option)
2466     {
2467       if (!args.input_files)
2468         USAGE_ERROR ((0, 0,
2469                       _("--occurrence is meaningless without a file list")));
2470       if (!IS_SUBCOMMAND_CLASS (SUBCL_OCCUR))
2471         option_conflict_error ("--occurrence",
2472                                subcommand_string (subcommand_option));
2473     }
2474
2475   if (archive_names == 0)
2476     {
2477       /* If no archive file name given, try TAPE from the environment, or
2478          else, DEFAULT_ARCHIVE from the configuration process.  */
2479
2480       archive_names = 1;
2481       archive_name_array[0] = getenv ("TAPE");
2482       if (! archive_name_array[0])
2483         archive_name_array[0] = DEFAULT_ARCHIVE;
2484     }
2485
2486   /* Allow multiple archives only with '-M'.  */
2487
2488   if (archive_names > 1 && !multi_volume_option)
2489     USAGE_ERROR ((0, 0,
2490                   _("Multiple archive files require '-M' option")));
2491
2492   if (listed_incremental_option
2493       && NEWER_OPTION_INITIALIZED (newer_mtime_option))
2494     option_conflict_error ("--listed-incremental", "--newer");
2495   
2496   if (incremental_level != -1 && !listed_incremental_option)
2497     WARN ((0, 0,
2498            _("--level is meaningless without --listed-incremental")));
2499
2500   if (volume_label_option)
2501     {
2502       if (archive_format == GNU_FORMAT || archive_format == OLDGNU_FORMAT)
2503         {
2504           size_t volume_label_max_len =
2505             (sizeof current_header->header.name
2506              - 1 /* for trailing '\0' */
2507              - (multi_volume_option
2508                 ? (sizeof " Volume "
2509                    - 1 /* for null at end of " Volume " */
2510                    + INT_STRLEN_BOUND (int) /* for volume number */
2511                    - 1 /* for sign, as 0 <= volno */)
2512                 : 0));
2513           if (volume_label_max_len < strlen (volume_label_option))
2514             USAGE_ERROR ((0, 0,
2515                           ngettext ("%s: Volume label is too long (limit is %lu byte)",
2516                                     "%s: Volume label is too long (limit is %lu bytes)",
2517                                     volume_label_max_len),
2518                           quotearg_colon (volume_label_option),
2519                           (unsigned long) volume_label_max_len));
2520         }
2521       /* else FIXME
2522          Label length in PAX format is limited by the volume size. */
2523     }
2524
2525   if (verify_option)
2526     {
2527       if (multi_volume_option)
2528         USAGE_ERROR ((0, 0, _("Cannot verify multi-volume archives")));
2529       if (use_compress_program_option)
2530         USAGE_ERROR ((0, 0, _("Cannot verify compressed archives")));
2531       if (!IS_SUBCOMMAND_CLASS (SUBCL_WRITE))
2532         option_conflict_error ("--verify",
2533                                subcommand_string (subcommand_option));
2534     }
2535
2536   if (use_compress_program_option)
2537     {
2538       if (multi_volume_option)
2539         USAGE_ERROR ((0, 0, _("Cannot use multi-volume compressed archives")));
2540       if (IS_SUBCOMMAND_CLASS (SUBCL_UPDATE))
2541         USAGE_ERROR ((0, 0, _("Cannot update compressed archives")));
2542       if (subcommand_option == CAT_SUBCOMMAND)
2543         USAGE_ERROR ((0, 0, _("Cannot concatenate compressed archives")));
2544     }
2545
2546   /* It is no harm to use --pax-option on non-pax archives in archive
2547      reading mode. It may even be useful, since it allows to override
2548      file attributes from tar headers. Therefore I allow such usage.
2549      --gray */
2550   if (args.pax_option
2551       && archive_format != POSIX_FORMAT
2552       && !IS_SUBCOMMAND_CLASS (SUBCL_READ))
2553     USAGE_ERROR ((0, 0, _("--pax-option can be used only on POSIX archives")));
2554
2555   /* star creates non-POSIX typed archives with xattr support, so allow the
2556      extra headers when reading */
2557   if ((acls_option > 0)
2558       && archive_format != POSIX_FORMAT
2559       && !IS_SUBCOMMAND_CLASS (SUBCL_READ))
2560     USAGE_ERROR ((0, 0, _("--acls can be used only on POSIX archives")));
2561
2562   if ((selinux_context_option > 0)
2563       && archive_format != POSIX_FORMAT
2564       && !IS_SUBCOMMAND_CLASS (SUBCL_READ))
2565     USAGE_ERROR ((0, 0, _("--selinux can be used only on POSIX archives")));
2566
2567   if ((xattrs_option > 0)
2568       && archive_format != POSIX_FORMAT
2569       && !IS_SUBCOMMAND_CLASS (SUBCL_READ))
2570     USAGE_ERROR ((0, 0, _("--xattrs can be used only on POSIX archives")));
2571
2572   if (starting_file_option && !IS_SUBCOMMAND_CLASS (SUBCL_READ))
2573     option_conflict_error ("--starting-file",
2574                            subcommand_string (subcommand_option));
2575
2576   if (same_order_option && !IS_SUBCOMMAND_CLASS (SUBCL_READ))
2577     option_conflict_error ("--same-order",
2578                            subcommand_string (subcommand_option));
2579
2580   if (one_top_level_option)
2581     {
2582       char *base;
2583       
2584       if (absolute_names_option)
2585         option_conflict_error ("--one-top-level", "--absolute-names");
2586       
2587       if (!one_top_level_dir)
2588         {
2589           /* If the user wants to guarantee that everything is under one
2590              directory, determine its name now and let it be created later.  */
2591           base = base_name (archive_name_array[0]);
2592           one_top_level_dir = strip_compression_suffix (base);
2593           free (base);
2594
2595           if (!one_top_level_dir)
2596             USAGE_ERROR ((0, 0,
2597                           _("Cannot deduce top-level directory name; "
2598                             "please set it explicitly with --one-top-level=DIR")));
2599         }
2600     }
2601
2602   /* If ready to unlink hierarchies, so we are for simpler files.  */
2603   if (recursive_unlink_option)
2604     old_files_option = UNLINK_FIRST_OLD_FILES;
2605
2606   /* Flags for accessing files to be read from or copied into.  POSIX says
2607      O_NONBLOCK has unspecified effect on most types of files, but in
2608      practice it never harms and sometimes helps.  */
2609   {
2610     int base_open_flags =
2611       (O_BINARY | O_CLOEXEC | O_NOCTTY | O_NONBLOCK
2612        | (dereference_option ? 0 : O_NOFOLLOW)
2613        | (atime_preserve_option == system_atime_preserve ? O_NOATIME : 0));
2614     open_read_flags = O_RDONLY | base_open_flags;
2615     open_searchdir_flags = O_SEARCH | O_DIRECTORY | base_open_flags;
2616   }
2617   fstatat_flags = dereference_option ? 0 : AT_SYMLINK_NOFOLLOW;
2618
2619   if (subcommand_option == TEST_LABEL_SUBCOMMAND)
2620     {
2621       /* --test-label is silent if the user has specified the label name to
2622          compare against. */
2623       if (!args.input_files)
2624         verbose_option++;
2625     }
2626   else if (utc_option)
2627     verbose_option = 2;
2628
2629   if (tape_length_option && tape_length_option < record_size)
2630     USAGE_ERROR ((0, 0, _("Volume length cannot be less than record size")));
2631
2632   if (same_order_option && listed_incremental_option)
2633     option_conflict_error ("--preserve-order", "--listed-incremental");
2634
2635   /* Forbid using -c with no input files whatsoever.  Check that '-f -',
2636      explicit or implied, is used correctly.  */
2637
2638   switch (subcommand_option)
2639     {
2640     case CREATE_SUBCOMMAND:
2641       if (!args.input_files && !files_from_option)
2642         USAGE_ERROR ((0, 0,
2643                       _("Cowardly refusing to create an empty archive")));
2644       if (args.compress_autodetect && archive_names
2645           && strcmp (archive_name_array[0], "-"))
2646         set_compression_program_by_suffix (archive_name_array[0],
2647                                            use_compress_program_option);
2648       break;
2649
2650     case EXTRACT_SUBCOMMAND:
2651     case LIST_SUBCOMMAND:
2652     case DIFF_SUBCOMMAND:
2653     case TEST_LABEL_SUBCOMMAND:
2654       for (archive_name_cursor = archive_name_array;
2655            archive_name_cursor < archive_name_array + archive_names;
2656            archive_name_cursor++)
2657         if (!strcmp (*archive_name_cursor, "-"))
2658           request_stdin ("-f");
2659       break;
2660
2661     case CAT_SUBCOMMAND:
2662     case UPDATE_SUBCOMMAND:
2663     case APPEND_SUBCOMMAND:
2664       for (archive_name_cursor = archive_name_array;
2665            archive_name_cursor < archive_name_array + archive_names;
2666            archive_name_cursor++)
2667         if (!strcmp (*archive_name_cursor, "-"))
2668           USAGE_ERROR ((0, 0,
2669                         _("Options '-Aru' are incompatible with '-f -'")));
2670
2671     default:
2672       break;
2673     }
2674
2675   /* Initialize stdlis */
2676   if (index_file_name)
2677     {
2678       stdlis = fopen (index_file_name, "w");
2679       if (! stdlis)
2680         open_fatal (index_file_name);
2681     }
2682   else
2683     stdlis = to_stdout_option ? stderr : stdout;
2684
2685   archive_name_cursor = archive_name_array;
2686
2687   /* Prepare for generating backup names.  */
2688
2689   if (args.backup_suffix_string)
2690     simple_backup_suffix = xstrdup (args.backup_suffix_string);
2691
2692   if (backup_option)
2693     {
2694       backup_type = xget_version ("--backup", args.version_control_string);
2695       /* No backup is needed either if explicitely disabled or if
2696          the extracted files are not being written to disk. */
2697       if (backup_type == no_backups || EXTRACT_OVER_PIPE)
2698         backup_option = false;
2699     }
2700
2701   checkpoint_finish_compile ();
2702
2703   report_textual_dates (&args);
2704 }
2705
2706 void
2707 more_options (int argc, char **argv)
2708 {
2709   int idx;
2710   if (argp_parse (&argp, argc, argv, ARGP_IN_ORDER,
2711                   &idx, &args))
2712     exit (TAREXIT_FAILURE);
2713 }
2714 \f
2715 /* Tar proper.  */
2716
2717 /* Main routine for tar.  */
2718 int
2719 main (int argc, char **argv)
2720 {
2721   set_start_time ();
2722   set_program_name (argv[0]);
2723
2724   setlocale (LC_ALL, "");
2725   bindtextdomain (PACKAGE, LOCALEDIR);
2726   textdomain (PACKAGE);
2727
2728   exit_failure = TAREXIT_FAILURE;
2729   exit_status = TAREXIT_SUCCESS;
2730   error_hook = checkpoint_flush_actions;
2731   
2732   filename_terminator = '\n';
2733   set_quoting_style (0, DEFAULT_QUOTING_STYLE);
2734
2735   /* Make sure we have first three descriptors available */
2736   stdopen ();
2737
2738   /* Pre-allocate a few structures.  */
2739
2740   allocated_archive_names = 10;
2741   archive_name_array =
2742     xmalloc (sizeof (const char *) * allocated_archive_names);
2743   archive_names = 0;
2744
2745   /* System V fork+wait does not work if SIGCHLD is ignored.  */
2746   signal (SIGCHLD, SIG_DFL);
2747
2748   /* Try to disable the ability to unlink a directory.  */
2749   priv_set_remove_linkdir ();
2750
2751   /* Decode options.  */
2752
2753   decode_options (argc, argv);
2754
2755   name_init ();
2756
2757   /* Main command execution.  */
2758
2759   if (volno_file_option)
2760     init_volume_number ();
2761
2762   switch (subcommand_option)
2763     {
2764     case UNKNOWN_SUBCOMMAND:
2765       USAGE_ERROR ((0, 0,
2766                     _("You must specify one of the '-Acdtrux', '--delete' or '--test-label' options")));
2767
2768     case CAT_SUBCOMMAND:
2769     case UPDATE_SUBCOMMAND:
2770     case APPEND_SUBCOMMAND:
2771       update_archive ();
2772       break;
2773
2774     case DELETE_SUBCOMMAND:
2775       delete_archive_members ();
2776       break;
2777
2778     case CREATE_SUBCOMMAND:
2779       create_archive ();
2780       break;
2781
2782     case EXTRACT_SUBCOMMAND:
2783       extr_init ();
2784       read_and (extract_archive);
2785
2786       /* FIXME: should extract_finish () even if an ordinary signal is
2787          received.  */
2788       extract_finish ();
2789
2790       break;
2791
2792     case LIST_SUBCOMMAND:
2793       read_and (list_archive);
2794       break;
2795
2796     case DIFF_SUBCOMMAND:
2797       diff_init ();
2798       read_and (diff_archive);
2799       break;
2800
2801     case TEST_LABEL_SUBCOMMAND:
2802       test_archive_label ();
2803     }
2804
2805   checkpoint_finish ();
2806   
2807   if (totals_option)
2808     print_total_stats ();
2809
2810   if (check_links_option)
2811     check_links ();
2812
2813   if (volno_file_option)
2814     closeout_volume_number ();
2815
2816   /* Dispose of allocated memory, and return.  */
2817
2818   free (archive_name_array);
2819   xattrs_clear_setup ();
2820   name_term ();
2821
2822   if (exit_status == TAREXIT_FAILURE)
2823     error (0, 0, _("Exiting with failure status due to previous errors"));
2824
2825   if (stdlis == stdout)
2826     close_stdout ();
2827   else if (ferror (stderr) || fclose (stderr) != 0)
2828     set_exit_status (TAREXIT_FAILURE);
2829
2830   return exit_status;
2831 }
2832
2833 void
2834 tar_stat_init (struct tar_stat_info *st)
2835 {
2836   memset (st, 0, sizeof (*st));
2837 }
2838
2839 /* Close the stream or file descriptor associated with ST, and remove
2840    all traces of it from ST.  Return true if successful, false (with a
2841    diagnostic) otherwise.  */
2842 bool
2843 tar_stat_close (struct tar_stat_info *st)
2844 {
2845   int status = (st->dirstream ? closedir (st->dirstream)
2846                 : 0 < st->fd ? close (st->fd)
2847                 : 0);
2848   st->dirstream = 0;
2849   st->fd = 0;
2850
2851   if (status == 0)
2852     return true;
2853   else
2854     {
2855       close_diag (st->orig_file_name);
2856       return false;
2857     }
2858 }
2859
2860 void
2861 tar_stat_destroy (struct tar_stat_info *st)
2862 {
2863   tar_stat_close (st);
2864   xheader_xattr_free (st->xattr_map, st->xattr_map_size);
2865   free (st->orig_file_name);
2866   free (st->file_name);
2867   free (st->link_name);
2868   free (st->uname);
2869   free (st->gname);
2870   free (st->cntx_name);
2871   free (st->acls_a_ptr);
2872   free (st->acls_d_ptr);
2873   free (st->sparse_map);
2874   free (st->dumpdir);
2875   xheader_destroy (&st->xhdr);
2876   info_free_exclist (st);
2877   memset (st, 0, sizeof (*st));
2878 }
2879
2880 /* Format mask for all available formats that support nanosecond
2881    timestamp resolution. */
2882 #define NS_PRECISION_FORMAT_MASK FORMAT_MASK (POSIX_FORMAT)
2883
2884 /* Same as timespec_cmp, but ignore nanoseconds if current archive
2885    format does not provide sufficient resolution.  */
2886 int
2887 tar_timespec_cmp (struct timespec a, struct timespec b)
2888 {
2889   if (!(FORMAT_MASK (current_format) & NS_PRECISION_FORMAT_MASK))
2890     a.tv_nsec = b.tv_nsec = 0;
2891   return timespec_cmp (a, b);
2892 }
2893
2894 /* Set tar exit status to VAL, unless it is already indicating
2895    a more serious condition. This relies on the fact that the
2896    values of TAREXIT_ constants are ranged by severity. */
2897 void
2898 set_exit_status (int val)
2899 {
2900   if (val > exit_status)
2901     exit_status = val;
2902 }