]> Dogcows Code - chaz/tar/blob - src/tar.c
300a83428ce926386e641647c1582d1fe69d03e9
[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 'J':
1171 s = xasprintf (_("filter the archive through %s"), XZ_PROGRAM);
1172 break;
1173
1174 case ARGP_KEY_HELP_EXTRA:
1175 {
1176 const char *tstr;
1177
1178 obstack_init (&stk);
1179 tstr = _("Valid arguments for the --quoting-style option are:");
1180 obstack_grow (&stk, tstr, strlen (tstr));
1181 obstack_grow (&stk, "\n\n", 2);
1182 tar_list_quoting_styles (&stk, " ");
1183 tstr = _("\n*This* tar defaults to:\n");
1184 obstack_grow (&stk, tstr, strlen (tstr));
1185 s = format_default_settings ();
1186 obstack_grow (&stk, s, strlen (s));
1187 obstack_1grow (&stk, '\n');
1188 obstack_1grow (&stk, 0);
1189 s = xstrdup (obstack_finish (&stk));
1190 obstack_free (&stk, NULL);
1191 }
1192 }
1193 return s;
1194 }
1195 \f
1196 static char *
1197 expand_pax_option (struct tar_args *targs, const char *arg)
1198 {
1199 struct obstack stk;
1200 char *res;
1201
1202 obstack_init (&stk);
1203 while (*arg)
1204 {
1205 size_t seglen = strcspn (arg, ",");
1206 char *p = memchr (arg, '=', seglen);
1207 if (p)
1208 {
1209 size_t len = p - arg + 1;
1210 obstack_grow (&stk, arg, len);
1211 len = seglen - len;
1212 for (++p; *p && isspace ((unsigned char) *p); p++)
1213 len--;
1214 if (*p == '{' && p[len-1] == '}')
1215 {
1216 struct timespec ts;
1217 char *tmp = xmalloc (len);
1218 memcpy (tmp, p + 1, len-2);
1219 tmp[len-2] = 0;
1220 if (get_date_or_file (targs, "--pax-option", tmp, &ts) == 0)
1221 {
1222 char buf[TIMESPEC_STRSIZE_BOUND];
1223 char const *s = code_timespec (ts, buf);
1224 obstack_grow (&stk, s, strlen (s));
1225 }
1226 else
1227 obstack_grow (&stk, p, len);
1228 free (tmp);
1229 }
1230 else
1231 obstack_grow (&stk, p, len);
1232 }
1233 else
1234 obstack_grow (&stk, arg, seglen);
1235
1236 arg += seglen;
1237 if (*arg)
1238 {
1239 obstack_1grow (&stk, *arg);
1240 arg++;
1241 }
1242 }
1243 obstack_1grow (&stk, 0);
1244 res = xstrdup (obstack_finish (&stk));
1245 obstack_free (&stk, NULL);
1246 return res;
1247 }
1248
1249 \f
1250 static uintmax_t
1251 parse_owner_group (char *arg, uintmax_t field_max, char const **name_option)
1252 {
1253 uintmax_t u = UINTMAX_MAX;
1254 char *end;
1255 char const *name = 0;
1256 char const *invalid_num = 0;
1257 char *colon = strchr (arg, ':');
1258
1259 if (colon)
1260 {
1261 char const *num = colon + 1;
1262 *colon = '\0';
1263 if (*arg)
1264 name = arg;
1265 if (num && (! (xstrtoumax (num, &end, 10, &u, "") == LONGINT_OK
1266 && u <= field_max)))
1267 invalid_num = num;
1268 }
1269 else
1270 {
1271 uintmax_t u1;
1272 switch ('0' <= *arg && *arg <= '9'
1273 ? xstrtoumax (arg, &end, 10, &u1, "")
1274 : LONGINT_INVALID)
1275 {
1276 default:
1277 name = arg;
1278 break;
1279
1280 case LONGINT_OK:
1281 if (u1 <= field_max)
1282 {
1283 u = u1;
1284 break;
1285 }
1286 /* Fall through. */
1287 case LONGINT_OVERFLOW:
1288 invalid_num = arg;
1289 break;
1290 }
1291 }
1292
1293 if (invalid_num)
1294 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (invalid_num),
1295 _("Invalid owner or group ID")));
1296 if (name)
1297 *name_option = name;
1298 return u;
1299 }
1300
1301 #define TAR_SIZE_SUFFIXES "bBcGgkKMmPTtw"
1302
1303 /* Either NL or NUL, as decided by the --null option. */
1304 static char filename_terminator;
1305
1306 static error_t
1307 parse_opt (int key, char *arg, struct argp_state *state)
1308 {
1309 struct tar_args *args = state->input;
1310
1311 switch (key)
1312 {
1313 case ARGP_KEY_ARG:
1314 /* File name or non-parsed option, because of ARGP_IN_ORDER */
1315 name_add_name (arg, MAKE_INCL_OPTIONS (args));
1316 args->input_files = true;
1317 break;
1318
1319 case 'A':
1320 set_subcommand_option (CAT_SUBCOMMAND);
1321 break;
1322
1323 case 'a':
1324 args->compress_autodetect = true;
1325 break;
1326
1327 case NO_AUTO_COMPRESS_OPTION:
1328 args->compress_autodetect = false;
1329 break;
1330
1331 case 'b':
1332 {
1333 uintmax_t u;
1334 if (! (xstrtoumax (arg, 0, 10, &u, "") == LONGINT_OK
1335 && u == (blocking_factor = u)
1336 && 0 < blocking_factor
1337 && u == (record_size = u * BLOCKSIZE) / BLOCKSIZE))
1338 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
1339 _("Invalid blocking factor")));
1340 }
1341 break;
1342
1343 case 'B':
1344 /* Try to reblock input records. For reading 4.2BSD pipes. */
1345
1346 /* It would surely make sense to exchange -B and -R, but it seems
1347 that -B has been used for a long while in Sun tar and most
1348 BSD-derived systems. This is a consequence of the block/record
1349 terminology confusion. */
1350
1351 read_full_records_option = true;
1352 break;
1353
1354 case 'c':
1355 set_subcommand_option (CREATE_SUBCOMMAND);
1356 break;
1357
1358 case 'C':
1359 name_add_dir (arg);
1360 break;
1361
1362 case 'd':
1363 set_subcommand_option (DIFF_SUBCOMMAND);
1364 break;
1365
1366 case 'f':
1367 if (archive_names == allocated_archive_names)
1368 archive_name_array = x2nrealloc (archive_name_array,
1369 &allocated_archive_names,
1370 sizeof (archive_name_array[0]));
1371
1372 archive_name_array[archive_names++] = arg;
1373 break;
1374
1375 case 'F':
1376 /* Since -F is only useful with -M, make it implied. Run this
1377 script at the end of each tape. */
1378
1379 info_script_option = arg;
1380 multi_volume_option = true;
1381 break;
1382
1383 case FULL_TIME_OPTION:
1384 full_time_option = true;
1385 break;
1386
1387 case 'g':
1388 listed_incremental_option = arg;
1389 after_date_option = true;
1390 /* Fall through. */
1391
1392 case 'G':
1393 /* We are making an incremental dump (FIXME: are we?); save
1394 directories at the beginning of the archive, and include in each
1395 directory its contents. */
1396
1397 incremental_option = true;
1398 break;
1399
1400 case 'h':
1401 /* Follow symbolic links. */
1402 dereference_option = true;
1403 break;
1404
1405 case HARD_DEREFERENCE_OPTION:
1406 hard_dereference_option = true;
1407 break;
1408
1409 case 'i':
1410 /* Ignore zero blocks (eofs). This can't be the default,
1411 because Unix tar writes two blocks of zeros, then pads out
1412 the record with garbage. */
1413
1414 ignore_zeros_option = true;
1415 break;
1416
1417 case 'j':
1418 set_use_compress_program_option (BZIP2_PROGRAM);
1419 break;
1420
1421 case 'J':
1422 set_use_compress_program_option (XZ_PROGRAM);
1423 break;
1424
1425 case 'k':
1426 /* Don't replace existing files. */
1427 old_files_option = KEEP_OLD_FILES;
1428 break;
1429
1430 case 'K':
1431 starting_file_option = true;
1432 addname (arg, 0, true, NULL);
1433 break;
1434
1435 case ONE_FILE_SYSTEM_OPTION:
1436 /* When dumping directories, don't dump files/subdirectories
1437 that are on other filesystems. */
1438 one_file_system_option = true;
1439 break;
1440
1441 case 'l':
1442 check_links_option = 1;
1443 break;
1444
1445 case 'L':
1446 {
1447 uintmax_t u;
1448 char *p;
1449
1450 if (xstrtoumax (arg, &p, 10, &u, TAR_SIZE_SUFFIXES) != LONGINT_OK)
1451 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
1452 _("Invalid tape length")));
1453 if (p > arg && !strchr (TAR_SIZE_SUFFIXES, p[-1]))
1454 tape_length_option = 1024 * (tarlong) u;
1455 else
1456 tape_length_option = (tarlong) u;
1457 multi_volume_option = true;
1458 }
1459 break;
1460
1461 case LEVEL_OPTION:
1462 {
1463 char *p;
1464 incremental_level = strtoul (arg, &p, 10);
1465 if (*p)
1466 USAGE_ERROR ((0, 0, _("Invalid incremental level value")));
1467 }
1468 break;
1469
1470 case LZIP_OPTION:
1471 set_use_compress_program_option (LZIP_PROGRAM);
1472 break;
1473
1474 case LZMA_OPTION:
1475 set_use_compress_program_option (LZMA_PROGRAM);
1476 break;
1477
1478 case LZOP_OPTION:
1479 set_use_compress_program_option (LZOP_PROGRAM);
1480 break;
1481
1482 case 'm':
1483 touch_option = true;
1484 break;
1485
1486 case 'M':
1487 /* Make multivolume archive: when we can't write any more into
1488 the archive, re-open it, and continue writing. */
1489
1490 multi_volume_option = true;
1491 break;
1492
1493 case MTIME_OPTION:
1494 get_date_or_file (args, "--mtime", arg, &mtime_option);
1495 set_mtime_option = true;
1496 break;
1497
1498 case 'n':
1499 seek_option = 1;
1500 break;
1501
1502 case NO_SEEK_OPTION:
1503 seek_option = 0;
1504 break;
1505
1506 case 'N':
1507 after_date_option = true;
1508 /* Fall through. */
1509
1510 case NEWER_MTIME_OPTION:
1511 if (NEWER_OPTION_INITIALIZED (newer_mtime_option))
1512 USAGE_ERROR ((0, 0, _("More than one threshold date")));
1513 get_date_or_file (args,
1514 key == NEWER_MTIME_OPTION ? "--newer-mtime"
1515 : "--after-date", arg, &newer_mtime_option);
1516 break;
1517
1518 case 'o':
1519 args->o_option = true;
1520 break;
1521
1522 case 'O':
1523 to_stdout_option = true;
1524 break;
1525
1526 case 'p':
1527 same_permissions_option = true;
1528 break;
1529
1530 case 'P':
1531 absolute_names_option = true;
1532 break;
1533
1534 case 'r':
1535 set_subcommand_option (APPEND_SUBCOMMAND);
1536 break;
1537
1538 case 'R':
1539 /* Print block numbers for debugging bad tar archives. */
1540
1541 /* It would surely make sense to exchange -B and -R, but it seems
1542 that -B has been used for a long while in Sun tar and most
1543 BSD-derived systems. This is a consequence of the block/record
1544 terminology confusion. */
1545
1546 block_number_option = true;
1547 break;
1548
1549 case 's':
1550 /* Names to extract are sorted. */
1551
1552 same_order_option = true;
1553 break;
1554
1555 case 'S':
1556 sparse_option = true;
1557 break;
1558
1559 case SKIP_OLD_FILES_OPTION:
1560 old_files_option = SKIP_OLD_FILES;
1561 break;
1562
1563 case SPARSE_VERSION_OPTION:
1564 sparse_option = true;
1565 {
1566 char *p;
1567 tar_sparse_major = strtoul (arg, &p, 10);
1568 if (*p)
1569 {
1570 if (*p != '.')
1571 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1572 tar_sparse_minor = strtoul (p + 1, &p, 10);
1573 if (*p)
1574 USAGE_ERROR ((0, 0, _("Invalid sparse version value")));
1575 }
1576 }
1577 break;
1578
1579 case 't':
1580 set_subcommand_option (LIST_SUBCOMMAND);
1581 verbose_option++;
1582 break;
1583
1584 case TEST_LABEL_OPTION:
1585 set_subcommand_option (TEST_LABEL_SUBCOMMAND);
1586 break;
1587
1588 case 'T':
1589 name_add_file (arg, filename_terminator);
1590 /* Indicate we've been given -T option. This is for backward
1591 compatibility only, so that `tar cfT archive /dev/null will
1592 succeed */
1593 files_from_option = true;
1594 break;
1595
1596 case 'u':
1597 set_subcommand_option (UPDATE_SUBCOMMAND);
1598 break;
1599
1600 case 'U':
1601 old_files_option = UNLINK_FIRST_OLD_FILES;
1602 break;
1603
1604 case UTC_OPTION:
1605 utc_option = true;
1606 break;
1607
1608 case 'v':
1609 verbose_option++;
1610 warning_option |= WARN_VERBOSE_WARNINGS;
1611 break;
1612
1613 case 'V':
1614 volume_label_option = arg;
1615 break;
1616
1617 case 'w':
1618 interactive_option = true;
1619 break;
1620
1621 case 'W':
1622 verify_option = true;
1623 break;
1624
1625 case 'x':
1626 set_subcommand_option (EXTRACT_SUBCOMMAND);
1627 break;
1628
1629 case 'X':
1630 if (add_exclude_file (add_exclude, excluded, arg,
1631 MAKE_EXCL_OPTIONS (args), '\n')
1632 != 0)
1633 {
1634 int e = errno;
1635 FATAL_ERROR ((0, e, "%s", quotearg_colon (arg)));
1636 }
1637 break;
1638
1639 case 'z':
1640 set_use_compress_program_option (GZIP_PROGRAM);
1641 break;
1642
1643 case 'Z':
1644 set_use_compress_program_option (COMPRESS_PROGRAM);
1645 break;
1646
1647 case ANCHORED_OPTION:
1648 args->matching_flags |= EXCLUDE_ANCHORED;
1649 break;
1650
1651 case ATIME_PRESERVE_OPTION:
1652 atime_preserve_option =
1653 (arg
1654 ? XARGMATCH ("--atime-preserve", arg,
1655 atime_preserve_args, atime_preserve_types)
1656 : replace_atime_preserve);
1657 if (! O_NOATIME && atime_preserve_option == system_atime_preserve)
1658 FATAL_ERROR ((0, 0,
1659 _("--atime-preserve='system' is not supported"
1660 " on this platform")));
1661 break;
1662
1663 case CHECK_DEVICE_OPTION:
1664 check_device_option = true;
1665 break;
1666
1667 case NO_CHECK_DEVICE_OPTION:
1668 check_device_option = false;
1669 break;
1670
1671 case CHECKPOINT_OPTION:
1672 if (arg)
1673 {
1674 char *p;
1675
1676 if (*arg == '.')
1677 {
1678 checkpoint_compile_action (".");
1679 arg++;
1680 }
1681 checkpoint_option = strtoul (arg, &p, 0);
1682 if (*p)
1683 FATAL_ERROR ((0, 0,
1684 _("--checkpoint value is not an integer")));
1685 }
1686 else
1687 checkpoint_option = DEFAULT_CHECKPOINT;
1688 break;
1689
1690 case CHECKPOINT_ACTION_OPTION:
1691 checkpoint_compile_action (arg);
1692 break;
1693
1694 case BACKUP_OPTION:
1695 backup_option = true;
1696 if (arg)
1697 args->version_control_string = arg;
1698 break;
1699
1700 case DELAY_DIRECTORY_RESTORE_OPTION:
1701 delay_directory_restore_option = true;
1702 break;
1703
1704 case NO_DELAY_DIRECTORY_RESTORE_OPTION:
1705 delay_directory_restore_option = false;
1706 break;
1707
1708 case DELETE_OPTION:
1709 set_subcommand_option (DELETE_SUBCOMMAND);
1710 break;
1711
1712 case EXCLUDE_BACKUPS_OPTION:
1713 add_exclude_array (backup_file_table, EXCLUDE_WILDCARDS);
1714 break;
1715
1716 case EXCLUDE_OPTION:
1717 add_exclude (excluded, arg, MAKE_EXCL_OPTIONS (args));
1718 break;
1719
1720 case EXCLUDE_CACHES_OPTION:
1721 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_contents,
1722 cachedir_file_p);
1723 break;
1724
1725 case EXCLUDE_CACHES_UNDER_OPTION:
1726 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_under,
1727 cachedir_file_p);
1728 break;
1729
1730 case EXCLUDE_CACHES_ALL_OPTION:
1731 add_exclusion_tag ("CACHEDIR.TAG", exclusion_tag_all,
1732 cachedir_file_p);
1733 break;
1734
1735 case EXCLUDE_TAG_OPTION:
1736 add_exclusion_tag (arg, exclusion_tag_contents, NULL);
1737 break;
1738
1739 case EXCLUDE_TAG_UNDER_OPTION:
1740 add_exclusion_tag (arg, exclusion_tag_under, NULL);
1741 break;
1742
1743 case EXCLUDE_TAG_ALL_OPTION:
1744 add_exclusion_tag (arg, exclusion_tag_all, NULL);
1745 break;
1746
1747 case EXCLUDE_VCS_OPTION:
1748 add_exclude_array (vcs_file_table, 0);
1749 break;
1750
1751 case FORCE_LOCAL_OPTION:
1752 force_local_option = true;
1753 break;
1754
1755 case 'H':
1756 set_archive_format (arg);
1757 break;
1758
1759 case INDEX_FILE_OPTION:
1760 index_file_name = arg;
1761 break;
1762
1763 case IGNORE_CASE_OPTION:
1764 args->matching_flags |= FNM_CASEFOLD;
1765 break;
1766
1767 case IGNORE_COMMAND_ERROR_OPTION:
1768 ignore_command_error_option = true;
1769 break;
1770
1771 case IGNORE_FAILED_READ_OPTION:
1772 ignore_failed_read_option = true;
1773 break;
1774
1775 case KEEP_DIRECTORY_SYMLINK_OPTION:
1776 keep_directory_symlink_option = true;
1777 break;
1778
1779 case KEEP_NEWER_FILES_OPTION:
1780 old_files_option = KEEP_NEWER_FILES;
1781 break;
1782
1783 case GROUP_OPTION:
1784 {
1785 uintmax_t u = parse_owner_group (arg, TYPE_MAXIMUM (gid_t),
1786 &group_name_option);
1787 if (u == UINTMAX_MAX)
1788 {
1789 group_option = -1;
1790 if (group_name_option)
1791 gname_to_gid (group_name_option, &group_option);
1792 }
1793 else
1794 group_option = u;
1795 }
1796 break;
1797
1798 case MODE_OPTION:
1799 mode_option = mode_compile (arg);
1800 if (!mode_option)
1801 FATAL_ERROR ((0, 0, _("Invalid mode given on option")));
1802 initial_umask = umask (0);
1803 umask (initial_umask);
1804 break;
1805
1806 case NO_ANCHORED_OPTION:
1807 args->include_anchored = 0; /* Clear the default for comman line args */
1808 args->matching_flags &= ~ EXCLUDE_ANCHORED;
1809 break;
1810
1811 case NO_IGNORE_CASE_OPTION:
1812 args->matching_flags &= ~ FNM_CASEFOLD;
1813 break;
1814
1815 case NO_IGNORE_COMMAND_ERROR_OPTION:
1816 ignore_command_error_option = false;
1817 break;
1818
1819 case NO_OVERWRITE_DIR_OPTION:
1820 old_files_option = NO_OVERWRITE_DIR_OLD_FILES;
1821 break;
1822
1823 case NO_QUOTE_CHARS_OPTION:
1824 for (;*arg; arg++)
1825 set_char_quoting (NULL, *arg, 0);
1826 break;
1827
1828 case NO_WILDCARDS_OPTION:
1829 args->wildcards = disable_wildcards;
1830 break;
1831
1832 case NO_WILDCARDS_MATCH_SLASH_OPTION:
1833 args->matching_flags |= FNM_FILE_NAME;
1834 break;
1835
1836 case NULL_OPTION:
1837 filename_terminator = '\0';
1838 break;
1839
1840 case NO_NULL_OPTION:
1841 filename_terminator = '\n';
1842 break;
1843
1844 case NUMERIC_OWNER_OPTION:
1845 numeric_owner_option = true;
1846 break;
1847
1848 case OCCURRENCE_OPTION:
1849 if (!arg)
1850 occurrence_option = 1;
1851 else
1852 {
1853 uintmax_t u;
1854 if (xstrtoumax (arg, 0, 10, &u, "") == LONGINT_OK)
1855 occurrence_option = u;
1856 else
1857 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
1858 _("Invalid number")));
1859 }
1860 break;
1861
1862 case OLD_ARCHIVE_OPTION:
1863 set_archive_format ("v7");
1864 break;
1865
1866 case OVERWRITE_DIR_OPTION:
1867 old_files_option = DEFAULT_OLD_FILES;
1868 break;
1869
1870 case OVERWRITE_OPTION:
1871 old_files_option = OVERWRITE_OLD_FILES;
1872 break;
1873
1874 case OWNER_OPTION:
1875 {
1876 uintmax_t u = parse_owner_group (arg, TYPE_MAXIMUM (uid_t),
1877 &owner_name_option);
1878 if (u == UINTMAX_MAX)
1879 {
1880 owner_option = -1;
1881 if (owner_name_option)
1882 uname_to_uid (owner_name_option, &owner_option);
1883 }
1884 else
1885 owner_option = u;
1886 }
1887 break;
1888
1889 case QUOTE_CHARS_OPTION:
1890 for (;*arg; arg++)
1891 set_char_quoting (NULL, *arg, 1);
1892 break;
1893
1894 case QUOTING_STYLE_OPTION:
1895 tar_set_quoting_style (arg);
1896 break;
1897
1898 case PAX_OPTION:
1899 {
1900 char *tmp = expand_pax_option (args, arg);
1901 args->pax_option = true;
1902 xheader_set_option (tmp);
1903 free (tmp);
1904 }
1905 break;
1906
1907 case POSIX_OPTION:
1908 set_archive_format ("posix");
1909 break;
1910
1911 case PRESERVE_OPTION:
1912 /* FIXME: What it is good for? */
1913 same_permissions_option = true;
1914 same_order_option = true;
1915 WARN ((0, 0, _("The --preserve option is deprecated, "
1916 "use --preserve-permissions --preserve-order instead")));
1917 break;
1918
1919 case RECORD_SIZE_OPTION:
1920 {
1921 uintmax_t u;
1922
1923 if (! (xstrtoumax (arg, NULL, 10, &u, TAR_SIZE_SUFFIXES) == LONGINT_OK
1924 && u == (size_t) u))
1925 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
1926 _("Invalid record size")));
1927 record_size = u;
1928 if (record_size % BLOCKSIZE != 0)
1929 USAGE_ERROR ((0, 0, _("Record size must be a multiple of %d."),
1930 BLOCKSIZE));
1931 blocking_factor = record_size / BLOCKSIZE;
1932 }
1933 break;
1934
1935 case RECURSIVE_UNLINK_OPTION:
1936 recursive_unlink_option = true;
1937 break;
1938
1939 case REMOVE_FILES_OPTION:
1940 remove_files_option = true;
1941 break;
1942
1943 case RESTRICT_OPTION:
1944 restrict_option = true;
1945 break;
1946
1947 case RMT_COMMAND_OPTION:
1948 rmt_command = arg;
1949 break;
1950
1951 case RSH_COMMAND_OPTION:
1952 rsh_command_option = arg;
1953 break;
1954
1955 case SHOW_DEFAULTS_OPTION:
1956 {
1957 char *s = format_default_settings ();
1958 printf ("%s\n", s);
1959 close_stdout ();
1960 free (s);
1961 exit (0);
1962 }
1963
1964 case SHOW_SNAPSHOT_FIELD_RANGES_OPTION:
1965 show_snapshot_field_ranges ();
1966 close_stdout ();
1967 exit (0);
1968
1969 case STRIP_COMPONENTS_OPTION:
1970 {
1971 uintmax_t u;
1972 if (! (xstrtoumax (arg, 0, 10, &u, "") == LONGINT_OK
1973 && u == (size_t) u))
1974 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
1975 _("Invalid number of elements")));
1976 strip_name_components = u;
1977 }
1978 break;
1979
1980 case SHOW_OMITTED_DIRS_OPTION:
1981 show_omitted_dirs_option = true;
1982 break;
1983
1984 case SHOW_TRANSFORMED_NAMES_OPTION:
1985 show_transformed_names_option = true;
1986 break;
1987
1988 case SUFFIX_OPTION:
1989 backup_option = true;
1990 args->backup_suffix_string = arg;
1991 break;
1992
1993 case TO_COMMAND_OPTION:
1994 if (to_command_option)
1995 USAGE_ERROR ((0, 0, _("Only one --to-command option allowed")));
1996 to_command_option = arg;
1997 break;
1998
1999 case TOTALS_OPTION:
2000 if (arg)
2001 set_stat_signal (arg);
2002 else
2003 totals_option = true;
2004 break;
2005
2006 case TRANSFORM_OPTION:
2007 set_transform_expr (arg);
2008 break;
2009
2010 case 'I':
2011 set_use_compress_program_option (arg);
2012 break;
2013
2014 case VOLNO_FILE_OPTION:
2015 volno_file_option = arg;
2016 break;
2017
2018 case WILDCARDS_OPTION:
2019 args->wildcards = enable_wildcards;
2020 break;
2021
2022 case WILDCARDS_MATCH_SLASH_OPTION:
2023 args->matching_flags &= ~ FNM_FILE_NAME;
2024 break;
2025
2026 case NO_RECURSION_OPTION:
2027 recursion_option = 0;
2028 break;
2029
2030 case NO_SAME_OWNER_OPTION:
2031 same_owner_option = -1;
2032 break;
2033
2034 case NO_SAME_PERMISSIONS_OPTION:
2035 same_permissions_option = -1;
2036 break;
2037
2038 case ACLS_OPTION:
2039 set_archive_format ("posix");
2040 acls_option = 1;
2041 break;
2042
2043 case NO_ACLS_OPTION:
2044 acls_option = -1;
2045 break;
2046
2047 case SELINUX_CONTEXT_OPTION:
2048 set_archive_format ("posix");
2049 selinux_context_option = 1;
2050 break;
2051
2052 case NO_SELINUX_CONTEXT_OPTION:
2053 selinux_context_option = -1;
2054 break;
2055
2056 case XATTR_OPTION:
2057 set_archive_format ("posix");
2058 xattrs_option = 1;
2059 break;
2060
2061 case NO_XATTR_OPTION:
2062 xattrs_option = -1;
2063 break;
2064
2065 case XATTR_INCLUDE:
2066 case XATTR_EXCLUDE:
2067 xattrs_mask_add (arg, (key == XATTR_INCLUDE));
2068 break;
2069
2070 case RECURSION_OPTION:
2071 recursion_option = FNM_LEADING_DIR;
2072 break;
2073
2074 case SAME_OWNER_OPTION:
2075 same_owner_option = 1;
2076 break;
2077
2078 case UNQUOTE_OPTION:
2079 unquote_option = true;
2080 break;
2081
2082 case NO_UNQUOTE_OPTION:
2083 unquote_option = false;
2084 break;
2085
2086 case WARNING_OPTION:
2087 set_warning_option (arg);
2088 break;
2089
2090 case '0':
2091 case '1':
2092 case '2':
2093 case '3':
2094 case '4':
2095 case '5':
2096 case '6':
2097 case '7':
2098
2099 #ifdef DEVICE_PREFIX
2100 {
2101 int device = key - '0';
2102 int density;
2103 static char buf[sizeof DEVICE_PREFIX + 10];
2104 char *cursor;
2105
2106 if (arg[1])
2107 argp_error (state, _("Malformed density argument: %s"), quote (arg));
2108
2109 strcpy (buf, DEVICE_PREFIX);
2110 cursor = buf + strlen (buf);
2111
2112 #ifdef DENSITY_LETTER
2113
2114 sprintf (cursor, "%d%c", device, arg[0]);
2115
2116 #else /* not DENSITY_LETTER */
2117
2118 switch (arg[0])
2119 {
2120 case 'l':
2121 device += LOW_DENSITY_NUM;
2122 break;
2123
2124 case 'm':
2125 device += MID_DENSITY_NUM;
2126 break;
2127
2128 case 'h':
2129 device += HIGH_DENSITY_NUM;
2130 break;
2131
2132 default:
2133 argp_error (state, _("Unknown density: '%c'"), arg[0]);
2134 }
2135 sprintf (cursor, "%d", device);
2136
2137 #endif /* not DENSITY_LETTER */
2138
2139 if (archive_names == allocated_archive_names)
2140 archive_name_array = x2nrealloc (archive_name_array,
2141 &allocated_archive_names,
2142 sizeof (archive_name_array[0]));
2143 archive_name_array[archive_names++] = xstrdup (buf);
2144 }
2145 break;
2146
2147 #else /* not DEVICE_PREFIX */
2148
2149 argp_error (state,
2150 _("Options '-[0-7][lmh]' not supported by *this* tar"));
2151
2152 #endif /* not DEVICE_PREFIX */
2153
2154 default:
2155 return ARGP_ERR_UNKNOWN;
2156 }
2157 return 0;
2158 }
2159
2160 static struct argp argp = {
2161 options,
2162 parse_opt,
2163 N_("[FILE]..."),
2164 doc,
2165 NULL,
2166 tar_help_filter,
2167 NULL
2168 };
2169
2170 void
2171 usage (int status)
2172 {
2173 argp_help (&argp, stderr, ARGP_HELP_SEE, (char*) program_name);
2174 close_stdout ();
2175 exit (status);
2176 }
2177
2178 /* Parse the options for tar. */
2179
2180 static struct argp_option *
2181 find_argp_option (struct argp_option *o, int letter)
2182 {
2183 for (;
2184 !(o->name == NULL
2185 && o->key == 0
2186 && o->arg == 0
2187 && o->flags == 0
2188 && o->doc == NULL); o++)
2189 if (o->key == letter)
2190 return o;
2191 return NULL;
2192 }
2193
2194 static const char *tar_authors[] = {
2195 "John Gilmore",
2196 "Jay Fenlason",
2197 NULL
2198 };
2199 \f
2200 /* Subcommand classes */
2201 #define SUBCL_READ 0x01 /* subcommand reads from the archive */
2202 #define SUBCL_WRITE 0x02 /* subcommand writes to the archive */
2203 #define SUBCL_UPDATE 0x04 /* subcommand updates existing archive */
2204 #define SUBCL_TEST 0x08 /* subcommand tests archive header or meta-info */
2205 #define SUBCL_OCCUR 0x10 /* subcommand allows the use of the occurrence
2206 option */
2207
2208 static int subcommand_class[] = {
2209 /* UNKNOWN_SUBCOMMAND */ 0,
2210 /* APPEND_SUBCOMMAND */ SUBCL_WRITE|SUBCL_UPDATE,
2211 /* CAT_SUBCOMMAND */ SUBCL_WRITE,
2212 /* CREATE_SUBCOMMAND */ SUBCL_WRITE,
2213 /* DELETE_SUBCOMMAND */ SUBCL_WRITE|SUBCL_UPDATE|SUBCL_OCCUR,
2214 /* DIFF_SUBCOMMAND */ SUBCL_READ|SUBCL_OCCUR,
2215 /* EXTRACT_SUBCOMMAND */ SUBCL_READ|SUBCL_OCCUR,
2216 /* LIST_SUBCOMMAND */ SUBCL_READ|SUBCL_OCCUR,
2217 /* UPDATE_SUBCOMMAND */ SUBCL_WRITE|SUBCL_UPDATE,
2218 /* TEST_LABEL_SUBCOMMAND */ SUBCL_TEST
2219 };
2220
2221 /* Return t if the subcommand_option is in class(es) f */
2222 #define IS_SUBCOMMAND_CLASS(f) (subcommand_class[subcommand_option] & (f))
2223
2224 static struct tar_args args;
2225
2226 static void
2227 decode_options (int argc, char **argv)
2228 {
2229 int idx;
2230
2231 argp_version_setup ("tar", tar_authors);
2232
2233 /* Set some default option values. */
2234 args.textual_date = NULL;
2235 args.wildcards = default_wildcards;
2236 args.matching_flags = 0;
2237 args.include_anchored = EXCLUDE_ANCHORED;
2238 args.o_option = false;
2239 args.pax_option = false;
2240 args.backup_suffix_string = getenv ("SIMPLE_BACKUP_SUFFIX");
2241 args.version_control_string = 0;
2242 args.input_files = false;
2243 args.compress_autodetect = false;
2244
2245 subcommand_option = UNKNOWN_SUBCOMMAND;
2246 archive_format = DEFAULT_FORMAT;
2247 blocking_factor = DEFAULT_BLOCKING;
2248 record_size = DEFAULT_BLOCKING * BLOCKSIZE;
2249 excluded = new_exclude ();
2250 newer_mtime_option.tv_sec = TYPE_MINIMUM (time_t);
2251 newer_mtime_option.tv_nsec = -1;
2252 recursion_option = FNM_LEADING_DIR;
2253 unquote_option = true;
2254 tar_sparse_major = 1;
2255 tar_sparse_minor = 0;
2256
2257 owner_option = -1; owner_name_option = NULL;
2258 group_option = -1; group_name_option = NULL;
2259
2260 check_device_option = true;
2261
2262 incremental_level = -1;
2263
2264 seek_option = -1;
2265
2266 /* Convert old-style tar call by exploding option element and rearranging
2267 options accordingly. */
2268
2269 if (argc > 1 && argv[1][0] != '-')
2270 {
2271 int new_argc; /* argc value for rearranged arguments */
2272 char **new_argv; /* argv value for rearranged arguments */
2273 char *const *in; /* cursor into original argv */
2274 char **out; /* cursor into rearranged argv */
2275 const char *letter; /* cursor into old option letters */
2276 char buffer[3]; /* constructed option buffer */
2277
2278 /* Initialize a constructed option. */
2279
2280 buffer[0] = '-';
2281 buffer[2] = '\0';
2282
2283 /* Allocate a new argument array, and copy program name in it. */
2284
2285 new_argc = argc - 1 + strlen (argv[1]);
2286 new_argv = xmalloc ((new_argc + 1) * sizeof (char *));
2287 in = argv;
2288 out = new_argv;
2289 *out++ = *in++;
2290
2291 /* Copy each old letter option as a separate option, and have the
2292 corresponding argument moved next to it. */
2293
2294 for (letter = *in++; *letter; letter++)
2295 {
2296 struct argp_option *opt;
2297
2298 buffer[1] = *letter;
2299 *out++ = xstrdup (buffer);
2300 opt = find_argp_option (options, *letter);
2301 if (opt && opt->arg)
2302 {
2303 if (in < argv + argc)
2304 *out++ = *in++;
2305 else
2306 USAGE_ERROR ((0, 0, _("Old option '%c' requires an argument."),
2307 *letter));
2308 }
2309 }
2310
2311 /* Copy all remaining options. */
2312
2313 while (in < argv + argc)
2314 *out++ = *in++;
2315 *out = 0;
2316
2317 /* Replace the old option list by the new one. */
2318
2319 argc = new_argc;
2320 argv = new_argv;
2321 }
2322
2323 /* Parse all options and non-options as they appear. */
2324
2325 prepend_default_options (getenv ("TAR_OPTIONS"), &argc, &argv);
2326
2327 if (argp_parse (&argp, argc, argv, ARGP_IN_ORDER, &idx, &args))
2328 exit (TAREXIT_FAILURE);
2329
2330 /* Special handling for 'o' option:
2331
2332 GNU tar used to say "output old format".
2333 UNIX98 tar says don't chown files after extracting (we use
2334 "--no-same-owner" for this).
2335
2336 The old GNU tar semantics is retained when used with --create
2337 option, otherwise UNIX98 semantics is assumed */
2338
2339 if (args.o_option)
2340 {
2341 if (subcommand_option == CREATE_SUBCOMMAND)
2342 {
2343 /* GNU Tar <= 1.13 compatibility */
2344 set_archive_format ("v7");
2345 }
2346 else
2347 {
2348 /* UNIX98 compatibility */
2349 same_owner_option = -1;
2350 }
2351 }
2352
2353 /* Handle operands after any "--" argument. */
2354 for (; idx < argc; idx++)
2355 {
2356 name_add_name (argv[idx], MAKE_INCL_OPTIONS (&args));
2357 args.input_files = true;
2358 }
2359
2360 /* Warn about implicit use of the wildcards in command line arguments.
2361 See TODO */
2362 warn_regex_usage = args.wildcards == default_wildcards;
2363
2364 /* Derive option values and check option consistency. */
2365
2366 if (archive_format == DEFAULT_FORMAT)
2367 {
2368 if (args.pax_option)
2369 archive_format = POSIX_FORMAT;
2370 else
2371 archive_format = DEFAULT_ARCHIVE_FORMAT;
2372 }
2373
2374 if ((volume_label_option && subcommand_option == CREATE_SUBCOMMAND)
2375 || incremental_option
2376 || multi_volume_option
2377 || sparse_option)
2378 assert_format (FORMAT_MASK (OLDGNU_FORMAT)
2379 | FORMAT_MASK (GNU_FORMAT)
2380 | FORMAT_MASK (POSIX_FORMAT));
2381
2382 if (occurrence_option)
2383 {
2384 if (!args.input_files)
2385 USAGE_ERROR ((0, 0,
2386 _("--occurrence is meaningless without a file list")));
2387 if (!IS_SUBCOMMAND_CLASS (SUBCL_OCCUR))
2388 USAGE_ERROR ((0, 0,
2389 _("--occurrence cannot be used with %s"),
2390 subcommand_string (subcommand_option)));
2391 }
2392
2393 if (archive_names == 0)
2394 {
2395 /* If no archive file name given, try TAPE from the environment, or
2396 else, DEFAULT_ARCHIVE from the configuration process. */
2397
2398 archive_names = 1;
2399 archive_name_array[0] = getenv ("TAPE");
2400 if (! archive_name_array[0])
2401 archive_name_array[0] = DEFAULT_ARCHIVE;
2402 }
2403
2404 /* Allow multiple archives only with '-M'. */
2405
2406 if (archive_names > 1 && !multi_volume_option)
2407 USAGE_ERROR ((0, 0,
2408 _("Multiple archive files require '-M' option")));
2409
2410 if (listed_incremental_option
2411 && NEWER_OPTION_INITIALIZED (newer_mtime_option))
2412 USAGE_ERROR ((0, 0,
2413 _("Cannot combine --listed-incremental with --newer")));
2414 if (incremental_level != -1 && !listed_incremental_option)
2415 WARN ((0, 0,
2416 _("--level is meaningless without --listed-incremental")));
2417
2418 if (volume_label_option)
2419 {
2420 if (archive_format == GNU_FORMAT || archive_format == OLDGNU_FORMAT)
2421 {
2422 size_t volume_label_max_len =
2423 (sizeof current_header->header.name
2424 - 1 /* for trailing '\0' */
2425 - (multi_volume_option
2426 ? (sizeof " Volume "
2427 - 1 /* for null at end of " Volume " */
2428 + INT_STRLEN_BOUND (int) /* for volume number */
2429 - 1 /* for sign, as 0 <= volno */)
2430 : 0));
2431 if (volume_label_max_len < strlen (volume_label_option))
2432 USAGE_ERROR ((0, 0,
2433 ngettext ("%s: Volume label is too long (limit is %lu byte)",
2434 "%s: Volume label is too long (limit is %lu bytes)",
2435 volume_label_max_len),
2436 quotearg_colon (volume_label_option),
2437 (unsigned long) volume_label_max_len));
2438 }
2439 /* else FIXME
2440 Label length in PAX format is limited by the volume size. */
2441 }
2442
2443 if (verify_option)
2444 {
2445 if (multi_volume_option)
2446 USAGE_ERROR ((0, 0, _("Cannot verify multi-volume archives")));
2447 if (use_compress_program_option)
2448 USAGE_ERROR ((0, 0, _("Cannot verify compressed archives")));
2449 if (!IS_SUBCOMMAND_CLASS (SUBCL_WRITE))
2450 USAGE_ERROR ((0, 0, _("--verify cannot be used with %s"),
2451 subcommand_string (subcommand_option)));
2452 }
2453
2454 if (use_compress_program_option)
2455 {
2456 if (multi_volume_option)
2457 USAGE_ERROR ((0, 0, _("Cannot use multi-volume compressed archives")));
2458 if (IS_SUBCOMMAND_CLASS (SUBCL_UPDATE))
2459 USAGE_ERROR ((0, 0, _("Cannot update compressed archives")));
2460 if (subcommand_option == CAT_SUBCOMMAND)
2461 USAGE_ERROR ((0, 0, _("Cannot concatenate compressed archives")));
2462 }
2463
2464 /* It is no harm to use --pax-option on non-pax archives in archive
2465 reading mode. It may even be useful, since it allows to override
2466 file attributes from tar headers. Therefore I allow such usage.
2467 --gray */
2468 if (args.pax_option
2469 && archive_format != POSIX_FORMAT
2470 && !IS_SUBCOMMAND_CLASS (SUBCL_READ))
2471 USAGE_ERROR ((0, 0, _("--pax-option can be used only on POSIX archives")));
2472
2473 /* star creates non-POSIX typed archives with xattr support, so allow the
2474 extra headers when reading */
2475 if ((acls_option > 0)
2476 && archive_format != POSIX_FORMAT
2477 && !IS_SUBCOMMAND_CLASS (SUBCL_READ))
2478 USAGE_ERROR ((0, 0, _("--acls can be used only on POSIX archives")));
2479
2480 if ((selinux_context_option > 0)
2481 && archive_format != POSIX_FORMAT
2482 && !IS_SUBCOMMAND_CLASS (SUBCL_READ))
2483 USAGE_ERROR ((0, 0, _("--selinux can be used only on POSIX archives")));
2484
2485 if ((xattrs_option > 0)
2486 && archive_format != POSIX_FORMAT
2487 && !IS_SUBCOMMAND_CLASS (SUBCL_READ))
2488 USAGE_ERROR ((0, 0, _("--xattrs can be used only on POSIX archives")));
2489
2490 if ((starting_file_option || same_order_option)
2491 && !IS_SUBCOMMAND_CLASS (SUBCL_READ))
2492 USAGE_ERROR ((0, 0,
2493 _("--%s option cannot be used with %s"),
2494 starting_file_option ? "starting-file" : "same-order",
2495 subcommand_string (subcommand_option)));
2496
2497 /* If ready to unlink hierarchies, so we are for simpler files. */
2498 if (recursive_unlink_option)
2499 old_files_option = UNLINK_FIRST_OLD_FILES;
2500
2501 /* Flags for accessing files to be read from or copied into. POSIX says
2502 O_NONBLOCK has unspecified effect on most types of files, but in
2503 practice it never harms and sometimes helps. */
2504 {
2505 int base_open_flags =
2506 (O_BINARY | O_CLOEXEC | O_NOCTTY | O_NONBLOCK
2507 | (dereference_option ? 0 : O_NOFOLLOW)
2508 | (atime_preserve_option == system_atime_preserve ? O_NOATIME : 0));
2509 open_read_flags = O_RDONLY | base_open_flags;
2510 open_searchdir_flags = O_SEARCH | O_DIRECTORY | base_open_flags;
2511 }
2512 fstatat_flags = dereference_option ? 0 : AT_SYMLINK_NOFOLLOW;
2513
2514 if (subcommand_option == TEST_LABEL_SUBCOMMAND)
2515 {
2516 /* --test-label is silent if the user has specified the label name to
2517 compare against. */
2518 if (!args.input_files)
2519 verbose_option++;
2520 }
2521 else if (utc_option)
2522 verbose_option = 2;
2523
2524 if (tape_length_option && tape_length_option < record_size)
2525 USAGE_ERROR ((0, 0, _("Volume length cannot be less than record size")));
2526
2527 if (same_order_option && listed_incremental_option)
2528 USAGE_ERROR ((0, 0, _("--preserve-order is not compatible with "
2529 "--listed-incremental")));
2530
2531 /* Forbid using -c with no input files whatsoever. Check that '-f -',
2532 explicit or implied, is used correctly. */
2533
2534 switch (subcommand_option)
2535 {
2536 case CREATE_SUBCOMMAND:
2537 if (!args.input_files && !files_from_option)
2538 USAGE_ERROR ((0, 0,
2539 _("Cowardly refusing to create an empty archive")));
2540 if (args.compress_autodetect && archive_names
2541 && strcmp (archive_name_array[0], "-"))
2542 set_compression_program_by_suffix (archive_name_array[0],
2543 use_compress_program_option);
2544 break;
2545
2546 case EXTRACT_SUBCOMMAND:
2547 case LIST_SUBCOMMAND:
2548 case DIFF_SUBCOMMAND:
2549 case TEST_LABEL_SUBCOMMAND:
2550 for (archive_name_cursor = archive_name_array;
2551 archive_name_cursor < archive_name_array + archive_names;
2552 archive_name_cursor++)
2553 if (!strcmp (*archive_name_cursor, "-"))
2554 request_stdin ("-f");
2555 break;
2556
2557 case CAT_SUBCOMMAND:
2558 case UPDATE_SUBCOMMAND:
2559 case APPEND_SUBCOMMAND:
2560 for (archive_name_cursor = archive_name_array;
2561 archive_name_cursor < archive_name_array + archive_names;
2562 archive_name_cursor++)
2563 if (!strcmp (*archive_name_cursor, "-"))
2564 USAGE_ERROR ((0, 0,
2565 _("Options '-Aru' are incompatible with '-f -'")));
2566
2567 default:
2568 break;
2569 }
2570
2571 /* Initialize stdlis */
2572 if (index_file_name)
2573 {
2574 stdlis = fopen (index_file_name, "w");
2575 if (! stdlis)
2576 open_fatal (index_file_name);
2577 }
2578 else
2579 stdlis = to_stdout_option ? stderr : stdout;
2580
2581 archive_name_cursor = archive_name_array;
2582
2583 /* Prepare for generating backup names. */
2584
2585 if (args.backup_suffix_string)
2586 simple_backup_suffix = xstrdup (args.backup_suffix_string);
2587
2588 if (backup_option)
2589 {
2590 backup_type = xget_version ("--backup", args.version_control_string);
2591 /* No backup is needed either if explicitely disabled or if
2592 the extracted files are not being written to disk. */
2593 if (backup_type == no_backups || EXTRACT_OVER_PIPE)
2594 backup_option = false;
2595 }
2596
2597 checkpoint_finish_compile ();
2598
2599 report_textual_dates (&args);
2600 }
2601
2602 void
2603 more_options (int argc, char **argv)
2604 {
2605 int idx;
2606 if (argp_parse (&argp, argc, argv, ARGP_IN_ORDER,
2607 &idx, &args))
2608 exit (TAREXIT_FAILURE);
2609 }
2610 \f
2611 /* Tar proper. */
2612
2613 /* Main routine for tar. */
2614 int
2615 main (int argc, char **argv)
2616 {
2617 set_start_time ();
2618 set_program_name (argv[0]);
2619
2620 setlocale (LC_ALL, "");
2621 bindtextdomain (PACKAGE, LOCALEDIR);
2622 textdomain (PACKAGE);
2623
2624 exit_failure = TAREXIT_FAILURE;
2625 exit_status = TAREXIT_SUCCESS;
2626 error_hook = checkpoint_flush_actions;
2627
2628 filename_terminator = '\n';
2629 set_quoting_style (0, DEFAULT_QUOTING_STYLE);
2630
2631 /* Make sure we have first three descriptors available */
2632 stdopen ();
2633
2634 /* Pre-allocate a few structures. */
2635
2636 allocated_archive_names = 10;
2637 archive_name_array =
2638 xmalloc (sizeof (const char *) * allocated_archive_names);
2639 archive_names = 0;
2640
2641 /* System V fork+wait does not work if SIGCHLD is ignored. */
2642 signal (SIGCHLD, SIG_DFL);
2643
2644 /* Try to disable the ability to unlink a directory. */
2645 priv_set_remove_linkdir ();
2646
2647 /* Decode options. */
2648
2649 decode_options (argc, argv);
2650
2651 name_init ();
2652
2653 /* Main command execution. */
2654
2655 if (volno_file_option)
2656 init_volume_number ();
2657
2658 switch (subcommand_option)
2659 {
2660 case UNKNOWN_SUBCOMMAND:
2661 USAGE_ERROR ((0, 0,
2662 _("You must specify one of the '-Acdtrux', '--delete' or '--test-label' options")));
2663
2664 case CAT_SUBCOMMAND:
2665 case UPDATE_SUBCOMMAND:
2666 case APPEND_SUBCOMMAND:
2667 update_archive ();
2668 break;
2669
2670 case DELETE_SUBCOMMAND:
2671 delete_archive_members ();
2672 break;
2673
2674 case CREATE_SUBCOMMAND:
2675 create_archive ();
2676 break;
2677
2678 case EXTRACT_SUBCOMMAND:
2679 extr_init ();
2680 read_and (extract_archive);
2681
2682 /* FIXME: should extract_finish () even if an ordinary signal is
2683 received. */
2684 extract_finish ();
2685
2686 break;
2687
2688 case LIST_SUBCOMMAND:
2689 read_and (list_archive);
2690 break;
2691
2692 case DIFF_SUBCOMMAND:
2693 diff_init ();
2694 read_and (diff_archive);
2695 break;
2696
2697 case TEST_LABEL_SUBCOMMAND:
2698 test_archive_label ();
2699 }
2700
2701 checkpoint_finish ();
2702
2703 if (totals_option)
2704 print_total_stats ();
2705
2706 if (check_links_option)
2707 check_links ();
2708
2709 if (volno_file_option)
2710 closeout_volume_number ();
2711
2712 /* Dispose of allocated memory, and return. */
2713
2714 free (archive_name_array);
2715 xattrs_clear_setup ();
2716 name_term ();
2717
2718 if (exit_status == TAREXIT_FAILURE)
2719 error (0, 0, _("Exiting with failure status due to previous errors"));
2720
2721 if (stdlis == stdout)
2722 close_stdout ();
2723 else if (ferror (stderr) || fclose (stderr) != 0)
2724 set_exit_status (TAREXIT_FAILURE);
2725
2726 return exit_status;
2727 }
2728
2729 void
2730 tar_stat_init (struct tar_stat_info *st)
2731 {
2732 memset (st, 0, sizeof (*st));
2733 }
2734
2735 /* Close the stream or file descriptor associated with ST, and remove
2736 all traces of it from ST. Return true if successful, false (with a
2737 diagnostic) otherwise. */
2738 bool
2739 tar_stat_close (struct tar_stat_info *st)
2740 {
2741 int status = (st->dirstream ? closedir (st->dirstream)
2742 : 0 < st->fd ? close (st->fd)
2743 : 0);
2744 st->dirstream = 0;
2745 st->fd = 0;
2746
2747 if (status == 0)
2748 return true;
2749 else
2750 {
2751 close_diag (st->orig_file_name);
2752 return false;
2753 }
2754 }
2755
2756 void
2757 tar_stat_destroy (struct tar_stat_info *st)
2758 {
2759 tar_stat_close (st);
2760 xheader_xattr_free (st->xattr_map, st->xattr_map_size);
2761 free (st->orig_file_name);
2762 free (st->file_name);
2763 free (st->link_name);
2764 free (st->uname);
2765 free (st->gname);
2766 free (st->cntx_name);
2767 free (st->acls_a_ptr);
2768 free (st->acls_d_ptr);
2769 free (st->sparse_map);
2770 free (st->dumpdir);
2771 xheader_destroy (&st->xhdr);
2772 memset (st, 0, sizeof (*st));
2773 }
2774
2775 /* Format mask for all available formats that support nanosecond
2776 timestamp resolution. */
2777 #define NS_PRECISION_FORMAT_MASK FORMAT_MASK (POSIX_FORMAT)
2778
2779 /* Same as timespec_cmp, but ignore nanoseconds if current archive
2780 format does not provide sufficient resolution. */
2781 int
2782 tar_timespec_cmp (struct timespec a, struct timespec b)
2783 {
2784 if (!(FORMAT_MASK (current_format) & NS_PRECISION_FORMAT_MASK))
2785 a.tv_nsec = b.tv_nsec = 0;
2786 return timespec_cmp (a, b);
2787 }
2788
2789 /* Set tar exit status to VAL, unless it is already indicating
2790 a more serious condition. This relies on the fact that the
2791 values of TAREXIT_ constants are ranged by severity. */
2792 void
2793 set_exit_status (int val)
2794 {
2795 if (val > exit_status)
2796 exit_status = val;
2797 }
This page took 0.153795 seconds and 3 git commands to generate.