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