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