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