1 /* A tar (tape archiver) program.
2 Copyright (C) 1988, 92,93,94,95,96,97, 1999 Free Software Foundation, Inc.
3 Written by John Gilmore, starting 1985-08-25.
5 This program is free software; you can redistribute it and/or modify it
6 under the terms of the GNU General Public License as published by the
7 Free Software Foundation; either version 2, or (at your option) any later
10 This program is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
13 Public License for more details.
15 You should have received a copy of the GNU General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 59 Place - Suite 330, Boston, MA 02111-1307, USA. */
23 /* The following causes "common.h" to produce definitions of all the global
24 variables, rather than just "extern" declarations of them. GNU tar does
25 depend on the system loader to preset all GLOBAL variables to neutral (or
26 zero) values, explicit initialisation is usually not done. */
30 #include "backupfile.h"
35 /* Local declarations. */
37 #ifndef DEFAULT_ARCHIVE
38 # define DEFAULT_ARCHIVE "tar.out"
41 #ifndef DEFAULT_BLOCKING
42 # define DEFAULT_BLOCKING 20
45 static void usage
PARAMS ((int));
49 /*----------------------------------------------.
50 | Doesn't return if stdin already requested. |
51 `----------------------------------------------*/
53 /* Name of option using stdin. */
54 static const char *stdin_used_by
= NULL
;
57 request_stdin (const char *option
)
60 USAGE_ERROR ((0, 0, _("Options `-%s' and `-%s' both want standard input"),
61 stdin_used_by
, option
));
63 stdin_used_by
= option
;
66 /*--------------------------------------------------------.
67 | Returns true if and only if the user typed 'y' or 'Y'. |
68 `--------------------------------------------------------*/
71 confirm (const char *message_action
, const char *message_name
)
73 static FILE *confirm_file
= NULL
;
77 if (archive
== 0 || stdin_used_by
)
78 confirm_file
= fopen (TTY_NAME
, "r");
86 FATAL_ERROR ((0, 0, _("Cannot read confirmation from user")));
89 fprintf (stdlis
, "%s %s?", message_action
, message_name
);
93 int reply
= getc (confirm_file
);
96 for (character
= reply
;
97 character
!= '\n' && character
!= EOF
;
98 character
= getc (confirm_file
))
100 return reply
== 'y' || reply
== 'Y';
106 /* For long options that unconditionally set a single flag, we have getopt
107 do it. For the others, we share the code for the equivalent short
108 named option, the name of which is stored in the otherwise-unused `val'
109 field of the `struct option'; for long options that have no equivalent
110 short option, we use nongraphic characters as pseudo short option
111 characters, starting at 2 and going upwards. */
113 #define BACKUP_OPTION 2
114 #define DELETE_OPTION 3
115 #define EXCLUDE_OPTION 4
116 #define GROUP_OPTION 5
117 #define MODE_OPTION 6
118 #define NEWER_MTIME_OPTION 7
119 #define NO_RECURSE_OPTION 8
120 #define NULL_OPTION 9
121 #define OWNER_OPTION 10
122 #define POSIX_OPTION 11
123 #define PRESERVE_OPTION 12
124 #define RECORD_SIZE_OPTION 13
125 #define RSH_COMMAND_OPTION 14
126 #define SUFFIX_OPTION 15
127 #define USE_COMPRESS_PROGRAM_OPTION 16
128 #define VOLNO_FILE_OPTION 17
130 /* Some cleanup is being made in GNU tar long options. Using old names is
131 allowed for a while, but will also send a warning to stderr. Take old
132 names out in 1.14, or in summer 1997, whichever happens last. We use
133 nongraphic characters as pseudo short option characters, starting at 31
134 and going downwards. */
136 #define OBSOLETE_ABSOLUTE_NAMES 31
137 #define OBSOLETE_BLOCK_COMPRESS 30
138 #define OBSOLETE_BLOCKING_FACTOR 29
139 #define OBSOLETE_BLOCK_NUMBER 28
140 #define OBSOLETE_READ_FULL_RECORDS 27
141 #define OBSOLETE_TOUCH 26
142 #define OBSOLETE_VERSION_CONTROL 25
144 /* If nonzero, display usage information and exit. */
145 static int show_help
= 0;
147 /* If nonzero, print the version on standard output and exit. */
148 static int show_version
= 0;
150 struct option long_options
[] =
152 {"absolute-names", no_argument
, NULL
, 'P'},
153 {"absolute-paths", no_argument
, NULL
, OBSOLETE_ABSOLUTE_NAMES
},
154 {"after-date", required_argument
, NULL
, 'N'},
155 {"append", no_argument
, NULL
, 'r'},
156 {"atime-preserve", no_argument
, &atime_preserve_option
, 1},
157 {"backup", optional_argument
, NULL
, BACKUP_OPTION
},
158 {"block-compress", no_argument
, NULL
, OBSOLETE_BLOCK_COMPRESS
},
159 {"block-number", no_argument
, NULL
, 'R'},
160 {"block-size", required_argument
, NULL
, OBSOLETE_BLOCKING_FACTOR
},
161 {"blocking-factor", required_argument
, NULL
, 'b'},
162 {"catenate", no_argument
, NULL
, 'A'},
163 {"checkpoint", no_argument
, &checkpoint_option
, 1},
164 {"compare", no_argument
, NULL
, 'd'},
165 {"compress", no_argument
, NULL
, 'Z'},
166 {"concatenate", no_argument
, NULL
, 'A'},
167 {"confirmation", no_argument
, NULL
, 'w'},
168 /* FIXME: --selective as a synonym for --confirmation? */
169 {"create", no_argument
, NULL
, 'c'},
170 {"delete", no_argument
, NULL
, DELETE_OPTION
},
171 {"dereference", no_argument
, NULL
, 'h'},
172 {"diff", no_argument
, NULL
, 'd'},
173 {"directory", required_argument
, NULL
, 'C'},
174 {"ending-file", required_argument
, NULL
, 'E'},
175 {"exclude", required_argument
, NULL
, EXCLUDE_OPTION
},
176 {"exclude-from", required_argument
, NULL
, 'X'},
177 {"extract", no_argument
, NULL
, 'x'},
178 {"file", required_argument
, NULL
, 'f'},
179 {"files-from", required_argument
, NULL
, 'T'},
180 {"force-local", no_argument
, &force_local_option
, 1},
181 {"get", no_argument
, NULL
, 'x'},
182 {"group", required_argument
, NULL
, GROUP_OPTION
},
183 {"gunzip", no_argument
, NULL
, 'z'},
184 {"gzip", no_argument
, NULL
, 'z'},
185 {"help", no_argument
, &show_help
, 1},
186 {"ignore-failed-read", no_argument
, &ignore_failed_read_option
, 1},
187 {"ignore-zeros", no_argument
, NULL
, 'i'},
188 /* FIXME: --ignore-end as a new name for --ignore-zeros? */
189 {"incremental", no_argument
, NULL
, 'G'},
190 {"info-script", required_argument
, NULL
, 'F'},
191 {"interactive", no_argument
, NULL
, 'w'},
192 {"keep-old-files", no_argument
, NULL
, 'k'},
193 {"label", required_argument
, NULL
, 'V'},
194 {"list", no_argument
, NULL
, 't'},
195 {"listed-incremental", required_argument
, NULL
, 'g'},
196 {"mode", required_argument
, NULL
, MODE_OPTION
},
197 {"modification-time", no_argument
, NULL
, OBSOLETE_TOUCH
},
198 {"multi-volume", no_argument
, NULL
, 'M'},
199 {"new-volume-script", required_argument
, NULL
, 'F'},
200 {"newer", required_argument
, NULL
, 'N'},
201 {"newer-mtime", required_argument
, NULL
, NEWER_MTIME_OPTION
},
202 {"null", no_argument
, NULL
, NULL_OPTION
},
203 {"no-recursion", no_argument
, NULL
, NO_RECURSE_OPTION
},
204 {"numeric-owner", no_argument
, &numeric_owner_option
, 1},
205 {"old-archive", no_argument
, NULL
, 'o'},
206 {"one-file-system", no_argument
, NULL
, 'l'},
207 {"owner", required_argument
, NULL
, OWNER_OPTION
},
208 {"portability", no_argument
, NULL
, 'o'},
209 {"posix", no_argument
, NULL
, POSIX_OPTION
},
210 {"preserve", no_argument
, NULL
, PRESERVE_OPTION
},
211 {"preserve-order", no_argument
, NULL
, 's'},
212 {"preserve-permissions", no_argument
, NULL
, 'p'},
213 {"recursive-unlink", no_argument
, &recursive_unlink_option
, 1},
214 {"read-full-blocks", no_argument
, NULL
, OBSOLETE_READ_FULL_RECORDS
},
215 {"read-full-records", no_argument
, NULL
, 'B'},
216 /* FIXME: --partial-blocks might be a synonym for --read-full-records? */
217 {"record-number", no_argument
, NULL
, OBSOLETE_BLOCK_NUMBER
},
218 {"record-size", required_argument
, NULL
, RECORD_SIZE_OPTION
},
219 {"remove-files", no_argument
, &remove_files_option
, 1},
220 {"rsh-command", required_argument
, NULL
, RSH_COMMAND_OPTION
},
221 {"same-order", no_argument
, NULL
, 's'},
222 {"same-owner", no_argument
, &same_owner_option
, 1},
223 {"same-permissions", no_argument
, NULL
, 'p'},
224 {"show-omitted-dirs", no_argument
, &show_omitted_dirs_option
, 1},
225 {"sparse", no_argument
, NULL
, 'S'},
226 {"starting-file", required_argument
, NULL
, 'K'},
227 {"suffix", required_argument
, NULL
, SUFFIX_OPTION
},
228 {"tape-length", required_argument
, NULL
, 'L'},
229 {"to-stdout", no_argument
, NULL
, 'O'},
230 {"totals", no_argument
, &totals_option
, 1},
231 {"touch", no_argument
, NULL
, 'm'},
232 {"uncompress", no_argument
, NULL
, 'Z'},
233 {"ungzip", no_argument
, NULL
, 'z'},
234 {"unlink-first", no_argument
, NULL
, 'U'},
235 {"update", no_argument
, NULL
, 'u'},
236 {"use-compress-program", required_argument
, NULL
, USE_COMPRESS_PROGRAM_OPTION
},
237 {"verbose", no_argument
, NULL
, 'v'},
238 {"verify", no_argument
, NULL
, 'W'},
239 {"version", no_argument
, &show_version
, 1},
240 {"version-control", required_argument
, NULL
, OBSOLETE_VERSION_CONTROL
},
241 {"volno-file", required_argument
, NULL
, VOLNO_FILE_OPTION
},
246 /*---------------------------------------------.
247 | Print a usage message and exit with STATUS. |
248 `---------------------------------------------*/
253 if (status
!= TAREXIT_SUCCESS
)
254 fprintf (stderr
, _("Try `%s --help' for more information.\n"),
259 GNU `tar' saves many files together into a single tape or disk archive, and\n\
260 can restore individual files from the archive.\n"),
262 printf (_("\nUsage: %s [OPTION]... [FILE]...\n"), program_name
);
265 If a long option shows an argument as mandatory, then it is mandatory\n\
266 for the equivalent short option also. Similarly for optional arguments.\n"),
270 Main operation mode:\n\
271 -t, --list list the contents of an archive\n\
272 -x, --extract, --get extract files from an archive\n\
273 -c, --create create a new archive\n\
274 -d, --diff, --compare find differences between archive and file system\n\
275 -r, --append append files to the end of an archive\n\
276 -u, --update only append files newer than copy in archive\n\
277 -A, --catenate append tar files to an archive\n\
278 --concatenate same as -A\n\
279 --delete delete from the archive (not on mag tapes!)\n"),
283 Operation modifiers:\n\
284 -W, --verify attempt to verify the archive after writing it\n\
285 --remove-files remove files after adding them to the archive\n\
286 -k, --keep-old-files don't overwrite existing files when extracting\n\
287 -U, --unlink-first remove each file prior to extracting over it\n\
288 --recursive-unlink empty hierarchies prior to extracting directory\n\
289 -S, --sparse handle sparse files efficiently\n\
290 -O, --to-stdout extract files to standard output\n\
291 -G, --incremental handle old GNU-format incremental backup\n\
292 -g, --listed-incremental handle new GNU-format incremental backup\n\
293 --ignore-failed-read do not exit with nonzero on unreadable files\n"),
297 Handling of file attributes:\n\
298 --owner=NAME force NAME as owner for added files\n\
299 --group=NAME force NAME as group for added files\n\
300 --mode=CHANGES force (symbolic) mode CHANGES for added files\n\
301 --atime-preserve don't change access times on dumped files\n\
302 -m, --modification-time don't extract file modified time\n\
303 --same-owner try extracting files with the same ownership\n\
304 --numeric-owner always use numbers for user/group names\n\
305 -p, --same-permissions extract all protection information\n\
306 --preserve-permissions same as -p\n\
307 -s, --same-order sort names to extract to match archive\n\
308 --preserve-order same as -s\n\
309 --preserve same as both -p and -s\n"),
313 Device selection and switching:\n\
314 -f, --file=ARCHIVE use archive file or device ARCHIVE\n\
315 --force-local archive file is local even if has a colon\n\
316 --rsh-command=COMMAND use remote COMMAND instead of rsh\n\
317 -[0-7][lmh] specify drive and density\n\
318 -M, --multi-volume create/list/extract multi-volume archive\n\
319 -L, --tape-length=NUM change tape after writing NUM x 1024 bytes\n\
320 -F, --info-script=FILE run script at end of each tape (implies -M)\n\
321 --new-volume-script=FILE same as -F FILE\n\
322 --volno-file=FILE use/update the volume number in FILE\n"),
327 -b, --blocking-factor=BLOCKS BLOCKS x 512 bytes per record\n\
328 --record-size=SIZE SIZE bytes per record, multiple of 512\n\
329 -i, --ignore-zeros ignore zeroed blocks in archive (means EOF)\n\
330 -B, --read-full-records reblock as we read (for 4.2BSD pipes)\n"),
334 Archive format selection:\n\
335 -V, --label=NAME create archive with volume name NAME\n\
336 PATTERN at list/extract time, a globbing PATTERN\n\
337 -o, --old-archive, --portability write a V7 format archive\n\
338 --posix write a POSIX conformant archive\n\
339 -z, --gzip, --ungzip filter the archive through gzip\n\
340 -Z, --compress, --uncompress filter the archive through compress\n\
341 --use-compress-program=PROG filter through PROG (must accept -d)\n"),
345 Local file selection:\n\
346 -C, --directory=DIR change to directory DIR\n\
347 -T, --files-from=NAME get names to extract or create from file NAME\n\
348 --null -T reads null-terminated names, disable -C\n\
349 --exclude=PATTERN exclude files, given as a globbing PATTERN\n\
350 -X, --exclude-from=FILE exclude globbing patterns listed in FILE\n\
351 -P, --absolute-names don't strip leading `/'s from file names\n\
352 -h, --dereference dump instead the files symlinks point to\n\
353 --no-recursion avoid descending automatically in directories\n\
354 -l, --one-file-system stay in local file system when creating archive\n\
355 -E, --ending-file=NAME end reading the archive before file NAME\n\
356 -K, --starting-file=NAME begin at file NAME in the archive\n"),
360 -N, --newer=DATE only store files newer than DATE\n\
361 --newer-mtime compare date and time when data changed only\n\
362 --after-date=DATE same as -N\n"),
366 --backup[=CONTROL] backup before removal, choose version control\n\
367 --suffix=SUFFIX backup before removel, override usual suffix\n"),
371 Informative output:\n\
372 --help print this help, then exit\n\
373 --version print tar program version number, then exit\n\
374 -v, --verbose verbosely list files processed\n\
375 --checkpoint print directory names while reading the archive\n\
376 --totals print total bytes written while creating archive\n\
377 -R, --block-number show block number within archive with each message\n\
378 -w, --interactive ask for confirmation for every action\n\
379 --confirmation same as -w\n"),
383 The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
384 The version control may be set with --backup or VERSION_CONTROL, values are:\n\
386 t, numbered make numbered backups\n\
387 nil, existing numbered if numbered backups exist, simple otherwise\n\
388 never, simple always make simple backups\n"),
392 GNU tar cannot read nor produce `--posix' archives. If POSIXLY_CORRECT\n\
393 is set in the environment, GNU extensions are disallowed with `--posix'.\n\
394 Support for POSIX is only partially implemented, don't count on it yet.\n\
395 ARCHIVE may be FILE, HOST:FILE or USER@HOST:FILE; and FILE may be a file\n\
396 or a device. *This* `tar' defaults to `-f%s -b%d'.\n"),
397 DEFAULT_ARCHIVE
, DEFAULT_BLOCKING
);
400 Report bugs to <tar-bugs@gnu.ai.mit.edu>.\n"),
406 /*----------------------------.
407 | Parse the options for tar. |
408 `----------------------------*/
410 /* Available option letters are DHIJQY and aejnqy. Some are reserved:
412 y per-file gzip compression
413 Y per-block gzip compression */
415 #define OPTION_STRING \
416 "-01234567ABC:E:F:GK:L:MN:OPRST:UV:WX:Zb:cdf:g:hiklmoprstuvwxz"
419 set_subcommand_option (enum subcommand subcommand
)
421 if (subcommand_option
!= UNKNOWN_SUBCOMMAND
422 && subcommand_option
!= subcommand
)
424 _("You may not specify more than one `-Acdtrux' option")));
426 subcommand_option
= subcommand
;
430 set_use_compress_program_option (const char *string
)
432 if (use_compress_program_option
&& strcmp (use_compress_program_option
, string
) != 0)
433 USAGE_ERROR ((0, 0, _("Conflicting compression options")));
435 use_compress_program_option
= string
;
439 decode_options (int argc
, char *const *argv
)
441 int optchar
; /* option letter */
442 int input_files
; /* number of input files */
443 const char *backup_suffix_string
;
444 const char *version_control_string
= NULL
;
446 /* Set some default option values. */
448 subcommand_option
= UNKNOWN_SUBCOMMAND
;
449 archive_format
= DEFAULT_FORMAT
;
450 blocking_factor
= DEFAULT_BLOCKING
;
451 record_size
= DEFAULT_BLOCKING
* BLOCKSIZE
;
456 backup_suffix_string
= getenv ("SIMPLE_BACKUP_SUFFIX");
458 /* Convert old-style tar call by exploding option element and rearranging
459 options accordingly. */
461 if (argc
> 1 && argv
[1][0] != '-')
463 int new_argc
; /* argc value for rearranged arguments */
464 char **new_argv
; /* argv value for rearranged arguments */
465 char *const *in
; /* cursor into original argv */
466 char **out
; /* cursor into rearranged argv */
467 const char *letter
; /* cursor into old option letters */
468 char buffer
[3]; /* constructed option buffer */
469 const char *cursor
; /* cursor in OPTION_STRING */
471 /* Initialize a constructed option. */
476 /* Allocate a new argument array, and copy program name in it. */
478 new_argc
= argc
- 1 + strlen (argv
[1]);
479 new_argv
= (char **) xmalloc (new_argc
* sizeof (char *));
484 /* Copy each old letter option as a separate option, and have the
485 corresponding argument moved next to it. */
487 for (letter
= *in
++; *letter
; letter
++)
490 *out
++ = xstrdup (buffer
);
491 cursor
= strchr (OPTION_STRING
, *letter
);
492 if (cursor
&& cursor
[1] == ':')
494 if (in
< argv
+ argc
)
497 USAGE_ERROR ((0, 0, _("Old option `%c' requires an argument."),
502 /* Copy all remaining options. */
504 while (in
< argv
+ argc
)
507 /* Replace the old option list by the new one. */
513 /* Parse all options and non-options as they appear. */
517 while (optchar
= getopt_long (argc
, argv
, OPTION_STRING
, long_options
, NULL
),
522 usage (TAREXIT_FAILURE
);
528 /* File name or non-parsed option, because of RETURN_IN_ORDER
529 ordering triggerred by the leading dash in OPTION_STRING. */
536 set_subcommand_option (CAT_SUBCOMMAND
);
539 case OBSOLETE_BLOCK_COMPRESS
:
540 WARN ((0, 0, _("Obsolete option, now implied by --blocking-factor")));
543 case OBSOLETE_BLOCKING_FACTOR
:
544 WARN ((0, 0, _("Obsolete option name replaced by --blocking-factor")));
550 if (! (xstrtol (optarg
, (char **) 0, 10, &l
, "") == LONGINT_OK
551 && l
== (blocking_factor
= l
)
552 && 0 < blocking_factor
553 && l
== (record_size
= l
* (size_t) BLOCKSIZE
) / BLOCKSIZE
))
554 USAGE_ERROR ((0, 0, _("Invalid blocking factor")));
558 case OBSOLETE_READ_FULL_RECORDS
:
560 _("Obsolete option name replaced by --read-full-records")));
564 /* Try to reblock input records. For reading 4.2BSD pipes. */
566 /* It would surely make sense to exchange -B and -R, but it seems
567 that -B has been used for a long while in Sun tar ans most
568 BSD-derived systems. This is a consequence of the block/record
569 terminology confusion. */
571 read_full_records_option
= 1;
575 set_subcommand_option (CREATE_SUBCOMMAND
);
584 set_subcommand_option (DIFF_SUBCOMMAND
);
588 ending_file_option
= optarg
;
592 if (archive_names
== allocated_archive_names
)
594 allocated_archive_names
*= 2;
595 archive_name_array
= (const char **)
596 xrealloc (archive_name_array
,
597 sizeof (const char *) * allocated_archive_names
);
599 archive_name_array
[archive_names
++] = optarg
;
603 /* Since -F is only useful with -M, make it implied. Run this
604 script at the end of each tape. */
606 info_script_option
= optarg
;
607 multi_volume_option
= 1;
611 listed_incremental_option
= optarg
;
615 /* We are making an incremental dump (FIXME: are we?); save
616 directories at the beginning of the archive, and include in each
617 directory its contents. */
619 incremental_option
= 1;
623 /* Follow symbolic links. */
625 dereference_option
= 1;
629 /* Ignore zero blocks (eofs). This can't be the default,
630 because Unix tar writes two blocks of zeros, then pads out
631 the record with garbage. */
633 ignore_zeros_option
= 1;
637 /* Don't overwrite existing files. */
639 keep_old_files_option
= 1;
643 starting_file_option
= 1;
648 /* When dumping directories, don't dump files/subdirectories
649 that are on other filesystems. */
651 one_file_system_option
= 1;
657 if (xstrtoul (optarg
, (char **) 0, 10, &u
, "") != LONG_MAX
)
658 USAGE_ERROR ((0, 0, _("Invalid tape length")));
659 clear_tarlong (tape_length_option
);
660 add_to_tarlong (tape_length_option
, u
);
661 mult_tarlong (tape_length_option
, 1024);
662 multi_volume_option
= 1;
667 WARN ((0, 0, _("Obsolete option name replaced by --touch")));
675 /* Make multivolume archive: when we can't write any more into
676 the archive, re-open it, and continue writing. */
678 multi_volume_option
= 1;
683 after_date_option
= 1;
686 case NEWER_MTIME_OPTION
:
687 if (newer_mtime_option
)
688 USAGE_ERROR ((0, 0, _("More than one threshold date")));
690 newer_mtime_option
= get_date (optarg
, (voidstar
) 0);
691 if (newer_mtime_option
== (time_t) -1)
692 USAGE_ERROR ((0, 0, _("Invalid date format `%s'"), optarg
));
695 #endif /* not MSDOS */
698 if (archive_format
== DEFAULT_FORMAT
)
699 archive_format
= V7_FORMAT
;
700 else if (archive_format
!= V7_FORMAT
)
701 USAGE_ERROR ((0, 0, _("Conflicting archive format options")));
705 to_stdout_option
= 1;
709 same_permissions_option
= 1;
712 case OBSOLETE_ABSOLUTE_NAMES
:
713 WARN ((0, 0, _("Obsolete option name replaced by --absolute-names")));
717 absolute_names_option
= 1;
721 set_subcommand_option (APPEND_SUBCOMMAND
);
724 case OBSOLETE_BLOCK_NUMBER
:
725 WARN ((0, 0, _("Obsolete option name replaced by --block-number")));
729 /* Print block numbers for debugging bad tar archives. */
731 /* It would surely make sense to exchange -B and -R, but it seems
732 that -B has been used for a long while in Sun tar ans most
733 BSD-derived systems. This is a consequence of the block/record
734 terminology confusion. */
736 block_number_option
= 1;
740 /* Names to extr are sorted. */
742 same_order_option
= 1;
750 set_subcommand_option (LIST_SUBCOMMAND
);
755 files_from_option
= optarg
;
759 set_subcommand_option (UPDATE_SUBCOMMAND
);
763 unlink_first_option
= 1;
771 volume_label_option
= optarg
;
775 interactive_option
= 1;
783 set_subcommand_option (EXTRACT_SUBCOMMAND
);
788 add_exclude_file (optarg
);
792 set_use_compress_program_option ("gzip");
796 set_use_compress_program_option ("compress");
799 case OBSOLETE_VERSION_CONTROL
:
800 WARN ((0, 0, _("Obsolete option name replaced by --backup")));
806 version_control_string
= optarg
;
810 set_subcommand_option (DELETE_SUBCOMMAND
);
815 add_exclude (optarg
);
819 if (! (strlen (optarg
) < GNAME_FIELD_SIZE
820 && gname_to_gid (optarg
, &group_option
)))
823 if (xstrtoumax (optarg
, (char **) 0, 10, &g
, "") == LONGINT_OK
827 ERROR ((TAREXIT_FAILURE
, 0, _("Invalid group given on option")));
833 = mode_compile (optarg
,
834 MODE_MASK_EQUALS
| MODE_MASK_PLUS
| MODE_MASK_MINUS
);
835 if (mode_option
== MODE_INVALID
)
836 ERROR ((TAREXIT_FAILURE
, 0, _("Invalid mode given on option")));
837 if (mode_option
== MODE_MEMORY_EXHAUSTED
)
838 ERROR ((TAREXIT_FAILURE
, 0, _("Memory exhausted")));
841 case NO_RECURSE_OPTION
:
842 no_recurse_option
= 1;
846 filename_terminator
= '\0';
850 if (! (strlen (optarg
) < UNAME_FIELD_SIZE
851 && uname_to_uid (optarg
, &owner_option
)))
854 if (xstrtoumax (optarg
, (char **) 0, 10, &u
, "") == LONGINT_OK
858 ERROR ((TAREXIT_FAILURE
, 0, _("Invalid owner given on option")));
863 #if OLDGNU_COMPATIBILITY
864 if (archive_format
== DEFAULT_FORMAT
)
865 archive_format
= GNU_FORMAT
;
866 else if (archive_format
!= GNU_FORMAT
)
867 USAGE_ERROR ((0, 0, _("Conflicting archive format options")));
869 if (archive_format
== DEFAULT_FORMAT
)
870 archive_format
= POSIX_FORMAT
;
871 else if (archive_format
!= POSIX_FORMAT
)
872 USAGE_ERROR ((0, 0, _("Conflicting archive format options")));
876 case PRESERVE_OPTION
:
877 same_permissions_option
= 1;
878 same_order_option
= 1;
881 case RECORD_SIZE_OPTION
:
884 if (! (xstrtoumax (optarg
, (char **) 0, 10, &u
, "") == LONG_MAX
886 USAGE_ERROR ((0, 0, _("Invalid record size")));
888 if (record_size
% BLOCKSIZE
!= 0)
889 USAGE_ERROR ((0, 0, _("Record size must be a multiple of %d."),
891 blocking_factor
= record_size
/ BLOCKSIZE
;
895 case RSH_COMMAND_OPTION
:
896 rsh_command_option
= optarg
;
901 backup_suffix_string
= optarg
;
904 case VOLNO_FILE_OPTION
:
905 volno_file_option
= optarg
;
908 case USE_COMPRESS_PROGRAM_OPTION
:
909 set_use_compress_program_option (optarg
);
923 int device
= optchar
- '0';
925 static char buf
[sizeof DEVICE_PREFIX
+ 10];
928 density
= getopt_long (argc
, argv
, "lmh", NULL
, NULL
);
929 strcpy (buf
, DEVICE_PREFIX
);
930 cursor
= buf
+ strlen (buf
);
932 #ifdef DENSITY_LETTER
934 sprintf (cursor
, "%d%c", device
, density
);
936 #else /* not DENSITY_LETTER */
963 usage (TAREXIT_FAILURE
);
965 sprintf (cursor
, "%d", device
);
967 #endif /* not DENSITY_LETTER */
969 if (archive_names
== allocated_archive_names
)
971 allocated_archive_names
*= 2;
972 archive_name_array
= (const char **)
973 xrealloc (archive_name_array
,
974 sizeof (const char *) * allocated_archive_names
);
976 archive_name_array
[archive_names
++] = buf
;
978 /* FIXME: How comes this works for many archives when buf is
983 #else /* not DEVICE_PREFIX */
986 _("Options `-[0-7][lmh]' not supported by *this* tar")));
988 #endif /* not DEVICE_PREFIX */
991 /* Process trivial options. */
995 printf ("tar (GNU %s) %s\n", PACKAGE
, VERSION
);
998 Copyright (C) 1988, 92,93,94,95,96,97,98, 1999 Free Software Foundation, Inc.\n"),
1001 This is free software; see the source for copying conditions. There is NO\n\
1002 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"),
1006 Written by John Gilmore and Jay Fenlason.\n"),
1008 exit (TAREXIT_SUCCESS
);
1012 usage (TAREXIT_SUCCESS
);
1014 /* Derive option values and check option consistency. */
1016 if (archive_format
== DEFAULT_FORMAT
)
1018 #if OLDGNU_COMPATIBILITY
1019 archive_format
= OLDGNU_FORMAT
;
1021 archive_format
= GNU_FORMAT
;
1025 if (archive_format
== GNU_FORMAT
&& getenv ("POSIXLY_CORRECT"))
1026 archive_format
= POSIX_FORMAT
;
1028 if ((volume_label_option
!= NULL
1029 || incremental_option
|| multi_volume_option
|| sparse_option
)
1030 && archive_format
!= OLDGNU_FORMAT
&& archive_format
!= GNU_FORMAT
)
1032 _("GNU features wanted on incompatible archive format")));
1034 if (archive_names
== 0)
1036 /* If no archive file name given, try TAPE from the environment, or
1037 else, DEFAULT_ARCHIVE from the configuration process. */
1040 archive_name_array
[0] = getenv ("TAPE");
1041 if (archive_name_array
[0] == NULL
)
1042 archive_name_array
[0] = DEFAULT_ARCHIVE
;
1045 /* Allow multiple archives only with `-M'. */
1047 if (archive_names
> 1 && !multi_volume_option
)
1049 _("Multiple archive files requires `-M' option")));
1051 /* If ready to unlink hierarchies, so we are for simpler files. */
1052 if (recursive_unlink_option
)
1053 unlink_first_option
= 1;
1055 /* Forbid using -c with no input files whatsoever. Check that `-f -',
1056 explicit or implied, is used correctly. */
1058 switch (subcommand_option
)
1060 case CREATE_SUBCOMMAND
:
1061 if (input_files
== 0 && !files_from_option
)
1063 _("Cowardly refusing to create an empty archive")));
1066 case EXTRACT_SUBCOMMAND
:
1067 case LIST_SUBCOMMAND
:
1068 case DIFF_SUBCOMMAND
:
1069 for (archive_name_cursor
= archive_name_array
;
1070 archive_name_cursor
< archive_name_array
+ archive_names
;
1071 archive_name_cursor
++)
1072 if (!strcmp (*archive_name_cursor
, "-"))
1073 request_stdin ("-f");
1076 case CAT_SUBCOMMAND
:
1077 case UPDATE_SUBCOMMAND
:
1078 case APPEND_SUBCOMMAND
:
1079 for (archive_name_cursor
= archive_name_array
;
1080 archive_name_cursor
< archive_name_array
+ archive_names
;
1081 archive_name_cursor
++)
1082 if (!strcmp (*archive_name_cursor
, "-"))
1084 _("Options `-Aru' are incompatible with `-f -'")));
1090 archive_name_cursor
= archive_name_array
;
1092 /* Prepare for generating backup names. */
1094 if (backup_suffix_string
)
1095 simple_backup_suffix
= xstrdup (backup_suffix_string
);
1098 backup_type
= xget_version ("--backup", version_control_string
);
1103 /*-----------------------.
1104 | Main routine for tar. |
1105 `-----------------------*/
1108 main (int argc
, char *const *argv
)
1110 program_name
= argv
[0];
1111 setlocale (LC_ALL
, "");
1112 bindtextdomain (PACKAGE
, LOCALEDIR
);
1113 textdomain (PACKAGE
);
1115 exit_status
= TAREXIT_SUCCESS
;
1116 filename_terminator
= '\n';
1118 /* Pre-allocate a few structures. */
1120 allocated_archive_names
= 10;
1121 archive_name_array
= (const char **)
1122 xmalloc (sizeof (const char *) * allocated_archive_names
);
1127 /* Decode options. */
1129 decode_options (argc
, argv
);
1130 name_init (argc
, argv
);
1132 /* Main command execution. */
1134 if (volno_file_option
)
1135 init_volume_number ();
1137 switch (subcommand_option
)
1139 case UNKNOWN_SUBCOMMAND
:
1141 _("You must specify one of the `-Acdtrux' options")));
1143 case CAT_SUBCOMMAND
:
1144 case UPDATE_SUBCOMMAND
:
1145 case APPEND_SUBCOMMAND
:
1149 case DELETE_SUBCOMMAND
:
1150 delete_archive_members ();
1153 case CREATE_SUBCOMMAND
:
1155 init_total_written ();
1161 print_total_written ();
1164 case EXTRACT_SUBCOMMAND
:
1166 read_and (extract_archive
);
1169 case LIST_SUBCOMMAND
:
1170 read_and (list_archive
);
1173 case DIFF_SUBCOMMAND
:
1175 read_and (diff_archive
);
1179 if (volno_file_option
)
1180 closeout_volume_number ();
1182 /* Dispose of allocated memory, and return. */
1184 free (archive_name_array
);
1187 if (exit_status
== TAREXIT_FAILURE
)
1188 error (0, 0, _("Error exit delayed from previous errors"));