1 /* A tar (tape archiver) program.
3 Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000,
4 2001, 2003 Free Software Foundation, Inc.
6 Written by John Gilmore, starting 1985-08-25.
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
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.
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 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
28 #if ! defined SIGCHLD && defined SIGCLD
29 # define SIGCHLD SIGCLD
32 /* The following causes "common.h" to produce definitions of all the global
33 variables, rather than just "extern" declarations of them. GNU tar does
34 depend on the system loader to preset all GLOBAL variables to neutral (or
35 zero) values; explicit initialization is usually not done. */
40 #include <localedir.h>
45 /* Local declarations. */
47 #ifndef DEFAULT_ARCHIVE_FORMAT
48 # define DEFAULT_ARCHIVE_FORMAT GNU_FORMAT
51 #ifndef DEFAULT_ARCHIVE
52 # define DEFAULT_ARCHIVE "tar.out"
55 #ifndef DEFAULT_BLOCKING
56 # define DEFAULT_BLOCKING 20
59 void usage (int) __attribute__ ((noreturn
));
63 /* Name of option using stdin. */
64 static const char *stdin_used_by
;
66 /* Doesn't return if stdin already requested. */
68 request_stdin (const char *option
)
71 USAGE_ERROR ((0, 0, _("Options `-%s' and `-%s' both want standard input"),
72 stdin_used_by
, option
));
74 stdin_used_by
= option
;
77 /* Returns true if and only if the user typed 'y' or 'Y'. */
79 confirm (const char *message_action
, const char *message_name
)
81 static FILE *confirm_file
;
82 static int confirm_file_EOF
;
86 if (archive
== 0 || stdin_used_by
)
88 confirm_file
= fopen (TTY_NAME
, "r");
90 open_fatal (TTY_NAME
);
99 fprintf (stdlis
, "%s %s?", message_action
, quote (message_name
));
103 int reply
= confirm_file_EOF
? EOF
: getc (confirm_file
);
106 for (character
= reply
;
108 character
= getc (confirm_file
))
109 if (character
== EOF
)
111 confirm_file_EOF
= 1;
112 fputc ('\n', stdlis
);
116 return reply
== 'y' || reply
== 'Y';
120 static struct fmttab
{
122 enum archive_format fmt
;
125 { "oldgnu", OLDGNU_FORMAT
},
126 { "ustar", USTAR_FORMAT
},
127 { "posix", POSIX_FORMAT
},
128 #if 0 /* not fully supported yet */
129 { "star", STAR_FORMAT
},
131 { "gnu", GNU_FORMAT
},
136 set_archive_format (char const *name
)
138 struct fmttab
const *p
;
140 for (p
= fmttab
; strcmp (p
->name
, name
) != 0; )
142 USAGE_ERROR ((0, 0, _("%s: Invalid archive format"),
143 quotearg_colon (name
)));
145 archive_format
= p
->fmt
;
149 archive_format_string (enum archive_format fmt
)
151 struct fmttab
const *p
;
153 for (p
= fmttab
; p
->name
; p
++)
159 #define FORMAT_MASK(n) (1<<(n))
162 assert_format(unsigned fmt_mask
)
164 if ((FORMAT_MASK(archive_format
) & fmt_mask
) == 0)
166 _("GNU features wanted on incompatible archive format")));
173 /* For long options that unconditionally set a single flag, we have getopt
174 do it. For the others, we share the code for the equivalent short
175 named option, the name of which is stored in the otherwise-unused `val'
176 field of the `struct option'; for long options that have no equivalent
177 short option, we use non-characters as pseudo short options,
178 starting at CHAR_MAX + 1 and going upwards. */
182 ANCHORED_OPTION
= CHAR_MAX
+ 1,
183 ATIME_PRESERVE_OPTION
,
192 IGNORE_FAILED_READ_OPTION
,
197 NO_IGNORE_CASE_OPTION
,
198 NO_OVERWRITE_DIR_OPTION
,
200 NO_WILDCARDS_MATCH_SLASH_OPTION
,
202 NUMERIC_OWNER_OPTION
,
210 RECURSIVE_UNLINK_OPTION
,
213 SHOW_DEFAULTS_OPTION
,
214 SHOW_OMITTED_DIRS_OPTION
,
218 USE_COMPRESS_PROGRAM_OPTION
,
221 WILDCARDS_MATCH_SLASH_OPTION
224 /* If nonzero, display usage information and exit. */
225 static int show_help
;
227 /* If nonzero, print the version on standard output and exit. */
228 static int show_version
;
230 static struct option long_options
[] =
232 {"absolute-names", no_argument
, 0, 'P'},
233 {"after-date", required_argument
, 0, 'N'},
234 {"anchored", no_argument
, 0, ANCHORED_OPTION
},
235 {"append", no_argument
, 0, 'r'},
236 {"atime-preserve", no_argument
, 0, ATIME_PRESERVE_OPTION
},
237 {"backup", optional_argument
, 0, BACKUP_OPTION
},
238 {"block-number", no_argument
, 0, 'R'},
239 {"blocking-factor", required_argument
, 0, 'b'},
240 {"bzip2", no_argument
, 0, 'j'},
241 {"catenate", no_argument
, 0, 'A'},
242 {"checkpoint", no_argument
, 0, CHECKPOINT_OPTION
},
243 {"check-links", no_argument
, &check_links_option
, 1},
244 {"compare", no_argument
, 0, 'd'},
245 {"compress", no_argument
, 0, 'Z'},
246 {"concatenate", no_argument
, 0, 'A'},
247 {"confirmation", no_argument
, 0, 'w'},
248 /* FIXME: --selective as a synonym for --confirmation? */
249 {"create", no_argument
, 0, 'c'},
250 {"delete", no_argument
, 0, DELETE_OPTION
},
251 {"dereference", no_argument
, 0, 'h'},
252 {"diff", no_argument
, 0, 'd'},
253 {"directory", required_argument
, 0, 'C'},
254 {"exclude", required_argument
, 0, EXCLUDE_OPTION
},
255 {"exclude-from", required_argument
, 0, 'X'},
256 {"extract", no_argument
, 0, 'x'},
257 {"file", required_argument
, 0, 'f'},
258 {"files-from", required_argument
, 0, 'T'},
259 {"force-local", no_argument
, 0, FORCE_LOCAL_OPTION
},
260 {"format", required_argument
, 0, FORMAT_OPTION
},
261 {"get", no_argument
, 0, 'x'},
262 {"group", required_argument
, 0, GROUP_OPTION
},
263 {"gunzip", no_argument
, 0, 'z'},
264 {"gzip", no_argument
, 0, 'z'},
265 {"help", no_argument
, &show_help
, 1},
266 {"ignore-case", no_argument
, 0, IGNORE_CASE_OPTION
},
267 {"ignore-failed-read", no_argument
, 0, IGNORE_FAILED_READ_OPTION
},
268 {"ignore-zeros", no_argument
, 0, 'i'},
269 /* FIXME: --ignore-end as a new name for --ignore-zeros? */
270 {"incremental", no_argument
, 0, 'G'},
271 {"index-file", required_argument
, 0, INDEX_FILE_OPTION
},
272 {"info-script", required_argument
, 0, 'F'},
273 {"interactive", no_argument
, 0, 'w'},
274 {"keep-old-files", no_argument
, 0, 'k'},
275 {"label", required_argument
, 0, 'V'},
276 {"list", no_argument
, 0, 't'},
277 {"listed-incremental", required_argument
, 0, 'g'},
278 {"mode", required_argument
, 0, MODE_OPTION
},
279 {"multi-volume", no_argument
, 0, 'M'},
280 {"new-volume-script", required_argument
, 0, 'F'},
281 {"newer", required_argument
, 0, 'N'},
282 {"newer-mtime", required_argument
, 0, NEWER_MTIME_OPTION
},
283 {"null", no_argument
, 0, NULL_OPTION
},
284 {"no-anchored", no_argument
, 0, NO_ANCHORED_OPTION
},
285 {"no-ignore-case", no_argument
, 0, NO_IGNORE_CASE_OPTION
},
286 {"no-overwrite-dir", no_argument
, 0, NO_OVERWRITE_DIR_OPTION
},
287 {"no-wildcards", no_argument
, 0, NO_WILDCARDS_OPTION
},
288 {"no-wildcards-match-slash", no_argument
, 0, NO_WILDCARDS_MATCH_SLASH_OPTION
},
289 {"no-recursion", no_argument
, &recursion_option
, 0},
290 {"no-same-owner", no_argument
, &same_owner_option
, -1},
291 {"no-same-permissions", no_argument
, &same_permissions_option
, -1},
292 {"numeric-owner", no_argument
, 0, NUMERIC_OWNER_OPTION
},
293 {"occurrence", optional_argument
, 0, OCCURRENCE_OPTION
},
294 {"old-archive", no_argument
, 0, 'o'},
295 {"one-file-system", no_argument
, 0, 'l'},
296 {"overwrite", no_argument
, 0, OVERWRITE_OPTION
},
297 {"owner", required_argument
, 0, OWNER_OPTION
},
298 {"pax-option", required_argument
, 0, PAX_OPTION
},
299 {"portability", no_argument
, 0, 'o'},
300 {"posix", no_argument
, 0, POSIX_OPTION
},
301 {"preserve", no_argument
, 0, PRESERVE_OPTION
},
302 {"preserve-order", no_argument
, 0, 's'},
303 {"preserve-permissions", no_argument
, 0, 'p'},
304 {"recursion", no_argument
, &recursion_option
, FNM_LEADING_DIR
},
305 {"recursive-unlink", no_argument
, 0, RECURSIVE_UNLINK_OPTION
},
306 {"read-full-records", no_argument
, 0, 'B'},
307 /* FIXME: --partial-blocks might be a synonym for --read-full-records? */
308 {"record-size", required_argument
, 0, RECORD_SIZE_OPTION
},
309 {"remove-files", no_argument
, 0, REMOVE_FILES_OPTION
},
310 {"rsh-command", required_argument
, 0, RSH_COMMAND_OPTION
},
311 {"same-order", no_argument
, 0, 's'},
312 {"same-owner", no_argument
, &same_owner_option
, 1},
313 {"same-permissions", no_argument
, 0, 'p'},
314 {"show-defaults", no_argument
, 0, SHOW_DEFAULTS_OPTION
},
315 {"show-omitted-dirs", no_argument
, 0, SHOW_OMITTED_DIRS_OPTION
},
316 {"sparse", no_argument
, 0, 'S'},
317 {"starting-file", required_argument
, 0, 'K'},
318 {"strip-path", required_argument
, 0, STRIP_PATH_OPTION
},
319 {"suffix", required_argument
, 0, SUFFIX_OPTION
},
320 {"tape-length", required_argument
, 0, 'L'},
321 {"to-stdout", no_argument
, 0, 'O'},
322 {"totals", no_argument
, 0, TOTALS_OPTION
},
323 {"touch", no_argument
, 0, 'm'},
324 {"uncompress", no_argument
, 0, 'Z'},
325 {"ungzip", no_argument
, 0, 'z'},
326 {"unlink-first", no_argument
, 0, 'U'},
327 {"update", no_argument
, 0, 'u'},
328 {"use-compress-program", required_argument
, 0, USE_COMPRESS_PROGRAM_OPTION
},
329 {"verbose", no_argument
, 0, 'v'},
330 {"verify", no_argument
, 0, 'W'},
331 {"version", no_argument
, &show_version
, 1},
332 {"volno-file", required_argument
, 0, VOLNO_FILE_OPTION
},
333 {"wildcards", no_argument
, 0, WILDCARDS_OPTION
},
334 {"wildcards-match-slash", no_argument
, 0, WILDCARDS_MATCH_SLASH_OPTION
},
339 /* Print a usage message and exit with STATUS. */
343 if (status
!= TAREXIT_SUCCESS
)
344 fprintf (stderr
, _("Try `%s --help' for more information.\n"),
349 GNU `tar' saves many files together into a single tape or disk archive, and\n\
350 can restore individual files from the archive.\n"),
352 printf (_("\nUsage: %s [OPTION]... [FILE]...\n\
355 %s -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n\
356 %s -tvf archive.tar # List all files in archive.tar verbosely.\n\
357 %s -xf archive.tar # Extract all files from archive.tar.\n"),
358 program_name
, program_name
, program_name
, program_name
);
361 If a long option shows an argument as mandatory, then it is mandatory\n\
362 for the equivalent short option also. Similarly for optional arguments.\n"),
366 Main operation mode:\n\
367 -t, --list list the contents of an archive\n\
368 -x, --extract, --get extract files from an archive\n\
369 -c, --create create a new archive\n\
370 -d, --diff, --compare find differences between archive and file system\n\
371 -r, --append append files to the end of an archive\n\
372 -u, --update only append files newer than copy in archive\n\
373 -A, --catenate append tar files to an archive\n\
374 --concatenate same as -A\n\
375 --delete delete from the archive (not on mag tapes!)\n"),
379 Operation modifiers:\n\
380 -W, --verify attempt to verify the archive after writing it\n\
381 --remove-files remove files after adding them to the archive\n\
382 -k, --keep-old-files don't replace existing files when extracting\n\
383 --overwrite overwrite existing files when extracting\n\
384 --no-overwrite-dir preserve metadata of existing directories\n\
385 -U, --unlink-first remove each file prior to extracting over it\n\
386 --recursive-unlink empty hierarchies prior to extracting directory\n\
387 -S, --sparse handle sparse files efficiently\n\
388 -O, --to-stdout extract files to standard output\n\
389 -G, --incremental handle old GNU-format incremental backup\n\
390 -g, --listed-incremental=FILE\n\
391 handle new GNU-format incremental backup\n\
392 --ignore-failed-read do not exit with nonzero on unreadable files\n\
393 --occurrence[=NUM] process only the NUMth occurrence of each file in\n\
394 the archive. This option is valid only in\n\
395 conjunction with one of the subcommands --delete,\n\
396 --diff, --extract or --list and when a list of\n\
397 files is given either on the command line or\n\
399 NUM defaults to 1.\n"),
403 Handling of file attributes:\n\
404 --owner=NAME force NAME as owner for added files\n\
405 --group=NAME force NAME as group for added files\n\
406 --mode=CHANGES force (symbolic) mode CHANGES for added files\n\
407 --atime-preserve don't change access times on dumped files\n\
408 -m, --modification-time don't extract file modified time\n\
409 --same-owner try extracting files with the same ownership\n\
410 --no-same-owner extract files as yourself\n\
411 --numeric-owner always use numbers for user/group names\n\
412 -p, --same-permissions extract permissions information\n\
413 --no-same-permissions do not extract permissions information\n\
414 --preserve-permissions same as -p\n\
415 -s, --same-order sort names to extract to match archive\n\
416 --preserve-order same as -s\n\
417 --preserve same as both -p and -s\n"),
421 Device selection and switching:\n\
422 -f, --file=ARCHIVE use archive file or device ARCHIVE\n\
423 --force-local archive file is local even if has a colon\n\
424 --rsh-command=COMMAND use remote COMMAND instead of rsh\n\
425 -[0-7][lmh] specify drive and density\n\
426 -M, --multi-volume create/list/extract multi-volume archive\n\
427 -L, --tape-length=NUM change tape after writing NUM x 1024 bytes\n\
428 -F, --info-script=FILE run script at end of each tape (implies -M)\n\
429 --new-volume-script=FILE same as -F FILE\n\
430 --volno-file=FILE use/update the volume number in FILE\n"),
435 -b, --blocking-factor=BLOCKS BLOCKS x 512 bytes per record\n\
436 --record-size=SIZE SIZE bytes per record, multiple of 512\n\
437 -i, --ignore-zeros ignore zeroed blocks in archive (means EOF)\n\
438 -B, --read-full-records reblock as we read (for 4.2BSD pipes)\n"),
442 Archive format selection:\n\
443 --format=FMTNAME create archive of the given format.\n\
444 FMTNAME is one of the following:\n\
445 v7 old V7 tar format\n\
446 oldgnu GNU format as per tar <= 1.12\n\
447 gnu GNU tar 1.13 format\n\
448 ustar POSIX 1003.1-1988 (ustar) format\n\
449 posix POSIX 1003.1-2001 (pax) format\n\
450 --old-archive, --portability same as --format=v7\n\
451 --posix same as --format=posix\n\
452 --pax-option keyword[[:]=value][,keyword[[:]=value], ...]\n\
453 control pax keywords\n\
454 -V, --label=NAME create archive with volume name NAME\n\
455 PATTERN at list/extract time, a globbing PATTERN\n\
456 -j, --bzip2 filter the archive through bzip2\n\
457 -z, --gzip, --ungzip filter the archive through gzip\n\
458 -Z, --compress, --uncompress filter the archive through compress\n\
459 --use-compress-program=PROG filter through PROG (must accept -d)\n"),
463 Local file selection:\n\
464 -C, --directory=DIR change to directory DIR\n\
465 -T, --files-from=NAME get names to extract or create from file NAME\n\
466 --null -T reads null-terminated names, disable -C\n\
467 --exclude=PATTERN exclude files, given as a PATTERN\n\
468 -X, --exclude-from=FILE exclude patterns listed in FILE\n\
469 --anchored exclude patterns match file name start (default)\n\
470 --no-anchored exclude patterns match after any /\n\
471 --ignore-case exclusion ignores case\n\
472 --no-ignore-case exclusion is case sensitive (default)\n\
473 --wildcards exclude patterns use wildcards (default)\n\
474 --no-wildcards exclude patterns are plain strings\n\
475 --wildcards-match-slash exclude pattern wildcards match '/' (default)\n\
476 --no-wildcards-match-slash exclude pattern wildcards do not match '/'\n\
477 -P, --absolute-names don't strip leading `/'s from file names\n\
478 -h, --dereference dump instead the files symlinks point to\n\
479 --no-recursion avoid descending automatically in directories\n\
480 -l, --one-file-system stay in local file system when creating archive\n\
481 -K, --starting-file=NAME begin at file NAME in the archive\n\
482 --strip-path=NUM strip NUM leading components from file names\n\
483 before extraction\n"),
487 -N, --newer=DATE-OR-FILE only store files newer than DATE-OR-FILE\n\
488 --newer-mtime=DATE compare date and time when data changed only\n\
489 --after-date=DATE same as -N\n"),
493 --backup[=CONTROL] backup before removal, choose version control\n\
494 --suffix=SUFFIX backup before removal, override usual suffix\n"),
498 Informative output:\n\
499 --help print this help, then exit\n\
500 --version print tar program version number, then exit\n\
501 -v, --verbose verbosely list files processed\n\
502 --checkpoint print directory names while reading the archive\n\
503 --check-links print a message if not all links are dumped\n\
504 --totals print total bytes written while creating archive\n\
505 --index-file=FILE send verbose output to FILE\n\
506 -R, --block-number show block number within archive with each message\n\
507 -w, --interactive ask for confirmation for every action\n\
508 --confirmation same as -w\n"),
512 Compatibility options:\n\
513 -o when creating, same as --old-archive\n\
514 when extracting, same as --no-same-owner\n"),
519 The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
520 The version control may be set with --backup or VERSION_CONTROL, values are:\n\
522 t, numbered make numbered backups\n\
523 nil, existing numbered if numbered backups exist, simple otherwise\n\
524 never, simple always make simple backups\n"),
528 ARCHIVE may be FILE, HOST:FILE or USER@HOST:FILE; DATE may be a textual date\n\
529 or a file name starting with `/' or `.', in which case the file's date is used.\n\
530 *This* `tar' defaults to `--format=%s -f%s -b%d'.\n"),
531 archive_format_string (DEFAULT_ARCHIVE_FORMAT
),
532 DEFAULT_ARCHIVE
, DEFAULT_BLOCKING
);
533 printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT
);
538 /* Parse the options for tar. */
540 /* Available option letters are DEHIJQY and aenqy. Some are reserved:
542 e exit immediately with a nonzero exit status if unexpected errors occur
543 E use extended headers (draft POSIX headers, that is)
544 I same as T (for compatibility with Solaris tar)
545 n the archive is quickly seekable, so don't worry about random seeks
546 q stop after extracting the first occurrence of the named file
547 y per-file gzip compression
548 Y per-block gzip compression */
550 #define OPTION_STRING \
551 "-01234567ABC:F:GIK:L:MN:OPRST:UV:WX:Zb:cdf:g:hijklmoprstuvwxyz"
554 set_subcommand_option (enum subcommand subcommand
)
556 if (subcommand_option
!= UNKNOWN_SUBCOMMAND
557 && subcommand_option
!= subcommand
)
559 _("You may not specify more than one `-Acdtrux' option")));
561 subcommand_option
= subcommand
;
565 set_use_compress_program_option (const char *string
)
567 if (use_compress_program_option
&& strcmp (use_compress_program_option
, string
) != 0)
568 USAGE_ERROR ((0, 0, _("Conflicting compression options")));
570 use_compress_program_option
= string
;
574 decode_options (int argc
, char **argv
)
576 int optchar
; /* option letter */
577 int input_files
; /* number of input files */
578 char const *textual_date_option
= 0;
579 char const *backup_suffix_string
;
580 char const *version_control_string
= 0;
581 int exclude_options
= EXCLUDE_WILDCARDS
;
585 /* Set some default option values. */
587 subcommand_option
= UNKNOWN_SUBCOMMAND
;
588 archive_format
= DEFAULT_FORMAT
;
589 blocking_factor
= DEFAULT_BLOCKING
;
590 record_size
= DEFAULT_BLOCKING
* BLOCKSIZE
;
591 excluded
= new_exclude ();
592 newer_mtime_option
= TYPE_MINIMUM (time_t);
593 recursion_option
= FNM_LEADING_DIR
;
598 backup_suffix_string
= getenv ("SIMPLE_BACKUP_SUFFIX");
600 /* Convert old-style tar call by exploding option element and rearranging
601 options accordingly. */
603 if (argc
> 1 && argv
[1][0] != '-')
605 int new_argc
; /* argc value for rearranged arguments */
606 char **new_argv
; /* argv value for rearranged arguments */
607 char *const *in
; /* cursor into original argv */
608 char **out
; /* cursor into rearranged argv */
609 const char *letter
; /* cursor into old option letters */
610 char buffer
[3]; /* constructed option buffer */
611 const char *cursor
; /* cursor in OPTION_STRING */
613 /* Initialize a constructed option. */
618 /* Allocate a new argument array, and copy program name in it. */
620 new_argc
= argc
- 1 + strlen (argv
[1]);
621 new_argv
= xmalloc ((new_argc
+ 1) * sizeof (char *));
626 /* Copy each old letter option as a separate option, and have the
627 corresponding argument moved next to it. */
629 for (letter
= *in
++; *letter
; letter
++)
632 *out
++ = xstrdup (buffer
);
633 cursor
= strchr (OPTION_STRING
, *letter
);
634 if (cursor
&& cursor
[1] == ':')
636 if (in
< argv
+ argc
)
639 USAGE_ERROR ((0, 0, _("Old option `%c' requires an argument."),
644 /* Copy all remaining options. */
646 while (in
< argv
+ argc
)
650 /* Replace the old option list by the new one. */
656 /* Parse all options and non-options as they appear. */
660 prepend_default_options (getenv ("TAR_OPTIONS"), &argc
, &argv
);
662 while (optchar
= getopt_long (argc
, argv
, OPTION_STRING
, long_options
, 0),
667 usage (TAREXIT_FAILURE
);
673 /* File name or non-parsed option, because of RETURN_IN_ORDER
674 ordering triggered by the leading dash in OPTION_STRING. */
681 set_subcommand_option (CAT_SUBCOMMAND
);
687 if (! (xstrtoumax (optarg
, 0, 10, &u
, "") == LONGINT_OK
688 && u
== (blocking_factor
= u
)
689 && 0 < blocking_factor
690 && u
== (record_size
= u
* BLOCKSIZE
) / BLOCKSIZE
))
691 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (optarg
),
692 _("Invalid blocking factor")));
697 /* Try to reblock input records. For reading 4.2BSD pipes. */
699 /* It would surely make sense to exchange -B and -R, but it seems
700 that -B has been used for a long while in Sun tar ans most
701 BSD-derived systems. This is a consequence of the block/record
702 terminology confusion. */
704 read_full_records_option
= true;
708 set_subcommand_option (CREATE_SUBCOMMAND
);
717 set_subcommand_option (DIFF_SUBCOMMAND
);
721 if (archive_names
== allocated_archive_names
)
723 allocated_archive_names
*= 2;
725 xrealloc (archive_name_array
,
726 sizeof (const char *) * allocated_archive_names
);
728 archive_name_array
[archive_names
++] = optarg
;
732 /* Since -F is only useful with -M, make it implied. Run this
733 script at the end of each tape. */
735 info_script_option
= optarg
;
736 multi_volume_option
= true;
740 listed_incremental_option
= optarg
;
741 after_date_option
= true;
745 /* We are making an incremental dump (FIXME: are we?); save
746 directories at the beginning of the archive, and include in each
747 directory its contents. */
749 incremental_option
= true;
753 /* Follow symbolic links. */
754 dereference_option
= true;
758 /* Ignore zero blocks (eofs). This can't be the default,
759 because Unix tar writes two blocks of zeros, then pads out
760 the record with garbage. */
762 ignore_zeros_option
= true;
767 _("Warning: the -I option is not supported;"
768 " perhaps you meant -j or -T?")));
772 set_use_compress_program_option ("bzip2");
776 /* Don't replace existing files. */
777 old_files_option
= KEEP_OLD_FILES
;
781 starting_file_option
= true;
786 /* When dumping directories, don't dump files/subdirectories
787 that are on other filesystems. */
789 one_file_system_option
= true;
795 if (xstrtoumax (optarg
, 0, 10, &u
, "") != LONGINT_OK
)
796 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (optarg
),
797 _("Invalid tape length")));
798 tape_length_option
= 1024 * (tarlong
) u
;
799 multi_volume_option
= true;
808 /* Make multivolume archive: when we can't write any more into
809 the archive, re-open it, and continue writing. */
811 multi_volume_option
= true;
816 after_date_option
= true;
819 case NEWER_MTIME_OPTION
:
820 if (newer_mtime_option
!= TYPE_MINIMUM (time_t))
821 USAGE_ERROR ((0, 0, _("More than one threshold date")));
823 if (FILESYSTEM_PREFIX_LEN (optarg
) != 0
828 if (deref_stat (dereference_option
, optarg
, &st
) != 0)
831 USAGE_ERROR ((0, 0, _("Date file not found")));
833 newer_mtime_option
= st
.st_mtime
;
837 newer_mtime_option
= get_date (optarg
, 0);
838 if (newer_mtime_option
== (time_t) -1)
839 WARN ((0, 0, _("Substituting %s for unknown date format %s"),
840 tartime (newer_mtime_option
), quote (optarg
)));
842 textual_date_option
= optarg
;
846 #endif /* not MSDOS */
853 to_stdout_option
= true;
857 same_permissions_option
= true;
861 absolute_names_option
= true;
865 set_subcommand_option (APPEND_SUBCOMMAND
);
869 /* Print block numbers for debugging bad tar archives. */
871 /* It would surely make sense to exchange -B and -R, but it seems
872 that -B has been used for a long while in Sun tar ans most
873 BSD-derived systems. This is a consequence of the block/record
874 terminology confusion. */
876 block_number_option
= true;
880 /* Names to extr are sorted. */
882 same_order_option
= true;
886 sparse_option
= true;
890 set_subcommand_option (LIST_SUBCOMMAND
);
895 files_from_option
= optarg
;
899 set_subcommand_option (UPDATE_SUBCOMMAND
);
903 old_files_option
= UNLINK_FIRST_OLD_FILES
;
911 volume_label_option
= optarg
;
915 interactive_option
= true;
919 verify_option
= true;
923 set_subcommand_option (EXTRACT_SUBCOMMAND
);
927 if (add_exclude_file (add_exclude
, excluded
, optarg
,
928 exclude_options
| recursion_option
, '\n')
932 FATAL_ERROR ((0, e
, "%s", quotearg_colon (optarg
)));
938 _("Warning: the -y option is not supported;"
939 " perhaps you meant -j?")));
943 set_use_compress_program_option ("gzip");
947 set_use_compress_program_option ("compress");
950 case ANCHORED_OPTION
:
951 exclude_options
|= EXCLUDE_ANCHORED
;
954 case ATIME_PRESERVE_OPTION
:
955 atime_preserve_option
= true;
958 case CHECKPOINT_OPTION
:
959 checkpoint_option
= true;
963 backup_option
= true;
965 version_control_string
= optarg
;
969 set_subcommand_option (DELETE_SUBCOMMAND
);
973 add_exclude (excluded
, optarg
, exclude_options
| recursion_option
);
976 case FORCE_LOCAL_OPTION
:
977 force_local_option
= true;
981 set_archive_format (optarg
);
984 case INDEX_FILE_OPTION
:
985 index_file_name
= optarg
;
988 case IGNORE_CASE_OPTION
:
989 exclude_options
|= FNM_CASEFOLD
;
992 case IGNORE_FAILED_READ_OPTION
:
993 ignore_failed_read_option
= true;
997 if (! (strlen (optarg
) < GNAME_FIELD_SIZE
998 && gname_to_gid (optarg
, &group_option
)))
1001 if (xstrtoumax (optarg
, 0, 10, &g
, "") == LONGINT_OK
1005 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (optarg
),
1006 _("%s: Invalid group")));
1012 = mode_compile (optarg
,
1013 MODE_MASK_EQUALS
| MODE_MASK_PLUS
| MODE_MASK_MINUS
);
1014 if (mode_option
== MODE_INVALID
)
1015 FATAL_ERROR ((0, 0, _("Invalid mode given on option")));
1016 if (mode_option
== MODE_MEMORY_EXHAUSTED
)
1020 case NO_ANCHORED_OPTION
:
1021 exclude_options
&= ~ EXCLUDE_ANCHORED
;
1024 case NO_IGNORE_CASE_OPTION
:
1025 exclude_options
&= ~ FNM_CASEFOLD
;
1028 case NO_OVERWRITE_DIR_OPTION
:
1029 old_files_option
= NO_OVERWRITE_DIR_OLD_FILES
;
1032 case NO_WILDCARDS_OPTION
:
1033 exclude_options
&= ~ EXCLUDE_WILDCARDS
;
1036 case NO_WILDCARDS_MATCH_SLASH_OPTION
:
1037 exclude_options
|= FNM_FILE_NAME
;
1041 filename_terminator
= '\0';
1044 case NUMERIC_OWNER_OPTION
:
1045 numeric_owner_option
= true;
1048 case OCCURRENCE_OPTION
:
1050 occurrence_option
= 1;
1054 if (xstrtoumax (optarg
, 0, 10, &u
, "") == LONGINT_OK
)
1055 occurrence_option
= u
;
1057 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (optarg
),
1058 _("Invalid number")));
1062 case OVERWRITE_OPTION
:
1063 old_files_option
= OVERWRITE_OLD_FILES
;
1067 if (! (strlen (optarg
) < UNAME_FIELD_SIZE
1068 && uname_to_uid (optarg
, &owner_option
)))
1071 if (xstrtoumax (optarg
, 0, 10, &u
, "") == LONGINT_OK
1075 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (optarg
),
1076 _("Invalid owner")));
1082 xheader_set_option (optarg
);
1086 set_archive_format ("posix");
1089 case PRESERVE_OPTION
:
1090 same_permissions_option
= true;
1091 same_order_option
= true;
1094 case RECORD_SIZE_OPTION
:
1097 if (! (xstrtoumax (optarg
, 0, 10, &u
, "") == LONGINT_OK
1098 && u
== (size_t) u
))
1099 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (optarg
),
1100 _("Invalid record size")));
1102 if (record_size
% BLOCKSIZE
!= 0)
1103 USAGE_ERROR ((0, 0, _("Record size must be a multiple of %d."),
1105 blocking_factor
= record_size
/ BLOCKSIZE
;
1109 case RECURSIVE_UNLINK_OPTION
:
1110 recursive_unlink_option
= true;
1113 case REMOVE_FILES_OPTION
:
1114 remove_files_option
= true;
1117 case RSH_COMMAND_OPTION
:
1118 rsh_command_option
= optarg
;
1121 case SHOW_DEFAULTS_OPTION
:
1122 printf ("--format=%s -f%s -b%d\n",
1123 archive_format_string (DEFAULT_ARCHIVE_FORMAT
),
1124 DEFAULT_ARCHIVE
, DEFAULT_BLOCKING
);
1127 case STRIP_PATH_OPTION
:
1130 if (! (xstrtoumax (optarg
, 0, 10, &u
, "") == LONGINT_OK
1131 && u
== (size_t) u
))
1132 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (optarg
),
1133 _("Invalid number of elements")));
1134 strip_path_elements
= u
;
1139 backup_option
= true;
1140 backup_suffix_string
= optarg
;
1144 totals_option
= true;
1147 case USE_COMPRESS_PROGRAM_OPTION
:
1148 set_use_compress_program_option (optarg
);
1151 case VOLNO_FILE_OPTION
:
1152 volno_file_option
= optarg
;
1155 case WILDCARDS_OPTION
:
1156 exclude_options
|= EXCLUDE_WILDCARDS
;
1159 case WILDCARDS_MATCH_SLASH_OPTION
:
1160 exclude_options
&= ~ FNM_FILE_NAME
;
1172 #ifdef DEVICE_PREFIX
1174 int device
= optchar
- '0';
1176 static char buf
[sizeof DEVICE_PREFIX
+ 10];
1179 density
= getopt_long (argc
, argv
, "lmh", 0, 0);
1180 strcpy (buf
, DEVICE_PREFIX
);
1181 cursor
= buf
+ strlen (buf
);
1183 #ifdef DENSITY_LETTER
1185 sprintf (cursor
, "%d%c", device
, density
);
1187 #else /* not DENSITY_LETTER */
1214 usage (TAREXIT_FAILURE
);
1216 sprintf (cursor
, "%d", device
);
1218 #endif /* not DENSITY_LETTER */
1220 if (archive_names
== allocated_archive_names
)
1222 allocated_archive_names
*= 2;
1223 archive_name_array
=
1224 xrealloc (archive_name_array
,
1225 sizeof (const char *) * allocated_archive_names
);
1227 archive_name_array
[archive_names
++] = strdup (buf
);
1231 #else /* not DEVICE_PREFIX */
1234 _("Options `-[0-7][lmh]' not supported by *this* tar")));
1236 #endif /* not DEVICE_PREFIX */
1239 /* Special handling for 'o' option:
1241 GNU tar used to say "output old format".
1242 UNIX98 tar says don't chown files after extracting (we use
1243 "--no-same-owner" for this).
1245 The old GNU tar semantics is retained when used with --create
1246 option, otherwise UNIX98 semantics is assumed */
1250 if (subcommand_option
== CREATE_SUBCOMMAND
)
1252 /* GNU Tar <= 1.13 compatibility */
1253 set_archive_format ("v7");
1257 /* UNIX98 compatibility */
1258 same_owner_option
= 1;
1262 /* Handle operands after any "--" argument. */
1263 for (; optind
< argc
; optind
++)
1265 name_add (argv
[optind
]);
1269 /* Process trivial options. */
1273 printf ("tar (%s) %s\n%s\n", PACKAGE_NAME
, PACKAGE_VERSION
,
1274 "Copyright (C) 2003 Free Software Foundation, Inc.");
1276 This program comes with NO WARRANTY, to the extent permitted by law.\n\
1277 You may redistribute it under the terms of the GNU General Public License;\n\
1278 see the file named COPYING for details."));
1280 puts (_("Written by John Gilmore and Jay Fenlason."));
1282 exit (TAREXIT_SUCCESS
);
1286 usage (TAREXIT_SUCCESS
);
1288 /* Derive option values and check option consistency. */
1290 if (archive_format
== DEFAULT_FORMAT
)
1293 archive_format
= POSIX_FORMAT
;
1295 archive_format
= DEFAULT_ARCHIVE_FORMAT
;
1298 if (volume_label_option
&& subcommand_option
== CREATE_SUBCOMMAND
)
1299 assert_format (FORMAT_MASK (OLDGNU_FORMAT
)
1300 | FORMAT_MASK (GNU_FORMAT
));
1302 if (incremental_option
|| multi_volume_option
)
1303 assert_format (FORMAT_MASK (OLDGNU_FORMAT
) | FORMAT_MASK (GNU_FORMAT
));
1306 assert_format (FORMAT_MASK (OLDGNU_FORMAT
)
1307 | FORMAT_MASK (GNU_FORMAT
)
1308 | FORMAT_MASK (POSIX_FORMAT
));
1310 if (occurrence_option
)
1312 if (!input_files
&& !files_from_option
)
1314 _("--occurrence is meaningless without a file list")));
1315 if (subcommand_option
!= DELETE_SUBCOMMAND
1316 && subcommand_option
!= DIFF_SUBCOMMAND
1317 && subcommand_option
!= EXTRACT_SUBCOMMAND
1318 && subcommand_option
!= LIST_SUBCOMMAND
)
1320 _("--occurrence cannot be used in the requested operation mode")));
1323 if (archive_names
== 0)
1325 /* If no archive file name given, try TAPE from the environment, or
1326 else, DEFAULT_ARCHIVE from the configuration process. */
1329 archive_name_array
[0] = getenv ("TAPE");
1330 if (! archive_name_array
[0])
1331 archive_name_array
[0] = DEFAULT_ARCHIVE
;
1334 /* Allow multiple archives only with `-M'. */
1336 if (archive_names
> 1 && !multi_volume_option
)
1338 _("Multiple archive files require `-M' option")));
1340 if (listed_incremental_option
1341 && newer_mtime_option
!= TYPE_MINIMUM (time_t))
1343 _("Cannot combine --listed-incremental with --newer")));
1345 if (volume_label_option
)
1347 size_t volume_label_max_len
=
1348 (sizeof current_header
->header
.name
1349 - 1 /* for trailing '\0' */
1350 - (multi_volume_option
1351 ? (sizeof " Volume "
1352 - 1 /* for null at end of " Volume " */
1353 + INT_STRLEN_BOUND (int) /* for volume number */
1354 - 1 /* for sign, as 0 <= volno */)
1356 if (volume_label_max_len
< strlen (volume_label_option
))
1358 ngettext ("%s: Volume label is too long (limit is %lu byte)",
1359 "%s: Volume label is too long (limit is %lu bytes)",
1360 volume_label_max_len
),
1361 quotearg_colon (volume_label_option
),
1362 (unsigned long) volume_label_max_len
));
1367 if (multi_volume_option
)
1368 USAGE_ERROR ((0, 0, _("Cannot verify multi-volume archives")));
1369 if (use_compress_program_option
)
1370 USAGE_ERROR ((0, 0, _("Cannot verify compressed archives")));
1373 if (use_compress_program_option
)
1375 if (multi_volume_option
)
1376 USAGE_ERROR ((0, 0, _("Cannot use multi-volume compressed archives")));
1377 if (subcommand_option
== UPDATE_SUBCOMMAND
)
1378 USAGE_ERROR ((0, 0, _("Cannot update compressed archives")));
1381 /* It is no harm to use --pax-option on non-pax archives in archive
1382 reading mode. It may even be useful, since it allows to override
1383 file attributes from tar headers. Therefore I allow such usage.
1386 && archive_format
!= POSIX_FORMAT
1387 && (subcommand_option
!= EXTRACT_SUBCOMMAND
1388 || subcommand_option
!= DIFF_SUBCOMMAND
1389 || subcommand_option
!= LIST_SUBCOMMAND
))
1390 USAGE_ERROR ((0, 0, _("--pax-option can be used only on POSIX archives")));
1392 /* If ready to unlink hierarchies, so we are for simpler files. */
1393 if (recursive_unlink_option
)
1394 old_files_option
= UNLINK_FIRST_OLD_FILES
;
1396 /* Forbid using -c with no input files whatsoever. Check that `-f -',
1397 explicit or implied, is used correctly. */
1399 switch (subcommand_option
)
1401 case CREATE_SUBCOMMAND
:
1402 if (input_files
== 0 && !files_from_option
)
1404 _("Cowardly refusing to create an empty archive")));
1407 case EXTRACT_SUBCOMMAND
:
1408 case LIST_SUBCOMMAND
:
1409 case DIFF_SUBCOMMAND
:
1410 for (archive_name_cursor
= archive_name_array
;
1411 archive_name_cursor
< archive_name_array
+ archive_names
;
1412 archive_name_cursor
++)
1413 if (!strcmp (*archive_name_cursor
, "-"))
1414 request_stdin ("-f");
1417 case CAT_SUBCOMMAND
:
1418 case UPDATE_SUBCOMMAND
:
1419 case APPEND_SUBCOMMAND
:
1420 for (archive_name_cursor
= archive_name_array
;
1421 archive_name_cursor
< archive_name_array
+ archive_names
;
1422 archive_name_cursor
++)
1423 if (!strcmp (*archive_name_cursor
, "-"))
1425 _("Options `-Aru' are incompatible with `-f -'")));
1431 archive_name_cursor
= archive_name_array
;
1433 /* Prepare for generating backup names. */
1435 if (backup_suffix_string
)
1436 simple_backup_suffix
= xstrdup (backup_suffix_string
);
1439 backup_type
= xget_version ("--backup", version_control_string
);
1441 if (verbose_option
&& textual_date_option
)
1443 char const *treated_as
= tartime (newer_mtime_option
);
1444 if (strcmp (textual_date_option
, treated_as
) != 0)
1445 WARN ((0, 0, _("Treating date `%s' as %s"),
1446 textual_date_option
, treated_as
));
1453 /* Main routine for tar. */
1455 main (int argc
, char **argv
)
1457 #if HAVE_CLOCK_GETTIME
1458 if (clock_gettime (CLOCK_REALTIME
, &start_timespec
) != 0)
1460 start_time
= time (0);
1461 program_name
= argv
[0];
1462 setlocale (LC_ALL
, "");
1463 bindtextdomain (PACKAGE
, LOCALEDIR
);
1464 textdomain (PACKAGE
);
1466 exit_status
= TAREXIT_SUCCESS
;
1467 filename_terminator
= '\n';
1468 set_quoting_style (0, escape_quoting_style
);
1470 /* Pre-allocate a few structures. */
1472 allocated_archive_names
= 10;
1473 archive_name_array
=
1474 xmalloc (sizeof (const char *) * allocated_archive_names
);
1478 /* System V fork+wait does not work if SIGCHLD is ignored. */
1479 signal (SIGCHLD
, SIG_DFL
);
1484 /* Decode options. */
1486 decode_options (argc
, argv
);
1487 name_init (argc
, argv
);
1489 /* Main command execution. */
1491 if (volno_file_option
)
1492 init_volume_number ();
1494 switch (subcommand_option
)
1496 case UNKNOWN_SUBCOMMAND
:
1498 _("You must specify one of the `-Acdtrux' options")));
1500 case CAT_SUBCOMMAND
:
1501 case UPDATE_SUBCOMMAND
:
1502 case APPEND_SUBCOMMAND
:
1506 case DELETE_SUBCOMMAND
:
1507 delete_archive_members ();
1510 case CREATE_SUBCOMMAND
:
1515 print_total_written ();
1518 case EXTRACT_SUBCOMMAND
:
1520 read_and (extract_archive
);
1522 /* FIXME: should extract_finish () even if an ordinary signal is
1528 case LIST_SUBCOMMAND
:
1529 read_and (list_archive
);
1532 case DIFF_SUBCOMMAND
:
1534 read_and (diff_archive
);
1538 if (check_links_option
)
1541 if (volno_file_option
)
1542 closeout_volume_number ();
1544 /* Dispose of allocated memory, and return. */
1546 free (archive_name_array
);
1549 if (stdlis
!= stderr
&& (ferror (stdlis
) || fclose (stdlis
) != 0))
1550 FATAL_ERROR ((0, 0, _("Error in writing to standard output")));
1551 if (exit_status
== TAREXIT_FAILURE
)
1552 error (0, 0, _("Error exit delayed from previous errors"));
1553 if (ferror (stderr
) || fclose (stderr
) != 0)
1554 exit_status
= TAREXIT_FAILURE
;
1559 tar_stat_init (struct tar_stat_info
*st
)
1561 memset (st
, 0, sizeof (*st
));
1565 tar_stat_destroy (struct tar_stat_info
*st
)
1567 free (st
->orig_file_name
);
1568 free (st
->file_name
);
1569 free (st
->link_name
);
1572 free (st
->sparse_map
);
1573 memset (st
, 0, sizeof (*st
));