1 /* A tar (tape archiver) program.
3 Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000,
4 2001, 2003, 2004 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>
46 /* Local declarations. */
48 #ifndef DEFAULT_ARCHIVE_FORMAT
49 # define DEFAULT_ARCHIVE_FORMAT GNU_FORMAT
52 #ifndef DEFAULT_ARCHIVE
53 # define DEFAULT_ARCHIVE "tar.out"
56 #ifndef DEFAULT_BLOCKING
57 # define DEFAULT_BLOCKING 20
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
},
132 { "pax", POSIX_FORMAT
}, /* An alias for posix */
137 set_archive_format (char const *name
)
139 struct fmttab
const *p
;
141 for (p
= fmttab
; strcmp (p
->name
, name
) != 0; )
143 USAGE_ERROR ((0, 0, _("%s: Invalid archive format"),
144 quotearg_colon (name
)));
146 archive_format
= p
->fmt
;
150 archive_format_string (enum archive_format fmt
)
152 struct fmttab
const *p
;
154 for (p
= fmttab
; p
->name
; p
++)
160 #define FORMAT_MASK(n) (1<<(n))
163 assert_format(unsigned fmt_mask
)
165 if ((FORMAT_MASK(archive_format
) & fmt_mask
) == 0)
167 _("GNU features wanted on incompatible archive format")));
174 /* For long options that unconditionally set a single flag, we have getopt
175 do it. For the others, we share the code for the equivalent short
176 named option, the name of which is stored in the otherwise-unused `val'
177 field of the `struct option'; for long options that have no equivalent
178 short option, we use non-characters as pseudo short options,
179 starting at CHAR_MAX + 1 and going upwards. */
183 ANCHORED_OPTION
= CHAR_MAX
+ 1,
184 ATIME_PRESERVE_OPTION
,
190 EXCLUDE_CACHES_OPTION
,
195 IGNORE_FAILED_READ_OPTION
,
197 KEEP_NEWER_FILES_OPTION
,
202 NO_IGNORE_CASE_OPTION
,
203 NO_OVERWRITE_DIR_OPTION
,
205 NO_SAME_OWNER_OPTION
,
206 NO_SAME_PERMISSIONS_OPTION
,
209 NO_WILDCARDS_MATCH_SLASH_OPTION
,
211 NUMERIC_OWNER_OPTION
,
214 ONE_FILE_SYSTEM_OPTION
,
222 RECURSIVE_UNLINK_OPTION
,
227 SHOW_DEFAULTS_OPTION
,
228 SHOW_OMITTED_DIRS_OPTION
,
229 STRIP_COMPONENTS_OPTION
,
234 USE_COMPRESS_PROGRAM_OPTION
,
239 WILDCARDS_MATCH_SLASH_OPTION
242 const char *argp_program_version
= "tar (" PACKAGE_NAME
") " VERSION
;
243 const char *argp_program_bug_address
= "<" PACKAGE_BUGREPORT
">";
244 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\
247 tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.\n\
248 tar -tvf archive.tar # List all files in archive.tar verbosely.\n\
249 tar -xf archive.tar # Extract all files from archive.tar.\n\
250 \vThe backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
251 The version control may be set with --backup or VERSION_CONTROL, values are:\n\n\
252 t, numbered make numbered backups\n\
253 nil, existing numbered if numbered backups exist, simple otherwise\n\
254 never, simple always make simple backups\n");
259 Available option letters are DEIJQY and aeqy. Consider the following
262 [For Solaris tar compatibility]
263 e exit immediately with a nonzero exit status if unexpected errors occur
264 E use extended headers (--format=posix)
265 [q alias for --occurrence=1 =/= this would better be used for quiet?]
266 [I same as T =/= will harm star compatibility]
268 y per-file gzip compression
269 Y per-block gzip compression */
271 static struct argp_option options
[] = {
273 N_("Main operation mode:"), 0},
276 N_("list the contents of an archive"), 10 },
277 {"extract", 'x', 0, 0,
278 N_("extract files from an archive"), 10 },
279 {"get", 0, 0, OPTION_ALIAS
, NULL
, 0 },
280 {"create", 'c', 0, 0,
281 N_("create a new archive"), 10 },
283 N_("find differences between archive and file system"), 10 },
284 {"compare", 0, 0, OPTION_ALIAS
, NULL
, 10},
285 {"append", 'r', 0, 0,
286 N_("append files to the end of an archive"), 10 },
287 {"update", 'u', 0, 0,
288 N_("only append files newer than copy in archive"), 10 },
289 {"catenate", 'A', 0, 0,
290 N_("append tar files to an archive"), 10 },
291 {"concatenate", 0, 0, OPTION_ALIAS
, NULL
, 10},
292 {"delete", DELETE_OPTION
, 0, 0,
293 N_("delete from the archive (not on mag tapes!)"), 10 },
296 N_("Operation modifiers:"), 20},
298 {"verify", 'W', 0, 0,
299 N_("attempt to verify the archive after writing it"), 21 },
300 {"remove-files", REMOVE_FILES_OPTION
, 0, 0,
301 N_("remove files after adding them to the archive"), 21 },
302 {"keep-old-files", 'k', 0, 0,
303 N_("don't replace existing files when extracting"), 21 },
304 {"keep-newer-files", KEEP_NEWER_FILES_OPTION
, 0, 0,
305 N_("don't replace existing files that are newer than their archive copies"), 21 },
306 {"no-overwrite-dir", NO_OVERWRITE_DIR_OPTION
, 0, 0,
307 N_("preserve metadata of existing directories"), 21 },
308 {"overwrite", OVERWRITE_OPTION
, 0, 0,
309 N_("overwrite existing files when extracting"), 21 },
310 {"unlink-first", 'U', 0, 0,
311 N_("remove each file prior to extracting over it"), 21 },
312 {"recursive-unlink", RECURSIVE_UNLINK_OPTION
, 0, 0,
313 N_("empty hierarchies prior to extracting directory"), 21 },
314 {"sparse", 'S', 0, 0,
315 N_("handle sparse files efficiently"), 21 },
316 {"to-stdout", 'O', 0, 0,
317 N_("extract files to standard output"), 21 },
318 {"incremental", 'G', 0, 0,
319 N_("handle old GNU-format incremental backup"), 21 },
320 {"listed-incremental", 'g', N_("FILE"), 0,
321 N_("handle new GNU-format incremental backup"), 21 },
322 {"ignore-failed-read", IGNORE_FAILED_READ_OPTION
, 0, 0,
323 N_("do not exit with nonzero on unreadable files"), 21 },
324 {"occurrence", OCCURRENCE_OPTION
, N_("NUMBER"), OPTION_ARG_OPTIONAL
,
325 N_("process only the NUMBERth occurrence of each file in the archive. This option is valid only in conjunction with one of the subcommands --delete, --diff, --extract or --list and when a list of files is given either on the command line or via -T option. NUMBER defaults to 1."), 21 },
326 {"seek", 'n', NULL
, 0,
327 N_("Archive is seekable"), 21 },
330 N_("Handling of file attributes:"), 30 },
332 {"owner", OWNER_OPTION
, N_("NAME"), 0,
333 N_("force NAME as owner for added files"), 31 },
334 {"group", GROUP_OPTION
, N_("NAME"), 0,
335 N_("force NAME as group for added files"), 31 },
336 {"mode", MODE_OPTION
, N_("CHANGES"), 0,
337 N_("force (symbolic) mode CHANGES for added files"), 31 },
338 {"atime-preserve", ATIME_PRESERVE_OPTION
, 0, 0,
339 N_("don't change access times on dumped files"), 31 },
341 N_("don't extract file modified time"), 31 },
342 {"same-owner", SAME_OWNER_OPTION
, 0, 0,
343 N_("try extracting files with the same ownership"), 31 },
344 {"no-same-owner", NO_SAME_OWNER_OPTION
, 0, 0,
345 N_("extract files as yourself"), 31 },
346 {"numeric-owner", NUMERIC_OWNER_OPTION
, 0, 0,
347 N_("always use numbers for user/group names"), 31 },
348 {"preserve-permissions", 'p', 0, 0,
349 N_("extract information about file permissions (default for superuser)"), 31 },
350 {"same-permissions", 0, 0, OPTION_ALIAS
, NULL
, 31 },
351 {"no-same-permissions", NO_SAME_PERMISSIONS_OPTION
, 0, 0,
352 N_("apply the user's umask when extracting permissions from the archive (default for ordinary users)"), 31 },
353 {"preserve-order", 's', 0, 0,
354 N_("sort names to extract to match archive"), 31 },
355 {"same-order", 0, 0, OPTION_ALIAS
, NULL
, 31 },
356 {"preserve", PRESERVE_OPTION
, 0, 0,
357 N_("same as both -p and -s"), 31 },
360 N_("Device selection and switching:"), 40 },
362 {"file", 'f', N_("ARCHIVE"), 0,
363 N_("use archive file or device ARCHIVE"), 41 },
364 {"force-local", FORCE_LOCAL_OPTION
, 0, 0,
365 N_("archive file is local even if has a colon"), 41 },
366 {"rmt-command", RMT_COMMAND_OPTION
, N_("COMMAND"), 0,
367 N_("use given rmt COMMAND instead of rmt"), 41 },
368 {"rsh-command", RSH_COMMAND_OPTION
, N_("COMMAND"), 0,
369 N_("use remote COMMAND instead of rsh"), 41 },
371 {"-[0-7][lmh]", 0, NULL
, OPTION_DOC
, /* It is OK, since `name' will never be
373 N_("specify drive and density"), 41 },
375 {NULL
, '0', NULL
, OPTION_HIDDEN
, NULL
, 41 },
376 {NULL
, '1', NULL
, OPTION_HIDDEN
, NULL
, 41 },
377 {NULL
, '2', NULL
, OPTION_HIDDEN
, NULL
, 41 },
378 {NULL
, '3', NULL
, OPTION_HIDDEN
, NULL
, 41 },
379 {NULL
, '4', NULL
, OPTION_HIDDEN
, NULL
, 41 },
380 {NULL
, '5', NULL
, OPTION_HIDDEN
, NULL
, 41 },
381 {NULL
, '6', NULL
, OPTION_HIDDEN
, NULL
, 41 },
382 {NULL
, '7', NULL
, OPTION_HIDDEN
, NULL
, 41 },
383 {NULL
, '8', NULL
, OPTION_HIDDEN
, NULL
, 41 },
384 {NULL
, '9', NULL
, OPTION_HIDDEN
, NULL
, 41 },
386 {"multi-volume", 'M', 0, 0,
387 N_("create/list/extract multi-volume archive"), 41 },
388 {"tape-length", 'L', N_("NUMBER"), 0,
389 N_("change tape after writing NUMBER x 1024 bytes"), 41 },
390 {"info-script", 'F', N_("NAME"), 0,
391 N_("run script at end of each tape (implies -M)"), 41 },
392 {"new-volume-script", 0, 0, OPTION_ALIAS
, NULL
, 41 },
393 {"volno-file", VOLNO_FILE_OPTION
, N_("FILE"), 0,
394 N_("use/update the volume number in FILE"), 41 },
397 N_("Device blocking:"), 50 },
399 {"blocking-factor", 'b', N_("BLOCKS"), 0,
400 N_("BLOCKS x 512 bytes per record"), 51 },
401 {"record-size", RECORD_SIZE_OPTION
, N_("NUMBER"), 0,
402 N_("SIZE bytes per record, multiple of 512"), 51 },
403 {"ignore-zeros", 'i', 0, 0,
404 N_("ignore zeroed blocks in archive (means EOF)"), 51 },
405 {"read-full-records", 'B', 0, 0,
406 N_("reblock as we read (for 4.2BSD pipes)"), 51 },
409 N_("Archive format selection:"), 60 },
411 {"format", 'H', N_("FORMAT"), 0,
412 N_("create archive of the given format."), 61 },
414 {NULL
, 0, NULL
, 0, N_("FORMAT is one of the following:"), 62 },
415 {" v7", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("old V7 tar format"), 63},
416 {" oldgnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
417 N_("GNU format as per tar <= 1.12"), 63},
418 {" gnu", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
419 N_("GNU tar 1.13.x format"), 63},
420 {" ustar", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
421 N_("POSIX 1003.1-1988 (ustar) format"), 63 },
422 {" pax", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
,
423 N_("POSIX 1003.1-2001 (pax) format"), 63 },
424 {" posix", 0, NULL
, OPTION_DOC
|OPTION_NO_TRANS
, N_("Same as pax"), 63 },
426 {"old-archive", OLD_ARCHIVE_OPTION
, 0, 0, /* FIXME */
427 N_("same as --format=v7"), 68 },
428 {"portability", 0, 0, OPTION_ALIAS
, NULL
, 68 },
429 {"posix", POSIX_OPTION
, 0, 0,
430 N_("same as --format=posix"), 68 },
431 {"pax-option", PAX_OPTION
, N_("keyword[[:]=value][,keyword[[:]=value], ...]"), 0,
432 N_("control pax keywords"), 68 },
433 {"label", 'V', N_("TEXT"), 0,
434 N_("create archive with volume name NAME. At list/extract time, use TEXT as a globbing pattern"), 68 },
436 N_("filter the archive through bzip2"), 68 },
438 N_("filter the archive through gzip"), 68 },
439 {"gunzip", 0, 0, OPTION_ALIAS
, NULL
, 68 },
440 {"ungzip", 0, 0, OPTION_ALIAS
, NULL
, 68 },
441 {"compress", 'Z', 0, 0,
442 N_("filter the archive through compress"), 68 },
443 {"uncompress", 0, 0, OPTION_ALIAS
, NULL
, 68 },
444 {"use-compress-program", USE_COMPRESS_PROGRAM_OPTION
, N_("PROG"), 0,
445 N_("filter through PROG (must accept -d)"), 68 },
448 N_("Local file selection:"), 70 },
450 {"add-file", ARGP_KEY_ARG
, N_("FILE"), 0,
451 N_("add given file to the archive (useful if FILE name starts with a dash)"), 71},
452 {"directory", 'C', N_("DIR"), 0,
453 N_("change to directory DIR"), 71 },
454 {"files-from", 'T', N_("FILE-OF-NAMES"), 0,
455 N_("get names to extract or create from file NAME"), 71 },
456 {"null", NULL_OPTION
, 0, 0,
457 N_("-T reads null-terminated names, disable -C"), 71 },
458 {"unquote", UNQUOTE_OPTION
, 0, 0,
459 N_("Unquote filenames read with -T (default)"), 71 },
460 {"no-unquote", NO_UNQUOTE_OPTION
, 0, 0,
461 N_("Do not unquote filenames read with -T"), 71 },
462 {"exclude", EXCLUDE_OPTION
, N_("PATTERN"), 0,
463 N_("exclude files, given as a PATTERN"), 71 },
464 {"exclude-from", 'X', N_("FILE"), 0,
465 N_("exclude patterns listed in FILE"), 71 },
466 {"exclude-caches", EXCLUDE_CACHES_OPTION
, 0, 0,
467 N_("exclude directories containing a cache tag"), 71 },
468 {"ignore-case", IGNORE_CASE_OPTION
, 0, 0,
469 N_("exclusion ignores case"), 71 },
470 {"anchored", ANCHORED_OPTION
, 0, 0,
471 N_("exclude patterns match file name start"), 71 },
472 {"no-anchored", NO_ANCHORED_OPTION
, 0, 0,
473 N_("exclude patterns match after any / (default)"), 71 },
474 {"no-ignore-case", NO_IGNORE_CASE_OPTION
, 0, 0,
475 N_("exclusion is case sensitive (default)"), 71 },
476 {"no-wildcards", NO_WILDCARDS_OPTION
, 0, 0,
477 N_("exclude patterns are plain strings"), 71 },
478 {"no-wildcards-match-slash", NO_WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
479 N_("exclude pattern wildcards do not match '/'"), 71 },
480 {"no-recursion", NO_RECURSION_OPTION
, 0, 0,
481 N_("avoid descending automatically in directories"), 71 },
482 {"one-file-system", ONE_FILE_SYSTEM_OPTION
, 0, 0,
483 N_("stay in local file system when creating archive"), 71 },
484 {NULL
, 'l', 0, OPTION_HIDDEN
, "", 71},
485 {"recursion", RECURSION_OPTION
, 0, 0,
486 N_("recurse into directories (default)"), 71 },
487 {"absolute-names", 'P', 0, 0,
488 N_("don't strip leading `/'s from file names"), 71 },
489 {"dereference", 'h', 0, 0,
490 N_("dump instead the files symlinks point to"), 71 },
491 {"starting-file", 'K', N_("MEMBER-NAME"), 0,
492 N_("begin at member MEMBER-NAME in the archive"), 71 },
493 {"strip-components", STRIP_COMPONENTS_OPTION
, N_("NUMBER"), 0,
494 N_("strip NUMBER leading components from file names"), 71 },
495 {"newer", 'N', N_("DATE-OR-FILE"), 0,
496 N_("only store files newer than DATE-OR-FILE"), 71 },
497 {"newer-mtime", NEWER_MTIME_OPTION
, N_("DATE"), 0,
498 N_("compare date and time when data changed only"), 71 },
499 {"after-date", 'N', N_("DATE"), 0,
500 N_("same as -N"), 71 },
501 {"backup", BACKUP_OPTION
, N_("CONTROL"), OPTION_ARG_OPTIONAL
,
502 N_("backup before removal, choose version CONTROL"), 71 },
503 {"suffix", SUFFIX_OPTION
, N_("STRING"), 0,
504 N_("backup before removal, override usual suffix ('~' unless overridden by environment variable SIMPLE_BACKUP_SUFFIX"), 71 },
505 {"wildcards", WILDCARDS_OPTION
, 0, 0,
506 N_("exclude patterns use wildcards (default)"), 71 },
507 {"wildcards-match-slash", WILDCARDS_MATCH_SLASH_OPTION
, 0, 0,
508 N_("exclude pattern wildcards match '/' (default)"), 71 },
511 N_("Informative output:"), 80 },
513 {"verbose", 'v', 0, 0,
514 N_("verbosely list files processed"), 81 },
515 {"checkpoint", CHECKPOINT_OPTION
, 0, 0,
516 N_("display progress messages every 10th record"), 81 },
517 {"check-links", CHECK_LINKS_OPTION
, 0, 0,
518 N_("print a message if not all links are dumped"), 82 },
519 {"totals", TOTALS_OPTION
, 0, 0,
520 N_("print total bytes written while creating archive"), 82 },
521 {"utc", UTC_OPTION
, 0, 0,
522 N_("print file modification dates in UTC"), 82 },
523 {"index-file", INDEX_FILE_OPTION
, N_("FILE"), 0,
524 N_("send verbose output to FILE"), 82 },
525 {"block-number", 'R', 0, 0,
526 N_("show block number within archive with each message"), 82 },
527 {"interactive", 'w', 0, 0,
528 N_("ask for confirmation for every action"), 82 },
529 {"confirmation", 0, 0, OPTION_ALIAS
, NULL
, 82 },
530 {"show-defaults", SHOW_DEFAULTS_OPTION
, 0, 0,
531 N_("Show tar defaults"), 82 },
532 {"show-omitted-dirs", SHOW_OMITTED_DIRS_OPTION
, 0, 0,
533 N_("When listing or extracting, list each directory that does not match search criteria"), 82 },
536 N_("Compatibility options:"), 90 },
539 N_("when creating, same as --old-archive. When extracting, same as --no-same-owner"), 91 },
542 N_("Other options:"), 100 },
544 {"help", '?', 0, 0, N_("Give this help list"), -1},
545 {"usage", USAGE_OPTION
, 0, 0, N_("Give a short usage message"), -1},
546 {"license", LICENSE_OPTION
, 0, 0, N_("Print license and exit"), -1},
547 {"version", VERSION_OPTION
, 0, 0, N_("Print program version"), -1},
548 /* FIXME -V (--label) conflicts with the default short option for
550 {"HANG", HANG_OPTION
, "SECS", OPTION_ARG_OPTIONAL
| OPTION_HIDDEN
,
551 N_("Hang for SECS seconds (default 3600)"), 0},
556 char const *textual_date_option
;
560 char const *backup_suffix_string
;
561 char const *version_control_string
;
566 show_default_settings (FILE *stream
)
569 "--format=%s -f%s -b%d --rmt-command=%s",
570 archive_format_string (DEFAULT_ARCHIVE_FORMAT
),
571 DEFAULT_ARCHIVE
, DEFAULT_BLOCKING
,
572 DEFAULT_RMT_COMMAND
);
574 fprintf (stream
, " --rsh-command=%s", REMOTE_SHELL
);
576 fprintf (stream
, "\n");
580 set_subcommand_option (enum subcommand subcommand
)
582 if (subcommand_option
!= UNKNOWN_SUBCOMMAND
583 && subcommand_option
!= subcommand
)
585 _("You may not specify more than one `-Acdtrux' option")));
587 subcommand_option
= subcommand
;
591 set_use_compress_program_option (const char *string
)
593 if (use_compress_program_option
594 && strcmp (use_compress_program_option
, string
) != 0)
595 USAGE_ERROR ((0, 0, _("Conflicting compression options")));
597 use_compress_program_option
= string
;
603 printf ("tar (%s) %s\n%s\n", PACKAGE_NAME
, PACKAGE_VERSION
,
604 "Copyright (C) 2004 Free Software Foundation, Inc.\n");
605 puts (_("Based on the work of John Gilmore and Jay Fenlason. See AUTHORS\n\
606 for complete list of authors.\n"));
607 printf (_(" GNU tar is free software; you can redistribute it and/or modify\n"
608 " it under the terms of the GNU General Public License as published by\n"
609 " the Free Software Foundation; either version 2 of the License, or\n"
610 " (at your option) any later version.\n"
612 " GNU tar is distributed in the hope that it will be useful,\n"
613 " but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
614 " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
615 " GNU General Public License for more details.\n"
617 " You should have received a copy of the GNU General Public License\n"
618 " along with GNU tar; if not, write to the Free Software\n"
619 " Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n\n"));
623 static volatile int _argp_hang
;
626 read_name_from_file (FILE *fp
, struct obstack
*stk
)
631 for (c
= getc (fp
); c
!= EOF
&& c
!= filename_terminator
; c
= getc (fp
))
634 FATAL_ERROR((0, 0, N_("file name contains null character")));
635 obstack_1grow (stk
, c
);
639 obstack_1grow (stk
, 0);
641 return !(counter
== 0 && c
== EOF
);
645 static bool files_from_option
; /* When set, tar will not refuse to create
647 static struct obstack argv_stk
; /* Storage for additional command line options
648 read using -T option */
650 /* Prevent recursive inclusion of the same file */
653 struct file_id_list
*next
;
658 static struct file_id_list
*file_id_list
;
661 add_file_id (const char *filename
)
663 struct file_id_list
*p
;
666 if (stat (filename
, &st
))
667 stat_fatal (filename
);
668 for (p
= file_id_list
; p
; p
= p
->next
)
669 if (p
->ino
== st
.st_ino
&& p
->dev
== st
.st_dev
)
671 FATAL_ERROR ((0, 0, _("%s: file list already read"),
672 quotearg_colon (filename
)));
674 p
= xmalloc (sizeof *p
);
675 p
->next
= file_id_list
;
682 update_argv (const char *filename
, struct argp_state
*state
)
689 bool is_stdin
= false;
691 if (!strcmp (filename
, "-"))
694 request_stdin ("-T");
699 add_file_id (filename
);
700 if ((fp
= fopen (filename
, "r")) == NULL
)
701 open_fatal (filename
);
704 while (read_name_from_file (fp
, &argv_stk
))
713 start
= obstack_finish (&argv_stk
);
715 if (filename_terminator
== 0)
716 for (p
= start
; *p
; p
+= strlen (p
) + 1)
720 new_argc
= state
->argc
+ count
;
721 new_argv
= xmalloc (sizeof (state
->argv
[0]) * (new_argc
+ 1));
722 memcpy (new_argv
, state
->argv
, sizeof (state
->argv
[0]) * (state
->argc
+ 1));
723 state
->argv
= new_argv
;
724 memmove (&state
->argv
[state
->next
+ count
], &state
->argv
[state
->next
],
725 (state
->argc
- state
->next
+ 1) * sizeof (state
->argv
[0]));
727 state
->argc
= new_argc
;
729 for (i
= state
->next
, p
= start
; *p
; p
+= strlen (p
) + 1, i
++)
731 if (filename_terminator
== 0 && p
[0] == '-')
732 state
->argv
[i
++] = "--add-file";
739 parse_opt (int key
, char *arg
, struct argp_state
*state
)
741 struct tar_args
*args
= state
->input
;
746 /* File name or non-parsed option, because of ARGP_IN_ORDER */
752 set_subcommand_option (CAT_SUBCOMMAND
);
758 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
759 && u
== (blocking_factor
= u
)
760 && 0 < blocking_factor
761 && u
== (record_size
= u
* BLOCKSIZE
) / BLOCKSIZE
))
762 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
763 _("Invalid blocking factor")));
768 /* Try to reblock input records. For reading 4.2BSD pipes. */
770 /* It would surely make sense to exchange -B and -R, but it seems
771 that -B has been used for a long while in Sun tar and most
772 BSD-derived systems. This is a consequence of the block/record
773 terminology confusion. */
775 read_full_records_option
= true;
779 set_subcommand_option (CREATE_SUBCOMMAND
);
788 set_subcommand_option (DIFF_SUBCOMMAND
);
792 if (archive_names
== allocated_archive_names
)
794 allocated_archive_names
*= 2;
796 xrealloc (archive_name_array
,
797 sizeof (const char *) * allocated_archive_names
);
799 archive_name_array
[archive_names
++] = arg
;
803 /* Since -F is only useful with -M, make it implied. Run this
804 script at the end of each tape. */
806 info_script_option
= arg
;
807 multi_volume_option
= true;
811 listed_incremental_option
= arg
;
812 after_date_option
= true;
816 /* We are making an incremental dump (FIXME: are we?); save
817 directories at the beginning of the archive, and include in each
818 directory its contents. */
820 incremental_option
= true;
824 /* Follow symbolic links. */
825 dereference_option
= true;
829 /* Ignore zero blocks (eofs). This can't be the default,
830 because Unix tar writes two blocks of zeros, then pads out
831 the record with garbage. */
833 ignore_zeros_option
= true;
838 _("Warning: the -I option is not supported;"
839 " perhaps you meant -j or -T?")));
843 set_use_compress_program_option ("bzip2");
847 /* Don't replace existing files. */
848 old_files_option
= KEEP_OLD_FILES
;
852 starting_file_option
= true;
857 /* Historically equivalent to --one-file-system. This usage is
858 incompatible with UNIX98 and POSIX specs and therefore is
859 deprecated. The semantics of -l option will be changed in
860 future versions. See TODO.
863 _("Semantics of -l option will change in the future releases.")));
865 _("Please use --one-file-system option instead.")));
867 case ONE_FILE_SYSTEM_OPTION
:
868 /* When dumping directories, don't dump files/subdirectories
869 that are on other filesystems. */
870 one_file_system_option
= true;
876 if (xstrtoumax (arg
, 0, 10, &u
, "") != LONGINT_OK
)
877 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
878 _("Invalid tape length")));
879 tape_length_option
= 1024 * (tarlong
) u
;
880 multi_volume_option
= true;
889 /* Make multivolume archive: when we can't write any more into
890 the archive, re-open it, and continue writing. */
892 multi_volume_option
= true;
896 seekable_archive
= true;
901 after_date_option
= true;
904 case NEWER_MTIME_OPTION
:
905 if (NEWER_OPTION_INITIALIZED (newer_mtime_option
))
906 USAGE_ERROR ((0, 0, _("More than one threshold date")));
908 if (FILE_SYSTEM_PREFIX_LEN (arg
) != 0
913 if (deref_stat (dereference_option
, arg
, &st
) != 0)
916 USAGE_ERROR ((0, 0, _("Date file not found")));
918 newer_mtime_option
.tv_sec
= st
.st_mtime
;
919 newer_mtime_option
.tv_nsec
= TIMESPEC_NS (st
.st_mtim
);
923 if (! get_date (&newer_mtime_option
, arg
, NULL
))
925 WARN ((0, 0, _("Substituting %s for unknown date format %s"),
926 tartime (newer_mtime_option
.tv_sec
), quote (arg
)));
927 newer_mtime_option
.tv_nsec
= 0;
930 args
->textual_date_option
= arg
;
934 #endif /* not MSDOS */
937 args
->o_option
= true;
941 to_stdout_option
= true;
945 same_permissions_option
= true;
949 absolute_names_option
= true;
953 set_subcommand_option (APPEND_SUBCOMMAND
);
957 /* Print block numbers for debugging bad tar archives. */
959 /* It would surely make sense to exchange -B and -R, but it seems
960 that -B has been used for a long while in Sun tar ans most
961 BSD-derived systems. This is a consequence of the block/record
962 terminology confusion. */
964 block_number_option
= true;
968 /* Names to extr are sorted. */
970 same_order_option
= true;
974 sparse_option
= true;
978 set_subcommand_option (LIST_SUBCOMMAND
);
983 update_argv (arg
, state
);
984 /* Indicate we've been given -T option. This is for backward
985 compatibility only, so that `tar cfT archive /dev/null will
987 files_from_option
= true;
991 set_subcommand_option (UPDATE_SUBCOMMAND
);
995 old_files_option
= UNLINK_FIRST_OLD_FILES
;
1007 volume_label_option
= arg
;
1011 interactive_option
= true;
1015 verify_option
= true;
1019 set_subcommand_option (EXTRACT_SUBCOMMAND
);
1023 if (add_exclude_file (add_exclude
, excluded
, arg
,
1024 args
->exclude_options
| recursion_option
, '\n')
1028 FATAL_ERROR ((0, e
, "%s", quotearg_colon (arg
)));
1034 _("Warning: the -y option is not supported;"
1035 " perhaps you meant -j?")));
1039 set_use_compress_program_option ("gzip");
1043 set_use_compress_program_option ("compress");
1046 case ANCHORED_OPTION
:
1047 args
->exclude_options
|= EXCLUDE_ANCHORED
;
1050 case ATIME_PRESERVE_OPTION
:
1051 atime_preserve_option
= true;
1054 case CHECKPOINT_OPTION
:
1055 checkpoint_option
= true;
1059 backup_option
= true;
1061 args
->version_control_string
= arg
;
1065 set_subcommand_option (DELETE_SUBCOMMAND
);
1068 case EXCLUDE_OPTION
:
1069 add_exclude (excluded
, arg
, args
->exclude_options
| recursion_option
);
1072 case EXCLUDE_CACHES_OPTION
:
1073 exclude_caches_option
= true;
1076 case FORCE_LOCAL_OPTION
:
1077 force_local_option
= true;
1081 set_archive_format (arg
);
1084 case INDEX_FILE_OPTION
:
1085 index_file_name
= arg
;
1088 case IGNORE_CASE_OPTION
:
1089 args
->exclude_options
|= FNM_CASEFOLD
;
1092 case IGNORE_FAILED_READ_OPTION
:
1093 ignore_failed_read_option
= true;
1096 case KEEP_NEWER_FILES_OPTION
:
1097 old_files_option
= KEEP_NEWER_FILES
;
1101 if (! (strlen (arg
) < GNAME_FIELD_SIZE
1102 && gname_to_gid (arg
, &group_option
)))
1105 if (xstrtoumax (arg
, 0, 10, &g
, "") == LONGINT_OK
1109 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1110 _("%s: Invalid group")));
1116 = mode_compile (arg
,
1117 MODE_MASK_EQUALS
| MODE_MASK_PLUS
| MODE_MASK_MINUS
);
1118 if (mode_option
== MODE_INVALID
)
1119 FATAL_ERROR ((0, 0, _("Invalid mode given on option")));
1120 if (mode_option
== MODE_MEMORY_EXHAUSTED
)
1124 case NO_ANCHORED_OPTION
:
1125 args
->exclude_options
&= ~ EXCLUDE_ANCHORED
;
1128 case NO_IGNORE_CASE_OPTION
:
1129 args
->exclude_options
&= ~ FNM_CASEFOLD
;
1132 case NO_OVERWRITE_DIR_OPTION
:
1133 old_files_option
= NO_OVERWRITE_DIR_OLD_FILES
;
1136 case NO_WILDCARDS_OPTION
:
1137 args
->exclude_options
&= ~ EXCLUDE_WILDCARDS
;
1140 case NO_WILDCARDS_MATCH_SLASH_OPTION
:
1141 args
->exclude_options
|= FNM_FILE_NAME
;
1145 filename_terminator
= '\0';
1148 case NUMERIC_OWNER_OPTION
:
1149 numeric_owner_option
= true;
1152 case OCCURRENCE_OPTION
:
1154 occurrence_option
= 1;
1158 if (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
)
1159 occurrence_option
= u
;
1161 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1162 _("Invalid number")));
1166 case OVERWRITE_OPTION
:
1167 old_files_option
= OVERWRITE_OLD_FILES
;
1171 if (! (strlen (arg
) < UNAME_FIELD_SIZE
1172 && uname_to_uid (arg
, &owner_option
)))
1175 if (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1179 FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1180 _("Invalid owner")));
1186 xheader_set_option (arg
);
1190 set_archive_format ("posix");
1193 case PRESERVE_OPTION
:
1194 same_permissions_option
= true;
1195 same_order_option
= true;
1198 case RECORD_SIZE_OPTION
:
1201 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1202 && u
== (size_t) u
))
1203 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1204 _("Invalid record size")));
1206 if (record_size
% BLOCKSIZE
!= 0)
1207 USAGE_ERROR ((0, 0, _("Record size must be a multiple of %d."),
1209 blocking_factor
= record_size
/ BLOCKSIZE
;
1213 case RECURSIVE_UNLINK_OPTION
:
1214 recursive_unlink_option
= true;
1217 case REMOVE_FILES_OPTION
:
1218 remove_files_option
= true;
1221 case RMT_COMMAND_OPTION
:
1225 case RSH_COMMAND_OPTION
:
1226 rsh_command_option
= arg
;
1229 case SHOW_DEFAULTS_OPTION
:
1230 show_default_settings (stdout
);
1233 case STRIP_COMPONENTS_OPTION
:
1236 if (! (xstrtoumax (arg
, 0, 10, &u
, "") == LONGINT_OK
1237 && u
== (size_t) u
))
1238 USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg
),
1239 _("Invalid number of elements")));
1240 strip_name_components
= u
;
1244 case SHOW_OMITTED_DIRS_OPTION
:
1245 show_omitted_dirs_option
= true;
1249 backup_option
= true;
1250 args
->backup_suffix_string
= arg
;
1254 totals_option
= true;
1257 case USE_COMPRESS_PROGRAM_OPTION
:
1258 set_use_compress_program_option (arg
);
1261 case VOLNO_FILE_OPTION
:
1262 volno_file_option
= arg
;
1265 case WILDCARDS_OPTION
:
1266 args
->exclude_options
|= EXCLUDE_WILDCARDS
;
1269 case WILDCARDS_MATCH_SLASH_OPTION
:
1270 args
->exclude_options
&= ~ FNM_FILE_NAME
;
1273 case CHECK_LINKS_OPTION
:
1274 check_links_option
= 1;
1277 case NO_RECURSION_OPTION
:
1278 recursion_option
= 0;
1281 case NO_SAME_OWNER_OPTION
:
1282 same_owner_option
= -1;
1285 case NO_SAME_PERMISSIONS_OPTION
:
1286 same_permissions_option
= -1;
1289 case RECURSION_OPTION
:
1290 recursion_option
= FNM_LEADING_DIR
;
1293 case SAME_OWNER_OPTION
:
1294 same_owner_option
= 1;
1297 case UNQUOTE_OPTION
:
1298 unquote_option
= true;
1301 case NO_UNQUOTE_OPTION
:
1302 unquote_option
= false;
1314 #ifdef DEVICE_PREFIX
1316 int device
= key
- '0';
1318 static char buf
[sizeof DEVICE_PREFIX
+ 10];
1322 argp_error (state
, _("Malformed density argument: '%s'"), arg
);
1324 strcpy (buf
, DEVICE_PREFIX
);
1325 cursor
= buf
+ strlen (buf
);
1327 #ifdef DENSITY_LETTER
1329 sprintf (cursor
, "%d%c", device
, arg
[0]);
1331 #else /* not DENSITY_LETTER */
1358 argp_error (state
, _("Unknown density: '%c'"), arg
[0]);
1360 sprintf (cursor
, "%d", device
);
1362 #endif /* not DENSITY_LETTER */
1364 if (archive_names
== allocated_archive_names
)
1366 allocated_archive_names
*= 2;
1367 archive_name_array
=
1368 xrealloc (archive_name_array
,
1369 sizeof (const char *) * allocated_archive_names
);
1371 archive_name_array
[archive_names
++] = strdup (buf
);
1375 #else /* not DEVICE_PREFIX */
1378 _("Options `-[0-7][lmh]' not supported by *this* tar"));
1380 #endif /* not DEVICE_PREFIX */
1383 state
->flags
|= ARGP_NO_EXIT
;
1384 argp_state_help (state
, state
->out_stream
,
1385 ARGP_HELP_STD_HELP
& ~ARGP_HELP_BUG_ADDR
);
1386 fprintf (state
->out_stream
, _("\n*This* tar defaults to:\n"));
1387 show_default_settings (state
->out_stream
);
1388 fprintf (state
->out_stream
, "\n");
1389 fprintf (state
->out_stream
, _("Report bugs to %s.\n"),
1390 argp_program_bug_address
);
1394 argp_state_help (state
, state
->out_stream
,
1395 ARGP_HELP_USAGE
| ARGP_HELP_EXIT_OK
);
1398 case VERSION_OPTION
:
1399 fprintf (state
->out_stream
, "%s\n", argp_program_version
);
1402 case LICENSE_OPTION
:
1407 _argp_hang
= atoi (arg
? arg
: "3600");
1408 while (_argp_hang
-- > 0)
1413 return ARGP_ERR_UNKNOWN
;
1418 static struct argp argp
= {
1431 argp_help (&argp
, stderr
, ARGP_HELP_SEE
, (char*) program_name
);
1435 /* Parse the options for tar. */
1437 static struct argp_option
*
1438 find_argp_option (struct argp_option
*options
, int letter
)
1441 !(options
->name
== NULL
1442 && options
->key
== 0
1443 && options
->arg
== 0
1444 && options
->flags
== 0
1445 && options
->doc
== NULL
); options
++)
1446 if (options
->key
== letter
)
1452 decode_options (int argc
, char **argv
)
1455 struct tar_args args
;
1457 /* Set some default option values. */
1458 args
.textual_date_option
= NULL
;
1459 args
.exclude_options
= EXCLUDE_WILDCARDS
;
1461 args
.pax_option
= 0;
1462 args
.backup_suffix_string
= getenv ("SIMPLE_BACKUP_SUFFIX");
1463 args
.version_control_string
= 0;
1464 args
.input_files
= 0;
1466 subcommand_option
= UNKNOWN_SUBCOMMAND
;
1467 archive_format
= DEFAULT_FORMAT
;
1468 blocking_factor
= DEFAULT_BLOCKING
;
1469 record_size
= DEFAULT_BLOCKING
* BLOCKSIZE
;
1470 excluded
= new_exclude ();
1471 newer_mtime_option
.tv_sec
= TYPE_MINIMUM (time_t);
1472 newer_mtime_option
.tv_nsec
= -1;
1473 recursion_option
= FNM_LEADING_DIR
;
1474 unquote_option
= true;
1479 /* Convert old-style tar call by exploding option element and rearranging
1480 options accordingly. */
1482 if (argc
> 1 && argv
[1][0] != '-')
1484 int new_argc
; /* argc value for rearranged arguments */
1485 char **new_argv
; /* argv value for rearranged arguments */
1486 char *const *in
; /* cursor into original argv */
1487 char **out
; /* cursor into rearranged argv */
1488 const char *letter
; /* cursor into old option letters */
1489 char buffer
[3]; /* constructed option buffer */
1491 /* Initialize a constructed option. */
1496 /* Allocate a new argument array, and copy program name in it. */
1498 new_argc
= argc
- 1 + strlen (argv
[1]);
1499 new_argv
= xmalloc ((new_argc
+ 1) * sizeof (char *));
1504 /* Copy each old letter option as a separate option, and have the
1505 corresponding argument moved next to it. */
1507 for (letter
= *in
++; *letter
; letter
++)
1509 struct argp_option
*opt
;
1511 buffer
[1] = *letter
;
1512 *out
++ = xstrdup (buffer
);
1513 opt
= find_argp_option (options
, *letter
);
1514 if (opt
&& opt
->arg
)
1516 if (in
< argv
+ argc
)
1519 USAGE_ERROR ((0, 0, _("Old option `%c' requires an argument."),
1524 /* Copy all remaining options. */
1526 while (in
< argv
+ argc
)
1530 /* Replace the old option list by the new one. */
1536 /* Parse all options and non-options as they appear. */
1538 prepend_default_options (getenv ("TAR_OPTIONS"), &argc
, &argv
);
1540 if (argp_parse (&argp
, argc
, argv
, ARGP_IN_ORDER
|ARGP_NO_HELP
,
1545 /* Special handling for 'o' option:
1547 GNU tar used to say "output old format".
1548 UNIX98 tar says don't chown files after extracting (we use
1549 "--no-same-owner" for this).
1551 The old GNU tar semantics is retained when used with --create
1552 option, otherwise UNIX98 semantics is assumed */
1556 if (subcommand_option
== CREATE_SUBCOMMAND
)
1558 /* GNU Tar <= 1.13 compatibility */
1559 set_archive_format ("v7");
1563 /* UNIX98 compatibility */
1564 same_owner_option
= -1;
1568 /* Handle operands after any "--" argument. */
1569 for (; index
< argc
; index
++)
1571 name_add (argv
[index
]);
1575 /* Derive option values and check option consistency. */
1577 if (archive_format
== DEFAULT_FORMAT
)
1579 if (args
.pax_option
)
1580 archive_format
= POSIX_FORMAT
;
1582 archive_format
= DEFAULT_ARCHIVE_FORMAT
;
1585 if (volume_label_option
&& subcommand_option
== CREATE_SUBCOMMAND
)
1586 assert_format (FORMAT_MASK (OLDGNU_FORMAT
)
1587 | FORMAT_MASK (GNU_FORMAT
));
1590 if (incremental_option
|| multi_volume_option
)
1591 assert_format (FORMAT_MASK (OLDGNU_FORMAT
) | FORMAT_MASK (GNU_FORMAT
));
1594 assert_format (FORMAT_MASK (OLDGNU_FORMAT
)
1595 | FORMAT_MASK (GNU_FORMAT
)
1596 | FORMAT_MASK (POSIX_FORMAT
));
1598 if (occurrence_option
)
1600 if (!args
.input_files
)
1602 _("--occurrence is meaningless without a file list")));
1603 if (subcommand_option
!= DELETE_SUBCOMMAND
1604 && subcommand_option
!= DIFF_SUBCOMMAND
1605 && subcommand_option
!= EXTRACT_SUBCOMMAND
1606 && subcommand_option
!= LIST_SUBCOMMAND
)
1608 _("--occurrence cannot be used in the requested operation mode")));
1611 if (seekable_archive
&& subcommand_option
== DELETE_SUBCOMMAND
)
1613 /* The current code in delete.c is based on the assumption that
1614 skip_member() reads all data from the archive. So, we should
1615 make sure it won't use seeks. On the other hand, the same code
1616 depends on the ability to backspace a record in the archive,
1617 so setting seekable_archive to false is technically incorrect.
1618 However, it is tested only in skip_member(), so it's not a
1620 seekable_archive
= false;
1623 if (archive_names
== 0)
1625 /* If no archive file name given, try TAPE from the environment, or
1626 else, DEFAULT_ARCHIVE from the configuration process. */
1629 archive_name_array
[0] = getenv ("TAPE");
1630 if (! archive_name_array
[0])
1631 archive_name_array
[0] = DEFAULT_ARCHIVE
;
1634 /* Allow multiple archives only with `-M'. */
1636 if (archive_names
> 1 && !multi_volume_option
)
1638 _("Multiple archive files require `-M' option")));
1640 if (listed_incremental_option
1641 && NEWER_OPTION_INITIALIZED (newer_mtime_option
))
1643 _("Cannot combine --listed-incremental with --newer")));
1645 if (volume_label_option
)
1647 size_t volume_label_max_len
=
1648 (sizeof current_header
->header
.name
1649 - 1 /* for trailing '\0' */
1650 - (multi_volume_option
1651 ? (sizeof " Volume "
1652 - 1 /* for null at end of " Volume " */
1653 + INT_STRLEN_BOUND (int) /* for volume number */
1654 - 1 /* for sign, as 0 <= volno */)
1656 if (volume_label_max_len
< strlen (volume_label_option
))
1658 ngettext ("%s: Volume label is too long (limit is %lu byte)",
1659 "%s: Volume label is too long (limit is %lu bytes)",
1660 volume_label_max_len
),
1661 quotearg_colon (volume_label_option
),
1662 (unsigned long) volume_label_max_len
));
1667 if (multi_volume_option
)
1668 USAGE_ERROR ((0, 0, _("Cannot verify multi-volume archives")));
1669 if (use_compress_program_option
)
1670 USAGE_ERROR ((0, 0, _("Cannot verify compressed archives")));
1673 if (use_compress_program_option
)
1675 if (multi_volume_option
)
1676 USAGE_ERROR ((0, 0, _("Cannot use multi-volume compressed archives")));
1677 if (subcommand_option
== UPDATE_SUBCOMMAND
)
1678 USAGE_ERROR ((0, 0, _("Cannot update compressed archives")));
1681 /* It is no harm to use --pax-option on non-pax archives in archive
1682 reading mode. It may even be useful, since it allows to override
1683 file attributes from tar headers. Therefore I allow such usage.
1686 && archive_format
!= POSIX_FORMAT
1687 && (subcommand_option
!= EXTRACT_SUBCOMMAND
1688 || subcommand_option
!= DIFF_SUBCOMMAND
1689 || subcommand_option
!= LIST_SUBCOMMAND
))
1690 USAGE_ERROR ((0, 0, _("--pax-option can be used only on POSIX archives")));
1692 /* If ready to unlink hierarchies, so we are for simpler files. */
1693 if (recursive_unlink_option
)
1694 old_files_option
= UNLINK_FIRST_OLD_FILES
;
1699 /* Forbid using -c with no input files whatsoever. Check that `-f -',
1700 explicit or implied, is used correctly. */
1702 switch (subcommand_option
)
1704 case CREATE_SUBCOMMAND
:
1705 if (args
.input_files
== 0 && !files_from_option
)
1707 _("Cowardly refusing to create an empty archive")));
1710 case EXTRACT_SUBCOMMAND
:
1711 case LIST_SUBCOMMAND
:
1712 case DIFF_SUBCOMMAND
:
1713 for (archive_name_cursor
= archive_name_array
;
1714 archive_name_cursor
< archive_name_array
+ archive_names
;
1715 archive_name_cursor
++)
1716 if (!strcmp (*archive_name_cursor
, "-"))
1717 request_stdin ("-f");
1720 case CAT_SUBCOMMAND
:
1721 case UPDATE_SUBCOMMAND
:
1722 case APPEND_SUBCOMMAND
:
1723 for (archive_name_cursor
= archive_name_array
;
1724 archive_name_cursor
< archive_name_array
+ archive_names
;
1725 archive_name_cursor
++)
1726 if (!strcmp (*archive_name_cursor
, "-"))
1728 _("Options `-Aru' are incompatible with `-f -'")));
1734 archive_name_cursor
= archive_name_array
;
1736 /* Prepare for generating backup names. */
1738 if (args
.backup_suffix_string
)
1739 simple_backup_suffix
= xstrdup (args
.backup_suffix_string
);
1742 backup_type
= xget_version ("--backup", args
.version_control_string
);
1744 if (verbose_option
&& args
.textual_date_option
)
1746 /* FIXME: tartime should support nanoseconds, too, so that this
1747 comparison doesn't complain about lost nanoseconds. */
1748 char const *treated_as
= tartime (newer_mtime_option
.tv_sec
);
1749 if (strcmp (args
.textual_date_option
, treated_as
) != 0)
1751 ngettext ("Treating date `%s' as %s + %ld nanosecond",
1752 "Treating date `%s' as %s + %ld nanoseconds",
1753 newer_mtime_option
.tv_nsec
),
1754 args
.textual_date_option
, treated_as
,
1755 newer_mtime_option
.tv_nsec
));
1762 /* Main routine for tar. */
1764 main (int argc
, char **argv
)
1767 program_name
= argv
[0];
1769 setlocale (LC_ALL
, "");
1770 bindtextdomain (PACKAGE
, LOCALEDIR
);
1771 textdomain (PACKAGE
);
1773 exit_status
= TAREXIT_SUCCESS
;
1774 filename_terminator
= '\n';
1775 set_quoting_style (0, escape_quoting_style
);
1777 /* Pre-allocate a few structures. */
1779 allocated_archive_names
= 10;
1780 archive_name_array
=
1781 xmalloc (sizeof (const char *) * allocated_archive_names
);
1784 obstack_init (&argv_stk
);
1787 /* System V fork+wait does not work if SIGCHLD is ignored. */
1788 signal (SIGCHLD
, SIG_DFL
);
1793 /* Decode options. */
1795 decode_options (argc
, argv
);
1798 /* Main command execution. */
1800 if (volno_file_option
)
1801 init_volume_number ();
1803 switch (subcommand_option
)
1805 case UNKNOWN_SUBCOMMAND
:
1807 _("You must specify one of the `-Acdtrux' options")));
1809 case CAT_SUBCOMMAND
:
1810 case UPDATE_SUBCOMMAND
:
1811 case APPEND_SUBCOMMAND
:
1815 case DELETE_SUBCOMMAND
:
1816 delete_archive_members ();
1819 case CREATE_SUBCOMMAND
:
1822 print_total_written ();
1825 case EXTRACT_SUBCOMMAND
:
1827 read_and (extract_archive
);
1829 /* FIXME: should extract_finish () even if an ordinary signal is
1835 case LIST_SUBCOMMAND
:
1836 read_and (list_archive
);
1839 case DIFF_SUBCOMMAND
:
1841 read_and (diff_archive
);
1845 if (check_links_option
)
1848 if (volno_file_option
)
1849 closeout_volume_number ();
1851 /* Dispose of allocated memory, and return. */
1853 free (archive_name_array
);
1856 if (stdlis
!= stderr
&& (ferror (stdlis
) || fclose (stdlis
) != 0))
1857 FATAL_ERROR ((0, 0, _("Error in writing to standard output")));
1858 if (exit_status
== TAREXIT_FAILURE
)
1859 error (0, 0, _("Error exit delayed from previous errors"));
1860 if (ferror (stderr
) || fclose (stderr
) != 0)
1861 exit_status
= TAREXIT_FAILURE
;
1866 tar_stat_init (struct tar_stat_info
*st
)
1868 memset (st
, 0, sizeof (*st
));
1872 tar_stat_destroy (struct tar_stat_info
*st
)
1874 free (st
->orig_file_name
);
1875 free (st
->file_name
);
1876 free (st
->link_name
);
1879 free (st
->sparse_map
);
1880 memset (st
, 0, sizeof (*st
));