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