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