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