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