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