Implement new option, --mtime, allowing to set
[debian/tar] / src / tar.c
1 /* A tar (tape archiver) program.
2
3    Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000,
4    2001, 2003, 2004, 2005, 2006 Free 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 2, 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, write to the Free Software Foundation, Inc.,
20    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
21
22 #include <system.h>
23
24 #include <fnmatch.h>
25 #include <getline.h>
26 #include <argp.h>
27 #include <argp-namefrob.h>
28 #include <argp-fmtstream.h>
29
30 #include <signal.h>
31 #if ! defined SIGCHLD && defined SIGCLD
32 # define SIGCHLD SIGCLD
33 #endif
34
35 /* The following causes "common.h" to produce definitions of all the global
36    variables, rather than just "extern" declarations of them.  GNU tar does
37    depend on the system loader to preset all GLOBAL variables to neutral (or
38    zero) values; explicit initialization is usually not done.  */
39 #define GLOBAL
40 #include "common.h"
41
42 #include <argmatch.h>
43 #include <closeout.h>
44 #include <exitfail.h>
45 #include <getdate.h>
46 #include <localedir.h>
47 #include <rmt.h>
48 #include <prepargs.h>
49 #include <quotearg.h>
50 #include <version-etc.h>
51 #include <xstrtol.h>
52 #include <stdopen.h>
53
54 /* Local declarations.  */
55
56 #ifndef DEFAULT_ARCHIVE_FORMAT
57 # define DEFAULT_ARCHIVE_FORMAT GNU_FORMAT
58 #endif
59
60 #ifndef DEFAULT_ARCHIVE
61 # define DEFAULT_ARCHIVE "tar.out"
62 #endif
63
64 #ifndef DEFAULT_BLOCKING
65 # define DEFAULT_BLOCKING 20
66 #endif
67
68 \f
69 /* Miscellaneous.  */
70
71 /* Name of option using stdin.  */
72 static const char *stdin_used_by;
73
74 /* Doesn't return if stdin already requested.  */
75 void
76 request_stdin (const char *option)
77 {
78   if (stdin_used_by)
79     USAGE_ERROR ((0, 0, _("Options `-%s' and `-%s' both want standard input"),
80                   stdin_used_by, option));
81
82   stdin_used_by = option;
83 }
84
85 extern int rpmatch (char const *response);
86
87 /* Returns true if and only if the user typed an affirmative response.  */
88 int
89 confirm (const char *message_action, const char *message_name)
90 {
91   static FILE *confirm_file;
92   static int confirm_file_EOF;
93   bool status = false;
94
95   if (!confirm_file)
96     {
97       if (archive == 0 || stdin_used_by)
98         {
99           confirm_file = fopen (TTY_NAME, "r");
100           if (! confirm_file)
101             open_fatal (TTY_NAME);
102         }
103       else
104         {
105           request_stdin ("-w");
106           confirm_file = stdin;
107         }
108     }
109
110   fprintf (stdlis, "%s %s?", message_action, quote (message_name));
111   fflush (stdlis);
112
113   if (!confirm_file_EOF)
114     {
115       char *response = NULL;
116       size_t response_size = 0;
117       if (getline (&response, &response_size, confirm_file) < 0)
118         confirm_file_EOF = 1;
119       else
120         status = rpmatch (response) > 0;
121       free (response);
122     }
123
124   if (confirm_file_EOF)
125     {
126       fputc ('\n', stdlis);
127       fflush (stdlis);
128     }
129
130   return status;
131 }
132
133 static struct fmttab {
134   char const *name;
135   enum archive_format fmt;
136 } const fmttab[] = {
137   { "v7",      V7_FORMAT },
138   { "oldgnu",  OLDGNU_FORMAT },
139   { "ustar",   USTAR_FORMAT },
140   { "posix",   POSIX_FORMAT },
141 #if 0 /* not fully supported yet */
142   { "star",    STAR_FORMAT },
143 #endif
144   { "gnu",     GNU_FORMAT },
145   { "pax",     POSIX_FORMAT }, /* An alias for posix */
146   { NULL,      0 }
147 };
148
149 static void
150 set_archive_format (char const *name)
151 {
152   struct fmttab const *p;
153
154   for (p = fmttab; strcmp (p->name, name) != 0; )
155     if (! (++p)->name)
156       USAGE_ERROR ((0, 0, _("%s: Invalid archive format"),
157                     quotearg_colon (name)));
158
159   archive_format = p->fmt;
160 }
161
162 const char *
163 archive_format_string (enum archive_format fmt)
164 {
165   struct fmttab const *p;
166
167   for (p = fmttab; p->name; p++)
168     if (p->fmt == fmt)
169       return p->name;
170   return "unknown?";
171 }
172
173 #define FORMAT_MASK(n) (1<<(n))
174
175 static void
176 assert_format(unsigned fmt_mask)
177 {
178   if ((FORMAT_MASK (archive_format) & fmt_mask) == 0)
179     USAGE_ERROR ((0, 0,
180                   _("GNU features wanted on incompatible archive format")));
181 }
182
183 const char *
184 subcommand_string (enum subcommand c)
185 {
186   switch (c)
187     {
188     case UNKNOWN_SUBCOMMAND:
189       return "unknown?";
190
191     case APPEND_SUBCOMMAND:
192       return "-r";
193
194     case CAT_SUBCOMMAND:
195       return "-A";
196
197     case CREATE_SUBCOMMAND:
198       return "-c";
199
200     case DELETE_SUBCOMMAND:
201       return "-D";
202
203     case DIFF_SUBCOMMAND:
204       return "-d";
205
206     case EXTRACT_SUBCOMMAND:
207       return "-x";
208
209     case LIST_SUBCOMMAND:
210       return "-t";
211
212     case UPDATE_SUBCOMMAND:
213       return "-u";
214
215     default:
216       abort ();
217     }
218 }
219
220 void
221 tar_list_quoting_styles (argp_fmtstream_t fs, char *prefix)
222 {
223   int i;
224
225   for (i = 0; quoting_style_args[i]; i++)
226     argp_fmtstream_printf (fs, "%s%s\n", prefix, quoting_style_args[i]);
227 }
228
229 void
230 tar_set_quoting_style (char *arg)
231 {
232   int i;
233
234   for (i = 0; quoting_style_args[i]; i++)
235     if (strcmp (arg, quoting_style_args[i]) == 0)
236       {
237         set_quoting_style (NULL, i);
238         return;
239       }
240   FATAL_ERROR ((0, 0,
241                 _("Unknown quoting style `%s'. Try `%s --quoting-style=help' to get a list."), arg, program_invocation_short_name));
242 }
243
244 \f
245 /* Options.  */
246
247 enum
248 {
249   ANCHORED_OPTION = CHAR_MAX + 1,
250   ATIME_PRESERVE_OPTION,
251   BACKUP_OPTION,
252   CHECKPOINT_OPTION,
253   DELAY_DIRECTORY_RESTORE_OPTION,
254   DELETE_OPTION,
255   EXCLUDE_CACHES_OPTION,
256   EXCLUDE_OPTION,
257   FORCE_LOCAL_OPTION,
258   GROUP_OPTION,
259   HANG_OPTION,
260   IGNORE_CASE_OPTION,
261   IGNORE_COMMAND_ERROR_OPTION,
262   IGNORE_FAILED_READ_OPTION,
263   INDEX_FILE_OPTION,
264   KEEP_NEWER_FILES_OPTION,
265   MODE_OPTION,
266   MTIME_OPTION,
267   NEWER_MTIME_OPTION,
268   NO_ANCHORED_OPTION,
269   NO_DELAY_DIRECTORY_RESTORE_OPTION,
270   NO_IGNORE_CASE_OPTION,
271   NO_IGNORE_COMMAND_ERROR_OPTION,
272   NO_OVERWRITE_DIR_OPTION,
273   NO_QUOTE_CHARS_OPTION,
274   NO_RECURSION_OPTION,
275   NO_SAME_OWNER_OPTION,
276   NO_SAME_PERMISSIONS_OPTION,
277   NO_UNQUOTE_OPTION,
278   NO_WILDCARDS_MATCH_SLASH_OPTION,
279   NO_WILDCARDS_OPTION,
280   NULL_OPTION,
281   NUMERIC_OWNER_OPTION,
282   OCCURRENCE_OPTION,
283   OLD_ARCHIVE_OPTION,
284   ONE_FILE_SYSTEM_OPTION,
285   OVERWRITE_DIR_OPTION,
286   OVERWRITE_OPTION,
287   OWNER_OPTION,
288   PAX_OPTION,
289   POSIX_OPTION,
290   PRESERVE_OPTION,
291   QUOTE_CHARS_OPTION,
292   QUOTING_STYLE_OPTION,
293   RECORD_SIZE_OPTION,
294   RECURSION_OPTION,
295   RECURSIVE_UNLINK_OPTION,
296   REMOVE_FILES_OPTION,
297   RESTRICT_OPTION,
298   RMT_COMMAND_OPTION,
299   RSH_COMMAND_OPTION,
300   SAME_OWNER_OPTION,
301   SHOW_DEFAULTS_OPTION,
302   SHOW_OMITTED_DIRS_OPTION,
303   SHOW_TRANSFORMED_NAMES_OPTION,
304   STRIP_COMPONENTS_OPTION,
305   SUFFIX_OPTION,
306   TEST_LABEL_OPTION,
307   TOTALS_OPTION,
308   TO_COMMAND_OPTION,
309   TRANSFORM_OPTION,
310   UNQUOTE_OPTION,
311   USAGE_OPTION,
312   USE_COMPRESS_PROGRAM_OPTION,
313   UTC_OPTION,
314   VERSION_OPTION,
315   VOLNO_FILE_OPTION,
316   WILDCARDS_MATCH_SLASH_OPTION,
317   WILDCARDS_OPTION
318 };
319
320 const char *argp_program_version = "tar (" PACKAGE_NAME ") " VERSION;
321 const char *argp_program_bug_address = "<" PACKAGE_BUGREPORT ">";
322 static char doc[] = N_("GNU `tar' saves many files together into a single tape or disk archive, and can restore individual files from the archive.\n\
323 \n\
324 Examples:\n\
325   tar -cf archive.tar foo bar  # Create archive.tar from files foo and bar.\n\
326   tar -tvf archive.tar         # List all files in archive.tar verbosely.\n\
327   tar -xf archive.tar          # Extract all files from archive.tar.\n\
328 \vThe backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
329 The version control may be set with --backup or VERSION_CONTROL, values are:\n\n\
330   none, off       never make backups\n\
331   t, numbered     make numbered backups\n\
332   nil, existing   numbered if numbered backups exist, simple otherwise\n\
333   never, simple   always make simple backups\n");
334
335
336 /* NOTE:
337
338    Available option letters are DEIJQY and aeqy. Consider the following
339    assignments:
340
341    [For Solaris tar compatibility =/= Is it important at all?]
342    e  exit immediately with a nonzero exit status if unexpected errors occur
343    E  use extended headers (--format=posix)
344
345    [q  alias for --occurrence=1 =/= this would better be used for quiet?]
346    [I  same as T =/= will harm star compatibility]
347
348    y  per-file gzip compression
349    Y  per-block gzip compression */
350
351 static struct argp_option options[] = {
352 #define GRID 10
353   {NULL, 0, NULL, 0,
354    N_("Main operation mode:"), GRID },
355
356   {"list", 't', 0, 0,
357    N_("list the contents of an archive"), GRID+1 },
358   {"extract", 'x', 0, 0,
359    N_("extract files from an archive"), GRID+1 },
360   {"get", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
361   {"create", 'c', 0, 0,
362    N_("create a new archive"), GRID+1 },
363   {"diff", 'd', 0, 0,
364    N_("find differences between archive and file system"), GRID+1 },
365   {"compare", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
366   {"append", 'r', 0, 0,
367    N_("append files to the end of an archive"), GRID+1 },
368   {"update", 'u', 0, 0,
369    N_("only append files newer than copy in archive"), GRID+1 },
370   {"catenate", 'A', 0, 0,
371    N_("append tar files to an archive"), GRID+1 },
372   {"concatenate", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
373   {"delete", DELETE_OPTION, 0, 0,
374    N_("delete from the archive (not on mag tapes!)"), GRID+1 },
375   {"test-label", TEST_LABEL_OPTION, NULL, 0,
376    N_("test the archive volume label and exit"), GRID+1 },
377 #undef GRID
378
379 #define GRID 20
380   {NULL, 0, NULL, 0,
381    N_("Operation modifiers:"), GRID },
382
383   {"sparse", 'S', 0, 0,
384    N_("handle sparse files efficiently"), GRID+1 },
385   {"incremental", 'G', 0, 0,
386    N_("handle old GNU-format incremental backup"), GRID+1 },
387   {"listed-incremental", 'g', N_("FILE"), 0,
388    N_("handle new GNU-format incremental backup"), GRID+1 },
389   {"ignore-failed-read", IGNORE_FAILED_READ_OPTION, 0, 0,
390    N_("do not exit with nonzero on unreadable files"), GRID+1 },
391   {"occurrence", OCCURRENCE_OPTION, N_("NUMBER"), OPTION_ARG_OPTIONAL,
392    N_("process only the NUMBERth occurrence of each file in the archive;"
393       " this option is valid only in conjunction with one of the subcommands"
394       " --delete, --diff, --extract or --list and when a list of files"
395       " is given either on the command line or via the -T option;"
396       " NUMBER defaults to 1"), GRID+1 },
397   {"seek", 'n', NULL, 0,
398    N_("archive is seekable"), GRID+1 },
399 #undef GRID
400
401 #define GRID 30
402   {NULL, 0, NULL, 0,
403    N_("Overwrite control:\n"), GRID+1 },
404
405   {"verify", 'W', 0, 0,
406    N_("attempt to verify the archive after writing it"), GRID+1 },
407   {"remove-files", REMOVE_FILES_OPTION, 0, 0,
408    N_("remove files after adding them to the archive"), GRID+1 },
409   {"keep-old-files", 'k', 0, 0,
410    N_("don't replace existing files when extracting"), GRID+1 },
411   {"keep-newer-files", KEEP_NEWER_FILES_OPTION, 0, 0,
412    N_("don't replace existing files that are newer than their archive copies"), GRID+1 },
413   {"overwrite", OVERWRITE_OPTION, 0, 0,
414    N_("overwrite existing files when extracting"), GRID+1 },
415   {"unlink-first", 'U', 0, 0,
416    N_("remove each file prior to extracting over it"), GRID+1 },
417   {"recursive-unlink", RECURSIVE_UNLINK_OPTION, 0, 0,
418    N_("empty hierarchies prior to extracting directory"), GRID+1 },
419   {"no-overwrite-dir", NO_OVERWRITE_DIR_OPTION, 0, 0,
420    N_("preserve metadata of existing directories"), GRID+1 },
421   {"overwrite-dir", OVERWRITE_DIR_OPTION, 0, 0,
422    N_("overwrite metadata of existing directories when extracting (default)"),
423    GRID+1 },
424 #undef GRID
425
426 #define GRID 40
427   {NULL, 0, NULL, 0,
428    N_("Select output stream:"), GRID },
429
430   {"to-stdout", 'O', 0, 0,
431    N_("extract files to standard output"), GRID+1 },
432   {"to-command", TO_COMMAND_OPTION, N_("COMMAND"), 0,
433    N_("pipe extracted files to another program"), GRID+1 },
434   {"ignore-command-error", IGNORE_COMMAND_ERROR_OPTION, 0, 0,
435    N_("ignore exit codes of children"), GRID+1 },
436   {"no-ignore-command-error", NO_IGNORE_COMMAND_ERROR_OPTION, 0, 0,
437    N_("treat non-zero exit codes of children as error"), GRID+1 },
438 #undef GRID
439
440 #define GRID 50
441   {NULL, 0, NULL, 0,
442    N_("Handling of file attributes:"), GRID },
443
444   {"owner", OWNER_OPTION, N_("NAME"), 0,
445    N_("force NAME as owner for added files"), GRID+1 },
446   {"group", GROUP_OPTION, N_("NAME"), 0,
447    N_("force NAME as group for added files"), GRID+1 },
448   {"mtime", MTIME_OPTION, N_("DATE-OR-FILE"), 0,
449    N_("set mtime for added files from DATE-OR-FILE"), GRID+1 },
450   {"mode", MODE_OPTION, N_("CHANGES"), 0,
451    N_("force (symbolic) mode CHANGES for added files"), GRID+1 },
452   {"atime-preserve", ATIME_PRESERVE_OPTION,
453    N_("METHOD"), OPTION_ARG_OPTIONAL,
454    N_("preserve access times on dumped files, either by restoring the times"
455       " after reading (METHOD='replace'; default) or by not setting the times"
456       " in the first place (METHOD='system')"), GRID+1 },
457   {"touch", 'm', 0, 0,
458    N_("don't extract file modified time"), GRID+1 },
459   {"same-owner", SAME_OWNER_OPTION, 0, 0,
460    N_("try extracting files with the same ownership"), GRID+1 },
461   {"no-same-owner", NO_SAME_OWNER_OPTION, 0, 0,
462    N_("extract files as yourself"), GRID+1 },
463   {"numeric-owner", NUMERIC_OWNER_OPTION, 0, 0,
464    N_("always use numbers for user/group names"), GRID+1 },
465   {"preserve-permissions", 'p', 0, 0,
466    N_("extract information about file permissions (default for superuser)"),
467    GRID+1 },
468   {"same-permissions", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
469   {"no-same-permissions", NO_SAME_PERMISSIONS_OPTION, 0, 0,
470    N_("apply the user's umask when extracting permissions from the archive (default for ordinary users)"), GRID+1 },
471   {"preserve-order", 's', 0, 0,
472    N_("sort names to extract to match archive"), GRID+1 },
473   {"same-order", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
474   {"preserve", PRESERVE_OPTION, 0, 0,
475    N_("same as both -p and -s"), GRID+1 },
476   {"delay-directory-restore", DELAY_DIRECTORY_RESTORE_OPTION, 0, 0,
477    N_("delay setting modification times and permissions of extracted"
478       " directories until the end of extraction"), GRID+1 },
479   {"no-delay-directory-restore", NO_DELAY_DIRECTORY_RESTORE_OPTION, 0, 0,
480    N_("cancel the effect of --delay-directory-restore option"), GRID+1 },
481 #undef GRID
482
483 #define GRID 60
484   {NULL, 0, NULL, 0,
485    N_("Device selection and switching:\n"), GRID+1 },
486
487   {"file", 'f', N_("ARCHIVE"), 0,
488    N_("use archive file or device ARCHIVE"), GRID+1 },
489   {"force-local", FORCE_LOCAL_OPTION, 0, 0,
490    N_("archive file is local even if it has a colon"), GRID+1 },
491   {"rmt-command", RMT_COMMAND_OPTION, N_("COMMAND"), 0,
492    N_("use given rmt COMMAND instead of rmt"), GRID+1 },
493   {"rsh-command", RSH_COMMAND_OPTION, N_("COMMAND"), 0,
494    N_("use remote COMMAND instead of rsh"), GRID+1 },
495 #ifdef DEVICE_PREFIX
496   {"-[0-7][lmh]", 0, NULL, OPTION_DOC, /* It is OK, since `name' will never be
497                                           translated */
498    N_("specify drive and density"), GRID+1 },
499 #endif
500   {NULL, '0', NULL, OPTION_HIDDEN, NULL, GRID+1 },
501   {NULL, '1', NULL, OPTION_HIDDEN, NULL, GRID+1 },
502   {NULL, '2', NULL, OPTION_HIDDEN, NULL, GRID+1 },
503   {NULL, '3', NULL, OPTION_HIDDEN, NULL, GRID+1 },
504   {NULL, '4', NULL, OPTION_HIDDEN, NULL, GRID+1 },
505   {NULL, '5', NULL, OPTION_HIDDEN, NULL, GRID+1 },
506   {NULL, '6', NULL, OPTION_HIDDEN, NULL, GRID+1 },
507   {NULL, '7', NULL, OPTION_HIDDEN, NULL, GRID+1 },
508   {NULL, '8', NULL, OPTION_HIDDEN, NULL, GRID+1 },
509   {NULL, '9', NULL, OPTION_HIDDEN, NULL, GRID+1 },
510
511   {"multi-volume", 'M', 0, 0,
512    N_("create/list/extract multi-volume archive"), GRID+1 },
513   {"tape-length", 'L', N_("NUMBER"), 0,
514    N_("change tape after writing NUMBER x 1024 bytes"), GRID+1 },
515   {"info-script", 'F', N_("NAME"), 0,
516    N_("run script at end of each tape (implies -M)"), GRID+1 },
517   {"new-volume-script", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
518   {"volno-file", VOLNO_FILE_OPTION, N_("FILE"), 0,
519    N_("use/update the volume number in FILE"), GRID+1 },
520 #undef GRID
521
522 #define GRID 70
523   {NULL, 0, NULL, 0,
524    N_("Device blocking:"), GRID+1 },
525
526   {"blocking-factor", 'b', N_("BLOCKS"), 0,
527    N_("BLOCKS x 512 bytes per record"), GRID+1 },
528   {"record-size", RECORD_SIZE_OPTION, N_("NUMBER"), 0,
529    N_("NUMBER of bytes per record, multiple of 512"), GRID+1 },
530   {"ignore-zeros", 'i', 0, 0,
531    N_("ignore zeroed blocks in archive (means EOF)"), GRID+1 },
532   {"read-full-records", 'B', 0, 0,
533    N_("reblock as we read (for 4.2BSD pipes)"), GRID+1 },
534 #undef GRID
535
536 #define GRID 80
537   {NULL, 0, NULL, 0,
538    N_("Archive format selection:"), GRID },
539
540   {"format", 'H', N_("FORMAT"), 0,
541    N_("create archive of the given format"), GRID+1 },
542
543   {NULL, 0, NULL, 0, N_("FORMAT is one of the following:"), GRID+2 },
544   {"  v7", 0, NULL, OPTION_DOC|OPTION_NO_TRANS, N_("old V7 tar format"),
545    GRID+3 },
546   {"  oldgnu", 0, NULL, OPTION_DOC|OPTION_NO_TRANS,
547    N_("GNU format as per tar <= 1.12"), GRID+3 },
548   {"  gnu", 0, NULL, OPTION_DOC|OPTION_NO_TRANS,
549    N_("GNU tar 1.13.x format"), GRID+3 },
550   {"  ustar", 0, NULL, OPTION_DOC|OPTION_NO_TRANS,
551    N_("POSIX 1003.1-1988 (ustar) format"), GRID+3 },
552   {"  pax", 0, NULL, OPTION_DOC|OPTION_NO_TRANS,
553    N_("POSIX 1003.1-2001 (pax) format"), GRID+3 },
554   {"  posix", 0, NULL, OPTION_DOC|OPTION_NO_TRANS, N_("same as pax"), GRID+3 },
555
556   {"old-archive", OLD_ARCHIVE_OPTION, 0, 0, /* FIXME */
557    N_("same as --format=v7"), GRID+8 },
558   {"portability", 0, 0, OPTION_ALIAS, NULL, GRID+8 },
559   {"posix", POSIX_OPTION, 0, 0,
560    N_("same as --format=posix"), GRID+8 },
561   {"pax-option", PAX_OPTION, N_("keyword[[:]=value][,keyword[[:]=value]]..."), 0,
562    N_("control pax keywords"), GRID+8 },
563   {"label", 'V', N_("TEXT"), 0,
564    N_("create archive with volume name TEXT; at list/extract time, use TEXT as a globbing pattern for volume name"), GRID+8 },
565   {"bzip2", 'j', 0, 0,
566    N_("filter the archive through bzip2"), GRID+8 },
567   {"gzip", 'z', 0, 0,
568    N_("filter the archive through gzip"), GRID+8 },
569   {"gunzip", 0, 0, OPTION_ALIAS, NULL, GRID+8 },
570   {"ungzip", 0, 0, OPTION_ALIAS, NULL, GRID+8 },
571   {"compress", 'Z', 0, 0,
572    N_("filter the archive through compress"), GRID+8 },
573   {"uncompress", 0, 0, OPTION_ALIAS, NULL, GRID+8 },
574   {"use-compress-program", USE_COMPRESS_PROGRAM_OPTION, N_("PROG"), 0,
575    N_("filter through PROG (must accept -d)"), GRID+8 },
576 #undef GRID
577
578 #define GRID 90
579   {NULL, 0, NULL, 0,
580    N_("Local file selection:"), GRID },
581
582   {"add-file", ARGP_KEY_ARG, N_("FILE"), 0,
583    N_("add given FILE to the archive (useful if its name starts with a dash)"), GRID+1 },
584   {"directory", 'C', N_("DIR"), 0,
585    N_("change to directory DIR"), GRID+1 },
586   {"files-from", 'T', N_("FILE"), 0,
587    N_("get names to extract or create from FILE"), GRID+1 },
588   {"null", NULL_OPTION, 0, 0,
589    N_("-T reads null-terminated names, disable -C"), GRID+1 },
590   {"unquote", UNQUOTE_OPTION, 0, 0,
591    N_("unquote filenames read with -T (default)"), GRID+1 },
592   {"no-unquote", NO_UNQUOTE_OPTION, 0, 0,
593    N_("do not unquote filenames read with -T"), GRID+1 },
594   {"exclude", EXCLUDE_OPTION, N_("PATTERN"), 0,
595    N_("exclude files, given as a PATTERN"), GRID+1 },
596   {"exclude-from", 'X', N_("FILE"), 0,
597    N_("exclude patterns listed in FILE"), GRID+1 },
598   {"exclude-caches", EXCLUDE_CACHES_OPTION, 0, 0,
599    N_("exclude directories containing a cache tag"), GRID+1 },
600   {"no-recursion", NO_RECURSION_OPTION, 0, 0,
601    N_("avoid descending automatically in directories"), GRID+1 },
602   {"one-file-system", ONE_FILE_SYSTEM_OPTION, 0, 0,
603    N_("stay in local file system when creating archive"), GRID+1 },
604   {"recursion", RECURSION_OPTION, 0, 0,
605    N_("recurse into directories (default)"), GRID+1 },
606   {"absolute-names", 'P', 0, 0,
607    N_("don't strip leading `/'s from file names"), GRID+1 },
608   {"dereference", 'h', 0, 0,
609    N_("follow symlinks; archive and dump the files they point to"), GRID+1 },
610   {"starting-file", 'K', N_("MEMBER-NAME"), 0,
611    N_("begin at member MEMBER-NAME in the archive"), GRID+1 },
612   {"newer", 'N', N_("DATE-OR-FILE"), 0,
613    N_("only store files newer than DATE-OR-FILE"), GRID+1 },
614   {"after-date", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
615   {"newer-mtime", NEWER_MTIME_OPTION, N_("DATE"), 0,
616    N_("compare date and time when data changed only"), GRID+1 },
617   {"backup", BACKUP_OPTION, N_("CONTROL"), OPTION_ARG_OPTIONAL,
618    N_("backup before removal, choose version CONTROL"), GRID+1 },
619   {"suffix", SUFFIX_OPTION, N_("STRING"), 0,
620    N_("backup before removal, override usual suffix ('~' unless overridden by environment variable SIMPLE_BACKUP_SUFFIX)"), GRID+1 },
621 #undef GRID
622
623 #define GRID 92
624   {NULL, 0, NULL, 0,
625    N_("File name transformations:"), GRID },
626   {"strip-components", STRIP_COMPONENTS_OPTION, N_("NUMBER"), 0,
627    N_("strip NUMBER leading components from file names on extraction"),
628    GRID+1 },
629   {"transform", TRANSFORM_OPTION, N_("EXPRESSION"), 0,
630    N_("Use sed replace EXPRESSION to transform file names"), GRID+1 },
631 #undef GRID
632
633 #define GRID 95  
634   {NULL, 0, NULL, 0,
635    N_("File name matching options (affect both exclude and include patterns):"),
636    GRID },
637   {"ignore-case", IGNORE_CASE_OPTION, 0, 0,
638    N_("ignore case"), GRID+1 },
639   {"anchored", ANCHORED_OPTION, 0, 0,
640    N_("patterns match file name start"), GRID+1 },
641   {"no-anchored", NO_ANCHORED_OPTION, 0, 0,
642    N_("patterns match after any `/' (default for exclusion)"), GRID+1 },
643   {"no-ignore-case", NO_IGNORE_CASE_OPTION, 0, 0,
644    N_("case sensitive matching (default)"), GRID+1 },
645   {"wildcards", WILDCARDS_OPTION, 0, 0,
646    N_("use wildcards (default for exclusion)"), GRID+1 },
647   {"no-wildcards", NO_WILDCARDS_OPTION, 0, 0,
648    N_("verbatim string matching"), GRID+1 },
649   {"no-wildcards-match-slash", NO_WILDCARDS_MATCH_SLASH_OPTION, 0, 0,
650    N_("wildcards do not match `/'"), GRID+1 },
651   {"wildcards-match-slash", WILDCARDS_MATCH_SLASH_OPTION, 0, 0,
652    N_("wildcards match `/' (default for exclusion)"), GRID+1 },
653 #undef GRID
654   
655 #define GRID 100
656   {NULL, 0, NULL, 0,
657    N_("Informative output:"), GRID },
658
659   {"verbose", 'v', 0, 0,
660    N_("verbosely list files processed"), GRID+1 },
661   {"checkpoint", CHECKPOINT_OPTION, N_("[.]NUMBER"), OPTION_ARG_OPTIONAL,
662    N_("display progress messages every NUMBERth record (default 10)"),
663    GRID+1 },
664   {"check-links", 'l', 0, 0,
665    N_("print a message if not all links are dumped"), GRID+1 },
666   {"totals", TOTALS_OPTION, N_("SIGNAL"), OPTION_ARG_OPTIONAL,
667    N_("print total bytes after processing the archive; "
668       "with an argument - print total bytes when this SIGNAL is delivered; "
669       "Allowed signals are: SIGHUP, SIGQUIT, SIGINT, SIGUSR1 and SIGUSR2; "
670       "the names without SIG prefix are also accepted"), GRID+1 },
671   {"utc", UTC_OPTION, 0, 0,
672    N_("print file modification dates in UTC"), GRID+1 },
673   {"index-file", INDEX_FILE_OPTION, N_("FILE"), 0,
674    N_("send verbose output to FILE"), GRID+1 },
675   {"block-number", 'R', 0, 0,
676    N_("show block number within archive with each message"), GRID+1 },
677   {"interactive", 'w', 0, 0,
678    N_("ask for confirmation for every action"), GRID+1 },
679   {"confirmation", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
680   {"show-defaults", SHOW_DEFAULTS_OPTION, 0, 0,
681    N_("show tar defaults"), GRID+1 },
682   {"show-omitted-dirs", SHOW_OMITTED_DIRS_OPTION, 0, 0,
683    N_("when listing or extracting, list each directory that does not match search criteria"), GRID+1 },
684   {"show-transformed-names", SHOW_TRANSFORMED_NAMES_OPTION, 0, 0,
685    N_("show file or archive names after transformation"),
686    GRID+1 },
687   {"show-stored-names", 0, 0, OPTION_ALIAS, NULL, GRID+1 },
688   {"quoting-style", QUOTING_STYLE_OPTION, N_("STYLE"), 0,
689    N_("set name quoting style; see below for valid STYLE values"), GRID+1 },
690   {"quote-chars", QUOTE_CHARS_OPTION, N_("STRING"), 0,
691    N_("additionally quote characters from STRING"), GRID+1 },
692   {"no-quote-chars", NO_QUOTE_CHARS_OPTION, N_("STRING"), 0,
693    N_("disable quoting for characters from STRING"), GRID+1 },
694 #undef GRID
695
696 #define GRID 110
697   {NULL, 0, NULL, 0,
698    N_("Compatibility options:"), GRID },
699
700   {NULL, 'o', 0, 0,
701    N_("when creating, same as --old-archive; when extracting, same as --no-same-owner"), GRID+1 },
702 #undef GRID
703
704 #define GRID 120
705   {NULL, 0, NULL, 0,
706    N_("Other options:"), GRID },
707
708   {"restrict", RESTRICT_OPTION, 0, 0,
709    N_("disable use of some potentially harmful options"), -1 },
710
711   {"help",  '?', 0, 0,  N_("give this help list"), -1},
712   {"usage", USAGE_OPTION, 0, 0,  N_("give a short usage message"), -1},
713   {"version", VERSION_OPTION, 0, 0,  N_("print program version"), -1},
714   /* FIXME -V (--label) conflicts with the default short option for
715      --version */
716   {"HANG",        HANG_OPTION,    "SECS", OPTION_ARG_OPTIONAL | OPTION_HIDDEN,
717    N_("hang for SECS seconds (default 3600)"), 0},
718 #undef GRID
719
720   {0, 0, 0, 0, 0, 0}
721 };
722
723 static char const *const atime_preserve_args[] =
724 {
725   "replace", "system", NULL
726 };
727
728 static enum atime_preserve const atime_preserve_types[] =
729 {
730   replace_atime_preserve, system_atime_preserve
731 };
732
733 /* Make sure atime_preserve_types has as much entries as atime_preserve_args
734    (minus 1 for NULL guard) */
735 ARGMATCH_VERIFY (atime_preserve_args, atime_preserve_types);
736
737 /* Wildcard matching settings */
738 enum wildcards
739   {
740     default_wildcards, /* For exclusion == enable_wildcards,
741                           for inclusion == disable_wildcards */
742     disable_wildcards,
743     enable_wildcards
744   };
745
746 struct tar_args        /* Variables used during option parsing */
747 {
748   struct textual_date *textual_date; /* Keeps the arguments to --newer-mtime
749                                         and/or --date option if they are
750                                         textual dates */
751   enum wildcards wildcards;        /* Wildcard settings (--wildcards/
752                                       --no-wildcards) */
753   int matching_flags;              /* exclude_fnmatch options */
754   int include_anchored;            /* Pattern anchoring options used for
755                                       file inclusion */
756   bool o_option;                   /* True if -o option was given */
757   bool pax_option;                 /* True if --pax-option was given */
758   char const *backup_suffix_string;   /* --suffix option argument */
759   char const *version_control_string; /* --backup option argument */
760   bool input_files;                /* True if some input files where given */
761 };
762
763 #define MAKE_EXCL_OPTIONS(args) \
764  ((((args)->wildcards != disable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
765   | (args)->matching_flags \
766   | recursion_option)
767
768 #define MAKE_INCL_OPTIONS(args) \
769  ((((args)->wildcards == enable_wildcards) ? EXCLUDE_WILDCARDS : 0) \
770   | (args)->include_anchored \
771   | (args)->matching_flags \
772   | recursion_option)
773
774 #ifdef REMOTE_SHELL                                                       
775 # define DECL_SHOW_DEFAULT_SETTINGS(stream, printer)                      \
776 {                                                                         \
777   printer (stream,                                                        \
778            "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s",   \
779            archive_format_string (DEFAULT_ARCHIVE_FORMAT),                \
780            DEFAULT_ARCHIVE, DEFAULT_BLOCKING,                             \
781            quoting_style_args[DEFAULT_QUOTING_STYLE],                     \
782            DEFAULT_RMT_COMMAND);                                          \
783   printer (stream, " --rsh-command=%s", REMOTE_SHELL);                    \
784   printer (stream, "\n");                                                 \
785 }
786 #else
787 # define DECL_SHOW_DEFAULT_SETTINGS(stream, printer)                      \
788 {                                                                         \
789   printer (stream,                                                        \
790            "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s",   \
791            archive_format_string (DEFAULT_ARCHIVE_FORMAT),                \
792            DEFAULT_ARCHIVE, DEFAULT_BLOCKING,                             \
793            quoting_style_args[DEFAULT_QUOTING_STYLE],                     \
794            DEFAULT_RMT_COMMAND);                                          \
795   printer (stream, "\n");                                                 \
796 }
797 #endif
798
799 static void
800 show_default_settings (FILE *fp)
801      DECL_SHOW_DEFAULT_SETTINGS(fp, fprintf)
802      
803 static void
804 show_default_settings_fs (argp_fmtstream_t fs)
805      DECL_SHOW_DEFAULT_SETTINGS(fs, argp_fmtstream_printf)
806
807 static void
808 set_subcommand_option (enum subcommand subcommand)
809 {
810   if (subcommand_option != UNKNOWN_SUBCOMMAND
811       && subcommand_option != subcommand)
812     USAGE_ERROR ((0, 0,
813                   _("You may not specify more than one `-Acdtrux' option")));
814
815   subcommand_option = subcommand;
816 }
817
818 static void
819 set_use_compress_program_option (const char *string)
820 {
821   if (use_compress_program_option
822       && strcmp (use_compress_program_option, string) != 0)
823     USAGE_ERROR ((0, 0, _("Conflicting compression options")));
824
825   use_compress_program_option = string;
826 }
827 \f
828 static RETSIGTYPE
829 sigstat (int signo)
830 {
831   compute_duration ();
832   print_total_stats ();
833 #ifndef HAVE_SIGACTION
834   signal (signo, sigstat);
835 #endif
836 }
837
838 static void
839 stat_on_signal (int signo)
840 {
841 #ifdef HAVE_SIGACTION
842   struct sigaction act;
843   act.sa_handler = sigstat;
844   sigemptyset (&act.sa_mask);
845   act.sa_flags = 0;
846   sigaction (signo, &act, NULL);
847 #else
848   signal (signo, sigstat);
849 #endif
850 }
851
852 void
853 set_stat_signal (const char *name)
854 {
855   static struct sigtab
856   {
857     char *name;
858     int signo;
859   } sigtab[] = {
860     { "SIGUSR1", SIGUSR1 },
861     { "USR1", SIGUSR1 },
862     { "SIGUSR2", SIGUSR2 },
863     { "USR2", SIGUSR2 },
864     { "SIGHUP", SIGHUP },
865     { "HUP", SIGHUP },
866     { "SIGINT", SIGINT },
867     { "INT", SIGINT },
868     { "SIGQUIT", SIGQUIT },
869     { "QUIT", SIGQUIT }
870   };
871   struct sigtab *p;
872   
873   for (p = sigtab; p < sigtab + sizeof (sigtab) / sizeof (sigtab[0]); p++)
874     if (strcmp (p->name, name) == 0)
875       {
876         stat_on_signal (p->signo);
877         return;
878       }
879   FATAL_ERROR ((0, 0, _("Unknown signal name: %s"), name));
880 }
881
882 \f
883 struct textual_date
884 {
885   struct textual_date *next;
886   struct timespec *ts;
887   const char *option;
888   const char *date;
889 };
890
891 static void
892 get_date_or_file (struct tar_args *args, const char *option,
893                   const char *str, struct timespec *ts)
894 {
895   if (FILE_SYSTEM_PREFIX_LEN (str) != 0
896       || ISSLASH (*str)
897       || *str == '.')
898     {
899       struct stat st;
900       if (deref_stat (dereference_option, str, &st) != 0)
901         {
902           stat_error (str);
903           USAGE_ERROR ((0, 0, _("Date sample file not found")));
904         }
905       *ts = get_stat_mtime (&st);
906     }
907   else
908     {
909       if (! get_date (ts, str, NULL))
910         {
911           WARN ((0, 0, _("Substituting %s for unknown date format %s"),
912                  tartime (*ts, false), quote (str)));
913           ts->tv_nsec = 0;
914         }
915       else
916         {
917           struct textual_date *p = xmalloc (sizeof (*p));
918           p->ts = ts;
919           p->option = option;
920           p->date = str;
921           p->next = args->textual_date;
922           args->textual_date = p;
923         }
924     }
925 }
926
927 static void
928 report_textual_dates (struct tar_args *args)
929 {
930   struct textual_date *p;
931   for (p = args->textual_date; p; )
932     {
933       struct textual_date *next = p->next;
934       char const *treated_as = tartime (*p->ts, true);
935       if (strcmp (p->date, treated_as) != 0)
936         WARN ((0, 0, _("Option %s: Treating date `%s' as %s"),
937                p->option, p->date, treated_as));
938       free (p);
939       p = next;
940     }
941 }
942
943 \f
944 static volatile int _argp_hang;
945
946 enum read_file_list_state  /* Result of reading file name from the list file */
947   {
948     file_list_success,     /* OK, name read successfully */
949     file_list_end,         /* End of list file */
950     file_list_zero         /* Zero separator encountered where it should not */
951   };
952
953 /* Read from FP a sequence of characters up to FILENAME_TERMINATOR and put them
954    into STK.
955  */
956 static enum read_file_list_state
957 read_name_from_file (FILE *fp, struct obstack *stk)
958 {
959   int c;
960   size_t counter = 0;
961
962   for (c = getc (fp); c != EOF && c != filename_terminator; c = getc (fp))
963     {
964       if (c == 0)
965         {
966           /* We have read a zero separator. The file possibly is
967              zero-separated */
968           /* FATAL_ERROR((0, 0, N_("file name contains null character"))); */
969           return file_list_zero;
970         }
971       obstack_1grow (stk, c);
972       counter++;
973     }
974
975   obstack_1grow (stk, 0);
976
977   return (counter == 0 && c == EOF) ? file_list_end : file_list_success;
978 }
979
980 \f
981 static bool files_from_option;  /* When set, tar will not refuse to create
982                                    empty archives */
983 static struct obstack argv_stk; /* Storage for additional command line options
984                                    read using -T option */
985
986 /* Prevent recursive inclusion of the same file */
987 struct file_id_list
988 {
989   struct file_id_list *next;
990   ino_t ino;
991   dev_t dev;
992 };
993
994 static struct file_id_list *file_id_list;
995
996 static void
997 add_file_id (const char *filename)
998 {
999   struct file_id_list *p;
1000   struct stat st;
1001
1002   if (stat (filename, &st))
1003     stat_fatal (filename);
1004   for (p = file_id_list; p; p = p->next)
1005     if (p->ino == st.st_ino && p->dev == st.st_dev)
1006       {
1007         FATAL_ERROR ((0, 0, _("%s: file list already read"),
1008                       quotearg_colon (filename)));
1009       }
1010   p = xmalloc (sizeof *p);
1011   p->next = file_id_list;
1012   p->ino = st.st_ino;
1013   p->dev = st.st_dev;
1014   file_id_list = p;
1015 }
1016
1017 /* Default density numbers for [0-9][lmh] device specifications */
1018
1019 #ifndef LOW_DENSITY_NUM
1020 # define LOW_DENSITY_NUM 0
1021 #endif
1022
1023 #ifndef MID_DENSITY_NUM
1024 # define MID_DENSITY_NUM 8
1025 #endif
1026
1027 #ifndef HIGH_DENSITY_NUM
1028 # define HIGH_DENSITY_NUM 16
1029 #endif
1030
1031 static void
1032 update_argv (const char *filename, struct argp_state *state)
1033 {
1034   FILE *fp;
1035   size_t count = 0, i;
1036   char *start, *p;
1037   char **new_argv;
1038   size_t new_argc;
1039   bool is_stdin = false;
1040   enum read_file_list_state read_state;
1041
1042   if (!strcmp (filename, "-"))
1043     {
1044       is_stdin = true;
1045       request_stdin ("-T");
1046       fp = stdin;
1047     }
1048   else
1049     {
1050       add_file_id (filename);
1051       if ((fp = fopen (filename, "r")) == NULL)
1052         open_fatal (filename);
1053     }
1054
1055   while ((read_state = read_name_from_file (fp, &argv_stk)) == file_list_success)
1056     count++;
1057
1058   if (read_state == file_list_zero)
1059     {
1060       size_t size;
1061
1062       WARN ((0, 0, N_("%s: file name read contains nul character"),
1063              quotearg_colon (filename)));
1064
1065       /* Prepare new stack contents */
1066       size = obstack_object_size (&argv_stk);
1067       p = obstack_finish (&argv_stk);
1068       for (; size > 0; size--, p++)
1069         if (*p)
1070           obstack_1grow (&argv_stk, *p);
1071         else
1072           obstack_1grow (&argv_stk, '\n');
1073       obstack_1grow (&argv_stk, 0);
1074       count = 1;
1075
1076       /* Read rest of files using new filename terminator */
1077       filename_terminator = 0;
1078       while (read_name_from_file (fp, &argv_stk) == file_list_success)
1079         count++;
1080     }
1081
1082   if (!is_stdin)
1083     fclose (fp);
1084
1085   if (count == 0)
1086     return;
1087
1088   start = obstack_finish (&argv_stk);
1089
1090   if (filename_terminator == 0)
1091     for (p = start; *p; p += strlen (p) + 1)
1092       if (p[0] == '-')
1093         count++;
1094
1095   new_argc = state->argc + count;
1096   new_argv = xmalloc (sizeof (state->argv[0]) * (new_argc + 1));
1097   memcpy (new_argv, state->argv, sizeof (state->argv[0]) * (state->argc + 1));
1098   state->argv = new_argv;
1099   memmove (&state->argv[state->next + count], &state->argv[state->next],
1100            (state->argc - state->next + 1) * sizeof (state->argv[0]));
1101
1102   state->argc = new_argc;
1103
1104   for (i = state->next, p = start; *p; p += strlen (p) + 1, i++)
1105     {
1106       if (filename_terminator == 0 && p[0] == '-')
1107         state->argv[i++] = "--add-file";
1108       state->argv[i] = p;
1109     }
1110 }
1111
1112 \f
1113 static void
1114 tar_help (struct argp_state *state)
1115 {
1116   argp_fmtstream_t fs;
1117   state->flags |= ARGP_NO_EXIT;
1118   argp_state_help (state, state->out_stream,
1119                    ARGP_HELP_STD_HELP & ~ARGP_HELP_BUG_ADDR);
1120   /* FIXME: use struct uparams.rmargin (from argp-help.c) instead of 79 */
1121   fs = argp_make_fmtstream (state->out_stream, 0, 79, 0);
1122   
1123   argp_fmtstream_printf (fs, "\n%s\n\n",
1124                        _("Valid arguments for --quoting-style options are:"));
1125   tar_list_quoting_styles (fs, "  ");
1126         
1127   argp_fmtstream_puts (fs, _("\n*This* tar defaults to:\n"));
1128   show_default_settings_fs (fs);
1129   argp_fmtstream_putc (fs, '\n');
1130   argp_fmtstream_printf (fs, _("Report bugs to %s.\n"),
1131                          argp_program_bug_address);
1132   argp_fmtstream_free (fs);
1133 }
1134 \f
1135 static error_t
1136 parse_opt (int key, char *arg, struct argp_state *state)
1137 {
1138   struct tar_args *args = state->input;
1139
1140   switch (key)
1141     {
1142       case ARGP_KEY_ARG:
1143         /* File name or non-parsed option, because of ARGP_IN_ORDER */
1144         name_add_name (arg, MAKE_INCL_OPTIONS (args));
1145         args->input_files = true;
1146         break;
1147
1148     case 'A':
1149       set_subcommand_option (CAT_SUBCOMMAND);
1150       break;
1151
1152     case 'b':
1153       {
1154         uintmax_t u;
1155         if (! (xstrtoumax (arg, 0, 10, &u, "") == LONGINT_OK
1156                && u == (blocking_factor = u)
1157                && 0 < blocking_factor
1158                && u == (record_size = u * BLOCKSIZE) / BLOCKSIZE))
1159           USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
1160                         _("Invalid blocking factor")));
1161       }
1162       break;
1163
1164     case 'B':
1165       /* Try to reblock input records.  For reading 4.2BSD pipes.  */
1166
1167       /* It would surely make sense to exchange -B and -R, but it seems
1168          that -B has been used for a long while in Sun tar and most
1169          BSD-derived systems.  This is a consequence of the block/record
1170          terminology confusion.  */
1171
1172       read_full_records_option = true;
1173       break;
1174
1175     case 'c':
1176       set_subcommand_option (CREATE_SUBCOMMAND);
1177       break;
1178
1179     case 'C':
1180       name_add_dir (arg);
1181       break;
1182
1183     case 'd':
1184       set_subcommand_option (DIFF_SUBCOMMAND);
1185       break;
1186
1187     case 'f':
1188       if (archive_names == allocated_archive_names)
1189         archive_name_array = x2nrealloc (archive_name_array,
1190                                          &allocated_archive_names,
1191                                          sizeof (archive_name_array[0]));
1192
1193       archive_name_array[archive_names++] = arg;
1194       break;
1195
1196     case 'F':
1197       /* Since -F is only useful with -M, make it implied.  Run this
1198          script at the end of each tape.  */
1199
1200       info_script_option = arg;
1201       multi_volume_option = true;
1202       break;
1203
1204     case 'g':
1205       listed_incremental_option = arg;
1206       after_date_option = true;
1207       /* Fall through.  */
1208
1209     case 'G':
1210       /* We are making an incremental dump (FIXME: are we?); save
1211          directories at the beginning of the archive, and include in each
1212          directory its contents.  */
1213
1214       incremental_option = true;
1215       break;
1216
1217     case 'h':
1218       /* Follow symbolic links.  */
1219       dereference_option = true;
1220       break;
1221
1222     case 'i':
1223       /* Ignore zero blocks (eofs).  This can't be the default,
1224          because Unix tar writes two blocks of zeros, then pads out
1225          the record with garbage.  */
1226
1227       ignore_zeros_option = true;
1228       break;
1229
1230     case 'I':
1231       USAGE_ERROR ((0, 0,
1232                     _("Warning: the -I option is not supported;"
1233                       " perhaps you meant -j or -T?")));
1234       break;
1235
1236     case 'j':
1237       set_use_compress_program_option ("bzip2");
1238       break;
1239
1240     case 'k':
1241       /* Don't replace existing files.  */
1242       old_files_option = KEEP_OLD_FILES;
1243       break;
1244
1245     case 'K':
1246       starting_file_option = true;
1247       addname (arg, 0);
1248       break;
1249
1250     case ONE_FILE_SYSTEM_OPTION:
1251       /* When dumping directories, don't dump files/subdirectories
1252          that are on other filesystems. */
1253       one_file_system_option = true;
1254       break;
1255
1256     case 'l':
1257       check_links_option = 1;
1258       break;
1259
1260     case 'L':
1261       {
1262         uintmax_t u;
1263         if (xstrtoumax (arg, 0, 10, &u, "") != LONGINT_OK)
1264           USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
1265                         _("Invalid tape length")));
1266         tape_length_option = 1024 * (tarlong) u;
1267         multi_volume_option = true;
1268       }
1269       break;
1270
1271     case 'm':
1272       touch_option = true;
1273       break;
1274
1275     case 'M':
1276       /* Make multivolume archive: when we can't write any more into
1277          the archive, re-open it, and continue writing.  */
1278
1279       multi_volume_option = true;
1280       break;
1281
1282     case MTIME_OPTION:
1283       get_date_or_file (args, "--mtime", arg, &mtime_option);
1284       set_mtime_option = true;
1285       break;
1286       
1287     case 'n':
1288       seekable_archive = true;
1289       break;
1290
1291     case 'N':
1292       after_date_option = true;
1293       /* Fall through.  */
1294
1295     case NEWER_MTIME_OPTION:
1296       if (NEWER_OPTION_INITIALIZED (newer_mtime_option))
1297         USAGE_ERROR ((0, 0, _("More than one threshold date")));
1298       get_date_or_file (args,
1299                         key == NEWER_MTIME_OPTION ? "--newer-mtime"
1300                           : "--after-date", arg, &newer_mtime_option);
1301       break;
1302
1303     case 'o':
1304       args->o_option = true;
1305       break;
1306
1307     case 'O':
1308       to_stdout_option = true;
1309       break;
1310
1311     case 'p':
1312       same_permissions_option = true;
1313       break;
1314
1315     case 'P':
1316       absolute_names_option = true;
1317       break;
1318
1319     case 'r':
1320       set_subcommand_option (APPEND_SUBCOMMAND);
1321       break;
1322
1323     case 'R':
1324       /* Print block numbers for debugging bad tar archives.  */
1325
1326       /* It would surely make sense to exchange -B and -R, but it seems
1327          that -B has been used for a long while in Sun tar ans most
1328          BSD-derived systems.  This is a consequence of the block/record
1329          terminology confusion.  */
1330
1331       block_number_option = true;
1332       break;
1333
1334     case 's':
1335       /* Names to extr are sorted.  */
1336
1337       same_order_option = true;
1338       break;
1339
1340     case 'S':
1341       sparse_option = true;
1342       break;
1343
1344     case 't':
1345       set_subcommand_option (LIST_SUBCOMMAND);
1346       verbose_option++;
1347       break;
1348
1349     case TEST_LABEL_OPTION:
1350       set_subcommand_option (LIST_SUBCOMMAND);
1351       test_label_option = true;
1352       break;
1353
1354     case 'T':
1355       update_argv (arg, state);
1356       /* Indicate we've been given -T option. This is for backward
1357          compatibility only, so that `tar cfT archive /dev/null will
1358          succeed */
1359       files_from_option = true;
1360       break;
1361
1362     case 'u':
1363       set_subcommand_option (UPDATE_SUBCOMMAND);
1364       break;
1365
1366     case 'U':
1367       old_files_option = UNLINK_FIRST_OLD_FILES;
1368       break;
1369
1370     case UTC_OPTION:
1371       utc_option = true;
1372       break;
1373
1374     case 'v':
1375       verbose_option++;
1376       break;
1377
1378     case 'V':
1379       volume_label_option = arg;
1380       break;
1381
1382     case 'w':
1383       interactive_option = true;
1384       break;
1385
1386     case 'W':
1387       verify_option = true;
1388       break;
1389
1390     case 'x':
1391       set_subcommand_option (EXTRACT_SUBCOMMAND);
1392       break;
1393
1394     case 'X':
1395       if (add_exclude_file (add_exclude, excluded, arg,
1396                             MAKE_EXCL_OPTIONS (args), '\n')
1397           != 0)
1398         {
1399           int e = errno;
1400           FATAL_ERROR ((0, e, "%s", quotearg_colon (arg)));
1401         }
1402       break;
1403
1404     case 'z':
1405       set_use_compress_program_option ("gzip");
1406       break;
1407
1408     case 'Z':
1409       set_use_compress_program_option ("compress");
1410       break;
1411
1412     case ANCHORED_OPTION:
1413       args->matching_flags |= EXCLUDE_ANCHORED;
1414       break;
1415
1416     case ATIME_PRESERVE_OPTION:
1417       atime_preserve_option =
1418         (arg
1419          ? XARGMATCH ("--atime-preserve", arg,
1420                       atime_preserve_args, atime_preserve_types)
1421          : replace_atime_preserve);
1422       if (! O_NOATIME && atime_preserve_option == system_atime_preserve)
1423         FATAL_ERROR ((0, 0,
1424                       _("--atime-preserve='system' is not supported"
1425                         " on this platform")));
1426       break;
1427
1428     case CHECKPOINT_OPTION:
1429       if (arg)
1430         {
1431           char *p;
1432
1433           if (*arg == '.')
1434             {
1435               checkpoint_style = checkpoint_dot;
1436               arg++;
1437             }
1438           checkpoint_option = strtoul (arg, &p, 0);
1439           if (*p)
1440             FATAL_ERROR ((0, 0,
1441                           _("--checkpoint value is not an integer")));
1442         }
1443       else
1444         checkpoint_option = 10;
1445       break;
1446
1447     case BACKUP_OPTION:
1448       backup_option = true;
1449       if (arg)
1450         args->version_control_string = arg;
1451       break;
1452
1453     case DELAY_DIRECTORY_RESTORE_OPTION:
1454       delay_directory_restore_option = true;
1455       break;
1456
1457     case NO_DELAY_DIRECTORY_RESTORE_OPTION:
1458       delay_directory_restore_option = false;
1459       break;
1460
1461     case DELETE_OPTION:
1462       set_subcommand_option (DELETE_SUBCOMMAND);
1463       break;
1464
1465     case EXCLUDE_OPTION:
1466       add_exclude (excluded, arg, MAKE_EXCL_OPTIONS (args));
1467       break;
1468
1469     case EXCLUDE_CACHES_OPTION:
1470       exclude_caches_option = true;
1471       break;
1472
1473     case FORCE_LOCAL_OPTION:
1474       force_local_option = true;
1475       break;
1476
1477     case 'H':
1478       set_archive_format (arg);
1479       break;
1480
1481     case INDEX_FILE_OPTION:
1482       index_file_name = arg;
1483       break;
1484
1485     case IGNORE_CASE_OPTION:
1486       args->matching_flags |= FNM_CASEFOLD;
1487       break;
1488
1489     case IGNORE_COMMAND_ERROR_OPTION:
1490       ignore_command_error_option = true;
1491       break;
1492
1493     case IGNORE_FAILED_READ_OPTION:
1494       ignore_failed_read_option = true;
1495       break;
1496
1497     case KEEP_NEWER_FILES_OPTION:
1498       old_files_option = KEEP_NEWER_FILES;
1499       break;
1500
1501     case GROUP_OPTION:
1502       if (! (strlen (arg) < GNAME_FIELD_SIZE
1503              && gname_to_gid (arg, &group_option)))
1504         {
1505           uintmax_t g;
1506           if (xstrtoumax (arg, 0, 10, &g, "") == LONGINT_OK
1507               && g == (gid_t) g)
1508             group_option = g;
1509           else
1510             FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
1511                           _("%s: Invalid group")));
1512         }
1513       break;
1514
1515     case MODE_OPTION:
1516       mode_option = mode_compile (arg);
1517       if (!mode_option)
1518         FATAL_ERROR ((0, 0, _("Invalid mode given on option")));
1519       initial_umask = umask (0);
1520       umask (initial_umask);
1521       break;
1522
1523     case NO_ANCHORED_OPTION:
1524       args->include_anchored = 0; /* Clear the default for comman line args */
1525       args->matching_flags &= ~ EXCLUDE_ANCHORED;
1526       break;
1527
1528     case NO_IGNORE_CASE_OPTION:
1529       args->matching_flags &= ~ FNM_CASEFOLD;
1530       break;
1531
1532     case NO_IGNORE_COMMAND_ERROR_OPTION:
1533       ignore_command_error_option = false;
1534       break;
1535
1536     case NO_OVERWRITE_DIR_OPTION:
1537       old_files_option = NO_OVERWRITE_DIR_OLD_FILES;
1538       break;
1539
1540     case NO_QUOTE_CHARS_OPTION:
1541       for (;*arg; arg++)
1542         set_char_quoting (NULL, *arg, 0);
1543       break;
1544
1545     case NO_WILDCARDS_OPTION:
1546       args->wildcards = disable_wildcards;
1547       break;
1548
1549     case NO_WILDCARDS_MATCH_SLASH_OPTION:
1550       args->matching_flags |= FNM_FILE_NAME;
1551       break;
1552
1553     case NULL_OPTION:
1554       filename_terminator = '\0';
1555       break;
1556
1557     case NUMERIC_OWNER_OPTION:
1558       numeric_owner_option = true;
1559       break;
1560
1561     case OCCURRENCE_OPTION:
1562       if (!arg)
1563         occurrence_option = 1;
1564       else
1565         {
1566           uintmax_t u;
1567           if (xstrtoumax (arg, 0, 10, &u, "") == LONGINT_OK)
1568             occurrence_option = u;
1569           else
1570             FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
1571                           _("Invalid number")));
1572         }
1573       break;
1574
1575     case OVERWRITE_DIR_OPTION:
1576       old_files_option = DEFAULT_OLD_FILES;
1577       break;
1578
1579     case OVERWRITE_OPTION:
1580       old_files_option = OVERWRITE_OLD_FILES;
1581       break;
1582
1583     case OWNER_OPTION:
1584       if (! (strlen (arg) < UNAME_FIELD_SIZE
1585              && uname_to_uid (arg, &owner_option)))
1586         {
1587           uintmax_t u;
1588           if (xstrtoumax (arg, 0, 10, &u, "") == LONGINT_OK
1589               && u == (uid_t) u)
1590             owner_option = u;
1591           else
1592             FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
1593                           _("Invalid owner")));
1594         }
1595       break;
1596
1597     case QUOTE_CHARS_OPTION:
1598       for (;*arg; arg++)
1599         set_char_quoting (NULL, *arg, 1);
1600       break;
1601
1602     case QUOTING_STYLE_OPTION:
1603       tar_set_quoting_style (arg);
1604       break;
1605
1606     case PAX_OPTION:
1607       args->pax_option = true;
1608       xheader_set_option (arg);
1609       break;
1610
1611     case POSIX_OPTION:
1612       set_archive_format ("posix");
1613       break;
1614
1615     case PRESERVE_OPTION:
1616       /* FIXME: What it is good for? */
1617       same_permissions_option = true;
1618       same_order_option = true;
1619       break;
1620
1621     case RECORD_SIZE_OPTION:
1622       {
1623         uintmax_t u;
1624         if (! (xstrtoumax (arg, 0, 10, &u, "") == LONGINT_OK
1625                && u == (size_t) u))
1626           USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
1627                         _("Invalid record size")));
1628         record_size = u;
1629         if (record_size % BLOCKSIZE != 0)
1630           USAGE_ERROR ((0, 0, _("Record size must be a multiple of %d."),
1631                         BLOCKSIZE));
1632         blocking_factor = record_size / BLOCKSIZE;
1633       }
1634       break;
1635
1636     case RECURSIVE_UNLINK_OPTION:
1637       recursive_unlink_option = true;
1638       break;
1639
1640     case REMOVE_FILES_OPTION:
1641       remove_files_option = true;
1642       break;
1643
1644     case RESTRICT_OPTION:
1645       restrict_option = true;
1646       break;
1647
1648     case RMT_COMMAND_OPTION:
1649       rmt_command = arg;
1650       break;
1651
1652     case RSH_COMMAND_OPTION:
1653       rsh_command_option = arg;
1654       break;
1655
1656     case SHOW_DEFAULTS_OPTION:
1657       show_default_settings (stdout);
1658       close_stdout ();
1659       exit (0);
1660
1661     case STRIP_COMPONENTS_OPTION:
1662       {
1663         uintmax_t u;
1664         if (! (xstrtoumax (arg, 0, 10, &u, "") == LONGINT_OK
1665                && u == (size_t) u))
1666           USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
1667                         _("Invalid number of elements")));
1668         strip_name_components = u;
1669       }
1670       break;
1671
1672     case SHOW_OMITTED_DIRS_OPTION:
1673       show_omitted_dirs_option = true;
1674       break;
1675
1676     case SHOW_TRANSFORMED_NAMES_OPTION:
1677       show_transformed_names_option = true;
1678       break;
1679
1680     case SUFFIX_OPTION:
1681       backup_option = true;
1682       args->backup_suffix_string = arg;
1683       break;
1684
1685     case TO_COMMAND_OPTION:
1686       if (to_command_option)
1687         USAGE_ERROR ((0, 0, _("Only one --to-command option allowed")));
1688       to_command_option = arg;
1689       break;
1690
1691     case TOTALS_OPTION:
1692       if (arg)
1693         set_stat_signal (arg);
1694       else
1695         totals_option = true;
1696       break;
1697
1698     case TRANSFORM_OPTION:
1699       set_transform_expr (arg);
1700       break;
1701       
1702     case USE_COMPRESS_PROGRAM_OPTION:
1703       set_use_compress_program_option (arg);
1704       break;
1705
1706     case VOLNO_FILE_OPTION:
1707       volno_file_option = arg;
1708       break;
1709
1710     case WILDCARDS_OPTION:
1711       args->wildcards = enable_wildcards;
1712       break;
1713
1714     case WILDCARDS_MATCH_SLASH_OPTION:
1715       args->matching_flags &= ~ FNM_FILE_NAME;
1716       break;
1717
1718     case NO_RECURSION_OPTION:
1719       recursion_option = 0;
1720       break;
1721
1722     case NO_SAME_OWNER_OPTION:
1723       same_owner_option = -1;
1724       break;
1725
1726     case NO_SAME_PERMISSIONS_OPTION:
1727       same_permissions_option = -1;
1728       break;
1729
1730     case RECURSION_OPTION:
1731       recursion_option = FNM_LEADING_DIR;
1732       break;
1733
1734     case SAME_OWNER_OPTION:
1735       same_owner_option = 1;
1736       break;
1737
1738     case UNQUOTE_OPTION:
1739       unquote_option = true;
1740       break;
1741
1742     case NO_UNQUOTE_OPTION:
1743       unquote_option = false;
1744       break;
1745
1746     case '0':
1747     case '1':
1748     case '2':
1749     case '3':
1750     case '4':
1751     case '5':
1752     case '6':
1753     case '7':
1754
1755 #ifdef DEVICE_PREFIX
1756       {
1757         int device = key - '0';
1758         int density;
1759         static char buf[sizeof DEVICE_PREFIX + 10];
1760         char *cursor;
1761
1762         if (arg[1])
1763           argp_error (state, _("Malformed density argument: %s"), quote (arg));
1764
1765         strcpy (buf, DEVICE_PREFIX);
1766         cursor = buf + strlen (buf);
1767
1768 #ifdef DENSITY_LETTER
1769
1770         sprintf (cursor, "%d%c", device, arg[0]);
1771
1772 #else /* not DENSITY_LETTER */
1773
1774         switch (arg[0])
1775           {
1776           case 'l':
1777             device += LOW_DENSITY_NUM;
1778             break;
1779
1780           case 'm':
1781             device += MID_DENSITY_NUM;
1782             break;
1783
1784           case 'h':
1785             device += HIGH_DENSITY_NUM;
1786             break;
1787
1788           default:
1789             argp_error (state, _("Unknown density: `%c'"), arg[0]);
1790           }
1791         sprintf (cursor, "%d", device);
1792
1793 #endif /* not DENSITY_LETTER */
1794
1795         if (archive_names == allocated_archive_names)
1796           archive_name_array = x2nrealloc (archive_name_array,
1797                                            &allocated_archive_names,
1798                                            sizeof (archive_name_array[0]));
1799         archive_name_array[archive_names++] = xstrdup (buf);
1800       }
1801       break;
1802
1803 #else /* not DEVICE_PREFIX */
1804
1805       argp_error (state,
1806                   _("Options `-[0-7][lmh]' not supported by *this* tar"));
1807
1808 #endif /* not DEVICE_PREFIX */
1809
1810     case '?':
1811       tar_help (state);
1812       close_stdout ();
1813       exit (0);
1814
1815     case USAGE_OPTION:
1816       argp_state_help (state, state->out_stream, ARGP_HELP_USAGE);
1817       close_stdout ();
1818       exit (0);
1819
1820     case VERSION_OPTION:
1821       version_etc (state->out_stream, "tar", PACKAGE_NAME, VERSION,
1822                    "John Gilmore", "Jay Fenlason", (char *) NULL);
1823       close_stdout ();
1824       exit (0);
1825
1826     case HANG_OPTION:
1827       _argp_hang = atoi (arg ? arg : "3600");
1828       while (_argp_hang-- > 0)
1829         sleep (1);
1830       break;
1831
1832     default:
1833       return ARGP_ERR_UNKNOWN;
1834     }
1835   return 0;
1836 }
1837
1838 static struct argp argp = {
1839   options,
1840   parse_opt,
1841   N_("[FILE]..."),
1842   doc,
1843   NULL,
1844   NULL,
1845   NULL
1846 };
1847
1848 void
1849 usage (int status)
1850 {
1851   argp_help (&argp, stderr, ARGP_HELP_SEE, (char*) program_name);
1852   close_stdout ();
1853   exit (status);
1854 }
1855
1856 /* Parse the options for tar.  */
1857
1858 static struct argp_option *
1859 find_argp_option (struct argp_option *options, int letter)
1860 {
1861   for (;
1862        !(options->name == NULL
1863          && options->key == 0
1864          && options->arg == 0
1865          && options->flags == 0
1866          && options->doc == NULL); options++)
1867     if (options->key == letter)
1868       return options;
1869   return NULL;
1870 }
1871
1872 static void
1873 decode_options (int argc, char **argv)
1874 {
1875   int index;
1876   struct tar_args args;
1877
1878   /* Set some default option values.  */
1879   args.textual_date = NULL;
1880   args.wildcards = default_wildcards;
1881   args.matching_flags = 0;
1882   args.include_anchored = EXCLUDE_ANCHORED;
1883   args.o_option = false;
1884   args.pax_option = false;
1885   args.backup_suffix_string = getenv ("SIMPLE_BACKUP_SUFFIX");
1886   args.version_control_string = 0;
1887   args.input_files = false;
1888
1889   subcommand_option = UNKNOWN_SUBCOMMAND;
1890   archive_format = DEFAULT_FORMAT;
1891   blocking_factor = DEFAULT_BLOCKING;
1892   record_size = DEFAULT_BLOCKING * BLOCKSIZE;
1893   excluded = new_exclude ();
1894   newer_mtime_option.tv_sec = TYPE_MINIMUM (time_t);
1895   newer_mtime_option.tv_nsec = -1;
1896   recursion_option = FNM_LEADING_DIR;
1897   unquote_option = true;
1898
1899   owner_option = -1;
1900   group_option = -1;
1901
1902   /* Convert old-style tar call by exploding option element and rearranging
1903      options accordingly.  */
1904
1905   if (argc > 1 && argv[1][0] != '-')
1906     {
1907       int new_argc;             /* argc value for rearranged arguments */
1908       char **new_argv;          /* argv value for rearranged arguments */
1909       char *const *in;          /* cursor into original argv */
1910       char **out;               /* cursor into rearranged argv */
1911       const char *letter;       /* cursor into old option letters */
1912       char buffer[3];           /* constructed option buffer */
1913
1914       /* Initialize a constructed option.  */
1915
1916       buffer[0] = '-';
1917       buffer[2] = '\0';
1918
1919       /* Allocate a new argument array, and copy program name in it.  */
1920
1921       new_argc = argc - 1 + strlen (argv[1]);
1922       new_argv = xmalloc ((new_argc + 1) * sizeof (char *));
1923       in = argv;
1924       out = new_argv;
1925       *out++ = *in++;
1926
1927       /* Copy each old letter option as a separate option, and have the
1928          corresponding argument moved next to it.  */
1929
1930       for (letter = *in++; *letter; letter++)
1931         {
1932           struct argp_option *opt;
1933
1934           buffer[1] = *letter;
1935           *out++ = xstrdup (buffer);
1936           opt = find_argp_option (options, *letter);
1937           if (opt && opt->arg)
1938             {
1939               if (in < argv + argc)
1940                 *out++ = *in++;
1941               else
1942                 USAGE_ERROR ((0, 0, _("Old option `%c' requires an argument."),
1943                               *letter));
1944             }
1945         }
1946
1947       /* Copy all remaining options.  */
1948
1949       while (in < argv + argc)
1950         *out++ = *in++;
1951       *out = 0;
1952
1953       /* Replace the old option list by the new one.  */
1954
1955       argc = new_argc;
1956       argv = new_argv;
1957     }
1958
1959   /* Parse all options and non-options as they appear.  */
1960
1961   prepend_default_options (getenv ("TAR_OPTIONS"), &argc, &argv);
1962
1963   if (argp_parse (&argp, argc, argv, ARGP_IN_ORDER|ARGP_NO_HELP,
1964                   &index, &args))
1965     exit (TAREXIT_FAILURE);
1966
1967
1968   /* Special handling for 'o' option:
1969
1970      GNU tar used to say "output old format".
1971      UNIX98 tar says don't chown files after extracting (we use
1972      "--no-same-owner" for this).
1973
1974      The old GNU tar semantics is retained when used with --create
1975      option, otherwise UNIX98 semantics is assumed */
1976
1977   if (args.o_option)
1978     {
1979       if (subcommand_option == CREATE_SUBCOMMAND)
1980         {
1981           /* GNU Tar <= 1.13 compatibility */
1982           set_archive_format ("v7");
1983         }
1984       else
1985         {
1986           /* UNIX98 compatibility */
1987           same_owner_option = -1;
1988         }
1989     }
1990
1991   /* Handle operands after any "--" argument.  */
1992   for (; index < argc; index++)
1993     {
1994       name_add_name (argv[index], MAKE_INCL_OPTIONS (&args));
1995       args.input_files = true;
1996     }
1997
1998   /* Warn about implicit use of the wildcards in command line arguments.
1999      See TODO */
2000   warn_regex_usage = args.wildcards == default_wildcards;
2001   
2002   /* Derive option values and check option consistency.  */
2003
2004   if (archive_format == DEFAULT_FORMAT)
2005     {
2006       if (args.pax_option)
2007         archive_format = POSIX_FORMAT;
2008       else
2009         archive_format = DEFAULT_ARCHIVE_FORMAT;
2010     }
2011
2012   if ((volume_label_option && subcommand_option == CREATE_SUBCOMMAND)
2013       || incremental_option
2014       || multi_volume_option
2015       || sparse_option)
2016     assert_format (FORMAT_MASK (OLDGNU_FORMAT)
2017                    | FORMAT_MASK (GNU_FORMAT)
2018                    | FORMAT_MASK (POSIX_FORMAT));
2019
2020   if (multi_volume_option
2021       && archive_format == POSIX_FORMAT
2022       && subcommand_option == CREATE_SUBCOMMAND
2023       && !tape_length_option)
2024     USAGE_ERROR ((0, 0,
2025                   _("creating multi-volume archives in posix format requires using --tape-length (-L) option")));
2026
2027   if (occurrence_option)
2028     {
2029       if (!args.input_files)
2030         USAGE_ERROR ((0, 0,
2031                       _("--occurrence is meaningless without a file list")));
2032       if (subcommand_option != DELETE_SUBCOMMAND
2033           && subcommand_option != DIFF_SUBCOMMAND
2034           && subcommand_option != EXTRACT_SUBCOMMAND
2035           && subcommand_option != LIST_SUBCOMMAND)
2036             USAGE_ERROR ((0, 0,
2037                           _("--occurrence cannot be used in the requested operation mode")));
2038     }
2039
2040   if (seekable_archive && subcommand_option == DELETE_SUBCOMMAND)
2041     {
2042       /* The current code in delete.c is based on the assumption that
2043          skip_member() reads all data from the archive. So, we should
2044          make sure it won't use seeks. On the other hand, the same code
2045          depends on the ability to backspace a record in the archive,
2046          so setting seekable_archive to false is technically incorrect.
2047          However, it is tested only in skip_member(), so it's not a
2048          problem. */
2049       seekable_archive = false;
2050     }
2051
2052   if (archive_names == 0)
2053     {
2054       /* If no archive file name given, try TAPE from the environment, or
2055          else, DEFAULT_ARCHIVE from the configuration process.  */
2056
2057       archive_names = 1;
2058       archive_name_array[0] = getenv ("TAPE");
2059       if (! archive_name_array[0])
2060         archive_name_array[0] = DEFAULT_ARCHIVE;
2061     }
2062
2063   /* Allow multiple archives only with `-M'.  */
2064
2065   if (archive_names > 1 && !multi_volume_option)
2066     USAGE_ERROR ((0, 0,
2067                   _("Multiple archive files require `-M' option")));
2068
2069   if (listed_incremental_option
2070       && NEWER_OPTION_INITIALIZED (newer_mtime_option))
2071     USAGE_ERROR ((0, 0,
2072                   _("Cannot combine --listed-incremental with --newer")));
2073
2074   if (volume_label_option)
2075     {
2076       if (archive_format == GNU_FORMAT || archive_format == OLDGNU_FORMAT)
2077         {
2078           size_t volume_label_max_len =
2079             (sizeof current_header->header.name
2080              - 1 /* for trailing '\0' */
2081              - (multi_volume_option
2082                 ? (sizeof " Volume "
2083                    - 1 /* for null at end of " Volume " */
2084                    + INT_STRLEN_BOUND (int) /* for volume number */
2085                    - 1 /* for sign, as 0 <= volno */)
2086                 : 0));
2087           if (volume_label_max_len < strlen (volume_label_option))
2088             USAGE_ERROR ((0, 0,
2089                           ngettext ("%s: Volume label is too long (limit is %lu byte)",
2090                                     "%s: Volume label is too long (limit is %lu bytes)",
2091                                     volume_label_max_len),
2092                           quotearg_colon (volume_label_option),
2093                           (unsigned long) volume_label_max_len));
2094         }
2095       /* else FIXME
2096          Label length in PAX format is limited by the volume size. */
2097     }
2098
2099   if (verify_option)
2100     {
2101       if (multi_volume_option)
2102         USAGE_ERROR ((0, 0, _("Cannot verify multi-volume archives")));
2103       if (use_compress_program_option)
2104         USAGE_ERROR ((0, 0, _("Cannot verify compressed archives")));
2105     }
2106
2107   if (use_compress_program_option)
2108     {
2109       if (multi_volume_option)
2110         USAGE_ERROR ((0, 0, _("Cannot use multi-volume compressed archives")));
2111       if (subcommand_option == UPDATE_SUBCOMMAND
2112           || subcommand_option == APPEND_SUBCOMMAND
2113           || subcommand_option == DELETE_SUBCOMMAND)
2114         USAGE_ERROR ((0, 0, _("Cannot update compressed archives")));
2115       if (subcommand_option == CAT_SUBCOMMAND)
2116         USAGE_ERROR ((0, 0, _("Cannot concatenate compressed archives")));
2117     }
2118
2119   /* It is no harm to use --pax-option on non-pax archives in archive
2120      reading mode. It may even be useful, since it allows to override
2121      file attributes from tar headers. Therefore I allow such usage.
2122      --gray */
2123   if (args.pax_option
2124       && archive_format != POSIX_FORMAT
2125       && (subcommand_option != EXTRACT_SUBCOMMAND
2126           || subcommand_option != DIFF_SUBCOMMAND
2127           || subcommand_option != LIST_SUBCOMMAND))
2128     USAGE_ERROR ((0, 0, _("--pax-option can be used only on POSIX archives")));
2129
2130   /* If ready to unlink hierarchies, so we are for simpler files.  */
2131   if (recursive_unlink_option)
2132     old_files_option = UNLINK_FIRST_OLD_FILES;
2133
2134
2135   if (test_label_option)
2136     {
2137       /* --test-label is silent if the user has specified the label name to
2138          compare against. */
2139       if (!args.input_files)
2140         verbose_option++;
2141     }
2142   else if (utc_option)
2143     verbose_option = 2;
2144
2145   /* Forbid using -c with no input files whatsoever.  Check that `-f -',
2146      explicit or implied, is used correctly.  */
2147
2148   switch (subcommand_option)
2149     {
2150     case CREATE_SUBCOMMAND:
2151       if (!args.input_files && !files_from_option)
2152         USAGE_ERROR ((0, 0,
2153                       _("Cowardly refusing to create an empty archive")));
2154       break;
2155
2156     case EXTRACT_SUBCOMMAND:
2157     case LIST_SUBCOMMAND:
2158     case DIFF_SUBCOMMAND:
2159       for (archive_name_cursor = archive_name_array;
2160            archive_name_cursor < archive_name_array + archive_names;
2161            archive_name_cursor++)
2162         if (!strcmp (*archive_name_cursor, "-"))
2163           request_stdin ("-f");
2164       break;
2165
2166     case CAT_SUBCOMMAND:
2167     case UPDATE_SUBCOMMAND:
2168     case APPEND_SUBCOMMAND:
2169       for (archive_name_cursor = archive_name_array;
2170            archive_name_cursor < archive_name_array + archive_names;
2171            archive_name_cursor++)
2172         if (!strcmp (*archive_name_cursor, "-"))
2173           USAGE_ERROR ((0, 0,
2174                         _("Options `-Aru' are incompatible with `-f -'")));
2175
2176     default:
2177       break;
2178     }
2179
2180   archive_name_cursor = archive_name_array;
2181
2182   /* Prepare for generating backup names.  */
2183
2184   if (args.backup_suffix_string)
2185     simple_backup_suffix = xstrdup (args.backup_suffix_string);
2186
2187   if (backup_option)
2188     {
2189       backup_type = xget_version ("--backup", args.version_control_string);
2190       /* No backup is needed either if explicitely disabled or if
2191          the extracted files are not being written to disk. */
2192       if (backup_type == no_backups || EXTRACT_OVER_PIPE)
2193         backup_option = false;
2194     }
2195
2196   if (verbose_option)
2197     report_textual_dates (&args);
2198 }
2199
2200 \f
2201 /* Tar proper.  */
2202
2203 /* Main routine for tar.  */
2204 int
2205 main (int argc, char **argv)
2206 {
2207   set_start_time ();
2208   program_name = argv[0];
2209
2210   setlocale (LC_ALL, "");
2211   bindtextdomain (PACKAGE, LOCALEDIR);
2212   textdomain (PACKAGE);
2213
2214   exit_failure = TAREXIT_FAILURE;
2215   exit_status = TAREXIT_SUCCESS;
2216   filename_terminator = '\n';
2217   set_quoting_style (0, DEFAULT_QUOTING_STYLE);
2218
2219   /* Make sure we have first three descriptors available */
2220   stdopen ();
2221
2222   /* Pre-allocate a few structures.  */
2223
2224   allocated_archive_names = 10;
2225   archive_name_array =
2226     xmalloc (sizeof (const char *) * allocated_archive_names);
2227   archive_names = 0;
2228
2229   obstack_init (&argv_stk);
2230
2231 #ifdef SIGCHLD
2232   /* System V fork+wait does not work if SIGCHLD is ignored.  */
2233   signal (SIGCHLD, SIG_DFL);
2234 #endif
2235
2236   /* Decode options.  */
2237
2238   decode_options (argc, argv);
2239   name_init ();
2240
2241   /* Main command execution.  */
2242
2243   if (volno_file_option)
2244     init_volume_number ();
2245
2246   switch (subcommand_option)
2247     {
2248     case UNKNOWN_SUBCOMMAND:
2249       USAGE_ERROR ((0, 0,
2250                     _("You must specify one of the `-Acdtrux' options")));
2251
2252     case CAT_SUBCOMMAND:
2253     case UPDATE_SUBCOMMAND:
2254     case APPEND_SUBCOMMAND:
2255       update_archive ();
2256       break;
2257
2258     case DELETE_SUBCOMMAND:
2259       delete_archive_members ();
2260       break;
2261
2262     case CREATE_SUBCOMMAND:
2263       create_archive ();
2264       break;
2265
2266     case EXTRACT_SUBCOMMAND:
2267       extr_init ();
2268       read_and (extract_archive);
2269
2270       /* FIXME: should extract_finish () even if an ordinary signal is
2271          received.  */
2272       extract_finish ();
2273
2274       break;
2275
2276     case LIST_SUBCOMMAND:
2277       read_and (list_archive);
2278       break;
2279
2280     case DIFF_SUBCOMMAND:
2281       diff_init ();
2282       read_and (diff_archive);
2283       break;
2284     }
2285
2286   if (totals_option)
2287     print_total_stats ();
2288
2289   if (check_links_option)
2290     check_links ();
2291
2292   if (volno_file_option)
2293     closeout_volume_number ();
2294
2295   /* Dispose of allocated memory, and return.  */
2296
2297   free (archive_name_array);
2298   name_term ();
2299
2300   if (stdlis == stdout)
2301     close_stdout ();
2302
2303   if (exit_status == TAREXIT_FAILURE)
2304     error (0, 0, _("Error exit delayed from previous errors"));
2305   if (ferror (stderr) || fclose (stderr) != 0)
2306     exit_status = TAREXIT_FAILURE;
2307   return exit_status;
2308 }
2309
2310 void
2311 tar_stat_init (struct tar_stat_info *st)
2312 {
2313   memset (st, 0, sizeof (*st));
2314 }
2315
2316 void
2317 tar_stat_destroy (struct tar_stat_info *st)
2318 {
2319   free (st->orig_file_name);
2320   free (st->file_name);
2321   free (st->link_name);
2322   free (st->uname);
2323   free (st->gname);
2324   free (st->sparse_map);
2325   free (st->dumpdir);
2326   memset (st, 0, sizeof (*st));
2327 }
2328
2329 /* Format mask for all available formats that support nanosecond
2330    timestamp resolution. */
2331 #define NS_PRECISION_FORMAT_MASK FORMAT_MASK (POSIX_FORMAT)
2332
2333 /* Same as timespec_cmp, but ignore nanoseconds if current archive
2334    format does not provide sufficient resolution.  */
2335 int
2336 tar_timespec_cmp (struct timespec a, struct timespec b)
2337 {
2338   if (!(FORMAT_MASK (current_format) & NS_PRECISION_FORMAT_MASK))
2339     a.tv_nsec = b.tv_nsec = 0;
2340   return timespec_cmp (a, b);
2341 }