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