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