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