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