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