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