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