1690 Commits

Author SHA1 Message Date
Sergey Poznyakoff
b94eed6d03 Version 1.20.
* configure.ac: Raise version number to 1.20
* src/compare.c (diff_dumpdir): const.
* src/common.h (dumpdir_t,dumpdir_iter_t): New data types.
(dumpdir_create0,dumpdir_create,dumpdir_free,dumpdir_locate)
(dumpdir_first,dumpdir_next): New functions.
* src/incremen.c (dumpdir_create0,dumpdir_create,dumpdir_free)
(dumpdir_first,dumpdir_next): New functions.
(dumpdir_locate): Rewrite using binary search.
(struct directory): Change members char *contents, *icontents to
struct dumpdir *dump, *idump. All references updated.
(note_directory): Last arg is const.
* src/names.c (add_hierarchy_to_namelist): buffer is const.
* tests/incr03.at, tests/incr04.at, tests/rename02.at,
tests/rename03.at: Insert calls to sleep between creation of files
and adding them to the archive.
2008-05-05 21:30:57 +00:00
Sergey Poznyakoff
192860abb8 Update 2008-03-31 08:03:00 +00:00
Sergey Poznyakoff
c2d2e806a1 (dump_file0): Count links only for actually dumped files 2008-03-31 08:02:53 +00:00
Sergey Poznyakoff
2a89f7a0a8 * NEWS: Document --no-check-device and --check-device.
* doc/rendition.texi: Change the way FIXME-*refs are handled in
!PROOF.
* doc/intern.texi, doc/tar.texi: Update.
* doc/untabify.el: New file.
* doc/Makefile.am (EXTRA_DIST): Add untabify.el
(untabify, final, check-format, check-refs, check-fixmes)
(check-unrevised, all-check-docs, check-docs): New rules.
2008-03-27 10:11:05 +00:00
Sergey Poznyakoff
71d2a66f42 * src/common.h (check_device_option): New global.
* src/incremen.c (procdir): Use boolean and instead of bitwise
one. Patch by Jean-Louis Martineau.
Compare device numbers only if check_device_option is set.
* src/tar.c: New command line options --no-check-device and
--check-device. Proposed by Jean-Louis Martineau.
(parse_opt): Hanlde new options.
(decode_options): Initialize check_device_option to true.
2008-03-27 08:56:26 +00:00
Sergey Poznyakoff
e496c1b529 * bootstrap: Use rsync to get translations.
* doc/tar.texi: Minor change.
* lib/.cvsignore: Update
* po/.cvsignore: Update
* src/system.c: Remove include setenv.h.
* tests/atlocal.in (STAR_DATA_URL): Update.
* tests/star/README: Update URL.
2008-03-06 08:17:33 +00:00
Sergey Poznyakoff
6667fa7fb8 Update 2008-02-09 10:36:40 +00:00
Sergey Poznyakoff
a16ad3112e Fix a typo 2008-02-09 10:35:55 +00:00
Sergey Poznyakoff
7efe3850f6 * NEWS: Update.
* configure.ac: Version 1.19.90
* po/POTFILES.in: Add missing files.
* src/compare.c (verify_volume): Honor --ignore-zeros.
Proposed by Jan-Benedict Glaw.
* tests/shortfile.at (AT_KEYWORDS): Add shortfile0.
2008-02-08 14:12:22 +00:00
Sergey Poznyakoff
d0694ee604 Update the description 2008-02-08 10:32:15 +00:00
Sergey Poznyakoff
37f0faf1c0 (dump_file0): Apply transform_name to symlink targets. 2008-02-07 15:46:41 +00:00
Sergey Poznyakoff
b893aee6d2 Update 2008-02-07 15:46:28 +00:00
Sergey Poznyakoff
f60d655908 Update 2008-02-04 10:39:05 +00:00
Sergey Poznyakoff
549481a0a7 Update 2008-02-04 10:38:27 +00:00
Sergey Poznyakoff
e08afc2002 Document changes to the --transform option. 2008-02-04 10:38:18 +00:00
Sergey Poznyakoff
338591a486 Support multiple --transform options. Support semicolon-separated lists of replace expressions. 2008-02-04 10:35:20 +00:00
Paul Eggert
c0e0d06e69 * doc/tar.texi: Update Back-Cover text to reflect new GNU wording.
2007-12-17  Paul Eggert  <eggert@cs.ucla.edu>

Exit with nonzero status if a close fails on an archive.
Problem (and initial trivial fix)
* src/buffer.c (close_archive, new_volume): close_error, not close_warn.
2008-01-31 00:50:12 +00:00
Sergey Poznyakoff
6e85425618 Update 2007-12-05 09:48:37 +00:00
Sergey Poznyakoff
336519aa4f Add shortupd.at. 2007-12-05 09:45:35 +00:00
Sergey Poznyakoff
5f4d99491d (check_compressed_archive): Do not bail out if the
file is too short, set boolean flag, passed as an argument
instead.  This fixes a bug introduced on 2007-08-24. See also
tests/shortupd.at.
2007-12-05 09:45:22 +00:00
Paul Eggert
48d83be336 Don't read from name[-1].
* src/incremen.c (make_directory): Handle namelen == 0, since
find_directory_meta calls make_directory ("").
2007-11-13 07:01:26 +00:00
Sergey Poznyakoff
60d351cc5a Update 2007-11-07 08:48:39 +00:00
Sergey Poznyakoff
e33be3d0a1 Add fseeko and snprintf. 2007-11-07 08:48:28 +00:00
Sergey Poznyakoff
32562b9412 (checkout): Use URL of the gnulib CVS mirror. 2007-11-07 08:48:19 +00:00
Sergey Poznyakoff
dfd87ba1d0 (magic): Fix lzma option 2007-10-31 13:10:55 +00:00
Sergey Poznyakoff
5d4a682a55 Update 2007-10-31 12:57:04 +00:00
Sergey Poznyakoff
8e3a2a520d (sys_exec_info_script,sys_exec_checkpoint_script): pass the current blocking factor in TAR_BLOCKING_FACTOR environment variable. 2007-10-31 12:56:46 +00:00
Sergey Poznyakoff
745832a280 New actions: bell and ttyout 2007-10-31 12:56:27 +00:00
Sergey Poznyakoff
458efab23b Minor fix 2007-10-30 14:58:52 +00:00
Sergey Poznyakoff
23dcaa117f Update 2007-10-30 14:09:20 +00:00
Sergey Poznyakoff
5099ddf6cc Document --hard-dereference and --checkpoint-action options. Improve documentation of --check-links. 2007-10-30 14:09:04 +00:00
Sergey Poznyakoff
8476145508 Use texi2html and the CVS version of gendocs.sh to create HTML versions of the manual 2007-10-30 14:08:41 +00:00
Sergey Poznyakoff
362492fe70 Use texi2html and the CVS version of gendocs.sh to create HTML versions of the manual 2007-10-30 14:08:21 +00:00
Sergey Poznyakoff
7111008659 Update 2007-10-29 16:57:32 +00:00
Sergey Poznyakoff
ec4741d732 (parse_opt): New options --hard-dereference, --checkpoint-action.
(decode_options): Call checkpoint_finish_compile.
2007-10-29 16:56:56 +00:00
Sergey Poznyakoff
bed7de0271 (sys_exec_checkpoint_script): New function.
(sys_exec_info_script): Restore SIGPIPE handler.
2007-10-29 16:56:33 +00:00
Sergey Poznyakoff
eaaadcfd36 (file_count_links): do nothing if hard_dereference_option is set. 2007-10-29 16:56:13 +00:00
Sergey Poznyakoff
a8830fbb86 (enum checkpoint_style): Remove.
(checkpoint_style): Remove.
(DEFAULT_CHECKPOINT): New define.
(hard_dereference_option): New variable.
(sys_exec_checkpoint_script): New declaration.
2007-10-29 16:55:58 +00:00
Sergey Poznyakoff
848659f1c6 (checkpoint, do_checkpoint): Remove.
(_flush_write, simple_flush_read, _gnu_flush_read): Use
checkpoint_run.
2007-10-29 16:55:37 +00:00
Sergey Poznyakoff
17cbd4862c checkpoint handling 2007-10-29 16:55:16 +00:00
Sergey Poznyakoff
64ded9e702 (tar_SOURCES): add checkpoint.c 2007-10-29 16:54:51 +00:00
Sergey Poznyakoff
ccd0a527e4 Version 1.19.1 2007-10-29 16:54:38 +00:00
Sergey Poznyakoff
3f869877a4 Version 1.19.1 2007-10-29 16:53:28 +00:00
Sergey Poznyakoff
8c528937a9 Update 2007-10-29 16:53:20 +00:00
Sergey Poznyakoff
460f4ec146 Update 2007-10-29 08:53:58 +00:00
Sergey Poznyakoff
eb59c14a1f (sys_exec_info_script): Initialize buf. Problem reported by Bengt-Arne Fjellner. 2007-10-29 08:51:46 +00:00
Paul Eggert
3c4f4ca423 Avoid compiler warnings.
* src/list.c (read_header_primitive): Define two locals, to
avoid incorrect "may be used uninitialized" warnings.
* src/incremen.c (procdir): Remove decl of unused local, "len".

expired.
SCALAR(0x830b08c)
2007-10-18 21:36:38 +00:00
Sergey Poznyakoff
506b4db5d0 Update 2007-10-18 07:59:48 +00:00
Sergey Poznyakoff
5bfb6c5f9d (gzip): Remove compression patent warning. According to Brett Smith, the patent is expired. 2007-10-18 07:59:39 +00:00
Sergey Poznyakoff
3725b5606f Update 2007-10-17 09:12:54 +00:00
Sergey Poznyakoff
d1a7eebc30 Update 2007-10-17 09:12:03 +00:00
Sergey Poznyakoff
dfe280dcca Add Lasse Collin and Jean-Pierre Demailly. 2007-10-17 09:11:50 +00:00
Sergey Poznyakoff
620a136e74 New options --auto-compress (-a) and --lzma 2007-10-17 09:11:34 +00:00
Sergey Poznyakoff
3fb5d67b28 (set_comression_program_by_suffix): New prototype. 2007-10-17 09:11:23 +00:00
Sergey Poznyakoff
c30a794679 (magic): Add an entry for new lzma format. Proposed by Lasse Collin 2007-10-17 09:11:08 +00:00
Sergey Poznyakoff
00bb0d8f5c Add suffix.c 2007-10-17 09:10:46 +00:00
Sergey Poznyakoff
af3e05b6af New file. Determine compression algorithm by archive file name suffix. Suggested by Jean-Pierre Demailly. 2007-10-17 09:10:34 +00:00
Paul Eggert
6060d613d1 * src/utf8.c (string_ascii_p): Recode to avoid bogus GCC 4.2.1
warning about "comparison is always true due to limited range of
data type" when char is unsigned.
2007-10-13 05:49:18 +00:00
Paul Eggert
3f12066739 Adjust to recent gnulib changes.
* configure.ac: Dont' check for strerror, since gnulib now does this.
* .cvsignore: Add m4, tar-[0-9]*.
* lib/.cvsignore: Adjust to various gnulib file name changes.
Add .deps, rmt-command.h.

SCALAR(0x830b0dc)
directories.

SCALAR(0x831ad2c)
2007-10-11 22:04:44 +00:00
Sergey Poznyakoff
3b74fbfc3b Update 2007-10-10 11:04:25 +00:00
Sergey Poznyakoff
14d39a2c14 Update 2007-10-10 11:03:42 +00:00
Sergey Poznyakoff
7b57922073 Version 1.19 2007-10-10 11:03:14 +00:00
Sergey Poznyakoff
05c6da4c62 Update 2007-10-05 11:21:40 +00:00
Sergey Poznyakoff
4ece30109d (dump_regular_file): Fix file padding in case of truncation to zero size. 2007-10-05 11:20:27 +00:00
Sergey Poznyakoff
55f1eadbf2 Update 2007-10-04 07:16:52 +00:00
Sergey Poznyakoff
9b22262fc6 Use AT_DATA for sample output. 2007-10-04 07:16:39 +00:00
Sergey Poznyakoff
2de140fa95 Update 2007-10-03 20:18:47 +00:00
Sergey Poznyakoff
6f6864df13 (try_purge_directory): Ensure that arguments to T and R are safe. 2007-10-03 20:18:32 +00:00
Sergey Poznyakoff
519a7c0c75 Update 2007-09-29 00:48:08 +00:00
Sergey Poznyakoff
1ef212d0fb (obstack_code_rename): Apply safer_name_suffix to name arguments before storing them in T and R records. Reported by Nicholas Cole. 2007-09-29 00:47:59 +00:00
Sergey Poznyakoff
333780b227 Update 2007-09-27 09:16:38 +00:00
Sergey Poznyakoff
2c56ca0e7f Raise version number to 1.18.90 2007-09-27 09:16:24 +00:00
Sergey Poznyakoff
63f8de655b Update 2007-09-27 08:05:38 +00:00
Sergey Poznyakoff
2743e1ba5b Document version 2 2007-09-27 08:05:31 +00:00
Sergey Poznyakoff
40ece6bf4d Update 2007-09-26 22:08:51 +00:00
Sergey Poznyakoff
63e835f5c0 New option --exclude-vcs
(exclude_vcs_files): New function
2007-09-26 22:08:36 +00:00
Sergey Poznyakoff
efe6609cd9 (struct directory): New member tagfile
(make_directory): Initialize tagfile to NULL
(procdir): New argument: entry
Hanlde exclusion tags.
(makedumpdir): Take into account directory->tagfile.
(scan_directory): Hanlde exclusion tags.
2007-09-26 22:08:13 +00:00
Sergey Poznyakoff
b0d5935cb0 (exclusion_tag_warning, check_exclusion_tags): Remove static qualifier.
(check_exclusion_tags): account for dirname without terminating
slash.
(dump_dir0): exclusion_tag_all is handled elsewhere.
2007-09-26 22:07:44 +00:00
Sergey Poznyakoff
a1b1b7cc8a (exclusion_tag_warning, check_exclusion_tags): New prototypes 2007-09-26 22:06:43 +00:00
Sergey Poznyakoff
8940247418 Update 2007-09-26 22:06:24 +00:00
Paul Eggert
0dacafbbb0 * AUTHORS: Remove unnecessary information. Just list the
principal authors.
* THANKS: Remove info duplicated from AUTHORS.

SCALAR(0x82892dc)


SCALAR(0x8279918)

SCALAR(0x8289444)


stripping and name suffix normalization.
2007-09-14 21:00:37 +00:00
Sergey Poznyakoff
e3e50c987b Minor rewording 2007-09-08 08:49:35 +00:00
Sergey Poznyakoff
923f0cda43 Update 2007-08-26 09:02:09 +00:00
Sergey Poznyakoff
c485b7984d (apply_nonancestor_delayed_set_stat): Rename st->sb to avoid shadowing another local. 2007-08-26 09:01:38 +00:00
Sergey Poznyakoff
d769b724f4 (diff_dumpdir): Rename stat->stat_data to avoid shadowing the syscall. 2007-08-26 09:01:08 +00:00
Sergey Poznyakoff
a0eb52da3f (check_exclusion_tags): Remove declaration of unused local, "ret". 2007-08-26 08:59:28 +00:00
Sergey Poznyakoff
87ac3207fb Don't include <getline.h>. No longer needed. 2007-08-26 08:59:08 +00:00
Sergey Poznyakoff
c634f2c6f1 Raise version number to 1.18.1 2007-08-24 12:23:19 +00:00
Sergey Poznyakoff
5416153391 Update 2007-08-24 12:08:58 +00:00
Sergey Poznyakoff
5bb69a88d8 Add shortfile.at 2007-08-24 12:08:47 +00:00
Sergey Poznyakoff
0a848ff669 New test case for the today's change in src/buffer.c (1.111) 2007-08-24 12:08:35 +00:00
Sergey Poznyakoff
7c0b81cbb9 (check_compressed_archive): Detect files smaller than 512 bytes. 2007-08-24 12:07:32 +00:00
Sergey Poznyakoff
862770bf91 Update 2007-08-19 09:17:32 +00:00
Sergey Poznyakoff
89d682d0b9 Gnulib initialization destroyed paxutils m4 files.
Initialize paxutils structure after that of gnulib.
2007-08-19 09:17:21 +00:00
Sergey Poznyakoff
764174dc1d Update 2007-08-12 08:25:35 +00:00
Sergey Poznyakoff
5ab30f709a (symlink_to_gnulib): Make sure the target directory exists and create it if it does not. 2007-08-12 08:25:27 +00:00
Sergey Poznyakoff
e2b8c8fa9f (contains_dot_dot): Fix double-dot recognition in case of duplicate /. Patch by Dmitry V. Levin. 2007-08-12 08:25:00 +00:00
Sergey Poznyakoff
42250f5010 Update 2007-08-12 07:15:11 +00:00
Sergey Poznyakoff
62571aa7c3 Fix a typo 2007-08-12 07:14:29 +00:00
Sergey Poznyakoff
32f7047037 Update 2007-06-29 20:23:05 +00:00
Sergey Poznyakoff
a69be0adce Add to the repository 2007-06-29 20:22:48 +00:00
Sergey Poznyakoff
1fb35e7374 Final update for GPLv3 2007-06-29 20:20:02 +00:00
Sergey Poznyakoff
7e69b14775 Update 2007-06-28 17:01:18 +00:00
Sergey Poznyakoff
625c45d304 Update for the change of the TP URL 2007-06-28 17:00:35 +00:00
Sergey Poznyakoff
3fe0f0d7f8 Update 2007-06-27 14:06:55 +00:00
Sergey Poznyakoff
c3d4fee823 Restore after an accidental remove 2007-06-27 13:46:15 +00:00
Sergey Poznyakoff
a0fb51e136 Relicense under GPLv3 2007-06-27 13:30:12 +00:00
Sergey Poznyakoff
ac8690fc4e Update copyright year 2007-06-21 08:52:22 +00:00
Sergey Poznyakoff
395df04927 Update 2007-06-21 08:51:15 +00:00
Sergey Poznyakoff
89a91c7b44 Skip test if genfile is unable to create the file 2007-06-21 08:51:03 +00:00
Sergey Poznyakoff
5635a428ab (AT_TAR_MKHIER): Skip test if genfile is unable to create the file 2007-06-21 08:50:09 +00:00
Sergey Poznyakoff
8b5f10a6c4 Resolve testsuite failures 40-42 on cygwin. 2007-06-21 07:12:09 +00:00
Sergey Poznyakoff
6e98015774 Update 2007-06-16 12:10:24 +00:00
Sergey Poznyakoff
bd13e18a63 Add back write permissions on dir 2007-06-16 12:10:14 +00:00
Sergey Poznyakoff
01cf5c5315 New file 2007-06-16 12:09:59 +00:00
Sergey Poznyakoff
0dd814fac2 (Fixing Snapshot Files): New appendix 2007-06-16 12:09:50 +00:00
Sergey Poznyakoff
b27b516b68 (tar_TEXINFOS): Add tar-snapshot-edit.texi 2007-06-16 12:09:34 +00:00
Sergey Poznyakoff
c7f69c265b Update 2007-06-09 17:07:54 +00:00
Sergey Poznyakoff
bc00f45420 Sort the output 2007-06-09 17:07:46 +00:00
Paul Eggert
57304e8b0a Fix typo: occurence -> occurrence. 2007-06-08 18:49:19 +00:00
Sergey Poznyakoff
d3f04456e8 Raise version number to 1.17 2007-06-08 09:34:18 +00:00
Sergey Poznyakoff
d78083e82c Update 2007-06-08 08:27:40 +00:00
Sergey Poznyakoff
c8d4ceccc1 (Operation Summary): Restore alphabetical order of the options. 2007-06-08 08:27:32 +00:00
Sergey Poznyakoff
6287d3045f Update 2007-06-08 08:15:41 +00:00
Sergey Poznyakoff
9d3142805b s/(ASCII|ID|BSD)/@acronym{&}/;s/"[^"]+"/``&''/
Use `path' only when it refers to search paths, use
`file name' otherwise.
Fix various errors (based on patch by Benno Schulenberg)
2007-06-08 08:14:12 +00:00
Sergey Poznyakoff
05eddc1a58 Update testsuite 2007-06-01 21:57:30 +00:00
Sergey Poznyakoff
78bfbb5661 Update 2007-06-01 21:24:41 +00:00
Sergey Poznyakoff
fe576585e6 (decode_xform): Exempt symbolic links from component
stripping and name suffix normalization.
2007-06-01 21:24:30 +00:00
Sergey Poznyakoff
080a6b2ac5 Update calls to transform_member_name 2007-06-01 21:24:08 +00:00
Sergey Poznyakoff
f236f33643 (xform_type): New data type
(transform_member_name): Last argument is of xform_type type
All callers updated
2007-06-01 21:23:53 +00:00
Sergey Poznyakoff
a4ffcfb875 Update 2007-05-30 19:15:32 +00:00
Sergey Poznyakoff
967fcb9318 (decx): Unknown pax keywords produce a warning,not error. 2007-05-30 19:15:17 +00:00
Paul Eggert
12b3a5d5b1 * src/misc.c (set_file_atime): Use gl_futimens, not futimens,
due to gnulib change.

SCALAR(0x828a248)

SCALAR(0x828a404)
2007-05-29 16:48:23 +00:00
Sergey Poznyakoff
eeb610da48 Update 2007-05-19 17:04:34 +00:00
Sergey Poznyakoff
749e20e6fa Update 2007-05-19 17:03:59 +00:00
Sergey Poznyakoff
56f6556f94 (tarball_prereq): Discard eventual md5sum output. 2007-05-19 17:03:44 +00:00
Sergey Poznyakoff
43c5343194 Minor fix 2007-05-19 17:03:35 +00:00
Sergey Poznyakoff
250db35f17 Global extended_header removed, use new xheader calls instead. 2007-05-19 17:03:28 +00:00
Sergey Poznyakoff
6f929b2c89 (buffer_write_global_xheader): New function
Update to use new xheader calls.
2007-05-19 17:03:01 +00:00
Sergey Poznyakoff
64cddf2fbc (xheader_init): New function
(xheader_decode_global,xheader_store,xheader_read)
(xheader_write_global,xheader_write,xheader_string_begin)
(xheader_string_add,xheader_string_end): Take xhdr as first
argument.
2007-05-19 17:02:46 +00:00
Sergey Poznyakoff
ccdbafb276 (struct xheader): New definition
(struct tar_stat_info): New member xhdr (extended header).
2007-05-19 17:02:29 +00:00
Sergey Poznyakoff
bd222d606a (buffer_write_global_xheader): New function
(struct xheader): Move definition to tar.h
(extended_header): Remove global
(xheader_init): New function
(xheader_decode_global,xheader_store,xheader_read)
(xheader_write_global,xheader_write,xheader_string_begin)
(xheader_string_add,xheader_string_end): Take xhdr as first
argument.
2007-05-19 17:02:13 +00:00
Sergey Poznyakoff
94fb06f5db Fix typos 2007-05-18 09:14:54 +00:00
Sergey Poznyakoff
74d217db74 Update 2007-05-18 08:22:33 +00:00
Sergey Poznyakoff
17ef61b2fd (dump_file0): Original ctime cannot be used as a directory change indicator if --remove-files is given. 2007-05-18 08:22:21 +00:00
Paul Eggert
f32828d577 Adjust to latest Gnulib.
* lib/.cvsignore: Add dirfd.c, dirfd.h, float+.h, mbscasecmp.c,
stdio.h, stdio_.h, stdlib.h, stdlib_.h, time.h, time_.h, unistd.h.
Remove exit.h, getcwd.h, mempcpy.h, memrchr.h, mkdtemp.h, stpcpy.h,
strcase.h, strchrnul.h, strdup.h, strndup.h, strnlen.h, time_r.h,
vsnprintf.h.
* m4/.cvsignore: Remove localedir.h.  Sort.
2007-04-13 00:51:07 +00:00
Sergey Poznyakoff
e67e085421 Update 2007-04-03 21:52:52 +00:00
Sergey Poznyakoff
ca856c2585 (main): Don't call closeopen. 2007-04-03 21:52:42 +00:00
Sergey Poznyakoff
18641602c1 Don't include <sys/time.h>, <sys/resource.h>; no longer needed. 2007-04-03 21:52:20 +00:00
Sergey Poznyakoff
8bdbc08a89 (closeopen): Remove decl. 2007-04-03 21:52:01 +00:00
Sergey Poznyakoff
a5d5cc599f Update 2007-04-03 21:38:40 +00:00
Sergey Poznyakoff
761895d43c Update 2007-04-03 21:38:14 +00:00
Sergey Poznyakoff
5d4f057e31 (sys_exec_info_script): Store the inter-communication fd in the environment variable TAR_FD 2007-04-03 21:38:00 +00:00
Sergey Poznyakoff
7c0ba663c8 Update 2007-04-03 12:31:24 +00:00
Sergey Poznyakoff
51118be241 Expect a warning on stderr 2007-04-03 12:30:43 +00:00
Sergey Poznyakoff
69f5d77383 Update 2007-04-03 12:18:53 +00:00
Sergey Poznyakoff
d989864712 (main): Move closeopen after decode_options to allow shell process substitution to work. 2007-04-03 12:18:40 +00:00
Sergey Poznyakoff
983d328ff2 Restore accidentally deleted lines 2007-03-30 19:28:22 +00:00
Sergey Poznyakoff
586c684815 (transform_name_fp): Change signature. All callers updated. 2007-03-30 19:20:52 +00:00
Sergey Poznyakoff
bbf7dec45e Fix indentation 2007-03-30 19:19:56 +00:00
Sergey Poznyakoff
40f79286ab Update 2007-03-30 19:18:46 +00:00
Sergey Poznyakoff
ebc522d521 (all_names_found): Remove check for matching_flags. 2007-03-30 19:18:35 +00:00
Sergey Poznyakoff
ad85f632c6 (transform_member_name): New function
(decode_header): Use transform_member_name
2007-03-30 19:18:24 +00:00
Sergey Poznyakoff
062b37115f (extract_link, extract_symlink): Use
transform_member_name instead of safer_name_suffix so that
--transform and --strip-components affect links as well.
2007-03-30 19:18:10 +00:00
Sergey Poznyakoff
6261c58ae8 (transform_name_fp): Change signature
(transform_member_name): New function
2007-03-30 19:17:44 +00:00
Sergey Poznyakoff
427bda01a3 Update 2007-03-30 08:50:21 +00:00
Sergey Poznyakoff
1d26fff0f3 Do not include mkdtemp.h 2007-03-30 08:50:08 +00:00
Sergey Poznyakoff
bb6b92e37d (slurp): Remove any occurrences of $bt from the generated gnulib.mk 2007-03-30 08:49:56 +00:00
Sergey Poznyakoff
8ca4064a8c Update 2007-03-30 08:49:38 +00:00
Paul Eggert
5c890a6003 Adjust to recent gnulib changes.
* lib/.cvsignore: Add fchownat.c, rmt-command.h, strerror.c, string.h,
string_.h, sys, sys_time_.h, unistd_.h, wchar_.h, wctype_.h.
Remove localedir.h, size_max.h, xsize.h.
* src/xheader.c: Don't include stpcpy.h; no longer needed, now that
gnulib string.h defines stpcpy on all platforms.
2007-01-26 23:02:40 +00:00
Sergey Poznyakoff
3705fd6452 Update 2007-01-23 10:26:40 +00:00
Sergey Poznyakoff
bde442ba15 Add exclude.at 2007-01-23 10:26:30 +00:00
Sergey Poznyakoff
c9a8f1bc33 New test case 2007-01-23 10:26:20 +00:00
Sergey Poznyakoff
66e9b9cd6c New options --exclude-caches-all, --exclude-caches-under, --exclude-tag-all, --exclude-tag-under 2007-01-23 10:25:21 +00:00
Sergey Poznyakoff
b9588c4722 (struct exclude_tag): rename to exclusion_tag
(check_exclusion_tags): New function
(cachedir_file_p): New function (from check_cache_directory)
(dump_dir0,dump_file0): Use check_exclusion_tags
2007-01-23 10:25:06 +00:00
Sergey Poznyakoff
9a41b3b3db (exclude_caches_option): Remove
(enum exclusion_tag_type): New data type
(add_exclude_tag): Rename to add_exclusion_tag
(cachedir_file_p): New prototype
2007-01-23 10:24:43 +00:00
Sergey Poznyakoff
990e7d4437 Document --exclude-caches* and --exclude-tag* options. 2007-01-23 10:24:19 +00:00
Sergey Poznyakoff
173d3229e3 Update 2007-01-19 15:43:13 +00:00
Sergey Poznyakoff
2d261da8f9 Version 1.16.2 2007-01-19 15:42:43 +00:00
Sergey Poznyakoff
99527fa17b (sparse_skip_file,pax_dump_header_1)
(pax_decode_header): Keep track of the number of bytes written.
2007-01-19 15:42:26 +00:00
Sergey Poznyakoff
868ee74028 (expand_sparse): use ftruncate to handle the trailing hole 2007-01-19 15:41:55 +00:00
Sergey Poznyakoff
8c90bf0414 Fix typos 2007-01-19 15:41:39 +00:00
Sergey Poznyakoff
892cdea8a1 Require strerror 2007-01-19 15:41:32 +00:00
Sergey Poznyakoff
00763876f1 Update 2007-01-04 20:06:33 +00:00
Sergey Poznyakoff
1a1cfaafa6 (list_dumpdir): Minor fixes. 2007-01-04 20:05:32 +00:00
Sergey Poznyakoff
445d95be07 (diff_dumpdir): Compare directory contents using
dumpdir_cmp.  Do not free dumpdir_buffer, it will leave the
incremental directory table in the inconsistent state and trigger
full dump.
(read_and_process): Process dumpdirs no matter what the archive
format.
2007-01-04 20:05:05 +00:00
Sergey Poznyakoff
6fe55234c9 Update 2007-01-04 16:16:00 +00:00
Sergey Poznyakoff
e24d8574a8 (read_and_process): Fix type of "size" 2007-01-04 16:15:10 +00:00
Sergey Poznyakoff
4da5205ed6 Update 2006-12-13 08:22:18 +00:00
Sergey Poznyakoff
8241687465 Skip the test if genfile is not able to create the filename with an embedded newline. 2006-12-13 08:22:04 +00:00
Paul Eggert
8e3f3adf98 Port to Forte Developer 7 C 5.4 and C99.
* src/common.h (add_exclude_tag): Add decl; C99 requires this
and Forte warns about it.
* src/incremen.c: Include <mkdtemp.h> for mkdtemp prototype,
for same reason.
* src/misc.c (get_max_open_files): Rewrite to avoid code that
Forte C complains about as being unreachable.
* src/xheader.c (mtime_code): Rewrite to avoid Forte error
reported by Trond Hasle Amundsen.

* src/incremen.c (compare_dirnames): Rewrite to avoid casts.
* src/utf8.c (string_ascii_p): Likewise.
* src/xheader.c (mtime_coder, volume_size_coder, volume_offset_coder):
Likewise.

SCALAR(0x8283218)
2006-12-12 23:56:24 +00:00
Sergey Poznyakoff
e5ef01710a Fix wording 2006-12-08 16:59:56 +00:00
Sergey Poznyakoff
e70e63612a Update 2006-12-08 16:45:34 +00:00
Sergey Poznyakoff
28b26242c7 Add paxutils files to dot_ignore. 2006-12-08 16:45:09 +00:00
Sergey Poznyakoff
6b279a6f8c Update 2006-12-08 13:40:15 +00:00
Sergey Poznyakoff
079f2d6807 Raise version number to 1.16.1 2006-12-08 13:40:07 +00:00
Sergey Poznyakoff
b09417ca8d (slurp): Create .(cvs|git)ignore if not present 2006-12-08 13:39:58 +00:00
Sergey Poznyakoff
b15e3f1bbd Remove autogenerated files 2006-12-08 12:42:32 +00:00
Sergey Poznyakoff
1616b1d1b4 Update 2006-12-07 14:35:13 +00:00
Sergey Poznyakoff
f23bc997fd Update 2006-12-07 14:34:48 +00:00
Sergey Poznyakoff
8ec119a27f Update 2006-12-07 14:34:28 +00:00
Sergey Poznyakoff
e35d05b1d2 Use genfile instead of dd, because on some systems /dev/zero is not available. 2006-12-07 14:34:15 +00:00
Sergey Poznyakoff
cdb77dcd7b (extract_file): Call skip_member if open fails.
Patch proposed by Jan-Benedict Glaw <jbglaw@lug-owl.de>
2006-12-07 14:33:54 +00:00
Sergey Poznyakoff
9bf87b195e (dump_dir0): Move checks for exclude tags to
dump_file0.
(dump_dir): Move calls to ensure_slash to dump_file0
2006-12-07 14:33:42 +00:00
Sergey Poznyakoff
643e3f2441 Update documentation of --exclude-tag 2006-12-07 14:33:30 +00:00
Sergey Poznyakoff
6e75833cb7 (distclean-local): Fixed 2006-12-07 14:33:17 +00:00
Paul Eggert
908d78d208 * NEWS: Fix some race conditions with tar -x --same-owner.
* src/extract.c (ARCHIVED_PERMSTATS): Add a comment saying that
S_IRWXG | S_IRWXO might be masked out.
(set_mode): Set the mode if some bits were masked out originally.
(set_stat): Don't chmod before chown, as that might temporarily
grant permissions that we don't want to grant.  The chmod was
there only to work around broken hosts, so add a comment advising
users not to use those broken hosts instead.
(repair_delayed_set_stat, extract_dir):
Remember to mask out current umask before inverting permissions.
(extract_dir): If the owner might change, or if the mode has
special bits, create the directory 700 at first, but restore it later.
(open_output_file): New arg mode; all uses changed.
(extract_file, extract_node, extract_fifo): If the owner might
change, omit group and other bits at first, but restore them after
changing the owner.
2006-12-04 21:35:56 +00:00
Paul Eggert
192f55e2a0 * doc/tar.texi (Long Options): Remove doubled word. 2006-12-04 09:33:31 +00:00
Sergey Poznyakoff
9d99fd13cd Update 2006-11-30 09:54:07 +00:00
Sergey Poznyakoff
07902e9f9a (xheader_read): Remove unused variable 2006-11-30 09:53:20 +00:00
Sergey Poznyakoff
0c94a109b9 Update 2006-11-30 09:42:59 +00:00
Sergey Poznyakoff
27094c4fc3 Implement --update-po and .bootstrap 2006-11-30 09:42:12 +00:00
Sergey Poznyakoff
5aca761e1b Remove src/mangle.c 2006-11-30 09:41:50 +00:00
Sergey Poznyakoff
cc82db7f2d (exclude): Document --exclude-tag 2006-11-30 09:41:42 +00:00
Sergey Poznyakoff
137ebf41fd (dump_dir0): Implement --exclude-tag option 2006-11-30 09:40:47 +00:00
Paul Eggert
49ea4c5057 * NEWS: Remove support for mangled names.
* doc/tar.texi (verbose tutorial): Likewise.
* src/Makefile.am (tar_SOURCES): Remove mangle.c.
* src/common.h (extract_mangle): Remove decl.
* src/extract.c (extract_mangle_wrapper): Remove.
(prepare_to_extract): Remove support for mangled names.
* src/list.c (read_and, print_header): Likewise.
* src/mangle.c: Remove.
* src/tar.h (GNUTYPE_NAMES): Remove.
2006-11-30 06:39:29 +00:00
Paul Eggert
409bddf38c * lib/.cvsignore: Add fstatat.c, gnulib.mk, openat-proc.c, same-inode.h, stat_.h,
tempname.c, tempname.h, uinttostr.c.
2006-11-30 06:27:24 +00:00
Paul Eggert
c930802f31 Port to latest gnulib. There were a lot of changes, so the
simplest way to get this up and running was to switch to coreutils
bootstrap procedure.  I noticed one feature missing after this
merge: the ability to update a single .po file.  I can add that
later if need be.
* README-cvs, bootstrap.conf: New files.
* lib/.cvsignore: Remove Makefile.am, printf-parse.c, vasnprintf.c.
* lib/printf-parse.c, lib/vasnprintf.c: New files, from coreutils,
to override gnulib, so that we don't need xsize.h.
* bootstrap: Replace with coreutils bootstrap, except add support
for paxutils.
* configure.ac (gl_USE_SYSTEM_EXTENSIONS): Remove, as gl_EARLY now
does this.
(gl_EARLY, gl_INIT): Add.
(tar_GNULIB): Remove.
* gnulib.modules: Add configmake.
* lib/Makefile.tmpl: Remove, replacing with....
* lib/Makefile.am: New file.
* src/Makefile.am (tar.o): Remove dependency: Automake does this
for us.
* src/tar.c: Include <configmake.h> and <rmt-command.h>, not
<localedir.h>.
2006-11-30 00:14:10 +00:00
Paul Eggert
ca14885884 Remove trailing white space. 2006-11-29 18:28:45 +00:00
Paul Eggert
01d6188297 Remove trailing white space. 2006-11-29 18:16:27 +00:00
Paul Eggert
759c5208c5 Remove trailing white space. 2006-11-29 18:11:34 +00:00
Sergey Poznyakoff
8457e06b99 Do not depend on command timing. 2006-11-13 10:42:19 +00:00
Sergey Poznyakoff
8719c4f680 Update 2006-11-13 10:41:47 +00:00
Sergey Poznyakoff
574022ab78 Do not use 'k' modifier in dd options. 2006-11-13 10:41:34 +00:00
Sergey Poznyakoff
304d8b9f0c (start_header): Pass mtime as a call-specific data to xheader_store. 2006-11-13 10:39:51 +00:00
Sergey Poznyakoff
6712656eb2 (mtime_coder): Treat non-null data as a pointer to struct timespec, overriding st->mtime 2006-11-13 10:39:15 +00:00
Sergey Poznyakoff
415d9c9e15 Update copyright year 2006-11-01 00:30:45 +00:00
Sergey Poznyakoff
1a8141ab8a Update 2006-11-01 00:24:44 +00:00
Sergey Poznyakoff
023c766600 Do not assume tar's default archive is stdout 2006-11-01 00:24:19 +00:00
Sergey Poznyakoff
fdb46aa2e2 Add more keywords 2006-11-01 00:24:09 +00:00
Sergey Poznyakoff
2504e7d3ae Add new test cases. 2006-11-01 00:23:52 +00:00
Sergey Poznyakoff
b0765e257c (enum read_file_list_state.file_list_skip): New value
(read_name_from_file): Skip zero-length entries
2006-11-01 00:23:24 +00:00
Sergey Poznyakoff
73d4c40a87 Update 2006-10-31 20:19:30 +00:00
Sergey Poznyakoff
7aed52718f Call last_component instead of base_name. The latter returns a malloced string since 2006-03-11. 2006-10-31 20:18:50 +00:00
Sergey Poznyakoff
f572ca0cfb Update 2006-10-21 16:48:08 +00:00
Sergey Poznyakoff
29236a68fa (distclean-local): New rule 2006-10-21 16:47:56 +00:00
Sergey Poznyakoff
a4b1564d4a Version 1.16 2006-10-21 16:47:42 +00:00
Sergey Poznyakoff
94d0385a57 Update 2006-10-17 08:14:06 +00:00
Sergey Poznyakoff
603c1d60a6 Fix help output formatting. Thanks Benno Schulenberg. 2006-10-17 08:13:43 +00:00
Sergey Poznyakoff
29e9004b69 Update 2006-10-16 07:51:40 +00:00
Sergey Poznyakoff
8da152d2b3 Update 2006-10-16 07:49:00 +00:00
Sergey Poznyakoff
00746182f3 (dist-hook): Create a cpio archive. 2006-10-16 07:48:51 +00:00
Sergey Poznyakoff
6c8815909d Update 2006-10-14 21:13:28 +00:00
Sergey Poznyakoff
fde336b21a (AT_KEYWORDS): Keyword `filechange'
Test tar exit status.
2006-10-14 21:12:42 +00:00
Sergey Poznyakoff
394b12d950 New test grow.at 2006-10-14 21:12:04 +00:00
Sergey Poznyakoff
372638ae7a Do not attempt to close stderr after call to close_stdout. 2006-10-14 21:11:43 +00:00
Sergey Poznyakoff
c455373e5b (dump_regular_file,dump_file0): Set exit_status to
TAREXIT_DIFFERS if the file being dumped was truncated or
otherwise changed.
2006-10-14 21:11:27 +00:00
Sergey Poznyakoff
f2541c66cd (Synopsis): Document tar exit codes. 2006-10-14 21:11:03 +00:00
Sergey Poznyakoff
7e6d54d0c0 Update 2006-10-14 10:48:14 +00:00
Sergey Poznyakoff
876e554157 (AT_KEYWORDS): Add stdout keyword 2006-10-14 10:46:24 +00:00
Sergey Poznyakoff
1118d24fd3 New test verbose.at 2006-10-14 10:46:13 +00:00
Sergey Poznyakoff
dc6f7ebf20 (_open_archive): Make sure stdlis is set to stderr
when we are writing archive to stdout (unless --index-file is
used). Bug introduced on 2006-07-06.
2006-10-14 10:45:44 +00:00
Sergey Poznyakoff
1102eeef1f Update 2006-10-02 15:45:08 +00:00
Sergey Poznyakoff
e8a4c35a73 Add new testcase: multiv05.at: 2006-10-02 15:44:52 +00:00
Sergey Poznyakoff
e359fad641 (xheader_string_end): Fix diagnostic message. 2006-10-02 15:44:20 +00:00
Sergey Poznyakoff
f5504a3bae (new_volume): Initialize current_block 2006-10-02 15:44:09 +00:00
Sergey Poznyakoff
341be8f405 Add Joerg Weilbier 2006-10-02 15:43:59 +00:00
Sergey Poznyakoff
4f2a22f306 Update 2006-09-27 09:03:23 +00:00
Sergey Poznyakoff
a76ab340dd (doc0, doc1, initialize_argp_doc): Removed. Rely on the new argp method instead 2006-09-27 09:03:13 +00:00
Sergey Poznyakoff
3ad3ca8734 Minor fix 2006-09-27 09:03:02 +00:00
Sergey Poznyakoff
82b2829e10 Use ${package} instead of hardcoding package name 2006-09-27 09:02:45 +00:00
Sergey Poznyakoff
f852428d5f Update 2006-09-12 09:59:08 +00:00
Sergey Poznyakoff
86e91a5bfc Fix typo 2006-09-12 09:56:39 +00:00
Paul Eggert
ec5743a628 * tests/testsuite.at (AT_TAR_MKHIER): Use install-sh -d
rather than the no-longer-included mkinstalldirs.
2006-09-08 23:29:43 +00:00
Paul Eggert
bf7f4fdc1e Add at-func.c, configmake.h, fchmodat.c,
fcntl.h, fcntl_.h, inttypes_.h, lstat.c, lstat.h.
2006-09-08 23:27:45 +00:00
Sergey Poznyakoff
98b9522499 Update 2006-09-08 16:47:15 +00:00
Sergey Poznyakoff
6398dbe1a5 List texinfo among build prerequisites for the CVS version. 2006-09-08 16:47:01 +00:00
Sergey Poznyakoff
37724f5e20 (try_purge_directory): Initialize struct st. Fix condition for selecting candidates for removal. 2006-09-08 16:45:41 +00:00
Sergey Poznyakoff
c8c351684c (intl_files_to_remove): Do not remove m4/inttypes-h.m4 and m4/inttypes-pri.m4 2006-09-08 15:17:56 +00:00
Paul Eggert
01b6fb98bf * bootstrap: Set XGETTEXT_OPTIONS to flag our printf-format functions,
so that translators are warned about strings that are formats but
don't look like formats.  This might help prevent core dumps.
* configure.ac (AM_GNU_GETTEXT): Upgrade to need-formatstring-macros.
Suggested by Eric Blake to avoid problems like
<http://lists.gnu.org/archive/html/bug-coreutils/2006-07/msg00087.html>.
(AM_GNU_GETTEXT_VERSION): Upgrade from 0.12.1 to 0.15.  The gettext
manual says we should use the version number normally expected of
maintainers, neither more nor less.
2006-08-11 21:39:36 +00:00
Paul Eggert
f1309bffbf * bootstrap (get_translations):
Don't exclude ky.po; it is working again.
2006-08-11 07:44:21 +00:00
Paul Eggert
c732eb584e * bootstrap: Don't exclude ja.po; it is working again.
Don't remove all old .po files if we're merely updating one.
* po/.cvsignore: Add Makevars.
2006-08-09 18:30:16 +00:00
Paul Eggert
0680ad4d42 * src/tar.c: Work around limitation imposed by gettext 0.15
by concatenating strings with "\v" after translation.
(doc): Remove, splitting into:
(doc0, doc1): New constants.
(argp): Don't use doc; just initialize to NULL.
(initialize_argp_doc): New function.
(decode_options): Use it.
2006-08-08 05:28:32 +00:00
Paul Eggert
1942370acd Fix typo: remove po/tar.html. 2006-08-07 22:58:12 +00:00
Paul Eggert
94de7c4c77 * bootstrap: Redo po file retrieval to match Bison's method,
since the translation project changed its index format.
Don't use --assume-autoconf; it's now replaced
by looking in configure.ac.
(m4/codeset.m4, m4/intdiv.m4, m4/inttypes-pri.m4, m4/isc-posix.m4):
(m4/lcmessage.m4, m4/onceonly_2_57.m4, m4/gettext.m4, m4/glibc21.m4):
(m4/inttypes_h.m4, m4/lib-ld.m4, m4/lib-prefix.m4, m4/po.m4):
(m4/stdint_h.m4, m4/uintmax_t.m4, m4/ulonglong.m4):
Don't rename to ..._gl.m4, as this is no longer needed.
(m4/geteext.m4): Patch to remove the need for intl/*.
Use autopoint manually, then remove the intl files,
then undo changes to gnulib files that autoreconf made,
and then run aclocal/autoconf/autoheader/automake.
This makes our bootstrap procedure closer to Bison's.
(po/Makevars): Generate automatically.
* configure.ac (AC_PREREQ): Update from 2.59 to 2.60.
(gl_AC_TYPE_INTMAX_T, jm_AC_TYPE_UINTMAX_T): Remove.
* gnulib.modules: Add inttypes, stdint.
* lib/.cvsignore: Add close-stream.c, close-stream.h,
stdint.h, stdint_.h.
* po/Makefile: Remove; now automatically generated.
2006-08-07 22:57:25 +00:00
Paul Eggert
05805868f2 (read_incr_db_01): Check input strings more
carefully.  Do not pass arbitrary char values to isspace, as
this has undefined behavior.  Likewise for assigning arbitrary
uintmax_t values to other types.
(read_negative_num, read_unsigned_num, read_timespec):
New functions, to check input values a bit more carefuly.
(read_num): Use read_unsigned_num.  New arg MAX_VAL;
all callers changed.
(read_incr_db_2): Use these new functions.
Use a consistent diagnostic for unexpected EOF.
(read_directory_file): Do not assign arbitrary uintmax_t value
to int.
(read_timespec, write_directory_file_entry, write_directory_file):
Handle negative time_t values correctly.  We don't bother to do
this with pre-2 formats, since presumably the time stamps were
output incorrectly.
2006-08-07 21:29:27 +00:00
Paul Eggert
57aa98047e gettext 0.15 rejects this. 2006-08-07 21:12:21 +00:00
Sergey Poznyakoff
7573967406 Update 2006-07-24 09:14:18 +00:00
Sergey Poznyakoff
ab8711413c Add append02.at 2006-07-24 09:14:00 +00:00
Sergey Poznyakoff
9fd9a0913d New test case 2006-07-24 09:13:44 +00:00
Sergey Poznyakoff
f4e4adea80 (to_chars_subst): Update comment regarding OLDGNU
vs. GNU format differences.
(mode_to_chars): Treat OLDGNU_FORMAT same as GNU_FORMAT. Fixes bug
reported by TAMUKI Shoichi <tamuki@linet.gr.jp>, which caused
equivalent `tar cf ...' and `tar rf ...' commands to produce
different archives.
2006-07-24 09:13:21 +00:00
Sergey Poznyakoff
7110641821 (decode_options): Do not require -L with -M -Hpax.
It could be needed in future, but currently it is not.
2006-07-24 09:12:55 +00:00
Paul Eggert
fce454b5ca * bootstrap: Adjust to today's change to gnulib-tool by invoking
it with --assume-autoconf='latest-stable'.
2006-07-20 16:57:31 +00:00
Paul Eggert
8ad985ea6c Adjust to recent gnulib changes.
* lib/.cvsignore: Remove atexit.c, exit.c, getndelim2.c, getndelim2.h,
pathmax.h, paxconvert.c, paxerror.h, xstrdup.c.
Add inttypes.h, mktime.c, wcwidth.h, xstrndup.c, xstrndup.h.
* src/create.c (start_header): Adjust to API change to mode_adjust.
2006-07-17 05:47:26 +00:00
Sergey Poznyakoff
37edfd9e8f Update 2006-07-09 11:26:46 +00:00
Sergey Poznyakoff
016f7c87a7 Update 2006-07-09 11:26:16 +00:00
Sergey Poznyakoff
52b8bea074 Add Ralf Wildenhues 2006-07-09 11:25:47 +00:00
Sergey Poznyakoff
5addfdcb03 Fix some typos 2006-07-09 11:25:18 +00:00
Sergey Poznyakoff
e707b47aba Fix entry ordering 2006-07-06 20:10:37 +00:00
Sergey Poznyakoff
76dc519f9f Update 2006-07-06 20:08:53 +00:00
Sergey Poznyakoff
2a00376816 (TESTSUITE_AT): Add indexfile.at 2006-07-06 20:08:20 +00:00
Sergey Poznyakoff
9766528b07 Include indexfile.at 2006-07-06 20:08:09 +00:00
Sergey Poznyakoff
f26a90783b New test case 2006-07-06 20:08:01 +00:00
Sergey Poznyakoff
36fe16aaf5 (decode_options): Initialize stdlis 2006-07-06 20:07:37 +00:00
Sergey Poznyakoff
89f1667fdb (_open_archive): Remove stdlis initialization 2006-07-06 20:05:30 +00:00
Sergey Poznyakoff
f2d65dda39 Update 2006-07-05 06:46:53 +00:00
Sergey Poznyakoff
8370746251 (FIXME): Do not use deprecated @quote-args.
Do not use @allow-recursion. In its current form the macro is not
recursive.
2006-07-05 06:46:32 +00:00
Sergey Poznyakoff
2614af6d3c (manual): Fix TEXINPUTS 2006-07-05 06:46:11 +00:00
Sergey Poznyakoff
614def3113 Update 2006-07-04 21:53:40 +00:00
Sergey Poznyakoff
b6365e9b03 Update 2006-07-04 21:52:53 +00:00
Sergey Poznyakoff
bf789e3642 Update --directory description 2006-07-04 21:52:34 +00:00
Sergey Poznyakoff
1421ee630d (main): Call closeopen 2006-07-04 21:52:14 +00:00
Sergey Poznyakoff
9869d0ae17 (chdir_arg): Use x2nrealloc to reallocate wd.
(get_max_open_files,closeopen): New functions
(chdir_do): Do not use save_cwd if it was already used more than
max_open_files-4 times to avoid running off the file
descriptors.
2006-07-04 21:52:05 +00:00
Sergey Poznyakoff
edc0b12c5e (closeopen): New function 2006-07-04 21:51:42 +00:00
Sergey Poznyakoff
808cafa454 (AC_CHECK_FUNCS): Check for getdtablesize 2006-07-04 21:51:33 +00:00
Sergey Poznyakoff
d1dedae402 (update_po): Fix single translation update 2006-07-03 16:46:14 +00:00
Sergey Poznyakoff
de754902da Update 2006-06-27 13:39:20 +00:00
Sergey Poznyakoff
bc7f4ad027 Update 2006-06-26 14:42:35 +00:00
Sergey Poznyakoff
55abc110f5 Add cross-references 2006-06-26 14:42:18 +00:00
Sergey Poznyakoff
4d753fced1 Minor fixes 2006-06-26 12:48:25 +00:00
Sergey Poznyakoff
85a4e0fdeb Do not depend on getopt.h 2006-06-26 11:18:54 +00:00
Sergey Poznyakoff
583415c2c1 Update 2006-06-26 08:09:18 +00:00
Sergey Poznyakoff
6488588c5f Update 2006-06-26 08:08:47 +00:00
Sergey Poznyakoff
ac40b1e6f6 Update 2006-06-25 12:46:43 +00:00
Sergey Poznyakoff
4bf5f6dca4 --sparse-version turns on --sparse 2006-06-25 12:46:12 +00:00
Sergey Poznyakoff
ecaff7cbba Use ST_IS_SPARSE instead of sparse_file_p (update paxutils first) 2006-06-25 12:45:57 +00:00
Sergey Poznyakoff
ea9e2d8d8e (sparse_file_p): Remove 2006-06-25 12:45:16 +00:00
Sergey Poznyakoff
39e5d9182c (Other Tars): New node describing how to extract
GNU-specific member formats using third-party tars.
2006-06-25 12:45:03 +00:00
Sergey Poznyakoff
c7aa519f09 (tar_TEXINFOS): Sorted 2006-06-25 12:44:15 +00:00
Sergey Poznyakoff
bf5ba3dbef A sample utility to expand sparse files
extracted by third-party tars. It is not meant to be installed nor
to be included in the distribution. It is here, so that it can be
obtained either from CVS or from the tar web site.
2006-06-25 12:44:04 +00:00
Sergey Poznyakoff
ea368b6d1b Update 2006-06-24 16:50:11 +00:00
Sergey Poznyakoff
d0201294c0 (xhdr_tab.decoder): pass keyword as a second
argument. All callers changed.
(decode_record): Check for numeric overflow
(xheader_string_end): Return boolean value. Check for possible
numeric overflow
2006-06-24 16:49:33 +00:00
Sergey Poznyakoff
c5b15c4ac1 (segm_count): Change type to size_t 2006-06-24 16:49:05 +00:00
Sergey Poznyakoff
4b3dd17c00 (pax_dump_header_0): Return false if
xheader_string_end fails (for 0.1 formats).
(pax_dump_header): Return meaningful value
2006-06-24 16:48:45 +00:00
Sergey Poznyakoff
d339cc38af Remove not used variables 2006-06-24 16:48:24 +00:00
Sergey Poznyakoff
796a69787e (extract_volhdr): Add missing return 2006-06-24 16:48:08 +00:00
Sergey Poznyakoff
4c54e234c1 (name_init): New prototype.
(xheader_string_end): Return bool.
2006-06-24 16:47:57 +00:00
Sergey Poznyakoff
c027e03924 (print_total_stats): Add default case 2006-06-24 16:47:29 +00:00
Sergey Poznyakoff
6d615f12d4 Update 2006-06-23 15:24:53 +00:00
Sergey Poznyakoff
8f970d2c1e Include sparsemvp.at, spmvp00.at, spmvp01.at, spmvp10.at 2006-06-23 15:24:43 +00:00
Sergey Poznyakoff
d04af8f714 Rewritten as an include file.
(TAR_MVP_TEST): New macro
2006-06-23 15:24:10 +00:00
Sergey Poznyakoff
e2ecb82711 Explicitely give `-f -' to the tar invocation 2006-06-23 15:23:47 +00:00
Sergey Poznyakoff
8e2e731733 Add spmvp00.at, spmpv01.at, spmpv10.at 2006-06-23 15:23:16 +00:00
Sergey Poznyakoff
19a63e523d Implement new keywords: GNU.sparse.name, GNU.sparse.major, GNU.sparse.minor, GNU.sparse.realsize 2006-06-23 15:22:50 +00:00
Sergey Poznyakoff
5679d3020e (struct tar_stat_info.sparse_major,sparse_minor): New members 2006-06-23 15:22:31 +00:00
Sergey Poznyakoff
1001c1b326 New option --sparse-version 2006-06-23 15:22:12 +00:00
Sergey Poznyakoff
090d1d36ae Implement sparse format versioning. Implement new
version (1.0) of PAX sparse format.
(pax_sparse_member_p): Fix condition
(pax_dump_header): A dispatcher function
(pax_dump_header_0,pax_dump_header_1): New functions.
(pax_optab): Update
(oldgnu_dump_header): Minor fix: make sure
sparse_header.isextended is set before calling
set_next_block_after
2006-06-23 15:21:48 +00:00
Sergey Poznyakoff
2e1f904f2c (tar_sparse_major,tar_sparse_minor): New globals. 2006-06-23 15:20:06 +00:00
Sergey Poznyakoff
6a0b5421b9 Update master menu 2006-06-23 15:19:47 +00:00
Sergey Poznyakoff
9c764b14a9 (Sparse Formats): New node 2006-06-23 15:19:27 +00:00
Sergey Poznyakoff
ae67839879 (tar_TEXINFOS): Add sparse.texi 2006-06-23 15:19:08 +00:00
Sergey Poznyakoff
9588a106a7 New files 2006-06-23 15:18:18 +00:00
Sergey Poznyakoff
b3627f3f07 Update 2006-06-21 10:44:29 +00:00
Sergey Poznyakoff
ca7df3fe6b Raise version number to 1.15.92 2006-06-21 10:44:16 +00:00
Sergey Poznyakoff
ab19642053 Implement new option, --mtime, allowing to set
modification times for all archive members during creation.
(struct tar_args): textual_date_option replaced with a linked list
textual_date. All references updated.
(get_date_or_file,report_textual_dates): New functions.
2006-06-21 10:40:39 +00:00
Sergey Poznyakoff
a71b154289 (start_header): Override mtime if requested 2006-06-21 10:40:10 +00:00
Sergey Poznyakoff
ceaef10443 (set_mtime_option,mtime_option): New globals 2006-06-21 10:39:58 +00:00
Sergey Poznyakoff
5da6733724 (Overriding File Metadata): New node
Document --mtime option.
2006-06-21 10:39:52 +00:00
Sergey Poznyakoff
8d6c177ecb update 2006-06-20 15:15:11 +00:00
Sergey Poznyakoff
1ecd6672e1 (GNU.sparse.name): New variable for storing sparse file name. 2006-06-20 15:14:59 +00:00
Sergey Poznyakoff
ca2f855c90 (pax_dump_header): Store original sparse file name
in GNU.sparse.name variable. The name field in the ustar header
now contains generated name (%d/GNUSparseFile.%p/%f), so that
non-pax-aware tars won't extract the file under the original
filename.
2006-06-20 15:14:47 +00:00
Sergey Poznyakoff
693134a4e7 (name_next_elt): Call register_individual_file
(namelist_match): Remove third argument
(name_match): Change return type to bool
(name_scan): Remove second argument
2006-06-20 15:14:19 +00:00
Sergey Poznyakoff
90cec95580 (maybe_backup_file): Second argument is bool 2006-06-20 15:14:00 +00:00
Sergey Poznyakoff
b6fcb4ba8f (procdir): Use is_individual_file to check for
files explicitely specified in the command line. Fixes bug
reported by Dat Head on 19 Jun 2006 (descending into mountpoints
with --one-file-system in use)
2006-06-20 15:13:49 +00:00
Sergey Poznyakoff
6d1e9ab67e Remove second argument from calls to name_scan 2006-06-20 15:13:30 +00:00
Sergey Poznyakoff
300210aa15 (struct name.explicit): Remove
Use variable names in all declarations
(name_scan): Remove second argument
2006-06-20 15:13:20 +00:00
Sergey Poznyakoff
532b2dd31f Fix typo in a comment 2006-06-16 07:19:34 +00:00
Sergey Poznyakoff
3358f5fcc3 Update 2006-06-13 19:34:20 +00:00
Sergey Poznyakoff
51e3f3f1ca Update 2006-06-13 14:59:43 +00:00
Sergey Poznyakoff
caf6b29f1e (Using Multiple Tapes,Multi-Volume Archives): Rewritten 2006-06-13 14:59:32 +00:00
Sergey Poznyakoff
12ae9f6912 Update 2006-06-13 13:35:46 +00:00
Sergey Poznyakoff
64041696c9 (xopindex,opsummary): New macros 2006-06-13 13:35:34 +00:00
Sergey Poznyakoff
8ee09b9939 Define op as codeindex. Use xopindex and opsummary to
populate it
Consequently prefer @dfn{long options} over @dfn{mnemonic
options}.
Document --unquote, --no-unquote
(Short Option Summary): Build a table of cross-references to the
corresponding long options.
2006-06-13 13:35:14 +00:00
Sergey Poznyakoff
72f60f9e5f (FIXME) [!PROOF_FOOTNOTED]: Enclose in a cartouche 2006-06-13 13:34:32 +00:00
Sergey Poznyakoff
378818cb3e (check-options): Expand macros before grepping in $(info_TEXINFOS) 2006-06-13 13:34:14 +00:00
Sergey Poznyakoff
c980a06329 Update 2006-06-12 22:51:32 +00:00
Sergey Poznyakoff
4c7a2b10b8 Implement --overwrite-dir option (long ago documented) 2006-06-12 22:50:29 +00:00
Sergey Poznyakoff
8f3ed604b9 Update 2006-06-12 22:50:17 +00:00
Sergey Poznyakoff
b886724818 (check-options): New goal 2006-06-12 22:49:37 +00:00
Sergey Poznyakoff
f143fa5d64 Update 2006-06-12 13:21:28 +00:00
Sergey Poznyakoff
1e3568d947 (options, parse_opt): Allow for optional argument to
the --totals option, which specifies a signal upon delivery of which
the statistics must be output.
(main): Call print_total_stats if total_option is set.
2006-06-12 13:20:10 +00:00
Sergey Poznyakoff
b229a86dd7 (check_time): Use volume_start_time when checking
for the timestamp plausability.
2006-06-12 13:19:43 +00:00
Sergey Poznyakoff
05b250d4a4 (records_skipped): Remove static qualifier, the
variable is used by print_total_stats in buffer.c
2006-06-12 13:19:16 +00:00
Sergey Poznyakoff
42d180b24e (volume_start_time,last_stat_time): New globals
(print_total_written): Replaced with:
(print_total_stats): New function
2006-06-12 13:18:59 +00:00
Sergey Poznyakoff
8c10111c66 (total_blocks_deleted): New variable
(set_start_time): Set volume_start_time and last_stat_time as well
(set_volume_start_time): New function
(compute_duration): Do not call set_start_time, update
last_stat_time instead. Use it in calculation instead of
start_time, which is now set only once, upon startup.
(print_total_written): Removed.
(print_total_stats): New function for printing byte/speed statistics.
(_open_archive): Detect attempts to update compressed archives.
(_gnu_flush_write): Always update prev_written.
(open_archive): Call set_volume_start_time.
2006-06-12 13:18:26 +00:00
Sergey Poznyakoff
15a55db341 Update 2006-06-12 13:17:54 +00:00
Sergey Poznyakoff
e721e74259 Document better the --totals option. 2006-06-12 13:17:42 +00:00
Sergey Poznyakoff
1bea3b4b25 Update 2006-06-11 20:07:20 +00:00
Sergey Poznyakoff
4ef056729e (xheader_set_single_keyword): Fix typo.
(decode_time): Avoid using gotos.
2006-06-11 20:06:46 +00:00
Sergey Poznyakoff
37986cdff9 Update 2006-06-11 15:05:52 +00:00
Sergey Poznyakoff
5fe07ac97d Update master menu 2006-06-11 15:05:22 +00:00
Sergey Poznyakoff
a35935e973 (master-menu): New goal 2006-06-11 15:04:39 +00:00
Sergey Poznyakoff
e832cab432 New file 2006-06-11 15:04:17 +00:00
Sergey Poznyakoff
578f46309f Update 2006-06-10 09:55:20 +00:00
Sergey Poznyakoff
4396675861 Remove leftover include 2006-06-10 09:54:02 +00:00
Sergey Poznyakoff
a3dd97d9be Update 2006-06-09 13:55:36 +00:00
Sergey Poznyakoff
13adf3f762 Update 2006-06-09 13:50:20 +00:00
Sergey Poznyakoff
f1b1e9a476 Fix indentation, introduce end-of-format marker for texify.sed 2006-06-09 13:50:04 +00:00
Sergey Poznyakoff
fc4502c17e Update 2006-06-09 13:49:51 +00:00
Sergey Poznyakoff
0abf3a5ac9 Fix typo 2006-06-09 13:49:39 +00:00
Sergey Poznyakoff
19b36aaf60 Auxiliary script to convert ../src/tar.h to header.texi 2006-06-09 13:48:28 +00:00
Sergey Poznyakoff
9b44f8efed *** empty log message *** 2006-06-09 13:46:53 +00:00
Sergey Poznyakoff
97bfe578ed New file 2006-06-09 13:46:34 +00:00
Sergey Poznyakoff
fb88325f56 (tar_TEXINFOS): Add intern.texi
(EXTRA_DIST): Remove convtexi.pl, add texify.sed
2006-06-09 13:46:11 +00:00
Sergey Poznyakoff
a1b2406646 Update 2006-06-08 22:36:30 +00:00
Sergey Poznyakoff
5e14ef32c0 Minor fixes. 2006-06-08 22:35:52 +00:00
Sergey Poznyakoff
f9bd340c1b --checkpoint takes an optional argument specifying
number of records between two successive checkpoints (proposed
by Jason Armistead on 2004-06-22).Optional dot starting the
argument means "print dots instead of textual checkpoints".
(tar_help): New function
2006-06-08 22:35:39 +00:00
Sergey Poznyakoff
46defea70e (checkpoint_option): Change type to unsigned
(checkpoint_style): New variable.
2006-06-08 22:34:56 +00:00
Sergey Poznyakoff
5daab19c27 Implement more flexible checkpoint style 2006-06-08 22:34:38 +00:00
Sergey Poznyakoff
7214086d3d Update 2006-06-08 22:34:16 +00:00
Sergey Poznyakoff
93560dd669 Add Jason Armistead 2006-06-08 22:33:33 +00:00
Sergey Poznyakoff
c1f55f1c37 Update 2006-06-08 14:43:23 +00:00
Sergey Poznyakoff
2d2e1d411e (dumpdir_locate,obstack_code_rename,purge_directory): Re-implement renaming. Introduce
X control code.
(make_tmp_dir_name): Remove
2006-06-08 14:43:05 +00:00
Sergey Poznyakoff
5591fa407a Document dumpdir format 2006-06-08 14:42:20 +00:00
Sergey Poznyakoff
e2dbba2f07 (tar_TEXINFOS): Add dumpdir.texi 2006-06-08 14:42:07 +00:00
Sergey Poznyakoff
018de58373 New file 2006-06-08 14:41:56 +00:00
Sergey Poznyakoff
17111bef8f Add mkdtemp 2006-06-08 14:41:15 +00:00
Sergey Poznyakoff
3a9f2ea587 Update 2006-06-08 09:51:06 +00:00
Sergey Poznyakoff
02c7b862a3 (add_char_segment): Fix length assignement 2006-06-08 09:50:56 +00:00
Sergey Poznyakoff
9154c0c43b Update 2006-06-08 09:43:44 +00:00
Sergey Poznyakoff
5108a3dc41 Update 2006-06-08 09:34:03 +00:00
Sergey Poznyakoff
c52e5fc4e8 Update 2006-06-08 09:28:18 +00:00
Sergey Poznyakoff
0fc3177ed2 Update 2006-06-08 09:27:38 +00:00
Sergey Poznyakoff
6be1349236 (set_transform_expr,_transform_name_to_obstack): Implement NUMBER flag. 2006-06-08 09:27:25 +00:00
Sergey Poznyakoff
a2625311c8 Update 2006-06-07 14:57:57 +00:00
Sergey Poznyakoff
6e2760f7d7 Update 2006-06-07 14:57:29 +00:00
Sergey Poznyakoff
8b2f4ad670 (_transform_name_to_obstack,set_transform_expr): Implement case conversion operations (GNU extension). 2006-06-07 14:57:10 +00:00
Sergey Poznyakoff
d4c0836ec2 Update 2006-06-06 21:36:17 +00:00
Sergey Poznyakoff
40afe4d362 Update 2006-06-06 21:35:22 +00:00
Sergey Poznyakoff
435edb824e (transform_name_fp): Run fun even if _transform_name_to_obstack returns false. 2006-06-06 21:33:25 +00:00
Sergey Poznyakoff
9d2e8df195 Update 2006-06-06 21:30:26 +00:00
Sergey Poznyakoff
aa7476a68e Update 2006-06-03 20:53:17 +00:00
Sergey Poznyakoff
16c48ef8d0 Update 2006-06-02 15:07:00 +00:00
Sergey Poznyakoff
0da8aac59f Use genfile --files-from 2006-06-02 15:06:29 +00:00
Sergey Poznyakoff
bb6f707781 Fix typo in the comment 2006-06-02 15:06:19 +00:00
Sergey Poznyakoff
7cb01d37bb Add incr04.at 2006-06-02 15:06:10 +00:00
Sergey Poznyakoff
d79bbe0fd1 (set_transform_expr): New function 2006-06-02 15:05:52 +00:00
Sergey Poznyakoff
f984c43b82 Update 2006-06-02 15:05:36 +00:00
Sergey Poznyakoff
d75890c1b8 (options): Minor rewording 2006-06-02 10:54:05 +00:00
Sergey Poznyakoff
b3b4347821 Update 2006-06-02 10:42:25 +00:00
Sergey Poznyakoff
39080c7628 Update 2006-06-02 08:08:10 +00:00
Sergey Poznyakoff
c58063c17a New option --transform
New option --show-transformed-names generalizes
--show-stored-names. The latter is retained as an alias.
2006-06-02 08:06:46 +00:00
Sergey Poznyakoff
ae7bd36423 (print_header): Update displayable name selection. 2006-06-02 08:05:04 +00:00
Sergey Poznyakoff
973b611290 (extract_archive): safer_name_suffix and stripped_prefix_len are now called by decode_header 2006-06-02 08:04:37 +00:00
Sergey Poznyakoff
29fb7356df (dump_file0): Transform file name 2006-06-02 08:03:53 +00:00
Sergey Poznyakoff
bbee515590 (transform_name, transform_name_fp): New functions
(show_stored_names_option): Renamed to
show_transformed_names_option. All uses changed
2006-06-02 08:03:08 +00:00
Sergey Poznyakoff
c8aa01c80c New file 2006-06-02 08:02:24 +00:00
Sergey Poznyakoff
43ba23114f (tar_SOURCES): New module transform.c 2006-06-02 08:01:44 +00:00
Sergey Poznyakoff
7bfcbd6a27 Update 2006-06-02 08:01:33 +00:00
Sergey Poznyakoff
c5fd5f9e8d Update 2006-05-31 12:45:44 +00:00
Sergey Poznyakoff
a23a95b4a0 (make_directory): Fix initialization of struct directory. 2006-05-31 12:45:14 +00:00
Sergey Poznyakoff
19498c9172 Initialize AM_CPPFLAGS 2006-05-25 19:29:03 +00:00
Sergey Poznyakoff
edff149522 Update 2006-05-25 14:13:07 +00:00
Sergey Poznyakoff
f20e08dd45 (parse_opt): Add comment before --preserve case. 2006-05-25 14:12:51 +00:00
Sergey Poznyakoff
e6d15fc7af Updated 2006-05-25 14:12:35 +00:00
Sergey Poznyakoff
c96ba08e06 Update 2006-05-25 11:02:50 +00:00
Sergey Poznyakoff
6f89b1fce5 Document use of wildcards 2006-05-25 11:02:09 +00:00
Sergey Poznyakoff
93f8f6780a Update 2006-05-25 07:05:58 +00:00
Sergey Poznyakoff
75f37f4cef Make AT_SETUP more readable. 2006-05-25 07:05:41 +00:00
Sergey Poznyakoff
3947e63c25 (options): Move globbing-related options into a
separate group. Set -l as an alias to --check-links, as required
by UNIX98
(struct tar_args): New fields
wildcards,matching_flags,include_anchored
(MAKE_EXCL_OPTIONS,MAKE_INCL_OPTIONS): New macros
(parse_opt): Use x2nrealloc to grow archive_name_array.
Use MAKE_EXCL_OPTIONS,MAKE_INCL_OPTIONS to create appropriate
fnmatch options, and name_add_name,name_add_dir to handle member
name and -C arguments.
(decode_options): Likewise
(main): Remove call to init_names.
2006-05-25 07:05:28 +00:00
Sergey Poznyakoff
8b471d55ff Rewritten handling of member names in the command
line. Tar no longer attempts to guess globbing patterns, instead
it relies on --wildcard option.
(init_names): Removed.
(struct name_elt): New structure.
(name_array): Change type to struct name_elt. All references updated
(name_add_name,name_add_dir): New functions
(name_next_elt): New function
(name_next): Rewritten using name_next_elt.
(namelist_match): Rewritten pattern matching using
exclude_fnmatch.
(names_notfound): Warn if globbing patterns were used without
--wildcards option
2006-05-25 07:04:53 +00:00
Sergey Poznyakoff
c2c2df6c93 (dump_file,dump_file0): First argument is const char*. All callers updated. 2006-05-25 07:04:15 +00:00
Sergey Poznyakoff
cf857388c1 (struct name): Refactured
(warn_regex_usage): New variable.
(dump_file): First argument is const char*.
(name_init,name_add): Removed
(name_add_name,name_add_dir): New functions
(name_next): Return const char*.
2006-05-25 07:03:57 +00:00
Sergey Poznyakoff
9dfad74683 (AM_INIT_AUTOMAKE): Use tar-ustar option. Raise version requirement to 1.9 2006-05-25 07:03:30 +00:00
Sergey Poznyakoff
57267f7ed9 Update 2006-05-25 07:02:59 +00:00
Sergey Poznyakoff
476abe556b Update 2006-05-23 07:10:55 +00:00
Sergey Poznyakoff
fe72c79ad8 (change_tape_menu): Fix typo (uninitialized variable) introduced yesterday. 2006-05-23 07:10:34 +00:00
Sergey Poznyakoff
8fea578b22 Update 2006-05-22 10:02:32 +00:00
Sergey Poznyakoff
a46704b1bf (change_tape_menu): Break the loop after obtaining new archive name. Check for empty input line 2006-05-22 10:02:23 +00:00
Sergey Poznyakoff
6f8cbc5ca8 Use @var{file_name} instead of @var{file name} 2006-05-22 10:01:34 +00:00
Sergey Poznyakoff
c03131aba9 Update 2006-05-15 09:52:29 +00:00
Sergey Poznyakoff
c9195c75be (AT_TAR_CHECK): Declare expected failure if $XFAILFILE exists. 2006-05-15 09:52:16 +00:00
Sergey Poznyakoff
5632d195f5 Create $XFAILFILE on failure 2006-05-15 09:52:03 +00:00
Sergey Poznyakoff
ef90e05363 (XFAILFILE): New variable 2006-05-15 09:51:53 +00:00
Sergey Poznyakoff
939d63b92d Update 2006-05-13 14:03:46 +00:00
Sergey Poznyakoff
0ff13351f0 Update 2006-05-13 14:01:26 +00:00
Sergey Poznyakoff
c57418b462 New file 2006-05-13 14:01:13 +00:00
Sergey Poznyakoff
3c7dd57a17 Update 2006-05-13 13:58:59 +00:00
Sergey Poznyakoff
0b3fe146dd Update 2006-05-13 12:16:09 +00:00
Sergey Poznyakoff
90088ff00d Update 2006-05-13 12:02:58 +00:00
Sergey Poznyakoff
a183d6f7f5 Update 2006-05-13 12:00:06 +00:00
Sergey Poznyakoff
4883aab47d (AT_STAR_PREREQ): Provide md5 sum. 2006-05-13 11:59:51 +00:00
Sergey Poznyakoff
30873dbd97 Add keywords. 2006-05-13 11:59:36 +00:00
Sergey Poznyakoff
74849d8119 (AT_TARBALL_PREREQ): New defun
(AT_STAR_PREREQ): Rewrite using tarball_prereq
Include chtype.at and volsize.at
2006-05-13 11:59:08 +00:00
Sergey Poznyakoff
3962eb6a3e (TEST_DATA_URL,STAR_DATA_URL)
(STAR_TESTSCRIPTS): Provide default values.
(tarball_prereq): New function
2006-05-13 11:58:41 +00:00
Sergey Poznyakoff
c99076e925 (TESTSUITE_AT): Add chtype.at, volsize.at
(check-full): New target
2006-05-13 11:58:16 +00:00
Sergey Poznyakoff
6315d1700b (read_header_primitive): New function
(read_header): Front end for read_header_primitive
2006-05-13 11:57:52 +00:00
Sergey Poznyakoff
520104f5f8 (extract_volhdr): New function
(prepare_to_extract): Use extract_volhdr as extractor for volume
names.
2006-05-13 11:57:36 +00:00
Sergey Poznyakoff
34e5f66589 (read_header_primitive): New function 2006-05-13 11:57:20 +00:00
Sergey Poznyakoff
d2b3114a3b (read_header0): Use read_header_primitive to avoid clubbering current_tar_info. All callers updated. 2006-05-13 11:57:06 +00:00
Sergey Poznyakoff
2b27e8de1f Update 2006-05-13 11:56:51 +00:00
Sergey Poznyakoff
a85cfd69e3 (find_directory_meta): Bugfix 2006-05-13 08:38:12 +00:00
Sergey Poznyakoff
4b951034f3 Update 2006-05-08 12:48:27 +00:00
Sergey Poznyakoff
1524831224 Call AT_SORT_PREREQ. Remove fd 2 redirection after sort invocations 2006-05-08 12:46:41 +00:00
Sergey Poznyakoff
ee6f14194d Call AT_UNPRIVILEGED_PREREQ 2006-05-08 12:46:16 +00:00
Sergey Poznyakoff
ac7f4e853d (AT_SORT_PREREQ, AT_UNPRIVILEGED_PREREQ): New defines 2006-05-08 12:46:01 +00:00
Sergey Poznyakoff
47dd75e87b Update 2006-05-08 12:12:45 +00:00
Sergey Poznyakoff
6054b5e9d5 (AT_KEYWORDS): Add missing incremental kw 2006-05-08 12:12:09 +00:00
Sergey Poznyakoff
edd6df370d Update for the new behavior 2006-05-08 12:11:53 +00:00
Sergey Poznyakoff
fd89d5a3cd Add incr03.at,rename01.at,rename02.at,rename03.at 2006-05-08 12:11:43 +00:00
Sergey Poznyakoff
71f2e412ae New testcase 2006-05-08 12:11:26 +00:00
Sergey Poznyakoff
67877f7de2 (collect_and_sort_names): Update dir_contents of the first non-fake name entry when in listed incremental mode. 2006-05-08 12:10:36 +00:00
Sergey Poznyakoff
c9e7465642 (struct directory.contents, flags): New members
(nfs,found,new): Remove. Replaced by appropriate bitmask values in
`flags' field. All uses updated.
(directory_meta_table): New table.
(hash_directory): Rename to hash_directory_name
(compare_directories): Rename to compare_directory_names
(hash_directory_meta,compare_directory_meta,find_directory_meta):
New functions
(compare_dirents): Removed
(note_directory): Get 7th argument: directory contents.
All callers updated
(dumpdir_locate,makedumpdir): New functions
(scan_directory): Rewritten. Use makedumpdir to create a sorted
dumpdir array. This makes the obstack argument unnecessary. Besides,
ALL_CHILDREN flag is set only for new directories.
(procdir): Change return type to struct directory. Return
immediately if the directory was already initialized. Discover
directory renames using directory_meta_table.
(append_incremental_renames): New function.
(read_directory_file, write_directory_file): Use new snapshot file
format.
2006-05-08 12:10:14 +00:00
Sergey Poznyakoff
a0b4431f26 (rename_directory): New function 2006-05-08 12:09:46 +00:00
Sergey Poznyakoff
192ac7136a (rename_directory,append_incremental_renames): New functions. 2006-05-08 12:09:35 +00:00
Sergey Poznyakoff
c2775aedf1 Raise version number to 1.15.91 2006-05-08 12:09:15 +00:00
Sergey Poznyakoff
f1fe157dfe Update 2006-05-08 12:09:07 +00:00
Sergey Poznyakoff
dd197c5ccb Update 2006-05-02 19:16:23 +00:00
Sergey Poznyakoff
c576ac1354 Always use genfile --file, this enables extra error checking. 2006-05-02 19:16:12 +00:00
Sergey Poznyakoff
53d1279719 Attempt to extract a member with truncated file name from the archive. 2006-05-02 19:15:50 +00:00
Sergey Poznyakoff
729b91adb1 (try_new_volume): Attempt to continue if the name is apparently truncated in a GNU format volume. 2006-05-02 19:15:35 +00:00
Sergey Poznyakoff
dc7c0f1309 Update 2006-05-02 16:33:10 +00:00
Sergey Poznyakoff
783e58b394 (_open_archive): Remove unnecessary argument to check_compressed_archive. 2006-05-02 16:32:40 +00:00
Sergey Poznyakoff
c0e5268e75 Update 2006-04-25 17:27:03 +00:00
Sergey Poznyakoff
1518cef987 (@copying): Remove the reference to not existing invariant section. 2006-04-25 17:26:30 +00:00
Sergey Poznyakoff
8dd9a2105e Skip the test if the file system does not support sparse files. 2006-04-25 17:23:35 +00:00
Sergey Poznyakoff
9ec31e3438 Update 2006-04-11 12:02:27 +00:00
Sergey Poznyakoff
d4a41d5311 New testcase 2006-04-11 12:01:28 +00:00
Sergey Poznyakoff
a46e6aa4dc Include extrac06.at 2006-04-11 12:01:02 +00:00
Sergey Poznyakoff
b4d40436fd (TESTSUITE_AT): Add extrac06.at 2006-04-11 12:00:37 +00:00
Sergey Poznyakoff
f97d80335a (directory.new): New member
(note_directory,find_directory: Use make_directory to create
struct directory entries
(procdir): Avoid duplicating  directories in the incremental
backup map.
2006-04-11 12:00:23 +00:00
Sergey Poznyakoff
90b061cf55 Minor changes 2006-04-11 11:59:54 +00:00
Sergey Poznyakoff
8300c820d5 (extract_dir): Fix toggling existing directory
permissions. Use parts of patch provided by Ian Jackson
<iwj@ubuntu.com>.
2006-04-11 11:59:40 +00:00
Paul Eggert
e0b3fc61e1 * tests/atlocal.in (PATH): Add build-aux from the source tree,
not the build tree.
2006-03-19 04:04:54 +00:00
Sergey Poznyakoff
533854fd45 Update 2006-03-13 09:46:52 +00:00
Sergey Poznyakoff
e99d4f83df Add Benno Schulenberg 2006-03-13 09:44:15 +00:00
Sergey Poznyakoff
b8d5835375 Sort the two lines of stderr from the
first `tar -v --listed-incremental'.  They would come out
reversed and provoke a test failure on a tmpfs
file system.
2006-03-13 09:43:37 +00:00
Sergey Poznyakoff
61dd37ec86 (options): Consistently begin help messages with a lowercase letter. 2006-03-13 09:42:55 +00:00
Sergey Poznyakoff
48d20d8f9e Minor fixes. 2006-03-13 09:42:22 +00:00
Sergey Poznyakoff
adbbde5d4f Update 2006-03-11 22:42:46 +00:00
Sergey Poznyakoff
208389f3ad (AM_CPPFLAGS): Define LOCALEDIR 2006-03-11 22:42:07 +00:00
Paul Eggert
db0f0804f5 Remove unistd_.h from lib/.cvsignore. 2006-03-08 02:00:47 +00:00
Paul Eggert
18486cf8d7 * src/buffer.c (record_buffer_aligned): New var.
(init_buffer): Use it to ensure that the buffer is aligned.
This doesn't result in any measurable performance improvement
on my host (Debian GNU/Linux 3.1 stable, with default block size),
but I assume it does help on some hosts.
2006-03-08 00:55:56 +00:00
Paul Eggert
6c1020d386 * lib/.cvsignore: Add unistd_.h. Sort. 2006-03-08 00:23:34 +00:00
Sergey Poznyakoff
38c0884898 Update 2006-03-04 09:58:26 +00:00
Sergey Poznyakoff
7bcb876c5a Use -f - to read from stdin. 2006-03-04 09:57:44 +00:00
Sergey Poznyakoff
dfd5ec2519 Update 2006-02-21 07:10:52 +00:00
Sergey Poznyakoff
e81556858b Fix typo: --to-command instead of --to-program 2006-02-21 07:09:39 +00:00
Paul Eggert
92554b7c94 * tests/multiv04.at (split directory members in a MV archive):
Don't use %X in an awk printf format; this doesn't work with
Solaris 10 /usr/bin/awk.  Use %x instead.
2006-02-21 05:55:28 +00:00
Sergey Poznyakoff
631de61428 Fix copyright years 2006-02-20 10:01:47 +00:00
Sergey Poznyakoff
8bfefd8854 Uniformly start all test titles with a lower case letter 2006-02-20 10:00:48 +00:00
Sergey Poznyakoff
f7a29307e2 Update 2006-02-20 09:45:23 +00:00
Sergey Poznyakoff
66ef04d4c8 New test 2006-02-20 09:43:58 +00:00
Sergey Poznyakoff
b6ffcac4db (AT_TAR_MKHIER): New macro
(lustar01.at,lustar02.at,lustar03.at): New tests.
2006-02-20 09:43:00 +00:00
Sergey Poznyakoff
28698a5334 Reword test title 2006-02-20 09:42:28 +00:00
Sergey Poznyakoff
e304b58fff Remove mkhier, use AT_TAR_MKHIER instead 2006-02-20 09:42:08 +00:00
Sergey Poznyakoff
c532f12464 Add build-aux to the PATH 2006-02-20 09:41:56 +00:00
Sergey Poznyakoff
9fdd5baa0c (lustar01.at,lustar02.at,lustar03.at): New tests. 2006-02-20 09:41:43 +00:00
Sergey Poznyakoff
31ef7e3afb (split_long_name): Fix maximum length estimation. Patch by Jim Lowe. 2006-02-20 09:41:29 +00:00
Paul Eggert
f2bf9f2ffa Avoid installation glitches on Solaris 8 with Sun C 5.4.
* lib/.cvsignore: Add system-ioctl.h.
* lib/Makefile.tmpl (noinst_HEADERS): Add system-ioctl.h.
* src/buffer.c: Include system-ioctl.h.
* src/compare.c: Likewise.
* src/delete.c: Likewise.
* src/system.c: Include <getline.h>, <setenv.h>.
* src/tar.c: Include <getline.h>.
2006-02-20 08:15:31 +00:00
Paul Eggert
cad45a0bae * bootstrap: Don't claim lib/Makefile.am is generated automatically
from itself.
2006-02-20 08:14:21 +00:00
Sergey Poznyakoff
f6ede25815 Update 2006-02-19 21:13:22 +00:00
Sergey Poznyakoff
476019d083 (new_volume): Prompt the user for archive name if unable to open next archive. 2006-02-19 21:12:50 +00:00
Sergey Poznyakoff
cf440a191f Update 2006-02-19 20:37:14 +00:00
Sergey Poznyakoff
588f444efe (add_chunk_header): Free st.orig_file_name after calling finish_header() 2006-02-19 20:36:31 +00:00
Sergey Poznyakoff
b4051cb07c Updated 2006-02-19 19:28:47 +00:00
Sergey Poznyakoff
5032e08eb9 Raise version number to 1.15.90 2006-02-19 19:28:17 +00:00
Sergey Poznyakoff
36f41eabf4 (dump_file0): Restore file_count_links,accidentally removed on 2005-11-29. 2006-02-19 19:27:28 +00:00
Sergey Poznyakoff
108edf3692 Updated 2006-02-08 21:34:44 +00:00
Sergey Poznyakoff
780cf6f079 (tar_set_quoting_style): Provide second argument to the format spec: program_invocation_short_name. Reported by Jim Meyering. 2006-02-08 21:34:15 +00:00
Paul Eggert
84378fa99a * gnulib.modules: Add closeout, exitfial.
* lib/.cvsignore: Add __fpending.c, __fpending.h, closeout.c,
closeout.h.
* src/buffer.c: Incluse closeout.h.
(_open_archive): Use freopen rather than fopen, so
that stdlis is always either stdout or stderr.  Use
close_stdout_set_file_name to report its name.
* src/tar.c: Include closeout.h and exitfail.h.
(parse_opt, usage): Call close_stdout as appropriate, to check for
write errors.
(decode_options): Exit with status TAREXIT_FAILURE, not 1.
(main): Set exit_failure, to exit with proper status on memory
allocation failure and the like.
Use close_stdout rather than rolling our own test.
2006-02-07 23:51:37 +00:00
Paul Eggert
78b078b455 * NEWS: --version now outputs copyright etc., to conform to the
GNU coding standards.  Remove --license.
* gnulib.modules: Add version-etc-fsf.
* doc/tar.texi: Document the change.
* lib/.cvsignore: Add version-etc-fsf.c, version-etc.c, version-etc.h.
* scripts/Makefile.am (SED_CMD): Update PAKCAGE_NAME, not PACKAGE.
* scripts/backup.in: Remove --license.  Change --version to conform
to GCS.
* scripts/restore.in: Likewise.
* scripts/backup.sh.in (license): Output briefer license in the
style of coreutils, for consistency with other changes.
* src/tar.c: Include <version-etc.h>.
(LICENSE_OPTION): Remove.
(options): Remove --license.
(license): Remove.
(parse_opt): Use version_etc instead of rolling it ourselves.
Remove --license.
* tests/version.at (tar --version): Check only the first line of
output.
2006-02-07 22:18:36 +00:00
Paul Eggert
e86e864544 Update copyright year to 2006. 2006-02-07 20:55:49 +00:00
Sergey Poznyakoff
d21d48dfba Update 2006-02-07 13:58:03 +00:00
Sergey Poznyakoff
cf1e8b086b (sparse_map_decoder): Fix misleading diagnostic. 2006-02-07 13:57:41 +00:00
Sergey Poznyakoff
6912b7fb15 Update 2006-01-31 11:28:59 +00:00
Sergey Poznyakoff
6c28751ca7 (struct tar_stat_info): New members is_dumpdir and skipped. 2006-01-31 11:28:45 +00:00
Sergey Poznyakoff
0e848e7b2c (list_archive): Use is_dumpdir
Do not wrap skip_member in mv_begin/mv_end, the function itself
takes care of it.
(decode_header): Set stat_info->is_dumpdir
(skip_member): Do nothing if skipped is true
2006-01-31 11:28:32 +00:00
Sergey Poznyakoff
ab8a184336 (get_gnu_dumpdir): Static
(is_dumpdir): New function
(purge_directory): Use is_dumpdir
2006-01-31 11:28:07 +00:00
Sergey Poznyakoff
48ce2946d9 (prepare_to_extract): Use is_dumpdir member to check for dumpdirs. 2006-01-31 11:27:41 +00:00
Sergey Poznyakoff
dde5c2391b (get_gnu_dumpdir): Remove prototype
(is_dumpdir): New function
2006-01-31 11:27:14 +00:00
Sergey Poznyakoff
860577ee0e Update 2006-01-21 23:39:52 +00:00
Sergey Poznyakoff
a349bd80b9 (decode_options): Refuse using --delete with compression options 2006-01-21 23:39:20 +00:00
Sergey Poznyakoff
ba10157a0c Update 2006-01-18 15:36:23 +00:00
Sergey Poznyakoff
514ea6ead4 Implement new options --quoting-style, --quote-chars and --no-quote-chars. 2006-01-18 15:36:15 +00:00
Sergey Poznyakoff
6a97a00688 Initial documentation for --quoting-style, --quote-chars and --no-quote-chars option. 2006-01-18 15:36:01 +00:00
Sergey Poznyakoff
7d822e225e (DEFAULT_QUOTING_STYLE): New configuration variable 2006-01-18 15:35:44 +00:00
Sergey Poznyakoff
38f08784bc Updated 2006-01-18 15:35:34 +00:00
Paul Eggert
c17a9f91d0 * bootstrap: Default to pserver, and switch to cvs.sv.gnu.org,
to accommodate recent changes to the GNU CVS server.
2006-01-09 22:53:55 +00:00
Paul Eggert
0f4660c786 Add argp-pin.c, mkdirat.c, openat-priv.h. 2006-01-09 22:52:34 +00:00
Sergey Poznyakoff
5e01ba7dbe Update 2005-12-14 13:00:23 +00:00
Sergey Poznyakoff
288315211a Update invocations of name_scan. 2005-12-14 12:58:56 +00:00
Sergey Poznyakoff
dacac1b6be (name_scan): Change prototype. 2005-12-14 12:58:34 +00:00
Sergey Poznyakoff
85cf996677 (name_scan): Take an additional argument requesting the exact matching. 2005-12-14 12:58:22 +00:00
Sergey Poznyakoff
6cbd7e1608 Update 2005-12-13 13:33:21 +00:00
Sergey Poznyakoff
b794387cba (addname,add_hierarchy_to_namelist): Initialize explicit member appropriately. 2005-12-13 13:32:29 +00:00
Sergey Poznyakoff
91abd3da82 (procdir): If name_scan() returns something, check if it was explicitely given in the command line 2005-12-13 13:32:14 +00:00
Sergey Poznyakoff
5b3dc9e3dd (struct name): New member explicit'. Remove unused member isdir' 2005-12-13 13:31:56 +00:00
Sergey Poznyakoff
d3e525009d Update 2005-12-12 22:56:25 +00:00
Sergey Poznyakoff
86ef91adff If --one-file-system is given and a
directory is found to be on another device, *and* this directory
is explicitely given in the command line, then do not omit it.
2005-12-12 22:55:39 +00:00
Sergey Poznyakoff
a92a8ff22d Update 2005-12-11 14:12:54 +00:00
Sergey Poznyakoff
1cdb7823ae (options,parse_opt): New options --delay-directory-restore and --no-delay-directory-restore 2005-12-11 14:12:12 +00:00
Sergey Poznyakoff
e73e4428e2 (directories_first): Replaced by delay_directory_restore_option. All uses changed. 2005-12-11 14:11:41 +00:00
Sergey Poznyakoff
d2dd096f1d (delay_directory_restore_option): New global. 2005-12-11 14:11:16 +00:00
Sergey Poznyakoff
fb0a0aaf52 Document --delay-directory-restore option.
(Configuring Help Summary): Document usage of ARGP_HELP_FMT
variable to customize help output.
2005-12-11 14:10:53 +00:00
Sergey Poznyakoff
d102bc35a5 Update 2005-12-11 14:10:05 +00:00
Sergey Poznyakoff
bb8c1d6a72 Update 2005-12-09 10:05:10 +00:00
Sergey Poznyakoff
f03fc1e078 (read_directory_file): Fix format string 2005-12-09 10:05:02 +00:00
Sergey Poznyakoff
273810a9f7 (to_chars_subst): Remove unused variable
Make sure useful result code is returned.
2005-12-09 10:04:52 +00:00
Sergey Poznyakoff
69abc76d13 (set_file_atime): Add prototype. 2005-12-09 10:04:38 +00:00
Sergey Poznyakoff
12cd9cea81 (open_archive): Add default case to shut up gcc. 2005-12-09 10:04:26 +00:00
Sergey Poznyakoff
bfa1bba5fd Fix typo 2005-12-08 15:55:53 +00:00
Sergey Poznyakoff
09b46a0b47 Update 2005-12-08 15:41:38 +00:00
Sergey Poznyakoff
a169d65b94 (gid_to_chars, major_to_chars, minor_to_chars)
(mode_to_chars, off_to_chars, size_to_chars, time_to_chars)
(uid_to_chars, uintmax_to_chars): Return bool
(to_chars): Return bool
(start_header): Check return values of convertion routines. Fail
if unable to store data in the header.
2005-12-08 15:41:28 +00:00
Sergey Poznyakoff
89e65f936d (gid_to_chars, major_to_chars, minor_to_chars)
(mode_to_chars, off_to_chars, size_to_chars, time_to_chars)
(uid_to_chars, uintmax_to_chars): Return bool
2005-12-08 15:41:11 +00:00
Sergey Poznyakoff
c9ac15ae0f (Current status): Renamed to 'Changes' and moved to
appendices.
(Large or Negative Values): Rewritten
2005-12-08 15:40:52 +00:00
Sergey Poznyakoff
67770b89f2 Change permissions in the sample outputs to more usual ones 2005-12-07 16:17:44 +00:00
Sergey Poznyakoff
f3e6ea7d49 Updated 2005-12-07 15:12:38 +00:00
Sergey Poznyakoff
0d2cdcb797 Remove @set's 2005-12-07 15:12:00 +00:00
Sergey Poznyakoff
49e7ba5b17 Following the discussion with Karl Berry,
discontinue using @value{} substitutions for Texinfo commands.
Properly index all long options. Print a
separate long option index.
2005-12-07 15:11:45 +00:00
Sergey Poznyakoff
3f6d87a61c Update 2005-12-07 09:43:09 +00:00
Sergey Poznyakoff
80855932f0 Resolve some more FIXMEs 2005-12-07 09:42:30 +00:00
Sergey Poznyakoff
9e50e81558 Fix typosin the recent entry 2005-12-07 08:40:46 +00:00
Sergey Poznyakoff
02ec34f473 Update 2005-12-06 23:18:20 +00:00
Sergey Poznyakoff
075c726752 Update 2005-12-06 23:16:10 +00:00
Sergey Poznyakoff
2e7a943d0e (options): Add --restrict option. Use macros for option grouping.
(license): Print full list of copyright years
2005-12-06 23:15:41 +00:00
Sergey Poznyakoff
4ba3b41e2e (sys_exec_info_script): The script can supply new
archive name to use by writing it to file descriptor 3.
2005-12-06 23:15:14 +00:00
Sergey Poznyakoff
4669306854 (sys_exec_info_script): Update delaration
(restrict_option): New global
2005-12-06 23:14:56 +00:00
Sergey Poznyakoff
ffc4fb7bdd (new_volume): Update invocation
(change_tape_menu): New function. Disable '!' command if given
--restrict option.
2005-12-06 23:14:44 +00:00
Sergey Poznyakoff
c7ab8eaba4 Use TAR_VOLUME instead of reading volno file. 2005-12-06 23:13:28 +00:00
Sergey Poznyakoff
3f166ce0f5 Update --info-scripts documentation 2005-12-06 23:13:19 +00:00
Paul Eggert
ac74317f46 * configure.ac (DENSITY_LETTER): Fix m4 overquoting.
* .cvsignore: Ignore .bootstrap.
2005-12-06 21:43:17 +00:00
Sergey Poznyakoff
ce522dce26 Update 2005-12-06 16:33:17 +00:00
Sergey Poznyakoff
f018d69aac (archive_format_string): Remove static qualifier.
(subcommand_string): New function.
2005-12-06 16:32:37 +00:00
Sergey Poznyakoff
ea019af0cc (sys_exec_info_script): New function. 2005-12-06 16:32:17 +00:00
Sergey Poznyakoff
0251059267 (archive_format_string,subcommand_string,sys_exec_info_script): New prototypes. 2005-12-06 16:32:05 +00:00
Sergey Poznyakoff
13d43c302f (new_volume): Use sys_exec_info_script() instead of system(). 2005-12-06 16:31:49 +00:00
Sergey Poznyakoff
a5da71b142 Document --to-command and --info-script options. Add missing xrefs. 2005-12-06 16:31:37 +00:00
Sergey Poznyakoff
853edfaff4 Update 2005-12-01 14:51:19 +00:00
Sergey Poznyakoff
ca43ee9769 Obtain root_device here, to make sure it works correctly with -C. 2005-12-01 14:50:57 +00:00
Sergey Poznyakoff
888b0d82b7 Update 2005-12-01 12:58:17 +00:00
Sergey Poznyakoff
b84053c7be Add Guerkan Karaman 2005-12-01 12:57:50 +00:00
Sergey Poznyakoff
c040cabb98 Add incr02.at 2005-12-01 12:51:58 +00:00
Sergey Poznyakoff
ae00dc0d37 (purge_directory): Skip the member and return if the archive is not in incremental format. 2005-12-01 12:51:20 +00:00
Sergey Poznyakoff
5249a99377 Fix restoring of directory timestamps from
incremental archives.
(directories_first): New variable.
(prepare_to_extract): Set directories_first
(extract_archive): Call apply_nonancestor_delayed_set_stat() only
if not extracting from an incremental archive
2005-12-01 12:50:58 +00:00
Paul Eggert
2edff367d9 * doc/tar.texi (Option Summary): Rewrite the
--atime-preserve=system description in response to Ian Turner's
proposed patch.
* doc/tar.texi (Extracting Specific Files): Remove obsolescent
FIXME.
2005-12-01 00:18:05 +00:00
Paul Eggert
f8f4f49011 (parse_opt): Remove bogus \n in new atime diagnostic. 2005-11-29 19:41:34 +00:00
Paul Eggert
3fbdf738de * lib/.cvsignore: Add malloc.h, regcomp.c, regex.c, regex.h,
regex_internal.c, regex_internal.h, regexc.c; used by rpmatch.
2005-11-29 19:39:06 +00:00
Paul Eggert
7209cbed6c * THANKS: Add Ian Turner. 2005-11-29 19:26:13 +00:00
Paul Eggert
aa976a5170 * NEWS: New option --atime-preserve=system, which uses O_NOATIME.
* configure.ac: Prefer AC_CHECK_HEADERS_ONCE to AC_CHECK_HEADERS.
Check for stropts.h and sys/filio.h too, for _FIOSATIME.
* doc/tar.texi: Change "modification time" to "data modification
time", "change time" to "status change time", and "filesystem" to
"file system", so that we use terminology consistent with POSIX.
Use American spacing rather than French for sentence ends.
"non-dependable" -> "undependable".
(Option Summary, Attributes): Explain better the pitfalls of the
--atime-preserve option, and suggest read-only mounts,loopback
mounts, and noatime mounts for older systems.
* doc/value.texi (op-atime-preserve-system): Renamed from
op-atime-preserver-system to fix a misspelling.
* src/common.h (enum atime_preserve): Use lower case for enum values.
* src/compare.c: Don't include utimens.h; no longer needed.
(diff_file): Use set_file_atime rather than utimens; avoid closing
diff_handle until after this, so that we can set the file time stamp
via the file descriptor rather than via its name.
* src/create.c: Don't include utimens.h; no longer needed.
(dump_regular_finish): Remove.  All callers now do its work inline.
(dump_dir): New arg FD.  All callers changed.
Use fdsavedir rather than savedir.
(unknown_file_error): Arg is a const pointer now.
(dump_file0): 2nd arg is a const pointer now.
Treat directories more like files, with respect to --atime-preserve.
For example, also warn if a directory changes while we are dumping it.
Prefer file descriptors to file names when retrieving/setting file
attributes; this saves path-resolution time and allows us to avoid
changing mtime/ctime on Solaris when restoring atime as root.
Use O_DIRECTORY when opening directories, to avoid some race conditions.
Do not reset atime if mtime has changed.  Report an error if
we cannot reset atime.

First cut at adding support for --atime-preserve=system.
* doc/tar.texi (Option Summary): First cut at documenting it.
All other uses of --atime-preserve changed to --atime-preserve=replace.
* doc/value.texi (op-atime-preserve-replace, op-atime-preserver-system):
New.
(op-atime-preserve): Mention METHOD.
* src/common.h (atime_preserve): New enum.
(atime_preserve_option): Now of the enum type rather than bool.
All uses changed.
* src/compare.c (diff_file): Read with O_NOATIME if asked for.
* src/create.c (dump_file0): Read regular and CTG files with O_NOATIME
if asked for.
* src/tar.c (usage): Mention new usage.
(parse_opt): Parse new usage.
2005-11-29 19:14:21 +00:00
Paul Eggert
7b00db5675 Convert back to UTF-8, sort (using LC_ALL=en_US.UTF-8
on Debian stable), and consistently use tabs rather than spaces.
2005-11-29 18:53:34 +00:00
Sergey Poznyakoff
36be286c03 Update 2005-11-27 12:00:42 +00:00
Sergey Poznyakoff
d543d2dbbd Remove prematurely introduced parts of new MV format support 2005-11-27 11:59:34 +00:00
Sergey Poznyakoff
5df61b429a Update 2005-11-26 19:32:55 +00:00
Sergey Poznyakoff
9590e781c0 (xheader_format_name): Fix memory leak. 2005-11-26 19:31:02 +00:00
Sergey Poznyakoff
87dfaf3176 Update 2005-11-11 12:18:14 +00:00
Sergey Poznyakoff
c81a5e8bf5 Close stdin so that if something fails causing tar to ask for the next volume, it won't hang the testsuite. 2005-11-11 12:17:38 +00:00
Sergey Poznyakoff
b5775215d7 (confirm): Rewritten using rpmatch.
(decode_options): Minor optimizations
(main): Call stdopen() to ensure the first three descriptors are
open.
2005-11-11 12:17:10 +00:00
Sergey Poznyakoff
df970c7332 Add rpmatch.c 2005-11-11 12:16:41 +00:00
Sergey Poznyakoff
f1f3b524f6 Add stdopen, imported from coreutils. 2005-11-11 12:16:28 +00:00
Sergey Poznyakoff
575ea074cc Add rpmatch 2005-11-11 12:15:46 +00:00
Sergey Poznyakoff
6204e3c718 Updated 2005-11-11 00:28:27 +00:00
Sergey Poznyakoff
ecce6f3e9a (Tarcat): New node 2005-11-11 00:27:58 +00:00
Sergey Poznyakoff
85890103ae Handle archives in pax format. Improve handling of traditional archives. 2005-11-11 00:27:21 +00:00
Sergey Poznyakoff
7e51be5fe2 Update 2005-11-11 00:26:39 +00:00
Sergey Poznyakoff
05ba292a93 (AT_TAR_CHECK): Define TEST_TAR_FORMAT 2005-11-11 00:26:18 +00:00
Sergey Poznyakoff
1ebdd88caf (xheader_format_name): Remove static
qualifier. Change last argument.
Correct buffer size calculation (allocated too much space).
(xheader_write): Increase global_header_count here ...
(xheader_write_global): ... instead of here
2005-11-11 00:26:09 +00:00
Sergey Poznyakoff
b6d3432810 (write_extended): Change type and meaning of the first argument. All callers updated 2005-11-11 00:25:41 +00:00
Sergey Poznyakoff
1e8f6d41c4 (flush_read,flush_write): Functions, again.
(write_extended): Changed declaration
(xheader_format_name): New declaration
2005-11-11 00:25:20 +00:00
Sergey Poznyakoff
5b1df7b55e (flush_write,flush_read): Change data type.
(flush_archive): Compute actual buffer fill level before calling
low level function.
(close_archive): Call flush_archive again if the first call
resulted in partially filled buffer.
(try_new_volume): Rewritten handling of initial headers.
(add_chunk_header): New function. Write an additional header
before the continuation chunk. The purpose of the header is to
allow third-party tars to extract the member.
(simple_flush_write): Take an argument.
(_gnu_flush_write): Correctly handle partially filled buffers.
2005-11-11 00:24:52 +00:00
Sergey Poznyakoff
692f449623 Updated 2005-11-10 13:01:34 +00:00
Sergey Poznyakoff
5f060c2025 Add new test cases 2005-11-10 13:00:11 +00:00
Sergey Poznyakoff
d1867fd76c (xhdr_tab): New keyword GNU.volume.filename. 2005-11-10 12:59:38 +00:00
Sergey Poznyakoff
813aa07a89 Do not pad compressed output if it goes to stdout. 2005-11-10 12:59:25 +00:00
Sergey Poznyakoff
9a42d94543 (sparse_dump_region): Call mv_size_left.
(sparse_dump_file): Enclose the loop in mv_begin/mv_end.
2005-11-10 12:59:13 +00:00
Sergey Poznyakoff
b9b37ee191 (try_new_volume): Bugfix. Always check
continued_file_name. If it is absent, the volume is out
of sync.
(add_multi_volume_header): Create GNU.volume.filename keyword in
the extended header.
2005-11-10 12:58:43 +00:00
Sergey Poznyakoff
04549e1f21 Update 2005-11-09 13:13:00 +00:00
Sergey Poznyakoff
f3a24a7a51 (AT_KEYWORDS): Improve to allow executionof related tests in groups. 2005-11-09 13:09:44 +00:00
Sergey Poznyakoff
e1286c1989 (xhdr_tab): Support for new GNU keywords. 2005-11-09 13:09:25 +00:00
Sergey Poznyakoff
5eecc4c994 (decode_options): Allow to use --multi-volume and --label with pax archives. 2005-11-09 13:09:12 +00:00
Sergey Poznyakoff
cb3d8b0db9 Use mv_.* functions where necessary. 2005-11-09 13:08:55 +00:00
Sergey Poznyakoff
52429bb956 Use mv_.* functions uniformly instead of fiddling with the global variables. 2005-11-09 13:08:42 +00:00
Sergey Poznyakoff
7200f4f5f7 (save_name,save_sizeleft,save_totsize): Remove
globals.
(volume_label,continued_file_name,continued_file_size): New
variables.
(flush_read,flush_write): Pointers to functions
(mv_begin,mv_end,mv_total_size,mv_size_left): New functions
(write_extended): New function.
2005-11-09 13:08:13 +00:00
Sergey Poznyakoff
737b0251de Rewritten in a more modular fashion to provide
GNU extensions (multi-volume archives and archive labels) in
pax format.
(volume_label,continued_file_name,continued_file_size)
(continued_file_offset): New globals.
(save_name,save_totsize,save_sizeleft): Make static
(mv_begin,mv_end,mv_total_size,mv_size_left): New functions
(open_archive,flush_write,flush_read): Rewritten
2005-11-09 13:07:45 +00:00
Sergey Poznyakoff
48d508b78b Update 2005-11-09 13:07:26 +00:00
Paul Eggert
57c2124d68 * src/tar.c (NS_PRECISION_FORMAT_MASK): New macro.
(tar_timespec_cmp): New function. Wrapper over
timespec_cmp using the timespec precision provided by the
current archive format.
* src/common.h (tar_timespec_cmp): New declaration.
* src/compare.c (diff_file): Use tar_timespec_cmp.
* src/extract.c (file_newer_p): Likewise.
* src/update.c (update_archive): Likewise.
* tests/truncate.at: Reverted changes
* tests/update.at: Reverted changes
2005-11-08 07:20:02 +00:00
Paul Eggert
06379466c1 (xheader_store): Last arg is void const *. 2005-11-07 05:11:55 +00:00
Paul Eggert
3eec6b3f46 (xheader_store): Last arg here is void const *, too. 2005-11-07 05:11:40 +00:00
Paul Eggert
60f8dd83b8 (struct xhdr_tab.coder): Last arg is void const *,
not void *, to avoid create.c warning from GCC "passing argument 3
of 'xheader_store' discards qualifiers from pointer target type".
(dummy_coder, atime_coder, gid_coder, gname_coder, linkpath_coder):
(ctime_coder, mtime_coder, path_coder, size_coder, uid_coder):
(uname_coder, sparse_size_coder, sparse_numblocks_coder):
(sparse_offset_coder, sparse_numbytes_coder, dumpdir_coder):
Likewise.
2005-11-07 05:03:09 +00:00
Paul Eggert
cfbf693855 * tests/truncate.at: Create files whose time stamps must fall on
1-second boundaries.  This prevents tests from failing on hosts
like Solaris 8 that have nanosecond-resolution file time stamps.
* tests/update.at: Likewise.
2005-11-07 04:03:29 +00:00
Sergey Poznyakoff
35f5b48815 Update 2005-11-07 02:55:25 +00:00
Sergey Poznyakoff
374ae10d39 (xheader_keyword_deleted_p): Remove static
qualifier.
(struct xhdr_tab.decoder): Change prototype. POSIX allows string
values to contain embedded nulls, so take an extra argument
specifying the length of the string.
(decx,decg,dummy_decoder,atime_decoder,gid_decoder)
(gname_decoder,linkpath_decoder,ctime_decoder,mtime_decoder)
(path_decoder,size_decoder,uid_decoder,uname_decoder)
(sparse_size_decoder,sparse_numblocks_decoder)
(sparse_offset_decoder,sparse_numbytes_decoder): Likewise.
(decode_record): Pass value length to the handler
(run_override_list): Pass value length to the decoder
(xheader_print_n): New function
(xheader_print): Rewritten using xheader_print_n
(xheader_finish): Do not rely om strlen to compute the length of
the collected string: it can contain embedded nulls
(xheader_string_begin,xheader_string_add,xheader_string_end): New
functions.
(sparse_map_decoder,dumpdir_coder,dumpdir_decoder): New
functions. Handle GNU.sparse.map and GNU.dumpdir variables.
(xhdr_tab): Add new variables.
2005-11-07 02:52:58 +00:00
Sergey Poznyakoff
4d22cbd47c Test gnu, oldgnu, and posix formats 2005-11-07 02:51:22 +00:00
Sergey Poznyakoff
e20e79e7ff (struct tar_stat_info.dumpdir): New member. 2005-11-07 02:50:25 +00:00
Sergey Poznyakoff
f865597c89 Incremental options are allowed with --format=pax
(tar_stat_destroy): Free dumpdir
2005-11-07 02:50:14 +00:00
Sergey Poznyakoff
1b9c48d934 (sparse_diff_file): Bugfix: set seekable.
(pax_dump_header): Store sparse map in GNU.sparse.map. If this
variable has been explicitely deleted, use GNU.sparse.offset/
GNU.sparse.numbytes variables.
2005-11-07 02:49:45 +00:00
Sergey Poznyakoff
f6458a827a (list_archive): Handle incremental backups in pax
format.
(decode_header): Initialize stat_info.dumpdir
2005-11-07 02:49:23 +00:00
Sergey Poznyakoff
08a8d2dec6 (dumpdir_size, get_gnu_dumpdir): New functions.
(purge_directory): Use stat_info.dumpdir instead of getting its
value explicitely.
2005-11-07 02:48:51 +00:00
Sergey Poznyakoff
aea1d50da9 (dump_dir0): Handle incremental backups in pax archives 2005-11-07 02:48:23 +00:00
Sergey Poznyakoff
588232f859 (dumpdir_size,get_gnu_dumpdir)
(xheader_string_begin,xheader_string_add)
(xheader_string_end): New functions.
2005-11-07 02:48:08 +00:00
Paul Eggert
4c4c5a4dc1 Minor language and white space fixes. 2005-11-07 00:25:52 +00:00
Paul Eggert
d144e7c217 * tests/truncate.at: Use -H pax to preserve full time stamp resolution.
This prevents tests from failing on hosts like Solaris 8 that have
nanosecond-resolution file time stamps.
* tests/update.at: Likewise.
2005-11-06 23:29:30 +00:00
Paul Eggert
ef9ad717ba * src/xheader.c (strtoimax, strtoumax): Remove decls; now done
in system.h.
2005-11-06 22:48:34 +00:00
Sergey Poznyakoff
85ce2c24f8 Update 2005-11-06 11:52:02 +00:00
Sergey Poznyakoff
d01f65092c Properly document incremental dumps 2005-11-06 11:51:12 +00:00
Sergey Poznyakoff
04e2551256 Update 2005-11-05 16:49:47 +00:00
Sergey Poznyakoff
8b2504deca Update 2005-11-05 16:49:17 +00:00
Sergey Poznyakoff
ad09c8373b New file 2005-11-05 16:47:49 +00:00
Sergey Poznyakoff
5b91f80787 Update 2005-11-05 15:57:07 +00:00
Sergey Poznyakoff
ef981aae38 Never skip the test. It should work on any filesystem 2005-11-05 15:55:38 +00:00
Sergey Poznyakoff
36f1d689e4 Sleep 1 sec before creating second file. 2005-11-05 15:55:19 +00:00
Sergey Poznyakoff
1e304fc5fd (struct directory.mtime): New member.
(note_directory): Take additional arguments. All callers updated.
(scan_directory): Updated to use more metadata. In particular,
this allows to correctly detect renamed files.
(read_directory_file,write_directory_file)
(write_directory_file_entry): Support new directory file format.
2005-11-05 15:55:05 +00:00
Sergey Poznyakoff
b100f6ae5b (dump_file): Call update_parent_directory. 2005-11-05 15:54:30 +00:00
Sergey Poznyakoff
a6d2158837 (update_parent_directory): New prototype. 2005-11-05 15:54:14 +00:00
Paul Eggert
c641a16cba (set_stat): Rewrite to avoid bug in Forte
Developer 7 C 5.4 Patch 111708-09 (2004-02-19).
2005-11-04 21:25:47 +00:00
Sergey Poznyakoff
65a7536d1f Updated 2005-11-04 12:42:03 +00:00
Sergey Poznyakoff
8c119485a9 Updated 2005-11-04 12:41:25 +00:00
Sergey Poznyakoff
a02a9ed099 Update 2005-11-04 07:48:32 +00:00
Sergey Poznyakoff
71976fa77e Add Eric Blake 2005-11-04 07:38:44 +00:00
Sergey Poznyakoff
c2552c6c40 Fix quoting in help output.
(update_po): Use backward-compatible wget option --cache instead
of deprecated -C to accomodate for wget 1.10.
Changes proposed by Eric Blake
2005-11-04 07:38:23 +00:00
Paul Eggert
b272b3e2cf * doc/tar.texi: Consistently put two spaces after sentences,
and put commas after "i.e." and "e.g.".  This is the usual GNU
style in manuals.
2005-11-02 23:03:39 +00:00
Paul Eggert
c44d0d037f * lib/.cvsignore: Accommodate recent gnulib changes. 2005-11-02 22:45:07 +00:00
Paul Eggert
9c50f854a6 Add creat-safer.c, fcntl--.h, fcntl-safer.h,
open-safer.c, openat-die.c, verify.h, to accommodate recent gnulib
changes.
2005-11-02 22:44:46 +00:00
Sergey Poznyakoff
fc42672fe0 Updated 2005-10-28 09:29:31 +00:00
Sergey Poznyakoff
64aea5de53 If file `.bootstrap' exists in the cwd and is readable, prepend its contents to the command line 2005-10-28 09:29:16 +00:00
Sergey Poznyakoff
391c6f6bdb Add John Thomas McDole 2005-10-28 09:28:39 +00:00
Sergey Poznyakoff
9684c2728d (diff_dumpdir): Pass a valid device number to get_directory_contents. 2005-10-28 09:28:20 +00:00
Sergey Poznyakoff
cb8aacd9ef Updated 2005-10-21 18:15:09 +00:00
Sergey Poznyakoff
3ae9e51181 Skip test if ln fails (suppose the OS does not support hard links) 2005-10-21 18:13:59 +00:00
Sergey Poznyakoff
7a246ab602 Updated 2005-10-04 07:31:28 +00:00
Sergey Poznyakoff
35b9ca72db (decode_options): Report error if -A or -r is used together with compression option. 2005-10-04 07:30:48 +00:00
Sergey Poznyakoff
ecdef9daaa Fix cover page 2005-09-30 19:49:37 +00:00
Sergey Poznyakoff
eb744655a8 Updated 2005-09-29 16:31:27 +00:00
Sergey Poznyakoff
57fcb1639e Use @option and @kbd consistently. Document new options. 2005-09-29 16:28:06 +00:00
Sergey Poznyakoff
49f39c25b4 Updated 2005-09-28 20:42:39 +00:00
Sergey Poznyakoff
40da86b2a1 Implement --show-stored-names option 2005-09-28 20:41:57 +00:00
Sergey Poznyakoff
15b75f848e (print_header): If show_stored_names_option is given,
list member names as stored in the archive. Patch proposed by Erik
Cumps <erik.cumps@icos.be>
2005-09-28 20:41:38 +00:00
Sergey Poznyakoff
2a25112552 (show_stored_names_option): New variable 2005-09-28 20:41:10 +00:00
Sergey Poznyakoff
b2b60efaaf Updated 2005-09-28 19:42:09 +00:00
Sergey Poznyakoff
ddb0f96f00 New option --test-label tests the archive volume label. The option proposed by Wouter Verhelst 2005-09-28 19:41:40 +00:00
Sergey Poznyakoff
13aead50a8 (all_names_found): If test_label_option is set return true 2005-09-28 19:41:15 +00:00
Sergey Poznyakoff
8f1d2fd9c3 (print_header): Special handling if test_label_option is set 2005-09-28 19:41:00 +00:00
Sergey Poznyakoff
a274294656 (test_label_option): New variable 2005-09-28 19:40:41 +00:00
Paul Eggert
63f64e4aaf * tests/Makefile.am (clean-local): Don't attempt to run
$(TESTSUITE) if it doesn't exist.  Problem reported by
Eric Blake.
2005-09-21 19:26:12 +00:00
Paul Eggert
3209329337 Don't filter time stamps through the resolution supported
by struct stat; keep them to full nanosecond resolution.
This affects behavior only on older hosts or file systems
that have lower-resolution time stamps.
* src/common.h (OLDER_STAT_TIME): Parenthesize arg.
(OLDER_TAR_STAT_TIME): New macro.
(code_timespec): New function.
(BILLION, LOG10_BILLION, TIMESPEC_STRSIZE_BOUND): New constants.
* src/compare.c (diff_file): Use full time stamp resolution.
* src/create.c (start_header, dump_file0): Likewise.
(start_header, dump_file0): Adjust to new structure layout.
(dump_regular_finish): Simplify by using timespec_cmp.
* src/extract.c (struct delayed_set_stat): Don't store stat info
that we don't need, to save space.  All uses changed.
(struct delayed_set_stat, struct delayed_link, file_newer_p):
(create_placeholder_file, extract_link, apply_delayed_links):
Use full time stamp resolution.
(check_time): Use code_timespec rather than rolling our own code.
(set_stat, delay_set_stat): Arg now points to tar_stat_info to
avoid losing time information.  All callers changed.
* src/list.c (read_and, decode_header, print_heaeder):
Use full time stamp resolution.
* src/misc.c (code_timespec): New function.
* src/tar.h (struct tar_stat_info): Record atime, mtime, ctime
separately, for benefit of hosts with lower resolution.
* src/update.c (update_archive): Use full time stamp resolution.
* src/xheader.c (code_time): Use new code_timespec function
to simplify code.
(atime_coder, atime_decoder, ctime_coder, ctime_decoder):
(mtime_coder, mtime_decoder): Use full time stamp resolution.

Report time stamps to full resolution in environment.
Report memory allocation failures rather than ignoring them.
* src/system.c (time_to_env): New function.
(oct_to_env, str_to_env, chr_to_env): Report memory allocation failures.
(stat_to_env): Report full resolution in time stamps.
2005-09-17 06:41:55 +00:00
Paul Eggert
2f800ce3fb Merge changes from gnulib for file system sub-second time stamps.
* configure.ac: Remove checks for struct stat.st_spare1, struct
stat.st_atim.tv_nsec, struct stat.st_atimespec.tv_nsec, struct
stat.st_atimensec, as gnulib now does this for us.
Similarly for LIB_CLOCK_GETTIME.
* gnulib.modules: Add stat-time.
* lib/.cvsignore: Add stat-time.h.
* src/common.h: Include stat-time.h.
(timespec_lt): Remove.  All callers changed to use timespec_cmp.
(get_stat_atime, get_stat_ctime, get_stat_mtime):
(set_stat_atime, set_stat_ctime, set_stat_mtime):
Remove; now defined by stat-time.h.
2005-09-16 07:03:44 +00:00
Sergey Poznyakoff
ae5473fe02 Updated 2005-09-14 13:25:57 +00:00
Sergey Poznyakoff
1f4437aa66 (list_dumpdir): New function. 2005-09-14 13:25:41 +00:00
Sergey Poznyakoff
8952196bc1 (list_archive): Use list_dumpdir() to display GNUTYPE_DUMPDIR blocks. Do that only if two or more -v options are given. 2005-09-14 13:23:38 +00:00
Sergey Poznyakoff
9093ca15d8 (list_dumpdir): New function. Used to dump contents of GNUTYPE_DUMPDIR blocks. 2005-09-14 13:23:12 +00:00
Paul Eggert
76efed4ca4 hard link patches 2005-09-12 18:46:38 +00:00
Paul Eggert
a2b6327eda Adjust to current gnulib and modules used.
Add getdelim.c, getdelim.h, mbchar.c, mbchar.h, mbuiter.h, memchr.c,
pipe-safer.c, size_max.h, strdup.c, strdup.h, strnlen.h, strnlen1.c,
strnlen1.h, unistd--.h.
Remove getndelim2.c, getndelim2.h, pathmax.h, sysexits.h, xstrdup.c.
2005-09-12 18:46:26 +00:00
Paul Eggert
af5d05729a Treat fishy-looking hard links like fishy-looking symlinks.
(struct delayed_set_stat): Rename after_symlinks
member to after_links.  All uses changed.
(struct delayed_link): Renamed from struct delayed_symlink.
All uses changed.  New member is_symlink.
(delayed_link_head): Renamed from delayed_symlink_head.  All uses
changed.
(create_placeholder_file): New function, taken from extract_symlink.
(extract_link): Create placeholders for fishy-looking hard links.
(extract_symlink): Move code into create_placeholder_file.
(apply_delayed_links): Renamed from apply_delayed_symlinks.
All uses changed.  Create both hard links and symlinks.
2005-09-12 18:45:59 +00:00
Paul Eggert
3070fff7d7 Mention gzip version problems, and valgrind. 2005-09-03 21:00:10 +00:00
Paul Eggert
6bb5c17aea * README-alpha: Modernize description of software required for
developers.
2005-09-03 20:54:59 +00:00
Sergey Poznyakoff
ecd43c1314 Update 2005-09-03 10:29:19 +00:00
Sergey Poznyakoff
f58c189f3e Updated 2005-09-03 10:28:29 +00:00
Sergey Poznyakoff
931e305002 Add incr01.at 2005-09-03 10:28:17 +00:00
Sergey Poznyakoff
a57ecc51aa New test. 2005-09-03 10:27:39 +00:00
Sergey Poznyakoff
a5375b618c (purge_directory): Do not dereference symbolic links. Bug reported by Ralph Corderoy <ralph@inputplus.co.uk> and David Brown <davidb@davidb.org> 2005-09-03 10:27:13 +00:00
Sergey Poznyakoff
c40ba72fd3 Add strdup 2005-09-03 10:24:45 +00:00
Sergey Poznyakoff
eacde4bca7 Updated 2005-08-17 14:52:12 +00:00
Sergey Poznyakoff
220ffceb44 (read_directory_file): Use strtoumax to read snapshot file contents. 2005-08-17 14:51:50 +00:00
Sergey Poznyakoff
b65b1ff9eb Updated 2005-08-01 06:28:15 +00:00
Sergey Poznyakoff
e0b0becead Remove dependency on file order. 2005-08-01 06:22:43 +00:00
Sergey Poznyakoff
c9c76e7d56 (file_dumpable_p,dump_file0): Fix handling of sparse files to /dev/null with --totals option. 2005-08-01 06:22:21 +00:00
Sergey Poznyakoff
9d23481b5f Updated 2005-07-08 14:40:59 +00:00
Sergey Poznyakoff
aa76a67b76 Fix typo 2005-07-08 14:40:26 +00:00
Sergey Poznyakoff
59a4026674 Updated 2005-07-07 16:20:19 +00:00
Sergey Poznyakoff
9106e53684 Pipe the output from `tar xfv' through sort. 2005-07-07 16:20:03 +00:00
Sergey Poznyakoff
a34b0ad8c9 Updated 2005-06-25 09:13:20 +00:00
Sergey Poznyakoff
1992b53b8c (tar_sparse_init): Fill structure with zeros. Call
sparse_select_optab(). All callers updated.
(sparse_member_p, sparse_fixup_header): Use tar_sparse_init().
2005-06-25 09:13:01 +00:00
Sergey Poznyakoff
f319c5575b Updated 2005-06-23 12:57:38 +00:00
Sergey Poznyakoff
44ce72fa96 Adapt to the new output format 2005-06-23 12:57:18 +00:00
Sergey Poznyakoff
2e9ea5f4a7 (pax_sparse_member_p): Checking member size vs. file size is not reliable enough. Use sparse_map_avail. 2005-06-23 12:57:07 +00:00
Sergey Poznyakoff
4bd38118e0 Updated 2005-06-23 12:17:00 +00:00
Sergey Poznyakoff
b65039526c Updated 2005-06-23 12:16:00 +00:00
Sergey Poznyakoff
fb1b9e3d0f New test. 2005-06-23 12:15:50 +00:00
Sergey Poznyakoff
aedacf9d29 Updated 2005-06-23 09:51:31 +00:00
Sergey Poznyakoff
d9045bf409 (size_decoder): Do not set archive_file_size 2005-06-23 09:51:05 +00:00
Sergey Poznyakoff
8d52260315 Updated 2005-06-23 09:10:51 +00:00
Sergey Poznyakoff
225e690142 (sparse_scan_file): Fix another bug, introduced yesterday: Initialize
archive_file_size to 0. The variable keeps size of the file *as stored
in the archive*, not the size reported by stat.
2005-06-23 09:10:28 +00:00
Sergey Poznyakoff
c877b48d68 Updated 2005-06-23 08:27:41 +00:00
Sergey Poznyakoff
37d2462d7c (tar_sparse_init): Fix recent bugfixes: Initialize dumped_size to 0. 2005-06-23 08:27:22 +00:00
Paul Eggert
040b5ab5f9 A sweep of the sparse code prompted by a bug report by Jim Meyering.
* src/sparse.c: Include <inttostr.h>.
(struct tar_sparse_file): offset and dumped_size are off_t, not
size_t.  optab is now const *.
(dump_zeros): Return bool success flag, not off_t.
All callers changed.
Use a constant-zero buffer rather than clearing a buffer each time.
Don't mess up if write fails.
(dump_zeros, check_sparse_region):
Don't assume off_t is no wider than size_t.
(tar_sparse_init): Don't bother clearing a field that is already clear.
(zero_block_p): First arg is const *, not *.
(clear_block, SPARSES_INIT_COUNT): Remove.
(sparse_add_map): First arg is now struct start_stat_info *, not
struct tar_sparse_file *.  All callers changed.
Use x2nrealloc to check for size_t overflow.
(parse_scan_file): Cache commonly-used parts of file.
Use an auto buffer, not a static one.
Don't bother clearing the buffer; not needed.
Don't bother clearing items that are already clear.
(oldgnu_optab, star_optab, pax_optab): Now const.
(sparse_dump_region): Don't bother clearing the buffer before
reading into it; just clear the parts that aren't read into.
(sparse_dump_file): Clear the whole local variable 'file'.
(diff_buffer): Remove; now a local var.
(check_sparse_region): Don't bother clearing buffer before
reading into it.  Don't assume off_t is promoted to long.
(oldgnu_get_sparse_info, star_get_sparse_info):
Use an auto status, not static.
* src/tar.h (struct tar_stat_info): had_trailing_slash is
now bool, not int.
* src/xheader.c (sparse_offset_coder, sparse_numbytes_coder):
Rewrite to avoid cast.
(sparse_offset_decoder, sparse_numbytes_decoder):
Diagnose excess entries rather than crashing.
2005-06-23 06:55:01 +00:00
Paul Eggert
4f4a858eb6 * src/common.h (timespec_lt): Add a return type: bool. 2005-06-23 03:19:03 +00:00
Paul Eggert
d659cbaccd Carefully crafted invalid headers can cause buffer overrun.
Invalid header fields go undiagnosed.
Some valid time strings are ignored.

* NEWS: Better support for full-resolution time stamps.
The -v option now prints time stamps only to 1-minute resolution.
* gnulib.modules: Add utimens.
* lib/.cvsignore: Add imaxtostr.c, inttostr.c, inttostr.h,
offtostr.c, umaxtostr.c, utimens.c, utimens.h.  Remove paxconvert.c.
* lib/Makefile.tmpl (libtar_a_SOURCES): Remove paxconvert.c.
* lib/paxconvert.c: Remove; superseded by umaxtostr.c.
* po/POTFILES.in: Remove lib/paxconvert.c.  Add lib/xalloc-die.c,
lib/obstack.c.
* src/buffer.c (set_start_time, compute_duration, start_time):
Use gettime rather than rolling our own code.
* src/common.h (OLDGNU_NAME_FIELD_SIZE, MAXOCTAL11, MAXOCTAL7): Remove.
(newer_ctime_option): Remove.
(timespec_lt): New function.
(OLDER_STAT_TIME): Use it.
(string_to_chars): First arg is char const *, not char *.
(tartime): Time arg is now struct timespec.  New bool arg.
All callers changed.
(code_ns_fraction): New decl.
(sys_stat_nanoseconds): Remove decl.
(get_stat_atime, get_stat_ctime, get_stat_mtime): New functions.
(set_stat_atime, set_stat_ctime, set_stat_mtime): New functions.
* src/compare.c: Include utimens.h rather than rolling our own.
(diff_dir, diff_file, diff_link, diff_symlink, diff_special):
Prototype.
(diff_dumpdir, diff_multivol): Prototype.
(diff_file): Support higher-resolution time stamps.
* src/create.c: Include utimens.h rather than rolling our own.
(MAX_OCTAL_VAL): New macro.
(tar_copy_str, string_to_chars): Don't bother to zero-fill;
the destination is already zeroed.
(string_to_chars): First arg is char const *.
(start_private_header): Use MINOR_TO_CHARS, not MAJOR_TO_CHARS,
for minor device number.
(write_header_name, dump_hard_link, dump_file0):
Simplify test for old GNU format.
(start_header): Put in placeholders for uid, etc., even when
using extended headers, for benefit of older "tar" implementations.
Don't assume uintmax_t is wider than 32 bits.
Output extended header for mtime if needed.
(dump_regular_finish, dump_file0):
Support extended time stamp resolution.
* src/extract.c: Include utimens.h rather than rolling our own.
(check_time): Support extended time stamp resolution.
* src/list.c: Include <inttostr.h>.
(tartime): Use umaxtostr rather than stringify_uintmax_t_backwards.
* src/xheader.c: Include <inttostr.h>.
Do not include <xstrtol.h>.
(strtoimax) [!HAVE_DECL_STRTOIMAX && !defined strtoimax]: New decl.
(strtoumax) [!HAVE_DECL_STRTOUMAX && !defined strtoumax]: New decl.
(BILLION, LOG10_BILLION): New constants.
(to_decimal): Remove; superseded by inttostr.  All callers changed
to use umaxtostr.
(xheader_format_name): Don't assume pids and uintmax_t values
fit in 63 bytes (!) when printed.
(decode_record): Don't bother to check for ERANGE; an out of range
value must be treater than len_max anyway.
If the length is out of range, output it in the diagnostic.
(format_uintmax): Remove; all callers changed to use umaxtostr.
(xheader_print): Don't assume sizes can be printed in 99 bytes (!).
(out_of_range_header): New function.
(decode_time): Use it.
(code_time): Accept struct timespec, not time_t and unsigned long.
All callers changed.  Size sbuf properly, and remove unnecessary check.
Don't assume time stamps can fit in 199 bytes.
Handle negative time stamps.  Handle fractional time stamps
more consistently.  Don't output unnecessary trailing zeros.
(decode_time): Yield struct timespec, not time_t and unsigned long.
All callers changed.
Handle negative time stamps.  Truncate towards minus infinity
consistently.  Improve overflow checks, and output a better
diagnostic on overflow.
(code_num): Don't assume uintmax_t can be printed in 99 bytes (!).
(decode_num): New function, for better diagnostics.
(atime_coder, atime_decoder, gid_decoder, ctime_coder):
(ctime_decoder, mtime_coder, mtime_decoder, size_decoder):
(uid_decoder, sparse_size_decoder, sparse_numblocks_decoder):
(sparse_offset_decoder, sparse_numbytes_decoder):
Use decode_num, etc., instead of xstrtoumax, etc.

* src/xheader.c (sparse_numblocks_decoder): Remove unchecked use
of `calloc'.  Use xcalloc instead.
(decode_time, gid_decoder, size_decoder, uid_decoder):
(sparse_size_decoder, sparse_offset_decoder, sparse_numblocks_decoder):
Ensure that the result of calling xstrtoumax is no larger than
the maximum value for the target type.  Upon any failure, exit with
a diagnostic.
(sparse_numblocks_decoder): Avoid buffer overrun/heap corruption:
use x2nrealloc, rather than `n *= 2' and xrealloc(p, n,....
(decode_time): Rewrite to accept time strings like
1119018481.000000000.  Before, such strings were always ignored.
2005-06-22 06:24:39 +00:00
Sergey Poznyakoff
f6445e4ed6 Updated 2005-06-13 19:14:52 +00:00
Sergey Poznyakoff
3fe8fc3ef9 Add update.at 2005-06-13 19:11:43 +00:00
Sergey Poznyakoff
372ff169e7 New test 2005-06-13 19:10:56 +00:00
Sergey Poznyakoff
c6cde895e3 (dump_file0): Check for is_avoided_name() first. Fixes bug reported by Martin Lohmeier 2005-06-13 19:09:45 +00:00
Sergey Poznyakoff
28b44cc69c Updated 2005-06-13 12:54:45 +00:00
Sergey Poznyakoff
eb70fd51cb (AC_STRUCT_ST_BLKSIZE,AC_STRUCT_ST_BLOCKS): Removed. Handled by system.m4. 2005-06-13 12:53:25 +00:00
Paul Eggert
5c4ea58bd7 * src/names.c (excluded_name): excluded_filename ->
excluded_file_name, because the name was changed in gnulib.
2005-06-02 21:02:58 +00:00
Sergey Poznyakoff
85ad04d822 Updated 2005-05-30 15:15:25 +00:00
Sergey Poznyakoff
fb7b2f3645 (read_name_from_file,update_argv): Automatically detect nul-terminated list files. 2005-05-30 15:15:10 +00:00
Sergey Poznyakoff
ab03bd6a2c Updated 2005-05-30 13:38:21 +00:00
Sergey Poznyakoff
9d5fd390dc Bugfixes. 2005-05-27 12:03:39 +00:00
Sergey Poznyakoff
e5e43aa7a4 Updated 2005-05-26 12:51:18 +00:00
Sergey Poznyakoff
77e56f876d Document new backup scripts behavior 2005-05-26 12:50:43 +00:00
Sergey Poznyakoff
2c49c610be (mt_begin,mt_rewind,mt_offline,mt_status): Use $MT to invoke mt
(init_common): Set --rsh-command option for mt if TAPE_FILE is a
 remote archive.
2005-05-26 12:50:30 +00:00
Sergey Poznyakoff
ec89da307c Minor fixes 2005-05-26 12:50:11 +00:00
Sergey Poznyakoff
ee870c97b9 Updated 2005-05-21 23:13:38 +00:00
Sergey Poznyakoff
ca5e64504b (hash_string_hasher,hash_string_compare)
(hash_string_insert,hash_string_lookup,removed_prefixes_p)
(safer_name_suffix): Moved to paxutils
2005-05-21 23:11:26 +00:00
Sergey Poznyakoff
cc07b9e170 Include paxlib.h instead of paxerror.h
(safer_name_suffix,removed_prefixes_p): Removed. The functions are
imported from paxutils
2005-05-21 23:10:57 +00:00
Sergey Poznyakoff
f2c8b1dff3 Update invocations of safer_name_suffix() 2005-05-21 23:10:42 +00:00
Sergey Poznyakoff
9129c846e7 Add new paxutils files 2005-05-21 23:09:42 +00:00
Sergey Poznyakoff
df0913f3fe Updated 2005-05-21 23:09:16 +00:00
Sergey Poznyakoff
e20fdceb38 Updated 2005-05-19 15:35:14 +00:00
Sergey Poznyakoff
5c35fdb275 Remove defines and declarations imported from paxutils 2005-05-19 15:34:19 +00:00
Sergey Poznyakoff
113b619383 Add paxerror.c paxexit.c paxconvert.c 2005-05-19 15:33:45 +00:00
Sergey Poznyakoff
517205c31c (libtar_a_SOURCES): Add paxerror.c paxexit.c paxconvert.c 2005-05-19 15:33:17 +00:00
Sergey Poznyakoff
dfabe2397a Remove checking for LIB_SETSOCKOPT, it is handled by paxutils 2005-05-19 15:32:56 +00:00
Sergey Poznyakoff
8f1f0955cf (copy_files): Accept optional third argument: a prefix
to be appended to destination file names.
Import paxutils/paxlib files.
2005-05-19 15:32:38 +00:00
Paul Eggert
1672258959 * src/misc.c (remove_any_file): Fix typo in previous change. 2005-05-17 08:34:16 +00:00
Paul Eggert
c172481f41 (remove_any_file): Fix typo in previous change. 2005-05-17 08:34:03 +00:00
Paul Eggert
46f09016e8 Port to Solaris 10's treatment of unlinking directories.
* gnulib-modules: Add unlinkdir.
* lib/.cvsignore: Add unlinkdir.h, unlinkdir.c.
* src/common.h (we_are_root): Remove extern decl; it's now static.
* src/extract.c (we_are_root): Now static.
* src/misc.c: Include <unlinkdir.h>.
(remove_any_file): Use cannot_unlink_dir () rather than	we_are_root.
2005-05-15 06:23:49 +00:00
Paul Eggert
120e96c480 Update FSF postal mail address. 2005-05-15 03:59:08 +00:00
Sergey Poznyakoff
271ed97494 Updated 2005-05-12 15:46:40 +00:00
Sergey Poznyakoff
3ac99bc540 Updated 2005-05-12 15:46:18 +00:00
Sergey Poznyakoff
a33b37a9a3 Add truncate.at 2005-05-12 15:40:07 +00:00
Sergey Poznyakoff
c9365a1d09 New test case 2005-05-12 15:39:54 +00:00
Sergey Poznyakoff
8d064bb816 (file_newer_p): Return false if file does not exist 2005-05-12 15:39:34 +00:00
Sergey Poznyakoff
29c902bc49 (dump_regular_file): Correctly pad archive members that shrunk during archiving. Repored by Frank Heckenbach. 2005-05-12 15:39:21 +00:00
Sergey Poznyakoff
d78f85d61d (diff_file): diff_handle was not initialized 2005-05-12 15:39:02 +00:00
Sergey Poznyakoff
73be90ea0d (Genfile): New appendix 2005-05-12 15:38:48 +00:00
Sergey Poznyakoff
9adc789138 (tar_TEXINFOS): Add genfile.texi 2005-05-12 15:38:37 +00:00
Sergey Poznyakoff
cfe4eef5c2 Install files from paxutils/doc 2005-05-12 15:38:27 +00:00
Sergey Poznyakoff
0e61fd397f Updated 2005-05-12 15:38:19 +00:00
Paul Eggert
bb8dcc1e8c Update copyright. 2005-05-02 08:05:59 +00:00
Paul Eggert
87bd7f5d1c Update copyright. 2005-05-02 08:05:23 +00:00
Paul Eggert
ecac16a4a0 * src/incremen.c (hash_directory): Likewise.
* src/names.c (hash_string_hasher): Likewise.
* src/tar.c (parse_opt): Set it, and adjust to new modechange API.
2005-05-02 08:03:02 +00:00
Paul Eggert
89a4824c73 Tell awk to read from /dev/null. 2005-05-02 08:02:35 +00:00
Paul Eggert
9b7c6df82b Adjust to new hash API. 2005-05-02 08:02:09 +00:00
Paul Eggert
e2c431e9c2 Adjust to recent gnulib changes. 2005-05-02 07:36:26 +00:00
Paul Eggert
82c746410d (parse_opt): Adjust to new modechange API. 2005-05-02 07:36:09 +00:00
Paul Eggert
2e025f2dea (start_ueader): Adjust to new modechange API. 2005-05-02 07:35:47 +00:00
Paul Eggert
f2e17c0d8c (initial_umask): New var. 2005-05-02 07:34:53 +00:00
Paul Eggert
ed08ef0458 Add dup-safer.c, fd-safer.c, unistd-safer.h. 2005-05-02 07:34:26 +00:00
Sergey Poznyakoff
3ab983facf Updated 2005-04-19 09:06:07 +00:00
Sergey Poznyakoff
6c6fe16aaa Add shortrec.at 2005-04-19 09:05:32 +00:00
Paul Eggert
27b98aa8ae * src/buffer.c (reading_from_pipe): Remove. All uses removed.
(short_read): Don't warn about short reads; they're normal.
* tests/shortrec.at: New file.
* tests/testsuite.at: Include it.
2005-04-18 18:21:50 +00:00
Paul Eggert
18850a18f1 (gnulib_modules): Don't create a file modlist.tmp, as
it is sometimes left behind as a garbage file (maybe due to the
multiple traps?).
2005-04-18 18:14:58 +00:00
Paul Eggert
005d0d455c Use UTF-8 uniformly, rather than UTF-8 sometimes and Latin-1 sometimes. 2005-04-16 07:22:13 +00:00
Sergey Poznyakoff
a71807a247 Updated 2005-04-14 13:14:56 +00:00
Sergey Poznyakoff
d7af510d49 (SOLARIS_XHDTYPE): New define 2005-04-14 13:14:38 +00:00
Sergey Poznyakoff
ef0e611663 Handle Solaris 'X' type flag 2005-04-14 13:14:23 +00:00
Sergey Poznyakoff
8f9ecca0db Updated 2005-04-07 17:29:45 +00:00
Sergey Poznyakoff
9147c6c9f6 Add multiv04.at 2005-04-07 17:28:53 +00:00
Sergey Poznyakoff
ee738da4a8 Test splittind directory members between the archive volumes. 2005-04-07 17:28:34 +00:00
Sergey Poznyakoff
42e53a98e1 Modified to match the new behavior 2005-04-07 17:27:30 +00:00
Sergey Poznyakoff
2d34da98d5 Assign orig_file_name
to save_name uniformly over the program. This fixes matching
directory names at the start of an archive volume.
2005-04-07 17:27:07 +00:00
Sergey Poznyakoff
781d3818e5 (diff_init): Read directory file if in listed
incremental. This prevents spurious 'Contents differ' diagnostics.
(diff_archive): Minor fixes to text messages
(diff_file,diff_dumpdir,diff_multivol): Assign orig_file_name
to save_name uniformly over the program. This fixes matching
directory names at the start of an archive volume.
2005-04-07 17:26:42 +00:00
Sergey Poznyakoff
c861b96651 (flush_write): Warn when the name of the archive
straddling volume boundary is longer than 100 characters. Earlier
behavior was to issue a fatal error.
(struct zip_magic): Reverted part of changes from 2005-04-04.
They make the maintenance too costly. Removing `unsigned'
qualifier from `magic' member should be enough.
2005-04-07 17:26:11 +00:00
Sergey Poznyakoff
2872a5ae81 Minor fixes to text messages. Proposed by Benno Schulenberg.
(extract_file): Assign orig_file_name
        to save_name uniformly over the program. This fixes matching
        directory names at the start of an archive volume.
2005-04-07 17:25:29 +00:00
Sergey Poznyakoff
62599b5285 Minor fixes to text messages. Proposed by Benno Schulenberg. 2005-04-07 17:24:56 +00:00
Paul Eggert
263604c2ec Sort and simplify. 2005-04-04 18:46:00 +00:00
Paul Eggert
7ebf107f89 Update copyright date. 2005-04-04 18:37:52 +00:00
Paul Eggert
5fe7f641e8 Rename config/ to build-aux/. 2005-04-04 18:35:53 +00:00
Paul Eggert
dbf96ec903 Spelling fixes. 2005-04-04 18:31:44 +00:00
Paul Eggert
5d87077565 * src/buffer.c: Fix struct zip_magic to avoid problems with pedantic
C compilers.  Make 'magic' const and redo it to save alignment and space.
2005-04-04 18:22:44 +00:00
Paul Eggert
7d4bd5b38d (struct zip_magic): Use char arrays, not pointers.
The unsigned char * pointer ran afoul of pedantic C compilers, and
we didn't need pointers anyway.  Put the size field before the
data to avoid unnecessary padding.  All uses changed.
(magic) Make it const, since it doesn't change.  All uses changed.
2005-04-04 18:21:55 +00:00
Paul Eggert
ad0bd3c9c4 * src/xheader.c (decode_record): Don't dump core when given
a corrupted extended header.
2005-04-02 06:39:37 +00:00
Paul Eggert
95fa3422d7 (decode_record): Don't dump core when given
a corrupted extended header.  Problem reported by Jim Meyering.
Also, check for other ways that the header might be invalid,
e.g., missing newline at end.  Do not allow keys with nulls.
Allow blanks before and after length, as POSIX requires.
Do not allow leading "-" in length.  Check for length overflow.
(xheader_decode, xheader_decode_global): Let decode_record
check for exhaustion of record.
(xheader_read): Null-terminate the extended record;
decode_record relies on this.
2005-04-02 06:39:19 +00:00
Paul Eggert
67c7284d07 * bootstrap (TP_URL): Change from
<http://www2.iro.umontreal.ca/~gnutra/po/maint/tar/> to
<http://www.iro.umontreal.ca/translation/maint/tar/> to avoid
some redirection glitches.
Use "trap - 0" rather than "trap 0" to fix a POSIX-conformance bug.
* doc/.cvsignore: Change "tar.info" to "tar.info*".  Sort.
2005-03-21 21:56:02 +00:00
Sergey Poznyakoff
6811232d8f Updated 2005-03-03 23:17:07 +00:00
Sergey Poznyakoff
fdbb1d8c7c (restore_fs): Use root_fs 2005-03-03 23:16:03 +00:00
Sergey Poznyakoff
f04c7701fa Use `head -n 1'. Provide missing argument to ${MT_STATUS}. Fixed typo in MT_OFFLINE assignment. Proposed by Jan Merka. 2005-03-03 23:14:52 +00:00
Sergey Poznyakoff
63e90fdc62 Use `head -n 1'. Provide missing argument to ${MT_STATUS}. Proposed by Jan Merka. 2005-03-03 23:14:23 +00:00
Sergey Poznyakoff
b320151a23 (sparse_scan_file): Bugfix. offset had incorrect type. 2005-03-03 23:13:30 +00:00
Sergey Poznyakoff
9fc348aae9 Correctly parse empty uname/gname 2005-03-03 23:13:14 +00:00
Sergey Poznyakoff
0fd49f51a0 (print_header): Print UID/GID in case of
empty user/group name. This could occur when dumping
files belonging to non-existing users and when listing
broken archives.
Reported by Igor Lautar.
2005-03-03 23:13:04 +00:00
Sergey Poznyakoff
002cd6843a Updated 2005-02-15 15:25:14 +00:00
Sergey Poznyakoff
b4fb3e9f74 Use -print with find 2005-02-15 15:24:51 +00:00
Sergey Poznyakoff
549a691ada Replace strdup with xstrdup 2005-02-15 15:24:35 +00:00
Sergey Poznyakoff
e7e66c4426 Updated 2005-02-15 14:47:06 +00:00
Sergey Poznyakoff
ea9df3c243 Added reference to bug-tar archive 2005-02-15 14:46:16 +00:00
Sergey Poznyakoff
1d804e4f68 Updated 2005-02-10 22:53:22 +00:00
Sergey Poznyakoff
eaa66dc858 Added append01.at 2005-02-10 22:52:13 +00:00
Sergey Poznyakoff
a66ab8591f Test appending of files with long names 2005-02-10 22:52:00 +00:00
Sergey Poznyakoff
6e63133691 (read_header): Removed assignment to oldgnu_header.isextended. It was breaking append mode. 2005-02-10 22:51:21 +00:00
Sergey Poznyakoff
b480196651 Added Tim Adye. Fixed UTF. 2005-02-10 22:51:04 +00:00
Sergey Poznyakoff
371af209a7 Updated 2005-02-06 20:02:23 +00:00
Sergey Poznyakoff
5c2e32780e Various fixes in help and diagnostic messages 2005-02-06 20:01:22 +00:00
Sergey Poznyakoff
4d8ddc720e Merge list of required modules from paxutils with that from tar proper 2005-02-06 20:00:56 +00:00
Sergey Poznyakoff
5f405b1a2d List of required gnulib modules. 2005-02-06 20:00:09 +00:00
Sergey Poznyakoff
ef68503367 Updated 2005-02-05 22:25:50 +00:00
Sergey Poznyakoff
64ba4757bc Reverted changes 2005-02-05 22:08:49 +00:00
Sergey Poznyakoff
cd02b0855c (options): Improved sorting. Document --backup=off.
(decode_options): Clear backup_option if necessary.
2005-02-05 22:03:10 +00:00
Sergey Poznyakoff
35bb355734 (sys_exec_command): Use xclose, xpipe, xfork, xdup2 and exec_fatal. 2005-02-05 22:02:08 +00:00
Sergey Poznyakoff
fa63755f6b (exec_error,fork_error,dup2_error,pipe_error): Removed unneeded functions. 2005-02-05 22:01:49 +00:00
Sergey Poznyakoff
ea12939af0 (extract_archive): Do not check for EXTRACT_OVER_PIPE, decode_options() does this. 2005-02-05 22:01:08 +00:00
Sergey Poznyakoff
9a71d32d2f Code clean up. 2005-02-05 22:00:48 +00:00
Sergey Poznyakoff
6609c2a607 (EXTRACT_OVER_PIPE): New macro 2005-02-05 22:00:29 +00:00
Sergey Poznyakoff
c580a1c407 Updated 2005-02-05 10:49:26 +00:00
Sergey Poznyakoff
91ce177fc7 Added Hansjoerg Lipp 2005-02-05 10:35:46 +00:00
Sergey Poznyakoff
4d24adbecb Handle new options --to-command,--ignore-command-error 2005-02-05 10:35:18 +00:00
Sergey Poznyakoff
0b939d7dbc (sys_exec_command,sys_wait_command): New functions 2005-02-05 10:34:46 +00:00
Sergey Poznyakoff
75a16f75a9 (exec_error, fork_error, dup_error,pipe_error): New functions 2005-02-05 10:34:25 +00:00
Sergey Poznyakoff
e758088191 (extract_file): Handle to_command_option
Fix error recovery: decrease `size' by `written', not
by `count', otherwise tar misses the next header
Do not diagnose write errror if to_command_option
is set, since the command may have exited prematurely.
It would be better to check for sigpipe, though.
(prepare_to_extract): Handle to_command_option
2005-02-05 10:34:01 +00:00
Sergey Poznyakoff
f96dc77bbc (to_command_option)
(ignore_command_error_option): New globals
(sys_exec_command,sys_wait_command): New commands
2005-02-05 10:33:25 +00:00
Sergey Poznyakoff
23cf312ef1 Do not use 8-bit chars in comments 2005-02-05 10:33:05 +00:00
Sergey Poznyakoff
0e4b59b4b2 Get setenv module from gnulib 2005-02-05 10:32:35 +00:00
Paul Eggert
a6f6974f75 Improved checksum diagnostics; adjust to gnulib changes. 2005-02-04 01:52:48 +00:00
Paul Eggert
8f0112cb23 (from_header): New arg OCTAL_ONLY, normally false.
All uses changed.  Fix typo that sometimes suppressed all "Archive
contains obsolescent base-64 headers" warnings, not just the first
one.
(tar_checksum): Accept only octal checksums, since they aren't
supposed to overflow into weird formats.
2005-02-04 01:52:20 +00:00
Paul Eggert
9c2f942930 Adjust to gnulib changes.
* lib/.cvsignore: Add chdir-long.c, chdir-long.h, memrchr.c,
memrchr.h, openat.c, openat.h.  Remove pathmax.h (added by
mistake, perhaps?), sysexit.h (my typo), xstrdup.c (gnulib removed
this file).  Sort entries.
2005-02-04 01:44:45 +00:00
Sergey Poznyakoff
5422166048 Updated 2005-02-04 01:43:41 +00:00
Sergey Poznyakoff
0ad4063606 (update_argv): Changed type to void 2005-02-04 01:42:58 +00:00
Sergey Poznyakoff
db2d3f2344 Removed unused variables. 2005-02-04 01:42:33 +00:00
Sergey Poznyakoff
5179c0b5e6 Further rewrite 2005-02-04 01:41:32 +00:00
Sergey Poznyakoff
87a7b31a82 Updated 2005-02-04 00:05:46 +00:00
Sergey Poznyakoff
1044149e3a Determine path to the tar executable. 2005-02-04 00:04:55 +00:00
Sergey Poznyakoff
d8dc269927 (options) Minor spelling fix 2005-02-04 00:04:40 +00:00
Sergey Poznyakoff
1e2e868af5 Add translators' comments 2005-02-04 00:04:16 +00:00
Sergey Poznyakoff
c8764440d9 (extract_archive): Rewritten 2005-02-04 00:03:59 +00:00
Sergey Poznyakoff
59f314a2c4 (start_private_header,write_header_name)
(dump_hard_link): Restore compatibility with 1.13.25
2005-02-04 00:03:42 +00:00
Sergey Poznyakoff
0e45413e1e (OLDGNU_NAME_FIELD_SIZE): New constant 2005-02-04 00:03:15 +00:00
Sergey Poznyakoff
2fcd454e17 Updated 2005-02-03 16:29:58 +00:00
Sergey Poznyakoff
e318ac6fe8 (RE_CHECK): Added missing space 2005-02-03 16:29:45 +00:00
Sergey Poznyakoff
71b7086ff7 sort ls output 2005-02-03 16:29:27 +00:00
Sergey Poznyakoff
5cf84df777 Add translators' comment 2005-02-03 16:29:08 +00:00
Sergey Poznyakoff
4a7703ff21 Use quote() 2005-02-03 16:28:37 +00:00
Sergey Poznyakoff
91c69c885b (short_read): Use ngettext()
(new_volume): use quote().
2005-02-03 16:28:12 +00:00
Sergey Poznyakoff
63c140752f Added tests/genfile.c 2005-02-03 16:27:11 +00:00
Sergey Poznyakoff
ce852113e0 Updated 2005-02-03 00:06:34 +00:00
Sergey Poznyakoff
ccb2072c7e Extract and compare sparse file 2005-02-03 00:04:43 +00:00
Sergey Poznyakoff
d8b24b63e8 Skip the test on filesystems that do not update ctime of a file when renaming it. To be reverted when the new incremental mode is ready. 2005-02-03 00:04:30 +00:00
Sergey Poznyakoff
0dcb0ad279 Added sparse02.at 2005-02-03 00:04:02 +00:00
Sergey Poznyakoff
0cde2ad44c Test extracting sparse files over a pipe. 2005-02-03 00:03:44 +00:00
Sergey Poznyakoff
88e9b05867 Updated 2005-02-02 11:02:12 +00:00
Sergey Poznyakoff
198596f161 Extract sparse files even if the output fd is not seekable. 2005-02-02 11:01:49 +00:00
Sergey Poznyakoff
ccac216e67 Updated 2005-02-01 05:52:10 +00:00
Sergey Poznyakoff
660d760587 Ignore all *.m4 files 2005-02-01 05:51:24 +00:00
Sergey Poznyakoff
771ac30e0f Updated 2005-02-01 05:48:06 +00:00
Sergey Poznyakoff
ebd88883f5 Add append.at 2005-02-01 05:47:20 +00:00
Sergey Poznyakoff
81572b57a3 Insert Emacs magic to the first line. 2005-02-01 05:47:05 +00:00
Sergey Poznyakoff
5be8e9d4c7 Add a comment to lib/Makefile.am saying that this is an autogenerated file.
Exit with code 1 if any of autotools fails.
2005-02-01 05:46:49 +00:00
Sergey Poznyakoff
4e52e75bbe Updated 2005-01-18 01:53:09 +00:00
Sergey Poznyakoff
4caea8d763 Updated 2005-01-18 01:20:41 +00:00
Sergey Poznyakoff
0037ae7f9e Remove inclusion of obstack.h 2005-01-18 01:18:45 +00:00
Sergey Poznyakoff
01778aa4a9 Updated 2005-01-18 01:18:07 +00:00
Sergey Poznyakoff
3360b2cce4 Moved rendition macros and option value definitions from tar.texi into separate files 2005-01-18 01:15:48 +00:00
Sergey Poznyakoff
5f19de0372 Document new options. Moved rendition macros and option value definitions into separate files 2005-01-18 01:14:04 +00:00
Sergey Poznyakoff
cdb27293db New options --unquote (--no-unquote) and --add-file
(add_file_id,read_name_from_file,update_argv): New functions
(parse_opt): Rewritten handling of -T option. Handle hidden
--HANG option for debugging purposes.
(decode_options): Init unquote_option to true. Init argv_stk.
Remove unneded references to files_from_option
2005-01-18 01:12:34 +00:00
Sergey Poznyakoff
937202acb9 (name_file): Removed variable.
(read_name_from_file): Removed function. All callers changed.
(name_close): Removed function. All callers changed.
2005-01-18 01:11:56 +00:00
Sergey Poznyakoff
3971a56b22 (stat_fatal): New function 2005-01-18 01:11:22 +00:00
Sergey Poznyakoff
18ee9a103a Remove inclusion of obstack.h src/incremen.c 2005-01-18 01:11:05 +00:00
Sergey Poznyakoff
de772cad88 Include obstack.h
(files_from_option): Removed
(unquote_option): New variable
(stat_fatal): New function
(name_close): Removed function.
2005-01-18 01:10:39 +00:00
Sergey Poznyakoff
2c9d869851 Raised version number to 1.15.2 2005-01-18 01:10:12 +00:00
Sergey Poznyakoff
2b9556cb8e Complete the reference 2005-01-14 09:27:03 +00:00
Sergey Poznyakoff
47b2def4a2 *** empty log message *** 2005-01-14 08:47:36 +00:00
Paul Eggert
f389e8657d * tests/testsuite.at (RE_CHECK): Use "join - file", not "join file -". 2005-01-13 20:57:40 +00:00
Paul Eggert
c6ca601327 (RE_CHECK): Use "join - file", not
"join file -", to work around a bug in Solaris 8 join.
2005-01-13 20:57:23 +00:00
Sergey Poznyakoff
5dc9944b5a Updated 2005-01-13 16:19:23 +00:00
Sergey Poznyakoff
fabcc30f69 Updated 2005-01-13 16:13:43 +00:00
Sergey Poznyakoff
8a59f40796 Updated 2005-01-13 16:07:35 +00:00
Sergey Poznyakoff
1859998c22 Added Josef Bauer 2005-01-13 16:01:14 +00:00
Sergey Poznyakoff
e7db56c0ef Added long01.at 2005-01-13 16:00:59 +00:00
Sergey Poznyakoff
14d8c8a035 Sort tar output 2005-01-13 16:00:45 +00:00
Sergey Poznyakoff
471cf501e5 Test listing of GNU long names divisible by 512. 2005-01-13 16:00:23 +00:00
Sergey Poznyakoff
4719a5d55b Use memset instead of bzero, memmove
(or memcpy, if appropriate), instead of bcopy, and
strchr/strrchr instead of index/rindex.
Rename isnumber to isnumber_p. Proposed by Albert Chin.
2005-01-13 15:59:26 +00:00
Sergey Poznyakoff
cff5cfb5ce Updated 2005-01-12 00:08:10 +00:00
Sergey Poznyakoff
ef96e14fe1 Template file for gendocs.sh 2005-01-12 00:07:49 +00:00
Sergey Poznyakoff
248069ea4a Updated 2005-01-11 16:28:17 +00:00
Sergey Poznyakoff
d882e8f39b Reworded docstrings for --[no-]same-permissions 2005-01-11 16:28:07 +00:00
Sergey Poznyakoff
3e5686c1ec Updated docs for --[no-]same-permissions 2005-01-11 16:27:57 +00:00
Sergey Poznyakoff
b8efe40f54 Use gendocs.sh to generate web documentation 2005-01-11 16:27:43 +00:00
Sergey Poznyakoff
73777093b1 Updated for 1.15.1 2005-01-11 16:27:26 +00:00
Sergey Poznyakoff
746e6b45b6 Updated 2005-01-06 18:33:29 +00:00
Sergey Poznyakoff
c251377da9 Updated 2005-01-06 18:27:36 +00:00
Sergey Poznyakoff
39a00a8f4f Do not create useless directory 2005-01-06 18:17:20 +00:00
Sergey Poznyakoff
85d8f1d2a2 Add options02.at 2005-01-06 18:16:50 +00:00
Sergey Poznyakoff
2266e14d8c Test that tar correctly handles non-option arguments interspersed with options. 2005-01-06 18:16:30 +00:00
Sergey Poznyakoff
941d7586db Call tar_PAXUTILS 2005-01-06 18:15:50 +00:00
Sergey Poznyakoff
1c7a6c11ce Create m4/paxutils.m4 2005-01-06 18:15:12 +00:00
Sergey Poznyakoff
2ad41b6fe0 (parse_opt): Bugfix: Use ARGP_KEY_ARG. Thanks Mike Frysinger <vapier@gentoo.org> for reporting. 2005-01-05 17:30:36 +00:00
Paul Eggert
af2fa08aa0 * lib/Makefile.tmpl (localedir.h): Omit needless quotes and a
needless sed command.
2005-01-04 20:20:56 +00:00
Paul Eggert
93e4188e60 Accommodate latest gnulib. 2004-12-24 07:44:30 +00:00
Paul Eggert
c0eaf364d0 Add getdate.texi. 2004-12-24 07:43:52 +00:00
Paul Eggert
86c379f7c1 Do not treat alloca-opt specially; this is no
longer needed (and breaks builds) with latest gnulib.
2004-12-24 07:43:32 +00:00
Sergey Poznyakoff
3352016cf0 Updated 2004-12-22 10:54:22 +00:00
Sergey Poznyakoff
6bc808b25f (main): Reverted recent changes (#ifdef). 2004-12-22 10:53:48 +00:00
Sergey Poznyakoff
19f60610d1 Updated 2004-12-21 16:21:53 +00:00
Sergey Poznyakoff
2433f6813e (open_compressed_archive): Do not attemt to determine compression type if handling multi-volume archive 2004-12-21 15:10:56 +00:00
Sergey Poznyakoff
76bbb5710f Minor improvement: reset hit_eof in open_compressed_archive 2004-12-21 15:00:29 +00:00
Sergey Poznyakoff
e8fbac5ec1 Updated 2004-12-21 14:45:18 +00:00
Sergey Poznyakoff
5842962ed6 (main): Protect invocation of setlocale by ifdef. 2004-12-21 14:44:15 +00:00
Sergey Poznyakoff
368172bf25 (from_header, tar_checksum): Changed declaration. All callers updated. 2004-12-21 14:44:03 +00:00
Sergey Poznyakoff
0f9b299745 (tar_checksum): changed declaration 2004-12-21 14:42:15 +00:00
Sergey Poznyakoff
ab3b31cfef (check_compressed_archive): Check remote archves as well 2004-12-21 14:41:35 +00:00
Sergey Poznyakoff
f152367c57 Updated 2004-12-21 13:38:01 +00:00
Sergey Poznyakoff
a34d0e906f Updated 2004-12-21 13:27:50 +00:00
Sergey Poznyakoff
dcedecad2b Rewritten in xhtml to follow recent GNU site standards. 2004-12-21 13:27:28 +00:00
Sergey Poznyakoff
436741221c Discard stderr from sort, on some systems it spits out lots of irrelevant info. 2004-12-21 13:27:06 +00:00
Sergey Poznyakoff
8ccde495f4 Use AT_GZIP_PREREQ 2004-12-21 13:26:41 +00:00
Sergey Poznyakoff
29a6b977e9 (comprec.at,pipe.at): New tests 2004-12-21 13:26:07 +00:00
Sergey Poznyakoff
5129d9eb8c New test 2004-12-21 13:24:37 +00:00
Sergey Poznyakoff
b5c890b887 (main): Protect invocation of setlocale by ifdef. 2004-12-21 13:24:00 +00:00
Sergey Poznyakoff
2d57bb240d Bugfix. Changes introduced 2004-11-26 broke extraction from stdin. 2004-12-21 13:23:46 +00:00
Sergey Poznyakoff
554e50b438 Entry for 1.15.1 2004-12-21 13:23:27 +00:00
Sergey Poznyakoff
c6834baaf6 Raise version number to 1.15.1; Check for locale.h 2004-12-21 13:23:10 +00:00
Sergey Poznyakoff
17600e0de8 Updated 2004-12-20 14:02:22 +00:00
Sergey Poznyakoff
fb782b023f Updated 2004-12-20 13:59:15 +00:00
Sergey Poznyakoff
8d44c6b51e Added to the repository 2004-12-20 13:56:41 +00:00
Sergey Poznyakoff
c575787495 Removed 2004-12-20 13:56:31 +00:00
Sergey Poznyakoff
71850c6ab3 Document quicktest.sh 2004-12-20 13:55:37 +00:00
Sergey Poznyakoff
fa87656256 Distribute star/quicktest.sh 2004-12-20 13:55:22 +00:00
Sergey Poznyakoff
7c3510b40d (update_po): Give -r to wget. Always remove index.html
Ignore alloca-opt module (it duplicates alloca)
2004-12-20 13:55:06 +00:00
Sergey Poznyakoff
5f1e6a6a3b Raised version number to 1.15 2004-12-20 13:54:01 +00:00
Sergey Poznyakoff
aa600ee769 Updated 2004-12-18 20:14:34 +00:00
Sergey Poznyakoff
bf2b8556e8 Updated 2004-12-18 20:09:55 +00:00
Sergey Poznyakoff
8263cc7bc0 Added delete05.at 2004-12-18 20:08:56 +00:00
Sergey Poznyakoff
6af2e16b9b Fixed typo in AT_SETUP 2004-12-18 20:08:11 +00:00
Sergey Poznyakoff
664ec232d4 Test deletion of non-existing members 2004-12-18 20:07:59 +00:00
Sergey Poznyakoff
90b1e24487 (decode_options): Ignore --seek if used with --delete.
Delete.c is based on the assumption that the archive is being
actually read, not lseeked.
2004-12-18 20:07:04 +00:00
Sergey Poznyakoff
94f7d4e7c1 Document auto-detection of compressed archive formats. 2004-12-18 20:06:39 +00:00
Sergey Poznyakoff
6323ff0880 Updated 2004-12-18 20:06:18 +00:00
Sergey Poznyakoff
7b29b10847 Updated 2004-12-17 16:12:01 +00:00
Sergey Poznyakoff
e6a67c2eb5 (delete_archive_members): Bugfix: when
attempting to delete an unexisting member, the last
blocking_factor blocks were zeroed.
2004-12-17 16:10:36 +00:00
Paul Eggert
2e7378e819 * TODO: Mention sub-second resolution, lutimes, lchmod. 2004-12-14 19:07:44 +00:00
Paul Eggert
849ec50941 Mention sub-second resolution, lutimes, lchmod. 2004-12-14 19:07:20 +00:00
Paul Eggert
889b8a1046 Remove unnecessary entries from lib/.cvsignore and m4/.cvsignore. 2004-11-28 06:41:15 +00:00
Paul Eggert
2f034ae71b Remove pathmax.h, xstrdup.c. 2004-11-28 06:40:35 +00:00
Paul Eggert
bf8852627a Remove malloc.m4, pathmax.m4, realloc.m4. 2004-11-28 06:40:03 +00:00
Paul Eggert
73b52b1b9b Adjust to recent gnulib changes. 2004-11-28 06:32:01 +00:00
Sergey Poznyakoff
c69d2f6539 Updated 2004-11-26 19:12:09 +00:00
Sergey Poznyakoff
412fbeb90d Updated 2004-11-26 19:10:20 +00:00
Sergey Poznyakoff
322114744f (tar_checksum): New function 2004-11-26 19:09:48 +00:00
Sergey Poznyakoff
b5db978830 (tar_checksum): New function 2004-11-26 19:09:26 +00:00
Sergey Poznyakoff
4674867a23 (hit_eof): Changed type to boolean
(read_full_records,reading_from_pipe): New variables
(check_compressed_archive,open_compressed_archive): New functions
(open_archive): Autodetect compressed archives and act accodingly.
Set reading_from_pipe. This fixes contraversial set of changes
introduced 2004-05-11,2004-03-22.
2004-11-26 19:08:58 +00:00
Sergey Poznyakoff
d5f1626556 Updated 2004-11-26 19:08:25 +00:00
Sergey Poznyakoff
c8b0fd28c2 Concatenate multivolume archives 2004-11-26 19:08:14 +00:00
Sergey Poznyakoff
dcdbe18968 Raised version number to 1.14.91 2004-11-26 19:07:42 +00:00
Sergey Poznyakoff
6c941e0826 Updated 2004-11-26 15:55:32 +00:00
Sergey Poznyakoff
ff989f4b84 Updated 2004-11-16 11:03:05 +00:00
Sergey Poznyakoff
b2a65edf5c Fixed -o semantics. Thanks Jean Delvare <khali@linux-fr.org> 2004-11-16 11:02:45 +00:00
Sergey Poznyakoff
d305c258bf Updated 2004-10-25 15:59:44 +00:00
Sergey Poznyakoff
8ff11f27c1 Use locale_charset() from gnulib 2004-10-25 15:57:48 +00:00
Sergey Poznyakoff
5dee0c1348 (options): Use OPTION_NO_TRANS 2004-10-25 15:57:29 +00:00
Sergey Poznyakoff
b55daca933 (decode_header): Set uname/gname to NULL if their header counterparts are empty 2004-10-25 15:56:57 +00:00
Sergey Poznyakoff
f218c29b13 (LDADD): Add LIBICONV 2004-10-25 15:56:37 +00:00
Sergey Poznyakoff
1625cc5f67 Initialize SUFFIXES and CLEANFILES since the makefile snippet from localcharset uses '+=' on them. 2004-10-25 15:56:20 +00:00
Sergey Poznyakoff
c0f0d25271 Add localcharset 2004-10-25 15:55:59 +00:00
Sergey Poznyakoff
2ab1422c04 Minor fix 2004-10-25 15:55:27 +00:00
Sergey Poznyakoff
53a80edafc Updated 2004-10-25 15:55:11 +00:00
Sergey Poznyakoff
75284507b3 Updated 2004-10-04 09:33:11 +00:00
Sergey Poznyakoff
9b712b0fc8 Added Bryan Ford 2004-10-04 09:32:22 +00:00
Sergey Poznyakoff
d47a177d3d Added argp-help.c 2004-10-04 09:30:17 +00:00
Sergey Poznyakoff
2c7d98238b (.text): Fixed rule 2004-10-04 09:29:25 +00:00
Sergey Poznyakoff
9e2233007c Updated 2004-10-04 09:27:53 +00:00
Sergey Poznyakoff
06742ec624 New function check_cache_directory(),
called from dump_dir0() if exclude_caches_option is set,
to check for a cache directory tag and exclude the directory
if such a tag is found.
2004-10-04 09:27:13 +00:00
Sergey Poznyakoff
5b56886a72 New variable exclude_caches_option. 2004-10-04 09:26:42 +00:00
Sergey Poznyakoff
5db60955f5 New option --exclude-caches, to exclude
cache directories automatically on archive creation.
Cache directories are directories containing a
standardized tag file, as specified at:
	http://www.brynosaurus.com/cachedir/spec.html
2004-10-04 09:26:25 +00:00
Sergey Poznyakoff
52030539f7 Updated 2004-09-16 13:42:32 +00:00
Sergey Poznyakoff
e370518b43 Minor fix 2004-09-16 13:42:22 +00:00
Sergey Poznyakoff
3cb52ac16a Updated 2004-09-12 12:51:37 +00:00
Sergey Poznyakoff
75bf036edc Normalized use of remove_any_file(). 2004-09-12 12:50:31 +00:00
Sergey Poznyakoff
6cf99ce8ae (parse_opt): Emit warning if -l option is used.
(show_default_settings): REMOTE_SHELL may be undefined
2004-09-12 12:50:06 +00:00
Sergey Poznyakoff
ae3238495d Comment WANT_DIRECTORY_REMOVE_OPTION 2004-09-12 12:49:41 +00:00
Sergey Poznyakoff
33491a8d7c Added 'rtapelib.o: localedir.h' dependency 2004-09-12 12:48:54 +00:00
Sergey Poznyakoff
5fd2daf959 Updated 2004-09-07 18:53:08 +00:00
Sergey Poznyakoff
37ac08b3fe Updated 2004-09-07 18:52:03 +00:00
Sergey Poznyakoff
35cae74c4c Rewritten testsuite in autotest 2004-09-07 18:48:13 +00:00
Sergey Poznyakoff
a1c8c7bd47 Updated 2004-09-07 18:43:26 +00:00
Sergey Poznyakoff
71c05b230c Rewritten for autotest 2004-09-07 18:43:17 +00:00
Sergey Poznyakoff
cf2fa13bc5 (argp_program_version): Modified. 2004-09-07 18:43:05 +00:00
Sergey Poznyakoff
7d6865480e Updated for autotest 2004-09-07 18:42:47 +00:00
Sergey Poznyakoff
cadabfc4c7 Updated 2004-09-07 13:27:39 +00:00
Sergey Poznyakoff
6b401f904a Use genfile instead of mksparse 2004-09-07 13:27:22 +00:00
Sergey Poznyakoff
f3f06e8a71 Removed mksparse 2004-09-07 13:27:14 +00:00
Sergey Poznyakoff
8fed513af1 Integrated into (paxutils) genfile.c 2004-09-07 13:27:05 +00:00
Sergey Poznyakoff
00478f4bd3 Integrated into paxutils. 2004-09-07 13:26:41 +00:00
Sergey Poznyakoff
4ad940344a Install genfile.c from paxutils 2004-09-07 13:26:03 +00:00
Sergey Poznyakoff
b5d9942a35 Updated 2004-09-06 14:30:57 +00:00
Sergey Poznyakoff
c0b641f055 Updated 2004-09-06 14:30:21 +00:00
Sergey Poznyakoff
7347b4f5d5 Started merging with cpio into paxutils. 2004-09-06 14:28:55 +00:00
Sergey Poznyakoff
e3bd2a63a6 Updated 2004-09-03 09:22:20 +00:00
Sergey Poznyakoff
430b139592 Do not depend on any particular ordering of output. 2004-09-03 09:19:32 +00:00
Sergey Poznyakoff
06bb349ca9 Updated 2004-09-02 13:54:24 +00:00
Sergey Poznyakoff
2e419759d1 (usage): Minor fix 2004-09-02 13:53:30 +00:00
Sergey Poznyakoff
da3f3e0b3b Install rmt into rmtdir 2004-09-02 13:53:18 +00:00
Sergey Poznyakoff
a0404319e2 ew option --with-rmt. New configuration variable DEFAULT_RMT_DIR. Removed DEFAULT_RMT_COMMAND. 2004-09-02 13:53:03 +00:00
Sergey Poznyakoff
a2a6547e2d Document the use of -C option in file lists. Document --seek option. 2004-09-02 13:52:40 +00:00
Sergey Poznyakoff
5e30076bfd Updated 2004-09-01 15:10:04 +00:00
Sergey Poznyakoff
7c7da5f79f use genfile instead of dd 2004-09-01 15:09:33 +00:00
Sergey Poznyakoff
d1f3689d96 Raised version number to 1.14.90 2004-09-01 15:08:14 +00:00
Sergey Poznyakoff
ac830291f1 Updated 2004-09-01 15:06:09 +00:00
Sergey Poznyakoff
44283eb6ca Added listed02.sh 2004-09-01 15:06:00 +00:00
Sergey Poznyakoff
4ad0f97e2c New test 2004-09-01 15:05:50 +00:00
Sergey Poznyakoff
d14f101217 (register_individual_file,is_individual_file): New functions. 2004-09-01 15:05:28 +00:00
Sergey Poznyakoff
19335cdfb4 (dump_file0): Fix bug introduced 2004-02-21. 2004-09-01 15:05:09 +00:00
Sergey Poznyakoff
4e4e8c57fd (is_individual_file): New prototype 2004-09-01 15:04:46 +00:00
Sergey Poznyakoff
df6161b9fe Updated 2004-08-31 11:57:09 +00:00
Sergey Poznyakoff
33da1b2f64 Updated 2004-08-31 11:51:58 +00:00
Sergey Poznyakoff
28efbf6944 (unquote_string): Unquote '\a' and '\v'. Reported by Helmut Waitzmann <helmut.waitzmann@web.de> 2004-08-31 11:49:28 +00:00
Sergey Poznyakoff
678a4411ea (main): Call set_start_time() 2004-08-31 11:49:03 +00:00
Sergey Poznyakoff
001e5cf813 Fixed initialization of stat_info->is_sparse 2004-08-31 11:48:51 +00:00
Sergey Poznyakoff
fc264a87a8 (set_start_time, removed_prefixes_p): New prototypes. 2004-08-31 11:48:23 +00:00
Sergey Poznyakoff
68bd7ac50a When computing write rate do not take
into account the time needed to verify the archive(s).
The bug reported by John L. Males <jlmales@yahoo.com>
(set_start_time,compute_duration): New functions.
(print_total_written): Use the result of compute_duration().
(close_archive): Call compute_duration.
2004-08-31 11:48:05 +00:00
Sergey Poznyakoff
3f4f5a4bf4 (removed_prefixes_p): New function 2004-08-31 11:47:02 +00:00
Sergey Poznyakoff
e563240b95 (verify_volume): Call set_next_block_after
if read_header returns HEADER_FAILURE
Destroy and reinitialize content of current_stat_info and
extended_header after each iteration.
Issue a warning if the archive created contains some members
whose file names were stripped off their leading prefixes.
This is a temporary fix of the issue reported by Bdale Garbee
<bdale@gag.com> (Refs: Debian bug 230064, Message-Id
<87n07kyzhi.fsf@rover.gag.com>, Sun, 15 Feb 2004 11:22:17 -0700)
2004-08-31 11:45:55 +00:00
Sergey Poznyakoff
6522c25b8d (sparse_add_map): Fixed improper initializations
of sparse_map_size. We assume that whatever number it contains
describes adequately the current size of sparse_map. The only
number we need to reset is sparse_map_avail.
2004-08-31 11:45:16 +00:00
Sergey Poznyakoff
0ec47c16a9 Updated 2004-08-30 15:18:09 +00:00
Sergey Poznyakoff
b1f2c77860 Fix copy-n-paste errors in the license 2004-08-30 15:16:00 +00:00
Sergey Poznyakoff
607c1bf3b4 Updated 2004-08-19 13:13:37 +00:00
Sergey Poznyakoff
74b3e8ab49 Updated 2004-08-19 13:10:01 +00:00
Sergey Poznyakoff
8771e7c560 Renamed LIBPATH to LIBDIR.
New option -a (--all). Do not start restore unless
-a or patterns are given.
(restore_fs,restore_files): Fixed use of --listed option.
2004-08-19 13:09:37 +00:00
Sergey Poznyakoff
1992ef9496 (test_root): Append / to ROOT_FS unless it already ends in it. 2004-08-19 13:09:16 +00:00
Sergey Poznyakoff
73030de19f Renamed LIBPATH to LIBDIR.
Use ROOT_FS with -C option. Do not send mail
if ADMINISTRATOR is set to NONE.
2004-08-19 13:08:43 +00:00
Sergey Poznyakoff
a5f5e75388 Updated 2004-08-17 16:06:05 +00:00
Sergey Poznyakoff
bd599facc8 Fixed typo 2004-08-17 16:05:03 +00:00
Paul Eggert
7f27104062 In bootstrap, set LC_ALL=C and save some more gnulib m4 files. 2004-08-12 20:24:51 +00:00
Paul Eggert
e24d4efed0 Set LC_ALL=C so that file names sort consistently.
Prefer the gnulib copies of gettext.m4, glibc21.m4,
lib-ld.m4, lib-prefix.m4, po.m4 too.
2004-08-12 20:24:13 +00:00
Paul Eggert
a418ef678e Merge argp, getopt, xalloc changes from gnulib. 2004-08-12 18:37:09 +00:00
Paul Eggert
83acd3c604 Remove; gnulib now works unpatched. 2004-08-12 18:35:24 +00:00
Paul Eggert
303132dcdc Adjust to changes to gnulib xalloc module.
(extr_init): Remove assignment to xalloc_fail_func; no longer needed.
(xalloc_die): New function.
2004-08-12 18:34:40 +00:00
Paul Eggert
3848b93af6 Add fnmatch.h, getopt_.h, sysexit.h, xalloc-die.c. 2004-08-12 18:34:18 +00:00
Paul Eggert
93becc4f52 (_getopt_long_only_r): Remove check.
gl_ARGP now does this for us.
2004-08-12 18:33:13 +00:00
Paul Eggert
03092879ac (gnulib_modules): Add xalloc-die. 2004-08-12 18:32:54 +00:00
Sergey Poznyakoff
38f39174f2 Updated 2004-08-10 11:24:25 +00:00
Sergey Poznyakoff
1c0a13aade Added multiv03.sh 2004-08-10 11:17:58 +00:00
Sergey Poznyakoff
2d041189aa (flush_write): Limit filenames
of the members that straddle multivolume archive
boundary to 100 characters.
2004-08-10 11:17:16 +00:00
Sergey Poznyakoff
f6c0aee290 Updated 2004-08-09 11:26:16 +00:00
Sergey Poznyakoff
54e4a0df65 Rearranged leading comments. Added explicit references to original report messages wherever available. 2004-08-09 11:25:15 +00:00
Sergey Poznyakoff
34ff480be9 Added extrac05.sh 2004-08-09 11:24:31 +00:00
Sergey Poznyakoff
260acce7a3 (read_and): Call decode_header before calling skip_member()
(skip_member): Use is_sparse field to determine if the
member is a sparse file.
2004-08-09 11:24:06 +00:00
Sergey Poznyakoff
5a8a98cffe Updated 2004-08-08 14:22:00 +00:00
Sergey Poznyakoff
320298c663 Added link01.sh 2004-08-08 14:21:38 +00:00
Sergey Poznyakoff
4f3e70b0f9 New file 2004-08-08 14:21:07 +00:00
Sergey Poznyakoff
c50565d965 Improved compatibility with 1.13.25 2004-08-08 14:20:17 +00:00
Sergey Poznyakoff
df2c78e32b Extended --update-po option to take an optional argument specifying the po file to update. 2004-08-08 14:19:49 +00:00
Paul Eggert
56389381fc Remove patches/argp.diff; no longer needed. 2004-08-07 06:50:56 +00:00
Paul Eggert
45a6a18d85 Merge from gnulib; mostly FILESYSTEM_PREFIX_LEN -> FILE_SYSTEM_PREFIX_LEN. 2004-08-07 06:37:30 +00:00
Paul Eggert
68ff77508c (purge_directory): Fix format buffer typos in warning strings. 2004-08-07 06:33:59 +00:00
Paul Eggert
43ca8709c0 (parse_opt): FILESYSTEM_PREFIX_LEN -> FILE_SYSTEM_PREFIX_LEN 2004-08-07 06:33:34 +00:00
Paul Eggert
c4e054673b (excluded_name, safer_name_suffix, stripped_prefix_len):
FILESYSTEM_PREFIX_LEN -> FILE_SYSTEM_PREFIX_LEN.
2004-08-07 06:33:07 +00:00
Paul Eggert
df6200e97e (must_be_dot_or_slash): FILESYSTEM_PREFIX_LEN -> FILE_SYSTEM_PREFIX_LEN. 2004-08-07 06:32:41 +00:00
Paul Eggert
9ae5a981fc Include <getcwd.h>.
(extract_archive): Rewrite with new macro IS_ABSOLUTE_FILE_NAME.
(make_directories):
FILESYSTEM_PREFIX_LEN -> FILE_SYSTEM_PREFIX_LEN.
2004-08-07 06:32:12 +00:00
Paul Eggert
7287be445e Remove addext.c, malloc.c, realloc.c. 2004-08-07 06:31:20 +00:00
Paul Eggert
cafa07d966 Don't use valloc; it's buggy on some GNU/Linux systems, and it returns
storage that can't be freed on older BSD systems.
2004-08-03 04:46:37 +00:00
Paul Eggert
9038410bb7 (valloc): Remove. 2004-08-03 04:45:57 +00:00
Paul Eggert
f3da0c26b8 (quote_n, quote): Remove these redundant functions.
(ptr_align): New function, from coreutils/src/system.h.
(page_aligned_alloc): New function.
2004-08-03 04:45:05 +00:00
Paul Eggert
82eff37f6f (page_aligned_alloc): New decl. 2004-08-03 04:44:39 +00:00
Paul Eggert
6869d0f6b3 (diff_init): Don't use valloc; on older or buggy hosts, you can't
free the result.  Use page_aligned_alloc instead.
2004-08-03 04:44:13 +00:00
Paul Eggert
81460a0349 (record_buffer): New var.
(open_archive): Don't use valloc; on older or buggy hosts, you can't
free the result.  Use page_aligned_alloc instead.
Record the pointer to be freed into record_buffer.
(close_archive): Free record_buffer.
2004-08-03 04:43:38 +00:00
Paul Eggert
ae29dcca87 Add getpagesize.m4. 2004-08-03 04:42:53 +00:00
Paul Eggert
ac7c2b7116 Add getpagesize.h. 2004-08-03 04:42:35 +00:00
Paul Eggert
08cba4e4e5 (valloc): Remove check; valloc no longer used. 2004-08-03 04:42:18 +00:00
Paul Eggert
d81b5d6f1e (gnulib_modules): Add getpagesize. 2004-08-03 04:41:48 +00:00
Paul Eggert
55ec665a41 Add fchown-stub.c 2004-07-10 06:51:38 +00:00
Paul Eggert
4ab8cff6b3 * lib/.cvsignore: Add fchown-stub.c. 2004-07-10 06:51:17 +00:00
Paul Eggert
e4afe72b7a src/extract.c (extract_archive): Do not report an error
when hard-linking X to X when X exists.
2004-07-10 06:14:51 +00:00
Paul Eggert
0a3a9744f7 (extract_archive): Do not report an error
when hard-linking X to X when X exists.
2004-07-10 06:13:28 +00:00
Sergey Poznyakoff
ad548198f3 Added Martin Simmons 2004-06-29 10:17:38 +00:00
Sergey Poznyakoff
4f732c1595 Updated 2004-06-29 10:13:14 +00:00
Sergey Poznyakoff
f94cf6216b (gnu_restore): Renamed to purge_directory().
Do not attempt to purge the directory if it is on a different
device and one_file_system_option is set.
2004-06-29 10:11:46 +00:00
Sergey Poznyakoff
44391cb932 (extr_init): Save the device number
of the root device.
(extract_archive): Renamed gnu_restore() to purge_directory().
2004-06-29 10:11:13 +00:00
Sergey Poznyakoff
af15956c4d (root_device): New global.
(gnu_restore): Renamed to purge_directory().
2004-06-29 10:10:26 +00:00
Sergey Poznyakoff
402b50d4d2 Updated 2004-06-29 10:09:52 +00:00
Sergey Poznyakoff
240a4ed90a Updated 2004-06-25 10:33:06 +00:00
Sergey Poznyakoff
6938706958 The actual default for exclude patterns is --no-anchored. Thanks "Felix Natter" <felix.natter@ldc.de> for noticing. 2004-06-25 10:32:44 +00:00
Sergey Poznyakoff
cd2c8d4fbb The actual default for exclude patterns is --no-anchored. Fixed. 2004-06-25 10:32:27 +00:00
Sergey Poznyakoff
421043b6b1 Updated 2004-06-22 09:30:57 +00:00
Sergey Poznyakoff
24aa94e5cf Fixed docstring for --checkpoint option. 2004-06-22 09:30:32 +00:00
Sergey Poznyakoff
8160c0dae9 Fixed several inconsistencies. 2004-06-22 09:30:01 +00:00
Sergey Poznyakoff
53614b3dff Updated 2004-05-19 14:30:21 +00:00
Sergey Poznyakoff
23c2244ddf Updated 2004-05-19 14:28:20 +00:00
Sergey Poznyakoff
ebdf1bc7a6 Determine type of the archive before appending to it. 2004-05-19 14:27:41 +00:00
Sergey Poznyakoff
ba08e339a6 (struct fmttab): Accept 'pax' as alias
for 'posix'
(options): New option -n (--seek).
2004-05-19 14:27:22 +00:00
Sergey Poznyakoff
951b0370df (skip_file): Use seek_archive() if possible. 2004-05-19 14:26:25 +00:00
Sergey Poznyakoff
167f5ba2bc (seek_archive): New function
(seekable_archive): New global.
2004-05-19 14:25:55 +00:00
Sergey Poznyakoff
488430f739 (seek_archive): New function 2004-05-19 14:25:27 +00:00
Sergey Poznyakoff
80c29e6315 Fix typo 2004-05-19 10:59:25 +00:00
Sergey Poznyakoff
432b157a28 Updated 2004-05-19 10:58:04 +00:00
Sergey Poznyakoff
b121917368 (safer_name_suffix): Fixed bug intraduced 2004-05-11. 2004-05-19 10:57:25 +00:00
Sergey Poznyakoff
fa8cb1895c Updated 2004-05-19 10:35:23 +00:00
Sergey Poznyakoff
64759986a9 Document -H option 2004-05-19 10:34:09 +00:00
Sergey Poznyakoff
d4d6c23008 New option -H (short alias to --format) 2004-05-19 10:33:26 +00:00
Sergey Poznyakoff
325a45f0f1 New option --update-po 2004-05-19 10:32:52 +00:00
Sergey Poznyakoff
f41e484f23 Updated 2004-05-16 20:57:53 +00:00
Sergey Poznyakoff
141d267691 Minor formatting fix 2004-05-16 20:56:05 +00:00
Sergey Poznyakoff
3331593d8d Updated 2004-05-16 20:55:18 +00:00
Sergey Poznyakoff
3344bf9380 Minor fix 2004-05-16 20:51:21 +00:00
Sergey Poznyakoff
463d99453f Fix improper use of 'path' word 2004-05-16 20:50:55 +00:00
Sergey Poznyakoff
d2d5d64cb4 Minor fix. 2004-05-16 20:49:53 +00:00
Sergey Poznyakoff
32ebe16224 Updated 2004-05-16 20:48:14 +00:00
Sergey Poznyakoff
a447fd3714 Use argp for command line parsing. 2004-05-16 20:47:47 +00:00
Sergey Poznyakoff
792965270b Check for _getopt_long_only_r and force using included version of getopt if the function is not available. 2004-05-16 20:47:07 +00:00
Sergey Poznyakoff
916019e417 Added to the repository 2004-05-16 20:46:30 +00:00
Sergey Poznyakoff
3ee93d341e Apply patches from 'patches' subdirectory 2004-05-16 20:46:02 +00:00
Sergey Poznyakoff
dd4cef1699 Added to the repository 2004-05-16 09:04:16 +00:00
Sergey Poznyakoff
8286de0946 Updated. 2004-05-13 08:25:51 +00:00
Sergey Poznyakoff
a65779d558 Renamed strip_path_option to strip_components_option 2004-05-13 08:24:32 +00:00
Sergey Poznyakoff
e1a4fea80d Raised version number to 1.14.1 2004-05-13 08:23:47 +00:00
Sergey Poznyakoff
5608be67f7 Renamed --strip-path to --strip-components
Changed improper use of _() to ngettext().
2004-05-13 08:22:28 +00:00
Sergey Poznyakoff
0a79415a97 Updated 2004-05-11 14:25:18 +00:00
Sergey Poznyakoff
f730b47314 Minor correction 2004-05-11 14:24:50 +00:00
Sergey Poznyakoff
48c24ac711 (decode_options): Fixed typo in the comment. 2004-05-11 14:24:23 +00:00
Sergey Poznyakoff
3e8f210904 (open_archive): Removed assignment to read_full_records_option. 2004-05-11 14:23:25 +00:00
Sergey Poznyakoff
ee56bd0d0b (sys_child_open_for_uncompress): Do not
set read_full_records_option: the compressed archive is
likely not to contain integer number of records. Should
the user wish to use reblocking, he may always give tar
-B option. This is a minor improvement over the change
dated 2004-03-22.
2004-05-11 14:17:28 +00:00
Sergey Poznyakoff
ecb338ad8e (safer_name_suffix): (safer_name_suffix): Use "%s"
as the format argument, rather than a possibly-translated variable
string. Patch provided by Jim Meyering  <jim@meyering.net>
2004-05-11 14:12:39 +00:00
Sergey Poznyakoff
ce486a8fd7 Updated 2004-05-11 13:15:18 +00:00
Sergey Poznyakoff
abba83af27 New file 2004-05-11 13:12:56 +00:00
Sergey Poznyakoff
823f96841c Rewritten. Added rules for generating documentation for the project's website. 2004-05-11 13:10:45 +00:00
Sergey Poznyakoff
95256b3c07 Updated 2004-05-11 09:25:59 +00:00
Sergey Poznyakoff
a7109edd94 Added copyleft statement 2004-05-11 09:25:30 +00:00
Sergey Poznyakoff
0500b1ba3e Raised version number to 1.14 2004-05-11 09:25:15 +00:00
Sergey Poznyakoff
e8fa866d3a Updated 2004-05-10 13:50:42 +00:00
Sergey Poznyakoff
3e0962674f Quote TAR_ARCHIVE_FORMATS 2004-05-10 13:48:57 +00:00
Sergey Poznyakoff
3295d54e21 (compare): Fixed argument quoting under eval 2004-05-10 13:48:23 +00:00
Sergey Poznyakoff
be8899e6aa Fixed prerequisite headers for sys/buf.h (needed on FreeBSD) 2004-05-10 13:47:52 +00:00
Sergey Poznyakoff
b5aff8401f Updated 2004-05-10 11:48:07 +00:00
Sergey Poznyakoff
933d42174f Updated 2004-05-10 11:46:56 +00:00
Sergey Poznyakoff
33715a50a3 New option --rmt-command.
(decode_options): Handle --rmt-command. Initialize
rmt_command_option to DEFAULT_RMT_COMMAND.
2004-05-10 11:42:23 +00:00
Sergey Poznyakoff
3be53a3c2f Use rmt_command_option instead of hardcoded "/etc/rmt". 2004-05-10 11:41:43 +00:00
Sergey Poznyakoff
4c004cff39 (read_and): Print block number before
issuing 'Skipping to next header' diagnostics, if
requested by block_number_option.
2004-05-10 11:41:23 +00:00
Sergey Poznyakoff
1c623b11f6 (rmt_command_option): New variable. 2004-05-10 11:40:55 +00:00
Sergey Poznyakoff
898dc536c6 (localedir.h rule): Generate correct DEFAULT_RMT_COMMAND variable. 2004-05-10 11:39:51 +00:00
Sergey Poznyakoff
2b708cb119 Fixed --version output. 2004-05-10 11:38:54 +00:00
Sergey Poznyakoff
c6096f64c5 Fixed --version output.
Fixed initialization of the listing files and printing
the time of the last previous level dump.
2004-05-10 11:38:16 +00:00
Sergey Poznyakoff
b9c6ebab26 Install the scripts only if requested by the configure. 2004-05-10 11:37:54 +00:00
Sergey Poznyakoff
bc07e8cce4 Call gl_AC_TYPE_INTMAX_T. Document
DEFAULT_.* variables. Use DEFAULT_RMT_COMMAND to set
the pathname of the rmt utility.
New option --enable-backup-scripts.
2004-05-10 11:37:31 +00:00
Sergey Poznyakoff
289687bd1c Updated 2004-05-10 11:36:40 +00:00
Sergey Poznyakoff
ee3b833d37 Updated 2004-05-10 08:04:37 +00:00
Sergey Poznyakoff
ad63cd4904 Updated 2004-05-08 22:25:22 +00:00
Sergey Poznyakoff
d58eaa815d Minor fix 2004-05-08 22:22:24 +00:00
Sergey Poznyakoff
f71b35b3f6 Removed 2004-05-08 22:19:40 +00:00
Sergey Poznyakoff
10eef2def8 Updated 2004-05-08 22:18:38 +00:00
Sergey Poznyakoff
07727fe74a Updated 2004-05-08 22:16:17 +00:00
Sergey Poznyakoff
ef87ce7d10 New file 2004-05-08 22:14:52 +00:00
Sergey Poznyakoff
22fae29fb7 New file. Source for backup.sh 2004-05-08 22:14:05 +00:00
Sergey Poznyakoff
981980ac31 Removed 2004-05-08 22:12:18 +00:00
Sergey Poznyakoff
6246fffacd Updated 2004-05-08 22:11:21 +00:00
Sergey Poznyakoff
e128aa980c Updated 2004-05-07 15:04:44 +00:00
Sergey Poznyakoff
21002fe811 Updated 2004-05-07 15:04:10 +00:00
Sergey Poznyakoff
13ac1dcc0f Updated 2004-05-07 15:01:31 +00:00
Sergey Poznyakoff
1695e161be Added copyleft header 2004-05-07 14:59:19 +00:00
Sergey Poznyakoff
66cc5df1c6 Added copyleft header 2004-05-07 14:54:29 +00:00
Sergey Poznyakoff
fc22e70a00 Updated 2004-05-07 14:49:35 +00:00
Sergey Poznyakoff
43d020e35c test if -C works when used with --same-order 2004-05-07 14:48:59 +00:00
Sergey Poznyakoff
6c1654791d (name_gather): Bugfix: Honor single -C with --same-order 2004-05-07 14:46:37 +00:00
Sergey Poznyakoff
4cca5e5887 Updated 2004-05-06 09:26:58 +00:00
Sergey Poznyakoff
24af03768f Updated 2004-05-06 09:16:53 +00:00
Sergey Poznyakoff
d2d8f9ab55 Updated 2004-05-06 09:16:06 +00:00
Sergey Poznyakoff
31e36b1e93 Updated for new directory contents. 2004-05-06 09:15:35 +00:00
Sergey Poznyakoff
6c4dc180dd Added to the repository 2004-05-06 09:14:51 +00:00
Sergey Poznyakoff
0273b1ae09 Removed 2004-05-06 09:14:29 +00:00
Sergey Poznyakoff
640effdebd Check whether date accepts +format argument (for backup scripts). 2004-05-06 09:11:32 +00:00
Sergey Poznyakoff
d21a12cf62 Oops, sorry. Mistakingly added... 2004-05-05 20:49:07 +00:00
Sergey Poznyakoff
6d9cdefe83 Added to the repository 2004-05-05 20:45:36 +00:00
Sergey Poznyakoff
19d51157a5 Updated 2004-05-05 11:56:23 +00:00
Sergey Poznyakoff
4e2d5f2ee8 --utc implies -vv 2004-05-05 11:56:04 +00:00
Sergey Poznyakoff
de5ec134a1 Udated 2004-05-05 11:55:18 +00:00
Sergey Poznyakoff
45399a7e81 Updated 2004-04-28 07:44:41 +00:00
Sergey Poznyakoff
e662d0f367 Make sure ICONV_CONST is defined. AM_ICONV does not define it if it fails to find iconv.h. 2004-04-28 07:44:19 +00:00
Sergey Poznyakoff
b7336abee0 Updated 2004-04-26 13:49:10 +00:00
Sergey Poznyakoff
dca678e62f Updated 2004-04-26 13:48:50 +00:00
Sergey Poznyakoff
39e95d7eee Synchronized with the recent changes. 2004-04-26 13:44:19 +00:00
Sergey Poznyakoff
4b6f666105 Include stpcpy.h 2004-04-26 13:43:20 +00:00
Sergey Poznyakoff
a963130dd7 Updated 2004-04-26 13:42:24 +00:00
Sergey Poznyakoff
6f7d0eb14d Updated 2004-04-26 13:41:27 +00:00
Sergey Poznyakoff
8ad16912cf Generate Makefile.am from Makefile.tmpl 2004-04-26 13:40:50 +00:00
Sergey Poznyakoff
e17093af78 Invoke tar_GNULIB to configure gnulib stuff. 2004-04-26 13:38:41 +00:00
Sergey Poznyakoff
c5997e92f0 Use gnulib-tool to generate lib/Makefile.am and parts of configure.ac 2004-04-26 13:38:14 +00:00
Sergey Poznyakoff
7be4d61e92 Updated 2004-04-26 09:24:27 +00:00
Sergey Poznyakoff
af244aeef3 Produce an error, not warning, if the filename is too long. 2004-04-26 09:19:07 +00:00
Sergey Poznyakoff
005449337c Updated 2004-04-20 11:07:33 +00:00
Sergey Poznyakoff
a6d294236b Fixed typo 2004-04-20 11:07:04 +00:00
Sergey Poznyakoff
f5461e304c Bugfix by Jrgen Weigert 2004-04-20 11:06:35 +00:00
Sergey Poznyakoff
3087f4c1c9 Fixed test for iconv_t 2004-04-20 11:06:08 +00:00
Paul Eggert
1b0a1ba7ed Merge getdate documentation changes from coreutils. 2004-04-05 05:46:08 +00:00
Paul Eggert
2bda83b48d Merge recent gnulib changes, and remove some lint. 2004-04-05 02:29:18 +00:00
Sergey Poznyakoff
41d042c05f Updated 2004-04-04 13:33:54 +00:00
Sergey Poznyakoff
b826791a01 Added mksparse 2004-04-04 13:32:11 +00:00
Sergey Poznyakoff
2a384c4a84 Protect inclusion of <sys/time.h>
by ifdef.
Declare time() if HAVE_DECL_TIME is 0
2004-04-04 13:31:26 +00:00
Sergey Poznyakoff
f9dc020f90 Raised version number to 1.13.94 2004-04-04 13:30:42 +00:00
Sergey Poznyakoff
466e40abe5 Updated 2004-04-04 13:30:14 +00:00
Sergey Poznyakoff
f131340d6d Updated 2004-04-04 10:12:56 +00:00
Sergey Poznyakoff
7e2a46c522 Added missing call to 'after' 2004-04-04 10:12:08 +00:00
Sergey Poznyakoff
6dd96965de Updated 2004-04-04 09:53:18 +00:00
Sergey Poznyakoff
1bcc35dda0 Updated 2004-04-04 09:50:42 +00:00
Sergey Poznyakoff
2b861845e9 Updated 2004-04-04 09:48:45 +00:00
Sergey Poznyakoff
6cab217353 Added Mads Martin Joergensen 2004-04-04 09:47:35 +00:00
Sergey Poznyakoff
a5bafe7962 (usage): Prototype moved to common.h 2004-04-04 09:47:08 +00:00
Sergey Poznyakoff
096bf74fcf include <fnmatch.h>
(size_decoder): Assign to both st->archive_file_size and
st->stat.st_size.
(st->stat.st_size): Assign to st->stat.st_size
(sparse_numbytes_decoder): Removed unused variable
2004-04-04 09:43:09 +00:00
Sergey Poznyakoff
a55ec0a319 (utf8_convert): Changed prototype
(get_input_charset): Removed unused variable
2004-04-04 09:42:27 +00:00
Sergey Poznyakoff
61f44c9361 (usage): Prototype moved to common.h 2004-04-04 09:41:16 +00:00
Sergey Poznyakoff
55a96565b5 Include <sys/time.h> and <utime.h> when available 2004-04-04 09:33:41 +00:00
Sergey Poznyakoff
15a607fc11 (struct tar_sparse_optab.sparse_member_p)
(struct tar_sparse_optab.fixup_header): New member
(tar_sparse_member_p): New function.
(tar_sparse_init): Return true if decode_header is not provided
(tar_sparse_fixup_header)
(sparse_member_p,sparse_fixup_header)
(sparse_skip_file)
(oldgnu_sparse_member_p,oldgnu_fixup_header,star_sparse_member_p)
(star_fixup_header, pax_sparse_member_p): New function
(pax_decode_header): Remove
2004-04-04 09:33:25 +00:00
Sergey Poznyakoff
1329cfe9f8 include "common.h" 2004-04-04 09:32:33 +00:00
Sergey Poznyakoff
3ff03c0c5e (decode_header): Use sparse_fixup_header to correct
the st_size value.
(print_header): Do not rely on GNUTYPE_SPARSE type.
Use st->stat.st_size to print real file size.
(skip_member): Assign stat_info.file_name to save_name. This fixes
bug reported by Mads Martin Joergensen <mmj@suse.de>
Use sparse_skip_file() to skip sparse members.
2004-04-04 09:31:44 +00:00
Sergey Poznyakoff
3030a247b1 (extract_archive): Use sparse_member_p instead of GNUTYPE_SPARSE. 2004-04-04 09:26:11 +00:00
Sergey Poznyakoff
22c2e2ab8a Removed unused variables 2004-04-04 09:25:48 +00:00
Sergey Poznyakoff
be48ff0699 (diff_archive): Use is_sparse member instead of GNUTYPE_SPARSE. 2004-04-04 09:25:30 +00:00
Sergey Poznyakoff
a1d15e7c89 Added missing prototypes 2004-04-04 09:25:01 +00:00
Sergey Poznyakoff
ad2c53d626 Added new tests 2004-04-04 09:24:44 +00:00
Sergey Poznyakoff
8c0cb259bf Updated 2004-03-26 19:43:51 +00:00
Sergey Poznyakoff
472f860074 Add longv7.sh 2004-03-26 19:40:27 +00:00
Sergey Poznyakoff
d8981440bb (write_long_name): Do not allow more than
NAME_FIELD_SIZE-1 characters in a file name for V7 format
archives.
2004-03-26 19:39:40 +00:00
Sergey Poznyakoff
7f2e3cf63a Updated 2004-03-22 12:01:46 +00:00
Sergey Poznyakoff
f7dbd14d57 Updated to match the recent changes 2004-03-22 12:00:12 +00:00
Sergey Poznyakoff
106a24176e (open_archive): Clear read_full_records_option
if reading from a pipe.
(short_read): Display warning about the deduced record size
if version > 1
2004-03-22 11:59:35 +00:00
Sergey Poznyakoff
c83fcab116 Updated 2004-03-22 09:18:36 +00:00
Sergey Poznyakoff
4cb8697f60 Use genfile instead of dd 2004-03-22 09:17:48 +00:00
Sergey Poznyakoff
6bd7b64c78 (to_decimal): New function.
(xheader_format_name): Use to_decimal() instead of snprintf.
2004-03-22 09:17:18 +00:00
Sergey Poznyakoff
e5882c8220 (start_header): Check for GNU_FORMAT if incremental_option is set. 2004-03-22 09:16:49 +00:00
Sergey Poznyakoff
72e3da5dc7 Added gl_FUNC_STRTOULL 2004-03-22 09:15:56 +00:00
Sergey Poznyakoff
7b0b6c4e7a Updated 2004-03-12 10:39:27 +00:00
Sergey Poznyakoff
683390b02d (read_and): Stop processing the archive after
encountering a single zero record. Many old archives contain
arbitrary garbage after it.
The warning is issued anyway.
2004-03-12 10:38:46 +00:00
Sergey Poznyakoff
e189bd8eca Updated 2004-03-02 09:36:20 +00:00
Sergey Poznyakoff
5282ef9709 (utf8_convert): Indentation fix. 2004-03-02 09:35:13 +00:00
Sergey Poznyakoff
b38e4b4520 Added Leland Lucius 2004-03-02 09:34:44 +00:00
Sergey Poznyakoff
9f14fd52de (rmt_lseek__,rmt_ioctl__): Bugfix. The
conversion buffer was not null terminated. Fix provided
by Leland Lucius <llucius@tiny.net>
2004-03-02 09:34:06 +00:00
Sergey Poznyakoff
2345d02c63 Updated 2004-02-29 10:21:17 +00:00
Sergey Poznyakoff
6f219c485e Updated 2004-02-29 10:18:05 +00:00
Sergey Poznyakoff
a06ed48867 Added multi-fail.sh 2004-02-29 10:17:18 +00:00
Sergey Poznyakoff
d6929326e7 New test. 2004-02-29 10:16:33 +00:00
Sergey Poznyakoff
7fb546943e (sys_child_open_for_uncompress): Minor stylistic fix. 2004-02-29 10:16:02 +00:00
Sergey Poznyakoff
37400fa94e (flush_read): Bugfix: the condition at line 714 included
|| (status > 0 && !read_full_records_option)

which is grossly wrong, since even if new_volume() below succeeds,
the subsequent call to rmtread will overwrite the chunk of data
already read in the buffer and thus spoil everything.
2004-02-29 10:15:45 +00:00
Sergey Poznyakoff
8c1b242931 Updated 2004-02-29 00:15:05 +00:00
Sergey Poznyakoff
176557a004 New file 2004-02-29 00:09:31 +00:00
Sergey Poznyakoff
427f8d6185 Accomodate for the new testsuite logic 2004-02-29 00:07:00 +00:00
Sergey Poznyakoff
d584c1ed0f Rewritten 2004-02-29 00:06:36 +00:00
Sergey Poznyakoff
a8d1b579d7 Added new tests 2004-02-29 00:06:16 +00:00
Sergey Poznyakoff
5a9174376b New options: --utc and keep-newer-files 2004-02-29 00:06:03 +00:00
Sergey Poznyakoff
cedd9d6e81 (tartime): Print UTC if --utc was given. 2004-02-29 00:05:31 +00:00
Sergey Poznyakoff
29584d69fd Handle --keep-newer-files option 2004-02-29 00:05:12 +00:00
Sergey Poznyakoff
236deef28e (utc_option): new global
(enum old_files.KEEP_NEWER_FILES): New element
2004-02-29 00:04:50 +00:00
Sergey Poznyakoff
ca84e28ee5 Removed spurious AC_CHECK_LIB(iconv) 2004-02-29 00:04:21 +00:00
Sergey Poznyakoff
81bf1687f8 Updated 2004-02-29 00:04:03 +00:00
Paul Eggert
7afd75ed24 Append period to dircategory entry. 2004-02-26 18:02:50 +00:00
Sergey Poznyakoff
3dbc6a6645 Updated 2004-02-24 15:28:27 +00:00
Sergey Poznyakoff
d8b790047f (decode_header): Call xheader_decode before the assignment to current_stat_info.archive_file_size. 2004-02-24 15:27:54 +00:00
Paul Eggert
fb9a7d180f Invoke AM_ICONV, to define ICONV_CONST if needed. 2004-02-23 22:31:20 +00:00
Sergey Poznyakoff
6a887bbbe5 Updated 2004-02-23 10:07:21 +00:00
Sergey Poznyakoff
9e0d059205 Use prereq() instead of passing arguments to 'before'. 2004-02-23 10:05:42 +00:00
Sergey Poznyakoff
97b9e3d31c Move testing of the prerequisite archive formats
to the separate function 'prereq'. Do not expect any arguments
2004-02-23 10:05:22 +00:00
Sergey Poznyakoff
7add6e4274 Updated 2004-02-23 10:04:49 +00:00
Sergey Poznyakoff
96148abcfe Added UTF-8 support. Finished global extended header support. 2004-02-22 21:00:07 +00:00
Sergey Poznyakoff
a00631babf Give credit to Andreas Schuldei. 2004-02-22 20:55:12 +00:00
Sergey Poznyakoff
b8754a37c7 Use keywords from the global headers.
Correctly handle UTF-8 conversions.
(xheader_list_destroy): New function.
(xheader_set_single_keyword,xheader_set_keyword_equal): Added
missing gettext markers
(decode_record): Rewritten using caller-provided handler and
data closure.
2004-02-22 20:54:44 +00:00
Sergey Poznyakoff
fb766eefb4 Decode encountered global headers. 2004-02-22 20:54:04 +00:00
Sergey Poznyakoff
b1f33c8362 (write_header_name) In pax format, use "path" keyword if the file name is not ASCII 2004-02-22 20:53:27 +00:00
Sergey Poznyakoff
7a8bded5dd Added utf8.c 2004-02-22 20:52:56 +00:00
Sergey Poznyakoff
2de1477b3d Conversions to and from utf-8. 2004-02-22 20:52:34 +00:00
Sergey Poznyakoff
634927b7d2 Detect libiconv 2004-02-22 20:51:10 +00:00
Sergey Poznyakoff
7eeb467132 Minor fix 2004-02-22 20:50:33 +00:00
Sergey Poznyakoff
6847d128e9 Updated 2004-02-21 09:41:19 +00:00
Sergey Poznyakoff
44da0983c0 Sorry, the version number is .93 2004-02-21 09:40:45 +00:00
Sergey Poznyakoff
dfbfc2446f Updated 2004-02-21 09:38:29 +00:00
Sergey Poznyakoff
c145d8a6e3 Added listed01.sh 2004-02-21 09:36:15 +00:00
Sergey Poznyakoff
985199c260 Check listed incremental backups on individual files. 2004-02-21 09:35:44 +00:00
Sergey Poznyakoff
e8af2fec8a Minor stylistic fixes. 2004-02-21 09:35:10 +00:00
Sergey Poznyakoff
ee6aa2bea8 Raised patchlevel to 92a 2004-02-21 09:34:39 +00:00
Sergey Poznyakoff
2ad098dfff Updated 2004-02-21 09:34:22 +00:00
Sergey Poznyakoff
b960c38c4b (dump_file0): The conditional at line
1296 prevented incremental backups on individual files
from working, as reported by Andreas Schuldei
<andreas@schuldei.org>.

This is due to the condition

  (0 < top_level || !incremental_option)

Removing it makes incremental backups work for individual
files as well as for directories. On the other hand, it does
not affect other functionality, as shown by the reasoning below:

To begin with, the two parts of this condition are mutually
superfluous, because

  1) when top_level < 0, incremental_option == 1
  so the condition yields false
  2) when top_level >= 0, incremental_option == 0
  so the condition yields true.

In other words, it is completely equivalent to

      (!incremental_option)

Now, let's consider the effect of its removal. There are two cases:

1) when incremental_option==1
This means incremental backup in progress. In this case dump_file
is invoked only for directories or for files marked with 'Y' by
get_directory_contents. The latter are those that did not meet the
condition in incremen.c:242, which is exactly the same condition
as this at create.c:1296. So, for these files the check
(!incremental_option) is useless, since the rest of the
conditional will yield false anyway. On the other hand, if
dump_file is invoked on a directory, the conditional will yield
false due to !S_ISDIR assertion, so these will be processed as usual.

Thus, for this case the extra condition (!incremental_option) is
irrelevant, and its removal won't alter the behavior of tar,
*except* that it will enable incremental backups on individual
files, which is the wanted effect.

2) when incremental_option==0
In this case the condition yields true and its removal does not
affect the functionality.
2004-02-21 09:33:58 +00:00
Sergey Poznyakoff
ccaedb6b29 Updated 2004-02-20 15:42:41 +00:00
Sergey Poznyakoff
d46025b23c (sort_obstack): Fixed typo in the comment 2004-02-20 15:40:47 +00:00
Sergey Poznyakoff
72ac31581d (decode_header): Call xheader_decode unconditionally. 2004-02-20 15:39:45 +00:00
Sergey Poznyakoff
64cca92a1f (delete_archive_members): Call xheader_decode unconditionally. 2004-02-20 15:39:29 +00:00
Sergey Poznyakoff
c487595864 Require gnu or oldgnu format 2004-02-20 15:36:18 +00:00
Sergey Poznyakoff
29e59e07b1 Require gnu, oldgnu or posix format 2004-02-20 15:35:30 +00:00
Sergey Poznyakoff
74d29bc5de Accept an optional list of allowed archive
formats. Exit with the status 77 if the current archive
format does not match any of them.
2004-02-20 15:35:19 +00:00
Sergey Poznyakoff
069c0d99ae Document new default for extended header names. 2004-02-20 15:34:37 +00:00
Sergey Poznyakoff
f038194718 (xheader_format_name): Bugfix.
(xheader_xhdr_name): Changed the default extended header name
to '%d/PaxHeaders.%p/%f', as POSIX requires.
(xheader_ghdr_name): Removed unused argument.
(xheader_write,xheader_write_global): New function.
(xheader_decode): Modified to honor overrides whatever
the current archive format is.
2004-02-20 15:34:12 +00:00
Sergey Poznyakoff
eff25ef359 (update_archive): Write global extended header if constructed. 2004-02-20 15:33:12 +00:00
Sergey Poznyakoff
b3060eabaf (assert_format): Do not bail out if several
--format arguments are given. This is a common case when
TAR_OPTIONS are used.
(decode_options): New option --show-defaults displays the
compiled-in defaults.

Use POSIX format if no --format option was given and
--pax-option was specified.

Do not allow to use --pax-option unless the archive format is
set to POSIX (or reading subcommand is requested).
2004-02-20 15:32:56 +00:00
Sergey Poznyakoff
93a4273b66 (start_private_header): Removed static qualifier.
(write_extended): Removed superfluous last argument. Use
xheader_write()
(simple_finish_header): New function.
(finish_header): Use simple_finish_header() to break recursive
dependency between this function and write_extended().
2004-02-20 15:32:12 +00:00
Sergey Poznyakoff
17be45c834 (simple_finish_header,start_private_header): New
declarations
(xheader_ghdr_name): Changed declaration
2004-02-20 15:30:26 +00:00
Sergey Poznyakoff
694f427d0e Updated 2004-02-20 11:46:33 +00:00
Sergey Poznyakoff
b4e605a829 Added a comment 2004-02-20 11:45:15 +00:00
Sergey Poznyakoff
b58452bdbd Documented --pax-option 2004-02-20 11:44:46 +00:00
Sergey Poznyakoff
ff541dcac6 Updated 2004-02-18 14:56:56 +00:00
Sergey Poznyakoff
6613170489 Updated 2004-02-18 14:49:08 +00:00
Sergey Poznyakoff
6ac0d0aadd Updated 2004-02-18 14:44:53 +00:00
Sergey Poznyakoff
694e8376ab Minor fixes 2004-02-18 14:41:41 +00:00
Sergey Poznyakoff
440e65ef2c Implement pax -o option. Fixed misleading heading comment (introduced 2003-09-02). 2004-02-18 14:41:23 +00:00
Sergey Poznyakoff
d0eceef438 New option --pax-option (equivalent to -o option of pax). 2004-02-18 14:41:00 +00:00
Sergey Poznyakoff
434f2a22ba (write_extended): Call xheader_xhdr_name
instead of using hardcoded "././@PaxHeader" name.
2004-02-18 14:40:21 +00:00
Sergey Poznyakoff
0bfb6e136d (xheader_xhdr_name,xheader_ghdr_name): New functions 2004-02-18 14:39:36 +00:00
Sergey Poznyakoff
7d31c8176c Added stpcpy 2004-02-18 14:39:24 +00:00
Sergey Poznyakoff
cbde0aa660 Updated 2004-02-18 14:39:10 +00:00
Sergey Poznyakoff
251935d751 Updated 2004-02-17 13:34:14 +00:00
Sergey Poznyakoff
b840052b46 Fixed typo 2004-02-17 13:33:52 +00:00
Sergey Poznyakoff
67d29a4d60 Minor changes 2004-02-17 13:33:14 +00:00
Sergey Poznyakoff
df7792b5d8 Removed accumulator stuff in favor of obstack.
get_directory_contents): Split into two functions
2004-02-17 13:32:41 +00:00
Paul Eggert
8b107d09e1 Fix Debian bug 230872, originally reported by Jeff King in
<http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=230872>.
2004-02-15 08:36:20 +00:00
Sergey Poznyakoff
f6db096374 Updated 2004-01-21 10:38:38 +00:00
Sergey Poznyakoff
814c517a15 Updated 2004-01-21 10:37:28 +00:00
Sergey Poznyakoff
9771467dc8 Updated TP URL, improved help output. Default
to :ext:anoncvs and set CVS_RSH, unless already set.
2004-01-21 10:34:30 +00:00
Sergey Poznyakoff
64dd6a38b4 Updated 2004-01-21 10:32:40 +00:00
Sergey Poznyakoff
65ef81b0a3 Require automake-1.8/autoconf-2.59. Removed m4/Makefile. 2004-01-21 10:32:06 +00:00
Sergey Poznyakoff
143e677b5e Removed m4 2004-01-21 10:31:06 +00:00
Sergey Poznyakoff
092b81cb95 Updated 2004-01-20 23:32:26 +00:00
Sergey Poznyakoff
0ad27d1986 Use $option instead of $1 so all options will be parsed. Bugfix by Marco Gerards 2004-01-20 23:31:26 +00:00
Sergey Poznyakoff
6c347931b1 Updated 2004-01-03 22:35:22 +00:00
Sergey Poznyakoff
d7860cb091 Added recurse.sh and mksparse.c 2004-01-03 22:27:58 +00:00
Sergey Poznyakoff
1665d38fb7 New file. 2004-01-03 22:27:36 +00:00
Sergey Poznyakoff
da99cd963d New test case. 2004-01-03 22:26:58 +00:00
Sergey Poznyakoff
bda7d59010 (time_to_start_writing): Changed data type. 2004-01-03 22:26:30 +00:00
Sergey Poznyakoff
463e7278f4 (decode_options): More option compatibility checks (moved from buffer.c) 2004-01-03 22:26:11 +00:00
Sergey Poznyakoff
829b1dc328 Updated assignment to write_archive_to_stdout 2004-01-03 22:25:41 +00:00
Sergey Poznyakoff
dd6094f6c0 Updated invocations of safer_name_suffix 2004-01-03 22:25:24 +00:00
Sergey Poznyakoff
bc89f023c1 (maybe_backup_file): Changed return type 2004-01-03 22:24:35 +00:00
Sergey Poznyakoff
95be2c50b4 (new_volume,check_label_pattern): Changed return type.
(time_to_start_writing): Changed data type
(file_to_switch_to): Removed. Variable never assigned to.
(open_archive) Moved option compatibility checks to tar.c
Other minor changes.
2004-01-03 22:23:48 +00:00
Sergey Poznyakoff
7631b4e595 New option --no-po 2004-01-03 22:22:01 +00:00
Sergey Poznyakoff
aa5d3fc8a6 Updated 2004-01-03 11:46:36 +00:00
Sergey Poznyakoff
2690759c06 (dump_dir0): Bugfix. Thanks Piotr Czerwinski <pius@pld-linux.org> for the patch. 2004-01-03 11:45:31 +00:00
Sergey Poznyakoff
b74232b9ad (sparse_diff_file): Bugfix. Thanks Martin Simmons for the patch. 2004-01-03 11:44:45 +00:00
uid65632
3d09d579c1 Synchronize with Gettext 0.13.1, Automake 1.8, Autoconf 2.59,
and translation website.
2003-12-27 06:41:48 +00:00
uid65697
a39523cc61 Updated 2003-12-25 10:26:40 +00:00
uid65697
c506c33ad3 (safer_name_suffix): Reverted change made 2003-11-14. Reason: Discussion with Paul Eggert and Jean-Louis Martineau. See also ChangeLog entry from 1999-08-14. 2003-12-25 10:20:54 +00:00
uid65697
3710b34c7e (code_time,decode_time): Support for subsecond precision. (atime_coder,atime_decoder,ctime_coder,ctime_decoder) (mtime_coder,mtime_decoder): Update invocations of code_time and decode_time. (gid_decoder,size_decoder,uid_decoder,sparse_size_decoder) (sparse_numblocks_decoder,sparse_offset_decoder) (sparse_numbytes_decoder): Updated 2003-12-25 10:20:43 +00:00
uid65697
ad37f06975 (tar_stat_info.atime_nsec,mtime_nsec,ctime_nsec): New members. 2003-12-25 10:20:32 +00:00
uid65697
12b111ffa3 (sys_stat_nanoseconds): New function 2003-12-25 10:20:19 +00:00
uid65697
5160a64f71 (sparse_scan_file): Correctly handle files with a hole at the end. (sparse_dump_region,sparse_extract_region): Allow for zero size trailing blocks 2003-12-25 10:20:05 +00:00
uid65697
f30c03c934 (safer_name_suffix): Reverted change made 2003-11-14. Reason: Discussion with Paul Eggert and Jean-Louis Martineau. See also ChangeLog entry from 1999-08-14. 2003-12-25 10:19:40 +00:00
uid65697
67a6a93b2f (read_and): Treat only two successive zero filled blocks as an EOF indicator. Issue a warning if a single one is encountered. 2003-12-25 10:19:24 +00:00
uid65697
50b2227279 (print_header): Use archive_file_size member when printing real file size. 2003-12-25 10:19:12 +00:00
uid65697
defde32533 (decode_header): Discern between pax and ustar formats 2003-12-25 10:19:00 +00:00
uid65697
fc184a85e1 (write_directory_file): Use sys_truncate 2003-12-25 10:18:48 +00:00
uid65697
f7ce5a4ec5 (dump_file0): Use sys_stat_nanoseconds(). 2003-12-25 10:18:37 +00:00
uid65697
2a027394ef (sys_stat_nanoseconds): New function 2003-12-25 10:18:25 +00:00
uid65697
278a8945a6 (short_read): Issue a warning on short reads. 2003-12-25 10:18:14 +00:00
uid65697
bb0b5c01c9 Check for varios members of struct stat that may represent file modification times with a subsecond precision. Check for utimes (for future use) 2003-12-25 10:18:00 +00:00
uid65697
15cb6d782c Raised version number to 1.13.92 2003-12-25 10:17:48 +00:00
uid65697
3b3f5da0e9 Updated 2003-12-25 10:17:18 +00:00
uid65697
2a822f7a76 Updated 2003-12-25 10:17:05 +00:00
uid65697
fb8788008b Updated 2003-12-25 10:16:52 +00:00
uid65697
6eafe45176 Updated 2003-12-25 10:16:39 +00:00
Sergey Poznyakoff
084291fca1 Updated 2003-12-01 21:31:13 +00:00
Sergey Poznyakoff
5f32345fe6 Minor fix 2003-12-01 21:28:11 +00:00
Sergey Poznyakoff
fa2801b6dc (struct xhdr_tab.coder; all coder function): Added
extra argument
Implemeted GNU.sparse.* keywords.
2003-12-01 21:21:11 +00:00
Sergey Poznyakoff
f193c4c04a (usage): Cleaned up the sample argument to --newer
option.
(decode_options): Allow --sparse for POSIX_FORMAT archives.
2003-12-01 21:20:47 +00:00
Sergey Poznyakoff
47e73c7a44 (extract_archive): Check reported size vs.
archive file size to determine if we have to do with a
sparse file.
2003-12-01 21:19:37 +00:00
Sergey Poznyakoff
2632f1c8d2 Update calls to xheader_store 2003-12-01 21:19:16 +00:00
Sergey Poznyakoff
4dcf7987f8 (xheader_store): Changed prototype. 2003-12-01 21:19:01 +00:00
Sergey Poznyakoff
374ce58aa0 Initial implementation of GNU/pax sparse file format. 2003-12-01 21:18:30 +00:00
Sergey Poznyakoff
475a54cc06 Updated 2003-12-01 21:18:10 +00:00
Sergey Poznyakoff
b741d17b27 Updated 2003-11-30 21:19:31 +00:00
Sergey Poznyakoff
a41d27ff5b Check for setlocale. Thanks Bruno Haible for reporting. 2003-11-30 21:18:12 +00:00
Sergey Poznyakoff
869326ae90 Updated 2003-11-25 07:05:15 +00:00
Sergey Poznyakoff
25d9ca1163 (write_gnu_long_link): Use oldgnu magic with @LongLink blocks. 2003-11-25 07:04:45 +00:00
Sergey Poznyakoff
d7e8c16a89 Updated 2003-11-17 15:21:57 +00:00
Sergey Poznyakoff
8d6e47cc7f Support for star sparse format 2003-11-17 15:20:46 +00:00
Sergey Poznyakoff
b3404769c3 Updated 2003-11-17 11:07:26 +00:00
Sergey Poznyakoff
bb798080be (diff_archive): Use sparse_diff_file. 2003-11-17 11:05:18 +00:00
Sergey Poznyakoff
d4e70d3656 (sys_compare_uid,sys_compare_gid): New functions
(sys_compare_uid_gid): Removed.
(sys_compare_links): Changed declaration
2003-11-17 11:05:06 +00:00
Sergey Poznyakoff
82e94dab6d (sys_compare_uid,sys_compare_gid): New functions
(sys_compare_uid_gid): Removed.
(sys_compare_links,report_difference): Changed prototype
(sparse_diff_file): New function
2003-11-17 11:04:40 +00:00
Sergey Poznyakoff
a8b2b68c33 (sparse_diff_file): New function 2003-11-17 11:04:16 +00:00
Sergey Poznyakoff
40ede4e2df Updated 2003-11-17 07:44:44 +00:00
Sergey Poznyakoff
22ae47de82 Use new diagnostics functions. 2003-11-17 07:39:33 +00:00
Sergey Poznyakoff
7c05e2f650 (close_diag,open_diag,read_diag_details)
(readlink_diag,savedir_diag,seek_diag_details,stat_diag): New
diagnostics functions.
2003-11-17 07:39:09 +00:00
Sergey Poznyakoff
80e5de9310 Minor changes 2003-11-17 07:38:37 +00:00
Sergey Poznyakoff
3999bf6360 (diff_sparse_files): Temporary placeholder. 2003-11-17 07:38:03 +00:00
Sergey Poznyakoff
87fa28ed2a Use new sparse file interface. 2003-11-17 07:37:03 +00:00
Sergey Poznyakoff
3cdbeffe30 Major rewrite. 2003-11-17 07:36:18 +00:00
Sergey Poznyakoff
80b8de13ce (struct sp_array): Declaration from common.h
(struct tar_stat_info): New members archive_file_size,
sparse_map_avail,sparse_map.
2003-11-17 07:34:55 +00:00
Sergey Poznyakoff
caa20e5bac (struct sp_array,sparsearray,sp_array_size)
(init_sparsearray,fill_in_sparse_array): Removed
(enum dump_status): New data type
(pad_archive,close_diag,open_diag,read_diag_details)
(readlink_diag,savedir_diag,seek_diag_details,stat_diag): New
functions.
(sparse_file_p,sparse_dump_file,sparse_extract_file): New
functions.
2003-11-17 07:34:16 +00:00
Sergey Poznyakoff
18ef8acac5 Added sparse.c 2003-11-17 07:32:37 +00:00
Sergey Poznyakoff
fad21ebf58 Updated 2003-11-14 13:33:30 +00:00
Sergey Poznyakoff
69bbe71607 Fixed check for setsockopt 2003-11-14 13:33:11 +00:00
Sergey Poznyakoff
7836f927b3 Updated 2003-11-14 12:28:06 +00:00
Sergey Poznyakoff
8c0a6b24b2 Do not zero-terminate name field if
the name is exactly 100 characters long.
(write_ustar_long_name): Fixed cheking for unsplittable
names.
2003-11-14 12:27:50 +00:00
Sergey Poznyakoff
ebeb3d4f30 Updated 2003-11-14 09:58:11 +00:00
Sergey Poznyakoff
3bfdc3f8ce (safer_name_suffix): If the input file name ends with a slash, output one should do so as well. 2003-11-14 09:57:49 +00:00
Sergey Poznyakoff
bc73e3d68d Removed debugging hook 2003-11-14 09:56:11 +00:00
Sergey Poznyakoff
5f152198cb Updated 2003-11-14 09:28:41 +00:00
Sergey Poznyakoff
8f5dc5ffa4 Documented --format=ustar 2003-11-14 09:28:18 +00:00
Sergey Poznyakoff
f92c7cf4c8 (start_header): Removed debugging hook
(dump_file): Fixed handling of linkname field.
2003-11-14 09:27:50 +00:00
Sergey Poznyakoff
ca99923dcd Updated 2003-11-13 22:28:20 +00:00
Sergey Poznyakoff
347ea38cc4 Updated 2003-11-13 22:27:56 +00:00
Sergey Poznyakoff
7e2f7ead1c New option --format=ustar forces POSIX.1-1988 archive format. 2003-11-13 22:27:44 +00:00
Sergey Poznyakoff
052118a907 (safer_name_suffix): Skip leading ./ 2003-11-13 22:27:23 +00:00
Sergey Poznyakoff
fe4ee38fce Added POSIX.1-1988 support. 2003-11-13 22:27:09 +00:00
Sergey Poznyakoff
040bc32535 (archive_format): USTAR_FORMAT: New type. 2003-11-13 22:26:55 +00:00
Sergey Poznyakoff
d4f872de37 Updated 2003-11-13 08:49:10 +00:00
Sergey Poznyakoff
4ed709c3c2 (atime_decoder,gid_decoder,ctime_decoder)
(mtime_decoder,size_decoder,uid_decoder): Use xstrtoumax.
Fixes "pax-big-10g" bug
2003-11-13 08:47:25 +00:00
Sergey Poznyakoff
c95535bae8 (all_names_found): Check if the argument
contains valid filename. Fixes coredump on "not_a_tar_file"
2003-11-13 08:46:53 +00:00
Sergey Poznyakoff
cc8628df0c (read_and): Initialize current_stat_info
and extended_header at the start of the loop.
2003-11-13 08:46:26 +00:00
Paul Eggert
572225dfdc Fix some C compatibility bugs reported by Joerg Schilling. 2003-11-13 06:23:23 +00:00
Sergey Poznyakoff
182091e79f Updated 2003-11-12 11:46:26 +00:00
Sergey Poznyakoff
f035e8f9e2 (decode_header): Initialize st_atime and st_ctime. 2003-11-12 11:46:04 +00:00
Sergey Poznyakoff
8a3b098acf Update 2003-11-11 15:03:06 +00:00
Sergey Poznyakoff
8cea4725f4 Fixed spelling. Thanks Martin Buchholz
<martin@xemacs.org> for spotting.
2003-11-11 15:02:27 +00:00
Sergey Poznyakoff
f6be77cada (tar_save_LIBS): Bugfix. Thanks Adrian
Bunk <bunk@fs.tum.de> for reporting.
2003-11-11 15:01:13 +00:00
Paul Eggert
4414f1a82c Make xhdr_tab extern, not static. 2003-11-05 01:33:35 +00:00
Paul Eggert
761802e87a Include bounds in forward declaration for xhdr_tab. 2003-11-03 23:03:35 +00:00
Paul Eggert
b7ed638806 * system.c (sys_spawn_shell): Cast trailing null to (char *). 2003-10-27 05:41:15 +00:00
Sergey Poznyakoff
5d0b6564f3 Updated 2003-10-19 19:34:51 +00:00
Sergey Poznyakoff
9e445dcdd1 Texinfo does not like macros in @copying and @shorttitlepage text... 2003-10-19 19:17:39 +00:00
Sergey Poznyakoff
c2ba0ffa3e Documented new features. 2003-10-19 19:05:45 +00:00
Sergey Poznyakoff
4bc226bb42 (decode_options): Removed superfluous archive format check 2003-10-19 19:02:03 +00:00
Sergey Poznyakoff
1a1f2d33d5 Updated 2003-10-19 18:56:49 +00:00
Sergey Poznyakoff
80088dcafc Updated 2003-10-08 11:21:34 +00:00
Sergey Poznyakoff
006d3dc1d5 [MSDOS]: Fixed spelling of EACCES. Added macro overriding broken mkdir prototypes. 2003-10-08 11:18:01 +00:00
Sergey Poznyakoff
80e978dc2e Removed spurious includes. 2003-10-08 11:17:52 +00:00
Sergey Poznyakoff
89d2ad35e6 Added missing includes. 2003-10-08 11:17:36 +00:00
Sergey Poznyakoff
bf6b473b3b Added missing headers 2003-10-08 11:17:23 +00:00
Sergey Poznyakoff
151d1386e1 Added Wojciech Polak 2003-10-08 11:17:11 +00:00
Sergey Poznyakoff
32c1e664e5 Updated 2003-10-08 11:16:47 +00:00
Sergey Poznyakoff
cb090cfe82 Added checks for missing functions. Raised version number to indicate alpha release. 2003-10-08 11:16:37 +00:00
Paul Eggert
1e7d274cd8 Fix some misspellings. 2003-10-04 22:30:52 +00:00
Sergey Poznyakoff
4f644c3479 Updated 2003-10-04 18:22:46 +00:00
Sergey Poznyakoff
0008f61237 Added system.c 2003-10-04 18:19:34 +00:00
Sergey Poznyakoff
a0d91086c4 Moved system dependencies to system.c 2003-10-04 18:18:02 +00:00
Sergey Poznyakoff
c1b9212b16 Moved system dependencies to system.c 2003-10-04 18:14:32 +00:00
Sergey Poznyakoff
3b76d26206 (SET_BINARY_MODE, ERRNO_IS_EACCESS): New defines 2003-10-04 18:13:51 +00:00
Sergey Poznyakoff
719c762d80 Prototypes for functions from system.c 2003-10-04 18:13:37 +00:00
Sergey Poznyakoff
b085ca3097 System-dependent functions 2003-10-04 18:13:02 +00:00
Sergey Poznyakoff
cf08a6de1b Added missing files. 2003-10-04 18:12:16 +00:00
Sergey Poznyakoff
86f7407ffe Check for dev_t and ino_t. 2003-10-04 18:10:08 +00:00
Sergey Poznyakoff
33b04d5ecd Updated 2003-10-04 14:09:46 +00:00
Sergey Poznyakoff
eb6bef9909 New option --occurrence 2003-10-04 14:08:16 +00:00
Sergey Poznyakoff
bbbbf42fa6 Updated 2003-10-04 14:05:14 +00:00
Sergey Poznyakoff
91493ea9b6 Count number of occurrences of each name in the
archive.
(name_match): Honor --occurence option.
(names_done): Removed
(all_names_found,names_notfound): Rewritten.
2003-10-04 13:50:41 +00:00
Sergey Poznyakoff
dcb7c93527 (read_and): Honor --occurence option. 2003-10-04 13:50:20 +00:00
Sergey Poznyakoff
f4935ab55d (delete_archive_members): Honor --occurence option. 2003-10-04 13:49:46 +00:00
Sergey Poznyakoff
660c6d9b64 (occurrence_option): New global
(struct name): Changed `found' member to `uintmax_t
found_count'.
(names_done): Removed
(all_names_found): Changed prototype.
(ISFOUND,WASFOUND): New macros
2003-10-04 13:49:25 +00:00
Sergey Poznyakoff
35d44a05eb Updated 2003-10-04 13:48:52 +00:00
Sergey Poznyakoff
4cf3121472 Updated 2003-10-02 15:08:01 +00:00
Sergey Poznyakoff
7c1a245918 Updated 2003-10-02 15:07:25 +00:00
Sergey Poznyakoff
634baf4d87 Updated 2003-10-02 14:38:23 +00:00
Sergey Poznyakoff
a6344f97a6 Removed extra precaution regarding subcommand_option == CAT_SUBCOMMAND 2003-10-02 14:37:24 +00:00
Sergey Poznyakoff
e23ad5b4f6 Updated 2003-10-02 10:42:14 +00:00
Sergey Poznyakoff
f364d50661 Take regexps into account 2003-10-02 10:41:48 +00:00
Sergey Poznyakoff
17878ad672 New option --first-copy 2003-10-02 10:29:43 +00:00
Sergey Poznyakoff
13be4005e7 Updated 2003-10-02 10:29:18 +00:00
Sergey Poznyakoff
6c16197226 New option --first-copy 2003-10-02 10:29:00 +00:00
Sergey Poznyakoff
05b3fdccc1 (read_and): Use all_names_found() as `while' condition. 2003-10-02 10:28:45 +00:00
Sergey Poznyakoff
9373182407 (names_done): New function. 2003-10-02 10:28:30 +00:00
Paul Eggert
00ac26f00c Don't translate "Copyright". 2003-09-24 19:11:44 +00:00
Paul Eggert
07286647fb --strip strips file system prefix too, and it counts adjacent
slashes as if they were one slash.
2003-09-22 18:54:50 +00:00
Paul Eggert
b0e8ba8839 (extracting untrusted archives): New section. 2003-09-22 18:26:50 +00:00
Paul Eggert
21dd6332cc * README-alpha: Document maintainer tool assumptions a bit.
* configure.ac (AC_AIX, AC_MINIX): Remove.
* lib/.cvsignore, m4/.cvsignore: Update.
2003-09-18 06:29:27 +00:00
Paul Eggert
867f933aac Add restrict.m4, time_r.m4. 2003-09-18 06:28:13 +00:00
Paul Eggert
6848f79e3b Add exit.h, time_r.c, time_r.h. 2003-09-18 06:27:52 +00:00
Paul Eggert
491bcfb153 (AC_AIX, AC_MINIX): Remove; subsumed by gl_USE_SYSTEM_EXTENSIONS. 2003-09-18 06:27:34 +00:00
Paul Eggert
6de6421787 Document maintainer tool assumptions a bit. GNU 'sed' is no longer
required.  For GNU m4 1.4, suggest the patch in Debian bug 211447.
Fix minor misspellings/whitespace nits.
2003-09-18 06:26:47 +00:00
Paul Eggert
0e1e4d8381 bootstrap: Don't use "for option; do". 2003-09-17 17:35:16 +00:00
Paul Eggert
54e322110c Don't use "for option; do"; Solaris 8 /bin/sh doesn't like that. 2003-09-17 17:33:32 +00:00
Sergey Poznyakoff
659f70a38a Updated 2003-09-17 12:37:58 +00:00
Sergey Poznyakoff
9e783c548c Updated 2003-09-17 10:30:45 +00:00
Sergey Poznyakoff
a0c656364a Updated 2003-09-17 10:19:01 +00:00
Sergey Poznyakoff
674691c7ba Added src/xheader.c 2003-09-17 10:18:11 +00:00
Sergey Poznyakoff
0289902e4a (cut_path_elements): Added proto. 2003-09-17 10:17:09 +00:00
Sergey Poznyakoff
187c23b8d7 Updated 2003-09-05 13:25:32 +00:00
Sergey Poznyakoff
91b2d65e9d Use ngettext where appropriate. 2003-09-05 13:24:15 +00:00
Sergey Poznyakoff
99f41a1224 Update 2003-09-04 15:49:37 +00:00
Sergey Poznyakoff
eada0a9b35 New option --strip-path=NUM.
(decode_options) Assign boolean values to bool variables.
2003-09-04 15:48:02 +00:00
Sergey Poznyakoff
3590887776 (cut_path_elements): New functon. 2003-09-04 15:47:26 +00:00
Sergey Poznyakoff
ddab1f615e (extract_archive): Implemented --strip-path 2003-09-04 15:44:44 +00:00
Sergey Poznyakoff
d93cbfbf0b (strip_path_elements): New variable. 2003-09-04 15:44:07 +00:00
Sergey Poznyakoff
5b9d8c93c7 Updated 2003-09-04 15:43:35 +00:00
Sergey Poznyakoff
08cfd54f54 Added *.shar.gz 2003-09-04 15:42:55 +00:00
Sergey Poznyakoff
75b511727c Updated 2003-09-04 14:01:22 +00:00
Sergey Poznyakoff
a86cdfa58b Explicitly request GNU format. This will
disappear when GNU extended header keywords are working.
2003-09-04 14:00:25 +00:00
Sergey Poznyakoff
f3875c4a26 (xheader_decode): Store the header as well (for eventual delete). 2003-09-04 13:59:52 +00:00
Sergey Poznyakoff
8b4453b4e2 (main): Do not check for volume_label_option unless subcommand_option is CREATE_SUBCOMMAND. 2003-09-04 13:59:35 +00:00
Sergey Poznyakoff
7645d20465 (read_header): Minor change. 2003-09-04 13:59:03 +00:00
Sergey Poznyakoff
08780d289d Fixed deletion from the POSIX archives. 2003-09-04 13:58:42 +00:00
Sergey Poznyakoff
e400810b5d Updated 2003-09-04 09:38:14 +00:00
Sergey Poznyakoff
3f998f69b9 (decode_record): Reversed the return condition. 2003-09-04 09:37:48 +00:00
Sergey Poznyakoff
aea0a1d970 Support for "linkpath" extended keyword 2003-09-04 09:37:05 +00:00
Sergey Poznyakoff
87ff702389 Updated 2003-09-03 11:03:58 +00:00
Sergey Poznyakoff
c92c357a62 Updated 2003-09-03 11:03:23 +00:00
Sergey Poznyakoff
0ba3b75ad4 Use DEFAULT_ARCHIVE_FORMAT macro
(archive_format_string): New function.
(usage): Updated help output.
2003-09-03 11:03:07 +00:00
Sergey Poznyakoff
9f0cdc8f56 Allow to redefine the default output format. 2003-09-03 11:02:38 +00:00
Paul Eggert
c54ec5a895 Remove some lint caught by gcc -Wall -W, etc. 2003-09-03 06:23:42 +00:00
Paul Eggert
10edb315da (struct xhdr_tab.keyword): Now pointer to const.
(struct xhdr_tab.coder, struct xhdr_tab.decoder, locate_handler,
decode_record, xheader_store, xheader_print, code_string, code_time,
code_num, dummy_coder, dummy_decoder, atime_coder, atime_decoder,
gid_coder, gid_decoder, gname_coder, gname_decoder, linkpath_coder,
linkpath_decoder, ctime_coder, ctime_decoder, mtime_coder,
mtime_decoder, path_coder, path_decoder, size_coder, size_decoder,
uid_coder, uid_decoder, uname_coder, uname_decoder):
Use pointers to const when possible.
(xhdr_tab): Now const.

(struct xhdr_tab.decoder, dummy_decoder,
atime_decoder, gid_decoder, gname_decoder, linkpath_decoder,
ctime_decoder, mtime_decoder, path_decoder, size_decoder,
uid_decoder, uname_decoder): Remove unused keyword arg.
All uses changed.

(xhdr_tab, format_uintmax): Now static.

(dummy_coder, dummy_decoder, atime_coder,
atime_decoder, gid_coder, gid_decoder, gname_coder, gname_decoder,
linkpath_coder, linkpath_decoder, mtime_coder, mtime_decoder,
ctime_coder, ctime_decoder, path_coder, path_decoder, size_coder,
size_decoder, uid_coder, uid_decoder, uname_coder, uname_decoder):
Remove forward decls; no longer needed.
(xhdr_tab): Move to end, so that the forward decls aren't needed.
Add a forward declaration.

(decode_record): Return bool, not int.

(decode_record): Fix misspelling in diagnostic
"extended headed" -> "extended header".

(decode_record, xheader_decode):
Do not use decls like "char *p, *q;".
2003-09-03 06:22:34 +00:00
Paul Eggert
df06a57b8c (update_archive): Abort if HEADER_SUCCESS_EXTENDED occurs,
as it's not possible.
Pass false to read_header, not 0.
2003-09-03 06:20:41 +00:00
Paul Eggert
14e8c10222 (struct fmttab.name): Now char const *. All uses changed.
(fmttab): Now const.  All uses changed.  Avoid GCC warning by
not eliding initializers.
(set_archive_format): Report an error if no format name matches,
instead of returning an undefined value.
(set_archive_format): Now static.
2003-09-03 06:19:00 +00:00
Paul Eggert
a546fc7c21 (read_and): Abort if HEADER_SUCCESS_EXTENDED occurs, as it's not
possible.  Pass false to read_header, not 0.
2003-09-03 06:15:32 +00:00
Paul Eggert
86a9b9261d (delete_archive_members): Handle case of
HEADER_SUCCESS_EXTENDED followed by HEADER_FAILURE.
Pass true/false to read_header, not 1/0.
2003-09-03 06:14:37 +00:00
Paul Eggert
7653d2f6b8 (write_extended): Remove unused local 'bufsize'. 2003-09-03 06:13:26 +00:00
Paul Eggert
2c390b2c21 (verify_volume): read_header (0) -> read_header (false), since
read_header accepts a bool.
2003-09-03 06:11:52 +00:00
Paul Eggert
c4d396f8d1 (destroy_stat, xheader_decode, xheader_store,
xheader_read, xheader_finish, xheader_destroy): Add decls;
required in C99.
2003-09-03 06:10:55 +00:00
Sergey Poznyakoff
40138ceb05 Updated 2003-09-03 00:06:12 +00:00
Sergey Poznyakoff
99a5f5d4f9 (xhdr_tab): Reserved GNU keywords (commented out for the time being) 2003-09-03 00:03:32 +00:00
Sergey Poznyakoff
01decb5737 (list_archive): Always decode the header. This
is necessary so the extended header is processed and the correct
filename is printed no matter what the state of verbose_option.
2003-09-03 00:03:09 +00:00
Sergey Poznyakoff
ce059f3cc8 (start_header): Store long file names
in "path" keyword of an extended header if in POSIX
mode.
(finish_header): print header before calling write_extended().
2003-09-03 00:02:32 +00:00
Paul Eggert
01f19e973b Merge changes from gnulib. 2003-09-02 04:09:03 +00:00
Sergey Poznyakoff
c76e8a861e Updated 2003-09-01 17:45:10 +00:00
Sergey Poznyakoff
8750043986 Added new files 2003-09-01 17:43:24 +00:00
Sergey Poznyakoff
49ce0ebbea Updated 2003-09-01 17:20:47 +00:00
Sergey Poznyakoff
9e4f9e232c obstack is autodetermined... 2003-09-01 17:19:56 +00:00
Sergey Poznyakoff
c3440ae0c9 Added 'gl_OBSTACK' 2003-09-01 17:11:11 +00:00
Sergey Poznyakoff
d71b31e241 Added obstack 2003-09-01 17:06:11 +00:00
Sergey Poznyakoff
4d0ac610b0 Minor formatting change 2003-09-01 17:04:21 +00:00
Sergey Poznyakoff
c22a8b44d7 Added obstack. 2003-09-01 17:03:49 +00:00
Sergey Poznyakoff
4189af3785 Implemented coder functions. 2003-09-01 17:03:33 +00:00
Sergey Poznyakoff
33b63ebe94 (OLDGNU_COMPATIBILITY): Removed
(struct extra_header): Removed unused structure.
(union block.extra_header): Removed unused member.
2003-09-01 17:03:07 +00:00
Sergey Poznyakoff
879ae47aa1 New option --format 2003-09-01 17:02:45 +00:00
Sergey Poznyakoff
53eec8f039 (print_header): Take user/group from current_stat_info. 2003-09-01 17:02:11 +00:00
Sergey Poznyakoff
83c68b4e40 (gid_to_gname,gname_to_gid,uid_to_uname,uname_to_uid): Changed prototypes 2003-09-01 17:01:35 +00:00
Sergey Poznyakoff
cb3ec64970 (string_to_chars): New function.
(write_extended): New function
(start_header): Create extended POSIX headers if necessary.
(finish_header): Likewise.
2003-09-01 17:00:26 +00:00
Sergey Poznyakoff
72e5a9beb6 (MAXOCTAL11,MAXOCTAL7): New defines
(string_to_chars): New functions
(struct xheader): Changed structure
(gid_to_gname,gname_to_gid,uid_to_uname,uname_to_uid): Changed
prototypes.
2003-09-01 16:59:56 +00:00
Sergey Poznyakoff
7657bd4323 Updated 2003-08-31 23:03:40 +00:00
Sergey Poznyakoff
518748f939 Use current_stat_info 2003-08-31 22:55:21 +00:00
Sergey Poznyakoff
db783659b0 (destroy_stat): New function. 2003-08-31 22:45:58 +00:00
Sergey Poznyakoff
d858a433c8 Use current_stat_info 2003-08-31 22:41:32 +00:00
Sergey Poznyakoff
096bc2bffd (decode_header): Added initial support for POSIX extended
and STAR headers.
(skip_member): Check oldgnu_header only if current_format is set
to OLDGNU_FORMAT.
2003-08-31 22:40:34 +00:00
Sergey Poznyakoff
6f12dbc264 (orig_file_name,current_file_name)
(current_trailing_slash,current_link_name): Removed variables.
(current_stat_info): New variable
(current_stat): Removed
(extended_header): New variable
(decode_header): Changed prototype.
2003-08-31 22:39:43 +00:00
Sergey Poznyakoff
450636adfa (decode_header): Added initial support for POSIX extended
and STAR headers.
(skip_member): Check oldgnu_header only if current_format is set
to OLDGNU_FORMAT
2003-08-31 22:38:55 +00:00
Sergey Poznyakoff
4e59b9d7e3 Added xheader.c 2003-08-31 22:36:09 +00:00
Sergey Poznyakoff
5be0f2ba49 New file 2003-08-31 22:35:35 +00:00
Paul Eggert
81a9e2ae36 Drop en_GB locale; it was more trouble than it was worth (e.g., different
users in en_GB disagree about -ize versus -ise).
2003-08-30 05:37:55 +00:00
Sergey Poznyakoff
a18256492a Updated 2003-07-28 12:02:16 +00:00
Sergey Poznyakoff
cab627b49d Updated 2003-07-28 11:57:26 +00:00
Sergey Poznyakoff
317fbb9d5f Removed references to the obsolete command line options. 2003-07-28 11:41:17 +00:00
Sergey Poznyakoff
a687cf05b7 Removed support for the obsolete command line options. 2003-07-28 11:40:35 +00:00
Sergey Poznyakoff
df2f967cdd Updated 2003-07-27 12:14:22 +00:00
Sergey Poznyakoff
d52a1bb366 New option --check-links.
Changed semantics of -o to comply to UNIX98 when extracting and
to its previous semantics otherwise.
(main): Call check_links if --check-links. was given.
2003-07-27 12:01:59 +00:00
Sergey Poznyakoff
2adfef0149 (print_header): Use orig_file_name. 2003-07-27 12:01:04 +00:00
Sergey Poznyakoff
bee35fc152 /tmp/F 2003-07-27 12:00:31 +00:00
Sergey Poznyakoff
1fef6258aa (check_links_option): New variable
(orig_file_name): New variable
(check_links): New proto.
2003-07-27 11:59:58 +00:00
Sergey Poznyakoff
b68057816b Updated 2003-07-27 11:59:30 +00:00
Sergey Poznyakoff
6dd7e857e5 Updated 2003-07-25 15:08:45 +00:00
Sergey Poznyakoff
eb42c0070d (tar.dvi): Fixed TEXINPUTS value. 2003-07-25 15:08:17 +00:00
Sergey Poznyakoff
d4bcefe915 Started the entry for 1.13.26 2003-07-25 15:06:32 +00:00
Sergey Poznyakoff
7219c538eb (print_header): Revised 2003-07-25 15:05:41 +00:00
Sergey Poznyakoff
5a73638d27 Updated 2003-07-24 14:55:12 +00:00
Sergey Poznyakoff
83a5c01349 Added missing files. 2003-07-24 14:53:09 +00:00
Sergey Poznyakoff
b84cc97df7 Minor changes. 2003-07-24 14:48:44 +00:00
Sergey Poznyakoff
4f48e61fcf (print_header): Print trailing slash if
current_trailing_slash was set (extrac03.sh,extrac04.sh tests).
2003-07-24 14:48:08 +00:00
Sergey Poznyakoff
eb66edaa9f (flush_read): Fixed behavior on short
reads right after opening the new archive (multiv01.sh test).
(new_volume): Special handling for "-".
2003-07-24 14:45:29 +00:00
Sergey Poznyakoff
31d9c7e2a4 (chdir_do): Fixed call to restore_cwd 2003-07-24 14:44:51 +00:00
Sergey Poznyakoff
cd206cd899 Added exitfail.[hc] 2003-07-24 14:44:24 +00:00
Sergey Poznyakoff
4dc30d7397 Added to the repository 2003-07-24 14:43:30 +00:00
Paul Eggert
96148b87b7 ChangeLog entries from 1.13.25 through today. 2003-07-05 21:17:47 +00:00
Paul Eggert
09c4d7dc3c Mention --index-file, --no-overwrite-dir, new translations. 2003-07-05 21:12:43 +00:00
Paul Eggert
46f2740ff9 Add more suggestions. 2003-07-05 21:06:10 +00:00
Paul Eggert
88ffc1355e Initial revision 2003-07-05 20:14:48 +00:00
Paul Eggert
4a16f6c039 Initial revision 2003-07-05 20:13:29 +00:00
Paul Eggert
33cdac5e60 Initial revision 2003-07-05 20:10:59 +00:00
Paul Eggert
bce576a03b Remove tests/genfile.c; it doesn't need to
be translated, since it's not a user-visible tool.
2003-07-05 20:10:23 +00:00
Paul Eggert
f7ccf5eb1c Initial revision 2003-07-05 20:04:48 +00:00
Paul Eggert
8912f582ac Convert to UTF-8.
Don't include <print-copyr.h>.
(DEFAULT_PATTERN): Renamed from DEFAULT.
(ZEROS_PATTERN): Renamed from ZEROS.
(main): Use gettext to translate (C), not print_copyright.
2003-07-05 08:24:55 +00:00
Paul Eggert
4c690508bd Add comment about what other letters are used. 2003-07-05 08:19:48 +00:00
Paul Eggert
42d05fcb6e Do not include <print-copyr.h>.
Include <getdate.h>.
(get_date): Remove decl.
(ATIME_PRESERVE_OPTION, CHECKPOINT_OPTION, FORCE_LOCAL_OPTION,
IGNORE_FAILED_READ_OPTION, INDEX_FILE_OPTION, NO_OVERWRITE_DIR_OPTION,
NUMERIC_OWNER_OPTION, RECURSIVE_UNLINK_OPTION, REMOVE_FILES_OPTION,
SHOW_OMITTED_DIRS_OPTION, TOTALS_OPTION): New constants.
(long_options, decode_options): Use them.
(OVERWRITE_DIR_OPTION): Remove.
(long_options): New options --index-file, --no-overwrite-dir.
Remove --overwrite-dir option.
(usage): Use PACKAGE_BUGREPORT.
(decode_options): Terminate new argv properly.
Use PACKAGE_NAME, PACKAGE_VERSION.
If verbose, report how we grokked any textual date option.
(main): Add support for index-file.
2003-07-05 08:18:46 +00:00
Paul Eggert
40835c2c55 Use newer form for bug report and version. 2003-07-05 07:55:34 +00:00
Paul Eggert
1722082cfe Remove PARAMS. 2003-07-05 07:21:49 +00:00
Paul Eggert
45dd602433 Don't include print-copyr.h.
(prepare_input_buffer): Renamed from prepare_record_buffer.
New arg FD.  All uses changed.
Do not read more than INT_MAX bytes at once,
since it breaks on some brain damaged Tru64 hosts.
Do not mix int and size_t pointers.  Divide size by two
when retrying instead of subtracting 1024; for speed.
(main): Use gettext to translate (C), not print_copyright.
2003-07-05 07:21:19 +00:00
Paul Eggert
935cd4f515 (namelist_match): Allow partial matches only if recursive.
(hash_string_hasher): Renamed from hash_avoided_name.
(hash_string_compare): Renamed from compare_avoided_anames.
(hash_string_insert, hash_string_lookup): New functions.
(add_avoided_name, is_avoided_name): Use them.
(safer_name_suffix): New function.
(contains_dot_dot): Moved here from misc.c.  Now returns bool, not int.
2003-07-05 07:17:20 +00:00
Paul Eggert
f29b54b237 (read_and): Give full type for procedure arg.
(read_header): Strip trailing slashes, setting current_trailing_slash.
(tartime): Avoid int overflow when printing year (!).
(print_header): New arg specifing block ordinal.  All uses changed.
Print link as 'h' type.  Give labels for long links and names.
2003-07-05 07:00:54 +00:00
Paul Eggert
675c5a2f24 (we_are_root): Now bool, not int.
(check_time): Warn about implausibly old time stamps.
(set_stat): Use utimbuf, not stat_info.
(preprare_to_extract): New arg DIRECTORY.
(fill_in_sparse_array): Moved here from compare.c.
(extract_sparse_file): Now returns off_t, giving size left.
Truncate file at end.
(extract_archive): Use safer_name_suffix rather than rolling our own.
Use fill_in_sparse_array rather than rolling our own.
Strip trailing slashes more effectively.
Check for unsafe names.
2003-07-05 06:53:31 +00:00
Paul Eggert
ea202e1adf (relativize): Remove; replaced by safer_name_suffix.
All callers changed.
(start_header): Clear devmajor and devminor fields, too.
(finish_header): New arg block_ordinal.
(init_sparsearray): Now extern.  Set sp_array_size to
SPARSES_IN_OLDGNU_HEADER if it is zero.
(dump_file): Keep link table as a hash.
Do not count "file changed as we read it" as a failure.
2003-07-05 06:43:30 +00:00
Paul Eggert
664f2dbdd9 (print_total_written): Adjust to new human.h interface.
(child_open_for_compress): Do not increase size to BLOCKSIZE.
(open_archive): Open index file name.
Strip trailng slahes from file names.
(flush_write): Set size to 0 if not saving names.
(flush_write, flush_read): Use safer_name_suffix rather than
inline code.
2003-07-05 06:19:54 +00:00
Paul Eggert
15726fabad (AUTOMAKE_OPTIONS): Remove. 2003-07-05 01:04:08 +00:00
Paul Eggert
f2ad7d403e (EXTRA_DIST): Add alloca.m4, backupfile.m4, bison.m4, chown.m4,
dirname.m4, dos.m4, exclude.m4, fileblocks.m4, ftruncate.m4,
getdate.m4, getopt.m4, hash.m4, human.m4, intdiv0.m4, intmax_t.m4,
inttypes_h.m4, inttypes-pri.m4, isc-posix.m4, lcown.m4, lib-ld.m4,
lib-link.m4, lib-prefix.m4, memset.m4, mktime.m4, modechange.m4,
nls.m4, onceonly.m4, pathmax.m4, po.m4, quotearg.m4, quote.m4,
rmdir.m4, safe-read.m4, safe-write.m4, save-cwd.m4, savedir.m4,
ssize_t.m4, stdbool.m4, stdint_h.m4, strcase.m4, strtoimax.m4,
strtoll.m4, strtol.m4, strtoull.m4, strtoul.m4, strtoumax.m4,
tm_gmtoff.m4, uintmax_t.m4, unlocked-io.m4, xalloc.m4, xgetcwd.m4,
xstrtol.m4.  Remove c-bs-a.m4, ccstdc.m4, check-decl.m4, decl.m4,
jm-mktime.m4, prereq.m4, xstrtoimax.m4.
2003-07-05 00:59:16 +00:00
Paul Eggert
01d81c7f0f Switch to new method for doing copyright notices.
Use @acronym instead of @sc where appropriate.
Remove empty examples.  Give a few more examples.
2003-07-05 00:46:14 +00:00
Paul Eggert
e4a052cd21 Convert to UTF-8. 2003-07-04 23:35:57 +00:00
Paul Eggert
89662fe926 Convert to UTF-8. 2003-07-04 23:32:57 +00:00
Paul Eggert
d5100e76cf Convert to UTF-8. 2003-07-04 23:28:11 +00:00
Paul Eggert
622724a886 Convert to UTF-8. 2003-07-04 23:25:38 +00:00
Paul Eggert
b9be191da0 Suggest Autoconf 2.57, Automake 1.7.5, Bison 1.875, gettext 0.12.1. 2003-07-04 23:15:25 +00:00
Paul Eggert
121b4241d7 Suggest Autoconf 2.57, Automake 1.7.5, Bison 1.875. 2003-07-04 23:08:20 +00:00
Paul Eggert
39f69360f0 Add copyright notice. 2003-07-04 18:06:51 +00:00
Paul Eggert
f3364ac428 Initial revision 2003-06-28 21:17:38 +00:00
Paul Eggert
e547e855e9 import from gnulib 2003-06-04 23:35:46 +00:00
Paul Eggert
bdece51882 import from gnulib 2003-04-05 06:53:09 +00:00
Paul Eggert
fcb62b60d9 import from gnulib 2003-03-10 07:31:50 +00:00
Paul Eggert
dc861c7ab9 import from gnulib 2003-01-10 21:06:49 +00:00
Paul Eggert
7154feb583 import from gnulib 2003-01-08 18:42:38 +00:00
Paul Eggert
4f5e37c861 import from gnulib 2002-12-06 08:08:13 +00:00
Paul Eggert
504274b059 import from gnulib 2002-12-05 20:46:03 +00:00
Paul Eggert
4ff9279d9d import from gnulib 2002-11-22 16:25:53 +00:00
kaun
b94aa0bc5f (print_copyright)
- fix typo (use print_unicode_char, not print_unicode_success)
2002-08-02 00:04:07 +00:00
Paul Eggert
784a497c40 (strtoll): Depend on HAVE_LONG_LONG, not HAVE_UNSIGNED_LONG_LONG. 2002-07-09 17:40:33 +00:00
Paul Eggert
f2daf2e598 import from gnulib 2002-06-26 06:17:35 +00:00
Paul Eggert
859ba730d5 coreutils 5.0 version 2002-05-27 20:05:03 +00:00
Paul Eggert
d1c27c2308 Sync with fileutils 2002-02-11 14:28:35 +00:00
Paul Eggert
9ded0a0567 Sync with fileutils 2002-02-11 14:28:09 +00:00
Paul Eggert
4bfdfaa270 allow using unicode 2002-01-26 06:04:19 +00:00
Paul Eggert
ba32aa1147 From textutils 2.1 2002-01-22 07:43:55 +00:00
Paul Eggert
bb5b309581 Sync with fileutils. 2002-01-16 22:43:41 +00:00
Paul Eggert
f762709bb0 Sync with fileutils. 2001-12-19 15:05:33 +00:00
Paul Eggert
88711e3972 (jm_AC_PREREQ_XSTRTOUMAX): Check for strtol and strtoimax,
as those declarations are made even in the unsigned case.
2001-09-28 17:53:12 +00:00
Paul Eggert
06384f1def (jm_AC_PREREQ_XSTRTOIMAX): Check for strtoul and strtoumax,
as those declarations are made even in the signed case.
2001-09-28 17:53:12 +00:00
Paul Eggert
bab605d5bd (strtol): Do not declare if HAVE_DECL_STRTOL.
(strtoul): Do not declare if HAVE_DECL_STRTOUL.
(strtoimax, strtoumax): Do not declare if already defined as a macro.
2001-09-28 06:54:20 +00:00
Paul Eggert
9c93a32114 Initial revision 2001-09-26 20:54:08 +00:00
Paul Eggert
7f1bf2e09f just ignore them silently. 2001-09-26 20:53:42 +00:00
Paul Eggert
3847d0f51f 1.13.25 2001-09-26 20:31:11 +00:00
Paul Eggert
dd83d5dd9d (read_header): Don't keep around extended name and link info
indefinitely; keep it only for the next file.  This fixes a bug
introduced in 1.13.24, and remove the need for some static variables.
Set recent_long_name and recent_long_link to zero if there were no
long links; this avoids a violation of ANSI C rules for pointers in
delete.c.
2001-09-26 20:15:52 +00:00
Paul Eggert
1735867f56 new automake patch 2001-09-26 20:07:51 +00:00
Paul Eggert
fb1c65e512 know -> known
From: Jim Meyering <jim@meyering.net>
Date: Wed, 26 Sep 2001 19:20:10 +0200
2001-09-26 18:46:35 +00:00
Paul Eggert
1a9ace4d99 Include iconv.h before testing for EILSEQ. 2001-09-25 22:52:27 +00:00
Paul Eggert
1ad624bbbc (EILSEQ): Include <time.h> and <wchar.h> if <errno.h> does not define
EILSEQ, because BSD/OS 4.1 defines EILSEQ in <wchar.h>, which requires
<time.h>.  Define a replacement EILSEQ to be ENOENT, not EINVAL, since
callers may want to distinguish EINVAL and EILSEQ.
2001-09-25 18:17:36 +00:00
Paul Eggert
02a275c6ac (maybe_recoverable): Treat OVERWRITE_OLD_DIRS like DEFAULT_OLD_FILES. 2001-09-24 18:58:52 +00:00
Paul Eggert
61170ee840 Don't assume we're using the included libintl. 2001-09-23 06:40:35 +00:00
Paul Eggert
f42a0e5af3 Version 1.13.24. 2001-09-23 06:23:14 +00:00
Paul Eggert
e6e72bf7ed Allocate one more byte than the size would indicate, since we're
null-terminating.
2001-09-23 06:18:20 +00:00
Paul Eggert
1b10ab140f (<libintl.h>): Do not include; no longer needed.
(_): Remove; no longer needed.
2001-09-23 05:37:04 +00:00
Paul Eggert
9a15fcf491 (write_archive_buffer, close_archive): If an archive is a socket,
treat it like a FIFO.
2001-09-23 05:03:42 +00:00
Paul Eggert
e2b5f1e918 Put copyright notice into documentation. 2001-09-22 00:47:09 +00:00
Paul Eggert
4dbeac6c7f Initial revision 2001-09-22 00:47:09 +00:00
Paul Eggert
63db9071d2 Include print-copyr.h, not copysym.h.
(main): Use print_copyright, not copyright_symbol.
2001-09-22 00:47:09 +00:00
Paul Eggert
5a5f4d06e7 Include print-copyr.h, not copysym.h.
(decode_options): Use print_copyright, not copyright_symbol.
(OVERWRITE_DIR_OPTION): New constant.
(long_options, usage, decode_options): Add --overwrite-dir.
2001-09-22 00:47:09 +00:00
Paul Eggert
ec63030958 (update_archive): Pass 0 to read_header. 2001-09-22 00:47:09 +00:00
Paul Eggert
0e041a7bfe (records_read, records_written): New vars.
(write_archive_to_stdout): Now bool, not int.
(open_archive, flush_write, flush_read): Keep records_read and
records_written up to date.
2001-09-22 00:47:09 +00:00
Paul Eggert
85f651c8c6 (recent_long_name, recent_long_link, recent_long_name_blocks,
recent_long_link_blocks): New vars.
(read_and): Pass 0 to read_header.
(read_header): New arg RAW_EXTENDED_HEADERS.  Store away extended headers
into new vars.  Null-terminate incoming symbolic links.
2001-09-22 00:47:09 +00:00
Paul Eggert
6c9e824ce5 (extract_archive): When marking a directory to be updated after
symlinks, stat all directories after it in the delayed-set-stat
list too, since they will be checked after symlinks.
Add support for --overwrite-dir.
2001-09-22 00:47:09 +00:00
Paul Eggert
95a4feb37b (EXTRA_DIST): Remove isc-posix.m4. 2001-09-22 00:47:09 +00:00
Paul Eggert
06e4c77310 (unicode_to_mb): Return int, not void. New arg for failure callback.
(print_unicode_success, print_unicode_failure): New decls.
(print_unicode_char): Return int, not void.
2001-09-21 22:26:45 +00:00
Paul Eggert
a942967415 (EILSEQ, ENOTSUP): New macros, if not defined by errno.h.
(<error.h>): Do not include.
(unicode_to_mb): Return int, not void.  New arg for failure callback.
Invoke the failure callback instead of invoking 'error'.
(print_unicode_success): Renamed from fprintf_callback.  Now extern.
Return -1 on failure, 0 on success.
(print_unicode_failure): New function.
(print_unicode_char): Return int.  Adjust to changes to unicode_to_mb.
Do not report error: instead, print an approximation.
2001-09-21 22:26:45 +00:00
Paul Eggert
92734c1511 Rewrite from scratch, as print-copyr.h. 2001-09-21 22:19:09 +00:00
Paul Eggert
4b5d60ef38 Rewrite from scratch, as print-copyr.c. 2001-09-21 22:19:09 +00:00
Paul Eggert
7a1b6cfa67 (extracting files): Mention --to-stdout.
(Option Summary, Dealing with Old Files): New option --overwrite-dir.
(Overwrite Old Files): Likewise.
2001-09-21 22:19:09 +00:00
Paul Eggert
cc818a584f Add copyright notice. 2001-09-21 21:25:50 +00:00
Paul Eggert
45bf6a9089 Add copyright notice, autoconf 2.52 patch. 2001-09-21 21:22:15 +00:00
202 changed files with 43525 additions and 16083 deletions

18
.cvsignore Normal file
View File

@@ -0,0 +1,18 @@
*.bz2
*.gz
*.tar
.bootstrap
ABOUT-NLS
INSTALL
Makefile
Makefile.in
aclocal.m4
autom4te.cache
build-aux
config.*
configure
gnulib
m4
rmt
stamp-h1
tar-[0-9]*

35
AUTHORS
View File

@@ -1,28 +1,15 @@
Authors of GNU tar.
The following contributions warranted legal paper exchanges with the
Free Software Foundation. Also see files ChangeLog and THANKS.
Public domain tar was written by John Gilmore, with contributions from
Henry Spencer, Fred Fish, Ian Darwin, Geoff Collyer, Stan Barber, Guy
Harris, Dave Brower, Richard Todd, Michael Rendell, Stu Heiss, and
Rich Salz.
TAR Jay Fenlason
Assigns his changes.
The FSF version, named GNU tar, was derived from public domain tar by
Jay Fenlason and Joy Kendall. Amy Gorin and Melissa Weisshaus
contributed to the manual. GNU tar has been maintained in turn by
Thomas Bushnell BSG, François Pinard, Paul Eggert, and Sergey
Poznyakoff.
TAR Richard E Salz 1993-03-11
Disclaims changes to getdate.y.
TAR MANUAL (?) Amy Gorin (US 1963) 1995-01-10
Assigns the Tar Manual.
TAR Francois Pinard Canada 1949 1996-02-01
Assigns past and future changes.
TAR Melissa Weisshaus US 1966 1997-04-09
Assigns changes to the manual and future changes.
melissa@gnu.ai.mit.edu
TAR Thomas Michael Innis Bushnell US 1967 1997-04-09
Assigns changes.
thomas@gnu.ai.mit.edu
TAR Thomas Michael Innis Bushnell US 1967 1997-04-09
Assigns changes to manual.
thomas@gnu.ai.mit.edu
Many others have contributed to GNU tar; please see the files THANKS
and ChangeLog.

676
COPYING Normal file
View File

@@ -0,0 +1,676 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

8599
ChangeLog Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,60 +1,31 @@
# Main Makefile for GNU tar.
# Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
# Copyright (C) 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2003, 2007 Free
# Software Foundation, Inc.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 3, or (at your option)
## any later version.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
AUTOMAKE_OPTIONS = gnits dist-shar
## You should have received a copy of the GNU General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
## 02110-1301, USA.
BABYL = rmail/* admin/*/RMAIL
EXTRA_DIST = AC-PATCHES AM-PATCHES BI-PATCHES PORTS rebox.el
SUBDIRS = doc lib intl src scripts po tests
ACLOCAL_AMFLAGS = -I m4
EXTRA_DIST = ChangeLog.1 PORTS
SUBDIRS = doc lib rmt src scripts po tests
all-local: $(CONFIG_HEADER)
dist-hook:
-rm -f $(distdir).cpio
find $(distdir) | cpio -Hcrc -o | \
GZIP=$(GZIP_ENV) gzip -c > $(distdir).cpio.gz
id: ID
ID:
cd lib && $(MAKE) $@
cd src && $(MAKE) $@
dist-zoo: $(DISTFILES)
rm -rf $(distdir)
mkdir $(distdir)
distdir=`cd $(distdir) && pwd` \
&& cd $(srcdir) \
&& automake --include-deps --output-dir=$$distdir
@for file in $(DISTFILES); do \
test -f $(distdir)/$$file \
|| cp -p $(srcdir)/$$file $(distdir)/$$file; \
done
for subdir in $(SUBDIRS); do \
test -d $(distdir)/$$subdir \
|| mkdir $(distdir)/$$subdir \
|| exit 1; \
chmod 777 $(distdir)/$$subdir; \
(cd $$subdir && $(MAKE) dist) || exit 1; \
done
@sublist="$(DIST_SUBDIRS)"; \
for dir in $$sublist; do \
echo copying directory $$dir; \
tar -chf - $$dir | (cd $(distdir) && tar -xBpf -); \
done
chmod -R a+r $(distdir)
find $(distdir) -type f | xargs dosfn
# find $(distdir) -type f | xargs recode :ibmpc
mv $(distdir) $(PACKAGE)
find $(PACKAGE) -type f | zoo ahIq $(PACKAGE).zoo
rm -rf $(PACKAGE)
distclean-local:
-rm -f $(distdir).cpio.gz

580
NEWS
View File

@@ -1,17 +1,526 @@
GNU tar NEWS - User visible changes.
GNU tar NEWS - User visible changes. 2008-03-27
Please send GNU tar bug reports to <bug-tar@gnu.org>
version 1.19.90 (CVS)
* New option --auto-compress (-a)
With --create, selects compression algorithm basing on the suffix
of the archive file name.
* New option --lzma
Selects LZMA compression algorithm
* New option --hard-dereference
During archive creation, dereferences hard links and stores the files
they refer to, instead of creating usual hard link members (type '1').
* New option --checkpoint-action
This action allows to specify an action to be executed upon hitting a
checkpoint. Recognized actions are: dot, echo (the default),
echo=string, ttyout=string, exec=cmdline, and sleep=value. Any number
of `--checkpoint-action' options can be specified, the actions will be
executed in order of their appearance in the command line. See
chapter 3.8 "Checkpoints" for a complete description.
* New options --no-check-device, --check-device.
The `--no-check-device' option disables comparing device numbers during
preparatory stage of an incremental dump. This allows to avoid
creating full dumps if the device numbers change (e.g. when using an
LVM snapshot).
The `--check-device' option enables comparing device numbers. This is
the default. This option is provided to undo the effect of the previous
`--no-check-device' option, e.g. if it was set in TAR_OPTIONS
environment variable.
* The --transform option.
Any number of `--transform' options can be given in the command line.
The specified transformations will be applied in turn.
The argument to `--transform' option can be a list of replace
expressions, separated by a semicolon (as in `sed').
Filename transformations are applied to symbolic link targets
during both creation and extraction. Tar 1.19 used them only
during extraction.
For a detailed description, see chapter 6.7 "Modifying File and Member
Names".
* Info (end-of-volume) scripts
The value of the blocking factor is made available to info and
checkpoint scripts via environment variable TAR_BLOCKING_FACTOR.
* Bugfixes.
** Fix bug introduced in version 1.19: tar refused to update non-existing
archives.
version 1.19 - Sergey Poznyakoff, 2007-10-10
* New option --exclude-vcs
Excludes directories and files, created by several widely used version
control systems, e.g. "CVS/", ".svn/", etc.
* --exclude-tag and --exclude-cache options
The following options now work with incremental archives as well:
--exclude-caches
--exclude-caches-all
--exclude-tag
--exclude-tag-all
--exclude-tag-under
* Fix handling of renamed files in listed incremental archives.
Previous versions always stored absolute file names in rename
records, even if -P was not used. This is fixed: rename records
contain file names processed in accordance with the command line
settings.
* Fix --version output.
* Recognition of broken archives.
When supplied an archive smaller than 512 bytes in reading mode (-x,
-t), the previous version of tar silently ignored it, exiting with
code 0. It is fixed. Tar now issues the following diagnostic message:
'This does not look like a tar archive', and exits with code 2.
* Fix double-dot recognition in archive member names in case of duplicate '/.'.
* Fix file padding in case of truncation of the input file to zero size.
version 1.18 - Sergey Poznyakoff, 2007-06-29
* Licensed under the GPLv3
* Fixed several bugs in the testsuite
version 1.17 - Sergey Poznyakoff, 2007-06-08
* Fix archivation of sparse files in posix mode. Previous versions padded
sparse members with spurious zero blocks.
* Fix operation of --verify --listed-incremental. Version 1.16.1 produced
a full dump when both options were given.
* Fix --occurrence. In previous versions it continued scanning the archive
even though all requested members has already been extracted.
* Scope of --transform and --strip-components options.
In addition to affecting regular archive members, the --transform
option affects hard and soft link targets and the --strip-components
option affects hard link targets as well.
* End-of-volume script can send the new volume name to tar by writing
it to the file descriptor stored in the environment variable `TAR_FD'.
version 1.16.1 - Sergey Poznyakoff, 2006-12-09
* New option --exclude-tag allows to specify "exclusion tag files", i.e.
files whose presence in a directory means that the directory should not
be archived.
* The --exclude-cache option excludes directories that contain the
CACHEDIR.TAG file from being archived. Previous versions excluded
directory contents only, while the directories themselves were
still added to the archive.
* Support for reading ustar type 'N' header logical records has been removed.
This GNU extension was generated only by very old versions of GNU 'tar'.
Unfortunately its implementation had security holes; see
<http://archives.neohapsis.com/archives/fulldisclosure/2006-11/0344.html>.
We don't expect that any tar archives in practical use have type 'N'
records, but if you have one and you trust its contents, you can
decode it with GNU tar 1.16 or earlier.
* Race conditions have been fixed that in some cases briefly allowed
files extracted by 'tar -x --same-owner' (or plain 'tar -x', when
running as root) to be accessed by users that they shouldn't have been.
version 1.16 - Sergey Poznyakoff, 2006-10-21
* After creating an archive, tar exits with code 1 if some files were
changed while being read. Previous versions exited with code 2 (fatal
error), and only if some files were truncated while being archived.
* New option --mtime allows to set modification times for all archive
members during creation.
* Bug fixes
** Avoid running off file descriptors when using multiple -C options.
** tar --index-file=FILE --file=- sent the archive to FILE, and
the listing to stderr.
version 1.15.91 - Sergey Poznyakoff, 2006-06-16
* Incompatible changes
** Globbing
Previous versions of GNU tar assumed shell-style globbing when
extracting from or listing an archive. For example:
tar xf foo.tar '*.c'
would extract all files whose names end in '.c'. This behavior
was not documented and was incompatible with traditional tar
implementations. Therefore, starting from this version, GNU tar
no longer uses globbing by default. For example, the above invocation
is now interpreted as a request to extract from the archive the file
named '*.c'.
To treat member names as globbing patterns, use --wildcards option.
If you wish tar to mimic the behavior of versions up to 1.15.90,
add --wildcards to the value of the environment variable TAR_OPTIONS.
The exact way in which tar interprets member names is controlled by the
following command line options:
--wildcards use wildcards
--anchored patterns match file name start
--ignore-case ignore case
--wildcards-match-slash wildcards match `/'
Each of these options has a '--no-' counterpart that disables its
effect (e.g. --no-wildcards).
These options affect both the interpretation of member names from
command line and that of the exclusion patterns (given with --exclude
and --exclude-from options). The defaults are:
1. For member names: --no-wildcards --anchored
2. For exclusion patterns: --wildcards --no-anchored --wildcards-match-slash
The options can appear multiple times in the command line, thereby
changing the way command line arguments are interpreted. For example,
to use case-insensitive matching in exclude patterns and to revert to
case-sensitive matching for the rest of command line, one could write:
tar xf foo.tar --ignore-case --exclude-from=FILE --no-ignore-case file.name
** Short option -l is now an alias of --check-links option, which complies
with UNIX98. This ends the transition period started with version 1.14.
* New features
** New option --transform allows to transform file names before storing them
in the archive or member names before extracting. The option takes a
sed replace expression as its argument. For example,
tar cf foo.tar --transform 's,^,prefix/,'
will add 'prefix/' to all file names stored in foo.tar.
** --strip-components option works when deleting and comparing. In previous
versions it worked only with --extract.
** New option --show-transformed-names enables display of transformed file
or archive. It generalizes --show-stored-names option, introduced in
1.15.90. In particular, when creating an archive in verbose mode, it lists
member names as stored in the archive, i.e., with any eventual prefixes
removed and file name transformations applied. The option is useful,
for example, while comparing `tar cv' and `tar tv' outputs.
** New incremental snapshot file format keeps information about file names
as well as that about directories.
** The --checkpoint option takes an optional argument specifying the number
of records between the two successive checkpoints. Optional dot
starting the argument intructs tar to print dots instead of textual
checkpoints.
** The --totals option can be used with any tar operation (previous versions
understood it only with --create). If an argument to this option is
given, it specifies the signal upon delivery of which the statistics
is to be printed. Both forms of this option (with and without
argument) can be given to in a single invocation of tar.
* Bug fixes
** Detect attempts to update compressed archives.
version 1.15.90 - Sergey Poznyakoff, 2006-02-19
* New features
** Any number of -T (--files-from) options may be used in the command line.
The file specified with -T may include any valid `tar' options,
including another -T option.
Compatibility note: older versions of tar would only recognize -C
as an option name within the file list file. Now any file whose name
starts with - is handled as an option. To insert file names starting with
dash, use the --add-file option.
** List files containing null-separated file names are detected and processed
automatically. It is no longer necessary to give the --null option.
** New option --no-unquote disables the unquoting of input file names.
This is useful for processing output from `find dir -print0'.
An orthogonal option --unquote is provided as well.
** New option --test-label tests the archive volume label.
If an argument is specified, the label is compared against its value.
Tar exits with code 0 if the two strings match, and with code 2 if
they do not.
If no argument is given, the --verbose option is implied. In this case,
tar prints the label name if present and exits with code 0.
** New option --show-stored-names. When creating an archive in verbose mode,
it lists member names as stored in the archive, i.e., with any eventual
prefixes removed. The option is useful, for example, while comparing
`tar cv' and `tar tv' outputs.
** New option --to-command pipes the contents of archive members to the
specified command.
** New option --atime-preserve=system, which uses the O_NOATIME feature
of recent Linux kernels to avoid some problems when preserving file
access times.
** New option --delay-directory-restore delays restoring modification times
and permissions of extracted directories until the end of extraction.
This is necessary for restoring from archives with unusual member
ordering (in particular, those created with --no-recursion option).
This option is implied when restoring from incremental archives.
** New option --restrict prohibits use of some potentially harmful tar
options. Currently it disables '!' escape in multi-volume name menu.
** New options --quoting-style and --quote-chars control the way tar
quotes member names on output. The --quoting-style takes an argument
specifying the quoting style to use (literal, shell, shell-always,
c, escape, locale, clocale). The argument to --quote-chars is a string
specifying characters to quote, even if the selected quoting style
would not quote them otherwise. The option --no-quote-chars is
provided to disable quoting certain characters.
** The end-of-volume script (introduced with --info-script option) can
get current archive name from the environment variable TAR_ARCHIVE and
the volume number from the variable TAR_VOLUME. It can alter the
archive name by writing new name to the file descriptor 3.
** Better support for full-resolution time stamps. Tar cannot restore
time stamps to full nanosecond resolution, though, until the kernel
guys get their act together and give us a system call to set file time
stamps to nanosecond resolution.
** The -v option now prints time stamps only to 1-minute resolution,
not full resolution, to avoid using up too many output columns.
Nanosecond resolution is now supported, but that would be too much.
* Bug fixes
** Allow non-option arguments to be interspersed with options.
** When extracting or listing archives in old GNU format, tar
used to read an extra block of data after a long name header
if length of the member name was divisible by block size (512).
Consequently, the file pointer was set off and the next member
was not processed correctly.
** Previous version created invalid archives when files shrink
during reading.
** Compare mode (tar d) hung when trying to compare file contents.
** Previous versions in certain cases failed to restore directory
modification times.
** When creating an archive, do not attempt to store files whose
meta-data cannot be stored in the header due to format limitations
(for ustar and v7 formats).
** The --version option now also outputs information about copyright,
license, and credits. This reverts to the behavior of tar 1.14 and
earlier, and conforms to the GNU coding standards. The --license (-L)
option introduced in tar 1.15 has been removed, since it's no longer
needed.
version 1.15.1 - Sergey Poznyakoff, 2004-12-21
This version fixes a bug introduced in 1.15 which caused
tar to refuse to extract files from standard input.
version 1.15 - Sergey Poznyakoff, 2004-12-20
* Compressed archives are recognised automatically, it is no longer
necessary to specify -Z, -z, or -j options to read them. Thus, you can
now run `tar tf archive.tar.gz'.
* When restoring incremental dumps, --one-file-system option
prevents directory hierarchies residing on different devices
from being purged.
With the previous versions of tar it was dangerous to create
incremental dumps with --one-file-system option, since they
would recursively remove mount points when restoring from the
back up. This change fixes the bug.
* Renamed --strip-path to --strip-components for consistency with
the GNU convention.
* Skipping archive members is sped up if the archive media supports
seeks.
* Restore script starts restoring only if it is given --all (-a) option,
or some patterns. This is to prevent accidental restores.
* `tar --verify' prints a warning if during archive creation some of
the file names had their prefixes stripped off.
* New option --exclude-caches instructs tar to exclude cache directories
automatically on archive creation. Cache directories are those
containing a standardized tag file, as specified at:
http://www.brynosaurus.com/cachedir/spec.html
* New configure option --with-rmt allows to specify full path name to
the `rmt' utility. This supersedes DEFAULT_RMT_COMMAND variable
introduced in version 1.14
* New configure variable DEFAULT_RMT_DIR allows to specify the directory
where to install `rmt' utility. This is necessary since modifying
--libexecdir as was suggested for version 1.14 produced a side effect: it
also modified installation prefix for backup scripts (if
--enable-backup-scripts was given).
* Bug fixes:
** Fixed flow in recognizing files to be included in incremental dumps.
** Correctly recognize sparse archive members when used with -T option.
** GNU multivolume headers cannot store filenames longer than 100 characters.
Do not allow multivolume archives to begin with such filenames.
** If a member with link count > 2 was stored in the archive twice,
previous versions of tar were not able to extract it, since they
were trying to link the file to itself, which always failed and
lead to removing the already extracted copy. Preserve the first
extracted copy in such cases.
** Restore script was passing improper argument to tar --listed option (which
didn't affect the functionality, but was logically incorrect).
** Fixed verification of created archives.
** Fixed unquoting of file names containing backslash escapes (previous
versions failed to recognize \a and \v).
** When attempting to delete a non-existing member from the archive, previous
versions of tar used to overwrite last archive block with zeroes.
version 1.14 - Sergey Poznyakoff, 2004-05-11
* Added support for POSIX.1-2001 and ustar archive formats.
* New option --format allows to select the output archive format
* The default output format can be selected at configuration time
by presetting the environment variable DEFAULT_ARCHIVE_FORMAT.
Allowed values are GNU, V7, OLDGNU and POSIX.
* New option --strip-path allows to cut off a given number of
path elements from the name of the file being extracted.
* New options --index-file, --no-overwrite-dir. The --overwrite-dir
option is now the default; use --no-overwrite-dir if you prefer
the previous default behavior.
* The semantics of -o option is changed. When extracting, it
does the same as --no-same-owner GNU tar option. This is compatible
with UNIX98 tar. Otherwise, its effect is the same as that of
--old-archive option. This latter is deprecated and will be removed
in future.
* New option --check-links prints a message if not all links are dumped
for a file being archived. This corresponds to the UNIX98 -l option.
The current semantics of the -l option is retained for compatibility
with previous releases, however such usage is strongly deprecated as
the option will change to its UNIX98 semantics in the future releases.
* New option --occurrence[=N] can be used in conjunction with one of
the subcommands --delete, --diff, --extract or --list when a list of
files is given either on the command line or via -T option. This
option instructs tar to process only the Nth occurrence of each named
file. N defaults to 1, so `tar -x -f archive --occurrence filename'
extracts the first occurrence of `filename' from `archive'
and terminates without scanning to the end of the archive.
* New option --pax-option allows to control the handling of POSIX
keywords in `pax' extended headers. It is equivalent to `pax'
-o option.
* --incremental and --listed-incremental options work correctly on
individual files, as well as on directories.
* New scripts: backup (replaces old level-0 and level-1) and restore.
The scripts are compiled and installed if --enable-backup-scripts
option is given to configure.
* By default tar searches "rmt" utility in "$prefix/libexec/rmt",
which is consistent with the location where the version of "rmt"
included in the package is installed. Previous versions of tar
used "/etc/rmt". To install "rmt" to its traditional location,
run configure with option --libexecdir=/etc. Otherwise, if you
already have rmt installed and wish to use it, instead of the
shipped in version, set the variable DEFAULT_RMT_COMMAND to
the full path name of the utility, e.g., ./configure
DEFAULT_RMT_COMMAND=/etc/rmt.
Notice also that the full path name of the "rmt" utility to
use can be set at runtime, by giving option --rmt-command to
tar.
* Removed obsolete command line options:
** --absolute-paths superseded by --absolute-names
** --block-compress is not needed any longer
** --block-size superseded by --blocking-factor
** --modification-time superseded by --touch
** --read-full-blocks superseded by --read-full-records
** --record-number superseded by --block-number
** --version-control superseded by --backup
* New message translations fi (Finnish), gl (Galician), hr (Croatian),
hu (Hungarian), ms (Malaysian), nb (Norwegian), ro (Romanian), sk
(Slovak), zh_CN (Chinese simplified), zh_TW (Chinese traditional).
The code 'no' for Norwegian (Bokmål) has been withdrawn; use 'nb' instead.
* Bug fixes.
version 1.13.25 - Paul Eggert, 2001-09-26
* Bug fixes.
version 1.13.24 - Paul Eggert, 2001-09-22
* New option --overwrite-dir.
* Fixes for buffer overrun, porting, and copyright notice problems.
* The message translations for Korean are available again.
version 1.13.23 - Paul Eggert, 2001-09-13
* Bug, porting, and copyright notice fixes.
version 1.13.22 - Paul Eggert, 2001-08-29
* Bug fixes.
version 1.13.21 - Paul Eggert, 2001-08-28
* Porting and copyright notice fixes.
version 1.13.20 - Paul Eggert, 2001-08-27
* Some bugs were fixed:
@@ -38,6 +547,7 @@ version 1.13.20 - Paul Eggert, 2001-08-27
The translation for Korean has been withdrawn due to encoding errors.
It will be reissued once those are fixed.
version 1.13.19 - Paul Eggert, 2001-01-13
* The -I option has been withdrawn, as it was buggy and confusing.
@@ -46,6 +556,7 @@ version 1.13.19 - Paul Eggert, 2001-01-13
* With an option like -N DATE, if DATE starts with "/" or ".", it is taken
to be a file name; the last-modified time of that file is used as the date.
version 1.13.18 - Paul Eggert, 2000-10-29
* Some security problems have been fixed. `tar -x' now modifies only
@@ -73,14 +584,16 @@ version 1.13.18 - Paul Eggert, 2000-10-29
* This version of tar works best with GNU gzip test version 1.3 or later.
Please see <ftp://alpha.gnu.org/gnu/gzip/>.
* `tar --delete -f -' now works again.
version 1.13.17 - Paul Eggert, 2000-01-07.
* `tar --delete -f -' is no longer allowed; it was too buggy.
* Diagnostic messages have been made more regular and consistent.
version 1.13.16 - Paul Eggert, 1999-12-13.
* By default, tar now refuses to overwrite an existing file when
@@ -103,8 +616,8 @@ version 1.13.16 - Paul Eggert, 1999-12-13.
when extracting, and warns about such file names when creating an archive.
To enable the old behavior, use the -P or --absolute-names option.
* Tar now handles file names with multibyte encodings (e.g. UTF-8, Shift-JIS)
correctly. It relies on the mbrtowc function to handle multibytes.
* Tar now handles file names with multibyte encodings (e.g., UTF-8, Shift-JIS)
correctly. It relies on the mbrtowc function to handle multibyte characters.
* The file generated by -g or --listed-incremental now uses a format
that is independent of locale, so that users need not worry about
@@ -118,23 +631,26 @@ version 1.13.16 - Paul Eggert, 1999-12-13.
`quoted like this' (in the default C locale) or are followed by
colon, newline, or space, depending on context. Unprintable
characters are escaped with a C-like backslash conventions.
Terminating characters (e.g. close-quote, colon, newline)
Terminating characters (e.g., close-quote, colon, newline)
are also escaped as needed.
* tar now ignores socket files when creating an archive.
Previously tar archived sockets as fifos, which caused problems.
version 1.13.15 - Paul Eggert, 1999-12-03.
* If a file's ctime changes when being archived, report an error.
Previously tar looked at mtime, which missed some errors.
version 1.13.14 - Paul Eggert, 1999-11-07.
* New translations ja, pt_BR.
* New options --help and --version for rmt.
* Ignore Solaris door files when creating an archive.
version 1.13.13 - Paul Eggert, 1999-10-11.
* Invalid headers in tar files now elicit errors, not just warnings.
@@ -142,6 +658,7 @@ version 1.13.13 - Paul Eggert, 1999-10-11.
* If you specify an invalid date, `tar' now substitutes (time_t) -1.
* `configure --with-dmalloc' is no longer available.
version 1.13.12 - Paul Eggert, 1999-09-24.
* `tar' now supports hard links to symbolic links.
@@ -172,7 +689,7 @@ version 1.13.12 - Paul Eggert, 1999-09-24.
* Some diagnostics have been reworded for consistency.
version 1.13.11 - Paul Eggert, 1999-08-23.
* The short name of the --bzip option has been changed to -I,
@@ -192,14 +709,14 @@ version 1.13.11 - Paul Eggert, 1999-08-23.
numeric UTC offsets like `-0500' instead of abbreviations like
`EST', as abbreviations are not standardized and are ambiguous.
version 1.13.10 - Paul Eggert, 1999-08-20.
* `tar' now uses signed base-64 when outputting header values that are
out of the range of the standard unsigned base-8 format. [This
change was superseded in 1.13.12, described above.]
version 1.13.9 - Paul Eggert, 1999-08-18.
* `tar' now writes two zero blocks at end-of-archive instead of just one.
@@ -211,14 +728,14 @@ version 1.13.9 - Paul Eggert, 1999-08-18.
* `tar' now reads buggy tar files that have a null byte at the start of a
numeric header field.
version 1.13.8 - Paul Eggert, 1999-08-16.
* For compatibility with traditional `tar', intermediate directories
created automatically by root are no longer given the uid and gid of
the original file or directory.
version 1.13.7 - Paul Eggert, 1999-08-14.
* --listed-incremental and --newer are now incompatible options.
@@ -228,7 +745,7 @@ version 1.13.7 - Paul Eggert, 1999-08-14.
* --diff without --absolute-names no longer falls back on absolute names.
version 1.13.6 - Paul Eggert, 1999-08-11.
* An --exclude pattern containing / now excludes a file only if it matches an
@@ -237,7 +754,7 @@ version 1.13.6 - Paul Eggert, 1999-08-11.
* The protocol for talking to rmt has been extended slightly.
Open flags are now communicated in symbolic format as well as numeric.
The symbolic format (e.g. "O_WRONLY|O_CREAT|O_TRUNC") is for portability
The symbolic format (e.g., "O_WRONLY|O_CREAT|O_TRUNC") is for portability
when rmt is operating on a different operating system from tar.
The numeric format is retained, and rmt uses it if symbolic format is absent,
for backward compatibility with older versions of tar and rmt.
@@ -255,37 +772,37 @@ version 1.13.6 - Paul Eggert, 1999-08-11.
* New option -y or --bzip2 for bzip2 compression, by popular request.
version 1.13.5 - Paul Eggert, 1999-07-20.
* Do the delayed updates of file metadata even after a fatal error.
version 1.13.4 - Paul Eggert, 1999-07-20.
* Do not chmod unless we are root or the -p option was given;
this matches historical practice.
version 1.13.3 - Paul Eggert, 1999-07-16.
* A path name is excluded if any of its file name components matches an
excluded pattern, even if the path name was specified on the command line.
Also see 1.13.6 for later changes in this area.
version 1.13.2 - Paul Eggert, 1999-07-14.
* Bug reporting address changed to <bug-tar@gnu.org>.
version 1.13.1 - Paul Eggert, 1999-07-12.
* Bug fixes only.
version 1.13 - Paul Eggert, 1999-07-08.
* Support for large files, e.g. files larger than 2 GB on many 32-bit hosts.
* Support for large files, e.g., files larger than 2 GB on many 32-bit hosts.
Also, support for larger uids, device ids, etc.
* Many bug fixes and porting fixes.
* This release is only for fixes. A more ambitious test release,
@@ -297,7 +814,7 @@ version 1.13 - Paul Eggert, 1999-07-08.
but they have been removed to maintain compatibility with paxutils.
Please try --use=bzip2 instead of --bzip2.
Version 1.12 - Fran<EFBFBD>ois Pinard, 1997-04.
Version 1.12 - François Pinard, 1997-04.
Sensitive matters
* Use shell globbing patterns for --label, instead of regular expressions.
@@ -340,7 +857,7 @@ Various changes
Many bugs are squashed, while others still run free.
Version 1.11.8 - Fran<EFBFBD>ois Pinard, 1995-06.
Version 1.11.8 - François Pinard, 1995-06.
* Messages available in French, German, Portuguese and Swedish.
* The distribution provides a rudimentary Texinfo manual.
@@ -476,14 +993,14 @@ Versions 1.07 back to 1.00 by Jay Fenlason.
Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free
Software Foundation, Inc.
Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2003,
2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
This file is part of GNU tar.
GNU tar is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
the Free Software Foundation; either version 3, or (at your option)
any later version.
GNU tar is distributed in the hope that it will be useful,
@@ -493,11 +1010,14 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with tar; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
Local Variables:
coding: iso-latin-1
End:
Local variables:
mode: outline
paragraph-separate: "[ ]*$"
eval: (add-hook 'write-file-hooks 'time-stamp)
time-stamp-start: "changes. "
time-stamp-format: "%:y-%02m-%02d"
time-stamp-end: "\n"
end:

128
PORTS
View File

@@ -1,48 +1,60 @@
* Ports of GNU tar and other micro-tars -*- outline -*-
Ports of GNU tar and other tars
See the end of file for copying conditions.
Please write tar-bugs@gnu.ai.mit.edu if you are aware of various ports
of GNU tar to non-Unix systems not listed here, or for corrections.
* Introduction
Most entries in this file are out of date, unfortunately. Such
entries are marked with an `X'. Run grep '^\*\*[^X]' PORTS to
extract valid entries.
Please write bug-tar@gnu.org if you are aware of various ports of GNU tar
to non-GNU and non-Unix systems not listed here, or for corrections.
Please provide the goal system, a complete and stable URL, the maintainer
name and address, the tar version used as a base, and your comments.
.* Amiga
* GNU/Linux and Unix
. + ftp://ftp.wustl.edu/systems/amiga/aminet/util/arc/GNUtar-1.11.8.lha
** Star is a tape archiver similar to tar.
<http://www.fokus.gmd.de/research/cc/glone/employees/joerg.schilling/private/star.html>
* Amiga
**X ftp://ftp.wustl.edu/systems/amiga/aminet/util/arc/GNUtar-1.11.8.lha
maintained by Enrico Forestieri <enrico@com.unipr.it>
Based on tar 1.11.8.
. + ftp://ftp.ninemoons.com/pub/ade/current/amiga-bin/tar-1.11.8-bin.lha
**X ftp://ftp.ninemoons.com/pub/ade/current/amiga-bin/tar-1.11.8-bin.lha
maintained by the ADE group <fnf@fishpond.ninemoons.com>
Based on tar 1.11.8, needs ixemul.library.
. + ftp://ftp.wustl.edu/systems/amiga/aminet/util/arc/gnutar.lha
**X ftp://ftp.wustl.edu/systems/amiga/aminet/util/arc/gnutar.lha
maintained by <mscheler@wuarchive.wustl.edu>
.* DEC alpha (NT)
* DEC alpha (NT)
. + ftp://ftp.cdrom.com/.20/windows/archiver/tar.zip
**X ftp://ftp.cdrom.com/.20/windows/archiver/tar.zip
maintained by Drew Bliss & Geoff Voelker
.* DEC VAX (VMS)
* DEC VAX (VMS)
. + http://www.lp.se/free/vmstar/
**X http://www.lp.se/free/vmstar/
maintained by Richard Levitte <levitte@lp.se>
This is not GNU tar, but a separate implementation.
. + maintained by William Bader <william@nscs.fast.net>
** maintained by William Bader <william@nscs.fast.net>
For V4.7. Based on an old PDtar. Requires compatible shared libraries
to run V5 or V6 executables.
.* IBM/PC (DV/X)
* IBM/PC (DV/X)
. + ftp://qdeck.com/ (?)
**X ftp://qdeck.com/ (?)
maintained by David Ronis <ronis@gibbs.chem.mcgill.ca>
For Desqview/X. Everything works besides compression. Copy of hacked
sources available, some of DV/X's programmer's library also needed.
.* IBM/PC (MSDOS)
* IBM/PC (MSDOS)
. + http://www.simtel.net/simtel.net/
**X http://www.simtel.net/simtel.net/
http://www.leo.org/pub/comp/platforms/pc/gnuish (Germany)
ftp://ftp.simtel.net/simtelnet/gnu
ftp://ftp.leo.org/pub/comp/platforms/pc/gnuish
@@ -50,82 +62,112 @@
You get many GNU tools, not only `tar'. The GNUish project is described
in `gnuish_t.htm'.
. + The DJGPP development tools also include some `tar' utilities.
** The DJGPP development tools also include some `tar' utilities.
. + ftp://ftp.mcs.com/mcsnet.users/les/dos-gnutar/
**X ftp://ftp.mcs.com/mcsnet.users/les/dos-gnutar/
maintained by Leslie Mikesell <les@mcs.net>
Based on tar 1.11.2. Support for SCSI (via ASPI) and network (rsh over
packet driver). No support for win95 long file names.
. + ftp://ftp.wu-wien.ac.at:pub/src/PCmisc/aspi-tar/*
**X ftp://ftp.wu-wien.ac.at/pub/src/PCmisc/aspi-tar/*
maintained by Christoph Splittgerber <chris@orion.sdata.de>
Based on tar 1.10. Support for SCSI (via ASPI).
. + ftp://wuarchive (?)
**X ftp://wuarchive (?)
Several DOS version based on PDtar. John Gilmore <gnu@toad.com> says
he has copies of several vintages saved.
. + ftp://ftp.cdrom.com/.14/languages/ada/toolkit/msdos/gtar/gtar.exe
**X ftp://ftp.cdrom.com/.14/languages/ada/toolkit/msdos/gtar/gtar.exe
ftp://ftp.cdrom.com/.14/languages/ada/toolkit/msdos/gtar/gtar.taz
ftp://ftp.cdrom.com/.14/languages/ada/toolkit/msdos/gtar/gtar.zip
. + ftp://ftp.cdrom.com/.4/os2/archiver/tar.zip
**X ftp://ftp.cdrom.com/.4/os2/archiver/tar.zip
Based on PDtar.
. + ftp://ftp.cdrom.com/.20/windows/archiver/tar.zip
**X ftp://ftp.cdrom.com/.20/windows/archiver/tar.zip
maintained by Drew Bliss & Geoff Voelker
GNU tar for NT (intel and Alpha platforms).
. + ftp://garbo.uwasa.fi/pc/unix/untgz095.zip
** ftp://garbo.uwasa.fi/pc/unix/untgz095.zip
maintained by Tillmann Steinbrecher <tst@darmstadt.netsurf.de>
The `untgz' program is a fast .tar or .tar.gz (.tgz) extractor.
. + http://people.darmstadt.netsurf.de/tst/tar.htm
**X http://people.darmstadt.netsurf.de/tst/tar.htm
maintained by Tillmann Steinbrecher <tst@darmstadt.netsurf.de>
This is not a `tar' port, but an index of them.
.* IBM/PC (OS/2)
* IBM/PC (OS/2)
. + http://www.leo.org/pub/comp/os/os2/leo/gnu/archiver/gtar254.zip
**X http://www.leo.org/pub/comp/os/os2/leo/gnu/archiver/gtar254.zip
http://www.leo.org/pub/comp/os/os2/leo/gnu/archiver/gtak254.zip
maintained by Andreas Kaiser <Andreas.Kaiser@stuttgart.netsurf.de>
Version 2.54. Based on tar 1.10. The second archive contains SCSI
drivers (DAT streamers notably) and rmt-type programs.
. + ftp://garbo.uwasa.fi/pc/unix/untgz095.zip
maintained by Tillmann Steinbrecher <tst@darmstadt.netsurf.de>
The `untgz' program is a fast .tar or .tar.gz (.tgz) extractor.
* IBM/PC (Win32: Windows 95, NT 3.5 or NT 4.0)
.* IBM/PC (Win32: Windows 95, NT 3.5 or NT 4.0)
. + ftp://ftp.cygnus.com:~ftp/pub/sac/win32/usersrc/*
**X ftp://ftp.cygnus.com:~ftp/pub/sac/win32/usersrc/*
maintained by Cygnus
GNU-Win32 B17.1 distribution. Download all files, `cat' them together,
and `untar' the result. You get many GNU tools, not only `tar'.
Based on tar 1.11.2.
. + ftp://ftp.cdrom.com/.20/windows/archiver/tar.zip
**X ftp://ftp.cdrom.com/.20/windows/archiver/tar.zip
maintained by Drew Bliss & Geoff Voelker
GNU tar for NT (intel and Alpha platforms).
. + ftp://garbo.uwasa.fi/pc/unix/untgz095.zip
** ftp://garbo.uwasa.fi/pc/unix/untgz095.zip
maintained by Tillmann Steinbrecher <tst@darmstadt.netsurf.de>
The `untgz' program is a fast .tar or .tar.gz (.tgz) extractor.
.* IBM/PC (Windows 3.1)
* IBM/PC (Windows 3.1)
. + ftp://ftp.mcs.com/mcsnet.users/les/win-gnutar/
**X ftp://ftp.mcs.com/mcsnet.users/les/win-gnutar/
maintained by Leslie Mikesell <les@mcs.net>
Support for network (rsh over winsock). No support for win95 long
file names.
. + ftp://ftp.gamesdomain.ru/.1/os/windows/programr/tar.zip
**X ftp://ftp.gamesdomain.ru/.1/os/windows/programr/tar.zip
Based on GNU tar 1.11.2.
.* Macintosh
* Macintosh
. + There is a tar in Stuffit Expander which is available many places and
comes with MacOS. It creates some spurious files but works on average.
** Paulo Abreu (paulotex at yahoo dot com) did a
limited port of GNU tar to Darwin, with support for resource forks
and finder info, but this no longer seems to be available.
. + There is an excellent GNU tar bundled in Tenon MachTen, but it does not
seem to be available separately.
** There is a tar in Stuffit Expander which is available many places and
comes with MacOS. It creates some spurious files but works on average.
** There is an excellent GNU tar bundled in Tenon MachTen, but it does not
seem to be available separately.
* Copyright notice
Copyright (C) 1999, 2001, 2003, 2004, 2007 Free Software Foundation, Inc.
This file is part of GNU tar.
GNU tar is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
GNU tar is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU tar; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
Local Variables:
mode: outline
paragraph-separate: "[ ]*$"
version-control: never
End:

185
README
View File

@@ -1,25 +1,7 @@
README for GNU tar
See the end of file for copying conditions.
Copyright 1990, 1991, 1992, 1994, 1997, 1998, 1999, 2000, 2001
Free Software Foundation, Inc.
This file is part of GNU tar.
GNU tar is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU tar is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with tar; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
* Introduction
Please glance through *all* sections of this
`README' file before starting configuration. Also make sure you read files
@@ -48,9 +30,15 @@ See file `THANKS' for a list of contributors.
Besides those configure options documented in files `INSTALL' and
`ABOUT-NLS', an extra option may be accepted after `./configure':
* `--disable-largefile' omits support for large files, even if the
operating system supports large files. Typically, large files are
those larger on 2 GB on a 32-bit host.
* Install
** Selecting the default archive format.
The default archive format is GNU, this can be overridden by
presetting DEFAULT_ARCHIVE_FORMAT while configuring. The allowed
values are GNU, V7, OLDGNU, USTAR and POSIX.
** Selecting the default archive device
The default archive device is now `stdin' on read and `stdout' on write.
The installer can still override this by presetting `DEFAULT_ARCHIVE'
@@ -58,34 +46,45 @@ in the environment before configuring (the behavior of `-[0-7]' or
`-[0-7]lmh' options in `tar' are then derived automatically). Similarly,
`DEFAULT_BLOCKING' can be preset to something else than 20.
For comprehensive modifications to GNU tar, you might need tools beyond
those used in simple installations. Fully install GNU m4 1.4 first,
and only then, Autoconf 2.13 or later. Install Perl, then Automake
1.4 or later. You might need Bison 1.28 or later, and GNU tar itself.
All are available on GNU archive sites, like in
ftp://ftp.gnu.org/pub/gnu/.
** Selecting full pathname of the "rmt" binary.
Send bug reports to `bug-tar@gnu.org'. (Beware, old-timers: it is
`@gnu', not `@prep'; and not `bug-gnu-utils' anymore.) A bug report is
an adequate description of the problem: your input, what you expected,
what you got, and why this is wrong. Diffs are welcome, but they only
describe a solution, from which the problem might be uneasy to infer.
If needed, submit actual data files with your report. Small data files
are preferred. Big files may sometimes be necessary, but do not send them
to the report address; rather take special arrangement with the maintainer.
Previous versions of tar always looked for "rmt" binary in the
directory "/etc/rmt". However, the "rmt" program included
in the distribution was installed under "$prefix/libexec/rmt".
To fix this discrepancy, tar now looks for "$prefix/libexec/rmt".
If you do not want this behavior, specify full path name of
"rmt" binary using DEFAULT_RMT_DIR variable, e.g.:
Your feedback will help us to make a better and more portable package.
Consider documentation errors as bugs, and report them as such. If you
develop anything pertaining to `tar' or have suggestions, let us know
and share your findings by writing to <bug-tar@gnu.org>.
./configure DEFAULT_RMT_DIR=/etc
If you already have a copy of "rmt" installed and wish to use it
instead of the version supplied with the distribution, use --with-rmt
option:
Installation hints
------------------
./configure --with-rmt=/etc/rmt
This will also disable building the included version of rmt.
** Installing backup scripts.
This version of tar is shipped with the shell scripts for producing
incremental backups (dumps) and restoring filesystems from them.
The name of the backup script is "backup". The name of the
restore script is "restore". They are installed in "$prefix/sbin"
directory.
Use option --enable-backup-scripts to compile and install these
scripts.
** `--disable-largefile' omits support for large files, even if the
operating system supports large files. Typically, large files are
those larger than 2 GB on a 32-bit host.
* Installation hints
Here are a few hints which might help installing `tar' on some systems.
* gzip and bzip2.
** gzip and bzip2.
GNU tar uses the gzip and bzip2 programs to read and write compressed
archives. If you don't have these programs already, you need to
@@ -106,7 +105,7 @@ in gzip test version 1.3, which as of this writing is available at
incompatibility by using a shell command like
`gzip -d <file.tar.gz | tar -xzf -'.
* Solaris issues.
** Solaris issues.
GNU tar exercises many features that can cause problems with older GCC
versions. In particular, GCC 2.8.1 (sparc, -O1 or -O2) is known to
@@ -117,7 +116,7 @@ Recent versions of Solaris tar sport a new -E option to generate
extended headers in an undocumented format. GNU tar does not
understand these headers.
* Static linking.
** Static linking.
Some platform will, by default, prepare a smaller `tar' executable
which depends on shared libraries. Since GNU `tar' may be used for
@@ -138,34 +137,32 @@ to a value from the table below, before configuration (see `INSTALL').
Solaris (vendor) -Bstatic
SunOS (vendor) -Bstatic
* Failed tests `ignfail.sh' or `incremen.sh'.
** Failed tests `ignfail.sh' or `incremen.sh'.
In an NFS environment, lack of synchronization between machine clocks
might create difficulties to any tool comparing dates and file time stamps,
like `tar' in incremental dumps. This has been a recurrent problem with
GNU Make for the last few years. We would like a general solution.
* BSD compatibility matters.
** BSD compatibility matters.
Set LIBS to `-lbsd' before configuration (see `INSTALL') if the linker
complains about `bsd_ioctl' (Slackware). Also set CPPFLAGS to
`-I/usr/include/bsd' if <sgtty.h> is not found (Slackware).
* OPENStep 4.2 swap files
** OPENStep 4.2 swap files
Tar cannot read the file /private/vm/swapfile.front (even as root).
This file is not a real file, but some kind of uncompressed view of
the real compressed swap file; there is no reason to back it up, so
the simplest workaround is to avoid tarring this file.
Special topics
--------------
* Special topics
Here are a few special matters about GNU `tar', not related to build
matters. See previous section for such.
* File attributes.
** File attributes.
About *security*, it is probable that future releases of `tar' will have
some behavior changed. There are many pending suggestions to choose from.
@@ -178,19 +175,77 @@ implement flavors of symbolic links showing different behavior and
properties. We did not successfully sorted all these out yet. Currently,
the `lchown' call will be used if available, but that's all.
* POSIX compliance.
** POSIX compliance.
GNU `tar' implements an early draft of the POSIX 1003.1 `ustar' standard
which is different from the final standard. This will be progressively
corrected over the incoming few years. Don't be mislead by the mere
existence of the --posix option. Later releases will become able to
read truly POSIX archives, and also to produce them under option. (Also,
if you look at the internals, don't take the GNU extensions you see for
granted, as they are planned to change.) GNU tar 2.0 will produce POSIX
archives by default, but there is a long way before we get there.
GNU `tar' is able to create archive in the following formats:
*** The format of UNIX version 7
*** POSIX.1-1988 format, also known as "ustar format"
*** POSIX.1-2001 format, also known as "pax format"
*** Old GNU format (described below)
In addition to those, GNU `tar' is also able to read archives
produced by `star' archiver.
A so called `Old GNU' format is based on an early draft of the
POSIX 1003.1 `ustar' standard which is different from the final
standard. It defines its extensions (such as incremental backups
and handling of the long file names) in a way incompatible with
any existing tar archive format, therefore the use of old GNU
format is strongly discouraged.
Please read the file NEWS for more information about POSIX compliance
and new `tar' features.
* What's next?
In the future we will try to release tar-1.14 as soon as possible and
start merging with paxutils afterwards. We'll also try to rewrite
some parts of the documentation after paxutils has been merged.
GNU tar will be merged into GNU paxutils: a project containing
several utilities related to creating and handling archives in
various formats. The project will include tar, cpio and pax
utilities.
* Bug reporting.
Send bug reports to <bug-tar@gnu.org>. A bug report should contain
an adequate description of the problem, your input, what you expected,
what you got, and why this is wrong. Diffs are welcome, but they only
describe a solution, from which the problem might be uneasy to infer.
If needed, submit actual data files with your report. Small data files
are preferred. Big files may sometimes be necessary, but do not send them
to the report address; rather take special arrangement with the maintainer.
Your feedback will help us to make a better and more portable package.
Consider documentation errors as bugs, and report them as such. If you
develop anything pertaining to `tar' or have suggestions, let us know
and share your findings by writing to <bug-tar@gnu.org>.
* Copying
Copyright (C) 1990, 1991, 1992, 1994, 1997, 1998, 1999, 2000,
2001, 2003, 2004, 2007 Free Software Foundation, Inc.
This file is part of GNU tar.
GNU tar is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
GNU tar is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with tar; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
Local Variables:
mode: outline
paragraph-separate: "[ ]*$"
version-control: never
End:

View File

@@ -1,112 +1,82 @@
This is a test release of GNU tar.
This is GNU tar.
This is a *pre-release* version, and not ready for production use yet.
Please send comments and problem reports to <bug-tar@gnu.org>.
This release was built with GNU automake 1.5 patched as follows:
If you have taken the sources from CVS you will need the following
packages (or later) to build GNU tar. We don't make any extra effort
to accommodate older versions of these packages, so please make sure
that you have the latest stable version.
2001-09-14 Paul Eggert <eggert@twinsun.com>
- Automake <http://www.gnu.org/software/automake/>
- Autoconf <http://www.gnu.org/software/autoconf/>
- Bison <http://www.gnu.org/software/bison/>
- Gettext <http://www.gnu.org/software/gettext/>
- Gzip <http://www.gnu.org/software/gzip/>
- M4 <http://www.gnu.org/software/m4/>
- Texinfo <http://www.gnu.org/software/texinfo>
- Wget <http://www.gnu.org/software/wget/>
* lib/am/distdir.am (REMOVE_DISTDIR):
New macro. Do not change permission of non-directories.
(distdir, dist, dist-bzip2, dist-tarZ, dist-shar, dist-zip, dist-all,
distcheck): Use it.
As of this writing, the latest stable version of Gzip is 1.2.4 but we
suggest using test version 1.3.5 (or later, if one becomes available).
===================================================================
RCS file: lib/am/distdir.am,v
retrieving revision 1.5
retrieving revision 1.5.0.1
diff -pu -r1.5 -r1.5.0.1
--- lib/am/distdir.am 2001/07/14 20:12:52 1.5
+++ lib/am/distdir.am 2001/09/15 05:12:18 1.5.0.1
@@ -29,6 +29,11 @@ else !%?TOPDIR_P%
?DISTDIR?distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
endif !%?TOPDIR_P%
+REMOVE_DISTDIR = \
+ { test ! -d $(distdir) \
+ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -fr $(distdir); }; }
+
distdir: $(DISTFILES)
##
## For Gnits users, this is pretty handy. Look at 15 lines
@@ -47,7 +52,7 @@ endif %?TOPDIR_P%
## Only for the top dir.
##
if %?TOPDIR_P%
- -chmod -R a+w $(distdir) >/dev/null 2>&1; rm -rf $(distdir)
+ $(REMOVE_DISTDIR)
mkdir $(distdir)
endif %?TOPDIR_P%
##
@@ -168,13 +173,13 @@ GZIP_ENV = --best
.PHONY: dist
dist: distdir
$(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
- -chmod -R a+w $(distdir) >/dev/null 2>&1; rm -rf $(distdir)
+ $(REMOVE_DISTDIR)
if %?BZIP2%
.PHONY: dist-bzip2
dist-bzip2: distdir
$(AMTAR) chof - $(distdir) | bzip2 -9 -c >$(distdir).tar.bz2
- -chmod -R a+w $(distdir) >/dev/null 2>&1; rm -rf $(distdir)
+ $(REMOVE_DISTDIR)
endif %?BZIP2%
@@ -182,7 +187,7 @@ if %?COMPRESS%
.PHONY: dist-tarZ
dist-tarZ: distdir
$(AMTAR) chof - $(distdir) | compress -c >$(distdir).tar.Z
- -chmod -R a+w $(distdir) >/dev/null 2>&1; rm -rf $(distdir)
+ $(REMOVE_DISTDIR)
endif %?COMPRESS%
@@ -190,7 +195,7 @@ if %?SHAR%
.PHONY: dist-shar
dist-shar: distdir
shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
- -chmod -R a+w $(distdir) >/dev/null 2>&1; rm -rf $(distdir)
+ $(REMOVE_DISTDIR)
endif %?SHAR%
@@ -199,7 +204,7 @@ if %?ZIP%
dist-zip: distdir
-rm -f $(distdir).zip
zip -rq $(distdir).zip $(distdir)
- -chmod -R a+w $(distdir) >/dev/null 2>&1; rm -rf $(distdir)
+ $(REMOVE_DISTDIR)
endif %?ZIP%
endif %?TOPDIR_P%
@@ -223,7 +228,7 @@ dist-all: distdir
?SHAR? shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
?ZIP? -rm -f $(distdir).zip
?ZIP? zip -rq $(distdir).zip $(distdir)
- -chmod -R a+w $(distdir) >/dev/null 2>&1; rm -rf $(distdir)
+ $(REMOVE_DISTDIR)
endif %?TOPDIR_P%
@@ -239,8 +244,7 @@ if %?TOPDIR_P%
# tarfile.
.PHONY: distcheck
distcheck: dist
-## Make sure we can remove distdir before trying to remove it.
- -chmod -R a+w $(distdir) > /dev/null 2>&1; rm -rf $(distdir)
+ $(REMOVE_DISTDIR)
GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(AMTAR) xf -
## Make the new source tree read-only. Distributions ought to work in
## this case. However, make the top-level directory writable so we
@@ -273,7 +277,7 @@ distcheck: dist
&& (test `find . -type f -print | wc -l` -eq 0 \
|| (echo "Error: files left after distclean" 1>&2; \
exit 1) )
- -chmod -R a+w $(distdir) > /dev/null 2>&1; rm -rf $(distdir)
+ $(REMOVE_DISTDIR)
@echo "$(distdir).tar.gz is ready for distribution" | \
sed 'h;s/./=/g;p;x;p;x'
endif %?TOPDIR_P%
Valgrind <http://valgrind.org/> is also highly recommended, if
Valgrind supports your architecture.
Before building the package, run "bootstrap". It obtains various
additional files from the CVS repository and the Translation Project
site and prepares the source directory for building.
When run without arguments, bootstrap will try to obtain gnulib and
paxutils files from their corresponding CVS repositories on Savannah
using anonymous SSH access. Then, it will fetch the po files from tar
page at Translation Project, and, finally, it will start autoconfiguration
process. Simply running it without arguments should do in most cases.
Several options allow to control the behavior of bootstrap:
--gnulib-srcdir=DIRNAME Specify the local directory where gnulib
sources reside. Use this if you already
have gnulib sources on your machine, and
do not want to waste your bandwidth dowloading
them again.
--paxutils-srcdir=DIRNAME Specify the local directory where paxutils
sources reside. Use this if you already
have paxutils sources on your machine, and
do not want to waste your bandwidth dowloading
them again.
--cvs-auth=METHOD Set the CVS access method used for downloading
gnulib files. METHOD is one of the keywords
accepted by cvs -d option (see info cvs
repository).
--cvs-user=USERNAME Set the CVS username to be used when accessing
the gnulib repository.
--no-po Do not download po files.
Notice also that when using CVS authentication method "ext", bootstrap
will set the variable CVS_RSH to "ssh", unless it is already set to
some other value.
Copyright (C) 2001, 2003, 2004, 2005, 2007 Free Software Foundation, Inc.
This file is part of GNU tar.
GNU tar is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
GNU tar is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with tar; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.

70
README-cvs Normal file
View File

@@ -0,0 +1,70 @@
-*- outline -*-
These notes intend to help people working on the CVS version of
this package.
* Requirements
Only the sources are installed in the CVS repository (to ease the
maintenance, merges etc.), therefore you will have to get the latest
stable versions of the maintainer tools we depend upon, including:
- Automake <http://www.gnu.org/software/automake/>
- Autoconf <http://www.gnu.org/software/autoconf/>
- Bison <http://www.gnu.org/software/bison/>
- Gettext <http://www.gnu.org/software/gettext/>
- Gzip <http://www.gnu.org/software/gzip/>
- Tar <http://www.gnu.org/software/tar/>
- Wget <http://www.gnu.org/software/wget/>
As of this writing, the latest stable version of Gzip is 1.2.4 but we
suggest using test version 1.3.5 (or later, if one becomes available).
Valgrind <http://valgrind.org/> is also highly recommended, if
Valgrind supports your architecture.
Only building the initial full source tree will be a bit painful,
later, a plain `cvs update -P && make' should be sufficient.
* First CVS checkout
Obviously, if you are reading these notes, you did manage to check out
this package from CVS. The next step is to get other files needed to
build, which are extracted from other source packages:
$ ./bootstrap
And there you are! Just
$ ./configure
$ make
$ make check
At this point, there should be no difference between your local copy,
and the CVS master copy:
$ cvs diff
should output no difference.
Enjoy!
-----
Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation,
Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.

138
THANKS
View File

@@ -1,11 +1,14 @@
GNU tar THANKS file
GNU tar has originally been written by Graham Todd. Many people
further contributed to GNU tar by reporting problems, suggesting
various improvements or submitting actual code. Here is a list of
these people. Help me keep it complete and exempt of errors.
Please see the AUTHORS file for the list of principal authors.
Many people further contributed to GNU tar by reporting problems,
suggesting various improvements or submitting actual code. Here is a
list of these people. Help me keep it complete and exempt of errors.
See various ChangeLogs for a detailed description of contributions.
Aage Robeck aagero@ifi.uio.no
Adye, TJ (Tim) T.J.Adye@rl.ac.uk
Akiko Matsushita matusita@sra.co.jp
Alan Bawden Alan@lcs.mit.edu
Alan Cox alan@cymru.net
@@ -25,6 +28,7 @@ Andreas Haumer andreas@vlsivie.tuwien.ac.at
Andreas Jaeger aj@arthur.pfalz.de
Andreas Koppenhoefer koppenh@trick.informatik.uni-stuttgart.de
Andreas Reuter ar205@bonzo.geowiss.nat.tu-bs.de
Andreas Schuldei andreas@schuldei.org
Andreas Schwab schwab@issan.informatik.uni-dortmund.de
Andrew A. Ivanov ivanov@mics.msu.su
Andrew J. Schorr schorr@ead.dsa.com
@@ -34,7 +38,7 @@ Andy Gay andy@rdl.co.uk
Antonio Jose Coutinho ajc@di.uminho.pt
Ariel Faigon ariel@engr.sgi.com
Arne Wichmann aw@math.uni-sb.de
Arnold Robbins arnold@gnu.ai.mit.edu
Arnold Robbins arnold@gnu.org
Art Isbell aisbell@cubicsol.com
Axel Boldt boldt@math.ucsb.edu
Axel Habermann kiwi@belly.in-berlin.de
@@ -44,9 +48,11 @@ Bela Lubkin filbo@armory.com
Ben A. Mesander ben@piglet.cr.usgs.gov
Benedikt Stockebrand benedikt@devnull.ruhr.de
Bennett Todd bet@mordor.com
Benno Schulenberg benno@nietvergeten.nl
Benny Holmgren benny@hgs.se
Bernard Chen bern@cs.ucla.edu
Bernard Derval derval@iro.umontreal.ca
Bernhard Rosenkraenzer bero@redhat.de
Bo Nygaard Bai bai@iesd.auc.dk
Bob Kaehms kaehms@was.archive.org
Bob Mende Pie mende@piecomputer.rutgers.edu
@@ -57,21 +63,23 @@ Brian Perkins bperkins@netspace.org
Brian R. Smith brian@cygnus.com
Bruce Evans bde@runx.oz.au
Bruce Jerrick bruce@cse.ogi.edu
Bruno Haible haible@ma2s2.mathematik.uni-karlsruhe.de
Bruno Haible haible@ilog.fr
Bryan Ford baford@mit.edu
Bryant Fujimoto fujimoto@denali.chem.washington.edu
Burkhard Plache plache@krusty.optimax.ns.ca
Calvin Cliff cliff@trifid.astro.ucla.edu
Cameron Elliott cam@mvbms.mvbms.com
Carl Streeter streeter@cae.wisc.edu
Carsten Heyl heyl@nads.de
Catrin Urbanneck cur@gppc.de
Cesar Romani romani@ifm.uni-hamburg.de
Chad Hurwitz churritz@cts.com
Chance Reschke creschke@usra.edu
Charles Fu ccwf@klab.caltech.edu
Charles Lopes Charles.Lopes@infm.ulst.ac.uk
Charles M. Hannum mycroft@gnu.ai.mit.edu
Charles M. Hannum mycroft@gnu.org
Chip Salzenberg tct!chip
Chris Arthur csa@gnu.ai.mit.edu
Chris Arthur csa@gnu.org
Chris F.M. Verberne verberne@prl.philips.nl
Chris G. Demetriou cgd@sun-lamp.cs.berkeley.edu
Chris Hopps sycom.mi.org!ro-chp!chopps
@@ -79,10 +87,12 @@ Chris Metcalf metcalf@catfish.lcs.mit.edu
Chris Ransom chris@quests.com
Christian Callsen Christian.Callsen@eng.sun.com
Christian Kirsch ck@held.mind.de
Christian Laubscher christian.laubscher@tiscalinet.ch
Christian T. Dum ctd@mpe-garching.mpg.de
Christian von Roques roques@pond.sub.org
Christoph Litauer litauer@mailhost.uni-koblenz.de
Christophe Colle colle@krtkg1.rug.ac.be
Christophe Kalt Christophe.Kalt@kbcfp.com
Christopher T. Johnson cjohnson@camelot.com
Christopher Vickery vickery@ipc1.cs.qc.edu
Claude Scarpelli claude@genethon.fr
@@ -96,7 +106,7 @@ Dale R. Worley worley@world.std.com
Dale Wiles wiles@geordi.calspan.com
Dan Bloch dan@transarc.com
Dan Reish dreish@izzy.net
Daniel Hagerty hag@gnu.ai.mit.edu
Daniel Hagerty hag@gnu.org
Daniel Quinlan quinlan@pathname.com
Daniel R. Guilderson d.guilderson@ma30.bull.com
Daniel S. Barclay daniel@compass-da.com
@@ -105,6 +115,7 @@ Danny R. Johnston danny@cs.weber.edu
Dave Barr barr@math.psu.edu
Dave Gentzel gentzel@nova.enet.dec.com
Dave Gregorich dtg@ipac.caltech.edu
David Brown davidb@davidb.org
David J. MacKenzie djm@uunet.uu.net
David Johnson David.W.Johnson@colorado.edu
David K. Drum ccdavid@mizzou1.missouri.edu
@@ -127,7 +138,7 @@ Dimitri Bougoulias opus@hol.gr
Dimitris Fousekis dfousek@leon.nrcps.ariadne-t.gr
Dirk Herr-Hoyman hoymand@gate.net
Don Bennett dpb@netcom.com
Donald B Gordon dbgordon@gnu.ai.mit.edu
Donald B Gordon dbgordon@gnu.org
Donald H. Locker dhl@spuf1d83.lcp.chrysler.com
Douglas Scott doug@foxtrot.ccmrc.ucsb.edu
Drew Sullivan drew@sni.ca
@@ -142,6 +153,7 @@ Elmar Heeb heeb@itp.ethz.ch
Elmer Fittery elmerf@ptw.com
Eric Backus ericb@lsid.hp.com
Eric Benson eb@amazon.com
Eric Blake ebb9@byu.net
Eric M. Boehm Eric.M.Boehm@optimumtech.com
Eric Norum eric@ee.ualberta.ca
Erich Stefan Boleyn erich@uruk.org
@@ -150,13 +162,15 @@ Erik D. Frederick edf@deckard.mc.duke.edu
Esa Karell karell@cs.helsinki.fi
Ezra Peisach epeisach@mit.edu
Fabio d'Alessi cars@civ.bio.unipd.it
Frank Heckenbach frank@g-n-u.de
Frank Koenen koenfr@lidp.com
Franz-Werner Gergen gergen@edvulx.mpi-stuttgart.mpg.de
Fran<EFBFBD>ois Pinard pinard@iro.umontreal.ca
François Pinard pinard@iro.umontreal.ca
Fritz Elfert fritz@fsun.triltsch.de
George Chyu gschyu@ccgate.dp.beckman.com
Gerben Wierda gerben@rna.indiv.nluug.nl
Gerd Knorr kraxel@cs.tu-berlin.de
Gerhard Poul gpoul@gnu.org
Giorgio Signorini signo@chim.unifi.it
Graham Whitted gbw@sgrail.com
Grant McDorman grant@isgtec.com
@@ -165,21 +179,26 @@ Greg Chung gchung@caip.rutgers.edu
Greg Hudson ghudson@mit.edu
Greg Maples greg@clari.net
Greg McGary gkm@cstone.net
G<EFBFBD>ran Uddeborg gvran@uddeborg.pp.se
Greg Schafer gschafer@zip.com.au
Göran Uddeborg gvran@uddeborg.pp.se
Gürkan Karaman karaman@dssgmbh.de
Hans Guerth 100664.3101@compuserve.com
Harald K<>nig koenig@tat.physik.uni-tuebingen.de
Hansjörg Lipp hjlipp@web.de
Harald König koenig@tat.physik.uni-tuebingen.de
Harald Milz hm@seneca.ix.de
Heiko Schinke mdqac@biochemtech.uni-halle.de
Heiko Schlichting heiko@fu-berlin.de
Helmut Waitzmann Helmut.Waitzmann@web.de
Henrik Bakman hb@csd.uu.se
Hernan Prieto Schmidt hernan@pea.usp.br
Hiroyuki Bessho bsh@grotto.iijnet.or.jp
Holger Teutsch holger@hotbso.rhein-main.de
Hugh Secker-Walker hugh@ear.mit.edu
Hunyue Yau hunyue.yau@picksys.com
Ian Jackson ijackson@gnu.ai.mit.edu
Ian Jackson ijackson@gnu.org
Ian Lance Taylor ian@cygnus.com
Ian T. Zimmerman itz@crl.com
Ian Turner ian@zmanda.com
Indra Singhal indra@synoptics.com
J. Dean Brock brock@cs.unca.edu
J.J. Bailey jjb@jagware.bcc.com
@@ -196,11 +215,14 @@ Jan Djarv jan.djarv@mbox200.swipnet.se
Janice Burton r06a165@bcc25.kodak.com
Janne Snabb snabb@niksula.hut.fi
Jason R. Mastaler jason@webmaster.net
Jay Fenlason hack@gnu.ai.mit.edu
Jason Armistead Jason.Armistead@otis.com
Jay Fenlason hack@gnu.org
Jean-Louis Martineau martineau@zmanda.com
Jean-Michel Soenen soenen@lectra.fr
Jean-Ph. Martin-Flatin syj@ecmwf.int
Jean-loup Gailly jloup@chorus.fr
Jean-Loup Gailly jloup@chorus.fr
Jeff Moskow jeff@rtr.com
Jean-Ph. Martin-Flatin syj@ecmwf.int
Jean-Pierre Demailly Jean-Pierre.Demailly@ujf-grenoble.fr
Jeff Prothero jsp@betz.biostr.washington.edu
Jeff Siegel js@hornet.att.com
Jeff Sorensen sorenj@alumni.rpi.edu
@@ -224,13 +246,16 @@ John David Anglin dave@hiauly1.hia.nrc.ca
John Gilmore gnu@toad.com
John J. Szetela johns@angelo.amd.com
John L. Chmielewski jlc@attmail.com
John L. Males jlmales@yahoo.com
John Oleynick juo@klinzhai.rutgers.edu
John R. Vanderpool fish@daacdev1.stx.com
John Rouillard rouilj@cs.umb.edu
John Thomas McDole john.thomas.mcdole@nagra.com
Jon Lewis jlewis@inorganic5.fdt.net
Jonathan I. Kamens jik@cam.ov.com
Jonathan N. Sherman sysjns@etacrs1.safb.af.mil
Jonathan Thornburg thornbur@theory.physics.ubc.ca
Josef Bauer Josef.Bauer@mchp.siemens.de
Joseph E. Sacco jsacco@ssl.com
Joshua R. Poulson jrp@plaza.ds.adp.com
Joutsiniemi Tommi Il tj75064@cs.tut.fi
@@ -238,15 +263,18 @@ Joy Kendall jak8@world.std.com
Judy Ricker jricker@gdstech.grumman.com
Juha Sarlin juha@tds.kth.se
Jurgen Botz jbotz@orixa.mtholyoke.edu
J<EFBFBD>rgen L<>ters jlueters@t-online.de
J<EFBFBD>rgen Reiss reiss@psychologie.uni-wuerzburg.de
Jyh-Shyang Wang erik@vsp.ee.nctu.edu.tw
J<EFBFBD>rg Weule weule@cs.uni-duesseldorf.de
J<EFBFBD>rgen H<>gg Jorgen.Hagg@axis.se
Jörg Schilling schilling@fokus.fraunhofer.de
Jörg Weule weule@cs.uni-duesseldorf.de
Jörg Weilbier gnu@weilbier.net
Jörgen Hågg Jorgen.Hagg@axis.se
Jörgen Weigert jw@suse.de
Jürgen Lüters jlueters@t-online.de
Jürgen Reiss reiss@psychologie.uni-wuerzburg.de
Kai Petzke wpp@marie.physik.tu-berlin.de
Kai Schlichting kai@computel.com
Karl Berry karl@cs.umb.edu
Karl Heuer kwzh@gnu.ai.mit.edu
Karl Heuer kwzh@gnu.org
Karl Vogel vogelke@c-17igp.wpafb.af.mil
Karlos Z. Smith kazen@viptx.net
Karsten Thygesen karthy@kom.auc.dk
@@ -264,12 +292,16 @@ Konno Hiroharu konno@pac.co.jp
Kurt Jaeger pi@lf.net
Larry Creech lcreech@lonestar.rcclub.org
Larry Schwimmer rosebud@cyclone.stanford.edu
Lasse Collin lasse.collin@tukaani.org
Laurent Caillat-Vallet caillat@noe.lyon.cemagref.fr
Laurent Sainte-Marthe smarthe@genethon.fr
Leland Lucius llucius@tiny.net
Les Mikesell les@mcs.com
Loren J. Rittle rittle@comm.mot.com
Lo<EFBFBD>c Prylli Loic.Prylli@lip.ens-lyon.fr
Loïc Prylli Loic.Prylli@lip.ens-lyon.fr
Luke Mewburn lukem@connect.com.au
Machael Stone mstone@cs.loyola.edu
Mads Martin Joergensen mmj@suse.de
Manfred Weichel Manfred.Weichel@mch.sni.de
Manuel Munier Manuel.Munier@loria.fr
Marc Boucher marc@cam.org
@@ -283,8 +315,9 @@ Mark Kollert Mark.Kollert@oi42.kwu.siemens.de
Mark W. Eichin eichin@cygnus.com
Markus Kuhn mskuhn@cip.informatik.uni-erlangen.de
Martin Bellenberg sunsoft@ifm.uni-hamburg.de
Martin Goik goma0002@fh-karlsruhe.de
Martin Goik goik@HDM-Stuttgart.de
Martin Mares mj@k332.feld.cvut.cz
Martin Simmons ZYHYLCRMZPRP@spammotel.com
Marty Leisner leisner@eso.mc.xerox.com
Massimo Dal Zotto dz@cs.unitn.it
Mats Lofkvist d87-mal@nada.kth.se
@@ -293,7 +326,8 @@ Matthew J. D'Errico doc@deathstar.lis.cch.com
Matti Aarnio mea@utu.fi
Max Hailperin max@nic.gac.edu
Maxime Taksar mmt@redbrick.com
Melissa Weisshaus melissa@gnu.ai.mit.edu
Melissa O'Neill oneill@cs.sfu.ca
Melissa Weisshaus melissa@gnu.org
Michael Dietrich mdt@is.in-berlin.de
Michael Ellis bosun@aquarius.seaoar.uvic.ca
Michael Giddings giddings@whitewater.chem.wisc.edu
@@ -317,11 +351,12 @@ Mike Walker M.D.Walker@larc.nasa.gov
Milan Hodoscek milan@kihp6.ki.si
Minh Tran-Le tranle@intellicorp.com
Mitsuaki Masuhara masuhara@mcprv.mec.mei.co.jp
Nate Eldredge nate@cs.hmc.edu
Neil Faulks neil@dcs.kcl.ac.uk
Neil Jerram nj104@cus.cam.ac.uk
Nelson H.F. Beebe beebe@math.utah.edu
Nick Barron nikb@cix.compulink.co.uk
Noah Friedman friedman@prep.ai.mit.edu
Noah Friedman friedman@gnu.org
Noel Cragg noel@red-bean.com
Norbert Kiesel norbert@rwthi3.informatik.rwth-aachen.de
Olaf Schlueter olaf@toppoint.de
@@ -354,8 +389,11 @@ Piercarlo Grandi piercarl@sabi.demon.co.uk
Pierce Cantrell cantrell@ee.tamu.edu
R. Kent Dybvig dyb@cadence.bloomington.in.us
R. Scott Butler butler@prism.es.dupont.com
Rainer Orth ro@thp.uni-koeln.de
Rainer Orth ro@TechFak.Uni-Bielefeld.DE
Ralf Wildenhues Ralf.Wildenhues@gmx.de
Ralf S. Engelschall rse@engelschall.com
Ralf Suckow suckow@contrib.de
Ralph Corderoy ralph@inputplus.co.uk
Ralph Schleicher rs@purple.ul.bawue.de
Randy Bias randyb@edge.edge.net
Ray Dassen jdassen@wi.leidenuniv.nl
@@ -363,11 +401,11 @@ Reuben J. Ravago reuben@asti.dost.gov.ph
Reuben Sumner rasumner@undergrad.math.uwaterloo.ca
Ricardo Marek ricky@ornet.co.il
Richard Deal deal@xi.cs.fsu.edu
Richard J. Kettlewell richard@elmail.co.uk
Richard J. Kettlewell rjk@greenend.org.uk
Richard Lloyd R.K.Lloyd@csc.liv.ac.uk
Richard O'Neill richard@nexus.vnus.bc.ca
Richard Sims rbs@acs.bu.edu
Richard Stallman rms@gnu.ai.mit.edu
Richard Stallman rms@gnu.org
Richard Westerik richardw@bssi.nl
Rick Emerson rick@ssg.com
Rob Parry rparry@hydrolab.arsusda.gov
@@ -386,18 +424,18 @@ Rod Buchanan rod.buchanan@kratos.co.uk
Rod Thompson rodt@synopsys.com
Roderich Schupp roderich@syntec.m.eunet.de
Rodney Brown RBrown@cocam.com.au
Roland McGrath roland@gnu.ai.mit.edu
Roland McGrath roland@gnu.org
Roland Schemers III schemers@vela.acs.oakland.edu
Rolf Niepraschk niepraschk@chbrb.berlin.ptb.de
Roman Gollent roman@portal.stwing.upenn.edu
Roman Czyborra czyborra@cs.tu-berlin.de
Roman Gollent roman@portal.stwing.upenn.edu
Ron Guilmette rfg@netcom.com
Roy Marantz marantz@nbcs.rutgers.edu
Russ Evans e_gs18@ub.nmh.ac.uk
Russell Cattelan cattelan@thebarn.com
Ryutaro Susukita susukita@pn.scphys.kyoto-u.ac.jp
Sam Richards sam@blueskyprod.com
Sakai Kiyotaka ksakai@netwk.ntt-at.co.jp
Sam Richards sam@blueskyprod.com
Santiago Vila Doncel sanvila@unex.es
Sarah Quady squady@warp10.keck.hawaii.edu
Saul Lubkin lubkin@cs.rochester.edu
@@ -410,9 +448,10 @@ Serge Granik serge@euler.berkeley.edu
Seth Robertson seth@ctr.columbia.edu
Sherwood Botsford sherwood@space.ualberta.ca
Simon Wright simon.j.wright@gecm.com
Sisira Jayasinghe sisira.jayasinghe@sdrc.com
Skip Montanaro skip@automatrix.com
Simon Wright simon@pogner.demon.co.uk
Sisira Jayasinghe sisira.jayasinghe@sdrc.com
Skip Montanaro skip@mojam.com http://www.musi-cal.com/~skip/
Solar Designer solar@openwall.com
Stefan Skoglund sp2stes1@ida.his.se
Steffen Stempel stempel@ira.uka.de
Stephen Gildea gildea@intouchsys.com
@@ -421,13 +460,14 @@ Stephen Saroff saroff@msc.edu
Stuart Kemp skemp@bmc.com
Stuart Poulin stuart@indsys.com
Sven Verdoolaege skimo@breughel.ufsia.ac.be
Sylvain ROUGIER un@grolier.fr
Sylvain Rougier un@grolier.fr
Tarang Kumar Patel mombasa@ptolemy.arc.nasa.gov
Ted Rule Ted_Rule@flextech.co.uk
The King elvis@gnu.ai.mit.edu
Thomas Bushnell n/BSG thomas@gnu.ai.mit.edu
Thomas K<EFBFBD>nig Thomas.Koenig@ciw.uni-karlsruhe.de
The King elvis@gnu.org
Thomas metaf4@users.askja.de
Thomas Bushnell n/BSG thomas@gnu.org
Thomas Krebs krebs@faps.uni-erlangen.de
Thomas König Thomas.Koenig@ciw.uni-karlsruhe.de
Thomas M. Browder Jr. browder@use1.eglin.af.mil
Thomas Priesner priesner@flo.sh.bosch.de
Thomas Waas waas@echild.aiss.de
@@ -440,37 +480,45 @@ Tim P. Starrin noid@cyborg.larc.nasa.gov
Tim Ramsey tar@ksu.ksu.edu
Tim Rylance tkr@puffball.demon.co.uk
Tim Towers tzt@uniplex.co.uk
Timothy J. Lee timlee@netcom.com
Timothy Fossum fossum@cs.uwp.edu
Timothy J. Lee timlee@netcom.com
Tito Flagella tito@di.unipi.it
Todd Vierling tv@duh.org
Tom Popovitch tpop@informix.com
Tom Quinn trq@astro.washington.edu
Tom Tromey tromey@drip.colorado.edu
Tor Lillqvist tml@hemuli.tte.vtt.fi
Torbjorn Granlund tege@sics.se
Torkel Hasle torkel@bibsyst.no
Torsten Lull tlupi@gppc.de
Toshiaki Nishi toshi@sss.osa.sharp.co.jp
Travis L. Priest T.L.Priest@larc.nasa.gov
Troy Rudolph rudtr01@cai.com
Tsutomu Yamada tsutomu@sra.co.jp
Ulrich Drepper drepper@gnu.ai.mit.edu
Ulrich Drepper drepper@gnu.org
Van Snyder vsnyder@math.jpl.nasa.gov
Vic Abell abe@cc.purdue.edu
Victor J. Griswold vgris@aironet.com
Ville Herva v@iki.fi
Vince Del Vecchio vdelvecc@inmet.com
W. Phillip Moore wpm@morgan.com
Warner Losh imp@boulder.parcplace.com
Warren Dodge warrend@sptekwv3.wv.tek.com
Wayne Christopher wayne@icemcfd.com
Werner Almesberger werner.almesberger@lrc.di.epfl.ch
William Bader wbader@pluto.csee.lehigh.edu
William Bader william@nscs.fast.net
William J. Eaton wje@hoffman.rstnu.bcm.tmc.edu
William Kucharski kucharsk@netcom.com
Wlodzimierz Jan Martin wjm@pg.gda.pl
Wojciech Polak polak@gnu.org
Wolfgang Rupprecht wolfgang@wsrcc.com
Wolfram Gloger Wolfram.Gloger@dent.med.uni-muenchen.de
Wolfram Kleff bugreport@wkleff.intergenia.de
Wolfram Wagner ww@mpi-sb.mpg.de
Yasushi Suzudo ysuzudo@mail.asiandevbank.org
Włodzimierz Jan Martin wjm@pg.gda.pl
Yasushi Suzudo SGR00413@niftyserve.or.jp
Yu-Min Liang min@taz.ho.att.com
maximum entropy entropy@zippy.bernstein.com
;;;; Local Variables:
;;;; mode: Fundamental
;;;; coding: utf-8
;;;; End:

74
TODO
View File

@@ -1,5 +1,71 @@
From: Roesinger Eric <ROESINGE@tce.com>
Date: Sat, 28 Jul 2001 18:43:43 -0500
Suggestions for improving GNU tar.
It would be useful to be able to use '--remove-files' with '--diff',
to remove all files that compare successfully, when verifying a backup.
* <45BEC0DB.8040903@unix-beratung.de>
* Incorporate fixes from major distributions, e.g., Debian GNU/Linux.
* Add support for restoring file time stamps to sub-second resolution,
if the file system supports this.
* Add support for restoring the attributes of symbolic links, for
OSes like FreeBSD that have the lutimes and lchmod functions.
* --append should bail out if the two archives are of different types.
* Add support for a 'pax' command that conforms to POSIX 1003.1-2001.
This would unify paxutils with tar.
* Interoperate better with Joerg Schilling's star implementation.
* Add an option to remove files that compare successfully.
From: Roesinger Eric <ROESINGE@tce.com>
Date: Sat, 28 Jul 2001 18:43:43 -0500
It would be useful to be able to use '--remove-files' with '--diff',
to remove all files that compare successfully, when verifying a backup.
* Add tests for the new functonality.
* Consider this:
From: Dennis Pund
Subject: TAR suggestion...
Date: Wed, 1 May 2002 18:26:36 -0500 (EST)
What I would like to do is:
foo my.tar.gz | tar -xzOf - | tar -cMf - -L 650000 - | bar
where 'foo' is a program that retrieves the archive and streams it
to stdout and bar is a program that streams the stdin to CDR.
(http://mail.gnu.org/archive/html/bug-gnu-utils/2002-05/msg00022.html)
* Copyright notice
Copyright (C) 2003, 2004, 2007 Free Software Foundation, Inc.
This file is part of GNU tar.
GNU tar is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
GNU tar is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with tar; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
Local variables:
mode: outline
paragraph-separate: "[ ]*$"
end:

653
bootstrap Executable file
View File

@@ -0,0 +1,653 @@
#! /bin/sh
# Bootstrap this package from CVS.
# Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3, or (at your option)
# any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.
# Written by Paul Eggert and Sergey Poznyakoff.
nl='
'
# Ensure file names are sorted consistently across platforms.
# Also, ensure diagnostics are in English, e.g., "wget --help" below.
LC_ALL=C
export LC_ALL
usage() {
echo >&2 "\
Usage: $0 [OPTION]...
Bootstrap this package from the checked-out sources.
Options:
--paxutils-srcdir=DIRNAME Specify the local directory where paxutils
sources reside. Use this if you already
have paxutils sources on your machine, and
do not want to waste your bandwidth dowloading
them again.
--gnulib-srcdir=DIRNAME Specify the local directory where gnulib
sources reside. Use this if you already
have gnulib sources on your machine, and
do not want to waste your bandwidth dowloading
them again.
--copy Copy files instead of creating symbolic links.
--force Attempt to bootstrap even if the sources seem
not to have been checked out.
--skip-po Do not download po files.
--update-po Update po files and exit.
--cvs-user=USERNAME Set the CVS username to be used when accessing
the paxutils repository.
If the file bootstrap.conf exists in the current working directory, its
contents are read as shell variables to configure the bootstrap.
Local defaults can be provided by placing the file \`.bootstrap' in the
current working directory. The file is read after bootstrap.conf, comments
and empty lines are removed, shell variables expanded and the result is
prepended to the command line options.
Running without arguments will suffice in most cases.
"
}
checkout() {
if [ ! -d $1 ]; then
echo "$0: getting $1 files..."
case $1 in
paxutils)
case ${CVS_AUTH-pserver} in
pserver)
CVS_PREFIX=':pserver:anonymous@';;
ssh)
CVS_PREFIX="$CVS_USER${CVS_USER+@}";;
*)
echo "$0: $CVS_AUTH: Unknown CVS access method" >&2
exit 1;;
esac
case $CVS_RSH in
'') CVS_RSH=ssh; export CVS_RSH;;
esac
CVSURL=${CVS_PREFIX}cvs.savannah.gnu.org:/cvsroot/"$1"
;;
gnulib)
CVSURL=:pserver:anonymous@pserver.git.sv.gnu.org:/gnulib.git
;;
esac
trap "cleanup $1" 1 2 13 15
cvs -z3 -q -d $CVSURL co $1 || cleanup $1
trap - 1 2 13 15
fi
}
cleanup() {
status=$?
rm -fr $1
exit $status
}
# Configuration.
# List of gnulib modules needed.
gnulib_modules=
# Any gnulib files needed that are not in modules.
gnulib_files=
# The command to download all .po files for a specified domain into
# a specified directory. Fill in the first %s is the domain name, and
# the second with the destination directory. Use rsync's -L and -r
# options because the latest/%s directory and the .po files within are
# all symlinks.
po_download_command_format=\
"rsync -Lrtvz 'translationproject.org::tp/latest/%s/' '%s'"
extract_package_name='
/^AC_INIT(/{
/.*,.*,.*,/{
s///
s/[][]//g
p
q
}
s/AC_INIT(\[*//
s/]*,.*//
s/^GNU //
y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
s/[^A-Za-z0-9_]/-/g
p
}
'
package=`sed -n "$extract_package_name" configure.ac` || exit
# Extra files from gnulib, which override files from other sources.
gnulib_extra_files='
build-aux/announce-gen
build-aux/install-sh
build-aux/missing
build-aux/mdate-sh
build-aux/texinfo.tex
build-aux/depcomp
build-aux/config.guess
build-aux/config.sub
doc/INSTALL
'
# Other locale categories that need message catalogs.
EXTRA_LOCALE_CATEGORIES=
# Additional xgettext options to use. Use "\\\newline" to break lines.
XGETTEXT_OPTIONS='\\\
--flag=_:1:pass-c-format\\\
--flag=N_:1:pass-c-format\\\
--flag=error:3:c-format --flag=error_at_line:5:c-format\\\
'
# Files we don't want to import.
excluded_files=
# File that should exist in the top directory of a checked out hierarchy,
# but not in a distribution tarball.
CVS_only_file=README-cvs
# Whether to use copies instead of symlinks.
copy=false
# Override the default configuration, if necessary.
test -r bootstrap.conf && . ./bootstrap.conf
# Read local configuration file
if [ -r .bootstrap ]; then
echo "$0: Reading configuration file .bootstrap"
eval set -- "`sed 's/#.*$//;/^$/d' .bootstrap | tr '\n' ' '` $*"
fi
# Translate configuration into internal form.
# Parse options.
for option
do
case $option in
--help)
usage
exit;;
--paxutils-srcdir=*)
PAXUTILS_SRCDIR=`expr "$option" : '--paxutils-srcdir=\(.*\)'`;;
--gnulib-srcdir=*)
GNULIB_SRCDIR=`expr "$option" : '--gnulib-srcdir=\(.*\)'`;;
--cvs-user=*)
CVS_USER=`expr "$option" : '--cvs-user=\(.*\)'`;;
--skip-po | --no-po) # --no-po is for compatibility with 'tar' tradition.
DOWNLOAD_PO=skip;;
--update-po=*)
DOWNLOAD_PO=`expr "$option" : '--update-po=\(.*\)'`;;
--update-po)
DOWNLOAD_PO=only;;
--force)
CVS_only_file=;;
--copy)
copy=true;;
*)
echo >&2 "$0: $option: unknown option"
exit 1;;
esac
done
if test -n "$CVS_only_file" && test ! -r "$CVS_only_file"; then
echo "$0: Bootstrapping from a non-checked-out distribution is risky." >&2
exit 1
fi
echo "$0: Bootstrapping CVS $package..."
# Get translations.
download_po_files() {
subdir=$1
domain=$2
echo "$0: getting translations into $subdir for $domain..."
cmd=`printf "$po_download_command_format" "$domain" "$subdir"`
eval "$cmd"
}
# Download .po files to $po_dir/.reference and copy only the new
# or modified ones into $po_dir. Also update $po_dir/LINGUAS.
update_po_files() {
# Directory containing primary .po files.
# Overwrite them only when we're sure a .po file is new.
po_dir=$1
domain=$2
# Download *.po files into this dir.
# Usually contains *.s1 checksum files.
ref_po_dir="$po_dir/.reference"
test -d $ref_po_dir || mkdir $ref_po_dir || return
download_po_files $ref_po_dir $domain \
&& ls "$ref_po_dir"/*.po 2>/dev/null |
sed 's|.*/||; s|\.po$||' > "$po_dir/LINGUAS"
langs=`cd $ref_po_dir && echo *.po|sed 's/\.po//g'`
test "$langs" = '*' && langs=x
for po in `cd $ref_po_dir && echo *.po|sed 's/\.po//g'`; do
case $po in x) continue;; esac
new_po="$ref_po_dir/$po.po"
cksum_file="$ref_po_dir/$po.s1"
if ! test -f "$cksum_file" ||
! test -f "$po_dir/$po.po" ||
! sha1sum -c --status "$cksum_file" < "$new_po" > /dev/null; then
echo "updated $po_dir/$po.po..."
cp "$new_po" "$po_dir/$po.po" && sha1sum < "$new_po" > "$cksum_file"
fi
done
}
case $DOWNLOAD_PO in
'skip')
;;
'')
if test -d po; then
update_po_files po $package || exit
fi
;;
'only')
if test -d po; then
update_po_files po $package || exit
fi
exit
;;
esac
# Get paxutils files.
case ${PAXUTILS_SRCDIR--} in
-) checkout paxutils
PAXUTILS_SRCDIR=paxutils
esac
if [ -r $PAXUTILS_SRCDIR/gnulib.modules ]; then
gnulib_modules=`
(echo "$gnulib_modules"; grep '^[^#]' $PAXUTILS_SRCDIR/gnulib.modules) |
sort -u
`
fi
ignore_file_list=
cleanup_ifl() {
test -n "$ignore_file_list" && rm -f $ignore_file_list
}
trap 'cleanup_ifl' 1 2 3 15
# ignorefile DIR FILE
# add FILE to the temporary ignorelist in the directory DIR
ignorefile() {
file=$1/.ignore.$$
echo "$2" >> $file
if `echo $ignore_list | grep -qv $file`; then
ignore_file_list="$ignore_file_list
$file"
fi
}
# copy_files srcdir dstdir
copy_files() {
for file in `cat $1/DISTFILES`
do
case $file in
"#*") continue;;
esac
dst=`echo $file | sed 's^.*/^^'`
if [ $# -eq 3 ]; then
case $dst in
${3}*) ;;
*) dst=${3}$dst;;
esac
fi
echo "$0: Copying file $1/$file to $2/$dst"
cp -p $1/$file $2/$dst
ignorefile $2 $dst
done
}
# Get gnulib files.
case ${GNULIB_SRCDIR--} in
-)
checkout gnulib
GNULIB_SRCDIR=gnulib
esac
gnulib_tool=$GNULIB_SRCDIR/gnulib-tool
<$gnulib_tool || exit
ensure_dir_exists()
{
d=`dirname $dst`
test -d "$d" || mkdir -p -- "$d"
}
symlink_to_gnulib()
{
src=$GNULIB_SRCDIR/$1
dst=${2-$1}
test -f "$src" && {
if $copy; then
{
test ! -h "$dst" || {
echo "$0: rm -f $dst" &&
rm -f "$dst"
}
} &&
test -f "$dst" &&
cmp -s "$src" "$dst" || {
echo "$0: cp -fp $src $dst" &&
ensure_dir_exists $dst &&
cp -fp "$src" "$dst"
}
else
test -h "$dst" &&
src_ls=`ls -diL "$src" 2>/dev/null` && set $src_ls && src_i=$1 &&
dst_ls=`ls -diL "$dst" 2>/dev/null` && set $dst_ls && dst_i=$1 &&
test "$src_i" = "$dst_i" || {
dot_dots=
case $src in
/*) ;;
*)
case /$dst/ in
*//* | */../* | */./* | /*/*/*/*/*/)
echo >&2 "$0: invalid symlink calculation: $src -> $dst"
exit 1;;
/*/*/*/*/) dot_dots=../../../;;
/*/*/*/) dot_dots=../../;;
/*/*/) dot_dots=../;;
esac;;
esac
echo "$0: ln -fs $dot_dots$src $dst" &&
ensure_dir_exists $dst &&
ln -fs "$dot_dots$src" "$dst"
}
fi
}
}
cp_mark_as_generated()
{
cp_src=$1
cp_dst=$2
if cmp -s "$cp_src" "$GNULIB_SRCDIR/$cp_dst"; then
symlink_to_gnulib "$cp_dst"
else
case $cp_dst in
*.[ch]) c1='/* '; c2=' */';;
*.texi) c1='@c '; c2= ;;
*.m4|*/Make*|Make*) c1='# ' ; c2= ;;
*) c1= ; c2= ;;
esac
if test -z "$c1"; then
cmp -s "$cp_src" "$cp_dst" || {
echo "$0: cp -f $cp_src $cp_dst" &&
cp -f "$cp_src" "$cp_dst"
}
else
# Copy the file first to get proper permissions if it
# doesn't already exist. Then overwrite the copy.
cp "$cp_src" "$cp_dst-t" &&
(
echo "$c1-*- buffer-read-only: t -*- vi: set ro:$c2" &&
echo "${c1}DO NOT EDIT! GENERATED AUTOMATICALLY!$c2" &&
cat "$cp_src"
) > $cp_dst-t &&
if cmp -s "$cp_dst-t" "$cp_dst"; then
rm -f "$cp_dst-t"
else
echo "$0: cp $cp_src $cp_dst # with edits" &&
mv -f "$cp_dst-t" "$cp_dst"
fi
fi
fi
}
version_controlled_file() {
dir=$1
file=$2
found=no
if test -d CVS; then
grep -F "/$file/" $dir/CVS/Entries 2>/dev/null |
grep '^/[^/]*/[0-9]' > /dev/null && found=yes
elif test -d .git; then
git-rm -n "$dir/$file" > /dev/null 2>&1 && found=yes
else
echo "$0: no version control for $dir/$file?" >&2
fi
test $found = yes
}
slurp() {
for dir in . `(cd $1 && find * -type d -print)`; do
copied=
sep=
for file in `ls $1/$dir`; do
test -d $1/$dir/$file && continue
for excluded_file in $excluded_files; do
test "$dir/$file" = "$excluded_file" && continue 2
done
if test $file = Makefile.am; then
copied=$copied${sep}gnulib.mk; sep=$nl
remove_intl='/^[^#].*\/intl/s/^/#/;'"s,/$bt,,g"
sed "$remove_intl" $1/$dir/$file | cmp -s - $dir/gnulib.mk || {
echo "$0: Copying $1/$dir/$file to $dir/gnulib.mk ..." &&
rm -f $dir/gnulib.mk &&
sed "$remove_intl" $1/$dir/$file >$dir/gnulib.mk
}
elif { test "${2+set}" = set && test -r $2/$dir/$file; } ||
version_controlled_file $dir $file; then
echo "$0: $dir/$file overrides $1/$dir/$file"
else
copied=$copied$sep$file; sep=$nl
if test $file = gettext.m4; then
echo "$0: patching m4/gettext.m4 to remove need for intl/* ..."
rm -f $dir/$file
sed '
/^AC_DEFUN(\[AM_INTL_SUBDIR],/,/^]/c\
AC_DEFUN([AM_INTL_SUBDIR], [
/^AC_DEFUN(\[gt_INTL_SUBDIR_CORE],/,/^]/c\
AC_DEFUN([gt_INTL_SUBDIR_CORE], [])
$a\
AC_DEFUN([gl_LOCK_EARLY], [])
' $1/$dir/$file >$dir/$file
else
cp_mark_as_generated $1/$dir/$file $dir/$file
fi
fi || exit
done
if test -n "$copied"; then
copied="Makefile
Makefile.in
$copied"
if test -d CVS; then
dot_ig=.cvsignore
else
dor_ig=.gitignore
fi
ig=$dir/$dot_ig
if [ -f $dir/.ignore.$$ ]; then
tfile=$dir/.ignore.$$
else
tfile=
fi
if test -f $ig; then
echo "$copied" | sort -u - $ig | cmp -s - $ig ||
echo "$copied" | sort -u - $ig $tfile -o $ig
else
copied="$dot_ig
$copied"
if [ "$dir" = "po" ]; then
copied="LINGUAS
Makevars
POTFILES
*.mo
*.gmo
*.po
remove-potcdate.sed
stamp-po
$package.pot
$copied"
fi
echo "$copied" | sort -u - $tfile -o $ig
fi || exit
fi
done
}
# Create boot temporary directories to import from gnulib and gettext.
bt='.#bootmp'
bt2=${bt}2
rm -fr $bt $bt2 &&
mkdir $bt $bt2 || exit
# Import from gnulib.
test -d build-aux || {
echo "$0: mkdir build-aux ..." &&
mkdir build-aux
} || exit
gnulib_tool_options="\
--import\
--no-changelog\
--aux-dir $bt/build-aux\
--doc-base $bt/doc\
--lib lib$package\
--m4-base $bt/m4/\
--source-base $bt/lib/\
--tests-base $bt/tests\
--local-dir gl\
"
echo "$0: $gnulib_tool $gnulib_tool_options --import ..."
$gnulib_tool $gnulib_tool_options --import $gnulib_modules &&
slurp $bt || exit
for file in $gnulib_files; do
symlink_to_gnulib $file || exit
done
# Import from gettext.
echo "$0: (cd $bt2; autopoint) ..."
cp configure.ac $bt2 &&
(cd $bt2 && autopoint && rm configure.ac) &&
slurp $bt2 $bt || exit
rm -fr $bt $bt2 || exit
# Import from paxutils
copy_files ${PAXUTILS_SRCDIR}/m4 m4
echo "$0: Creating m4/paxutils.m4"
(echo "# This file is generated automatically. Please, do not edit."
echo "#"
echo "AC_DEFUN([${package}_PAXUTILS],["
cat ${PAXUTILS_SRCDIR}/m4/DISTFILES | sed '/^#/d;s/\(.*\)\.m4/pu_\1/' | tr a-z A-Z
echo "])") > ./m4/paxutils.m4
ignorefile m4 paxutils.m4
if [ -d rmt ]; then
:
else
mkdir rmt
fi
for dir in doc rmt lib tests
do
copy_files ${PAXUTILS_SRCDIR}/$dir $dir
done
copy_files ${PAXUTILS_SRCDIR}/paxlib lib pax
# Reconfigure, getting other files.
for command in \
'aclocal --force -I m4' \
'autoconf --force' \
'autoheader --force' \
'automake --add-missing --copy --force-missing';
do
echo "$0: $command ..."
$command || exit
done
# Get some extra files from gnulib, overriding existing files.
for file in $gnulib_extra_files; do
case $file in
*/INSTALL) dst=INSTALL;;
*) dst=$file;;
esac
symlink_to_gnulib $file $dst || exit
done
# Create gettext configuration.
echo "$0: Creating po/Makevars from po/Makevars.template ..."
rm -f po/Makevars
sed '
/^EXTRA_LOCALE_CATEGORIES *=/s/=.*/= '"$EXTRA_LOCALE_CATEGORIES"'/
/^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
/^XGETTEXT_OPTIONS *=/{
s/$/ \\/
a\
'"$XGETTEXT_OPTIONS"' $${end_of_xgettext_options+}
}
' po/Makevars.template >po/Makevars
if test -d runtime-po; then
# Similarly for runtime-po/Makevars, but not quite the same.
rm -f runtime-po/Makevars
sed '
/^DOMAIN *=.*/s/=.*/= '"$package"'-runtime/
/^subdir *=.*/s/=.*/= runtime-po/
/^MSGID_BUGS_ADDRESS *=/s/=.*/= bug-'"$package"'@gnu.org/
/^XGETTEXT_OPTIONS *=/{
s/$/ \\/
a\
'"$XGETTEXT_OPTIONS_RUNTIME"' $${end_of_xgettext_options+}
}
' <po/Makevars.template >runtime-po/Makevars
# Copy identical files from po to runtime-po.
(cd po && cp -p Makefile.in.in *-quot *.header *.sed *.sin ../runtime-po)
fi
cleanup_ifl
echo "$0: done. Now you can run './configure'."

59
bootstrap.conf Normal file
View File

@@ -0,0 +1,59 @@
# Bootstrap configuration.
# Copyright (C) 2006, 2007 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3, or (at your option)
# any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.
# We don't need these modules, even though gnulib-tool mistakenly
# includes them because of gettext dependencies.
avoided_gnulib_modules='
--avoid=lock
--avoid=size_max
'
# gnulib modules used by this package.
gnulib_modules="$avoided_gnulib_modules
`grep '^[^#]' gnulib.modules`
"
# Additional xgettext options to use. Use "\\\newline" to break lines.
XGETTEXT_OPTIONS=$XGETTEXT_OPTIONS'\\\
--flag=_:1:pass-c-format\\\
--flag=N_:1:pass-c-format\\\
--flag=error:3:c-format --flag=error_at_line:5:c-format\\\
--flag=asnprintf:3:c-format --flag=vasnprintf:3:c-format\\\
--flag=argp_error:2:c-format\\\
--flag=__argp_error:2:c-format\\\
--flag=argp_failure:4:c-format\\\
--flag=__argp_failure:4:c-format\\\
--flag=argp_fmtstream_printf:2:c-format\\\
--flag=__argp_fmtstream_printf:2:c-format\\\
'
# Gettext supplies these files, but we don't need them since
# we don't have an intl subdirectory.
excluded_files='
m4/glibc2.m4
m4/intdiv0.m4
m4/lcmessage.m4
m4/lock.m4
m4/printf-posix.m4
m4/size_max.m4
m4/uintmax_t.m4
m4/ulonglong.m4
m4/visibility.m4
'

View File

@@ -1,153 +1,98 @@
# Configure template for GNU tar.
# Copyright (C) 1991, 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
# Process this file with autoconf to produce a configure script.
AC_INIT(src/tar.c)
AM_CONFIG_HEADER(config.h)
AC_PREREQ(2.12)
AM_INIT_AUTOMAKE(tar, 1.12)
AC_DEFINE(_GNU_SOURCE)
ALL_LINGUAS="de fr it ko nl no pl pt sl sv"
# Copyright (C) 1991, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
# 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3, or (at your option)
# any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.
AC_INIT([GNU tar], [1.20], [bug-tar@gnu.org])
AC_CONFIG_SRCDIR([src/tar.c])
AC_CONFIG_AUX_DIR([build-aux])
AC_CONFIG_HEADERS([config.h:config.hin])
AC_PREREQ([2.60])
AM_INIT_AUTOMAKE([1.9 gnits tar-ustar dist-bzip2 dist-shar std-options])
fp_PROG_ECHO
test $fp_cv_prog_echo_nonl = no \
&& echo 2>&1 "WARNING: \`echo' not powerful enough for \`make check'"
AC_PROG_CC
AC_PROG_GCC_TRADITIONAL
AC_AIX
AC_MINIX
AC_EXEEXT
AC_PROG_RANLIB
AC_PROG_YACC
gl_EARLY
AC_SYS_LARGEFILE
AC_ISC_POSIX
AM_C_PROTOTYPES
AC_C_CONST
AC_C_INLINE
AC_CHECK_SIZEOF(unsigned long, 4)
AC_CHECK_SIZEOF(long long, 0)
AC_CHECK_HEADERS(fcntl.h limits.h linux/fd.h memory.h net/errno.h poll.h \
sgtty.h string.h stropts.h \
sys/buf.h sys/device.h sys/gentape.h sys/inet.h sys/io/trioctl.h sys/ioccom.h \
sys/mtio.h sys/param.h sys/tprintf.h sys/tape.h sys/time.h sys/timeb.h \
sys/wait.h unistd.h)
AC_CHECK_HEADERS_ONCE(fcntl.h linux/fd.h memory.h net/errno.h \
sgtty.h string.h stropts.h \
sys/param.h sys/device.h sys/filio.h sys/gentape.h \
sys/inet.h sys/io/trioctl.h \
sys/mtio.h sys/time.h sys/tprintf.h sys/tape.h \
unistd.h locale.h)
# It seems that that many machines where <utime.h> seems to be
# broken just require something like -D_XXX_SOURCE, where XXX might
# be POSIX, POSIX_C, ALL, HPUX or whatever, depending on the machine.
AC_CHECK_HEADERS([sys/buf.h], [], [],
[#if HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif])
AC_CACHE_CHECK(for utime.h, tar_cv_header_utime_h,
[AC_TRY_COMPILE([
#include <sys/types.h>
#include <utime.h>], [struct utimbuf foo],
tar_cv_header_utime_h=yes, tar_cv_header_utime_h=no)])
test $tar_cv_header_utime_h = yes && AC_DEFINE(HAVE_UTIME_H)
if test $ac_cv_header_sys_mtio_h = yes; then
AC_CACHE_CHECK(for remote tape header files, tar_cv_header_rmt,
[AC_TRY_CPP([
#if HAVE_SGTTY_H
# include <sgtty.h>
#endif
#include <sys/socket.h>],
tar_cv_header_rmt=yes, tar_cv_header_rmt=no)])
test $tar_cv_header_rmt = yes && RMT=rmt
AC_SUBST(RMT)
fi
AC_CACHE_CHECK(for getgrgid declaration, tar_cv_header_getgrgid,
[AC_EGREP_HEADER(getgrgid, grp.h,
tar_cv_header_getgrgid=yes, tar_cv_header_getgrgid=no)])
test $tar_cv_header_getgrgid = yes && AC_DEFINE(HAVE_GETGRGID)
AC_CACHE_CHECK(for getpwuid declaration, tar_cv_header_getpwuid,
[AC_EGREP_HEADER(getpwuid, pwd.h,
tar_cv_header_getpwuid=yes, tar_cv_header_getpwuid=no)])
test $tar_cv_header_getpwuid = yes && AC_DEFINE(HAVE_GETPWUID)
AC_CACHE_CHECK(which ioctl field to test for reversed bytes,
tar_cv_header_mtio_check_field,
[AC_EGREP_HEADER(mt_model, sys/mtio.h,
tar_cv_header_mtio_check_field=mt_model,
tar_cv_header_mtio_check_field=mt_type)])
AC_DEFINE_UNQUOTED(MTIO_CHECK_FIELD, $tar_cv_header_mtio_check_field)
AC_HEADER_SYS_WAIT
AM_STDBOOL_H
AC_HEADER_DIRENT
AC_HEADER_MAJOR
AC_HEADER_STAT
AC_HEADER_STDC
AC_HEADER_TIME
AC_STRUCT_ST_BLKSIZE
AC_STRUCT_ST_BLOCKS
AC_MSG_CHECKING([for st_fstype string in struct stat])
AC_CACHE_VAL(diff_cv_st_fstype_string,
[AC_TRY_COMPILE([#include <sys/types.h>
#include <sys/stat.h>], [struct stat s; s.st_fstype[0] = 'x';],
diff_cv_st_fstype_string=yes,
diff_cv_st_fstype_string=no)])
AC_MSG_RESULT($diff_cv_st_fstype_string)
if test $diff_cv_st_fstype_string = yes; then
AC_DEFINE(HAVE_ST_FSTYPE_STRING, 1,
[Define if struct stat has a char st_fstype[] member.])
fi
AC_TYPE_SIGNAL
AC_TYPE_MODE_T
AC_TYPE_PID_T
AC_TYPE_OFF_T
AC_TYPE_SIZE_T
AC_TYPE_UID_T
AC_CHECK_TYPE(major_t, , AC_DEFINE(major_t, int,
[Type of major device numbers.]))
AC_CHECK_TYPE(minor_t, , AC_DEFINE(minor_t, int,
[Type of minor device numbers.]))
AC_CHECK_TYPE(dev_t, unsigned)
AC_CHECK_TYPE(ino_t, unsigned)
AC_CHECK_FUNCS(fsync ftime getcwd isascii lchown mkfifo nap napms poll \
select strerror strstr usleep)
gt_TYPE_SSIZE_T
AC_CACHE_CHECK(for mknod, tar_cv_func_mknod,
[AC_TRY_LINK([
#include <sys/types.h>
#include <sys/stat.h>],
[mknod (0, 0, 0)],
tar_cv_func_mknod=yes, tar_cv_func_mknod=no)])
test $tar_cv_func_mknod = yes && AC_DEFINE(HAVE_MKNOD)
# gnulib modules
gl_INIT
# paxutils modules
tar_PAXUTILS
# Whenever both -lsocket and -lnsl are needed, it seems to be always the
# case that gethostbyname requires -lnsl. So, check -lnsl first, for it
# to be in LIBS before the setsockopt checks are performed. *However*,
# on SINIX-N 5.43, this is false, and gethostent seems to be a better
# candidate. So, let's use it below instead of gethostbyname, and see.
AC_CHECK_FUNCS(fsync getdtablesize lstat mkfifo readlink symlink setlocale utimes)
AC_CHECK_DECLS([getgrgid],,, [#include <grp.h>])
AC_CHECK_DECLS([getpwuid],,, [#include <pwd.h>])
AC_CHECK_DECLS([time],,, [#include <time.h>])
AC_CHECK_FUNC(gethostent)
if test $ac_cv_func_gethostent = no; then
AC_CHECK_LIB(nsl, gethostent)
fi
AC_CHECK_FUNC(setsockopt)
if test $ac_cv_func_setsockopt = no; then
AC_CHECK_LIB(socket, setsockopt)
fi
AC_FUNC_ALLOCA
AC_FUNC_FNMATCH
test $ac_cv_func_fnmatch_works = yes || LIBOBJS="$LIBOBJS fnmatch.o"
AC_FUNC_VPRINTF
AC_REPLACE_FUNCS(basename dirname execlp ftruncate memset mkdir rename rmdir)
test "$ac_cv_func_strstr" = yes || LIBOBJS="$LIBOBJS strstr.o"
# The 3-argument open happens to go along with the O_* defines, which
# are easier to check for.
AC_CACHE_CHECK(for 3-argument open, tar_cv_func_open3,
[AC_TRY_COMPILE([
#if HAVE_FCNTL_H
# include <fcntl.h>
#else
# include <sys/file.h>
#endif],
[int x = O_RDONLY],
tar_cv_func_open3=yes, tar_cv_func_open3=no)])
if test $tar_cv_func_open3 = no; then
AC_DEFINE(EMUL_OPEN3)
fi
# `union wait' is preferrably avoided. We merely assume below
# that if `int pid;' fails, `union wait pid;' would have worked.
# Directly trying `union wait pid;' is seeking for trouble, as
# some POSIX systems are offering compatibility hacks generating
# ugly diagnostics. Also, on some systems, WEXITSTATUS exists,
# but fails when called on `union wait' variables.
AC_CACHE_CHECK(for union wait, tar_cv_header_union_wait,
[AC_TRY_COMPILE([
#include <sys/types.h>
#if HAVE_SYS_WAIT_H
# include <sys/wait.h>
#endif],
[int status; int pid; pid = wait (&status);],
tar_cv_header_union_wait=no, tar_cv_header_union_wait=yes)])
test $tar_cv_header_union_wait = yes && AC_DEFINE(HAVE_UNION_WAIT)
AC_REPLACE_FUNCS(waitpid)
AC_CACHE_CHECK(for remote shell, tar_cv_path_RSH,
[if test -n "$RSH"; then
@@ -155,22 +100,48 @@ AC_CACHE_CHECK(for remote shell, tar_cv_path_RSH,
else
tar_cv_path_RSH=no
for ac_file in /usr/ucb/rsh /usr/bin/remsh /usr/bin/rsh /usr/bsd/rsh \
/usr/bin/nsh /usr/bin/rcmd
/usr/bin/nsh /usr/bin/rcmd
do
# Prefer a non-symlink rsh to a symlink one, so that binaries built
# on AIX 4.1.4, where /usr/ucb/rsh is a symlink to /usr/bin/rsh
# will run on AIX 4.3.0, which has only /usr/bin/rsh.
if test -f $ac_file; then
tar_cv_path_RSH=$ac_file
break
if (test -h $ac_file) 2>/dev/null; then
test $tar_cv_path_RSH = no && tar_cv_path_RSH=$ac_file
else
tar_cv_path_RSH=$ac_file
break
fi
fi
done
fi])
if test $tar_cv_path_RSH = no; then
AC_CHECK_HEADERS(netdb.h)
else
AC_DEFINE_UNQUOTED(REMOTE_SHELL, "$tar_cv_path_RSH")
AC_DEFINE_UNQUOTED(REMOTE_SHELL, "$tar_cv_path_RSH",
[Define to the full path of your rsh, if any.])
fi
AC_MSG_CHECKING(for default archive format)
AC_ARG_VAR([DEFAULT_ARCHIVE_FORMAT],
[Set the default archive format. Allowed values are: V7, OLDGNU, USTAR, POSIX, GNU. Default is GNU])
if test -z "$DEFAULT_ARCHIVE_FORMAT"; then
DEFAULT_ARCHIVE_FORMAT="GNU"
fi
case $DEFAULT_ARCHIVE_FORMAT in
V7|OLDGNU|USTAR|POSIX|GNU) ;;
*) AC_MSG_ERROR(Invalid format name);;
esac
AC_DEFINE_UNQUOTED(DEFAULT_ARCHIVE_FORMAT, ${DEFAULT_ARCHIVE_FORMAT}_FORMAT,
[By default produce archives of this format])
AC_MSG_RESULT($DEFAULT_ARCHIVE_FORMAT)
AC_MSG_CHECKING(for default archive)
AC_ARG_VAR([DEFAULT_ARCHIVE],
[Set the name of the default archive (default: -)])
if test -z "$DEFAULT_ARCHIVE"; then
DEFAULT_ARCHIVE=-
else
@@ -181,35 +152,97 @@ else
# FIXME: Let DEVICE_PREFIX be configured from the environment.
# FIXME: Rearrange, here.
case $DEFAULT_ARCHIVE in
changequote(, )dnl
*[0-7][lmh])
*[[0-7][lmh]])
AC_DEFINE(DENSITY_LETTER, 1,
[Define to 1 if density may be indicated by [lmh] at end of device.])
device_prefix=`echo $DEFAULT_ARCHIVE | sed 's/[0-7][lmh]$//'`
changequote([, ])dnl
AC_DEFINE_UNQUOTED(DEVICE_PREFIX, "$device_prefix")
AC_DEFINE(DENSITY_LETTER)
;;
changequote(, )dnl
*[0-7])
*[[0-7]])
device_prefix=`echo $DEFAULT_ARCHIVE | sed 's/[0-7]$//'`
changequote([, ])dnl
AC_DEFINE_UNQUOTED(DEVICE_PREFIX, "$device_prefix")
;;
*)
device_prefix=
;;
esac
case "$device_prefix" in
?*)
AC_DEFINE_UNQUOTED(DEVICE_PREFIX, "$device_prefix",
[Define to a string giving the prefix of the default device, without the part specifying the unit and density.])
;;
esac
fi
AC_DEFINE_UNQUOTED(DEFAULT_ARCHIVE, "$DEFAULT_ARCHIVE")
AC_DEFINE_UNQUOTED(DEFAULT_ARCHIVE, "$DEFAULT_ARCHIVE",
[Define to a string giving the full name of the default archive file.])
AC_MSG_RESULT($DEFAULT_ARCHIVE)
AC_ARG_VAR([DEFAULT_BLOCKING],
[Define default blocking factor (default: 20)])
AC_MSG_CHECKING(for default blocking)
DEFAULT_BLOCKING=${DEFAULT_BLOCKING-20}
AC_DEFINE_UNQUOTED(DEFAULT_BLOCKING, $DEFAULT_BLOCKING)
AC_DEFINE_UNQUOTED(DEFAULT_BLOCKING, $DEFAULT_BLOCKING,
[Define to a number giving the default blocking size for archives.])
AC_MSG_RESULT($DEFAULT_BLOCKING)
fp_WITH_INCLUDED_MALLOC
AM_WITH_DMALLOC
AC_MSG_CHECKING(for default quoting style)
AM_GNU_GETTEXT
AC_LINK_FILES($nls_cv_header_libgt, $nls_cv_header_intl)
m4_define([QUOTING_STYLES],dnl
[literal|shell|shell-always|c|escape|locale|clocale])
DEFAULT_QUOTING_STYLE="escape"
AC_ARG_VAR([DEFAULT_QUOTING_STYLE],
[Set the default quoting style. Allowed values are: ] m4_bpatsubst(QUOTING_STYLES,[|], [[, ]]) [. Default is "escape".])
AC_OUTPUT([Makefile doc/Makefile intl/Makefile lib/Makefile po/Makefile.in \
scripts/Makefile src/Makefile tests/Makefile tests/preset],
[sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile])
case $DEFAULT_QUOTING_STYLE in
QUOTING_STYLES) ;;
*) AC_MSG_ERROR(Invalid quoting style);;
esac
AC_MSG_RESULT($DEFAULT_QUOTING_STYLE)
DEFAULT_QUOTING_STYLE=`echo ${DEFAULT_QUOTING_STYLE}|sed 's/-/_/g'`_quoting_style
AC_DEFINE_UNQUOTED(DEFAULT_QUOTING_STYLE, $DEFAULT_QUOTING_STYLE,
[Define to a default quoting style (see lib/quoteargs.c for the list)])
# Iconv
AM_ICONV
AC_CHECK_HEADERS(iconv.h)
AC_CHECK_TYPE(iconv_t,:,
AC_DEFINE(iconv_t, int,
[Conversion descriptor type]),
[
#ifdef HAVE_ICONV_H
# include <iconv.h>
#endif
])
# Gettext.
AM_GNU_GETTEXT([external], [need-formatstring-macros])
AM_GNU_GETTEXT_VERSION([0.16])
# Initialize the test suite.
AC_CONFIG_TESTDIR(tests)
AC_CONFIG_FILES([tests/Makefile tests/atlocal]) # FIXME: tests/preset?
AM_MISSING_PROG([AUTOM4TE], [autom4te])
AC_SUBST(BACKUP_LIBEXEC_SCRIPTS)
AC_SUBST(BACKUP_SBIN_SCRIPTS)
AC_ARG_ENABLE(backup-scripts,
AC_HELP_STRING([--enable-backup-scripts],
[Create and install backup and restore scripts]),
[case $enableval in
yes) BACKUP_LIBEXEC_SCRIPTS='$(BACKUP_LIBEXEC_SCRIPTS_LIST)'
BACKUP_SBIN_SCRIPTS='$(BACKUP_SBIN_SCRIPTS_LIST)'
;;
esac])
AC_SUBST(BACKUP_SED_COND)
if date +%Y-%m-%d 2>/dev/null >&2; then
BACKUP_SED_COND='/^\#ELSE_DATE_FORMAT_OK/,/^\#ENDIF_DATE_FORMAT_OK/d;/^\#IF_DATE_FORMAT_OK/d'
else
BACKUP_SED_COND='/^\#IF_DATE_FORMAT_OK/,/^\#ELSE_DATE_FORMAT_OK/d;/^\#ENDIF_DATE_FORMAT_OK/d'
fi
AC_OUTPUT([Makefile\
doc/Makefile\
lib/Makefile\
po/Makefile.in\
scripts/Makefile\
rmt/Makefile\
src/Makefile])

87
directory Normal file
View File

@@ -0,0 +1,87 @@
%%comments:
Copyright (C) 2004 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2 or
any later version published by the Free Software Foundation; with no
Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
Texts. A copy of the license is included in the file COPYING.
%%name: tar
%%short-description: Creates tar archives
%%full-description:
GNU tar is an archiver that creates and handles file archives in various
formats. You can use tar to create file archives, to extract files from
previously created archives, store additional files, or update or list
files which were already stored.
The program saves many files together into a single tape or disk
archive, and can restore individual files from the archive. It
includes multivolume support, the ability to archive sparse files,
automatic archive compression/decompression, remote archives and
special features that allow 'tar' to be used for incremental and full
backups.
The supported archive formats are: V7 tar, GNU, ustar and POSIX (also
known as pax interchange format). GNU tar is also able to read and
extract 'star' archives.
Tar can direct its output to available devices, files, or other
programs (using pipes); tar can even access remote devices or files
(as archives).
%%category: system, backup
%%license: GPL
%%maintainer: Sergey Poznyakoff <gray@Mirddin.farlep.net>,
Jeff Bailey <jbailey@nisa.net>,
Paul Eggert <eggert@CS.UCLA.EDU>
%%updated: 21 Dec 2004
%%keywords: archive, backup, tar, pax
%%interface: Command line
%%programs: tar, rmt
%%GNU: yes
%%web-page: http://www.gnu.org/software/tar
%%doc: English user reference included
%%doc: English user manual in Texinfo, Dvi, Postscript, HTML, Plaintext is available from http://www.gnu.org/software/tar/manual/tar.html
%%developers:
John Gilmore,
Thomas Bushnell,
Paul Eggert <eggert@twinsun.com>,
Sergey Poznyakoff <gray@Mirddin.farlep.net>
%%contributors: Jay Fenlason,
Joy Kendall,
Francois Pinard <pinard@iro.umontreal.ca>
%%source-tarball: ftp://ftp.gnu.org/pub/gnu/tar/tar-1.15.1.tar.gz
%%source-info: http://savannah.gnu.org/projects/tar
%%repository:
:pserver:anoncvs@subversions.gnu.org:/cvsroot/tar login,
:pserver:anoncvs@subversions.gnu.org:/cvsroot/tar co tar,
http://savannah.gnu.org/cvs/?group=tar,
http://savannah.gnu.org/cgi-bin/viewcvs/tar/tar,
%%source-language: C
%%related-programs: GNU cpio
%%version: 1.15.1 (stable) released on 21 Dec 2004
%%bug-list: bug-tar@gnu.org bug-tar@gnu.org http://mail.gnu.org/mailman/listinfo/bug-tar
%%entry-written-by: Sergey Poznyakoff <gray@gnu.org>

37
doc/.cvsignore Normal file
View File

@@ -0,0 +1,37 @@
*.stamp
Makefile
Makefile.in
genfile.texi
getdate.texi
header.texi
html_chapter
html_mono
html_node
stamp-vti
tar.at
tar.ats
tar.aux
tar.cp
tar.cps
tar.dvi
tar.ex
tar.exs
tar.fn
tar.fns
tar.html
tar.info*
tar.kw
tar.kws
tar.ky
tar.log
tar.op
tar.ops
tar.pdf
tar.pg
tar.pgs
tar.ps
tar.toc
tar.tp
tar.vr
tar.vrs
version.texi

View File

@@ -1,53 +1,144 @@
# Makefile for GNU tar documentation.
# Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
# Copyright (C) 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2003, 2006,
# 2007 Free Software Foundation, Inc.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 3, or (at your option)
## any later version.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
## You should have received a copy of the GNU General Public License
## along with this program; if not, write to the Free Software Foundation,
## Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
AUTOMAKE_OPTIONS = gnits
info_TEXINFOS = tar.texi
EXTRA_DIST = convtexi.pl getdate.texi header.texi
CLEANFILES = tmp-*
tar_TEXINFOS = \
dumpdir.texi\
tar-snapshot-edit.texi\
fdl.texi\
freemanuals.texi\
genfile.texi\
getdate.texi\
header.texi\
intern.texi\
rendition.texi\
snapshot.texi\
sparse.texi\
value.texi
EXTRA_DIST = gendocs_template mastermenu.el texify.sed untabify.el
# The rendering level is anyone of PUBLISH, DISTRIB or PROOF.
# Just call `make dvi RENDITION=PROOF' if you want PROOF rendition.
# Just call `make RENDITION=PROOF [target]' if you want PROOF rendition.
RENDITION = DISTRIB
tar.info: tar.texi getdate.texi header.texi version.texi
@echo "WARNING: \`makeinfo' will not preprocess Texinfo input properly"
@echo " for expanding Texinfo macros, if it comes from a"
@echo " Texinfo distribution which is earlier than version 3.7."
cd $(srcdir) && $(MAKEINFO) -D$(RENDITION) tar.texi
tar.dvi: tar.texi getdate.texi header.texi version.texi
@echo "WARNING: \`makeinfo' will not preprocess Texinfo input properly"
@echo " for expanding Texinfo macros, if it comes from a"
@echo " Texinfo distribution which is earlier than version 3.7."
$(MAKEINFO) -D$(RENDITION) -Etmp-tar.tmp -otmp-tar.info \
-I$(srcdir) tar.texi
rm -f tmp-tar.sed tmp-tar.info*
test $(RENDITION) = DISTRIB \
|| echo >>tmp-tar.sed 's/^@set DISTRIB/@set $(RENDITION)/'
test $(RENDITION) = PUBLISH \
|| echo >>tmp-tar.sed '/^@smallbook/d'
sed -f tmp-tar.sed tmp-tar.tmp > tmp-tar.texi
rm -f tmp-tar.sed tmp-tar.tmp
TEXINPUTS=$(srcdir):$$TEXINPUTS $(TEXI2DVI) tmp-tar.texi
mv tmp-tar.dvi $@
MAKEINFOFLAGS=-D$(RENDITION)
header.texi: $(top_srcdir)/src/tar.h
sed -n '/Archive Format/,/End of Format/p' $(top_srcdir)/src/tar.h \
| expand | sed 's/\([{}]\)/@\1/g' > $(srcdir)/header.texi
sed -f $(srcdir)/texify.sed $(top_srcdir)/src/tar.h \
| expand >$@
master-menu: $(tar_TEXINFOS)
emacs -batch -l mastermenu.el -f make-master-menu $(info_TEXINFOS)
untabify:
emacs -batch -l untabify.el $(info_TEXINFOS) $(tar_TEXINFOS)
final: untabify master-menu
# Checking
check-format:
@if test -n "`cat $(info_TEXINFOS) $(tar_TEXINFOS) | tr -d -c '\t'`"; then \
echo "Sources contain tabs; run make untabify"; \
false; \
fi
check-options:
@ARGP_HELP_FMT='usage-indent=0,short-opt-col=0,long-opt-col=0,\
doc-opt-col=0,opt-doc-col=0,header-col=0,rmargin=1' \
$(top_builddir)/src/tar --usage | \
sed -n 's/^\[--\([^]\=\[]*\).*/\1/p' | sort | uniq > opts.$$$$;\
$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) -E - \
$(info_TEXINFOS) | \
sed -n '/^@macro/,/^@end macro/d;s/@opindex *\([^@,]*\).*/\1/p' \
| sort | uniq > docs.$$$$;\
(echo 'Not documented options:';\
join -v1 opts.$$$$ docs.$$$$;\
echo 'Non-existing options:';\
join -v2 opts.$$$$ docs.$$$$) > report.$$$$;\
rm opts.$$$$ docs.$$$$;\
if [ -n "`sed '1,2d' report.$$$$`" ]; then \
cat report.$$$$;\
rm report.$$$$;\
exit 1;\
fi;\
rm report.$$$$
check-refs:
@for file in $(info_TEXINFOS) $(tar_TEXINFOS); \
do \
sed -e = $$file | \
sed -n 'N;/@FIXME-.*ref/{s/\(^[0-9][0-9]*\).*@FIXME-.*ref{\([^}]*\).*/'$$file':\1: \2/gp}'; \
done > $@-t; \
if [ -s $@-t ]; then \
echo "Unresolved cross-references:"; \
cat $@-t;\
rm $@-t; \
else \
rm -f $@-t; \
fi
check-fixmes:
@for file in $(info_TEXINFOS); \
do \
sed -e = $$file | \
sed -n 'N;/@FIXME{/{s/\(^[0-9][0-9]*\).*@FIXME{\([^}]*\).*/'$$file':\1: \2/gp}'; \
done > $@-t; \
if [ -s $@-t ]; then \
echo "Unresolved FIXMEs:"; \
cat $@-t; \
rm $@-t; \
false; \
else \
rm -f $@-t; \
fi
check-unrevised:
@grep -Hn @UNREVISED $(info_TEXINFOS) > $@-t; \
if [ -s $@-t ]; then \
echo "Unrevised nodes:"; \
cat $@-t; \
rm $@-t; \
false;\
else \
rm $@-t; \
fi
all-check-docs: check-format check-options check-refs check-fixmes check-unrevised
check-docs:
$(MAKE) -k all-check-docs
#
clean-local:
rm -rf manual
GENDOCS=gendocs.sh
TEXI2DVI=texi2dvi -t '@set $(RENDITION)' -E
# Make sure you set TEXINPUTS
# Usual value is:
# /usr/share/texmf/pdftex/plain/misc:/usr/share/texmf/pdftex/config
manual:
TEXINPUTS=$(srcdir):$(top_srcdir)/build-tex:$(TEXINPUTS) \
MAKEINFO="$(MAKEINFO) $(MAKEINFOFLAGS)" \
TEXI2DVI="$(TEXI2DVI) -t @finalout" \
$(GENDOCS) --texi2html tar 'GNU tar manual'

View File

@@ -1,118 +0,0 @@
#!/usr/local/bin/perl -- # -*-Perl-*-
eval "exec /usr/local/bin/perl -S $0 $*"
if 0;
# Copy a Texinfo file, replacing @value's, @FIXME's and other gooddies.
# Copyright <20> 1996 Free Software Foundation, Inc.
# Fran<61>ois Pinard <pinard@iro.umontreal.ca>, 1996.
$_ = <>;
while ($_)
{
if (/^\@c()$/ || /^\@c (.*)/ || /^\@(include .*)/)
{
if ($topseen)
{
print "\@format\n";
print "\@strong{\@\@c} $1\n";
$_ = <>;
while (/\@c (.*)/)
{
print "\@strong{\@\@c} $1\n";
$_ = <>;
}
print "\@end format\n";
}
else
{
$delay .= "\@format\n";
$delay .= "\@strong{\@\@c} $1\n";
$_ = <>;
while (/\@c (.*)/)
{
$delay .= "\@strong{\@\@c} $1\n";
$_ = <>;
}
$delay .= "\@end format\n";
}
}
elsif (/^\@chapter /)
{
print;
# print $delay;
$delay = '';
$topseen = 1;
$_ = <>;
}
elsif (/^\@macro /)
{
$_ = <> while ($_ && ! /^\@end macro/);
$_ = <>;
}
elsif (/^\@set ([^ ]+) (.*)/)
{
$set{$1} = $2;
$_ = <>;
}
elsif (/^\@UNREVISED/)
{
print "\@quotation\n";
print "\@emph{(This message will disappear, once this node is revised.)}\n";
print "\@end quotation\n";
$_ = <>;
}
else
{
while (/\@value{([^\}]*)}/)
{
if (defined $set{$1})
{
$_ = "$`$set{$1}$'";
}
else
{
$_ = "$`\@strong{<UNDEFINED>}$1\@strong{</UNDEFINED>}$'";
}
}
while (/\@FIXME-?([a-z]*)\{/)
{
$tag = $1 eq '' ? 'fixme' : $1;
$tag =~ y/a-z/A-Z/;
print "$`\@strong{<$tag>}";
$_ = $';
$level = 1;
while ($level > 0)
{
if (/([{}])/)
{
if ($1 eq '{')
{
$level++;
print "$`\{";
$_ = $';
}
elsif ($level > 1)
{
$level--;
print "$`\}";
$_ = $';
}
else
{
$level = 0;
print "$`\@strong{</$tag>}";
$_ = $';
}
}
else
{
print;
$_ = <>;
}
}
}
print;
$_ = <>;
}
}
exit 0;

132
doc/dumpdir.texi Normal file
View File

@@ -0,0 +1,132 @@
@c This is part of the paxutils manual.
@c Copyright (C) 2006, 2007 Free Software Foundation, Inc.
@c Written by Sergey Poznyakoff
@c This file is distributed under GFDL 1.1 or any later version
@c published by the Free Software Foundation.
Incremental archives keep information about contents of each
dumped directory in special data blocks called @dfn{dumpdirs}.
Dumpdir is a sequence of entries of the following form:
@smallexample
@var{C} @var{filename} \0
@end smallexample
@noindent
where @var{C} is one of the @dfn{control codes} described below,
@var{filename} is the name of the file @var{C} operates upon, and
@samp{\0} represents a nul character (ASCII 0). The white space
characters were added for readability, real dumpdirs do not contain
them.
Each dumpdir ends with a single nul character.
The following table describes control codes and their meanings:
@table @samp
@item Y
@var{filename} is contained in the archive.
@item N
@var{filename} was present in the directory at the time the archive
was made, yet it was not dumped to the archive, because it had not
changed since the last backup.
@item D
@var{filename} is a directory.
@item R
This code requests renaming of the @var{filename} to the name
specified with the @samp{T} command, that immediately follows it.
@item T
Specify target file name for @samp{R} command (see below).
@item X
Specify @dfn{temporary directory} name for a rename operation (see below).
@end table
Codes @samp{Y}, @samp{N} and @samp{D} require @var{filename} argument
to be a relative file name to the directory this dumpdir describes,
whereas codes @samp{R}, @samp{T} and @samp{X} require their argument
to be an absolute file name.
The three codes @samp{R}, @samp{T} and @samp{X} specify a
@dfn{renaming operation}. In the simplest case it is:
@smallexample
R@file{source}\0T@file{dest}\0
@end smallexample
@noindent
which means ``rename file @file{source} to file @file{dest}''.
However, there are cases that require using a @dfn{temporary
directory}. For example, consider the following scenario:
@enumerate 1
@item
Previous run dumped a directory @file{foo} which contained the
following three directories:
@smallexample
a
b
c
@end smallexample
@item
They were renamed @emph{cyclically}, so that:
@example
@file{a} became @file{b}
@file{b} became @file{c}
@file{c} became @file{a}
@end example
@item
New incremental dump was made.
@end enumerate
This case cannot be handled by three successive renames, since
renaming @file{a} to @file{b} will destroy the existing directory.
To correctly process it, @GNUTAR{} needs a temporary directory, so
it creates the following dumpdir (newlines have been added for
readability):
@smallexample
@group
Xfoo\0
Rfoo/a\0T\0
Rfoo/b\0Tfoo/c\0
Rfoo/c\0Tfoo/a\0
R\0Tfoo/a\0
@end group
@end smallexample
The first command, @samp{Xfoo\0}, instructs the extractor to create a
temporary directory in the directory @file{foo}. Second command,
@samp{Rfoo/aT\0}, says ``rename file @file{foo/a} to the temporary
directory that has just been created'' (empty file name after a
command means use temporary directory). Third and fourth commands
work as usual, and, finally, the last command, @samp{R\0Tfoo/a\0}
tells tar to rename the temporary directory to @file{foo/a}.
The exact placement of a dumpdir in the archive depends on the
archive format (@pxref{Formats}):
@itemize
@item PAX archives
In PAX archives, dumpdir is stored in the extended header of the
corresponding directory, in variable @code{GNU.dumpdir}.
@item GNU and old GNU archives
These formats implement special header type @samp{D}, which is similar
to ustar header @samp{5} (directory), except that it precedes a data
block containing the dumpdir.
@end itemize
@c End of dumpdir.texi

452
doc/fdl.texi Normal file
View File

@@ -0,0 +1,452 @@
@node GNU Free Documentation License
@appendixsec GNU Free Documentation License
@cindex FDL, GNU Free Documentation License
@center Version 1.2, November 2002
@display
Copyright @copyright{} 2000,2001,2002 Free Software Foundation, Inc.
51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@end display
@enumerate 0
@item
PREAMBLE
The purpose of this License is to make a manual, textbook, or other
functional and useful document @dfn{free} in the sense of freedom: to
assure everyone the effective freedom to copy and redistribute it,
with or without modifying it, either commercially or noncommercially.
Secondarily, this License preserves for the author and publisher a way
to get credit for their work, while not being considered responsible
for modifications made by others.
This License is a kind of ``copyleft'', which means that derivative
works of the document must themselves be free in the same sense. It
complements the GNU General Public License, which is a copyleft
license designed for free software.
We have designed this License in order to use it for manuals for free
software, because free software needs free documentation: a free
program should come with manuals providing the same freedoms that the
software does. But this License is not limited to software manuals;
it can be used for any textual work, regardless of subject matter or
whether it is published as a printed book. We recommend this License
principally for works whose purpose is instruction or reference.
@item
APPLICABILITY AND DEFINITIONS
This License applies to any manual or other work, in any medium, that
contains a notice placed by the copyright holder saying it can be
distributed under the terms of this License. Such a notice grants a
world-wide, royalty-free license, unlimited in duration, to use that
work under the conditions stated herein. The ``Document'', below,
refers to any such manual or work. Any member of the public is a
licensee, and is addressed as ``you''. You accept the license if you
copy, modify or distribute the work in a way requiring permission
under copyright law.
A ``Modified Version'' of the Document means any work containing the
Document or a portion of it, either copied verbatim, or with
modifications and/or translated into another language.
A ``Secondary Section'' is a named appendix or a front-matter section
of the Document that deals exclusively with the relationship of the
publishers or authors of the Document to the Document's overall
subject (or to related matters) and contains nothing that could fall
directly within that overall subject. (Thus, if the Document is in
part a textbook of mathematics, a Secondary Section may not explain
any mathematics.) The relationship could be a matter of historical
connection with the subject or with related matters, or of legal,
commercial, philosophical, ethical or political position regarding
them.
The ``Invariant Sections'' are certain Secondary Sections whose titles
are designated, as being those of Invariant Sections, in the notice
that says that the Document is released under this License. If a
section does not fit the above definition of Secondary then it is not
allowed to be designated as Invariant. The Document may contain zero
Invariant Sections. If the Document does not identify any Invariant
Sections then there are none.
The ``Cover Texts'' are certain short passages of text that are listed,
as Front-Cover Texts or Back-Cover Texts, in the notice that says that
the Document is released under this License. A Front-Cover Text may
be at most 5 words, and a Back-Cover Text may be at most 25 words.
A ``Transparent'' copy of the Document means a machine-readable copy,
represented in a format whose specification is available to the
general public, that is suitable for revising the document
straightforwardly with generic text editors or (for images composed of
pixels) generic paint programs or (for drawings) some widely available
drawing editor, and that is suitable for input to text formatters or
for automatic translation to a variety of formats suitable for input
to text formatters. A copy made in an otherwise Transparent file
format whose markup, or absence of markup, has been arranged to thwart
or discourage subsequent modification by readers is not Transparent.
An image format is not Transparent if used for any substantial amount
of text. A copy that is not ``Transparent'' is called ``Opaque''.
Examples of suitable formats for Transparent copies include plain
@sc{ascii} without markup, Texinfo input format, La@TeX{} input
format, @acronym{SGML} or @acronym{XML} using a publicly available
@acronym{DTD}, and standard-conforming simple @acronym{HTML},
PostScript or @acronym{PDF} designed for human modification. Examples
of transparent image formats include @acronym{PNG}, @acronym{XCF} and
@acronym{JPG}. Opaque formats include proprietary formats that can be
read and edited only by proprietary word processors, @acronym{SGML} or
@acronym{XML} for which the @acronym{DTD} and/or processing tools are
not generally available, and the machine-generated @acronym{HTML},
PostScript or @acronym{PDF} produced by some word processors for
output purposes only.
The ``Title Page'' means, for a printed book, the title page itself,
plus such following pages as are needed to hold, legibly, the material
this License requires to appear in the title page. For works in
formats which do not have any title page as such, ``Title Page'' means
the text near the most prominent appearance of the work's title,
preceding the beginning of the body of the text.
A section ``Entitled XYZ'' means a named subunit of the Document whose
title either is precisely XYZ or contains XYZ in parentheses following
text that translates XYZ in another language. (Here XYZ stands for a
specific section name mentioned below, such as ``Acknowledgements'',
``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title''
of such a section when you modify the Document means that it remains a
section ``Entitled XYZ'' according to this definition.
The Document may include Warranty Disclaimers next to the notice which
states that this License applies to the Document. These Warranty
Disclaimers are considered to be included by reference in this
License, but only as regards disclaiming warranties: any other
implication that these Warranty Disclaimers may have is void and has
no effect on the meaning of this License.
@item
VERBATIM COPYING
You may copy and distribute the Document in any medium, either
commercially or noncommercially, provided that this License, the
copyright notices, and the license notice saying this License applies
to the Document are reproduced in all copies, and that you add no other
conditions whatsoever to those of this License. You may not use
technical measures to obstruct or control the reading or further
copying of the copies you make or distribute. However, you may accept
compensation in exchange for copies. If you distribute a large enough
number of copies you must also follow the conditions in section 3.
You may also lend copies, under the same conditions stated above, and
you may publicly display copies.
@item
COPYING IN QUANTITY
If you publish printed copies (or copies in media that commonly have
printed covers) of the Document, numbering more than 100, and the
Document's license notice requires Cover Texts, you must enclose the
copies in covers that carry, clearly and legibly, all these Cover
Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
the back cover. Both covers must also clearly and legibly identify
you as the publisher of these copies. The front cover must present
the full title with all words of the title equally prominent and
visible. You may add other material on the covers in addition.
Copying with changes limited to the covers, as long as they preserve
the title of the Document and satisfy these conditions, can be treated
as verbatim copying in other respects.
If the required texts for either cover are too voluminous to fit
legibly, you should put the first ones listed (as many as fit
reasonably) on the actual cover, and continue the rest onto adjacent
pages.
If you publish or distribute Opaque copies of the Document numbering
more than 100, you must either include a machine-readable Transparent
copy along with each Opaque copy, or state in or with each Opaque copy
a computer-network location from which the general network-using
public has access to download using public-standard network protocols
a complete Transparent copy of the Document, free of added material.
If you use the latter option, you must take reasonably prudent steps,
when you begin distribution of Opaque copies in quantity, to ensure
that this Transparent copy will remain thus accessible at the stated
location until at least one year after the last time you distribute an
Opaque copy (directly or through your agents or retailers) of that
edition to the public.
It is requested, but not required, that you contact the authors of the
Document well before redistributing any large number of copies, to give
them a chance to provide you with an updated version of the Document.
@item
MODIFICATIONS
You may copy and distribute a Modified Version of the Document under
the conditions of sections 2 and 3 above, provided that you release
the Modified Version under precisely this License, with the Modified
Version filling the role of the Document, thus licensing distribution
and modification of the Modified Version to whoever possesses a copy
of it. In addition, you must do these things in the Modified Version:
@enumerate A
@item
Use in the Title Page (and on the covers, if any) a title distinct
from that of the Document, and from those of previous versions
(which should, if there were any, be listed in the History section
of the Document). You may use the same title as a previous version
if the original publisher of that version gives permission.
@item
List on the Title Page, as authors, one or more persons or entities
responsible for authorship of the modifications in the Modified
Version, together with at least five of the principal authors of the
Document (all of its principal authors, if it has fewer than five),
unless they release you from this requirement.
@item
State on the Title page the name of the publisher of the
Modified Version, as the publisher.
@item
Preserve all the copyright notices of the Document.
@item
Add an appropriate copyright notice for your modifications
adjacent to the other copyright notices.
@item
Include, immediately after the copyright notices, a license notice
giving the public permission to use the Modified Version under the
terms of this License, in the form shown in the Addendum below.
@item
Preserve in that license notice the full lists of Invariant Sections
and required Cover Texts given in the Document's license notice.
@item
Include an unaltered copy of this License.
@item
Preserve the section Entitled ``History'', Preserve its Title, and add
to it an item stating at least the title, year, new authors, and
publisher of the Modified Version as given on the Title Page. If
there is no section Entitled ``History'' in the Document, create one
stating the title, year, authors, and publisher of the Document as
given on its Title Page, then add an item describing the Modified
Version as stated in the previous sentence.
@item
Preserve the network location, if any, given in the Document for
public access to a Transparent copy of the Document, and likewise
the network locations given in the Document for previous versions
it was based on. These may be placed in the ``History'' section.
You may omit a network location for a work that was published at
least four years before the Document itself, or if the original
publisher of the version it refers to gives permission.
@item
For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve
the Title of the section, and preserve in the section all the
substance and tone of each of the contributor acknowledgements and/or
dedications given therein.
@item
Preserve all the Invariant Sections of the Document,
unaltered in their text and in their titles. Section numbers
or the equivalent are not considered part of the section titles.
@item
Delete any section Entitled ``Endorsements''. Such a section
may not be included in the Modified Version.
@item
Do not retitle any existing section to be Entitled ``Endorsements'' or
to conflict in title with any Invariant Section.
@item
Preserve any Warranty Disclaimers.
@end enumerate
If the Modified Version includes new front-matter sections or
appendices that qualify as Secondary Sections and contain no material
copied from the Document, you may at your option designate some or all
of these sections as invariant. To do this, add their titles to the
list of Invariant Sections in the Modified Version's license notice.
These titles must be distinct from any other section titles.
You may add a section Entitled ``Endorsements'', provided it contains
nothing but endorsements of your Modified Version by various
parties---for example, statements of peer review or that the text has
been approved by an organization as the authoritative definition of a
standard.
You may add a passage of up to five words as a Front-Cover Text, and a
passage of up to 25 words as a Back-Cover Text, to the end of the list
of Cover Texts in the Modified Version. Only one passage of
Front-Cover Text and one of Back-Cover Text may be added by (or
through arrangements made by) any one entity. If the Document already
includes a cover text for the same cover, previously added by you or
by arrangement made by the same entity you are acting on behalf of,
you may not add another; but you may replace the old one, on explicit
permission from the previous publisher that added the old one.
The author(s) and publisher(s) of the Document do not by this License
give permission to use their names for publicity for or to assert or
imply endorsement of any Modified Version.
@item
COMBINING DOCUMENTS
You may combine the Document with other documents released under this
License, under the terms defined in section 4 above for modified
versions, provided that you include in the combination all of the
Invariant Sections of all of the original documents, unmodified, and
list them all as Invariant Sections of your combined work in its
license notice, and that you preserve all their Warranty Disclaimers.
The combined work need only contain one copy of this License, and
multiple identical Invariant Sections may be replaced with a single
copy. If there are multiple Invariant Sections with the same name but
different contents, make the title of each such section unique by
adding at the end of it, in parentheses, the name of the original
author or publisher of that section if known, or else a unique number.
Make the same adjustment to the section titles in the list of
Invariant Sections in the license notice of the combined work.
In the combination, you must combine any sections Entitled ``History''
in the various original documents, forming one section Entitled
``History''; likewise combine any sections Entitled ``Acknowledgements'',
and any sections Entitled ``Dedications''. You must delete all
sections Entitled ``Endorsements.''
@item
COLLECTIONS OF DOCUMENTS
You may make a collection consisting of the Document and other documents
released under this License, and replace the individual copies of this
License in the various documents with a single copy that is included in
the collection, provided that you follow the rules of this License for
verbatim copying of each of the documents in all other respects.
You may extract a single document from such a collection, and distribute
it individually under this License, provided you insert a copy of this
License into the extracted document, and follow this License in all
other respects regarding verbatim copying of that document.
@item
AGGREGATION WITH INDEPENDENT WORKS
A compilation of the Document or its derivatives with other separate
and independent documents or works, in or on a volume of a storage or
distribution medium, is called an ``aggregate'' if the copyright
resulting from the compilation is not used to limit the legal rights
of the compilation's users beyond what the individual works permit.
When the Document is included in an aggregate, this License does not
apply to the other works in the aggregate which are not themselves
derivative works of the Document.
If the Cover Text requirement of section 3 is applicable to these
copies of the Document, then if the Document is less than one half of
the entire aggregate, the Document's Cover Texts may be placed on
covers that bracket the Document within the aggregate, or the
electronic equivalent of covers if the Document is in electronic form.
Otherwise they must appear on printed covers that bracket the whole
aggregate.
@item
TRANSLATION
Translation is considered a kind of modification, so you may
distribute translations of the Document under the terms of section 4.
Replacing Invariant Sections with translations requires special
permission from their copyright holders, but you may include
translations of some or all Invariant Sections in addition to the
original versions of these Invariant Sections. You may include a
translation of this License, and all the license notices in the
Document, and any Warranty Disclaimers, provided that you also include
the original English version of this License and the original versions
of those notices and disclaimers. In case of a disagreement between
the translation and the original version of this License or a notice
or disclaimer, the original version will prevail.
If a section in the Document is Entitled ``Acknowledgements'',
``Dedications'', or ``History'', the requirement (section 4) to Preserve
its Title (section 1) will typically require changing the actual
title.
@item
TERMINATION
You may not copy, modify, sublicense, or distribute the Document except
as expressly provided for under this License. Any other attempt to
copy, modify, sublicense or distribute the Document is void, and will
automatically terminate your rights under this License. However,
parties who have received copies, or rights, from you under this
License will not have their licenses terminated so long as such
parties remain in full compliance.
@item
FUTURE REVISIONS OF THIS LICENSE
The Free Software Foundation may publish new, revised versions
of the GNU Free Documentation License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns. See
@uref{http://www.gnu.org/copyleft/}.
Each version of the License is given a distinguishing version number.
If the Document specifies that a particular numbered version of this
License ``or any later version'' applies to it, you have the option of
following the terms and conditions either of that specified version or
of any later version that has been published (not as a draft) by the
Free Software Foundation. If the Document does not specify a version
number of this License, you may choose any version ever published (not
as a draft) by the Free Software Foundation.
@end enumerate
@page
@appendixsubsec ADDENDUM: How to use this License for your documents
To use this License in a document you have written, include a copy of
the License in the document and put the following copyright and
license notices just after the title page:
@smallexample
@group
Copyright (C) @var{year} @var{your name}.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2
or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
Texts. A copy of the license is included in the section entitled ``GNU
Free Documentation License''.
@end group
@end smallexample
If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
replace the ``with...Texts.'' line with this:
@smallexample
@group
with the Invariant Sections being @var{list their titles}, with
the Front-Cover Texts being @var{list}, and with the Back-Cover Texts
being @var{list}.
@end group
@end smallexample
If you have Invariant Sections without Cover Texts, or some other
combination of the three, merge those two alternatives to suit the
situation.
If your document contains nontrivial examples of program code, we
recommend releasing these examples in parallel under your choice of
free software license, such as the GNU General Public License,
to permit their use in free software.
@c Local Variables:
@c ispell-local-pdict: "ispell-dict"
@c End:

125
doc/gendocs_template Executable file
View File

@@ -0,0 +1,125 @@
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!-- $Id: gendocs_template,v 1.5 2007/10/30 14:58:52 gray Exp $ -->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>%%TITLE%% - GNU Project - Free Software Foundation (FSF)</title>
<meta http-equiv="content-type" content='text/html; charset=utf-8' />
<link rel="stylesheet" type="text/css" href="/gnu.css" />
<link rev="made" href="mailto:gray@gnu.org" />
<link rel="icon" type="image/png" href="/graphics/gnu-head-icon.png" />
</head>
<!-- This document is in XML, and xhtml 1.0 -->
<!-- Please make sure to properly nest your tags -->
<!-- and ensure that your final document validates -->
<!-- consistent with W3C xhtml 1.0 and CSS standards -->
<!-- See validator.w3.org -->
<body>
<h3>%%TITLE%%</h3>
<address>Free Software Foundation</address>
<address>last updated %%DATE%%</address>
<p>
<a href="/graphics/gnu-head.jpg">
<img src="/graphics/gnu-head-sm.jpg"
alt=" [image of the head of a GNU] "
width="129" height="122" />
</a>
</p>
<hr />
<p>The manual for %%PACKAGE%% is available in the following formats:</p>
<ul>
<li><a href="%%PACKAGE%%.html">HTML
(%%HTML_MONO_SIZE%%K bytes)</a> - entirely on one web page.</li>
<li><a href="html_node/index.html">HTML</a> - with one web page per
node.</li>
%%IF HTML_SECTION%%
<li><a href="html_section/index.html">HTML</a> - with one web page per
section.</li>
%%ENDIF HTML_SECTION%%
%%IF HTML_CHAPTER%%
<li><a href="html_chapter/index.html">HTML</a> - with one web page per
chapter.</li>
%%ENDIF HTML_CHAPTER%%
<li><a href="%%PACKAGE%%.html.gz">HTML compressed
(%%HTML_MONO_GZ_SIZE%%K gzipped characters)</a> - entirely on
one web page.</li>
<li><a href="%%PACKAGE%%.html_node.tar.gz">HTML compressed
(%%HTML_NODE_TGZ_SIZE%%K gzipped tar file)</a> -
with one web page per node.</li>
%%IF HTML_SECTION%%
<li><a href="%%PACKAGE%%.html_section.tar.gz">HTML compressed
(%%HTML_SECTION_TGZ_SIZE%%K gzipped tar file)</a> -
with one web page per section.</li>
%%ENDIF HTML_SECTION%%
%%IF HTML_CHAPTER%%
<li><a href="%%PACKAGE%%.html_chapter.tar.gz">HTML compressed
(%%HTML_CHAPTER_TGZ_SIZE%%K gzipped tar file)</a> -
with one web page per chapter.</li>
%%ENDIF HTML_CHAPTER%%
<li><a href="%%PACKAGE%%.info.tar.gz">Info document
(%%INFO_TGZ_SIZE%%K characters gzipped tar file)</a>.</li>
<li><a href="%%PACKAGE%%.txt">ASCII text
(%%ASCII_SIZE%%K characters)</a>.</li>
<li><a href="%%PACKAGE%%.txt.gz">ASCII text compressed
(%%ASCII_GZ_SIZE%%K gzipped characters)</a>.</li>
<li><a href="%%PACKAGE%%.dvi.gz">TeX dvi file
(%%DVI_GZ_SIZE%%K characters gzipped)</a>.</li>
<li><a href="%%PACKAGE%%.ps.gz">PostScript file
(%%PS_GZ_SIZE%%K characters gzipped)</a>.</li>
<li><a href="%%PACKAGE%%.pdf">PDF file
(%%PDF_SIZE%%K characters)</a>.</li>
<li><a href="%%PACKAGE%%.texi.tar.gz">Texinfo source
(%%TEXI_TGZ_SIZE%%K characters gzipped tar file)</a></li>
</ul>
<p>(This page generated by the <a
href="%%SCRIPTURL%%">%%SCRIPTNAME%%</a> script.)
</p>
<p>
<a href="http://validator.w3.org/check?uri=referer"><img
src="http://www.w3.org/Icons/valid-xhtml10"
alt="Valid XHTML 1.0!" height="31" width="88" /></a>
</p>
<div class="copyright">
<p>
Return to the <a href="/home.html">GNU Project home page</a>.
</p>
<p>
Please send FSF &amp; GNU inquiries to
<a href="mailto:gnu@gnu.org"><em>gnu@gnu.org</em></a>.
There are also <a href="/home.html#ContactInfo">other ways to contact</a>
the FSF.
<br />
Please send broken links and other corrections (or suggestions) to
<a href="mailto:webmasters@gnu.org"><em>webmasters@gnu.org</em></a>.
</p>
<p>
Copyright (C) 2004 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02111, USA
<br />
Verbatim copying and distribution of this entire article is
permitted in any medium, provided this notice is preserved.
</p>
<p>
Updated:
<!-- timestamp start -->
$Date: 2007/10/30 14:58:52 $ $Author: gray $
<!-- timestamp end -->
</p>
</div>
</body>
</html>

View File

@@ -1,421 +0,0 @@
@node Date input formats
@chapter Date input formats
@cindex date input formats
@findex getdate
First, a quote:
@quotation
Our units of temporal measurement, from seconds on up to months, are so
complicated, asymmetrical and disjunctive so as to make coherent mental
reckoning in time all but impossible. Indeed, had some tyrannical god
contrived to enslave our minds to time, to make it all but impossible
for us to escape subjection to sodden routines and unpleasant surprises,
he could hardly have done better than handing down our present system.
It is like a set of trapezoidal building blocks, with no vertical or
horizontal surfaces, like a language in which the simplest thought
demands ornate constructions, useless particles and lengthy
circumlocutions. Unlike the more successful patterns of language and
science, which enable us to face experience boldly or at least
level-headedly, our system of temporal calculation silently and
persistently encourages our terror of time.
@dots{} It is as though architects had to measure length in feet, width
in meters and height in ells; as though basic instruction manuals
demanded a knowledge of five different languages. It is no wonder then
that we often look into our own immediate past or future, last Tuesday
or a week from Sunday, with feelings of helpless confusion. @dots{}
--- Robert Grudin, @cite{Time and the Art of Living}.
@end quotation
This section describes the textual date representations that @sc{gnu}
programs accept. These are the strings you, as a user, can supply as
arguments to the various programs. The C interface (via the
@code{getdate} function) is not described here.
@cindex beginning of time, for @sc{posix}
@cindex epoch, for @sc{posix}
Although the date syntax here can represent any possible time since the
year zero, computer integers often cannot represent such a wide range of
time. On @sc{posix} systems, the clock starts at 1970-01-01 00:00:00
@sc{utc}: @sc{posix} does not require support for times before the
@sc{posix} Epoch and times far in the future. Traditional Unix systems
have 32-bit signed @code{time_t} and can represent times from 1901-12-13
20:45:52 through 2038-01-19 03:14:07 @sc{utc}. Systems with 64-bit
signed @code{time_t} can represent all the times in the known
lifetime of the universe.
@menu
* General date syntax:: Common rules.
* Calendar date items:: 19 Dec 1994.
* Time of day items:: 9:20pm.
* Time zone items:: @sc{est}, @sc{pdt}, @sc{gmt}, ...
* Day of week items:: Monday and others.
* Relative items in date strings:: next tuesday, 2 years ago.
* Pure numbers in date strings:: 19931219, 1440.
* Authors of getdate:: Bellovin, Eggert, Salz, Berets, et al.
@end menu
@node General date syntax
@section General date syntax
@cindex general date syntax
@cindex items in date strings
A @dfn{date} is a string, possibly empty, containing many items
separated by whitespace. The whitespace may be omitted when no
ambiguity arises. The empty string means the beginning of today (i.e.,
midnight). Order of the items is immaterial. A date string may contain
many flavors of items:
@itemize @bullet
@item calendar date items
@item time of the day items
@item time zone items
@item day of the week items
@item relative items
@item pure numbers.
@end itemize
@noindent We describe each of these item types in turn, below.
@cindex numbers, written-out
@cindex ordinal numbers
@findex first @r{in date strings}
@findex next @r{in date strings}
@findex last @r{in date strings}
A few numbers may be written out in words in most contexts. This is
most useful for specifying day of the week items or relative items (see
below). Here is the list: @samp{first} for 1, @samp{next} for 2,
@samp{third} for 3, @samp{fourth} for 4, @samp{fifth} for 5,
@samp{sixth} for 6, @samp{seventh} for 7, @samp{eighth} for 8,
@samp{ninth} for 9, @samp{tenth} for 10, @samp{eleventh} for 11 and
@samp{twelfth} for 12. Also, @samp{last} means exactly @math{-1}.
@cindex months, written-out
When a month is written this way, it is still considered to be written
numerically, instead of being ``spelled in full''; this changes the
allowed strings.
@cindex language, in dates
In the current implementation, only English is supported for words and
abbreviations like @samp{AM}, @samp{DST}, @samp{EST}, @samp{first},
@samp{January}, @samp{Sunday}, @samp{tomorrow}, and @samp{year}.
@cindex language, in dates
@cindex time zone item
The output of @command{date} is not always acceptable as a date string,
not only because of the language problem, but also because there is no
standard meaning for time zone items like @samp{IST}. When using
@command{date} to generate a date string intended to be parsed later,
specify a date format that is independent of language and that does not
use time zone items other than @samp{UTC} and @samp{Z}. Here are some
ways to do this:
@example
$ LC_ALL=C TZ=UTC0 date
Fri Dec 15 19:48:05 UTC 2000
$ TZ=UTC0 date +"%Y-%m-%d %H:%M:%SZ"
2000-12-15 19:48:05Z
$ date --iso-8601=seconds # a GNU extension
2000-12-15T11:48:05-0800
$ date --rfc-822 # a GNU extension
Fri, 15 Dec 2000 11:48:05 -0800
$ date +"%Y-%m-%d %H:%M:%S %z" # %z is a GNU extension.
2000-12-15 11:48:05 -0800
@end example
@cindex case, ignored in dates
@cindex comments, in dates
Alphabetic case is completely ignored in dates. Comments may be introduced
between round parentheses, as long as included parentheses are properly
nested. Hyphens not followed by a digit are currently ignored. Leading
zeros on numbers are ignored.
@node Calendar date items
@section Calendar date items
@cindex calendar date item
A @dfn{calendar date item} specifies a day of the year. It is
specified differently, depending on whether the month is specified
numerically or literally. All these strings specify the same calendar date:
@example
1972-09-24 # @sc{iso} 8601.
72-9-24 # Assume 19xx for 69 through 99,
# 20xx for 00 through 68.
72-09-24 # Leading zeros are ignored.
9/24/72 # Common U.S. writing.
24 September 1972
24 Sept 72 # September has a special abbreviation.
24 Sep 72 # Three-letter abbreviations always allowed.
Sep 24, 1972
24-sep-72
24sep72
@end example
The year can also be omitted. In this case, the last specified year is
used, or the current year if none. For example:
@example
9/24
sep 24
@end example
Here are the rules.
@cindex @sc{iso} 8601 date format
@cindex date format, @sc{iso} 8601
For numeric months, the @sc{iso} 8601 format
@samp{@var{year}-@var{month}-@var{day}} is allowed, where @var{year} is
any positive number, @var{month} is a number between 01 and 12, and
@var{day} is a number between 01 and 31. A leading zero must be present
if a number is less than ten. If @var{year} is 68 or smaller, then 2000
is added to it; otherwise, if @var{year} is less than 100,
then 1900 is added to it. The construct
@samp{@var{month}/@var{day}/@var{year}}, popular in the United States,
is accepted. Also @samp{@var{month}/@var{day}}, omitting the year.
@cindex month names in date strings
@cindex abbreviations for months
Literal months may be spelled out in full: @samp{January},
@samp{February}, @samp{March}, @samp{April}, @samp{May}, @samp{June},
@samp{July}, @samp{August}, @samp{September}, @samp{October},
@samp{November} or @samp{December}. Literal months may be abbreviated
to their first three letters, possibly followed by an abbreviating dot.
It is also permitted to write @samp{Sept} instead of @samp{September}.
When months are written literally, the calendar date may be given as any
of the following:
@example
@var{day} @var{month} @var{year}
@var{day} @var{month}
@var{month} @var{day} @var{year}
@var{day}-@var{month}-@var{year}
@end example
Or, omitting the year:
@example
@var{month} @var{day}
@end example
@node Time of day items
@section Time of day items
@cindex time of day item
A @dfn{time of day item} in date strings specifies the time on a given
day. Here are some examples, all of which represent the same time:
@example
20:02:0
20:02
8:02pm
20:02-0500 # In @sc{est} (U.S. Eastern Standard Time).
@end example
More generally, the time of the day may be given as
@samp{@var{hour}:@var{minute}:@var{second}}, where @var{hour} is
a number between 0 and 23, @var{minute} is a number between 0 and
59, and @var{second} is a number between 0 and 59. Alternatively,
@samp{:@var{second}} can be omitted, in which case it is taken to
be zero.
@findex am @r{in date strings}
@findex pm @r{in date strings}
@findex midnight @r{in date strings}
@findex noon @r{in date strings}
If the time is followed by @samp{am} or @samp{pm} (or @samp{a.m.}
or @samp{p.m.}), @var{hour} is restricted to run from 1 to 12, and
@samp{:@var{minute}} may be omitted (taken to be zero). @samp{am}
indicates the first half of the day, @samp{pm} indicates the second
half of the day. In this notation, 12 is the predecessor of 1:
midnight is @samp{12am} while noon is @samp{12pm}.
(This is the zero-oriented interpretation of @samp{12am} and @samp{12pm},
as opposed to the old tradition derived from Latin
which uses @samp{12m} for noon and @samp{12pm} for midnight.)
@cindex time zone correction
@cindex minutes, time zone correction by
The time may alternatively be followed by a time zone correction,
expressed as @samp{@var{s}@var{hh}@var{mm}}, where @var{s} is @samp{+}
or @samp{-}, @var{hh} is a number of zone hours and @var{mm} is a number
of zone minutes. When a time zone correction is given this way, it
forces interpretation of the time relative to
Coordinated Universal Time (@sc{utc}), overriding any previous
specification for the time zone or the local time zone. The @var{minute}
part of the time of the day may not be elided when a time zone correction
is used. This is the best way to specify a time zone correction by
fractional parts of an hour.
Either @samp{am}/@samp{pm} or a time zone correction may be specified,
but not both.
@node Time zone items
@section Time zone items
@cindex time zone item
A @dfn{time zone item} specifies an international time zone, indicated
by a small set of letters, e.g., @samp{UTC} or @samp{Z}
for Coordinated Universal
Time. Any included periods are ignored. By following a
non-daylight-saving time zone by the string @samp{DST} in a separate
word (that is, separated by some white space), the corresponding
daylight saving time zone may be specified.
Time zone items other than @samp{UTC} and @samp{Z}
are obsolescent and are not recommended, because they
are ambiguous; for example, @samp{EST} has a different meaning in
Australia than in the United States. Instead, it's better to use
unambiguous numeric time zone corrections like @samp{-0500}, as
described in the previous section.
@node Day of week items
@section Day of week items
@cindex day of week item
The explicit mention of a day of the week will forward the date
(only if necessary) to reach that day of the week in the future.
Days of the week may be spelled out in full: @samp{Sunday},
@samp{Monday}, @samp{Tuesday}, @samp{Wednesday}, @samp{Thursday},
@samp{Friday} or @samp{Saturday}. Days may be abbreviated to their
first three letters, optionally followed by a period. The special
abbreviations @samp{Tues} for @samp{Tuesday}, @samp{Wednes} for
@samp{Wednesday} and @samp{Thur} or @samp{Thurs} for @samp{Thursday} are
also allowed.
@findex next @var{day}
@findex last @var{day}
A number may precede a day of the week item to move forward
supplementary weeks. It is best used in expression like @samp{third
monday}. In this context, @samp{last @var{day}} or @samp{next
@var{day}} is also acceptable; they move one week before or after
the day that @var{day} by itself would represent.
A comma following a day of the week item is ignored.
@node Relative items in date strings
@section Relative items in date strings
@cindex relative items in date strings
@cindex displacement of dates
@dfn{Relative items} adjust a date (or the current date if none) forward
or backward. The effects of relative items accumulate. Here are some
examples:
@example
1 year
1 year ago
3 years
2 days
@end example
@findex year @r{in date strings}
@findex month @r{in date strings}
@findex fortnight @r{in date strings}
@findex week @r{in date strings}
@findex day @r{in date strings}
@findex hour @r{in date strings}
@findex minute @r{in date strings}
The unit of time displacement may be selected by the string @samp{year}
or @samp{month} for moving by whole years or months. These are fuzzy
units, as years and months are not all of equal duration. More precise
units are @samp{fortnight} which is worth 14 days, @samp{week} worth 7
days, @samp{day} worth 24 hours, @samp{hour} worth 60 minutes,
@samp{minute} or @samp{min} worth 60 seconds, and @samp{second} or
@samp{sec} worth one second. An @samp{s} suffix on these units is
accepted and ignored.
@findex ago @r{in date strings}
The unit of time may be preceded by a multiplier, given as an optionally
signed number. Unsigned numbers are taken as positively signed. No
number at all implies 1 for a multiplier. Following a relative item by
the string @samp{ago} is equivalent to preceding the unit by a
multiplier with value @math{-1}.
@findex day @r{in date strings}
@findex tomorrow @r{in date strings}
@findex yesterday @r{in date strings}
The string @samp{tomorrow} is worth one day in the future (equivalent
to @samp{day}), the string @samp{yesterday} is worth
one day in the past (equivalent to @samp{day ago}).
@findex now @r{in date strings}
@findex today @r{in date strings}
@findex this @r{in date strings}
The strings @samp{now} or @samp{today} are relative items corresponding
to zero-valued time displacement, these strings come from the fact
a zero-valued time displacement represents the current time when not
otherwise changed by previous items. They may be used to stress other
items, like in @samp{12:00 today}. The string @samp{this} also has
the meaning of a zero-valued time displacement, but is preferred in
date strings like @samp{this thursday}.
When a relative item causes the resulting date to cross a boundary
where the clocks were adjusted, typically for daylight-saving time,
the resulting date and time are adjusted accordingly.
@node Pure numbers in date strings
@section Pure numbers in date strings
@cindex pure numbers in date strings
The precise interpretation of a pure decimal number depends
on the context in the date string.
If the decimal number is of the form @var{yyyy}@var{mm}@var{dd} and no
other calendar date item (@pxref{Calendar date items}) appears before it
in the date string, then @var{yyyy} is read as the year, @var{mm} as the
month number and @var{dd} as the day of the month, for the specified
calendar date.
If the decimal number is of the form @var{hh}@var{mm} and no other time
of day item appears before it in the date string, then @var{hh} is read
as the hour of the day and @var{mm} as the minute of the hour, for the
specified time of the day. @var{mm} can also be omitted.
If both a calendar date and a time of day appear to the left of a number
in the date string, but no relative item, then the number overrides the
year.
@node Authors of getdate
@section Authors of @code{getdate}
@cindex authors of @code{getdate}
@cindex Bellovin, Steven M.
@cindex Salz, Rich
@cindex Berets, Jim
@cindex MacKenzie, David
@cindex Meyering, Jim
@cindex Eggert, Paul
@code{getdate} was originally implemented by Steven M. Bellovin
(@email{smb@@research.att.com}) while at the University of North Carolina
at Chapel Hill. The code was later tweaked by a couple of people on
Usenet, then completely overhauled by Rich $alz (@email{rsalz@@bbn.com})
and Jim Berets (@email{jberets@@bbn.com}) in August, 1990. Various
revisions for the @sc{gnu} system were made by David MacKenzie, Jim Meyering,
Paul Eggert and others.
@cindex Pinard, F.
@cindex Berry, K.
This chapter was originally produced by Fran@,{c}ois Pinard
(@email{pinard@@iro.umontreal.ca}) from the @file{getdate.y} source code,
and then edited by K.@: Berry (@email{kb@@cs.umb.edu}).

333
doc/intern.texi Normal file
View File

@@ -0,0 +1,333 @@
@c This is part of the paxutils manual.
@c Copyright (C) 2006 Free Software Foundation, Inc.
@c This file is distributed under GFDL 1.1 or any later version
@c published by the Free Software Foundation.
@menu
* Standard:: Basic Tar Format
* Extensions:: @acronym{GNU} Extensions to the Archive Format
* Sparse Formats:: Storing Sparse Files
* Snapshot Files::
* Dumpdir::
@end menu
@node Standard
@unnumberedsec Basic Tar Format
@UNREVISED
While an archive may contain many files, the archive itself is a
single ordinary file. Like any other file, an archive file can be
written to a storage device such as a tape or disk, sent through a
pipe or over a network, saved on the active file system, or even
stored in another archive. An archive file is not easy to read or
manipulate without using the @command{tar} utility or Tar mode in
@acronym{GNU} Emacs.
Physically, an archive consists of a series of file entries terminated
by an end-of-archive entry, which consists of two 512 blocks of zero
bytes. A file
entry usually describes one of the files in the archive (an
@dfn{archive member}), and consists of a file header and the contents
of the file. File headers contain file names and statistics, checksum
information which @command{tar} uses to detect file corruption, and
information about file types.
Archives are permitted to have more than one member with the same
member name. One way this situation can occur is if more than one
version of a file has been stored in the archive. For information
about adding new versions of a file to an archive, see @ref{update}.
In addition to entries describing archive members, an archive may
contain entries which @command{tar} itself uses to store information.
@xref{label}, for an example of such an archive entry.
A @command{tar} archive file contains a series of blocks. Each block
contains @code{BLOCKSIZE} bytes. Although this format may be thought
of as being on magnetic tape, other media are often used.
Each file archived is represented by a header block which describes
the file, followed by zero or more blocks which give the contents
of the file. At the end of the archive file there are two 512-byte blocks
filled with binary zeros as an end-of-file marker. A reasonable system
should write such end-of-file marker at the end of an archive, but
must not assume that such a block exists when reading an archive. In
particular @GNUTAR{} always issues a warning if it does not encounter it.
The blocks may be @dfn{blocked} for physical I/O operations.
Each record of @var{n} blocks (where @var{n} is set by the
@option{--blocking-factor=@var{512-size}} (@option{-b @var{512-size}}) option to @command{tar}) is written with a single
@w{@samp{write ()}} operation. On magnetic tapes, the result of
such a write is a single record. When writing an archive,
the last record of blocks should be written at the full size, with
blocks after the zero block containing all zeros. When reading
an archive, a reasonable system should properly handle an archive
whose last record is shorter than the rest, or which contains garbage
records after a zero block.
The header block is defined in C as follows. In the @GNUTAR{}
distribution, this is part of file @file{src/tar.h}:
@smallexample
@include header.texi
@end smallexample
All characters in header blocks are represented by using 8-bit
characters in the local variant of ASCII. Each field within the
structure is contiguous; that is, there is no padding used within
the structure. Each character on the archive medium is stored
contiguously.
Bytes representing the contents of files (after the header block
of each file) are not translated in any way and are not constrained
to represent characters in any character set. The @command{tar} format
does not distinguish text files from binary files, and no translation
of file contents is performed.
The @code{name}, @code{linkname}, @code{magic}, @code{uname}, and
@code{gname} are null-terminated character strings. All other fields
are zero-filled octal numbers in ASCII. Each numeric field of width
@var{w} contains @var{w} minus 1 digits, and a null.
The @code{name} field is the file name of the file, with directory names
(if any) preceding the file name, separated by slashes.
@FIXME{how big a name before field overflows?}
The @code{mode} field provides nine bits specifying file permissions
and three bits to specify the Set @acronym{UID}, Set @acronym{GID}, and Save Text
(@dfn{sticky}) modes. Values for these bits are defined above.
When special permissions are required to create a file with a given
mode, and the user restoring files from the archive does not hold such
permissions, the mode bit(s) specifying those special permissions
are ignored. Modes which are not supported by the operating system
restoring files from the archive will be ignored. Unsupported modes
should be faked up when creating or updating an archive; e.g., the
group permission could be copied from the @emph{other} permission.
The @code{uid} and @code{gid} fields are the numeric user and group
@acronym{ID} of the file owners, respectively. If the operating system does
not support numeric user or group @acronym{ID}s, these fields should
be ignored.
The @code{size} field is the size of the file in bytes; linked files
are archived with this field specified as zero.
The @code{mtime} field is the data modification time of the file at
the time it was archived. It is the ASCII representation of the octal
value of the last time the file's contents were modified, represented
as an integer number of
seconds since January 1, 1970, 00:00 Coordinated Universal Time.
The @code{chksum} field is the ASCII representation of the octal value
of the simple sum of all bytes in the header block. Each 8-bit
byte in the header is added to an unsigned integer, initialized to
zero, the precision of which shall be no less than seventeen bits.
When calculating the checksum, the @code{chksum} field is treated as
if it were all blanks.
The @code{typeflag} field specifies the type of file archived. If a
particular implementation does not recognize or permit the specified
type, the file will be extracted as if it were a regular file. As this
action occurs, @command{tar} issues a warning to the standard error.
The @code{atime} and @code{ctime} fields are used in making incremental
backups; they store, respectively, the particular file's access and
status change times.
The @code{offset} is used by the @option{--multi-volume} (@option{-M}) option, when
making a multi-volume archive. The offset is number of bytes into
the file that we need to restart at to continue the file on the next
tape, i.e., where we store the location that a continued file is
continued at.
The following fields were added to deal with sparse files. A file
is @dfn{sparse} if it takes in unallocated blocks which end up being
represented as zeros, i.e., no useful data. A test to see if a file
is sparse is to look at the number blocks allocated for it versus the
number of characters in the file; if there are fewer blocks allocated
for the file than would normally be allocated for a file of that
size, then the file is sparse. This is the method @command{tar} uses to
detect a sparse file, and once such a file is detected, it is treated
differently from non-sparse files.
Sparse files are often @code{dbm} files, or other database-type files
which have data at some points and emptiness in the greater part of
the file. Such files can appear to be very large when an @samp{ls
-l} is done on them, when in truth, there may be a very small amount
of important data contained in the file. It is thus undesirable
to have @command{tar} think that it must back up this entire file, as
great quantities of room are wasted on empty blocks, which can lead
to running out of room on a tape far earlier than is necessary.
Thus, sparse files are dealt with so that these empty blocks are
not written to the tape. Instead, what is written to the tape is a
description, of sorts, of the sparse file: where the holes are, how
big the holes are, and how much data is found at the end of the hole.
This way, the file takes up potentially far less room on the tape,
and when the file is extracted later on, it will look exactly the way
it looked beforehand. The following is a description of the fields
used to handle a sparse file:
The @code{sp} is an array of @code{struct sparse}. Each @code{struct
sparse} contains two 12-character strings which represent an offset
into the file and a number of bytes to be written at that offset.
The offset is absolute, and not relative to the offset in preceding
array element.
The header can hold four of these @code{struct sparse} at the moment;
if more are needed, they are not stored in the header.
The @code{isextended} flag is set when an @code{extended_header}
is needed to deal with a file. Note that this means that this flag
can only be set when dealing with a sparse file, and it is only set
in the event that the description of the file will not fit in the
allotted room for sparse structures in the header. In other words,
an extended_header is needed.
The @code{extended_header} structure is used for sparse files which
need more sparse structures than can fit in the header. The header can
fit 4 such structures; if more are needed, the flag @code{isextended}
gets set and the next block is an @code{extended_header}.
Each @code{extended_header} structure contains an array of 21
sparse structures, along with a similar @code{isextended} flag
that the header had. There can be an indeterminate number of such
@code{extended_header}s to describe a sparse file.
@table @asis
@item @code{REGTYPE}
@itemx @code{AREGTYPE}
These flags represent a regular file. In order to be compatible
with older versions of @command{tar}, a @code{typeflag} value of
@code{AREGTYPE} should be silently recognized as a regular file.
New archives should be created using @code{REGTYPE}. Also, for
backward compatibility, @command{tar} treats a regular file whose name
ends with a slash as a directory.
@item @code{LNKTYPE}
This flag represents a file linked to another file, of any type,
previously archived. Such files are identified in Unix by each
file having the same device and inode number. The linked-to name is
specified in the @code{linkname} field with a trailing null.
@item @code{SYMTYPE}
This represents a symbolic link to another file. The linked-to name
is specified in the @code{linkname} field with a trailing null.
@item @code{CHRTYPE}
@itemx @code{BLKTYPE}
These represent character special files and block special files
respectively. In this case the @code{devmajor} and @code{devminor}
fields will contain the major and minor device numbers respectively.
Operating systems may map the device specifications to their own
local specification, or may ignore the entry.
@item @code{DIRTYPE}
This flag specifies a directory or sub-directory. The directory
name in the @code{name} field should end with a slash. On systems where
disk allocation is performed on a directory basis, the @code{size} field
will contain the maximum number of bytes (which may be rounded to
the nearest disk block allocation unit) which the directory may
hold. A @code{size} field of zero indicates no such limiting. Systems
which do not support limiting in this manner should ignore the
@code{size} field.
@item @code{FIFOTYPE}
This specifies a FIFO special file. Note that the archiving of a
FIFO file archives the existence of this file and not its contents.
@item @code{CONTTYPE}
This specifies a contiguous file, which is the same as a normal
file except that, in operating systems which support it, all its
space is allocated contiguously on the disk. Operating systems
which do not allow contiguous allocation should silently treat this
type as a normal file.
@item @code{A} @dots{} @code{Z}
These are reserved for custom implementations. Some of these are
used in the @acronym{GNU} modified format, as described below.
@end table
Other values are reserved for specification in future revisions of
the P1003 standard, and should not be used by any @command{tar} program.
The @code{magic} field indicates that this archive was output in
the P1003 archive format. If this field contains @code{TMAGIC},
the @code{uname} and @code{gname} fields will contain the ASCII
representation of the owner and group of the file respectively.
If found, the user and group @acronym{ID}s are used rather than the values in
the @code{uid} and @code{gid} fields.
For references, see ISO/IEC 9945-1:1990 or IEEE Std 1003.1-1990, pages
169-173 (section 10.1) for @cite{Archive/Interchange File Format}; and
IEEE Std 1003.2-1992, pages 380-388 (section 4.48) and pages 936-940
(section E.4.48) for @cite{pax - Portable archive interchange}.
@node Extensions
@unnumberedsec @acronym{GNU} Extensions to the Archive Format
@UNREVISED
The @acronym{GNU} format uses additional file types to describe new types of
files in an archive. These are listed below.
@table @code
@item GNUTYPE_DUMPDIR
@itemx 'D'
This represents a directory and a list of files created by the
@option{--incremental} (@option{-G}) option. The @code{size} field gives the total
size of the associated list of files. Each file name is preceded by
either a @samp{Y} (the file should be in this archive) or an @samp{N}.
(The file is a directory, or is not stored in the archive.) Each file
name is terminated by a null. There is an additional null after the
last file name.
@item GNUTYPE_MULTIVOL
@itemx 'M'
This represents a file continued from another volume of a multi-volume
archive created with the @option{--multi-volume} (@option{-M}) option. The original
type of the file is not given here. The @code{size} field gives the
maximum size of this piece of the file (assuming the volume does
not end before the file is written out). The @code{offset} field
gives the offset from the beginning of the file where this part of
the file begins. Thus @code{size} plus @code{offset} should equal
the original size of the file.
@item GNUTYPE_SPARSE
@itemx 'S'
This flag indicates that we are dealing with a sparse file. Note
that archiving a sparse file requires special operations to find
holes in the file, which mark the positions of these holes, along
with the number of bytes of data to be found after the hole.
@item GNUTYPE_VOLHDR
@itemx 'V'
This file type is used to mark the volume header that was given with
the @option{--label=@var{archive-label}} (@option{-V @var{archive-label}}) option when the archive was created. The @code{name}
field contains the @code{name} given after the @option{--label=@var{archive-label}} (@option{-V @var{archive-label}}) option.
The @code{size} field is zero. Only the first file in each volume
of an archive should have this type.
@end table
You may have trouble reading a @acronym{GNU} format archive on a
non-@acronym{GNU} system if the options @option{--incremental} (@option{-G}),
@option{--multi-volume} (@option{-M}), @option{--sparse} (@option{-S}), or @option{--label=@var{archive-label}} (@option{-V @var{archive-label}}) were
used when writing the archive. In general, if @command{tar} does not
use the @acronym{GNU}-added fields of the header, other versions of
@command{tar} should be able to read the archive. Otherwise, the
@command{tar} program will give an error, the most likely one being a
checksum error.
@node Sparse Formats
@unnumberedsec Storing Sparse Files
@include sparse.texi
@node Snapshot Files
@unnumberedsec Format of the Incremental Snapshot Files
@include snapshot.texi
@node Dumpdir
@unnumberedsec Dumpdir
@include dumpdir.texi

91
doc/mastermenu.el Normal file
View File

@@ -0,0 +1,91 @@
;;; mastermenu.el --- Redefinition of texinfo-master-menu-list
;; Copyright (C) 2006, 2007 Free Software Foundation, Inc.
;; Author: Sergey Poznyakoff
;; Maintainer: bug-tar@gnu.org
;; Keywords: maint, tex, docs
;; This file is part of GNU tar documentation suite
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 3, or (at your option)
;; any later version.
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with this program; if not, write to the Free Software Foundation,
;; Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
;;; Commentary:
;; This file redefines texinfo-master-menu-list so that it takes into
;; account included files.
;; Known bugs: @menu without previous sectioning command will inherit
;; documentation string from the previous menu. However, since such a
;; menu is illegal in a texinfo file, we can live with it.
(require 'texinfo)
(require 'texnfo-upd)
(defun texinfo-master-menu-list-recursive (title)
"Auxiliary function used by `texinfo-master-menu-list'."
(save-excursion
(let (master-menu-list)
(while (re-search-forward "\\(^@menu\\|^@include\\)" nil t)
(cond
((string= (match-string 0) "@include")
(skip-chars-forward " \t")
(let ((included-name (let ((start (point)))
(end-of-line)
(skip-chars-backward " \t")
(buffer-substring start (point)))))
(end-of-line)
(let ((prev-title (texinfo-copy-menu-title)))
(save-excursion
(set-buffer (find-file-noselect included-name))
(setq master-menu-list
(append (texinfo-master-menu-list-recursive prev-title)
master-menu-list))))))
(t
(setq master-menu-list
(cons (list
(texinfo-copy-menu)
(let ((menu-title (texinfo-copy-menu-title)))
(if (string= menu-title "")
title
menu-title)))
master-menu-list)))))
master-menu-list)))
(defun texinfo-master-menu-list ()
"Return a list of menu entries and header lines for the master menu,
recursing into included files.
Start with the menu for chapters and indices and then find each
following menu and the title of the node preceding that menu.
The master menu list has this form:
\(\(\(... \"entry-1-2\" \"entry-1\"\) \"title-1\"\)
\(\(... \"entry-2-2\" \"entry-2-1\"\) \"title-2\"\)
...\)
However, there does not need to be a title field."
(reverse (texinfo-master-menu-list-recursive "")))
(defun make-master-menu ()
"Create master menu in the first Emacs argument."
(find-file (car command-line-args-left))
(texinfo-master-menu nil)
(save-buffer))
;;; mastermenu.el ends here

99
doc/rendition.texi Normal file
View File

@@ -0,0 +1,99 @@
@c This is part of GNU tar manual.
@c Copyright (C) 1992, 1994, 1995, 1996, 1997, 1999, 2000, 2001,
@c 2003, 2004, 2006 Free Software Foundation, Inc.
@c See file tar.texi for copying conditions.
@c This file contains support for 'renditions' by Fran@,{c}ois Pinard
@c I extended it by adding a FIXME_FOOTNOTE variable, which controls
@c whether FIXME information should be placed in footnotes or
@c inlined. --gray
@c ======================================================================
@c This document has three levels of rendition: PUBLISH, DISTRIB or PROOF,
@c as decided by @set symbols. The PUBLISH rendition does not show
@c notes or marks asking for revision. Most users will prefer having more
@c information, even if this information is not fully revised for adequacy,
@c so DISTRIB is the default for distributions. The PROOF rendition
@c show all marks to the point of ugliness, but is nevertheless useful to
@c those working on the manual itself.
@c ======================================================================
@c Set this symbol if you wish FIXMEs to appear in footnotes, instead
@c of being inserted into the text.
@c @set PROOF_FOOTNOTED
@ifclear PUBLISH
@ifclear DISTRIB
@ifclear PROOF
@set DISTRIB
@end ifclear
@end ifclear
@end ifclear
@ifset PUBLISH
@set RENDITION The book, version
@end ifset
@ifset DISTRIB
@set RENDITION FTP release, version
@end ifset
@ifset PROOF
@set RENDITION Proof reading version
@end ifset
@c Output marks for nodes needing revision, but not in PUBLISH rendition.
@macro UNREVISED
@ifclear PUBLISH
@quotation
@emph{(This message will disappear, once this node revised.)}
@end quotation
@end ifclear
@end macro
@c Output various FIXME information only in PROOF rendition.
@macro FIXME{string}
@ifset PROOF
@ifset PROOF_FOOTNOTED
@footnote{@strong{FIXME:} \string\}
@end ifset
@ifclear PROOF_FOOTNOTED
@cartouche
@strong{<FIXME>} \string\ @strong{</>}
@end cartouche
@end ifclear
@end ifset
@end macro
@macro FIXME-ref{string}
@ifset PROOF
@strong{<REF>} \string\ @strong{</>}
@end ifset
@ifclear PROOF
@cite{\string\}
@end ifclear
@end macro
@macro FIXME-pxref{string}
@ifset PROOF
See @strong{<PXREF>} \string\ @strong{</>}
@end ifset
@ifclear PROOF
See @cite{\string\}
@end ifclear
@end macro
@macro FIXME-xref{string}
@ifset PROOF
See @strong{<XREF>} \string\ @strong{</>}
@end ifset
@ifclear PROOF
See @cite{\string\}
@end ifclear
@end macro
@c End of rendition.texi

141
doc/snapshot.texi Normal file
View File

@@ -0,0 +1,141 @@
@c This is part of the paxutils manual.
@c Copyright (C) 2005, 2007 Free Software Foundation, Inc.
@c Written by Sergey Poznyakoff
@c This file is distributed under GFDL 1.1 or any later version
@c published by the Free Software Foundation.
A @dfn{snapshot file} (or @dfn{directory file}) is created during
incremental backups (@pxref{Incremental Dumps}). It
contains the status of the file system at the time of the dump and is
used to determine which files were modified since the last backup.
@GNUTAR{} version @value{VERSION} supports three snapshot file
formats. The first format, called @dfn{format 0}, is the one used by
@GNUTAR{} versions up to 1.15.1. The second format, called @dfn{format
1} is an extended version of this format, that contains more metadata
and allows for further extensions. It was used by version
1.15.1. Starting from version 1.16 and up to @value{VERSION}, the
@dfn{format 2} is used.
@GNUTAR{} is able to read all three formats, but will create
snapshots only in format 2.
This appendix describes all three formats in detail.
@enumerate 0
@cindex format 0, snapshot file
@cindex snapshot file, format 0
@item
@samp{Format 0} snapshot file begins with a line containing a
decimal number that represents a @acronym{UNIX} timestamp of the
beginning of the last archivation. This line is followed by directory
metadata descriptions, one per line. Each description has the
following format:
@smallexample
@var{nfs}@var{dev} @var{inode} @var{name}
@end smallexample
@noindent
where:
@table @var
@item nfs
A single plus character (@samp{+}), if this directory is located on
an @acronym{NFS}-mounted partition, or a single space otherwise;
@item dev
Device number of the directory;
@item inode
I-node number of the directory;
@item name
Name of the directory. Any special characters (white-space,
backslashes, etc.) are quoted.
@end table
@cindex format 1, snapshot file
@cindex snapshot file, format 1
@item
@samp{Format 1} snapshot file begins with a line specifying the
format of the file. This line has the following structure:
@smallexample
@samp{GNU tar-}@var{tar-version}@samp{-}@var{incr-format-version}
@end smallexample
@noindent
where @var{tar-version} is the version number of @GNUTAR{}
implementation that created this snapshot, and
@var{incr-format-version} is the version number of the snapshot format
(in this case @samp{1}).
Next line contains two decimal numbers, representing the
time of the last backup. First number is the number of seconds, the
second one is the number of nanoseconds, since the beginning of the
epoch.
Lines that follow contain directory metadata, one line per
directory. Each line is formatted as follows:
@smallexample
[@var{nfs}]@var{mtime-sec} @var{mtime-nsec} @var{dev} @var{inode} @var{name}
@end smallexample
@noindent
where @var{mtime-sec} and @var{mtime-nsec} represent last
modification time of this directory with nanosecond precision;
@var{nfs}, @var{dev}, @var{inode} and @var{name} have the same meaning
as with @samp{format 0}.
@cindex format 2, snapshot file
@cindex snapshot file, format 2
@item
@FIXME{}
A snapshot file begins with a format identifier, as described for
version 1, e.g.:
@smallexample
GNU tar-@value{VERSION}-2
@end smallexample
This line is followed by newline. Rest of file consists of
records, separated by null (@acronym{ASCII} 0)
characters. Thus, in contrast to the previous formats, format 2
snapshot is a binary file.
First two records are decimal numbers, representing the
time of the last backup. First number is the number of seconds, the
second one is the number of nanoseconds, since the beginning of the
epoch. These are followed by arbitrary number of directory records.
Each @dfn{directory record} contains a set of metadata describing a
particular directory. Parts of a directory record are delimited with
@acronym{ASCII} 0 characters. The following table describes each
part. The @dfn{Number} type in this table stands for a decimal number
in @acronym{ASCII} notation.
@multitable @columnfractions 0.2 0.2 0.6
@headitem Field @tab Type @tab Description
@item nfs @tab Character @tab @samp{1} if the directory is located on
an @acronym{NFS}-mounted partition, or @samp{0} otherwise;
@item mtime-sec @tab Number @tab Modification time, seconds;
@item mtime-nano @tab Number @tab Modification time, nanoseconds;
@item dev-no @tab Number @tab Device number;
@item i-no @tab Number @tab I-node number;
@item name @tab String @tab Directory name; In contrast to the
previous versions it is not quoted.
@item contents @tab Dumpdir @tab Contents of the directory;
@xref{Dumpdir}, for a description of its format.
@item
@end multitable
Dumpdirs stored in snapshot files contain only records of types
@samp{Y}, @samp{N} and @samp{D}.
@end enumerate
@c End of snapshot.texi

235
doc/sparse.texi Normal file
View File

@@ -0,0 +1,235 @@
@c This is part of the paxutils manual.
@c Copyright (C) 2006 Free Software Foundation, Inc.
@c This file is distributed under GFDL 1.1 or any later version
@c published by the Free Software Foundation.
@cindex sparse formats
@cindex sparse versions
The notion of sparse file, and the ways of handling it from the point
of view of @GNUTAR{} user have been described in detail in
@ref{sparse}. This chapter describes the internal format @GNUTAR{}
uses to store such files.
The support for sparse files in @GNUTAR{} has a long history. The
earliest version featuring this support that I was able to find was 1.09,
released in November, 1990. The format introduced back then is called
@dfn{old GNU} sparse format and in spite of the fact that its design
contained many flaws, it was the only format @GNUTAR{} supported
until version 1.14 (May, 2004), which introduced initial support for
sparse archives in @acronym{PAX} archives (@pxref{posix}). This
format was not free from design flows, either and it was subsequently
improved in versions 1.15.2 (November, 2005) and 1.15.92 (June,
2006).
In addition to GNU sparse format, @GNUTAR{} is able to read and
extract sparse files archived by @command{star}.
The following subsections describe each format in detail.
@menu
* Old GNU Format::
* PAX 0:: PAX Format, Versions 0.0 and 0.1
* PAX 1:: PAX Format, Version 1.0
@end menu
@node Old GNU Format
@appendixsubsec Old GNU Format
@cindex sparse formats, Old GNU
@cindex Old GNU sparse format
The format introduced some time around 1990 (v. 1.09). It was
designed on top of standard @code{ustar} headers in such an
unfortunate way that some of its fields overwrote fields required by
POSIX.
An old GNU sparse header is designated by type @samp{S}
(@code{GNUTYPE_SPARSE}) and has the following layout:
@multitable @columnfractions 0.10 0.10 0.20 0.20 0.40
@headitem Offset @tab Size @tab Name @tab Data type @tab Contents
@item 0 @tab 345 @tab @tab N/A @tab Not used.
@item 345 @tab 12 @tab atime @tab Number @tab @code{atime} of the file.
@item 357 @tab 12 @tab ctime @tab Number @tab @code{ctime} of the file .
@item 369 @tab 12 @tab offset @tab Number @tab For
multivolume archives: the offset of the start of this volume.
@item 381 @tab 4 @tab @tab N/A @tab Not used.
@item 385 @tab 1 @tab @tab N/A @tab Not used.
@item 386 @tab 96 @tab sp @tab @code{sparse_header} @tab (4 entries) File map.
@item 482 @tab 1 @tab isextended @tab Bool @tab @code{1} if an
extension sparse header follows, @code{0} otherwise.
@item 483 @tab 12 @tab realsize @tab Number @tab Real size of the file.
@end multitable
Each of @code{sparse_header} object at offset 386 describes a single
data chunk. It has the following structure:
@multitable @columnfractions 0.10 0.10 0.20 0.60
@headitem Offset @tab Size @tab Data type @tab Contents
@item 0 @tab 12 @tab Number @tab Offset of the
beginning of the chunk.
@item 12 @tab 12 @tab Number @tab Size of the chunk.
@end multitable
If the member contains more than four chunks, the @code{isextended}
field of the header has the value @code{1} and the main header is
followed by one or more @dfn{extension headers}. Each such header has
the following structure:
@multitable @columnfractions 0.10 0.10 0.20 0.20 0.40
@headitem Offset @tab Size @tab Name @tab Data type @tab Contents
@item 0 @tab 21 @tab sp @tab @code{sparse_header} @tab
(21 entires) File map.
@item 504 @tab 1 @tab isextended @tab Bool @tab @code{1} if an
extension sparse header follows, or @code{0} otherwise.
@end multitable
A header with @code{isextended=0} ends the map.
@node PAX 0
@appendixsubsec PAX Format, Versions 0.0 and 0.1
@cindex sparse formats, v.0.0
There are two formats available in this branch. The version @code{0.0}
is the initial version of sparse format used by @command{tar}
versions 1.14--1.15.1. The sparse file map is kept in extended
(@code{x}) PAX header variables:
@table @code
@vrindex GNU.sparse.size, extended header variable
@item GNU.sparse.size
Real size of the stored file
@item GNU.sparse.numblocks
@vrindex GNU.sparse.numblocks, extended header variable
Number of blocks in the sparse map
@item GNU.sparse.offset
@vrindex GNU.sparse.offset, extended header variable
Offset of the data block
@item GNU.sparse.numbytes
@vrindex GNU.sparse.numbytes, extended header variable
Size of the data block
@end table
The latter two variables repeat for each data block, so the overall
structure is like this:
@smallexample
@group
GNU.sparse.size=@var{size}
GNU.sparse.numblocks=@var{numblocks}
repeat @var{numblocks} times
GNU.sparse.offset=@var{offset}
GNU.sparse.numbytes=@var{numbytes}
end repeat
@end group
@end smallexample
This format presented the following two problems:
@enumerate 1
@item
Whereas the POSIX specification allows a variable to appear multiple
times in a header, it requires that only the last occurrence be
meaningful. Thus, multiple occurrences of @code{GNU.sparse.offset} and
@code{GNU.sparse.numbytes} are conflicting with the POSIX specs.
@item
Attempting to extract such archives using a third-party @command{tar}s
results in extraction of sparse files in @emph{compressed form}. If
the @command{tar} implementation in question does not support POSIX
format, it will also extract a file containing extension header
attributes. This file can be used to expand the file to its original
state. However, posix-aware @command{tar}s will usually ignore the
unknown variables, which makes restoring the file more
difficult. @xref{extracting sparse v.0.x, Extraction of sparse
members in v.0.0 format}, for the detailed description of how to
restore such members using non-GNU @command{tar}s.
@end enumerate
@cindex sparse formats, v.0.1
@GNUTAR{} 1.15.2 introduced sparse format version @code{0.1}, which
attempted to solve these problems. As its predecessor, this format
stores sparse map in the extended POSIX header. It retains
@code{GNU.sparse.size} and @code{GNU.sparse.numblocks} variables, but
instead of @code{GNU.sparse.offset}/@code{GNU.sparse.numbytes} pairs
it uses a single variable:
@table @code
@item GNU.sparse.map
@vrindex GNU.sparse.map, extended header variable
Map of non-null data chunks. It is a string consisting of
comma-separated values "@var{offset},@var{size}[,@var{offset-1},@var{size-1}...]"
@end table
To address the 2nd problem, the @code{name} field in @code{ustar}
is replaced with a special name, constructed using the following pattern:
@smallexample
%d/GNUSparseFile.%p/%f
@end smallexample
@vrindex GNU.sparse.name, extended header variable
The real name of the sparse file is stored in the variable
@code{GNU.sparse.name}. Thus, those @command{tar} implementations
that are not aware of GNU extensions will at least extract the files
into separate directories, giving the user a possibility to expand it
afterwards. @xref{extracting sparse v.0.x, Extraction of sparse
members in v.0.1 format}, for the detailed description of how to
restore such members using non-GNU @command{tar}s.
The resulting @code{GNU.sparse.map} string can be @emph{very} long.
Although POSIX does not impose any limit on the length of a @code{x}
header variable, this possibly can confuse some tars.
@node PAX 1
@appendixsubsec PAX Format, Version 1.0
@cindex sparse formats, v.1.0
The version @code{1.0} of sparse format was introduced with @GNUTAR{}
1.15.92. Its main objective was to make the resulting file
extractable with little effort even by non-posix aware @command{tar}
implementations. Starting from this version, the extended header
preceding a sparse member always contains the following variables that
identify the format being used:
@table @code
@item GNU.sparse.major
@vrindex GNU.sparse.major, extended header variable
Major version
@item GNU.sparse.minor
@vrindex GNU.sparse.minor, extended header variable
Minor version
@end table
The @code{name} field in @code{ustar} header contains a special name,
constructed using the following pattern:
@smallexample
%d/GNUSparseFile.%p/%f
@end smallexample
@vrindex GNU.sparse.name, extended header variable, in v.1.0
@vrindex GNU.sparse.realsize, extended header variable
The real name of the sparse file is stored in the variable
@code{GNU.sparse.name}. The real size of the file is stored in the
variable @code{GNU.sparse.realsize}.
The sparse map itself is stored in the file data block, preceding the actual
file data. It consists of a series of octal numbers of arbitrary length, delimited
by newlines. The map is padded with nulls to the nearest block boundary.
The first number gives the number of entries in the map. Following are map entries,
each one consisting of two numbers giving the offset and size of the
data block it describes.
The format is designed in such a way that non-posix aware tars and tars not
supporting @code{GNU.sparse.*} keywords will extract each sparse file
in its condensed form with the file map prepended and will place it
into a separate directory. Then, using a simple program it would be
possible to expand the file to its original form even without @GNUTAR{}.
@xref{Sparse Recovery}, for the detailed information on how to extract
sparse members without @GNUTAR{}.

View File

@@ -0,0 +1,58 @@
@c This is part of the paxutils manual.
@c Copyright (C) 2007 Free Software Foundation, Inc.
@c This file is distributed under GFDL 1.1 or any later version
@c published by the Free Software Foundation.
@cindex Device numbers, changing
@cindex snapshot files, editing
@cindex snapshot files, fixing device numbers
Sometimes device numbers can change after upgrading your kernel
version or recofiguring the harvare. Reportedly this is the case with
some newer @i{Linux} kernels, when using @acronym{LVM}. In majority of
cases this change is unnoticed by the users. However, it influences
@command{tar} incremental backups: the device number is stored in tar
snapshot files (@pxref{Snapshot Files}) and is used to determine whether
the file has changed since the last backup. If the device numbers
change for some reason, the next backup you run will be a full backup.
@pindex tar-snapshot-edit
To minimize the impact in these cases, GNU @command{tar} comes with
the @command{tar-snapshot-edit} utility for inspecting and updating
device numbers in snapshot files. The utility, written by
Dustin J.@: Mitchell, is available from
@uref{http://www.gnu.org/@/software/@/tar/@/utils/@/tar-snapshot-edit.html,
@GNUTAR{} home page}.
To obtain the device numbers used in the snapshot file, run
@smallexample
$ @kbd{tar-snapshot-edit @var{snapfile}}
@end smallexample
@noindent
where @var{snapfile} is the name of the snapshot file (you can supply as many
files as you wish in a single command line ).
To update all occurrences of the given device number in the file, use
@option{-r} option. It takes a single argument of the form
@samp{@var{olddev}-@var{newdev}}, where @var{olddev} is the device number
used in the snapshot file, and @var{newdev} is the corresponding new device
number. Both numbers may be specified in hex (e.g., @samp{0xfe01}),
decimal (e.g., @samp{65025}), or as a major:minor number pair (e.g.,
@samp{254:1}). To change several device numbers at once, specify them
in a single comma-separated list, as in
@option{-r 0x3060-0x4500,0x307-0x4600}.
Before updating the snapshot file, it is a good idea to create a backup
copy of it. This is accomplished by @samp{-b} option. The name of the
backup file is obtained by appending @samp{~} to the original file name.
An example session:
@smallexample
$ @kbd{tar-snapshot-edit /var/backup/snap.a}
file version 2
/tmp/snap: Device 0x0306 occurs 634 times.
$ @kbd{tar-snapshot-edit -b -r 0x0306-0x4500 /var/backup/snap.a}
file version 2
@end smallexample

10873
doc/tar.texi

File diff suppressed because it is too large Load Diff

26
doc/texify.sed Normal file
View File

@@ -0,0 +1,26 @@
# Copyright (C) 2006, 2007 Free Software Foundation, Inc.
#
# GNU tar is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 3, or (at
# your option) any later version.
#
# GNU tar is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GNU tar; if not, write to the Free Software
# Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1{s,/\*,@comment ,
b
}
2,/.*\*\//{s,\*/,,;s/^/@comment/
b
}
/\/* END \*\//,$d
s/\([{}]\)/@\1/g
s,/\*,&@r{,
s,\*/,}&,

13
doc/untabify.el Normal file
View File

@@ -0,0 +1,13 @@
;;;; Untabify the sources.
;;;; Usage: emacs -batch -l untabify.el [file ...]
(defun global-untabify (buflist)
(mapcar
(lambda (bufname)
(set-buffer (find-file bufname))
(untabify (point-min) (point-max))
(save-buffer)
(kill-buffer (current-buffer)))
buflist))
(global-untabify command-line-args-left)

22
doc/value.texi Normal file
View File

@@ -0,0 +1,22 @@
@c This is part of GNU tar manual.
@c Copyright (C) 1992, 1994, 1995, 1996, 1997, 1999, 2000, 2001,
@c 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
@c See file tar.texi for copying conditions.
@macro GNUTAR
@acronym{GNU} @command{tar}
@end macro
@macro xopindex{option,text}
@opindex \option\@r{, \text\}
@end macro
@macro opsummary{option}
@ifclear ANCHOR--\option\
@set ANCHOR--\option\ 1
@anchor{--\option\}
@end ifclear
@xopindex{\option\, summary}
@end macro

60
gnulib.modules Normal file
View File

@@ -0,0 +1,60 @@
# List of gnulib modules needed for GNU tar.
# A module name per line. Empty lines and comments are ignored.
alloca
argmatch
argp
backupfile
closeout
configmake
dirname
error
exclude
exitfail
fileblocks
fnmatch-gnu
fseeko
ftruncate
full-write
getdate
getline
getopt
getpagesize
gettext
gettime
hash
human
inttypes
lchown
localcharset
memset
mkdtemp
modechange
obstack
quote
quotearg
rmdir
rpmatch
safe-read
save-cwd
savedir
setenv
snprintf
stat-time
stdbool
stdint
stpcpy
strdup
strerror
strtol
strtoul
timespec
unlinkdir
unlocked-io
utime
utimens
version-etc-fsf
xalloc
xalloc-die
xgetcwd
xstrtoumax

268
lib/.cvsignore Normal file
View File

@@ -0,0 +1,268 @@
.cvsignore
.deps
Makefile
Makefile.in
alloca.c
alloca.h
alloca.in.h
argmatch.c
argmatch.h
argp-ba.c
argp-eexst.c
argp-fmtstream.c
argp-fmtstream.h
argp-fs-xinl.c
argp-help.c
argp-namefrob.h
argp-parse.c
argp-pin.c
argp-pv.c
argp-pvh.c
argp-xinl.c
argp.h
asnprintf.c
at-func.c
backupfile.c
backupfile.h
basename.c
canonicalize-lgpl.c
canonicalize.h
charset.alias
chdir-long.c
chdir-long.h
chown.c
close-stream.c
close-stream.h
closeout.c
closeout.h
config.charset
configmake.h
creat-safer.c
dirent.h
dirent.in.h
dirfd.c
dirfd.h
dirname.c
dirname.h
dup-safer.c
dup2.c
error.c
error.h
exclude.c
exclude.h
exitfail.c
exitfail.h
fchdir.c
fchmodat.c
fchown-stub.c
fchownat.c
fcntl--.h
fcntl-safer.h
fcntl.h
fcntl.in.h
fd-safer.c
fileblocks.c
float+.h
float.h
float.in.h
fnmatch.c
fnmatch.h
fnmatch.in.h
fnmatch_loop.c
fpending.c
fpending.h
fseeko.c
fstatat.c
ftruncate.c
full-write.c
full-write.h
getcwd.c
getdate.c
getdate.h
getdate.y
getdelim.c
getline.c
getopt.c
getopt.h
getopt.in.h
getopt1.c
getopt_int.h
getpagesize.c
getpagesize.h
gettext.h
gettime.c
gettimeofday.c
gnulib.mk
hash.c
hash.h
human.c
human.h
imaxtostr.c
intprops.h
inttostr.c
inttostr.h
inttypes.h
inttypes.in.h
lchown.c
localcharset.c
localcharset.h
lseek.c
lstat.c
lstat.h
malloc.c
malloca.c
malloca.h
malloca.valgrind
mbchar.c
mbchar.h
mbscasecmp.c
mbuiter.h
memchr.c
mempcpy.c
memrchr.c
memset.c
mkdirat.c
mkdtemp.c
mktime.c
modechange.c
modechange.h
obstack.c
obstack.h
offtostr.c
open-safer.c
openat-die.c
openat-priv.h
openat-proc.c
openat.c
openat.h
pathmax.h
paxerror.c
paxexit.c
paxlib.h
paxnames.c
pipe-safer.c
printf-args.c
printf-args.h
printf-parse.c
printf-parse.h
quote.c
quote.h
quotearg.c
quotearg.h
readlink.c
realloc.c
ref-add.sed
ref-add.sin
ref-del.sed
ref-del.sin
regcomp.c
regex.c
regex.h
regex_internal.c
regex_internal.h
regexec.c
rmdir.c
rmt-command.h
rmt.h
rpmatch.c
rtapelib.c
safe-read.c
safe-read.h
safe-write.c
safe-write.h
same-inode.h
save-cwd.c
save-cwd.h
savedir.c
savedir.h
setenv.c
setenv.h
sleep.c
snprintf.c
stat-macros.h
stat-time.h
stdbool.h
stdbool.in.h
stdint.h
stdint.in.h
stdio.h
stdio.in.h
stdlib.h
stdlib.in.h
stpcpy.c
strcasecmp.c
strchrnul.c
strdup.c
streq.h
strerror.c
string.h
string.in.h
strings.in.h
stripslash.c
strncasecmp.c
strndup.c
strnlen.c
strnlen1.c
strnlen1.h
strtoimax.c
strtol.c
strtoll.c
strtoul.c
strtoull.c
strtoumax.c
sys
sys_stat.h
sys_stat.in.h
sys_time.h
sys_time.in.h
sysexits.h
sysexits.in.h
system-ioctl.h
system.h
tempname.c
tempname.h
time.h
time.in.h
time_r.c
timespec.h
uinttostr.c
umaxtostr.c
unistd--.h
unistd-safer.h
unistd.h
unistd.in.h
unitypes.h
uniwidth
uniwidth.h
unlinkdir.c
unlinkdir.h
unlocked-io.h
unsetenv.c
utime.c
utimens.c
utimens.h
vasnprintf.c
vasnprintf.h
verify.h
version-etc-fsf.c
version-etc.c
version-etc.h
vsnprintf.c
wchar.h
wchar.in.h
wctype.h
wctype.in.h
wcwidth.c
xalloc-die.c
xalloc.h
xgetcwd.c
xgetcwd.h
xmalloc.c
xsize.h
xstrndup.c
xstrndup.h
xstrtol-error.c
xstrtol.c
xstrtol.h
xstrtoul.c
xstrtoumax.c

View File

@@ -1,45 +1,41 @@
# Makefile for GNU tar library.
# Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
# Makefile for GNU tar library. -*- Makefile -*-
# Copyright (C) 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2003, 2004,
# 2005, 2006, 2007 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
AUTOMAKE_OPTIONS = gnits
include gnulib.mk
noinst_LIBRARIES = libtar.a
rmt-command.h : Makefile
rm -f $@-t $@
echo "#ifndef DEFAULT_RMT_COMMAND" >> $@-t
echo "# define DEFAULT_RMT_COMMAND \"$(DEFAULT_RMT_DIR)/`echo rmt | sed '$(transform)'`$(EXEEXT)\"" >> $@-t
echo "#endif" >> $@-t
mv $@-t $@
BUILT_SOURCES += rmt-command.h
CLEANFILES += rmt-command.h rmt-command.h-t
EXTRA_DIST = \
alloca.c fileblocks.c fnmatch.c ftruncate.c execlp.c gmalloc.c \
memset.c mkdir.c modechange.h rename.c rmdir.c stpcpy.c strstr.c
noinst_HEADERS += system.h system-ioctl.h rmt.h paxlib.h stdopen.h
libtar_a_SOURCES += \
paxerror.c paxexit.c paxlib.h paxnames.c \
prepargs.c prepargs.h \
rtapelib.c \
rmt.h \
stdopen.c stdopen.h \
system.h system-ioctl.h
noinst_HEADERS = \
argmatch.h backupfile.h error.h fnmatch.h getopt.h getdate.h getpagesize.h \
pathmax.h
libtar_a_SOURCES = \
argmatch.c backupfile.c error.c getdate.y getopt.c getopt1.c getversion.c \
modechange.c msleep.c xgetcwd.c xmalloc.c xstrdup.c
INCLUDES = -I.. -I$(srcdir) -I../intl
libtar_a_LIBADD = @ALLOCA@ @LIBOBJS@
libtar_a_DEPENDENCIES = $(libtar_a_LIBADD)
# Say $(srcdir), so GNU make does not report an ambiguity with the .y.c rule.
$(srcdir)/getdate.c: getdate.y
@echo Expect 13 shift/reduce conflicts...
cd $(srcdir) && \
$(YACC) $(YFLAGS) getdate.y; \
mv -f y.tab.c getdate.c
libtar_a_LIBADD += $(LIBOBJS)
libtar_a_DEPENDENCIES += $(LIBOBJS)

View File

@@ -33,7 +33,15 @@
#endif
#ifdef emacs
# include "lisp.h"
# include "blockinput.h"
# define xalloc_die() memory_full ()
# ifdef EMACS_FREE
# undef free
# define free EMACS_FREE
# endif
#else
# include <xalloc.h>
#endif
/* If compiling with GCC 2, this file's not needed. */
@@ -53,6 +61,8 @@
you
lose
-- must know STACK_DIRECTION at compile-time
/* Using #error here is not wise since this file should work for
old and obscure compilers. */
# endif /* STACK_DIRECTION undefined */
# endif /* static */
# endif /* emacs */
@@ -67,32 +77,19 @@ long i00afunc ();
# define ADDRESS_FUNCTION(arg) &(arg)
# endif
# if __STDC__
typedef void *pointer;
# else
typedef char *pointer;
# ifndef POINTER_TYPE
# ifdef __STDC__
# define POINTER_TYPE void
# else
# define POINTER_TYPE char
# endif
# endif
typedef POINTER_TYPE *pointer;
# ifndef NULL
# define NULL 0
# endif
/* Different portions of Emacs need to call different versions of
malloc. The Emacs executable needs alloca to call xmalloc, because
ordinary malloc isn't protected from input signals. On the other
hand, the utilities in lib-src need alloca to call malloc; some of
them are very simple, and don't have an xmalloc routine.
Non-Emacs programs expect this to call xmalloc.
Callers below should use malloc. */
# ifndef emacs
# undef malloc
# define malloc xmalloc
# endif
extern pointer malloc ();
/* Define STACK_DIRECTION if you know the direction of stack
growth for your system; otherwise it will be automatically
deduced at run-time.
@@ -169,7 +166,8 @@ static header *last_alloca_header = NULL; /* -> last alloca header. */
implementations of C, for example under Gould's UTX/32. */
pointer
alloca (size_t size)
alloca (size)
size_t size;
{
auto char probe; /* Probes stack depth: */
register char *depth = ADDRESS_FUNCTION (probe);
@@ -215,8 +213,14 @@ alloca (size_t size)
/* Allocate combined header + user data storage. */
{
register pointer new = malloc (sizeof (header) + size);
/* Address of header. */
register pointer new;
size_t combined_size = sizeof (header) + size;
if (combined_size < sizeof (header))
xalloc_die ();
new = xmalloc (combined_size);
if (new == 0)
abort();

View File

@@ -1,5 +1,7 @@
/* argmatch.c -- find a match for a string in an array
Copyright (C) 1990, 1998, 1999 Free Software Foundation, Inc.
Copyright (C) 1990, 1998, 1999, 2001, 2002, 2003 Free Software
Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -18,39 +20,33 @@
/* Written by David MacKenzie <djm@ai.mit.edu>
Modified by Akim Demaille <demaille@inf.enst.fr> */
#if HAVE_CONFIG_H
# include <config.h>
#endif
/* Specification. */
#include "argmatch.h"
#include <stdio.h>
#ifdef STDC_HEADERS
# include <string.h>
#endif
#include <stdlib.h>
#include <string.h>
#if HAVE_LOCALE_H
# include <locale.h>
#endif
#if ENABLE_NLS
# include <libintl.h>
# define _(Text) gettext (Text)
#else
# define _(Text) Text
#endif
#include "gettext.h"
#define _(msgid) gettext (msgid)
#include "error.h"
#include "quotearg.h"
#include "quote.h"
#include "unlocked-io.h"
/* When reporting an invalid argument, show nonprinting characters
by using the quoting style ARGMATCH_QUOTING_STYLE. Do not use
literal_quoting_style. */
#ifndef ARGMATCH_QUOTING_STYLE
# define ARGMATCH_QUOTING_STYLE escape_quoting_style
# define ARGMATCH_QUOTING_STYLE locale_quoting_style
#endif
/* The following test is to work around the gross typo in
systems like Sony NEWS-OS Release 4.0C, whereby EXIT_FAILURE
is defined to 0, not 1. */
#if !EXIT_FAILURE
# undef EXIT_FAILURE
#ifndef EXIT_FAILURE
# define EXIT_FAILURE 1
#endif
@@ -78,7 +74,6 @@ argmatch_exit_fn argmatch_die = __argmatch_die;
null-terminated array ARGLIST, return the index in ARGLIST
of the matched element, else -1 if it does not match any element
or -2 if it is ambiguous (is a prefix of more than one element).
If SENSITIVE, comparison is case sensitive.
If VALLIST is none null, use it to resolve ambiguities limited to
synonyms, i.e., for
@@ -86,10 +81,9 @@ argmatch_exit_fn argmatch_die = __argmatch_die;
"no", "nope" -> 1
"y" is a valid argument, for `0', and "n" for `1'. */
static int
__argmatch_internal (const char *arg, const char *const *arglist,
const char *vallist, size_t valsize,
int case_sensitive)
int
argmatch (const char *arg, const char *const *arglist,
const char *vallist, size_t valsize)
{
int i; /* Temporary index in ARGLIST. */
size_t arglen; /* Length of ARG. */
@@ -101,9 +95,7 @@ __argmatch_internal (const char *arg, const char *const *arglist,
/* Test all elements for either exact match or abbreviated matches. */
for (i = 0; arglist[i]; i++)
{
if (case_sensitive
? !strncmp (arglist[i], arg, arglen)
: !strncasecmp (arglist[i], arg, arglen))
if (!strncmp (arglist[i], arg, arglen))
{
if (strlen (arglist[i]) == arglen)
/* Exact match found. */
@@ -131,22 +123,6 @@ __argmatch_internal (const char *arg, const char *const *arglist,
return matchind;
}
/* argmatch - case sensitive version */
int
argmatch (const char *arg, const char *const *arglist,
const char *vallist, size_t valsize)
{
return __argmatch_internal (arg, arglist, vallist, valsize, 1);
}
/* argcasematch - case insensitive version */
int
argcasematch (const char *arg, const char *const *arglist,
const char *vallist, size_t valsize)
{
return __argmatch_internal (arg, arglist, vallist, valsize, 0);
}
/* Error reporting for argmatch.
CONTEXT is a description of the type of entity that was being matched.
VALUE is the invalid value that was given.
@@ -155,21 +131,12 @@ argcasematch (const char *arg, const char *const *arglist,
void
argmatch_invalid (const char *context, const char *value, int problem)
{
enum quoting_style saved_quoting_style;
char const *format;
char const *format = (problem == -1
? _("invalid argument %s for %s")
: _("ambiguous argument %s for %s"));
/* Make sure to have a good quoting style to report errors.
literal is insane here. */
saved_quoting_style = get_quoting_style (NULL);
set_quoting_style (NULL, ARGMATCH_QUOTING_STYLE);
format = (problem == -1
? _("invalid argument `%s' for `%s'")
: _("ambiguous argument `%s' for `%s'"));
error (0, 0, format, quotearg (value), context);
set_quoting_style (NULL, saved_quoting_style);
error (0, 0, format, quotearg_n_style (0, ARGMATCH_QUOTING_STYLE, value),
quote_n (1, context));
}
/* List the valid arguments for argmatch.
@@ -210,12 +177,9 @@ int
__xargmatch_internal (const char *context,
const char *arg, const char *const *arglist,
const char *vallist, size_t valsize,
int case_sensitive,
argmatch_exit_fn exit_fn)
{
int res = __argmatch_internal (arg, arglist,
vallist, valsize,
case_sensitive);
int res = argmatch (arg, arglist, vallist, valsize);
if (res >= 0)
/* Success. */
return res;
@@ -301,12 +265,12 @@ main (int argc, const char *const *argv)
}
if ((cp = getenv ("VERSION_CONTROL")))
backup_type = XARGCASEMATCH ("$VERSION_CONTROL", cp,
backup_args, backup_vals);
backup_type = XARGMATCH ("$VERSION_CONTROL", cp,
backup_args, backup_vals);
if (argc == 2)
backup_type = XARGCASEMATCH (program_name, argv[1],
backup_args, backup_vals);
backup_type = XARGMATCH (program_name, argv[1],
backup_args, backup_vals);
printf ("The version control is `%s'\n",
ARGMATCH_TO_ARGUMENT (backup_type, backup_args, backup_vals));

View File

@@ -1,22 +1,18 @@
/* Error handler for noninteractive utilities
Copyright (C) 1990-1998, 2000, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library. Its master source is NOT part of
the C library, however. The master source lives in /gd/gnu/lib.
Copyright (C) 1990-1998, 2000, 2001, 2002 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/* Written by David MacKenzie <djm@gnu.ai.mit.edu>. */
@@ -25,7 +21,13 @@
#endif
#include <stdio.h>
#include <libintl.h>
#ifdef _LIBC
# include <libintl.h>
#else
# include "gettext.h"
#endif
#ifdef _LIBC
# include <wchar.h>
# define mbsrtowcs __mbsrtowcs
@@ -53,6 +55,10 @@ void exit ();
#include "error.h"
#if !_LIBC
# include "unlocked-io.h"
#endif
#ifndef _
# define _(String) String
#endif
@@ -74,6 +80,7 @@ unsigned int error_message_count;
# define program_name program_invocation_name
# include <errno.h>
# include <libio/libioP.h>
/* In GNU libc we want do not want to use the common name `error' directly.
Instead make it a weak alias. */
@@ -87,27 +94,38 @@ extern void __error_at_line (int status, int errnum, const char *file_name,
# define error_at_line __error_at_line
# ifdef USE_IN_LIBIO
# include <libio/iolibio.h>
# define fflush(s) _IO_fflush (s)
# include <libio/iolibio.h>
# define fflush(s) INTUSE(_IO_fflush) (s)
# undef putc
# define putc(c, fp) INTUSE(_IO_putc) (c, fp)
# endif
#else /* not _LIBC */
# if !HAVE_DECL_STRERROR_R && STRERROR_R_CHAR_P
# ifndef HAVE_DECL_STRERROR_R
"this configure-time declaration test was not run"
# endif
char *strerror_r ();
# endif
/* The calling program should define program_name and set it to the
name of the executing program. */
extern char *program_name;
# ifdef HAVE_STRERROR_R
# if HAVE_STRERROR_R || defined strerror_r
# define __strerror_r strerror_r
# else
# if HAVE_STRERROR
# ifndef strerror /* On some systems, strerror is a macro */
# ifndef HAVE_DECL_STRERROR
"this configure-time declaration test was not run"
# endif
# if !HAVE_DECL_STRERROR
char *strerror ();
# endif
# else
static char *
private_strerror (errnum)
int errnum;
private_strerror (int errnum)
{
extern char *sys_errlist[];
extern int sys_nerr;
@@ -118,9 +136,43 @@ private_strerror (errnum)
}
# define strerror private_strerror
# endif /* HAVE_STRERROR */
# endif /* HAVE_STRERROR_R */
# endif /* HAVE_STRERROR_R || defined strerror_r */
#endif /* not _LIBC */
static void
print_errno_message (int errnum)
{
char const *s;
#if defined HAVE_STRERROR_R || _LIBC
char errbuf[1024];
# if STRERROR_R_CHAR_P || _LIBC
s = __strerror_r (errnum, errbuf, sizeof errbuf);
# else
if (__strerror_r (errnum, errbuf, sizeof errbuf) == 0)
s = errbuf;
else
s = 0;
# endif
#else
s = strerror (errnum);
#endif
#if !_LIBC
if (! s)
s = _("Unknown system error");
#endif
#if _LIBC && USE_IN_LIBIO
if (_IO_fwide (stderr, 0) > 0)
{
__fwprintf (stderr, L": %s", s);
return;
}
#endif
fprintf (stderr, ": %s", s);
}
#ifdef VA_START
static void
@@ -177,25 +229,12 @@ error_tail (int status, int errnum, const char *message, va_list args)
++error_message_count;
if (errnum)
{
#if defined HAVE_STRERROR_R || _LIBC
char errbuf[1024];
char *s = __strerror_r (errnum, errbuf, sizeof errbuf);
print_errno_message (errnum);
# if _LIBC && USE_IN_LIBIO
if (_IO_fwide (stderr, 0) > 0)
__fwprintf (stderr, L": %s", s);
else
# endif
fprintf (stderr, ": %s", s);
#else
fprintf (stderr, ": %s", strerror (errnum));
#endif
}
#if _LIBC && USE_IN_LIBIO
if (_IO_fwide (stderr, 0) > 0)
putwc (L'\n', stderr);
else
#endif
# endif
putc ('\n', stderr);
fflush (stderr);
if (status)
@@ -252,7 +291,7 @@ error (status, errnum, message, va_alist)
++error_message_count;
if (errnum)
fprintf (stderr, ": %s", strerror (errnum));
print_errno_message (errnum);
putc ('\n', stderr);
fflush (stderr);
if (status)
@@ -343,7 +382,7 @@ error_at_line (status, errnum, file_name, line_number, message, va_alist)
++error_message_count;
if (errnum)
fprintf (stderr, ": %s", strerror (errnum));
print_errno_message (errnum);
putc ('\n', stderr);
fflush (stderr);
if (status)

View File

@@ -1,5 +1,7 @@
/* exclude.c -- exclude file names
Copyright 1992, 1993, 1994, 1997 Free Software Foundation, Inc.
Copyright (C) 1992, 1993, 1994, 1997, 1999, 2000, 2001, 2002, 2003 Free
Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -22,72 +24,205 @@
# include <config.h>
#endif
#include <stdbool.h>
#include <errno.h>
#ifndef errno
extern int errno;
#endif
#include <exclude.h>
#include <fnmatch.h>
#include <stddef.h>
#include <stdio.h>
#include <sys/types.h>
#if HAVE_STDLIB_H
# include <stdlib.h>
#endif
#if HAVE_STRING_H
# include <string.h>
#endif
#if HAVE_STRINGS_H
# include <strings.h>
#endif
#if HAVE_INTTYPES_H
# include <inttypes.h>
#else
# if HAVE_STDINT_H
# include <stdint.h>
# endif
#endif
void *xmalloc PARAMS ((size_t));
void *xrealloc PARAMS ((void *, size_t));
#include "exclude.h"
#include "fnmatch.h"
#include "unlocked-io.h"
#include "xalloc.h"
/* Keep track of excluded file name patterns. */
#ifndef SIZE_MAX
# define SIZE_MAX ((size_t) -1)
#endif
/* Verify a requirement at compile-time (unlike assert, which is runtime). */
#define verify(name, assertion) struct name { char a[(assertion) ? 1 : -1]; }
/* Non-GNU systems lack these options, so we don't need to check them. */
#ifndef FNM_CASEFOLD
# define FNM_CASEFOLD 0
#endif
#ifndef FNM_LEADING_DIR
# define FNM_LEADING_DIR 0
#endif
verify (EXCLUDE_macros_do_not_collide_with_FNM_macros,
(((EXCLUDE_ANCHORED | EXCLUDE_INCLUDE | EXCLUDE_WILDCARDS)
& (FNM_PATHNAME | FNM_NOESCAPE | FNM_PERIOD | FNM_LEADING_DIR
| FNM_CASEFOLD))
== 0));
/* An exclude pattern-options pair. The options are fnmatch options
ORed with EXCLUDE_* options. */
struct patopts
{
char const *pattern;
int options;
};
/* An exclude list, of pattern-options pairs. */
struct exclude
{
char const **exclude;
int exclude_alloc;
int exclude_count;
struct patopts *exclude;
size_t exclude_alloc;
size_t exclude_count;
};
/* Return a newly allocated and empty exclude list. */
struct exclude *
new_exclude (void)
{
struct exclude *ex = (struct exclude *) xmalloc (sizeof (struct exclude));
struct exclude *ex = xmalloc (sizeof *ex);
ex->exclude_count = 0;
ex->exclude_alloc = 64;
ex->exclude = (char const **) xmalloc (ex->exclude_alloc * sizeof (char *));
ex->exclude_alloc = (1 << 6); /* This must be a power of 2. */
ex->exclude = xmalloc (ex->exclude_alloc * sizeof ex->exclude[0]);
return ex;
}
int
excluded_filename (struct exclude const *ex, char const *f)
{
char const * const *exclude = ex->exclude;
int exclude_count = ex->exclude_count;
int i;
for (i = 0; i < exclude_count; i++)
if (fnmatch (exclude[i], f, 0) == 0)
return 1;
return 0;
}
/* Free the storage associated with an exclude list. */
void
add_exclude (struct exclude *ex, char const *pattern)
free_exclude (struct exclude *ex)
{
if (ex->exclude_alloc <= ex->exclude_count)
ex->exclude = (char const **) xrealloc (ex->exclude,
((ex->exclude_alloc *= 2)
* sizeof (char *)));
ex->exclude[ex->exclude_count++] = pattern;
free (ex->exclude);
free (ex);
}
int
add_exclude_file (struct exclude *ex, char const *filename, char line_end)
/* Return zero if PATTERN matches F, obeying OPTIONS, except that
(unlike fnmatch) wildcards are disabled in PATTERN. */
static int
fnmatch_no_wildcards (char const *pattern, char const *f, int options)
{
int use_stdin = filename[0] == '-' && !filename[1];
if (! (options & FNM_LEADING_DIR))
return ((options & FNM_CASEFOLD)
? strcasecmp (pattern, f)
: strcmp (pattern, f));
else
{
size_t patlen = strlen (pattern);
int r = ((options & FNM_CASEFOLD)
? strncasecmp (pattern, f, patlen)
: strncmp (pattern, f, patlen));
if (! r)
{
r = f[patlen];
if (r == '/')
r = 0;
}
return r;
}
}
/* Return true if EX excludes F. */
bool
excluded_filename (struct exclude const *ex, char const *f)
{
size_t exclude_count = ex->exclude_count;
/* If no options are given, the default is to include. */
if (exclude_count == 0)
return false;
else
{
struct patopts const *exclude = ex->exclude;
size_t i;
/* Otherwise, the default is the opposite of the first option. */
bool excluded = !! (exclude[0].options & EXCLUDE_INCLUDE);
/* Scan through the options, seeing whether they change F from
excluded to included or vice versa. */
for (i = 0; i < exclude_count; i++)
{
char const *pattern = exclude[i].pattern;
int options = exclude[i].options;
if (excluded == !! (options & EXCLUDE_INCLUDE))
{
int (*matcher) (char const *, char const *, int) =
(options & EXCLUDE_WILDCARDS
? fnmatch
: fnmatch_no_wildcards);
bool matched = ((*matcher) (pattern, f, options) == 0);
char const *p;
if (! (options & EXCLUDE_ANCHORED))
for (p = f; *p && ! matched; p++)
if (*p == '/' && p[1] != '/')
matched = ((*matcher) (pattern, p + 1, options) == 0);
excluded ^= matched;
}
}
return excluded;
}
}
/* Append to EX the exclusion PATTERN with OPTIONS. */
void
add_exclude (struct exclude *ex, char const *pattern, int options)
{
struct patopts *patopts;
if (ex->exclude_alloc <= ex->exclude_count)
{
size_t s = 2 * ex->exclude_alloc;
if (! (0 < s && s <= SIZE_MAX / sizeof ex->exclude[0]))
xalloc_die ();
ex->exclude_alloc = s;
ex->exclude = xrealloc (ex->exclude, s * sizeof ex->exclude[0]);
}
patopts = &ex->exclude[ex->exclude_count++];
patopts->pattern = pattern;
patopts->options = options;
}
/* Use ADD_FUNC to append to EX the patterns in FILENAME, each with
OPTIONS. LINE_END terminates each pattern in the file. Return -1
on failure, 0 on success. */
int
add_exclude_file (void (*add_func) (struct exclude *, char const *, int),
struct exclude *ex, char const *filename, int options,
char line_end)
{
bool use_stdin = filename[0] == '-' && !filename[1];
FILE *in;
char *buf;
char *p;
char const *pattern;
char const *lim;
size_t buf_alloc = 1024;
size_t buf_alloc = (1 << 10); /* This must be a power of two. */
size_t buf_count = 0;
int c;
int e = 0;
@@ -103,22 +238,27 @@ add_exclude_file (struct exclude *ex, char const *filename, char line_end)
{
buf[buf_count++] = c;
if (buf_count == buf_alloc)
buf = xrealloc (buf, buf_alloc *= 2);
{
buf_alloc *= 2;
if (! buf_alloc)
xalloc_die ();
buf = xrealloc (buf, buf_alloc);
}
}
buf = xrealloc (buf, buf_count + 1);
if (ferror (in))
e = errno;
if (!use_stdin && fclose (in) != 0)
e = errno;
buf = xrealloc (buf, buf_count + 1);
for (pattern = p = buf, lim = buf + buf_count; p <= lim; p++)
if (p < lim ? *p == line_end : buf < p && p[-1])
{
*p = '\0';
add_exclude (ex, pattern);
(*add_func) (ex, pattern, options);
pattern = p + 1;
}

View File

@@ -1,5 +1,7 @@
/* exclude.h -- declarations for excluding file names
Copyright 1992, 1993, 1994, 1997 Free Software Foundation, Inc.
Copyright (C) 1992, 1993, 1994, 1997, 1999, 2001, 2002, 2003 Free
Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -18,17 +20,24 @@
/* Written by Paul Eggert <eggert@twinsun.com> */
#ifndef PARAMS
# if defined PROTOTYPES || (defined __STDC__ && __STDC__)
# define PARAMS(Args) Args
# else
# define PARAMS(Args) ()
# endif
#endif
/* Exclude options, which can be ORed with fnmatch options. */
/* Patterns must match the start of file names, instead of matching
anywhere after a '/'. */
#define EXCLUDE_ANCHORED (1 << 30)
/* Include instead of exclude. */
#define EXCLUDE_INCLUDE (1 << 29)
/* '?', '*', '[', and '\\' are special in patterns. Without this
option, these characters are ordinary and fnmatch is not used. */
#define EXCLUDE_WILDCARDS (1 << 28)
struct exclude;
struct exclude *new_exclude PARAMS ((void));
void add_exclude PARAMS ((struct exclude *, char const *));
int add_exclude_file PARAMS ((struct exclude *, char const *, char));
int excluded_filename PARAMS ((struct exclude const *, char const *));
struct exclude *new_exclude (void);
void free_exclude (struct exclude *);
void add_exclude (struct exclude *, char const *, int);
int add_exclude_file (void (*) (struct exclude *, char const *, int),
struct exclude *, char const *, int, char);
bool excluded_filename (struct exclude const *, char const *);

View File

@@ -1,4 +1,5 @@
/* Copyright 1991, 1992, 1993, 1996, 1997, 2000 Free Software Foundation, Inc.
/* Copyright (C) 1991, 1992, 1993, 1996, 1997, 1998, 1999, 2000, 2001,
2002 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -10,9 +11,9 @@
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#if HAVE_CONFIG_H
# include <config.h>
@@ -23,208 +24,362 @@
# define _GNU_SOURCE 1
#endif
#ifdef __GNUC__
# define alloca __builtin_alloca
# define HAVE_ALLOCA 1
#else
# if defined HAVE_ALLOCA_H || defined _LIBC
# include <alloca.h>
# else
# ifdef _AIX
# pragma alloca
# else
# ifndef alloca
char *alloca ();
# endif
# endif
# endif
#endif
#if ! defined __builtin_expect && __GNUC__ < 3
# define __builtin_expect(expr, expected) (expr)
#endif
#include <assert.h>
#include <errno.h>
#include <fnmatch.h>
#include <ctype.h>
#if defined STDC_HEADERS || !defined isascii
# define IN_CTYPE_DOMAIN(c) 1
#if HAVE_STRING_H || defined _LIBC
# include <string.h>
#else
# define IN_CTYPE_DOMAIN(c) isascii (c)
# if HAVE_STRINGS_H
# include <strings.h>
# endif
#endif
#define ISUPPER(c) (IN_CTYPE_DOMAIN (c) && isupper (c))
#if defined STDC_HEADERS || defined _LIBC
# include <stddef.h>
# include <stdlib.h>
#endif
#define WIDE_CHAR_SUPPORT (HAVE_WCTYPE_H && HAVE_WCHAR_H && HAVE_BTOWC)
/* For platform which support the ISO C amendement 1 functionality we
support user defined character classes. */
#if defined _LIBC || WIDE_CHAR_SUPPORT
/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>. */
# include <wchar.h>
# include <wctype.h>
#endif
/* We need some of the locale data (the collation sequence information)
but there is no interface to get this information in general. Therefore
we support a correct implementation only in glibc. */
#ifdef _LIBC
# include "../locale/localeinfo.h"
# include "../locale/elem-hash.h"
# include "../locale/coll-lookup.h"
# include <shlib-compat.h>
# define CONCAT(a,b) __CONCAT(a,b)
# define mbsinit __mbsinit
# define mbsrtowcs __mbsrtowcs
# define fnmatch __fnmatch
extern int fnmatch (const char *pattern, const char *string, int flags);
#endif
/* We often have to test for FNM_FILE_NAME and FNM_PERIOD being both set. */
#define NO_LEADING_PERIOD(flags) \
((flags & (FNM_FILE_NAME | FNM_PERIOD)) == (FNM_FILE_NAME | FNM_PERIOD))
/* Comment out all this code if we are using the GNU C Library, are not
actually compiling the library itself, and have not detected a bug
in the library. This code is part of the GNU C
Library, but also included in many other GNU distributions. Compiling
and linking in this code is a waste when using the GNU C library
(especially if it is a shared library). Rather than having every GNU
program understand `configure --with-gnu-libc' and omit the object files,
it is simpler to just do this in the source for each such file. */
#if defined _LIBC || !defined __GNU_LIBRARY__ || !HAVE_FNMATCH_GNU
#ifndef errno
# if defined STDC_HEADERS || !defined isascii
# define ISASCII(c) 1
# else
# define ISASCII(c) isascii(c)
# endif
# ifdef isblank
# define ISBLANK(c) (ISASCII (c) && isblank (c))
# else
# define ISBLANK(c) ((c) == ' ' || (c) == '\t')
# endif
# ifdef isgraph
# define ISGRAPH(c) (ISASCII (c) && isgraph (c))
# else
# define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c))
# endif
# define ISPRINT(c) (ISASCII (c) && isprint (c))
# define ISDIGIT(c) (ISASCII (c) && isdigit (c))
# define ISALNUM(c) (ISASCII (c) && isalnum (c))
# define ISALPHA(c) (ISASCII (c) && isalpha (c))
# define ISCNTRL(c) (ISASCII (c) && iscntrl (c))
# define ISLOWER(c) (ISASCII (c) && islower (c))
# define ISPUNCT(c) (ISASCII (c) && ispunct (c))
# define ISSPACE(c) (ISASCII (c) && isspace (c))
# define ISUPPER(c) (ISASCII (c) && isupper (c))
# define ISXDIGIT(c) (ISASCII (c) && isxdigit (c))
# define STREQ(s1, s2) ((strcmp (s1, s2) == 0))
# if defined _LIBC || WIDE_CHAR_SUPPORT
/* The GNU C library provides support for user-defined character classes
and the functions from ISO C amendement 1. */
# ifdef CHARCLASS_NAME_MAX
# define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX
# else
/* This shouldn't happen but some implementation might still have this
problem. Use a reasonable default value. */
# define CHAR_CLASS_MAX_LENGTH 256
# endif
# ifdef _LIBC
# define IS_CHAR_CLASS(string) __wctype (string)
# else
# define IS_CHAR_CLASS(string) wctype (string)
# endif
# ifdef _LIBC
# define ISWCTYPE(WC, WT) __iswctype (WC, WT)
# else
# define ISWCTYPE(WC, WT) iswctype (WC, WT)
# endif
# if (HAVE_MBSTATE_T && HAVE_MBSRTOWCS) || _LIBC
/* In this case we are implementing the multibyte character handling. */
# define HANDLE_MULTIBYTE 1
# endif
# else
# define CHAR_CLASS_MAX_LENGTH 6 /* Namely, `xdigit'. */
# define IS_CHAR_CLASS(string) \
(STREQ (string, "alpha") || STREQ (string, "upper") \
|| STREQ (string, "lower") || STREQ (string, "digit") \
|| STREQ (string, "alnum") || STREQ (string, "xdigit") \
|| STREQ (string, "space") || STREQ (string, "print") \
|| STREQ (string, "punct") || STREQ (string, "graph") \
|| STREQ (string, "cntrl") || STREQ (string, "blank"))
# endif
/* Avoid depending on library functions or files
whose names are inconsistent. */
# if !defined _LIBC && !defined getenv && !HAVE_DECL_GETENV
extern char *getenv ();
# endif
# ifndef errno
extern int errno;
#endif
# endif
/* Match STRING against the filename pattern PATTERN, returning zero if
it matches, nonzero if not. */
int
fnmatch (const char *pattern, const char *string, int flags)
{
register const char *p = pattern, *n = string;
register char c;
/* Global variable. */
static int posixly_correct;
# ifndef internal_function
/* Inside GNU libc we mark some function in a special way. In other
environments simply ignore the marking. */
# define internal_function
# endif
/* Note that this evaluates C many times. */
#define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER ((unsigned char) (c)) \
? tolower ((unsigned char) (c)) \
: (c))
# ifdef _LIBC
# define FOLD(c) ((flags & FNM_CASEFOLD) ? tolower (c) : (c))
# else
# define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER (c) ? tolower (c) : (c))
# endif
# define CHAR char
# define UCHAR unsigned char
# define INT int
# define FCT internal_fnmatch
# define EXT ext_match
# define END end_pattern
# define L(CS) CS
# ifdef _LIBC
# define BTOWC(C) __btowc (C)
# else
# define BTOWC(C) btowc (C)
# endif
# define STRLEN(S) strlen (S)
# define STRCAT(D, S) strcat (D, S)
# ifdef _LIBC
# define MEMPCPY(D, S, N) __mempcpy (D, S, N)
# else
# if HAVE_MEMPCPY
# define MEMPCPY(D, S, N) mempcpy (D, S, N)
# else
# define MEMPCPY(D, S, N) ((void *) ((char *) memcpy (D, S, N) + (N)))
# endif
# endif
# define MEMCHR(S, C, N) memchr (S, C, N)
# define STRCOLL(S1, S2) strcoll (S1, S2)
# include "fnmatch_loop.c"
while ((c = *p++) != '\0')
# if HANDLE_MULTIBYTE
# define FOLD(c) ((flags & FNM_CASEFOLD) ? towlower (c) : (c))
# define CHAR wchar_t
# define UCHAR wint_t
# define INT wint_t
# define FCT internal_fnwmatch
# define EXT ext_wmatch
# define END end_wpattern
# define L(CS) L##CS
# define BTOWC(C) (C)
# ifdef _LIBC
# define STRLEN(S) __wcslen (S)
# define STRCAT(D, S) __wcscat (D, S)
# define MEMPCPY(D, S, N) __wmempcpy (D, S, N)
# else
# define STRLEN(S) wcslen (S)
# define STRCAT(D, S) wcscat (D, S)
# if HAVE_WMEMPCPY
# define MEMPCPY(D, S, N) wmempcpy (D, S, N)
# else
# define MEMPCPY(D, S, N) (wmemcpy (D, S, N) + (N))
# endif
# endif
# define MEMCHR(S, C, N) wmemchr (S, C, N)
# define STRCOLL(S1, S2) wcscoll (S1, S2)
# define WIDE_CHAR_VERSION 1
# undef IS_CHAR_CLASS
/* We have to convert the wide character string in a multibyte string. But
we know that the character class names consist of alphanumeric characters
from the portable character set, and since the wide character encoding
for a member of the portable character set is the same code point as
its single-byte encoding, we can use a simplified method to convert the
string to a multibyte character string. */
static wctype_t
is_char_class (const wchar_t *wcs)
{
char s[CHAR_CLASS_MAX_LENGTH + 1];
char *cp = s;
do
{
c = FOLD (c);
switch (c)
/* Test for a printable character from the portable character set. */
# ifdef _LIBC
if (*wcs < 0x20 || *wcs > 0x7e
|| *wcs == 0x24 || *wcs == 0x40 || *wcs == 0x60)
return (wctype_t) 0;
# else
switch (*wcs)
{
case '?':
if (*n == '\0')
return FNM_NOMATCH;
else if ((flags & FNM_FILE_NAME) && *n == '/')
return FNM_NOMATCH;
else if ((flags & FNM_PERIOD) && *n == '.' &&
(n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/')))
return FNM_NOMATCH;
case L' ': case L'!': case L'"': case L'#': case L'%':
case L'&': case L'\'': case L'(': case L')': case L'*':
case L'+': case L',': case L'-': case L'.': case L'/':
case L'0': case L'1': case L'2': case L'3': case L'4':
case L'5': case L'6': case L'7': case L'8': case L'9':
case L':': case L';': case L'<': case L'=': case L'>':
case L'?':
case L'A': case L'B': case L'C': case L'D': case L'E':
case L'F': case L'G': case L'H': case L'I': case L'J':
case L'K': case L'L': case L'M': case L'N': case L'O':
case L'P': case L'Q': case L'R': case L'S': case L'T':
case L'U': case L'V': case L'W': case L'X': case L'Y':
case L'Z':
case L'[': case L'\\': case L']': case L'^': case L'_':
case L'a': case L'b': case L'c': case L'd': case L'e':
case L'f': case L'g': case L'h': case L'i': case L'j':
case L'k': case L'l': case L'm': case L'n': case L'o':
case L'p': case L'q': case L'r': case L's': case L't':
case L'u': case L'v': case L'w': case L'x': case L'y':
case L'z': case L'{': case L'|': case L'}': case L'~':
break;
case '\\':
if (!(flags & FNM_NOESCAPE))
{
c = *p++;
if (c == '\0')
/* Trailing \ loses. */
return FNM_NOMATCH;
c = FOLD (c);
}
if (FOLD (*n) != c)
return FNM_NOMATCH;
break;
case '*':
if ((flags & FNM_PERIOD) && *n == '.' &&
(n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/')))
return FNM_NOMATCH;
for (c = *p++; c == '?' || c == '*'; c = *p++)
{
if (c == '?')
{
/* A ? needs to match one character. */
if (*n == '\0' || (*n == '/' && (flags & FNM_FILE_NAME)))
/* There isn't another character; no match. */
return FNM_NOMATCH;
else
/* One character of the string is consumed in matching
this ? wildcard, so *??? won't match if there are
less than three characters. */
++n;
}
}
if (c == '\0')
{
if ((flags & (FNM_FILE_NAME | FNM_LEADING_DIR)) == FNM_FILE_NAME)
for (; *n != '\0'; n++)
if (*n == '/')
return FNM_NOMATCH;
return 0;
}
{
char c1 = (!(flags & FNM_NOESCAPE) && c == '\\') ? *p : c;
c1 = FOLD (c1);
for (--p; *n != '\0'; ++n)
if ((c == '[' || FOLD (*n) == c1) &&
fnmatch (p, n, flags & ~FNM_PERIOD) == 0)
return 0;
else if (*n == '/' && (flags & FNM_FILE_NAME))
break;
return FNM_NOMATCH;
}
case '[':
{
/* Nonzero if the sense of the character class is inverted. */
register int not;
if (*n == '\0')
return FNM_NOMATCH;
if ((flags & FNM_PERIOD) && *n == '.' &&
(n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/')))
return FNM_NOMATCH;
not = (*p == '!' || *p == '^');
if (not)
++p;
c = *p++;
for (;;)
{
register char cstart = c, cend = c;
if (!(flags & FNM_NOESCAPE) && c == '\\')
{
if (*p == '\0')
return FNM_NOMATCH;
cstart = cend = *p++;
}
cstart = cend = FOLD (cstart);
if (c == '\0')
/* [ (unterminated) loses. */
return FNM_NOMATCH;
c = *p++;
c = FOLD (c);
if ((flags & FNM_FILE_NAME) && c == '/')
/* [/] can never match. */
return FNM_NOMATCH;
if (c == '-' && *p != ']')
{
cend = *p++;
if (!(flags & FNM_NOESCAPE) && cend == '\\')
cend = *p++;
if (cend == '\0')
return FNM_NOMATCH;
cend = FOLD (cend);
c = *p++;
}
if (FOLD (*n) >= cstart && FOLD (*n) <= cend)
goto matched;
if (c == ']')
break;
}
if (!not)
return FNM_NOMATCH;
break;
matched:;
/* Skip the rest of the [...] that already matched. */
while (c != ']')
{
if (c == '\0')
/* [... (unterminated) loses. */
return FNM_NOMATCH;
c = *p++;
if (!(flags & FNM_NOESCAPE) && c == '\\')
{
if (*p == '\0')
return FNM_NOMATCH;
/* XXX 1003.2d11 is unclear if this is right. */
++p;
}
}
if (not)
return FNM_NOMATCH;
}
break;
default:
if (c != FOLD (*n))
return FNM_NOMATCH;
return (wctype_t) 0;
}
# endif
++n;
/* Avoid overrunning the buffer. */
if (cp == s + CHAR_CLASS_MAX_LENGTH)
return (wctype_t) 0;
*cp++ = (char) *wcs++;
}
while (*wcs != L'\0');
if (*n == '\0')
return 0;
*cp = '\0';
if ((flags & FNM_LEADING_DIR) && *n == '/')
/* The FNM_LEADING_DIR flag says that "foo*" matches "foobar/frobozz". */
return 0;
return FNM_NOMATCH;
#undef FOLD
# ifdef _LIBC
return __wctype (s);
# else
return wctype (s);
# endif
}
# define IS_CHAR_CLASS(string) is_char_class (string)
# include "fnmatch_loop.c"
# endif
int
fnmatch (pattern, string, flags)
const char *pattern;
const char *string;
int flags;
{
# if HANDLE_MULTIBYTE
if (__builtin_expect (MB_CUR_MAX, 1) != 1)
{
mbstate_t ps;
size_t n;
wchar_t *wpattern;
wchar_t *wstring;
/* Convert the strings into wide characters. */
memset (&ps, '\0', sizeof (ps));
n = mbsrtowcs (NULL, &pattern, 0, &ps);
if (__builtin_expect (n, 0) == (size_t) -1)
/* Something wrong.
XXX Do we have to set `errno' to something which mbsrtows hasn't
already done? */
return -1;
wpattern = (wchar_t *) alloca ((n + 1) * sizeof (wchar_t));
assert (mbsinit (&ps));
(void) mbsrtowcs (wpattern, &pattern, n + 1, &ps);
assert (mbsinit (&ps));
n = mbsrtowcs (NULL, &string, 0, &ps);
if (__builtin_expect (n, 0) == (size_t) -1)
/* Something wrong.
XXX Do we have to set `errno' to something which mbsrtows hasn't
already done? */
return -1;
wstring = (wchar_t *) alloca ((n + 1) * sizeof (wchar_t));
assert (mbsinit (&ps));
(void) mbsrtowcs (wstring, &string, n + 1, &ps);
return internal_fnwmatch (wpattern, wstring, wstring + n,
flags & FNM_PERIOD, flags);
}
# endif /* mbstate_t and mbsrtowcs or _LIBC. */
return internal_fnmatch (pattern, string, string + strlen (string),
flags & FNM_PERIOD, flags);
}
# ifdef _LIBC
# undef fnmatch
versioned_symbol (libc, __fnmatch, fnmatch, GLIBC_2_2_3);
# if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_2_3)
strong_alias (__fnmatch, __fnmatch_old)
compat_symbol (libc, __fnmatch_old, fnmatch, GLIBC_2_0);
# endif
# endif
#endif /* _LIBC or not __GNU_LIBRARY__. */

View File

@@ -1,7 +1,6 @@
/* full-write.c -- an interface to write that retries after interrupts
/* An interface to read and write that retries (if necessary) until complete.
Copyright 1993, 1994, 1997, 1998, 1999, 2000, 2001 Free Software
Foundation, Inc.
Copyright (C) 1993, 1994, 1997-2003 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -15,20 +14,17 @@
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
Written by Paul Eggert. */
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#if HAVE_CONFIG_H
# include <config.h>
#endif
#include <sys/types.h>
#include "full-write.h"
#if HAVE_UNISTD_H
# include <unistd.h>
/* Specification. */
#ifdef FULL_READ
# include "full-read.h"
#else
# include "full-write.h"
#endif
#include <errno.h>
@@ -36,32 +32,54 @@
extern int errno;
#endif
/* Write LEN bytes at PTR to descriptor DESC, retrying if interrupted
or if partial writes occur. Return the number of bytes successfully
written, setting errno if that is less than LEN. */
size_t
full_write (int desc, const char *ptr, size_t len)
{
size_t total_written = 0;
while (len > 0)
{
ssize_t written = write (desc, ptr, len);
if (written <= 0)
{
/* Some buggy drivers return 0 when you fall off a device's end. */
if (written == 0)
errno = ENOSPC;
#ifdef EINTR
if (errno == EINTR)
continue;
#ifdef FULL_READ
# include "safe-read.h"
# define safe_rw safe_read
# define full_rw full_read
# undef const
# define const /* empty */
#else
# include "safe-write.h"
# define safe_rw safe_write
# define full_rw full_write
#endif
#ifdef FULL_READ
/* Set errno to zero upon EOF. */
# define ZERO_BYTE_TRANSFER_ERRNO 0
#else
/* Some buggy drivers return 0 when one tries to write beyond
a device's end. (Example: Linux 1.2.13 on /dev/fd0.)
Set errno to ENOSPC so they get a sensible diagnostic. */
# define ZERO_BYTE_TRANSFER_ERRNO ENOSPC
#endif
/* Write(read) COUNT bytes at BUF to(from) descriptor FD, retrying if
interrupted or if a partial write(read) occurs. Return the number
of bytes transferred.
When writing, set errno if fewer than COUNT bytes are written.
When reading, if fewer than COUNT bytes are read, you must examine
errno to distinguish failure from EOF (errno == 0). */
size_t
full_rw (int fd, const void *buf, size_t count)
{
size_t total = 0;
const char *ptr = buf;
while (count > 0)
{
size_t n_rw = safe_rw (fd, ptr, count);
if (n_rw == (size_t) -1)
break;
if (n_rw == 0)
{
errno = ZERO_BYTE_TRANSFER_ERRNO;
break;
}
total_written += written;
ptr += written;
len -= written;
total += n_rw;
ptr += n_rw;
count -= n_rw;
}
return total_written;
return total;
}

View File

@@ -1,9 +1,24 @@
#ifndef PARAMS
# if defined PROTOTYPES || (defined __STDC__ && __STDC__)
# define PARAMS(Args) Args
# else
# define PARAMS(Args) ()
# endif
#endif
/* An interface to write() that writes all it is asked to write.
size_t full_write PARAMS ((int, const char *, size_t));
Copyright (C) 2002 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include <stddef.h>
/* Write COUNT bytes at BUF to descriptor FD, retrying if interrupted
or if partial writes occur. Return the number of bytes successfully
written, setting errno if that is less than COUNT. */
extern size_t full_write (int fd, const void *buf, size_t count);

View File

@@ -1,6 +1,6 @@
%{
/* Parse a string into an internal time stamp.
Copyright 1999, 2000 Free Software Foundation, Inc.
Copyright (C) 1999, 2000, 2002, 2003 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -27,11 +27,10 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
# ifdef HAVE_ALLOCA_H
# include <alloca.h>
# endif
#endif
#include <alloca.h>
/* Since the code of getdate.y is not included in the Emacs executable
itself, there is no need to #define static in this file. Even if
the code were included in the Emacs executable, it probably
@@ -63,10 +62,9 @@
- Its arg may be any int or unsigned int; it need not be an unsigned char.
- It's guaranteed to evaluate its argument exactly once.
- It's typically faster.
Posix 1003.2-1992 section 2.5.2.1 page 50 lines 1556-1558 says that
only '0' through '9' are digits. Prefer ISDIGIT to ISDIGIT_LOCALE unless
it's important to use the locale's definition of `digit' even when the
host does not conform to Posix. */
POSIX says that only '0' through '9' are digits. Prefer ISDIGIT to
ISDIGIT_LOCALE unless it's important to use the locale's definition
of `digit' even when the host does not conform to POSIX. */
#define ISDIGIT(c) ((unsigned) (c) - '0' <= 9)
#if STDC_HEADERS || HAVE_STRING_H
@@ -378,19 +376,19 @@ relunit:
| tSNUMBER tDAY_UNIT
{ PC.rel_day += $1.value * $2; }
| tDAY_UNIT
{ PC.rel_day += $1 }
{ PC.rel_day += $1; }
| tUNUMBER tHOUR_UNIT
{ PC.rel_hour += $1.value * $2; }
| tSNUMBER tHOUR_UNIT
{ PC.rel_hour += $1.value * $2; }
| tHOUR_UNIT
{ PC.rel_hour += $1 }
{ PC.rel_hour += $1; }
| tUNUMBER tMINUTE_UNIT
{ PC.rel_minutes += $1.value * $2; }
| tSNUMBER tMINUTE_UNIT
{ PC.rel_minutes += $1.value * $2; }
| tMINUTE_UNIT
{ PC.rel_minutes += $1 }
{ PC.rel_minutes += $1; }
| tUNUMBER tSEC_UNIT
{ PC.rel_seconds += $1.value * $2; }
| tSNUMBER tSEC_UNIT
@@ -448,6 +446,7 @@ o_merid:
may define-away `const'. We want the prototype for get_date to have
the same signature as the function definition. */
#include "getdate.h"
#include "unlocked-io.h"
#ifndef gmtime
struct tm *gmtime ();
@@ -908,7 +907,7 @@ get_date (const char *p, const time_t *now)
pc.local_zones_seen = 0;
pc.zones_seen = 0;
#if HAVE_TM_ZONE
#if HAVE_STRUCT_TM_TM_ZONE
pc.local_time_zone_table[0].name = tmp->tm_zone;
pc.local_time_zone_table[0].type = tLOCAL_ZONE;
pc.local_time_zone_table[0].value = tmp->tm_isdst;

View File

@@ -1,5 +1,7 @@
/* human.c -- print human readable file size
Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 Free Software
Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -26,12 +28,19 @@
#include <sys/types.h>
#include <stdio.h>
#if HAVE_LIMITS_H
# include <limits.h>
#endif
#if HAVE_STRING_H
# include <string.h>
#else
# include <strings.h>
#endif
#ifndef CHAR_BIT
# define CHAR_BIT 8
#endif
#if HAVE_STDLIB_H
# include <stdlib.h>
#endif
@@ -59,16 +68,34 @@ char *getenv ();
static const char suffixes[] =
{
0, /* not used */
'k', /* kilo */
'M', /* Mega */
'G', /* Giga */
'T', /* Tera */
'P', /* Peta */
'E', /* Exa */
'Z', /* Zetta */
'Y' /* Yotta */
'K', /* kibi ('k' for kilo is a special case) */
'M', /* mega or mebi */
'G', /* giga or gibi */
'T', /* tera or tebi */
'P', /* peta or pebi */
'E', /* exa or exbi */
'Z', /* zetta or 2**70 */
'Y' /* yotta or 2**80 */
};
/* Generate into P[-1] (and possibly P[-2]) the proper suffix for
POWER and BASE. Return the address of the generated suffix. */
static char *
generate_suffix_backwards (char *p, int power, int base)
{
char letter = suffixes[power];
if (base == 1000)
{
*--p = 'B';
if (power == 1)
letter = 'k';
}
*--p = letter;
return p;
}
/* If INEXACT_STYLE is not human_round_to_even, and if easily
possible, adjust VALUE according to the style. */
static double
@@ -106,7 +133,7 @@ human_readable (uintmax_t n, char *buf,
Use INEXACT_STYLE to determine whether to take the ceiling or floor
of any result that cannot be expressed exactly.
If OUTPUT_BLOCK_SIZE is negative, use a format like "127k" if
If OUTPUT_BLOCK_SIZE is negative, use a format like "127K" if
possible, using powers of -OUTPUT_BLOCK_SIZE; otherwise, use
ordinary decimal format. Normally -OUTPUT_BLOCK_SIZE is either
1000 or 1024; it must be at least 2. Most people visually process
@@ -114,9 +141,10 @@ human_readable (uintmax_t n, char *buf,
more prone to misinterpretation. Hence, converting to an
abbreviated form usually improves readability. Use a suffix
indicating which power is being used. For example, assuming
-OUTPUT_BLOCK_SIZE is 1024, 8500 would be converted to 8.3k,
-OUTPUT_BLOCK_SIZE is 1024, 8500 would be converted to 8.3K,
133456345 to 127M, 56990456345 to 53G, and so on. Numbers smaller
than -OUTPUT_BLOCK_SIZE aren't modified. */
than -OUTPUT_BLOCK_SIZE aren't modified. If -OUTPUT_BLOCK_SIZE is
1024, append a "B" after any size letter. */
char *
human_readable_inexact (uintmax_t n, char *buf,
@@ -186,6 +214,8 @@ human_readable_inexact (uintmax_t n, char *buf,
sprintf (buf, "%.0f", adjust_value (inexact_style, damt));
else
{
char suffix[3];
char const *psuffix;
double e = 1;
power = 0;
@@ -198,12 +228,13 @@ human_readable_inexact (uintmax_t n, char *buf,
damt /= e;
sprintf (buf, "%.1f%c", adjust_value (inexact_style, damt),
suffixes[power]);
if (4 < strlen (buf))
sprintf (buf, "%.0f%c",
adjust_value (inexact_style, damt * 10) / 10,
suffixes[power]);
suffix[2] = '\0';
psuffix = generate_suffix_backwards (suffix + 2, power, base);
sprintf (buf, "%.1f%s",
adjust_value (inexact_style, damt), psuffix);
if (4 + (base == 1000) < strlen (buf))
sprintf (buf, "%.0f%s",
adjust_value (inexact_style, damt * 10) / 10, psuffix);
}
return buf;
@@ -229,7 +260,7 @@ human_readable_inexact (uintmax_t n, char *buf,
}
while (base <= amt && power < sizeof suffixes - 1);
*--p = suffixes[power];
p = generate_suffix_backwards (p, power, base);
if (amt < 10)
{

View File

@@ -1,9 +1,9 @@
/* Parse arguments from a string and prepend them to an argv.
Copyright 1999, 2000, 2001 Free Software Foundation, Inc.
Copyright 1999, 2000, 2001, 2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
the Free Software Foundation; either version 3, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
@@ -13,8 +13,8 @@
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA. */
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA. */
/* Written by Paul Eggert <eggert@twinsun.com>. */

View File

@@ -1,4 +1,4 @@
/* copysym.c -- Return a copyright symbol suitable for the current locale.
/* Print a copyright notice suitable for the current locale.
Copyright (C) 2001 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
@@ -21,65 +21,37 @@
# include <config.h>
#endif
#include <stddef.h>
#include "print-copyr.h"
#include <stdio.h>
#if HAVE_ICONV
# include <iconv.h>
# if ! USE_INCLUDED_LIBINTL && HAVE_LANGINFO_CODESET
# include <langinfo.h>
# endif
# if HAVE_STDLIB_H
# include <stdlib.h>
# endif
#endif
#include "copysym.h"
/* Store into BUF (of size BUFSIZE) a representation of the copyright
symbol (C-in-a-circle) that is a valid text string for the current
locale. Return BUF if successful, and a pointer to some other
string otherwise. */
char const *
copyright_symbol (char *buf, size_t bufsize)
{
#if HAVE_ICONV
char const *outcharset = getenv ("OUTPUT_CHARSET");
if (! (outcharset && *outcharset))
{
#if USE_INCLUDED_LIBINTL
extern char const *locale_charset (void);
outcharset = locale_charset ();
#if ENABLE_NLS
# include "unicodeio.h"
#else
# if HAVE_LANGINFO_CODESET
outcharset = nl_langinfo (CODESET);
# endif
#endif
}
if (*outcharset)
{
iconv_t conv = iconv_open (outcharset, "UTF-8");
if (conv != (iconv_t) -1)
{
static char const copyright_utf_8[] = "\302\251";
char ICONV_CONST *inptr = (char ICONV_CONST *) &copyright_utf_8;
size_t inleft = sizeof copyright_utf_8;
char *outptr = buf;
size_t chars = iconv (conv, &inptr, &inleft, &outptr, &bufsize);
iconv_close (conv);
if (chars != (size_t) -1)
return buf;
}
}
# define unicode_to_mb(code, callback, error_callback, callback_arg) \
error_callback (code, callback_arg)
#endif
/* "(C)" is the best we can do in ASCII. */
return "(C)";
#define COPYRIGHT_SIGN 0x00A9
/* Print "(C)". */
static int
print_parenthesized_c (unsigned int code, void *callback_arg)
{
FILE *stream = callback_arg;
return fputs ("(C)", stream);
}
/* Print "Copyright (C) " followed by NOTICE and then a newline,
transliterating "(C)" to an actual copyright sign (C-in-a-circle)
if possible. */
void
print_copyright (char const *notice)
{
fputs ("Copyright ", stdout);
unicode_to_mb (COPYRIGHT_SIGN, print_unicode_char, print_parenthesized_c,
stdout);
fputc (' ', stdout);
puts (notice);
}

View File

@@ -6,4 +6,4 @@
# endif
# endif
char const *copyright_symbol PARAMS((char *, size_t));
void print_copyright PARAMS((char const *));

View File

@@ -1,5 +1,5 @@
/* quotearg.c - quote arguments for output
Copyright (C) 1998, 1999 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -21,21 +21,22 @@
# include <config.h>
#endif
#if HAVE_STDDEF_H
# include <stddef.h> /* For the definition of size_t on windows w/MSVC. */
#endif
#include <sys/types.h>
#include <quotearg.h>
#include <xalloc.h>
#include <ctype.h>
#if defined (STDC_HEADERS) || (!defined (isascii) && !defined (HAVE_ISASCII))
# define ISASCII(c) 1
#if ENABLE_NLS
# include <libintl.h>
# define _(text) gettext (text)
#else
# define ISASCII(c) isascii (c)
#endif
#ifdef isgraph
# define ISGRAPH(c) (ISASCII (c) && isgraph (c))
#else
# define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c))
# define _(text) text
#endif
#define N_(text) text
#if HAVE_LIMITS_H
# include <limits.h>
@@ -43,9 +44,21 @@
#ifndef CHAR_BIT
# define CHAR_BIT 8
#endif
#ifndef SIZE_MAX
# define SIZE_MAX ((size_t) -1)
#endif
#ifndef UCHAR_MAX
# define UCHAR_MAX ((unsigned char) -1)
#endif
#ifndef UINT_MAX
# define UINT_MAX ((unsigned int) -1)
#endif
#if HAVE_C_BACKSLASH_A
# define ALERT_CHAR '\a'
#else
# define ALERT_CHAR '\7'
#endif
#if HAVE_STDLIB_H
# include <stdlib.h>
@@ -55,17 +68,55 @@
# include <string.h>
#endif
#if HAVE_WCHAR_H
/* BSD/OS 4.1 wchar.h requires FILE and struct tm to be declared. */
# include <stdio.h>
# include <time.h>
# include <wchar.h>
#endif
#if !HAVE_MBRTOWC
/* Disable multibyte processing entirely. Since MB_CUR_MAX is 1, the
other macros are defined only for documentation and to satisfy C
syntax. */
# undef MB_CUR_MAX
# define MB_CUR_MAX 1
# define mbrtowc(pwc, s, n, ps) ((*(pwc) = *(s)) != 0)
# define mbsinit(ps) 1
# define iswprint(wc) ISPRINT ((unsigned char) (wc))
#endif
#ifndef iswprint
# if HAVE_WCTYPE_H
# include <wctype.h>
# endif
# if !defined iswprint && !HAVE_ISWPRINT
# define iswprint(wc) 1
# endif
#endif
#define INT_BITS (sizeof (int) * CHAR_BIT)
#if defined (STDC_HEADERS) || (!defined (isascii) && !defined (HAVE_ISASCII))
# define IN_CTYPE_DOMAIN(c) 1
#else
# define IN_CTYPE_DOMAIN(c) isascii(c)
#endif
/* Undefine to protect against the definition in wctype.h of solaris2.6. */
#undef ISPRINT
#define ISPRINT(c) (IN_CTYPE_DOMAIN (c) && isprint (c))
struct quoting_options
{
/* Basic quoting style. */
enum quoting_style style;
/* Quote the chararacters indicated by this bit vector even if the
/* Quote the characters indicated by this bit vector even if the
quoting style would not normally require them to be quoted. */
int quote_these_too[((UCHAR_MAX + 1) / INT_BITS
+ ((UCHAR_MAX + 1) % INT_BITS != 0))];
int quote_these_too[(UCHAR_MAX / INT_BITS) + 1];
};
/* Names of quoting styles. */
@@ -76,17 +127,21 @@ char const *const quoting_style_args[] =
"shell-always",
"c",
"escape",
"locale",
"clocale",
0
};
/* Correspondances to quoting style names. */
/* Correspondences to quoting style names. */
enum quoting_style const quoting_style_vals[] =
{
literal_quoting_style,
shell_quoting_style,
shell_always_quoting_style,
c_quoting_style,
escape_quoting_style
escape_quoting_style,
locale_quoting_style,
clocale_quoting_style
};
/* The default quoting options. */
@@ -135,6 +190,335 @@ set_char_quoting (struct quoting_options *o, char c, int i)
return r;
}
/* MSGID approximates a quotation mark. Return its translation if it
has one; otherwise, return either it or "\"", depending on S. */
static char const *
gettext_quote (char const *msgid, enum quoting_style s)
{
char const *translation = _(msgid);
if (translation == msgid && s == clocale_quoting_style)
translation = "\"";
return translation;
}
/* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
argument ARG (of size ARGSIZE), using QUOTING_STYLE and the
non-quoting-style part of O to control quoting.
Terminate the output with a null character, and return the written
size of the output, not counting the terminating null.
If BUFFERSIZE is too small to store the output string, return the
value that would have been returned had BUFFERSIZE been large enough.
If ARGSIZE is -1, use the string length of the argument for ARGSIZE.
This function acts like quotearg_buffer (BUFFER, BUFFERSIZE, ARG,
ARGSIZE, O), except it uses QUOTING_STYLE instead of the quoting
style specified by O, and O may not be null. */
static size_t
quotearg_buffer_restyled (char *buffer, size_t buffersize,
char const *arg, size_t argsize,
enum quoting_style quoting_style,
struct quoting_options const *o)
{
size_t i;
size_t len = 0;
char const *quote_string = 0;
size_t quote_string_len = 0;
int backslash_escapes = 0;
int unibyte_locale = MB_CUR_MAX == 1;
#define STORE(c) \
do \
{ \
if (len < buffersize) \
buffer[len] = (c); \
len++; \
} \
while (0)
switch (quoting_style)
{
case c_quoting_style:
STORE ('"');
backslash_escapes = 1;
quote_string = "\"";
quote_string_len = 1;
break;
case escape_quoting_style:
backslash_escapes = 1;
break;
case locale_quoting_style:
case clocale_quoting_style:
{
/* Get translations for open and closing quotation marks.
The message catalog should translate "`" to a left
quotation mark suitable for the locale, and similarly for
"'". If the catalog has no translation,
locale_quoting_style quotes `like this', and
clocale_quoting_style quotes "like this".
For example, an American English Unicode locale should
translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and
should translate "'" to U+201D (RIGHT DOUBLE QUOTATION
MARK). A British English Unicode locale should instead
translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and
U+2019 (RIGHT SINGLE QUOTATION MARK), respectively. */
char const *left = gettext_quote (N_("`"), quoting_style);
char const *right = gettext_quote (N_("'"), quoting_style);
for (quote_string = left; *quote_string; quote_string++)
STORE (*quote_string);
backslash_escapes = 1;
quote_string = right;
quote_string_len = strlen (quote_string);
}
break;
case shell_always_quoting_style:
STORE ('\'');
quote_string = "'";
quote_string_len = 1;
break;
default:
break;
}
for (i = 0; ! (argsize == (size_t) -1 ? arg[i] == '\0' : i == argsize); i++)
{
unsigned char c;
unsigned char esc;
if (backslash_escapes
&& quote_string_len
&& i + quote_string_len <= argsize
&& memcmp (arg + i, quote_string, quote_string_len) == 0)
STORE ('\\');
c = arg[i];
switch (c)
{
case '\0':
if (backslash_escapes)
{
STORE ('\\');
STORE ('0');
STORE ('0');
c = '0';
}
break;
case '?':
switch (quoting_style)
{
case shell_quoting_style:
goto use_shell_always_quoting_style;
case c_quoting_style:
if (i + 2 < argsize && arg[i + 1] == '?')
switch (arg[i + 2])
{
case '!': case '\'':
case '(': case ')': case '-': case '/':
case '<': case '=': case '>':
/* Escape the second '?' in what would otherwise be
a trigraph. */
i += 2;
c = arg[i + 2];
STORE ('?');
STORE ('\\');
STORE ('?');
break;
}
break;
default:
break;
}
break;
case ALERT_CHAR: esc = 'a'; goto c_escape;
case '\b': esc = 'b'; goto c_escape;
case '\f': esc = 'f'; goto c_escape;
case '\n': esc = 'n'; goto c_and_shell_escape;
case '\r': esc = 'r'; goto c_and_shell_escape;
case '\t': esc = 't'; goto c_and_shell_escape;
case '\v': esc = 'v'; goto c_escape;
case '\\': esc = c; goto c_and_shell_escape;
c_and_shell_escape:
if (quoting_style == shell_quoting_style)
goto use_shell_always_quoting_style;
c_escape:
if (backslash_escapes)
{
c = esc;
goto store_escape;
}
break;
case '#': case '~':
if (i != 0)
break;
/* Fall through. */
case ' ':
case '!': /* special in bash */
case '"': case '$': case '&':
case '(': case ')': case '*': case ';':
case '<': case '>': case '[':
case '^': /* special in old /bin/sh, e.g. SunOS 4.1.4 */
case '`': case '|':
/* A shell special character. In theory, '$' and '`' could
be the first bytes of multibyte characters, which means
we should check them with mbrtowc, but in practice this
doesn't happen so it's not worth worrying about. */
if (quoting_style == shell_quoting_style)
goto use_shell_always_quoting_style;
break;
case '\'':
switch (quoting_style)
{
case shell_quoting_style:
goto use_shell_always_quoting_style;
case shell_always_quoting_style:
STORE ('\'');
STORE ('\\');
STORE ('\'');
break;
default:
break;
}
break;
case '%': case '+': case ',': case '-': case '.': case '/':
case '0': case '1': case '2': case '3': case '4': case '5':
case '6': case '7': case '8': case '9': case ':': case '=':
case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
case 'Y': case 'Z': case ']': case '_': case 'a': case 'b':
case 'c': case 'd': case 'e': case 'f': case 'g': case 'h':
case 'i': case 'j': case 'k': case 'l': case 'm': case 'n':
case 'o': case 'p': case 'q': case 'r': case 's': case 't':
case 'u': case 'v': case 'w': case 'x': case 'y': case 'z':
case '{': case '}':
/* These characters don't cause problems, no matter what the
quoting style is. They cannot start multibyte sequences. */
break;
default:
/* If we have a multibyte sequence, copy it until we reach
its end, find an error, or come back to the initial shift
state. For C-like styles, if the sequence has
unprintable characters, escape the whole sequence, since
we can't easily escape single characters within it. */
{
/* Length of multibyte sequence found so far. */
size_t m;
int printable;
if (unibyte_locale)
{
m = 1;
printable = ISPRINT (c);
}
else
{
mbstate_t mbstate;
memset (&mbstate, 0, sizeof mbstate);
m = 0;
printable = 1;
if (argsize == (size_t) -1)
argsize = strlen (arg);
do
{
wchar_t w;
size_t bytes = mbrtowc (&w, &arg[i + m],
argsize - (i + m), &mbstate);
if (bytes == 0)
break;
else if (bytes == (size_t) -1)
{
printable = 0;
break;
}
else if (bytes == (size_t) -2)
{
printable = 0;
while (i + m < argsize && arg[i + m])
m++;
break;
}
else
{
if (! iswprint (w))
printable = 0;
m += bytes;
}
}
while (! mbsinit (&mbstate));
}
if (1 < m || (backslash_escapes && ! printable))
{
/* Output a multibyte sequence, or an escaped
unprintable unibyte character. */
size_t ilim = i + m;
for (;;)
{
if (backslash_escapes && ! printable)
{
STORE ('\\');
STORE ('0' + (c >> 6));
STORE ('0' + ((c >> 3) & 7));
c = '0' + (c & 7);
}
if (ilim <= i + 1)
break;
STORE (c);
c = arg[++i];
}
goto store_c;
}
}
}
if (! (backslash_escapes
&& o->quote_these_too[c / INT_BITS] & (1 << (c % INT_BITS))))
goto store_c;
store_escape:
STORE ('\\');
store_c:
STORE (c);
}
if (quote_string)
for (; *quote_string; quote_string++)
STORE (*quote_string);
if (len < buffersize)
buffer[len] = '\0';
return len;
use_shell_always_quoting_style:
return quotearg_buffer_restyled (buffer, buffersize, arg, argsize,
shell_always_quoting_style, o);
}
/* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of
argument ARG (of size ARGSIZE), using O to control quoting.
If O is null, use the default.
@@ -148,191 +532,67 @@ quotearg_buffer (char *buffer, size_t buffersize,
char const *arg, size_t argsize,
struct quoting_options const *o)
{
unsigned char c;
size_t i;
size_t len;
int quote_mark;
struct quoting_options const *p = o ? o : &default_quoting_options;
enum quoting_style quoting_style = p->style;
#define STORE(c) \
do \
{ \
if (len < buffersize) \
buffer[len] = (c); \
len++; \
} \
while (0)
switch (quoting_style)
{
case shell_quoting_style:
if (! (argsize == (size_t) -1 ? arg[0] == '\0' : argsize == 0))
{
switch (arg[0])
{
case '#': case '~':
break;
default:
len = 0;
for (i = 0; ; i++)
{
if (argsize == (size_t) -1 ? arg[i] == '\0' : i == argsize)
goto done;
c = arg[i];
switch (c)
{
case '\t': case '\n': case ' ':
case '!': /* special in csh */
case '"': case '$': case '&': case '\'':
case '(': case ')': case '*': case ';':
case '<': case '>': case '?': case '[': case '\\':
case '^': /* special in old /bin/sh, e.g. SunOS 4.1.4 */
case '`': case '|':
goto needs_quoting;
}
if (p->quote_these_too[c / INT_BITS] & (1 << (c % INT_BITS)))
goto needs_quoting;
STORE (c);
}
needs_quoting:;
break;
}
}
/* Fall through. */
case shell_always_quoting_style:
quote_mark = '\'';
break;
case c_quoting_style:
quote_mark = '"';
break;
default:
quote_mark = 0;
break;
}
len = 0;
if (quote_mark)
STORE (quote_mark);
for (i = 0; ! (argsize == (size_t) -1 ? arg[i] == '\0' : i == argsize); i++)
{
c = arg[i];
switch (quoting_style)
{
case literal_quoting_style:
break;
case shell_quoting_style:
case shell_always_quoting_style:
if (c == '\'')
{
STORE ('\'');
STORE ('\\');
STORE ('\'');
}
break;
case c_quoting_style:
case escape_quoting_style:
switch (c)
{
case '?': /* Do not generate trigraphs. */
case '\\': goto store_escape;
/* Not all C compilers know what \a means. */
case 7 : c = 'a'; goto store_escape;
case '\b': c = 'b'; goto store_escape;
case '\f': c = 'f'; goto store_escape;
case '\n': c = 'n'; goto store_escape;
case '\r': c = 'r'; goto store_escape;
case '\t': c = 't'; goto store_escape;
case '\v': c = 'v'; goto store_escape;
case '"':
if (quoting_style == c_quoting_style)
goto store_escape;
break;
default:
if (!ISGRAPH (c))
{
STORE ('\\');
STORE ('0' + (c >> 6));
STORE ('0' + ((c >> 3) & 7));
c = '0' + (c & 7);
goto store_c;
}
break;
}
if (! (p->quote_these_too[c / INT_BITS] & (1 << (c % INT_BITS))))
goto store_c;
store_escape:
STORE ('\\');
}
store_c:
STORE (c);
}
if (quote_mark)
STORE (quote_mark);
done:
if (len < buffersize)
buffer[len] = '\0';
return len;
return quotearg_buffer_restyled (buffer, buffersize, arg, argsize,
p->style, p);
}
/* Use storage slot N to return a quoted version of the string ARG.
/* Use storage slot N to return a quoted version of argument ARG.
ARG is of size ARGSIZE, but if that is -1, ARG is a null-terminated string.
OPTIONS specifies the quoting options.
The returned value points to static storage that can be
reused by the next call to this function with the same value of N.
N must be nonnegative. N is deliberately declared with type `int'
N must be nonnegative. N is deliberately declared with type "int"
to allow for future extensions (using negative values). */
static char *
quotearg_n_options (int n, char const *arg,
quotearg_n_options (int n, char const *arg, size_t argsize,
struct quoting_options const *options)
{
static unsigned int nslots;
static struct slotvec
/* Preallocate a slot 0 buffer, so that the caller can always quote
one small component of a "memory exhausted" message in slot 0. */
static char slot0[256];
static unsigned int nslots = 1;
unsigned int n0 = n;
struct slotvec
{
size_t size;
char *val;
} *slotvec;
};
static struct slotvec slotvec0 = {sizeof slot0, slot0};
static struct slotvec *slotvec = &slotvec0;
if (nslots <= n)
if (n < 0)
abort ();
if (nslots <= n0)
{
int n1 = n + 1;
size_t s = n1 * sizeof (struct slotvec);
if (! (0 < n1 && n1 == s / sizeof (struct slotvec)))
abort ();
unsigned int n1 = n0 + 1;
size_t s = n1 * sizeof *slotvec;
if (SIZE_MAX / UINT_MAX <= sizeof *slotvec
&& n1 != s / sizeof *slotvec)
xalloc_die ();
if (slotvec == &slotvec0)
{
slotvec = (struct slotvec *) xmalloc (sizeof *slotvec);
*slotvec = slotvec0;
}
slotvec = (struct slotvec *) xrealloc (slotvec, s);
memset (slotvec + nslots, 0, (n1 - nslots) * sizeof (struct slotvec));
nslots = n;
memset (slotvec + nslots, 0, (n1 - nslots) * sizeof *slotvec);
nslots = n1;
}
{
size_t size = slotvec[n].size;
char *val = slotvec[n].val;
size_t qsize = quotearg_buffer (val, size, arg, (size_t) -1, options);
size_t qsize = quotearg_buffer (val, size, arg, argsize, options);
if (size <= qsize)
{
slotvec[n].size = size = qsize + 1;
slotvec[n].val = val = xrealloc (val, size);
quotearg_buffer (val, size, arg, (size_t) -1, options);
slotvec[n].val = val = xrealloc (val == slot0 ? 0 : val, size);
quotearg_buffer (val, size, arg, argsize, options);
}
return val;
@@ -340,9 +600,9 @@ quotearg_n_options (int n, char const *arg,
}
char *
quotearg_n (unsigned int n, char const *arg)
quotearg_n (int n, char const *arg)
{
return quotearg_n_options (n, arg, &default_quoting_options);
return quotearg_n_options (n, arg, (size_t) -1, &default_quoting_options);
}
char *
@@ -351,13 +611,44 @@ quotearg (char const *arg)
return quotearg_n (0, arg);
}
/* Return quoting options for STYLE, with no extra quoting. */
static struct quoting_options
quoting_options_from_style (enum quoting_style style)
{
struct quoting_options o;
o.style = style;
memset (o.quote_these_too, 0, sizeof o.quote_these_too);
return o;
}
char *
quotearg_n_style (int n, enum quoting_style s, char const *arg)
{
struct quoting_options const o = quoting_options_from_style (s);
return quotearg_n_options (n, arg, (size_t) -1, &o);
}
char *
quotearg_n_style_mem (int n, enum quoting_style s,
char const *arg, size_t argsize)
{
struct quoting_options const o = quoting_options_from_style (s);
return quotearg_n_options (n, arg, argsize, &o);
}
char *
quotearg_style (enum quoting_style s, char const *arg)
{
return quotearg_n_style (0, s, arg);
}
char *
quotearg_char (char const *arg, char ch)
{
struct quoting_options options;
options = default_quoting_options;
set_char_quoting (&options, ch, 1);
return quotearg_n_options (0, arg, &options);
return quotearg_n_options (0, arg, (size_t) -1, &options);
}
char *

77
lib/stdopen.c Normal file
View File

@@ -0,0 +1,77 @@
/* stdopen.c - ensure that the three standard file descriptors are in use
Copyright (C) 2005, 2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
/* Written by Paul Eggert and Jim Meyering. */
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include "stdopen.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
/* Try to ensure that all of the standard file numbers (0, 1, 2)
are in use. Without this, each application would have to guard
every call to open, dup, fopen, etc. with tests to ensure they
don't use one of the special file numbers when opening a file.
Return false if at least one of the file descriptors is initially
closed and an attempt to reopen it fails. Otherwise, return true. */
bool
stdopen (void)
{
int fd;
bool ok = true;
for (fd = 0; fd <= 2; fd++)
{
if (fcntl (fd, F_GETFD) < 0)
{
if (errno != EBADF)
ok = false;
else
{
static const int contrary_mode[]
= { O_WRONLY, O_RDONLY, O_RDONLY };
int mode = contrary_mode[fd];
int new_fd;
/* Open /dev/null with the contrary mode so that the typical
read (stdin) or write (stdout, stderr) operation will fail.
With descriptor 0, we can do even better on systems that
have /dev/full, by opening that write-only instead of
/dev/null. The only drawback is that a write-provoked
failure comes with a misleading errno value, ENOSPC. */
if (mode == O_RDONLY
|| (new_fd = open ("/dev/full", mode) != fd))
new_fd = open ("/dev/null", mode);
if (new_fd != fd)
{
if (0 <= new_fd)
close (new_fd);
ok = false;
}
}
}
}
return ok;
}

16
lib/stdopen.h Normal file
View File

@@ -0,0 +1,16 @@
#ifndef STDOPEN_H
# define STDOPEN_H 1
# include <stdbool.h>
# ifdef __cplusplus
extern "C" {
# endif
bool stdopen (void);
# ifdef __cplusplus
}
# endif
#endif

View File

@@ -1,5 +1,6 @@
/* Convert string representation of a number into an intmax_t value.
Copyright 1999, 2001 Free Software Foundation, Inc.
Copyright (C) 1999, 2001 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -65,7 +66,7 @@ long strtol PARAMS ((char const *, char **, int));
# ifndef HAVE_DECL_STRTOLL
"this configure-time declaration test was not run"
# endif
# if !HAVE_DECL_STRTOLL && HAVE_UNSIGNED_LONG_LONG
# if !HAVE_DECL_STRTOLL && HAVE_LONG_LONG
long long strtoll PARAMS ((char const *, char **, int));
# endif
#endif

View File

@@ -1,6 +1,6 @@
/* Unicode character output to streams with locale dependent encoding.
Copyright (C) 2000, 2001 Free Software Foundation, Inc.
Copyright (C) 2000-2002 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU Library General Public License as published
@@ -19,6 +19,9 @@
/* Written by Bruno Haible <haible@clisp.cons.org>. */
/* Note: This file requires the locale_charset() function. See in
libiconv-1.7/libcharset/INTEGRATE for how to obtain it. */
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
@@ -47,11 +50,13 @@ extern int errno;
#if ENABLE_NLS
# include <libintl.h>
# define _(Text) gettext (Text)
#else
# define _(Text) Text
# define gettext(Text) Text
#endif
#define _(Text) gettext (Text)
#define N_(Text) Text
/* Specification. */
#include "unicodeio.h"
/* When we pass a Unicode character to iconv(), we must pass it in a
@@ -106,12 +111,16 @@ utf8_wctomb (unsigned char *r, unsigned int wc)
#define UTF8_NAME "UTF-8"
/* Converts the Unicode character CODE to its multibyte representation
in the current locale and calls the CALLBACK on the resulting byte
sequence.
in the current locale and calls the SUCCESS callback on the resulting
byte sequence. If an error occurs, invokes the FAILURE callback instead,
passing it CODE and an English error string.
Returns whatever the callback returned.
Assumes that the locale doesn't change between two calls. */
void
long
unicode_to_mb (unsigned int code,
void (*callback) PARAMS((const char *buf, size_t buflen,
long (*success) PARAMS ((const char *buf, size_t buflen,
void *callback_arg)),
long (*failure) PARAMS ((unsigned int code, const char *msg,
void *callback_arg)),
void *callback_arg)
{
@@ -135,31 +144,32 @@ unicode_to_mb (unsigned int code,
{
utf8_to_local = iconv_open (charset, UTF8_NAME);
if (utf8_to_local == (iconv_t)(-1))
{
/* For an unknown encoding, assume ASCII. */
utf8_to_local = iconv_open ("ASCII", UTF8_NAME);
if (utf8_to_local == (iconv_t)(-1))
error (1, 0,
_("cannot convert U+%04X to local character set: iconv function not usable"),
code);
}
/* For an unknown encoding, assume ASCII. */
utf8_to_local = iconv_open ("ASCII", UTF8_NAME);
}
#endif
initialized = 1;
}
/* Test whether the utf8_to_local converter is available at all. */
if (!is_utf8)
{
#if HAVE_ICONV
if (utf8_to_local == (iconv_t)(-1))
return failure (code, N_("iconv function not usable"), callback_arg);
#else
return failure (code, N_("iconv function not available"), callback_arg);
#endif
}
/* Convert the character to UTF-8. */
count = utf8_wctomb ((unsigned char *) inbuf, code);
if (count < 0)
error (1, 0, _("U+%04X: character out of range"), code);
return failure (code, N_("character out of range"), callback_arg);
if (is_utf8)
{
callback (inbuf, count, callback_arg);
}
else
{
#if HAVE_ICONV
if (!is_utf8)
{
char outbuf[25];
const char *inptr;
size_t inbytesleft;
@@ -182,8 +192,7 @@ unicode_to_mb (unsigned int code,
|| (res > 0 && code != 0 && outptr - outbuf == 1 && *outbuf == '\0')
# endif
)
error (1, res == (size_t)(-1) ? errno : 0,
_("cannot convert U+%04X to local character set"), code);
return failure (code, NULL, callback_arg);
/* Avoid glibc-2.1 bug and Solaris 2.7 bug. */
# if defined _LIBICONV_VERSION \
@@ -192,33 +201,63 @@ unicode_to_mb (unsigned int code,
/* Get back to the initial shift state. */
res = iconv (utf8_to_local, NULL, NULL, &outptr, &outbytesleft);
if (res == (size_t)(-1))
error (1, errno, _("cannot convert U+%04X to local character set"),
code);
return failure (code, NULL, callback_arg);
# endif
callback (outbuf, outptr - outbuf, callback_arg);
#else
error (1, 0,
_("cannot convert U+%04X to local character set: iconv function not available"),
code);
#endif
return success (outbuf, outptr - outbuf, callback_arg);
}
#endif
/* At this point, is_utf8 is true, so no conversion is needed. */
return success (inbuf, count, callback_arg);
}
/* Simple callback that outputs the converted string.
/* Simple success callback that outputs the converted string.
The STREAM is passed as callback_arg. */
static void
fprintf_callback (const char *buf, size_t buflen, void *callback_arg)
long
fwrite_success_callback (const char *buf, size_t buflen, void *callback_arg)
{
FILE *stream = (FILE *) callback_arg;
fwrite (buf, 1, buflen, stream);
return 0;
}
/* Simple failure callback that displays an error and exits. */
static long
exit_failure_callback (unsigned int code, const char *msg, void *callback_arg)
{
if (msg == NULL)
error (1, 0, _("cannot convert U+%04X to local character set"), code);
else
error (1, 0, _("cannot convert U+%04X to local character set: %s"), code,
gettext (msg));
return -1;
}
/* Simple failure callback that displays a fallback representation in plain
ASCII, using the same notation as ISO C99 strings. */
static long
fallback_failure_callback (unsigned int code, const char *msg, void *callback_arg)
{
FILE *stream = (FILE *) callback_arg;
if (code < 0x10000)
fprintf (stream, "\\u%04X", code);
else
fprintf (stream, "\\U%08X", code);
return -1;
}
/* Outputs the Unicode character CODE to the output stream STREAM.
Assumes that the locale doesn't change between two calls. */
Upon failure, exit if exit_on_error is true, otherwise output a fallback
notation. */
void
print_unicode_char (FILE *stream, unsigned int code)
print_unicode_char (FILE *stream, unsigned int code, int exit_on_error)
{
unicode_to_mb (code, fprintf_callback, stream);
unicode_to_mb (code, fwrite_success_callback,
exit_on_error
? exit_failure_callback
: fallback_failure_callback,
stream);
}

View File

@@ -1,3 +1,22 @@
/* Unicode character output to streams with locale dependent encoding.
Copyright (C) 2000-2002 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU Library General Public License as published
by the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
USA. */
#ifndef UNICODEIO_H
# define UNICODEIO_H
@@ -11,16 +30,15 @@
# endif
# endif
/* Converts the Unicode character CODE to its multibyte representation
in the current locale and calls the CALLBACK on the resulting byte
sequence. */
extern void unicode_to_mb
PARAMS ((unsigned int code,
void (*callback) PARAMS ((const char *buf, size_t buflen,
void *callback_arg)),
void *callback_arg));
/* Outputs the Unicode character CODE to the output stream STREAM.
Upon failure, exit if exit_on_error is true, otherwise output a fallback
notation. */
extern void print_unicode_char PARAMS ((FILE *stream, unsigned int code,
int exit_on_error));
/* Outputs the Unicode character CODE to the output stream STREAM. */
extern void print_unicode_char PARAMS((FILE *stream, unsigned int code));
/* Simple success callback that outputs the converted string.
The STREAM is passed as callback_arg. */
extern long fwrite_success_callback PARAMS ((const char *buf, size_t buflen,
void *callback_arg));
#endif

View File

@@ -1,9 +1,9 @@
/* Emulate waitpid on systems that just have wait.
Copyright 1994, 1995, 1998, 1999 Free Software Foundation, Inc.
Copyright 1994, 1995, 1998, 1999, 2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
the Free Software Foundation; either version 3, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
@@ -14,12 +14,15 @@
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING.
If not, write to the Free Software Foundation,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
#if HAVE_CONFIG_H
# include <config.h>
#endif
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#ifndef errno
extern int errno;

View File

@@ -78,19 +78,19 @@ extern int errno;
#include "xstrtol.h"
#ifndef strtol
#if !HAVE_DECL_STRTOL && !defined strtol
long int strtol ();
#endif
#ifndef strtoul
#if !HAVE_DECL_STRTOUL && !defined strtoul
unsigned long int strtoul ();
#endif
#if !HAVE_DECL_STRTOIMAX
#if !HAVE_DECL_STRTOIMAX && !defined strtoimax
intmax_t strtoimax ();
#endif
#if !HAVE_DECL_STRTOUMAX
#if !HAVE_DECL_STRTOUMAX && !defined strtoumax
uintmax_t strtoumax ();
#endif

View File

@@ -1,34 +0,0 @@
## Process this file with automake to produce Makefile.in -*-Makefile-*-
EXTRA_DIST = \
c-bs-a.m4 \
ccstdc.m4 \
check-decl.m4 \
codeset.m4 \
d-ino.m4 \
decl.m4 \
error.m4 \
fnmatch.m4 \
getcwd.m4 \
getline.m4 \
gettext.m4 \
glibc21.m4 \
iconv.m4 \
inttypes.m4 \
isc-posix.m4 \
jm-mktime.m4 \
lcmessage.m4 \
longlong.m4 \
malloc.m4 \
mbrtowc.m4 \
mbstate_t.m4 \
prereq.m4 \
progtest.m4 \
realloc.m4 \
strerror_r.m4 \
ulonglong.m4 \
utimbuf.m4 \
utime.m4 \
utimes.m4 \
xstrtoimax.m4 \
xstrtoumax.m4

View File

@@ -1,4 +1,4 @@
#serial 1
#serial 2
dnl Cloned from xstrtoumax.m4. Keep these files in sync.
# autoconf tests required for use of xstrtoimax.c
@@ -9,7 +9,7 @@ AC_DEFUN([jm_AC_PREREQ_XSTRTOIMAX],
AC_REQUIRE([jm_AC_TYPE_UINTMAX_T])
AC_REQUIRE([jm_AC_TYPE_LONG_LONG])
AC_REQUIRE([jm_AC_TYPE_UNSIGNED_LONG_LONG])
AC_CHECK_DECLS([strtol, strtoll, strtoimax])
AC_CHECK_DECLS([strtol, strtoul, strtoll, strtoimax, strtoumax])
AC_CHECK_HEADERS(limits.h stdlib.h inttypes.h)
AC_CACHE_CHECK([whether <inttypes.h> defines strtoimax as a macro],

View File

@@ -1,4 +1,4 @@
#serial 3
#serial 4
# autoconf tests required for use of xstrtoumax.c
@@ -8,7 +8,7 @@ AC_DEFUN([jm_AC_PREREQ_XSTRTOUMAX],
AC_REQUIRE([jm_AC_TYPE_UINTMAX_T])
AC_REQUIRE([jm_AC_TYPE_LONG_LONG])
AC_REQUIRE([jm_AC_TYPE_UNSIGNED_LONG_LONG])
AC_CHECK_DECLS([strtoul, strtoull, strtoumax])
AC_CHECK_DECLS([strtol, strtoul, strtoull, strtoimax, strtoumax])
AC_CHECK_HEADERS(limits.h stdlib.h inttypes.h)
AC_CACHE_CHECK([whether <inttypes.h> defines strtoumax as a macro],

View File

@@ -1,14 +1,48 @@
# List of files which contain translatable strings.
# Copyright 1996, 1999 Free Software Foundation, Inc.
# Copyright (C) 1996, 1999, 2000, 2003, 2004, 2005, 2007 Free Software
# Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3, or (at your option)
# any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.
# Library files
lib/argmatch.c
lib/argp-help.c
lib/argp-parse.c
lib/closeout.c
lib/error.c
lib/getopt.c
lib/obstack.c
lib/human.c
lib/obstack.c
lib/openat-die.c
lib/paxerror.c
lib/paxexit.c
lib/paxnames.c
lib/quotearg.c
lib/rpmatch.c
lib/rtapelib.c
lib/xalloc-die.c
lib/xmalloc.c
lib/version-etc.c
lib/xalloc-die.c
rmt/rmt.c
# Package source files
src/arith.c
src/buffer.c
src/common.h
src/compare.c
@@ -17,13 +51,12 @@ src/delete.c
src/extract.c
src/incremen.c
src/list.c
src/mangle.c
src/misc.c
src/names.c
src/rmt.c
src/rtapelib.c
src/tar.c
src/update.c
src/xheader.c
src/checkpoint.c
# Checking tools
# Testsuite
tests/genfile.c

6
scripts/.cvsignore Normal file
View File

@@ -0,0 +1,6 @@
Makefile.in
Makefile
backup.sh
backup
restore
dump-remind

View File

@@ -1,9 +1,8 @@
# Makefile for GNU tar scripts.
# Copyright (C) 1994 Free Software Foundation, Inc.
# Copyright (C) 2004, 2006, 2007 Free Software Foundation, Inc.
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2, or (at your option)
## the Free Software Foundation; either version 3, or (at your option)
## any later version.
## This program is distributed in the hope that it will be useful,
@@ -12,9 +11,39 @@
## GNU General Public License for more details.
## You should have received a copy of the GNU General Public License
## along with this program; if not, write to the Free Software Foundation,
## Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
## along with this program; if not, write to the Free Software
## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
## 02110-1301, USA.
AUTOMAKE_OPTIONS = gnits
BACKUP_LIBEXEC_SCRIPTS_LIST=backup.sh dump-remind
BACKUP_SBIN_SCRIPTS_LIST=backup restore
libexec_SCRIPTS=@BACKUP_LIBEXEC_SCRIPTS@
AM_INSTALLCHECK_STD_OPTIONS_EXEMPT=backup.sh dump-remind
sbin_SCRIPTS=@BACKUP_SBIN_SCRIPTS@
EXTRA_SCRIPTS=tarcat
EXTRA_DIST=\
backup.sh.in\
backup.in\
restore.in\
dump-remind.in\
backup-specs
CLEANFILES=backup.sh backup restore dump-remind
EXTRA_DIST = WARNING backup-specs dump-remind level-0 level-1 weekly.new
SED_CMD="s,\@libexecdir\@,$(libexecdir),;\
s,\@sysconfdir\@,$(sysconfdir),;\
s,\@PACKAGE_NAME\@,$(PACKAGE_NAME),;\
s,\@VERSION\@,$(VERSION),;\
s,\@PACKAGE_BUGREPORT\@,$(PACKAGE_BUGREPORT),;\
s,\@DATE_FORMAT_OK\@,$(DATE_FORMAT_OK),;@BACKUP_SED_COND@"
backup.sh: $(srcdir)/backup.sh.in
sed $(SED_CMD) $? > $@
backup: $(srcdir)/backup.in
sed $(SED_CMD) $? > $@
restore: $(srcdir)/restore.in
sed $(SED_CMD) $? > $@
dump-remind: $(srcdir)/dump-remind.in
sed $(SED_CMD) $? > $@

View File

@@ -1,3 +0,0 @@
GNU tar scripts have not been updated in a long while. make will
not not install them. Please consider the contents of this directory
are provided as indicative for the time being.

View File

@@ -1,34 +1,68 @@
# site-specific parameters for file system backup.
# This is a sample configuration file for GNU tar backup script.
# See end of file for copying conditions
# User name of administrator of backups.
ADMINISTRATOR=backup-reports
# User name or email address of the administrator of backups. A report
# will be sent to this address when the backup terminates
ADMINISTRATOR="root@localhost"
# Hour at which backups are normally done.
# This should be a number from 0 to 23.
BACKUP_HOUR=1
# (Optional) Path to tar binary.
TAR=/bin/tar
# Location of GNU tar. This must be the same for all hosts.
TAR=/usr/local/gnubin/tar
# (Optional) Path to rsh binary or its equivalent. You may wish to
# set it to ssh as shown in the example below, to improve security.
# In this case you will have to use public key authentication.
RSH=/usr/local/bin/ssh
# (Optional) Path to rsh binary on remote mashines. This will be
# passed via --rsh-command option to the remote invocation of
# tar
RSH_COMMAND=/usr/local/bin/ssh
# Name of temporary file to hold volume numbers. This needs to be accessible
# by all the machines which have filesystems to be dumped.
VOLNO_FILE=/root/volume
# Device to use for dumping. It should be on the host
# on which the dump scripts are run.
TAPE_FILE=/dev/nrsmt0
# Command to obtain status of tape drive, including error count.
# On some tape drives there may not be such a command;
# then simply use `TAPE_STATUS=false'.
#
# Might also consider
# TAPE_STATUS="mt -f ${TAPE_FILE} status"
# if `mts' is missing, though this alternative is rather verbose.
TAPE_STATUS="mts -t ${TAPE_FILE}"
TAPE_FILE=/dev/rmt0
# Blocking factor to use for writing the dump.
BLOCKING=124
# Name of temporary file to hold volume numbers. This needs to be accessible
# by all the machines which have filesystems to be dumped.
VOLNO_FILE=/home/gd2/dump/volnofile
# List of file systems to be dumped. If prefixed with a HOST:
# the filesystem is accessed on the given HOST, unless it
# coincides with the local machine name.
# If a file system starts with a slash, it is handled as a local
# one.
BACKUP_DIRS='remote1:/etc remote1:/var/spool/crontab'
# Alternatively, you may leave this variable unassigned, and
# keep the list of filesystems to be dumped in file
# $SYSCONFDIR/backup/dirs, one filesystem per line. Empty
# lines and shell comments are allowed in this file. The location
# of this file may be overridden using DIRLIST variable, e.g.:
# DIRLIST=/etc/my-backup/dirlist
# List of individual files to be dumped.
# These should be accesible from the machine on which the dump is run.
BACKUP_FILES=''
# This list may also be kept in file $SYSCONFDIR/backup/files, the
# format of which is the same as described above. The location of
# this file may be overridden by setting FILELIST variable:
# FILELIST=/etc/my-backup/filelist
# Name of 'exclude file list'. It is searched under $SYSCONFDIR/tar-backup
# on remote machines
XLIST=exclude_files
# Default directory for storing incremental listings on remote
# machines is $SYSCONFDIR/tar-backup. It can be overridden using
# REMOTEBACKUPDIR variable
# Default directory for storing backup logs is $SYSCONFDIR/backup/log.
# It can also be overridden via LOGPATH variable.
# Time to sleep between dumps of any two successive filesystems
SLEEP_TIME=15
# Script to be run when it's time to insert a new tape in for the next
# volume. Administrators may want to tailor this script for their site.
@@ -36,37 +70,6 @@ VOLNO_FILE=/home/gd2/dump/volnofile
# probably defined in the manual.
#DUMP_REMIND_SCRIPT='rsh apple-gunkies /home/gd2/dump/dump-remind'
# List of file systems to be dumped.
# Actually, any directory may be used, but if it has subdirectories on
# other file systems, they are not included.
# The host name specifies which host to run tar on.
# It should normally be the host that actually has the file system.
# If GNU tar is not installed on that machine, then you can specify some
# other host which can access the file system through NFS.
# Although these are arranged one per line, that is not mandatory.
# It does not work to use # for comments within the string.
BACKUP_DIRS='
albert:/fs/fsf
sugar-bombs:/fs/gd
albert:/fs/gd2
churchy:/fs/gd3
nutrimat:/fs/gp
nutrimat:/fs/gp2
albert:/fs/mailer
placebo:/archive
nutrimat:/fs/dist
albert:/
albert:/usr
nutrimat:/
placebo:/
ernst:/usr1
'
# List of individual files to be dumped.
# These should be accesible from the machine on which the dump is run.
BACKUP_FILES=''
# Message to display on the terminal while waiting for dump time. Usually
# this will just be some literal text, preferably something more
# entertaining than this. The awk script here saves some redundant
@@ -78,5 +81,20 @@ SLEEP_MESSAGE="`awk '
\"D O N O T T O U C H T H I S T E R M I N A L !!!!!\"
}' /dev/null`"
# Copyright (C) 2004, 2007 Free Software Foundation, Inc.
# eof
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 3, or (at your option)
## any later version.
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
## You should have received a copy of the GNU General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
## 02110-1301, USA.

253
scripts/backup.in Normal file
View File

@@ -0,0 +1,253 @@
#! /bin/sh
# This program is part of GNU tar
# Copyright (C) 2004, 2005, 2006 Free Software Foundation
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 1, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.
# Load library routines
SYSCONFDIR=${SYSCONFDIR-@sysconfdir@}
. ${LIBDIR-@libexecdir@}/backup.sh
DUMP_LEVEL=0
TIME=
NOW=`now`
usage() {
cat - <<EOF
usage: $PROGNAME [OPTIONS] [WHEN]
Options are:
-l, --level=LEVEL Do backup level LEVEL (default $DUMP_LEVEL).
-f, --force Force backup even if today's log file already
exists.
-v, --verbose[=LEVEL] Set verbosity level. Default 100.
-t, --time=TIME Wait till TIME, then do backup.
Informational options:
-h, --help Display this help message.
-V, --version Display program version.
Optional argument WHEN is for backward compatibility only. It has been
superseded by --time option.
TIME argument can be one of:
now -- do backup immediately.
HH -- do backup at HH hours.
HH:MM -- do backup at HH:MM.
Send bug reports to @PACKAGE_BUGREPORT@.
EOF
}
# For compatibility with previous versions, deduce the backup level
# from the command name
case "$PROGNAME" in
level-[0-9]) DUMP_LEVEL=`expr $PROGNAME : 'level-\([0-9][0-9]*\)'`;;
esac
for opt
do
if [ -z "$prev" ]; then
option=$opt
optarg=`expr "x$opt" : 'x[^=]*=\(.*\)'`
else
option="${prev}=$opt"
prev=""
optarg=$opt
fi
case $option in
--l=*|--le=*|--lev=*|--leve=*|--level=*)
DUMP_LEVEL=$optarg
;;
-l|--l|--le|--lev|--leve|--level)
prev=$option
;;
--verb=*|--verbo=*|--verbos=*|--verbose=*)
VERBOSE=$optarg
;;
-v|--verb|--verbo|--verbos|--verbose)
VERBOSE=100
;;
-v*) VERBOSE=`expr $option : "-v\(.*\)"`;;
--t=*|--ti=*|--tim=*|--time=*)
TIME=$optarg
;;
-t) prev=--t;;
-t*) TIME=`expr $option : "-t\(.*\)"`;;
--t|--ti|--tim|--time)
prev=$option
;;
-V|--v|--ve|--ver|--vers|--versi|--versio|--version)
echo "backup (@PACKAGE_NAME@) @VERSION@"
license
exit;;
-h|--h|--he|--hel|--help)
usage
exit;;
-f|--f|--fo|--for|--forc|--force)
FORCE=yes
;;
*) if [ "x$TIME" != "x" ]; then
bailout "Extra argument. Try $PROGNAME --help for more info."
else
TIME=$option
fi;;
esac
done
if [ "x$TIME" = x ]; then
bailout "No backup time specified. Try $PROGNAME --help for more info."
exit 1
fi
init_backup
# Maybe sleep until around specified or default hour.
wait_time $TIME
if [ $DUMP_LEVEL -ne 0 ]; then
PREV_LEVEL=`expr $DUMP_LEVEL - 1`
PREV_DATE=`ls -t ${LOGPATH}/log-*-level-$PREV_LEVEL|
head -n 1|
sed "s,${LOGPATH}/log-\(.*\)-level.*,\1,"`
if [ "x$PREV_DATE" = x ]; then
bailout "Can't determine date of the previous backup"
fi
message 0 "Backup from $PREV_DATE to $NOW"
fi
# start doing things
# Make sure the log file did not already exist. Create it.
if [ "x$FORCE" = "xyes" ]; then
rm ${LOGFILE}
fi
if [ -f "${LOGFILE}" ] ; then
bailout "Log file ${LOGFILE} already exists."
else
touch "${LOGFILE}"
fi
message 1 "Ready for backup."
message 10 "TAR invocation: $TAR_PART1"
message 20 "Variables:"
message 20 "BACKUP_DIRS=$BACKUP_DIRS"
message 20 "BACKUP_FILES=$BACKUP_FILES"
# The buch of commands below is run in a subshell for which all output is
# piped through `tee' to the logfile. Doing this, instead of having
# multiple pipelines all over the place, is cleaner and allows access to
# the exit value from various commands more easily.
(
message 1 "preparing tapes"
$MT_BEGIN "${TAPE_FILE}"
rm -f "${VOLNO_FILE}"
message 1 "processing backup directories"
set - ${BACKUP_DIRS}
while [ $# -ne 0 ] ; do
date="`date`"
fs="`echo \"${1}\" | sed -e 's/^.*://'`"
fs=`root_fs $fs`
fsname="`echo \"${1}\" | sed -e 's/\//:/g'`"
remotehost="`expr \"${1}\" : '\([^/][^/]*\):.*'`"
if [ -z "$remotehost" ]; then
remotehost=$localhost
fi
echo "Backing up ${1} at ${date}"
message 10 "fs=$fs"
message 10 "fsname=$fsname"
message 10 "remotehost=$remotehost"
if [ $DUMP_LEVEL -eq 0 ]; then
make_level_log ${remotehost}
else
echo "Last `prev_level` dump on this filesystem was on $PREV_DATE"
remote_run "${remotehost}" cp "`level_log_name ${fsname} $PREV_LEVEL`" "`level_log_name temp`"
fi
${DUMP_BEGIN-:} $DUMP_LEVEL $remotehost $fs $fsname
backup_host ${remotehost} \
"--listed=`level_log_name temp`" \
"--label='`print_level` backup of ${fs} on ${remotehost} at ${NOW}'" \
-C ${fs} .
# `rsh' doesn't exit with the exit status of the remote command. What
# stupid lossage. TODO: think of a reliable workaround.
if [ $? -ne 0 ] ; then
echo "Backup of ${1} failed." 1>&2
# I'm assuming that the tar will have written an empty
# file to the tape, otherwise I should do a cat here.
else
flush_level_log ${remotehost} ${fsname}
fi
${MT_STATUS} "$TAPE_FILE"
${DUMP_END-:} $DUMP_LEVEL $remotehost $fs $fsname
echo "sleeping ${SLEEP_TIME} seconds"
sleep ${SLEEP_TIME}
shift
done
# Dump any individual files requested.
if [ "x${BACKUP_FILES}" != "x" ] ; then
message 1 "processing individual files"
date="`date`"
if [ $DUMP_LEVEL -eq 0 ]; then
make_level_log $localhost
else
echo "Last `prev_level` dump on this filesystem was on $PREV_DATE"
remote_run "${localhost}" cp "`level_log_name MISC $PREV_LEVEL`" "`level_log_name temp`"
fi
echo "Backing up miscellaneous files at ${date}"
${DUMP_BEGIN-:} $DUMP_LEVEL $localhost MISC MISC
backup_host $localhost \
"--listed=`level_log_name temp`"\
"--label='`print_level` backup of miscellaneous files at ${NOW}'" \
${BACKUP_FILES}
if [ $? -ne 0 ] ; then
echo "Backup of miscellaneous files failed."
# I'm assuming that the tar will have written an empty
# file to the tape, otherwise I should do a cat here.
else
flush_level_log $localhost MISC
fi
${MT_STATUS} "$TAPE_FILE"
${DUMP_END-:} $DUMP_LEVEL $localhost MISC MISC
else
echo "No miscellaneous files specified"
fi
message 1 "final cleanup"
$MT_REWIND "${TAPE_FILE}"
$MT_OFFLINE "${TAPE_FILE}"
echo "."
) 2>&1 | tee -a "${LOGFILE}"
if test "${ADMINISTRATOR}" != NONE; then
echo "Sending the dump log to ${ADMINISTRATOR}"
mail -s "Results of backup started ${startdate}" ${ADMINISTRATOR} < "${LOGFILE}"
fi
# EOF

347
scripts/backup.sh.in Normal file
View File

@@ -0,0 +1,347 @@
#! /bin/sh
# This program is part of GNU tar
# Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 1, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.
PROGNAME=`basename $0`
CONFIGPATH="$SYSCONFDIR/backup"
REMOTEBACKUPDIR="$SYSCONFDIR/tar-backup"
CONFIGFILE=${CONFIGPATH}/backup-specs
DIRLIST=${CONFIGPATH}/dirs
FILELIST=${CONFIGPATH}/files
LOGPATH=${CONFIGPATH}/log
# Default functions for running various magnetic tape commands
mt_begin() {
$MT -f "$1" retension
}
mt_rewind() {
$MT -f "$1" rewind
}
mt_offline() {
$MT -f "$1" offl
}
mt_status() {
$MT -f "$1" status
}
# The main configuration file may override any of these variables
MT_BEGIN=mt_begin
MT_REWIND=mt_rewind
MT_OFFLINE=mt_offline
MT_STATUS=mt_status
# Insure `mail' is in PATH.
PATH="/usr/ucb:${PATH}"
export PATH
# Put startdate in the subject line of mailed report, since if it happens
# to run longer than 24 hours (as may be the case if someone forgets to put
# in the next volume of the tape in adequate time), the backup date won't
# appear too misleading.
startdate="`date`"
here="`pwd`"
# Save local hostname
localhost="`hostname | sed -e 's/\..*//' | tr A-Z a-z`"
# Produce a diagnostic output
message() {
if [ "$VERBOSE" != "" ]; then
if [ $VERBOSE -ge $1 ]; then
shift
echo "$@" >&2
fi
fi
}
# Bail out and exit.
bailout() {
echo "$PROGNAME: $*" >&2
exit 1
}
# Return current date
now() {
#IF_DATE_FORMAT_OK
date +%Y-%m-%d
#ELSE_DATE_FORMAT_OK
LC_ALL=C date | \
sed 's/[^ ]* *\([^ ]*\) *\([^ ]*\).* \([^ ]*\)$/\3-\1-\2/
/-[0-9]$/s/\([0-9]\)$/0\1/
/Jan/{s/Jan/01/p;q;}
/Feb/{s/Feb/02/p;q;}
/Mar/{s/Mar/03/p;q;}
/Apr/{s/Apr/04/p;q;}
/May/{s/May/05/p;q;}
/Jun/{s/Jun/06/p;q;}
/Jul/{s/Jul/07/p;q;}
/Aug/{s/Aug/08/p;q;}
/Sep/{s/Sep/09/p;q;}
/Oct/{s/Oct/10/p;q;}
/Nov/{s/Nov/11/p;q;}
/Dec/{s/Dec/12/p;q;}'
#ENDIF_DATE_FORMAT_OK
}
# Bail out if we don't have root privileges.
test_root() {
if [ ! -w ${ROOT_FS-/} ]; then
bailout "The backup must be run as root or else some files will fail to be dumped."
fi
}
root_fs() {
echo "${ROOT_FS}$1" | tr -s /
}
advice() {
echo "Directory $1 is not found." >&2
cat >&2 <<EOF
The following directories and files are needed for the backup to function:
1. Directory with configuration files and file lists:
$CONFIGPATH
2. Directory for backup log files
$LOGPATH
3. Main configuration file
$CONFIGFILE
Please, create these and invoke the script again.
EOF
}
init_common() {
# Check if the necessary directories exist
if [ ! -d $CONFIGPATH ]; then
advice $CONFIGPATH
exit 1
fi
if [ ! -d $LOGPATH ]; then
if mkdir $LOGPATH; then
:
else
advice $LOGPATH
exit 1
fi
fi
# Get the values of BACKUP_DIRS, BACKUP_FILES, and other variables.
if [ ! -r $CONFIGFILE ]; then
echo "$PROGNAME: cannot read $CONFIGFILE. Stop." >&2
exit 1
fi
. $CONFIGFILE
# Environment sanity check
test_root
if [ x"${ADMINISTRATOR}" = x ]; then
bailout "ADMINISTRATOR not defined"
fi
[ x"$TAR" = x ] && TAR=tar
[ x"$SLEEP_TIME" = x ] && SLEEP_TIME=60
if [ x$VOLNO_FILE = x ]; then
bailout "VOLNO_FILE not specified"
fi
if [ -r $DIRLIST ]; then
BACKUP_DIRS="$BACKUP_DIRS `cat $DIRLIST`"
fi
if [ -r $FILELIST ]; then
BACKUP_FILES="$BACKUP_FILES `cat $FILELIST`"
fi
if [ \( x"$BACKUP_DIRS" = x \) -a \( x"$BACKUP_FILES" = x \) ]; then
bailout "Neither BACKUP_DIRS nor BACKUP_FILES specified"
fi
if [ -z "$RSH" ]; then
RSH=rsh
MT_RSH_OPTION=
else
MT_RSH_OPTION="--rsh-command=$RSH"
fi
if [ -z "$TAPE_FILE" ]; then
TAPE_FILE=/dev/tape
fi
# If TAPE_FILE is a remote device, update mt invocation accordingly
: ${MT:=mt}
case $TAPE_FILE in
*:*) MT="$MT $MT_RSH_OPTION";;
*) ;;
esac
POSIXLY_CORRECT=1
export POSIXLY_CORRECT
}
init_backup() {
init_common
TAR_PART1="${TAR} -c --format=gnu --multi-volume --one-file-system --sparse --volno-file=${VOLNO_FILE}"
if [ "x$XLIST" != x ]; then
TAR_PART1="${TAR_PART1} \`test -r $REMOTEBACKUPDIR/$XLIST && echo \"--exclude-from $REMOTEBACKUPDIR/$XLIST\"\`"
fi
if [ "$RSH_COMMAND" != "" ]; then
TAR_PART1="${TAR_PART1} --rsh-command=$RSH_COMMAND"
fi
if [ x$BLOCKING != x ]; then
TAR_PART1="${TAR_PART1} --blocking=${BLOCKING}"
fi
# Only use --info-script if DUMP_REMIND_SCRIPT was defined in backup-specs
if [ "x${DUMP_REMIND_SCRIPT}" != "x" ]; then
TAR_PART1="${TAR_PART1} --info-script='${DUMP_REMIND_SCRIPT}'"
fi
# Set logfile name
# Logfile name should be in the form ``log-1993-03-18-level-0''
# They go in the directory `@sysconfdir@/log'.
# i.e. year-month-date. This format is useful for sorting by name, since
# logfiles are intentionally kept online for future reference.
LOGFILE="${LOGPATH}/log-`now`-level-${DUMP_LEVEL}"
}
init_restore() {
init_common
# FIXME: Replace --list with --extract
TAR_PART1="${TAR} --extract --multi-volume"
if [ "$RSH_COMMAND" != "" ]; then
TAR_PART1="${TAR_PART1} --rsh-command=$RSH_COMMAND"
fi
if [ x$BLOCKING != x ]; then
TAR_PART1="${TAR_PART1} --blocking=${BLOCKING}"
fi
# Only use --info-script if DUMP_REMIND_SCRIPT was defined in backup-specs
if [ "x${DUMP_REMIND_SCRIPT}" != "x" ]; then
TAR_PART1="${TAR_PART1} --info-script='${DUMP_REMIND_SCRIPT}'"
fi
LOGFILE="${LOGPATH}/restore-`now`"
}
wait_time() {
if [ "${1}" != "now" ]; then
if [ "${1}x" != "x" ]; then
spec="${1}"
else
spec="${BACKUP_HOUR}"
fi
pausetime="`date | awk -v spec=\"${spec}\" '
BEGIN {
split(spec, time, ":")
}
{
split($4, now, ":")
diff = 3600 * (time[1] - now[1]) + 60 * (time[2] - now[2]);
if (diff < 0)
diff += 3600 * 24
print diff
}'`"
clear
echo "${SLEEP_MESSAGE}"
sleep "${pausetime}"
fi
}
level_log_name() {
echo "$REMOTEBACKUPDIR/${1}.level-${2-$DUMP_LEVEL}"
}
# Prepare a temporary level logfile
# usage: make_level_log HOSTNAME
make_level_log() {
if [ "z${localhost}" != "z$1" ] ; then
$RSH "$1" mkdir $REMOTEBACKUPDIR > /dev/null 2>&1
$RSH "$1" rm -f `level_log_name temp`
else
mkdir $REMOTEBACKUPDIR > /dev/null 2>&1
rm -f `level_log_name temp`
fi
}
# Rename temporary log
# usage: flush_level_log HOSTNAME FSNAME
flush_level_log() {
message 10 "RENAME: `level_log_name temp` --> `level_log_name $2`"
if [ "z${localhost}" != "z$1" ] ; then
$RSH "$1" mv -f `level_log_name temp` "`level_log_name $2`"
else
mv -f `level_log_name temp` "`level_log_name $2`"
fi
}
# Return the timestamp of the last backup.
# usage: get_dump_time LEVEL
get_dump_time() {
ls -r ${LOGPATH}/log-*-level-$1 \
| head -n 1 \
| sed "s,.*log-\(.*\)-level-$1,\1,"
}
# Do actual backup on a host
# usage: backup_host HOSTNAME [TAR_ARGUMENTS]
backup_host() {
message 10 "ARGS: $@"
rhost=$1
shift
if [ "z${localhost}" != "z$rhost" ] ; then
$RSH "$rhost" ${TAR_PART1} -f "${localhost}:${TAPE_FILE}" $@
else
# Using `sh -c exec' causes nested quoting and shell substitution
# to be handled here in the same way rsh handles it.
CMD="exec ${TAR_PART1} -f \"${TAPE_FILE}\" $@"
message 10 "CMD: $CMD"
sh -c "$CMD"
message 10 "RC: $?"
fi
}
print_level() {
if [ ${1-$DUMP_LEVEL} -eq 0 ]; then
echo "Full"
else
echo "Level ${1-$DUMP_LEVEL}"
fi
}
prev_level() {
print_level `expr $DUMP_LEVEL - 1` | tr A-Z a-z
}
remote_run() {
rhost=$1
shift
message 10 "REMOTE $rhost: $@"
if [ "x$rhost" != "x${localhost}" ] ; then
$RSH "${rhost}" "$@"
else
$*
fi
}
license() {
cat - <<EOF
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software. You may redistribute copies of it under the terms of
the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
There is NO WARRANTY, to the extent permitted by law.
EOF
}

34
scripts/dump-remind → scripts/dump-remind.in Executable file → Normal file
View File

@@ -13,16 +13,12 @@
PATH="/usr/lib:/usr/local/gnubin:${PATH}"
export PATH
# Get definition of TAPE_FILE, VOLNO_FILE, and so on.
. /home/gd2/dump/backup-specs
# Load library routines
SYSCONFDIR=${SYSCONFDIR-@sysconfdir@}
. ${LIBPATH-@libexecdir@}/backup.sh
mt -f "${TAPE_FILE}" rewind
mt -f "${TAPE_FILE}" offl
volno="`cat \"${VOLNO_FILE}\" 2> /dev/null`"
if [ $? -ne 0 ]; then
volno=0
fi
MT_REWIND
MT_OFFLINE
# Get a list of people to whom to mail a request for changing the tape.
# This egregious nightmare parses the output from GNU finger which shows
@@ -70,30 +66,30 @@ sendmail -oi -t << __EOF__
From: `basename $0` (backup tape-changing reminder)
To: ${recipients}
Cc: ${ADMINISTRATOR}
Subject: Backup needs new tape for volume ${volno}
Subject: Backup needs new tape for volume ${TAR_VOLUME}
Reply-To: ${ADMINISTRATOR}
This is an automated report from the backup script running on
`hostname`.
Volume ${volno} of the backup needs to be put in the tape drive. Usually
whoever prepared the backup leaves labeled tapes on top of the drive
itself. If there aren't any more, information about where to find tapes
and how to label them are posted on the wall by apple-gunkies (unhelpfully
obscured by a bookshelf). An online copy (which is probably more
up-to-date) can also be found in ~friedman/etc/fsf/backup.how.
Volume ${TAR_VOLUME} of the backup needs to be put in the tape drive.
Usually whoever prepared the backup leaves labeled tapes on top of the
drive itself. If there aren't any more, information about where to find
tapes and how to label them are posted on the wall by apple-gunkies
(unhelpfully obscured by a bookshelf). An online copy (which is probably
more up-to-date) can also be found in ~friedman/etc/fsf/backup.how.
__EOF__
echo "Please put volume ${volno} in tape drive and press RETURN"
echo "Please put volume ${TAR_VOLUME} in tape drive and press RETURN"
read input
echo "Writing volume ${volno}..."
echo "Writing volume ${TAR_VOLUME}..."
sendmail -oi -t << __EOF__
From: `basename $0` (backup tape-changing reminder)
To: ${recipients}
Cc: ${ADMINISTRATOR}
Subject: Volume ${volno} for backup has been added
Subject: Volume ${TAR_VOLUME} for backup has been added
Reply-To: ${ADMINISTRATOR}
This is an automated report from the backup script running on

View File

@@ -1,200 +0,0 @@
#!/bin/sh
#
# Run this script as root on the machine that has the tape drive, to make a
# full (level-0) dump.
#
# If you give `now' as an argument, the dump is done immediately.
# Otherwise, it waits until 1am, or until the hour given as argument.
# Specify the hour as a number from 0 to 23.
#
# You must edit the file `backup-specs' to set the parameters for your site.
# Useful for backup-specs, in case things have to be done slightly
# differently for different dump levels.
DUMP_LEVEL=0
# Insure `mail' is in PATH.
PATH="/usr/ucb:${PATH}"
export PATH
# This is not the most reliable test in the world. The following might be
# more predictable:
#
# whoami="`whoami`"
# euid="`sed -ne '/^'\"${whoami}\"':/{s/^[^:]*:[^:]*://;s/:.*//p;q;}' /etc/passwd`"
# if [ "${euid}" != 0 ]; then ...
#
if [ ! -w / ]; then
echo "The backup must be run as root or else some files will fail to be dumped."
exit 1
fi
# Get the values of BACKUP_DIRS, BACKUP_FILES, and other variables.
. ./backup-specs
# Maybe sleep until around specified or default hour.
if [ "${1}" != "now" ]; then
if [ "${1}x" != "x" ]; then
spec="${1}"
else
spec="${BACKUP_HOUR}"
fi
pausetime="`date | awk '
{
hr = substr($4, 1, 2);
mn = substr($4, 4, 2);
if((hr + 0) < (spec + 0))
print 3600 * (spec - hr) - 60 * mn;
else
print 3600 * (spec + (24 - hr)) - 60 * mn;
}' spec=\"${spec}\"`"
clear
echo "${SLEEP_MESSAGE}"
sleep "${pausetime}"
fi
# start doing things
# Put startdate in the subject line of mailed report, since if it happens
# to run longer than 24 hours (as may be the case if someone forgets to put
# in the next volume of the tape in adequate time), the backup date won't
# appear too misleading.
startdate="`date`"
here="`pwd`"
# Logfile name should be in the form ``log-1993-03-18-level-0''
# They go in the subdirectory `log' of the current directory.
# i.e. year-month-date. This format is useful for sorting by name, since
# logfiles are intentionally kept online for future reference.
LOGFILE="log/log-`date | sed -ne '
s/[^ ]* *\([^ ]*\) *\([^ ]*\).* \([^ ]*\)$/\3-\1-\2/
/-[0-9]$/s/\([0-9]\)$/0\1/
/Jan/{s/Jan/01/p;q;}
/Feb/{s/Feb/02/p;q;}
/Mar/{s/Mar/03/p;q;}
/Apr/{s/Apr/04/p;q;}
/May/{s/May/05/p;q;}
/Jun/{s/Jun/06/p;q;}
/Jul/{s/Jul/07/p;q;}
/Aug/{s/Aug/08/p;q;}
/Sep/{s/Sep/09/p;q;}
/Oct/{s/Oct/10/p;q;}
/Nov/{s/Nov/11/p;q;}
/Dec/{s/Dec/12/p;q;}'`-level-${DUMP_LEVEL}"
localhost="`hostname | sed -e 's/\..*//'`"
TAR_PART1="${TAR} -c --multi-volume --one-file-system --blocking=${BLOCKING} --sparse --volno-file=${VOLNO_FILE}"
# Only use --info-script if DUMP_REMIND_SCRIPT was defined in backup-specs
if [ "x${DUMP_REMIND_SCRIPT}" != "x" ]; then
TAR_PART1="${TAR_PART1} --info-script='${DUMP_REMIND_SCRIPT}'"
fi
# Make sure the log file did not already exist. Create it.
if [ -f "${LOGFILE}" ] ; then
echo "Log file ${LOGFILE} already exists." 1>&2
exit 1
else
touch "${LOGFILE}"
fi
# Most everything below here is run in a subshell for which all output is
# piped through `tee' to the logfile. Doing this, instead of having
# multiple pipelines all over the place, is cleaner and allows access to
# the exit value from various commands more easily.
(
# Caveat: Some version of `mt' require `-t', not `-f'.
mt -f "${TAPE_FILE}" rewind
rm -f "${VOLNO_FILE}"
set - ${BACKUP_DIRS}
while [ $# -ne 0 ] ; do
date="`date`"
remotehost="`echo \"${1}\" | sed -e 's/:.*$//'`"
fs="`echo \"${1}\" | sed -e 's/^.*://'`"
fsname="`echo \"${1}\" | sed -e 's/\//:/g'`"
# This filename must be absolute; it is opened on the machine that runs tar.
TAR_PART2="--listed=/etc/tar-backup/temp.level-0"
TAR_PART3="--label='Full backup of ${fs} on ${remotehost} at ${date}' -C ${fs} ."
echo "Backing up ${1} at ${date}"
# Actually back things up.
if [ "z${localhost}" != "z${remotehost}" ] ; then
rsh "${remotehost}" mkdir /etc/tar-backup > /dev/null 2>&1
rsh "${remotehost}" rm -f /etc/tar-backup/temp.level-0
rsh "${remotehost}" ${TAR_PART1} -f "${localhost}:${TAPE_FILE}" ${TAR_PART2} ${TAR_PART3}
else
mkdir /etc/tar-backup > /dev/null 2>&1
rm -f /etc/tar-backup/temp.level-0
# Using `sh -c exec' causes nested quoting and shell substitution
# to be handled here in the same way rsh handles it.
sh -c "exec ${TAR_PART1} -f \"${TAPE_FILE}\" ${TAR_PART2} ${TAR_PART3}"
fi
# `rsh' doesn't exit with the exit status of the remote command. What
# stupid lossage. TODO: think of a reliable workaround.
if [ $? -ne 0 ] ; then
echo "Backup of ${1} failed." 1>&2
# I'm assuming that the tar will have written an empty
# file to the tape, otherwise I should do a cat here.
else
if [ "z${localhost}" != "z${remotehost}" ] ; then
rsh "${remotehost}" mv -f /etc/tar-backup/temp.level-0 "/etc/tar-backup/${fsname}.level-0"
else
mv -f /etc/tar-backup/temp.level-0 "/etc/tar-backup/${fsname}.level-0"
fi
fi
${TAPE_STATUS}
sleep 60
shift
done
# Dump any individual files requested.
if [ "x${BACKUP_FILES}" != "x" ] ; then
date="`date`"
TAR_PART2="--listed=/etc/tar-backup/temp.level-0"
TAR_PART3="--label='Full backup of miscellaneous files at ${date}'"
mkdir /etc/tar-backup > /dev/null 2>&1
rm -f /etc/tar-backup/temp.level-0
echo "Backing up miscellaneous files at ${date}"
# Using `sh -c exec' causes nested quoting and shell substitution
# to be handled here in the same way rsh handles it.
sh -c "exec ${TAR_PART1} -f \"${TAPE_FILE}\" ${TAR_PART2} ${TAR_PART3} ${BACKUP_FILES}"
# `rsh' doesn't exit with the exit status of the remote command. What
# lossage. TODO: think of a reliable workaround.
if [ $? -ne 0 ] ; then
echo "Backup of miscellaneous files failed."
# I'm assuming that the tar will have written an empty
# file to the tape, otherwise I should do a cat here.
else
mv -f /etc/tar-backup/temp.level-0 /etc/tar-backup/misc.level-0
fi
${TAPE_STATUS}
else
echo "No miscellaneous files specified"
fi
# Caveat: some versions of `mt' use `-t' instead of `-f'.
mt -f "${TAPE_FILE}" rewind
mt -f "${TAPE_FILE}" offl
) 2>&1 | tee -a "${LOGFILE}"
echo "Sending the dump log to ${ADMINISTRATOR}"
mail -s "Results of backup started ${startdate}" ${ADMINISTRATOR} < "${LOGFILE}"
# eof

View File

@@ -1,203 +0,0 @@
#!/bin/sh
#
# Run this script as root on the machine that has the tape drive, to make a
# level-1 dump containing all files changed since the last full dump.
#
# If you give `now' as an argument, the dump is done immediately.
# Otherwise, it waits until 1am.
#
# You must edit the file `backup-specs' to set the parameters for your site.
# Useful for backup-specs, in case things have to be done slightly
# differently for different dump levels.
DUMP_LEVEL=1
# Insure `mail' is in PATH.
PATH="/usr/ucb:${PATH}"
export PATH
# This is not the most reliable test in the world. The following might be
# more predictable:
#
# whoami="`whoami`"
# euid="`sed -ne '/^'\"${whoami}\"':/{s/^[^:]*:[^:]*://;s/:.*//p;q;}' /etc/passwd`"
# if [ "${euid}" != 0 ]; then ...
#
if [ ! -w / ]; then
echo "The backup must be run as root or else some files will fail to be dumped."
exit 1
fi
# Get the values of BACKUP_DIRS, BACKUP_FILES, and other variables.
. ./backup-specs
# Maybe sleep until around specified or default hour.
if [ "z${1}" != "znow" ]; then
if [ "${1}x" != "x" ]; then
spec="${1}"
else
spec="${BACKUP_HOUR}"
fi
pausetime="`date | awk '
{
hr = substr($4, 1, 2);
mn = substr($4, 4, 2);
if((hr + 0) < (spec + 0))
print 3600 * (spec - hr) - 60 * mn;
else
print 3600 * (spec + (24 - hr)) - 60 * mn;
}' spec=\"${spec}\"`"
clear
echo "${SLEEP_MESSAGE}"
sleep "${pausetime}"
fi
# start doing things
# Put startdate in the subject line of mailed report, since if it happens
# to run longer than 24 hours (as may be the case if someone forgets to put
# in the next volume of the tape in adequate time), the backup date won't
# appear too misleading.
startdate="`date`"
here="`pwd`"
# Logfile name should be in the form ``log-1993-03-18-level-1''
# They go in the subdirectory `log' of the current directory.
# i.e. year-month-date. This format is useful for sorting by name, since
# logfiles are intentionally kept online for future reference.
LOGFILE="log/log-`date | sed -ne '
s/[^ ]* *\([^ ]*\) *\([^ ]*\).* \([^ ]*\)$/\3-\1-\2/
/-[0-9]$/s/\([0-9]\)$/0\1/
/Jan/{s/Jan/01/p;q;}
/Feb/{s/Feb/02/p;q;}
/Mar/{s/Mar/03/p;q;}
/Apr/{s/Apr/04/p;q;}
/May/{s/May/05/p;q;}
/Jun/{s/Jun/06/p;q;}
/Jul/{s/Jul/07/p;q;}
/Aug/{s/Aug/08/p;q;}
/Sep/{s/Sep/09/p;q;}
/Oct/{s/Oct/10/p;q;}
/Nov/{s/Nov/11/p;q;}
/Dec/{s/Dec/12/p;q;}'`-level-${DUMP_LEVEL}"
localhost="`hostname | sed -e 's/\..*//'`"
TAR_PART1="${TAR} -c --multi-volume --one-file-system --blocking=${BLOCKING} --sparse --volno-file=${VOLNO_FILE}"
# Only use --info-script if DUMP_REMIND_SCRIPT was defined in backup-specs
if [ "x${DUMP_REMIND_SCRIPT}" != "x" ]; then
TAR_PART1="${TAR_PART1} --info-script='${DUMP_REMIND_SCRIPT}'"
fi
# Make sure the log file did not already exist. Create it.
if [ -f "${LOGFILE}" ] ; then
echo "Log file ${LOGFILE} already exists." 1>&2
exit 1
else
touch "${LOGFILE}"
fi
# Most everything below here is run in a subshell for which all output is
# piped through `tee' to the logfile. Doing this, instead of having
# multiple pipelines all over the place, is cleaner and allows access to
# the exit value from various commands more easily.
(
# Caveat: Some version of `mt' require `-t', not `-f'.
mt -f "${TAPE_FILE}" rewind
rm -f "${VOLNO_FILE}"
set - ${BACKUP_DIRS}
while [ $# -ne 0 ] ; do
date="`date`"
remotehost="`echo \"${1}\" | sed -e 's/:.*$//'`"
fs="`echo \"${1}\" | sed -e 's/^.*://'`"
fsname="`echo \"${1}\" | sed -e 's/\//:/g'`"
# This filename must be absolute; it is opened on the machine that runs tar.
TAR_PART2="--listed=/etc/tar-backup/temp.level-1"
TAR_PART3="--label='level 1 backup of ${fs} on ${remotehost} at ${date}' -C ${fs} ."
echo "Backing up ${1} at ${date}"
echo "Last full dump on this filesystem:"
if [ "z${remotehost}" != "z${localhost}" ] ; then
rsh "${remotehost}" "ls -l /etc/tar-backup/${fsname}.level-0; \
cp /etc/tar-backup/${fsname}.level-0 /etc/tar-backup/temp.level-1"
else
ls -l "/etc/tar-backup/${fsname}.level-0"
cp "/etc/tar-backup/${fsname}.level-0" /etc/tar-backup/temp.level-1
fi
# Actually back things up.
if [ "z${remotehost}" != "z${localhost}" ] ; then
rsh "${remotehost}" ${TAR_PART1} -f "${localhost}:${TAPE_FILE}" ${TAR_PART2} ${TAR_PART3}
else
# Using `sh -c exec' causes nested quoting and shell substitution
# to be handled here in the same way rsh handles it.
sh -c "exec ${TAR_PART1} -f \"${TAPE_FILE}\" ${TAR_PART2} ${TAR_PART3}"
fi
# `rsh' doesn't exit with the exit status of the remote command. What
# stupid lossage. TODO: think of a reliable workaround.
if [ $? -ne 0 ] ; then
echo "Backup of ${1} failed."
# I'm assuming that the tar will have written an empty
# file to the tape, otherwise I should do a cat here.
else
if [ "z${localhost}" != "z${remotehost}" ] ; then
rsh "${remotehost}" mv -f /etc/tar-backup/temp.level-1 "/etc/tar-backup/${fsname}.level-1"
else
mv -f /etc/tar-backup/temp.level-1 "/etc/tar-backup/${fsname}.level-1"
fi
fi
${TAPE_STATUS}
sleep 60
shift
done
# Dump any individual files requested.
if [ "x${BACKUP_FILES}" != "x" ] ; then
date="`date`"
TAR_PART2="--listed=/etc/tar-backup/temp.level-1"
TAR_PART3="--label='Incremental backup of miscellaneous files at ${date}'"
echo "Backing up miscellaneous files at ${date}"
echo "Last full dump of these files:"
ls -l /etc/tar-backup/misc.level-0
rm -f /etc/tar-backup/temp.level-1
cp /etc/tar-backup/misc.level-0 /etc/tar-backup/temp.level-1
# Using `sh -c exec' causes nested quoting and shell substitution
# to be handled here in the same way rsh handles it.
sh -c "exec ${TAR_PART1} -f \"${TAPE_FILE}\" ${TAR_PART2} ${TAR_PART3} ${BACKUP_FILES}"
if [ $? -ne 0 ] ; then
echo "Backup of miscellaneous files failed." 1>&2
# I'm assuming that the tar will have written an empty
# file to the tape, otherwise I should do a cat here.
else
mv -f /etc/tar-backup/temp.level-1 /etc/tar-backup/misc.level-1
fi
${TAPE_STATUS}
else
echo "No miscellaneous files specified"
fi
# Caveat: some versions of `mt' use `-t' instead of `-f'.
mt -f "${TAPE_FILE}" rewind
mt -f "${TAPE_FILE}" offl
) 2>&1 | tee -a "${LOGFILE}"
echo "Sending the dump log to ${ADMINISTRATOR}"
mail -s "Results of backup started ${startdate}" ${ADMINISTRATOR} < "${LOGFILE}"
# eof

229
scripts/restore.in Normal file
View File

@@ -0,0 +1,229 @@
#! /bin/sh
# This program is part of GNU tar
# Copyright (C) 2004, 2006 Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 1, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.
# Load library routines
SYSCONFDIR=${SYSCONFDIR-@sysconfdir@}
. ${LIBDIR-@libexecdir@}/backup.sh
usage() {
cat - <<EOF
usage: $PROGNAME [OPTIONS] [PATTERN [PATTERN...]]
Options are:
-a, --all Restore all filesystems.
-l, --level=LEVEL Start restoring from the given backup LEVEL
(default $DUMP_LEVEL).
-v, --verbose[=LEVEL] Set verbosity level. Default 100.
Informational options:
-h, --help Display this help message.
-V, --version Display program version.
Send bug reports to @PACKAGE_BUGREPORT@.
EOF
}
unset PATTERN
DUMP_LEVEL=0
CMDLINE="$0 $@"
for opt
do
if [ -z "$prev" ]; then
option=$opt
optarg=`expr "x$opt" : 'x[^=]*=\(.*\)'`
else
option="${prev}=$opt"
prev=""
optarg=$opt
fi
case $option in
-a|--a|--al|--all)
RESTORE_ALL=1
;;
--l=*|--le=*|--lev=*|--leve=*|--level=*)
DUMP_LEVEL=$optarg
;;
-l|--l|--le|--lev|--leve|--level)
prev=$option
;;
--verb=*|--verbo=*|--verbos=*|--verbose=*)
VERBOSE=$optarg
;;
-v|--verb|--verbo|--verbos|--verbose)
VERBOSE=100
;;
-v*) VERBOSE=`expr $option : "-v\(.*\)"`;;
-V|--v|--ve|--ver|--vers|--versi|--versio|--version)
echo "restore (@PACKAGE_NAME@) @VERSION@"
license
exit;;
-h|--h|--he|--hel|--help)
usage
exit;;
-*) bailout "Unknown option $opt. Try $PROGNAME --help for more info.";;
*) if [ -z "$PATTERN" ]; then
PATTERN=$opt
else
PATTERN="$PATTERN|$opt"
fi
;;
esac
done
if [ -z "$RESTORE_ALL" ]; then
if [ -z "$PATTERN" ]; then
usage
exit;
fi
fi
init_restore
cat > $LOGFILE <<EOF
This file contains any messages produced by $PROGNAME.
It was created by GNU $PROGNAME, from @PACKAGE@ (@VERSION@).
Invocation command line was
\$ $CMDLINE
EOF
restore_fs()
{
fs="`echo \"${1}\" | sed -e 's/^.*://'`"
fs=`root_fs $fs`
fsname="`echo \"${1}\" | sed -e 's/\//:/g'`"
remotehost="`expr \"${1}\" : '\([^/][^/]*\):.*'`"
if [ -z "$remotehost" ]; then
remotehost=$localhost
fi
message 10 "fs=$fs"
message 10 "fsname=$fsname"
message 10 "remotehost=$remotehost"
LOGPAT="`level_log_name ${fsname} '[0-9]'`"
PREFIX="`level_log_name ${fsname} ''`"
message 10 LOGPAT=$LOGPAT
message 10 PREFIX=$PREFIX
LEVELS=`remote_run "${remotehost}" ls $LOGPAT |
sed "s,$PREFIX,," | sort -n`
message 10 "LEVELS=$LEVELS"
echo "Starting restore of ${1} at level $DUMP_LEVEL."
for level in $LEVELS
do
if [ $level -lt $DUMP_LEVEL ]; then
message 10 "Skipping level $level"
continue;
fi
message 10 "Restoring level $level"
DATE=`get_dump_time $level`
FILE="`level_log_name ${fsname} ${level}`"
message 10 "FILE=$FILE"
LABEL="`print_level $level` backup of ${fs} on ${remotehost} at ${DATE}"
${RESTORE_BEGIN-:} $level $remotehost $fs $fsname
backup_host ${remotehost} \
"--listed=\"$FILE\"" \
"--label=\"$LABEL\"" \
-C $fs
${RESTORE_END-:} $level $remotehost $fs $fsname
done
}
restore_files()
{
LOGPAT="`level_log_name MISC '[0-9]'`"
PREFIX="`level_log_name MISC ''`"
message 10 LOGPAT=$LOGPAT
message 10 PREFIX=$PREFIX
LEVELS=`remote_run "${localhost}" ls $LOGPAT | sed "s,$PREFIX,," | sort -n`
message 10 "LEVELS=$LEVELS"
echo "Starting restore of miscellaneous files at level $DUMP_LEVEL."
for level in $LEVELS
do
if [ $level -lt $DUMP_LEVEL ]; then
message 10 "Skipping level $level"
continue;
fi
message 10 "Restoring level $level"
DATE=`get_dump_time $level`
FILE="`level_log_name MISC ${level}`"
message 10 "FILE=$FILE"
LABEL="`print_level $level` backup of miscellaneous files at ${DATE}"
${RESTORE_BEGIN-:} $level $localhost MISC MISC
backup_host ${localhost} \
"--listed=\"$FILE\"" \
"--label=\"$LABEL\"" \
-C ${ROOT_FS-/} $@
${RESTORE_END-:} $level $localhost MISC MISC
done
}
# Operation Overwiew:
#
# 1. Determine the time of the last backup
# 2. Create list of incremental listings to process
# 3. For each filesystem:
# 3.1. Start at the requested dump level (default 0) and proceed up to
# the last available level:
# 3.1.1 Deduce the volume label
# 3.1.2. Invoke [rsh] tar --listed=FILE --label=LABEL [opts] -xf $TAPE_FILE
# 4. End
(message 1 "Preparing for restore"
message 1 "processing backup directories"
for dir in ${BACKUP_DIRS}
do
message 1 "Processing $dir"
case $dir in
${PATTERN-*}) restore_fs $dir;;
esac
done
if [ "x${BACKUP_FILES}" != "x" ] ; then
message 1 "processing miscellaneous files"
if [ -z "$PATTERN" ]; then
restore_files
else
RESTORE_FILES=""
for file in ${BACKUP_FILES}
do
rel_file=`expr $file : '/\(.*\)'`
case $file in
$PATTERN) if [ -z "$RESTORE_FILES" ]; then
RESTORE_FILES="$rel_file"
else
RESTORE_FILES="$RESTORE_FILES $rel_file"
fi;;
esac
done
[ -z "$RESTORE_FILES" ] || restore_files $RESTORE_FILES
fi
fi) 2>&1 | tee -a "${LOGFILE}"
# EOF

328
scripts/tar-snapshot-edit Executable file
View File

@@ -0,0 +1,328 @@
#! /usr/bin/perl -w
# Display and edit the 'dev' field in tar's snapshots
# Copyright (C) 2007 Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.
#
# Author: Dustin J. Mitchell <dustin@zmanda.com>
#
# This script is capable of replacing values in the 'dev' field of an
# incremental backup 'snapshot' file. This is useful when the device
# used to store files in a tar archive changes, without the files
# themselves changing. This may happen when, for example, a device
# driver changes major or minor numbers.
use Getopt::Std;
## reading
sub read_incr_db ($) {
my $filename = shift;
open(my $file, "<$filename") || die "Could not open '$filename' for reading";
my $header_str = <$file>;
my $file_version;
if ($header_str =~ /^GNU tar-[^-]*-([0-9]+)\n$/) {
$file_version = $1+0;
} else {
$file_version = 0;
}
print "file version $file_version\n";
if ($file_version == 0) {
return read_incr_db_0($file, $header_str);
} elsif ($file_version == 1) {
return read_incr_db_1($file);
} elsif ($file_version == 2) {
return read_incr_db_2($file);
} else {
die "Unrecognized snapshot version in header '$header_str'";
}
}
sub read_incr_db_0 ($$) {
my $file = shift;
my $header_str = shift;
my $hdr_timestamp_sec = $header_str;
chop $hdr_timestamp_sec;
my $hdr_timestamp_nsec = ''; # not present in file format 0
my @dirs;
while (<$file>) {
/^([0-9]*) ([0-9]*) (.*)\n$/ || die("Bad snapshot line $_");
push @dirs, { dev=>$1,
ino=>$2,
name=>$3 };
}
close($file);
# file version, timestamp, timestamp, dir list
return [ 0, $hdr_timestamp_sec, $hdr_timestamp_nsec, \@dirs ];
}
sub read_incr_db_1 ($) {
my $file = shift;
my $timestamp = <$file>; # "sec nsec"
my ($hdr_timestamp_sec, $hdr_timestamp_nsec) = ($timestamp =~ /([0-9]*) ([0-9]*)/);
my @dirs;
while (<$file>) {
/^([0-9]*) ([0-9]*) ([0-9]*) ([0-9]*) (.*)\n$/ || die("Bad snapshot line $_");
push @dirs, { timestamp_sec=>$1,
timestamp_nsec=>$2,
dev=>$3,
ino=>$4,
name=>$5 };
}
close($file);
# file version, timestamp, timestamp, dir list
return [ 1, $hdr_timestamp_sec, $hdr_timestamp_nsec, \@dirs ];
}
sub read_incr_db_2 ($) {
my $file = shift;
$/="\0"; # $INPUT_RECORD_SEPARATOR
my $hdr_timestamp_sec = <$file>;
chop $hdr_timestamp_sec;
my $hdr_timestamp_nsec = <$file>;
chop $hdr_timestamp_nsec;
my @dirs;
while (1) {
last if eof($file);
my $nfs = <$file>;
my $timestamp_sec = <$file>;
my $timestamp_nsec = <$file>;
my $dev = <$file>;
my $ino = <$file>;
my $name = <$file>;
# get rid of trailing NULs
chop $nfs;
chop $timestamp_sec;
chop $timestamp_nsec;
chop $dev;
chop $ino;
chop $name;
my @dirents;
while (my $dirent = <$file>) {
chop $dirent;
push @dirents, $dirent;
last if ($dirent eq "");
}
die "missing terminator" unless (<$file> eq "\0");
push @dirs, { nfs=>$nfs,
timestamp_sec=>$timestamp_sec,
timestamp_nsec=>$timestamp_nsec,
dev=>$dev,
ino=>$ino,
name=>$name,
dirents=>\@dirents };
}
close($file);
$/ = "\n"; # reset to normal
# file version, timestamp, timestamp, dir list
return [ 2, $hdr_timestamp_sec, $hdr_timestamp_nsec, \@dirs ];
}
## display
sub show_device_counts ($$) {
my $info = shift;
my $filename = shift;
my %devices;
foreach my $dir (@{${@$info}[3]}) {
my $dev = ${%$dir}{'dev'};
$devices{$dev}++;
}
foreach $dev (sort keys %devices) {
printf "$filename: Device 0x%04x occurs $devices{$dev} times.\n", $dev;
}
}
## editing
sub replace_device_number ($@) {
my $info = shift(@_);
my @repl = @_;
foreach my $dir (@{${@$info}[3]}) {
foreach $x (@repl) {
if (${%$dir}{'dev'} eq $$x[0]) {
${%$dir}{'dev'} = $$x[1];
last;
}
}
}
}
## writing
sub write_incr_db ($$) {
my $info = shift;
my $filename = shift;
my $file_version = $$info[0];
open($file, ">$filename") || die "Could not open '$filename' for writing";
if ($file_version == 0) {
write_incr_db_0($info, $file);
} elsif ($file_version == 1) {
write_incr_db_1($info, $file);
} elsif ($file_version == 2) {
write_incr_db_2($info, $file);
} else {
die "Unknown file version $file_version.";
}
close($file);
}
sub write_incr_db_0 ($$) {
my $info = shift;
my $file = shift;
my $timestamp_sec = $info->[1];
print $file "$timestamp_sec\n";
foreach my $dir (@{${@$info}[3]}) {
print $file "${%$dir}{'dev'} ";
print $file "${%$dir}{'ino'} ";
print $file "${%$dir}{'name'}\n";
}
}
sub write_incr_db_1 ($$) {
my $info = shift;
my $file = shift;
print $file "GNU tar-1.15-1\n";
my $timestamp_sec = $info->[1];
my $timestamp_nsec = $info->[2];
print $file "$timestamp_sec $timestamp_nsec\n";
foreach my $dir (@{${@$info}[3]}) {
print $file "${%$dir}{'timestamp_sec'} ";
print $file "${%$dir}{'timestamp_nsec'} ";
print $file "${%$dir}{'dev'} ";
print $file "${%$dir}{'ino'} ";
print $file "${%$dir}{'name'}\n";
}
}
sub write_incr_db_2 ($$) {
my $info = shift;
my $file = shift;
print $file "GNU tar-1.16-2\n";
my $timestamp_sec = $info->[1];
my $timestamp_nsec = $info->[2];
print $file $timestamp_sec . "\0";
print $file $timestamp_nsec . "\0";
foreach my $dir (@{${@$info}[3]}) {
print $file ${%$dir}{'nfs'} . "\0";
print $file ${%$dir}{'timestamp_sec'} . "\0";
print $file ${%$dir}{'timestamp_nsec'} . "\0";
print $file ${%$dir}{'dev'} . "\0";
print $file ${%$dir}{'ino'} . "\0";
print $file ${%$dir}{'name'} . "\0";
foreach my $dirent (@{${%$dir}{'dirents'}}) {
print $file $dirent . "\0";
}
print $file "\0";
}
}
## main
sub main {
our ($opt_b, $opt_r, $opt_h);
getopts('br:h');
HELP_MESSAGE() if ($opt_h || $#ARGV == -1 || ($opt_b && !$opt_r));
my @repl;
if ($opt_r) {
foreach my $spec (split(/,/, $opt_r)) {
($spec =~ /^([^-]+)-([^-]+)/) || die "Invalid replacement specification '$opt_r'";
push @repl, [interpret_dev($1), interpret_dev($2)];
}
}
foreach my $snapfile (@ARGV) {
my $info = read_incr_db($snapfile);
if ($opt_r ) {
if ($opt_b) {
rename($snapfile, $snapfile . "~") || die "Could not rename '$snapfile' to backup";
}
replace_device_number($info, @repl);
write_incr_db($info, $snapfile);
} else {
show_device_counts($info, $snapfile);
}
}
}
sub HELP_MESSAGE {
print "Usage: tar-snapshot-edit.pl [-r 'DEV1-DEV2[,DEV3-DEV4...]' [-b]] SNAPFILE [SNAPFILE [..]]\n";
print "\n";
print " Without -r, summarize the 'device' values in each SNAPFILE.\n";
print "\n";
print " With -r, replace occurrences of DEV1 with DEV2 in each SNAPFILE.\n";
print " DEV1 and DEV2 may be specified in hex (e.g., 0xfe01), decimal (e.g.,\n";
print " 65025), or MAJ:MIN (e.g., 254:1). To replace multiple occurrences,\n";
print " separate them with commas. If -b is also specified, backup\n";
print " files (ending with '~') will be created.\n";
exit 1;
}
sub interpret_dev ($) {
my $dev = shift;
if ($dev =~ /^([0-9]+):([0-9]+)$/) {
return $1 * 256 + $2;
} elsif ($dev =~ /^0x[0-9a-fA-F]+$/) {
return oct $dev;
} elsif ($dev =~ /^[0-9]+$/) {
return $dev+0;
} else {
die "Invalid device specification '$dev'";
}
}
main

42
scripts/tarcat Executable file
View File

@@ -0,0 +1,42 @@
#! /bin/sh
# Usage: tarcat volume1 volume2 ...
# concatenates a GNU tar multi-volume archive into a single tar archive.
# Author: Bruno Haible <bruno@clisp.org>, Sergey Poznyakoff <gray@gnu.org.ua>
# dump_type FILE [N]
# Print type character from block N (default 0) of tar archive FILE
dump_type() {
dd if="$1" skip=${2:-0} bs=512 count=1 2>/dev/null |
tr '\0' ' ' |
cut -c157
}
case `dump_type "$1"` in
[gx]) PAX=1;;
esac
cat "$1"
shift
for f
do
SKIP=0
T=`dump_type "$f"`
if [ -n "$PAX" ]; then
if [ "$T" = "g" ]; then
# Global extended header.... 2 blocks
# Extended header........... 2 blocks
# Ustar header.............. 1 block
# FIXME: This calculation is will fail for very long file names.
SKIP=5
fi
else
if [ "$T" = "V" ]; then
T=`dump_type "$f" 1`
fi
if [ "$T" = "M" ]; then
SKIP=$(($SKIP + 1))
fi
fi
dd skip=$SKIP if="$f"
done

View File

@@ -1,42 +0,0 @@
#!/bin/sh
# start doing things
TOBACKUP="albert:/"
HOST=`hostname | sed 's/\..*//'`
TAPEFILE=/dev/rfd0a
LOGFILE=tar-out
BLOCKING=20
TAR_PART1="/usr/local/bin/tar clbfVM $BLOCKING"
rm -f $LOGFILE
mt -f $TAPEFILE rewind
host=`echo $TOBACKUP | sed 's/:.*$//'`;
fs=`echo $TOBACKUP | sed 's/^.*://'`;
date=`date`;
fsname=`echo $TOBACKUP | sed 's/\//:/g'`
TAR_PART2="'Weekly backup of $fs on $host at $date' -C $fs ."
echo Backing up $TOBACKUP at $date | tee -a $LOGFILE
# Actually back things up.
if [ $HOST != $host ] ; then
rsh $host $TAR_PART1 $HOST:$TAPEFILE $TAR_PART2
else
sh -c "exec $TAR_PART1 $TAPEFILE $TAR_PART2"
fi
if [ $? -ne 0 ] ; then
echo Backup of $TOBACKUP failed. | tee -a $LOGFILE
echo mts at time of failure | tee -a $LOGFILE
mts -t $TAPEFILE | tee -a $LOGFILE
# I'm assuming that the tar will have written an empty
# file to the tape, otherwise I should do a cat here.
else
echo $date > $fsname.lasttar
fi
sleep 60;
mt -f $TAPEFILE rewind
mt -f $TAPEFILE offl

473
scripts/xsparse.c Normal file
View File

@@ -0,0 +1,473 @@
/* xsparse - expands compressed sparse file images extracted from GNU tar
archives.
Copyright (C) 2006, 2007 Free Software Foundation, Inc.
Written by Sergey Poznyakoff
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 3, or (at your option) any later
version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <limits.h>
#include <errno.h>
/* Bound on length of the string representing an off_t.
See INT_STRLEN_BOUND in intprops.h for explanation */
#define OFF_T_STRLEN_BOUND ((sizeof (off_t) * CHAR_BIT) * 146 / 485 + 1)
#define OFF_T_STRSIZE_BOUND (OFF_T_STRLEN_BOUND+1)
#define BLOCKSIZE 512
struct sp_array
{
off_t offset;
size_t numbytes;
};
char *progname;
int verbose;
void
die (int code, char *fmt, ...)
{
va_list ap;
fprintf (stderr, "%s: ", progname);
va_start (ap, fmt);
vfprintf (stderr, fmt, ap);
va_end (ap);
fprintf (stderr, "\n");
exit (code);
}
void *
emalloc (size_t size)
{
char *p = malloc (size);
if (!p)
die (1, "not enough memory");
return p;
}
off_t
string_to_off (char *p, char **endp)
{
off_t v = 0;
for (; *p; p++)
{
int digit = *p - '0';
off_t x = v * 10;
if (9 < (unsigned) digit)
{
if (endp)
{
*endp = p;
break;
}
die (1, "number parse error near %s", p);
}
else if (x / 10 != v)
die (1, "number out of allowed range, near %s", p);
v = x + digit;
if (v < 0)
die (1, "negative number");
}
if (endp)
*endp = p;
return v;
}
size_t
string_to_size (char *p, char **endp)
{
off_t v = string_to_off (p, endp);
size_t ret = v;
if (ret != v)
die (1, "number too big");
return ret;
}
size_t sparse_map_size;
struct sp_array *sparse_map;
void
get_line (char *s, int size, FILE *stream)
{
char *p = fgets (s, size, stream);
size_t len;
if (!p)
die (1, "unexpected end of file");
len = strlen (p);
if (s[len - 1] != '\n')
die (1, "buffer overflow");
s[len - 1] = 0;
}
int
get_var (FILE *fp, char **name, char **value)
{
static char *buffer;
static size_t bufsize = OFF_T_STRSIZE_BOUND;
char *p, *q;
buffer = emalloc (bufsize);
do
{
size_t len, s;
if (!fgets (buffer, bufsize, fp))
return 0;
len = strlen (buffer);
if (len == 0)
return 0;
s = string_to_size (buffer, &p);
if (*p != ' ')
die (1, "malformed header: expected space but found %s", p);
if (buffer[len-1] != '\n')
{
if (bufsize < s + 1)
{
bufsize = s + 1;
buffer = realloc (buffer, bufsize);
if (!buffer)
die (1, "not enough memory");
}
if (!fgets (buffer + len, s - len + 1, fp))
die (1, "unexpected end of file or read error");
}
p++;
}
while (memcmp (p, "GNU.sparse.", 11));
p += 11;
q = strchr (p, '=');
if (!q)
die (1, "malformed header: expected `=' not found");
*q++ = 0;
q[strlen (q) - 1] = 0;
*name = p;
*value = q;
return 1;
}
char *outname;
off_t outsize;
unsigned version_major;
unsigned version_minor;
void
read_xheader (char *name)
{
char *kw, *val;
FILE *fp = fopen (name, "r");
char *expect = NULL;
size_t i = 0;
if (verbose)
printf ("Reading extended header file\n");
while (get_var (fp, &kw, &val))
{
if (verbose)
printf ("Found variable GNU.sparse.%s = %s\n", kw, val);
if (expect && strcmp (kw, expect))
die (1, "bad keyword sequence: expected `%s' but found `%s'",
expect, kw);
expect = NULL;
if (strcmp (kw, "name") == 0)
{
outname = emalloc (strlen (val) + 1);
strcpy (outname, val);
}
else if (strcmp (kw, "major") == 0)
{
version_major = string_to_size (val, NULL);
}
else if (strcmp (kw, "minor") == 0)
{
version_minor = string_to_size (val, NULL);
}
else if (strcmp (kw, "realsize") == 0
|| strcmp (kw, "size") == 0)
{
outsize = string_to_off (val, NULL);
}
else if (strcmp (kw, "numblocks") == 0)
{
sparse_map_size = string_to_size (val, NULL);
sparse_map = emalloc (sparse_map_size * sizeof *sparse_map);
}
else if (strcmp (kw, "offset") == 0)
{
sparse_map[i].offset = string_to_off (val, NULL);
expect = "numbytes";
}
else if (strcmp (kw, "numbytes") == 0)
{
sparse_map[i++].numbytes = string_to_size (val, NULL);
}
else if (strcmp (kw, "map") == 0)
{
for (i = 0; i < sparse_map_size; i++)
{
sparse_map[i].offset = string_to_off (val, &val);
if (*val != ',')
die (1, "bad GNU.sparse.map: expected `,' but found `%c'",
*val);
sparse_map[i].numbytes = string_to_size (val+1, &val);
if (*val != ',')
{
if (!(*val == 0 && i == sparse_map_size-1))
die (1, "bad GNU.sparse.map: expected `,' but found `%c'",
*val);
}
else
val++;
}
if (*val)
die (1, "bad GNU.sparse.map: garbage at the end");
}
}
if (expect)
die (1, "bad keyword sequence: expected `%s' not found", expect);
if (version_major == 0 && sparse_map_size == 0)
die (1, "size of the sparse map unknown");
if (i != sparse_map_size)
die (1, "not all sparse entries supplied");
fclose (fp);
}
void
read_map (FILE *ifp)
{
size_t i;
char nbuf[OFF_T_STRSIZE_BOUND];
if (verbose)
printf ("Reading v.1.0 sparse map\n");
get_line (nbuf, sizeof nbuf, ifp);
sparse_map_size = string_to_size (nbuf, NULL);
sparse_map = emalloc (sparse_map_size * sizeof *sparse_map);
for (i = 0; i < sparse_map_size; i++)
{
get_line (nbuf, sizeof nbuf, ifp);
sparse_map[i].offset = string_to_off (nbuf, NULL);
get_line (nbuf, sizeof nbuf, ifp);
sparse_map[i].numbytes = string_to_size (nbuf, NULL);
}
fseek (ifp, ((ftell (ifp) + BLOCKSIZE - 1) / BLOCKSIZE) * BLOCKSIZE,
SEEK_SET);
}
void
expand_sparse (FILE *sfp, int ofd)
{
size_t i;
size_t maxbytes = 0;
char *buffer;
for (i = 0; i < sparse_map_size; i++)
if (maxbytes < sparse_map[i].numbytes)
maxbytes = sparse_map[i].numbytes;
for (buffer = malloc (maxbytes); !buffer; maxbytes /= 2)
if (maxbytes == 0)
die (1, "not enough memory");
for (i = 0; i < sparse_map_size; i++)
{
size_t size = sparse_map[i].numbytes;
if (size == 0)
ftruncate (ofd, sparse_map[i].offset);
else
{
lseek (ofd, sparse_map[i].offset, SEEK_SET);
while (size)
{
size_t rdsize = (size < maxbytes) ? size : maxbytes;
if (rdsize != fread (buffer, 1, rdsize, sfp))
die (1, "read error (%d)", errno);
if (rdsize != write (ofd, buffer, rdsize))
die (1, "write error (%d)", errno);
size -= rdsize;
}
}
}
free (buffer);
}
void
usage (int code)
{
printf ("Usage: %s [OPTIONS] infile [outfile]\n", progname);
printf ("%s: expand sparse files extracted from GNU archives\n",
progname);
printf ("\nOPTIONS are:\n\n");
printf (" -h Display this help list\n");
printf (" -n Dry run: do nothing, print what would have been done\n");
printf (" -v Increase verbosity level\n");
printf (" -x FILE Parse extended header FILE\n\n");
exit (code);
}
void
guess_outname (char *name)
{
char *p;
char *s;
if (name[0] == '.' && name[1] == '/')
name += 2;
p = name + strlen (name) - 1;
s = NULL;
for (; p > name && *p != '/'; p--)
;
if (*p == '/')
s = p + 1;
if (p != name)
{
for (p--; p > name && *p != '/'; p--)
;
}
if (*p != '/')
{
if (s)
outname = s;
else
{
outname = emalloc (4 + strlen (name));
strcpy (outname, "../");
strcpy (outname + 3, name);
}
}
else
{
size_t len = p - name + 1;
outname = emalloc (len + strlen (s) + 1);
memcpy (outname, name, len);
strcpy (outname + len, s);
}
}
int
main (int argc, char **argv)
{
int c;
int dry_run = 0;
char *xheader_file = NULL;
char *inname;
FILE *ifp;
struct stat st;
int ofd;
progname = argv[0];
while ((c = getopt (argc, argv, "hnvx:")) != EOF)
{
switch (c)
{
case 'h':
usage (0);
break;
case 'x':
xheader_file = optarg;
break;
case 'n':
dry_run = 1;
case 'v':
verbose++;
break;
default:
exit (1);
}
}
argc -= optind;
argv += optind;
if (argc == 0 || argc > 2)
usage (1);
if (xheader_file)
read_xheader (xheader_file);
inname = argv[0];
if (argv[1])
outname = argv[1];
if (stat (inname, &st))
die (1, "cannot stat %s (%d)", inname, errno);
ifp = fopen (inname, "r");
if (ifp == NULL)
die (1, "cannot open file %s (%d)", inname, errno);
if (!xheader_file || version_major == 1)
read_map (ifp);
if (!outname)
guess_outname (inname);
ofd = open (outname, O_RDWR|O_CREAT|O_TRUNC, st.st_mode);
if (ofd == -1)
die (1, "cannot open file %s (%d)", outname, errno);
if (verbose)
printf ("Expanding file `%s' to `%s'\n", inname, outname);
if (dry_run)
{
printf ("Finished dry run\n");
return 0;
}
expand_sparse (ifp, ofd);
fclose (ifp);
close (ofd);
if (verbose)
printf ("Done\n");
if (outsize)
{
if (stat (outname, &st))
die (1, "cannot stat output file %s (%d)", outname, errno);
if (st.st_size != outsize)
die (1, "expanded file has wrong size");
}
return 0;
}

6
src/.cvsignore Normal file
View File

@@ -0,0 +1,6 @@
.deps
.gdbinit
Makefile
Makefile.in
rmt
tar

View File

@@ -1,51 +1,48 @@
# Makefile for GNU tar sources.
# Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
# Copyright (C) 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2003, 2006,
# 2007 Free Software Foundation, Inc.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 3, or (at your option)
## any later version.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
## You should have received a copy of the GNU General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
## 02110-1301, USA.
AUTOMAKE_OPTIONS = gnits ansi2knr
bin_PROGRAMS = tar
libexec_PROGRAMS = @RMT@
EXTRA_PROGRAMS = rmt
noinst_HEADERS = arith.h common.h rmt.h system.h tar.h
rmt_SOURCES = rmt.c
tar_SOURCES = arith.c buffer.c compare.c create.c delete.c extract.c \
incremen.c list.c mangle.c misc.c names.c open3.c rtapelib.c tar.c update.c
noinst_HEADERS = arith.h common.h tar.h
tar_SOURCES = \
buffer.c\
checkpoint.c\
compare.c\
create.c\
delete.c\
extract.c\
xheader.c\
incremen.c\
list.c\
misc.c\
names.c\
sparse.c\
suffix.c\
system.c\
tar.c\
transform.c\
update.c\
utf8.c
INCLUDES = -I../intl -I$(top_srcdir)/lib
LDADD = ../lib/libtar.a @INTLLIBS@
localedir = $(prefix)/@DATADIRNAME@/locale
INCLUDES = -I$(top_srcdir)/lib -I../ -I../lib
tar.o: tar.c
$(COMPILE) -DLOCALEDIR=\"$(localedir)\" -c $(srcdir)/tar.c
LDADD = ../lib/libtar.a $(LIBINTL) $(LIBICONV)
tar._o: tar._c
@rm -f _tar.c
@ln tar._c _tar.c
$(COMPILE) -DLOCALEDIR=\"$(localedir)\" -c _tar.c
@mv _tar.o $@
@rm _tar.c
rmt.o: rmt.c
$(COMPILE) -DLOCALEDIR=\"$(localedir)\" -c $(srcdir)/rmt.c
rmt._o: rmt._c
@rm -f _rmt.c
@ln rmt._c _rmt.c
$(COMPILE) -DLOCALEDIR=\"$(localedir)\" -c _rmt.c
@mv _rmt.o $@
@rm _rmt.c
tar_LDADD = $(LDADD) $(LIB_CLOCK_GETTIME)

View File

@@ -1,9 +1,9 @@
/* Simple arithmetic for numbers greater than a long int, for GNU tar.
Copyright (C) 1996, 1997 Free Software Foundation, Inc.
/* Long integers, for GNU tar.
Copyright 1999, 2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
the Free Software Foundation; either version 3, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
@@ -13,111 +13,15 @@
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
/* Also, see comments at beginning of arith.c. */
#define BITS_PER_BYTE 8 /* number of bits in each sizeof unit */
#define BITS_PER_TARLONG 42 /* wanted number of bits in each tarlong */
/* In all cases, tarlong is the proper type for a big number.
For simulated arithmetic, SUPERDIGIT is the base, TARLONG_FORMAT is the
format to print a single super-digit filled with zeroes to the left, and
BITS_PER_SUPERDIGIT is the smallest number of bits required to fully
represent each super-digit. LONGS_PER_TARLONG says how many longs are
required for a full tarlong, and SIZEOF_TARLONG is the size of a tarlong
in bytes.
For straight compiler arithmetic, SUPERDIGIT is zero and TARLONG_FORMAT
is the format to directly print a tarlong (without zero-filling).
The values of SIZEOF_LONG_LONG and SIZEOF_UNSIGNED_LONG, below, are
obtained through the configuration process. */
#if BITS_PER_BYTE * SIZEOF_UNSIGNED_LONG >= BITS_PER_TARLONG
# define SUPERDIGIT 0
# define TARLONG_FORMAT "%uld"
typedef unsigned long tarlong;
#else
# if BITS_PER_BYTE * SIZEOF_LONG_LONG >= BITS_PER_TARLONG + 1
# define SUPERDIGIT 0
# define TARLONG_FORMAT "%lld"
typedef long long tarlong;
# else
# if BITS_PER_BYTE * SIZEOF_UNSIGNED_LONG >= 64
# define SUPERDIGIT 1000000000L
# define BITS_PER_SUPERDIGIT 29
# define TARLONG_FORMAT "%09uld"
# else
# if BITS_PER_BYTE * SIZEOF_UNSIGNED_LONG >= 32
# define SUPERDIGIT 10000L
# define BITS_PER_SUPERDIGIT 14
# define TARLONG_FORMAT "%04uld"
# endif
# endif
# endif
#endif
#if SUPERDIGIT
# define LONGS_PER_TARLONG \
((BITS_PER_TARLONG + BITS_PER_SUPERDIGIT - 1) / BITS_PER_SUPERDIGIT)
# define SIZEOF_TARLONG (LONGS_PER_TARLONG * sizeof (unsigned long))
/* The NEC EWS 4.2 C compiler gets confused by a pointer to a typedef that
is an array. So we wrap the array into a struct. (Pouah!) */
struct tarlong
{
unsigned long digit[LONGS_PER_TARLONG];
};
typedef struct tarlong tarlong;
int zerop_tarlong_helper PARAMS ((unsigned long *));
int lessp_tarlong_helper PARAMS ((unsigned long *, unsigned long *));
void clear_tarlong_helper PARAMS ((unsigned long *));
void add_to_tarlong_helper PARAMS ((unsigned long *, int));
void mult_tarlong_helper PARAMS ((unsigned long *, int));
void print_tarlong_helper PARAMS ((unsigned long *, FILE *));
# define zerop_tarlong(Accumulator) \
zerop_tarlong_helper (&(Accumulator).digit[0])
# define lessp_tarlong(First, Second) \
lessp_tarlong_helper (&(First).digit[0], &(Second).digit[0])
# define clear_tarlong(Accumulator) \
clear_tarlong_helper (&(Accumulator).digit[0])
# define add_to_tarlong(Accumulator, Value) \
add_to_tarlong_helper (&(Accumulator).digit[0], (Value))
# define mult_tarlong(Accumulator, Value) \
mult_tarlong_helper (&(Accumulator).digit[0], (Value))
# define print_tarlong(Accumulator, File) \
print_tarlong_helper (&(Accumulator).digit[0], (File))
#else /* not SUPERDIGIT */
# define zerop_tarlong(Accumulator) \
((Accumulator) == 0)
# define lessp_tarlong(First, Second) \
((First) < (Second))
# define clear_tarlong(Accumulator) \
((Accumulator) = 0)
# define add_to_tarlong(Accumulator, Value) \
((Accumulator) += (Value))
# define mult_tarlong(Accumulator, Value) \
((Accumulator) *= (Value))
# define print_tarlong(Accumulator, File) \
(fprintf ((File), TARLONG_FORMAT, (Accumulator)))
#endif /* not SUPERDIGIT */
/* Handle large integers for calculating big tape lengths and the
like. In practice, double precision does for now. On the vast
majority of machines, it counts up to 2**52 bytes without any loss
of information, and counts up to 2**62 bytes if data are always
blocked in 1 kB boundaries. We'll need arbitrary precision
arithmetic anyway once we get into the 2**64 range, so there's no
point doing anything fancy before then. */
#define TARLONG_FORMAT "%.0f"
typedef double tarlong;

File diff suppressed because it is too large Load Diff

270
src/checkpoint.c Normal file
View File

@@ -0,0 +1,270 @@
/* Checkpoint management for tar.
Copyright (C) 2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 3, or (at your option) any later
version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
Public License for more details.
You should have received a copy of the GNU General Public License along
with this program. If not, see <http://www.gnu.org/licenses/>. */
#include <system.h>
#include "common.h"
enum checkpoint_opcode
{
cop_dot,
cop_bell,
cop_echo,
cop_ttyout,
cop_sleep,
cop_exec
};
struct checkpoint_action
{
struct checkpoint_action *next;
enum checkpoint_opcode opcode;
union
{
time_t time;
char *command;
} v;
};
/* Checkpointing counter */
static unsigned checkpoint;
/* List of checkpoint actions */
static struct checkpoint_action *checkpoint_action, *checkpoint_action_tail;
static struct checkpoint_action *
alloc_action (enum checkpoint_opcode opcode)
{
struct checkpoint_action *p = xzalloc (sizeof *p);
if (checkpoint_action_tail)
checkpoint_action_tail->next = p;
else
checkpoint_action = p;
checkpoint_action_tail = p;
p->opcode = opcode;
return p;
}
static char *
copy_string_unquote (const char *str)
{
char *output = xstrdup (str);
size_t len = strlen (output);
if ((*output == '"' || *output == '\'')
&& output[len-1] == *output)
{
memmove (output, output+1, len-2);
output[len-2] = 0;
}
unquote_string (output);
return output;
}
void
checkpoint_compile_action (const char *str)
{
struct checkpoint_action *act;
if (strcmp (str, ".") == 0 || strcmp (str, "dot") == 0)
alloc_action (cop_dot);
if (strcmp (str, "bell") == 0)
alloc_action (cop_bell);
else if (strcmp (str, "echo") == 0)
alloc_action (cop_echo);
else if (strncmp (str, "echo=", 5) == 0)
{
act = alloc_action (cop_echo);
act->v.command = copy_string_unquote (str + 5);
}
else if (strncmp (str, "exec=", 5) == 0)
{
act = alloc_action (cop_exec);
act->v.command = copy_string_unquote (str + 5);
}
else if (strncmp (str, "ttyout=", 7) == 0)
{
act = alloc_action (cop_ttyout);
act->v.command = copy_string_unquote (str + 7);
}
else if (strncmp (str, "sleep=", 6) == 0)
{
char *p;
time_t n = strtoul (str+6, &p, 10);
if (*p)
FATAL_ERROR ((0, 0, _("%s: not a valid timeout"), str));
act = alloc_action (cop_sleep);
act->v.time = n;
}
else
FATAL_ERROR ((0, 0, _("%s: unknown checkpoint action"), str));
}
void
checkpoint_finish_compile ()
{
if (checkpoint_option)
{
if (!checkpoint_action)
/* Provide a historical default */
checkpoint_compile_action ("echo");
}
else if (checkpoint_action)
/* Otherwise, set default checkpoint rate */
checkpoint_option = DEFAULT_CHECKPOINT;
}
char *
expand_checkpoint_string (const char *input, bool do_write, unsigned cpn)
{
const char *opstr = do_write ? gettext ("write") : gettext ("read");
size_t opstrlen = strlen (opstr);
char uintbuf[UINTMAX_STRSIZE_BOUND];
char *cps = STRINGIFY_BIGINT (cpn, uintbuf);
size_t cpslen = strlen (cps);
const char *ip;
char *op;
char *output;
size_t outlen = strlen (input); /* Initial guess */
/* Fix the initial length guess */
for (ip = input; (ip = strchr (ip, '%')) != NULL; )
{
switch (ip[1])
{
case 'u':
outlen += cpslen - 2;
break;
case 's':
outlen += opstrlen - 2;
}
ip++;
}
output = xmalloc (outlen + 1);
for (ip = input, op = output; *ip; )
{
if (*ip == '%')
{
switch (*++ip)
{
case 'u':
op = stpcpy (op, cps);
break;
case 's':
op = stpcpy (op, opstr);
break;
default:
*op++ = '%';
*op++ = *ip;
break;
}
ip++;
}
else
*op++ = *ip++;
}
*op = 0;
return output;
}
static void
run_checkpoint_actions (bool do_write)
{
struct checkpoint_action *p;
FILE *tty = NULL;
for (p = checkpoint_action; p; p = p->next)
{
switch (p->opcode)
{
case cop_dot:
fputc ('.', stdlis);
fflush (stdlis);
break;
case cop_bell:
if (!tty)
tty = fopen ("/dev/tty", "w");
if (tty)
{
fputc ('\a', tty);
fflush (tty);
}
break;
case cop_echo:
{
char *tmp;
const char *str = p->v.command;
if (!str)
{
if (do_write)
/* TRANSLATORS: This is a ``checkpoint of write operation'',
*not* ``Writing a checkpoint''.
E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
*not* ``Escribiendo un punto de comprobaci@'on'' */
str = gettext ("Write checkpoint %u");
else
/* TRANSLATORS: This is a ``checkpoint of read operation'',
*not* ``Reading a checkpoint''.
E.g. in Spanish ``Punto de comprobaci@'on de lectura'',
*not* ``Leyendo un punto de comprobaci@'on'' */
str = gettext ("Read checkpoint %u");
}
tmp = expand_checkpoint_string (str, do_write, checkpoint);
WARN ((0, 0, "%s", tmp));
free (tmp);
}
break;
case cop_ttyout:
if (!tty)
tty = fopen ("/dev/tty", "w");
if (tty)
{
char *tmp = expand_checkpoint_string (p->v.command, do_write,
checkpoint);
fprintf (tty, "%s", tmp);
fflush (tty);
free (tmp);
}
break;
case cop_sleep:
sleep (p->v.time);
break;
case cop_exec:
sys_exec_checkpoint_script (p->v.command,
archive_name_cursor[0],
checkpoint);
break;
}
}
if (tty)
fclose (tty);
}
void
checkpoint_run (bool do_write)
{
if (checkpoint_option && !(++checkpoint % checkpoint_option))
run_checkpoint_actions (do_write);
}

View File

@@ -1,9 +1,11 @@
/* Common declarations for the tar program.
Copyright (C) 1988, 92, 93, 94, 96, 97 Free Software Foundation, Inc.
Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001,
2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any later
Free Software Foundation; either version 3, or (at your option) any later
version.
This program is distributed in the hope that it will be useful, but
@@ -13,7 +15,7 @@
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
59 Place - Suite 330, Boston, MA 02111-1307, USA. */
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
/* Declare the GNU tar archive format. */
#include "tar.h"
@@ -27,69 +29,47 @@
#define UNAME_FIELD_SIZE 32
#define GNAME_FIELD_SIZE 32
/* POSIX specified symbols currently unused are undefined here. */
#undef TSUID
#undef TSGID
#undef TSVTX
#undef TUREAD
#undef TUWRITE
#undef TUEXEC
#undef TGREAD
#undef TGWRITE
#undef TGEXEC
#undef TOREAD
#undef TOWRITE
#undef TOEXEC
/* Some various global definitions. */
/* Name of file to use for interacting with user. */
#if MSDOS
# define TTY_NAME "con"
#else
# define TTY_NAME "/dev/tty"
#endif
/* GLOBAL is defined to empty in `tar.c' only, and left alone in other `*.c'
/* GLOBAL is defined to empty in tar.c only, and left alone in other *.c
modules. Here, we merely set it to "extern" if it is not already set.
GNU tar does depend on the system loader to preset all GLOBAL variables to
neutral (or zero) values, explicit initialisation is usually not done. */
neutral (or zero) values, explicit initialization is usually not done. */
#ifndef GLOBAL
# define GLOBAL extern
#endif
/* Exit status for GNU tar. Let's try to keep this list as simple as
possible. -d option strongly invites a status different for unequal
comparison and other errors. */
GLOBAL int exit_status;
#define TAREXIT_SUCCESS PAXEXIT_SUCCESS
#define TAREXIT_DIFFERS PAXEXIT_DIFFERS
#define TAREXIT_FAILURE PAXEXIT_FAILURE
#define TAREXIT_SUCCESS 0
#define TAREXIT_DIFFERS 1
#define TAREXIT_FAILURE 2
#include "arith.h"
#include <backupfile.h>
#include <exclude.h>
#include <full-write.h>
#include <modechange.h>
#include <quote.h>
#include <safe-read.h>
#include <stat-time.h>
#include <timespec.h>
#define obstack_chunk_alloc xmalloc
#define obstack_chunk_free free
#include <obstack.h>
/* Both WARN and ERROR write a message on stderr and continue processing,
however ERROR manages so tar will exit unsuccessfully. FATAL_ERROR
writes a message on stderr and aborts immediately, with another message
line telling so. USAGE_ERROR works like FATAL_ERROR except that the
other message line suggests trying --help. All four macros accept a
single argument of the form ((0, errno, _("FORMAT"), Args...)). `errno'
is `0' when the error is not being detected by the system. */
#include <paxlib.h>
#define WARN(Args) \
error Args
#define ERROR(Args) \
(error Args, exit_status = TAREXIT_FAILURE)
#define FATAL_ERROR(Args) \
(error Args, error (TAREXIT_FAILURE, 0, \
_("Error is not recoverable: exiting now")), 0)
#define USAGE_ERROR(Args) \
(error Args, usage (TAREXIT_FAILURE), 0)
/* Log base 2 of common values. */
#define LG_8 3
#define LG_64 6
#define LG_256 8
/* Information gleaned from the command line. */
#include "arith.h"
#include "modechange.h"
/* Name of this program. */
GLOBAL const char *program_name;
@@ -121,10 +101,12 @@ GLOBAL char filename_terminator;
not have _option in their name, even if their values is derived from
option decoding, as these are especially important in tar. */
GLOBAL int blocking_factor;
GLOBAL int record_size;
GLOBAL size_t record_size;
/* Boolean value. */
GLOBAL int absolute_names_option;
GLOBAL bool absolute_names_option;
/* Display file times in UTC */
GLOBAL bool utc_option;
/* This variable tells how to interpret newer_mtime_option, below. If zero,
files get archived if their mtime is not less than newer_mtime_option.
@@ -132,138 +114,179 @@ GLOBAL int absolute_names_option;
than newer_mtime_option. */
GLOBAL int after_date_option;
/* Boolean value. */
GLOBAL int atime_preserve_option;
enum atime_preserve
{
no_atime_preserve,
replace_atime_preserve,
system_atime_preserve
};
GLOBAL enum atime_preserve atime_preserve_option;
/* Boolean value. */
GLOBAL int backup_option;
GLOBAL bool backup_option;
/* Boolean value. */
GLOBAL int block_number_option;
/* Type of backups being made. */
GLOBAL enum backup_type backup_type;
/* Boolean value. */
GLOBAL int checkpoint_option;
GLOBAL bool block_number_option;
GLOBAL unsigned checkpoint_option;
#define DEFAULT_CHECKPOINT 10
/* Specified name of compression program, or "gzip" as implied by -z. */
GLOBAL const char *use_compress_program_option;
/* Boolean value. */
GLOBAL int dereference_option;
GLOBAL bool dereference_option;
GLOBAL bool hard_dereference_option;
/* Boolean value. */
GLOBAL int exclude_option;
/* Print a message if not all links are dumped */
GLOBAL int check_links_option;
/* Specified file containing names to work on. */
GLOBAL const char *files_from_option;
/* Patterns that match file names to be excluded. */
GLOBAL struct exclude *excluded;
/* Boolean value. */
GLOBAL int force_local_option;
enum exclusion_tag_type
{
exclusion_tag_none,
/* Exclude the directory contents, but preserve the directory
itself and the exclusion tag file */
exclusion_tag_contents,
/* Exclude everything below the directory, preserving the directory
itself */
exclusion_tag_under,
/* Exclude entire directory */
exclusion_tag_all,
};
/* Specified value to be put into tar file in place of stat () results, or
just -1 if such an override should not take place. */
GLOBAL gid_t group_option;
/* Boolean value. */
GLOBAL int ignore_failed_read_option;
GLOBAL bool ignore_failed_read_option;
/* Boolean value. */
GLOBAL int ignore_zeros_option;
GLOBAL bool ignore_zeros_option;
/* Boolean value. */
GLOBAL int incremental_option;
GLOBAL bool incremental_option;
/* Specified name of script to run at end of each tape change. */
GLOBAL const char *info_script_option;
/* Boolean value. */
GLOBAL int interactive_option;
GLOBAL bool interactive_option;
/* Boolean value. */
GLOBAL int keep_old_files_option;
/* If nonzero, extract only Nth occurrence of each named file */
GLOBAL uintmax_t occurrence_option;
enum old_files
{
DEFAULT_OLD_FILES, /* default */
NO_OVERWRITE_DIR_OLD_FILES, /* --no-overwrite-dir */
OVERWRITE_OLD_FILES, /* --overwrite */
UNLINK_FIRST_OLD_FILES, /* --unlink-first */
KEEP_OLD_FILES, /* --keep-old-files */
KEEP_NEWER_FILES /* --keep-newer-files */
};
GLOBAL enum old_files old_files_option;
/* Specified file name for incremental list. */
GLOBAL const char *listed_incremental_option;
/* Check device numbers when doing incremental dumps. */
GLOBAL bool check_device_option;
/* Specified mode change string. */
GLOBAL struct mode_change *mode_option;
/* Boolean value. */
GLOBAL int multi_volume_option;
/* Initial umask, if needed for mode change string. */
GLOBAL mode_t initial_umask;
/* The same variable hold the time, whether mtime or ctime. Just fake a
non-existing option, for making the code clearer, elsewhere. */
#define newer_ctime_option newer_mtime_option
GLOBAL bool multi_volume_option;
/* Specified threshold date and time. Files having a more recent timestamp
get archived (also see after_date_option above). If left to zero, it may
be interpreted as very low threshold, just usable as such. */
GLOBAL time_t newer_mtime_option;
/* Specified threshold date and time. Files having an older time stamp
do not get archived (also see after_date_option above). */
GLOBAL struct timespec newer_mtime_option;
/* Boolean value. */
GLOBAL int no_recurse_option;
/* If true, override actual mtime (see below) */
GLOBAL bool set_mtime_option;
/* Value to be put in mtime header field instead of the actual mtime */
GLOBAL struct timespec mtime_option;
/* Boolean value. */
GLOBAL int numeric_owner_option;
/* Return true if newer_mtime_option is initialized. */
#define NEWER_OPTION_INITIALIZED(opt) (0 <= (opt).tv_nsec)
/* Boolean value. */
GLOBAL int one_file_system_option;
/* Return true if the struct stat ST's M time is less than
newer_mtime_option. */
#define OLDER_STAT_TIME(st, m) \
(timespec_cmp (get_stat_##m##time (&(st)), newer_mtime_option) < 0)
/* Likewise, for struct tar_stat_info ST. */
#define OLDER_TAR_STAT_TIME(st, m) \
(timespec_cmp ((st).m##time, newer_mtime_option) < 0)
/* Zero if there is no recursion, otherwise FNM_LEADING_DIR. */
GLOBAL int recursion_option;
GLOBAL bool numeric_owner_option;
GLOBAL bool one_file_system_option;
/* Specified value to be put into tar file in place of stat () results, or
just -1 if such an override should not take place. */
GLOBAL uid_t owner_option;
/* Boolean value. */
GLOBAL int recursive_unlink_option;
GLOBAL bool recursive_unlink_option;
/* Boolean value. */
GLOBAL int read_full_records_option;
GLOBAL bool read_full_records_option;
/* Boolean value. */
GLOBAL int remove_files_option;
GLOBAL bool remove_files_option;
/* Specified rmt command. */
GLOBAL const char *rmt_command_option;
/* Specified remote shell command. */
GLOBAL const char *rsh_command_option;
/* Boolean value. */
GLOBAL int same_order_option;
GLOBAL bool same_order_option;
/* Boolean value. */
/* If positive, preserve ownership when extracting. */
GLOBAL int same_owner_option;
/* Boolean value. */
/* If positive, preserve permissions when extracting. */
GLOBAL int same_permissions_option;
/* Boolean value. */
GLOBAL int show_omitted_dirs_option;
/* When set, strip the given number of file name components from the file name
before extracting */
GLOBAL size_t strip_name_components;
/* Boolean value. */
GLOBAL int sparse_option;
GLOBAL bool show_omitted_dirs_option;
/* Boolean value. */
GLOBAL int starting_file_option;
GLOBAL bool sparse_option;
GLOBAL unsigned tar_sparse_major;
GLOBAL unsigned tar_sparse_minor;
GLOBAL bool starting_file_option;
/* Specified maximum byte length of each tape volume (multiple of 1024). */
GLOBAL tarlong tape_length_option;
/* Boolean value. */
GLOBAL int to_stdout_option;
GLOBAL bool to_stdout_option;
/* Boolean value. */
GLOBAL int totals_option;
GLOBAL bool totals_option;
/* Boolean value. */
GLOBAL int touch_option;
GLOBAL bool touch_option;
/* Boolean value. */
GLOBAL int unlink_first_option;
GLOBAL char *to_command_option;
GLOBAL bool ignore_command_error_option;
/* Restrict some potentially harmful tar options */
GLOBAL bool restrict_option;
/* Return true if the extracted files are not being written to disk */
#define EXTRACT_OVER_PIPE (to_stdout_option || to_command_option)
/* Count how many times the option has been set, multiple setting yields
more verbose behavior. Value 0 means no verbosity, 1 means file name
only, 2 means file name and all attributes. More than 2 is just like 2. */
GLOBAL int verbose_option;
/* Boolean value. */
GLOBAL int verify_option;
GLOBAL bool verify_option;
/* Specified name of file containing the volume number. */
GLOBAL const char *volno_file_option;
@@ -277,47 +300,69 @@ GLOBAL const char *volume_label_option;
GLOBAL int archive;
/* Nonzero when outputting to /dev/null. */
GLOBAL int dev_null_output;
GLOBAL bool dev_null_output;
/* Name of file for the current archive entry. */
GLOBAL char *current_file_name;
/* Timestamps: */
GLOBAL struct timespec start_time; /* when we started execution */
GLOBAL struct timespec volume_start_time; /* when the current volume was
opened*/
GLOBAL struct timespec last_stat_time; /* when the statistics was last
computed */
/* Name of link for the current archive entry. */
GLOBAL char *current_link_name;
GLOBAL struct tar_stat_info current_stat_info;
/* List of tape drive names, number of such tape drives, allocated number,
and current cursor in list. */
GLOBAL const char **archive_name_array;
GLOBAL int archive_names;
GLOBAL int allocated_archive_names;
GLOBAL size_t archive_names;
GLOBAL size_t allocated_archive_names;
GLOBAL const char **archive_name_cursor;
/* Output index file name. */
GLOBAL char const *index_file_name;
/* Structure for keeping track of filenames and lists thereof. */
struct name
{
struct name *next;
short length; /* cached strlen(name) */
char found; /* a matching file has been found */
char firstch; /* first char is literally matched */
char regexp; /* this name is a regexp, not literal */
char *change_dir; /* set with the -C option */
char *dir_contents; /* for incremental_option */
char fake; /* dummy entry */
struct name *next; /* Link to the next element */
int change_dir; /* Number of the directory to change to.
Set with the -C option. */
uintmax_t found_count; /* number of times a matching file has
been found */
int matching_flags; /* this name is a regexp, not literal */
char const *dir_contents; /* for incremental_option */
size_t length; /* cached strlen(name) */
char name[1];
};
GLOBAL struct name *namelist; /* points to first name in list */
GLOBAL struct name *namelast; /* points to last name in list */
/* Pointer to the start of the scratch space. */
struct sp_array
{
off_t offset;
int numbytes;
};
GLOBAL struct sp_array *sparsearray;
/* Obnoxious test to see if dimwit is trying to dump the archive. */
GLOBAL dev_t ar_dev;
GLOBAL ino_t ar_ino;
/* Initial size of the sparsearray. */
GLOBAL int sp_array_size;
GLOBAL bool seekable_archive;
GLOBAL dev_t root_device;
/* Unquote filenames */
GLOBAL bool unquote_option;
GLOBAL bool test_label_option; /* Test archive volume label and exit */
/* Show file or archive names after transformation.
In particular, when creating archive in verbose mode, list member names
as stored in the archive */
GLOBAL bool show_transformed_names_option;
/* Delay setting modification times and permissions of extracted directories
until the end of extraction. This variable helps correctly restore directory
timestamps from archives with an unusual member order. It is automatically
set for incremental archives. */
GLOBAL bool delay_directory_restore_option;
/* Warn about implicit use of the wildcards in command line arguments.
(Default for tar prior to 1.15.91, but changed afterwards */
GLOBAL bool warn_regex_usage;
/* Declarations for each module. */
@@ -335,59 +380,136 @@ extern enum access_mode access_mode;
/* Module buffer.c. */
extern FILE *stdlis;
extern char *save_name;
extern long save_sizeleft;
extern long save_totsize;
extern int write_archive_to_stdout;
extern bool write_archive_to_stdout;
extern char *volume_label;
extern char *continued_file_name;
extern uintmax_t continued_file_size;
extern uintmax_t continued_file_offset;
int available_space_after PARAMS ((union block *));
long current_block_ordinal PARAMS ((void));
void close_archive PARAMS ((void));
void closeout_volume_number PARAMS ((void));
union block *find_next_block PARAMS ((void));
void flush_read PARAMS ((void));
void flush_write PARAMS ((void));
void flush_archive PARAMS ((void));
void init_total_written PARAMS ((void));
void init_volume_number PARAMS ((void));
void open_archive PARAMS ((enum access_mode));
void print_total_written PARAMS ((void));
void reset_eof PARAMS ((void));
void set_next_block_after PARAMS ((union block *));
size_t available_space_after (union block *pointer);
off_t current_block_ordinal (void);
void close_archive (void);
void closeout_volume_number (void);
void compute_duration (void);
union block *find_next_block (void);
void flush_read (void);
void flush_write (void);
void flush_archive (void);
void init_volume_number (void);
void open_archive (enum access_mode mode);
void print_total_stats (void);
void reset_eof (void);
void set_next_block_after (union block *block);
void clear_read_error_count (void);
void xclose (int fd);
void archive_write_error (ssize_t status) __attribute__ ((noreturn));
void archive_read_error (void);
off_t seek_archive (off_t size);
void set_start_time (void);
void mv_begin (struct tar_stat_info *st);
void mv_end (void);
void mv_total_size (off_t size);
void mv_size_left (off_t size);
void buffer_write_global_xheader (void);
/* Module create.c. */
void create_archive PARAMS ((void));
void dump_file PARAMS ((char *, int, int));
void finish_header PARAMS ((union block *));
void to_oct PARAMS ((long, int, char *));
void write_eot PARAMS ((void));
enum dump_status
{
dump_status_ok,
dump_status_short,
dump_status_fail,
dump_status_not_implemented
};
void add_exclusion_tag (const char *name, enum exclusion_tag_type type,
bool (*)(const char*));
bool cachedir_file_p (const char *name);
bool file_dumpable_p (struct tar_stat_info *st);
void create_archive (void);
void pad_archive (off_t size_left);
void dump_file (const char *st, int top_level, dev_t parent_device);
union block *start_header (struct tar_stat_info *st);
void finish_header (struct tar_stat_info *st, union block *header,
off_t block_ordinal);
void simple_finish_header (union block *header);
union block * write_extended (bool global, struct tar_stat_info *st,
union block *old_header);
union block *start_private_header (const char *name, size_t size);
void write_eot (void);
void check_links (void);
void exclusion_tag_warning (const char *dirname, const char *tagname,
const char *message);
enum exclusion_tag_type check_exclusion_tags (char *dirname,
const char **tag_file_name);
#define GID_TO_CHARS(val, where) gid_to_chars (val, where, sizeof (where))
#define MAJOR_TO_CHARS(val, where) major_to_chars (val, where, sizeof (where))
#define MINOR_TO_CHARS(val, where) minor_to_chars (val, where, sizeof (where))
#define MODE_TO_CHARS(val, where) mode_to_chars (val, where, sizeof (where))
#define OFF_TO_CHARS(val, where) off_to_chars (val, where, sizeof (where))
#define SIZE_TO_CHARS(val, where) size_to_chars (val, where, sizeof (where))
#define TIME_TO_CHARS(val, where) time_to_chars (val, where, sizeof (where))
#define UID_TO_CHARS(val, where) uid_to_chars (val, where, sizeof (where))
#define UINTMAX_TO_CHARS(val, where) uintmax_to_chars (val, where, sizeof (where))
#define UNAME_TO_CHARS(name,buf) string_to_chars (name, buf, sizeof(buf))
#define GNAME_TO_CHARS(name,buf) string_to_chars (name, buf, sizeof(buf))
bool gid_to_chars (gid_t gid, char *buf, size_t size);
bool major_to_chars (major_t m, char *buf, size_t size);
bool minor_to_chars (minor_t m, char *buf, size_t size);
bool mode_to_chars (mode_t m, char *buf, size_t size);
bool off_to_chars (off_t off, char *buf, size_t size);
bool size_to_chars (size_t v, char *buf, size_t size);
bool time_to_chars (time_t t, char *buf, size_t size);
bool uid_to_chars (uid_t uid, char *buf, size_t size);
bool uintmax_to_chars (uintmax_t v, char *buf, size_t size);
void string_to_chars (char const *s, char *buf, size_t size);
/* Module diffarch.c. */
extern int now_verifying;
extern bool now_verifying;
void diff_archive PARAMS ((void));
void diff_init PARAMS ((void));
void verify_volume PARAMS ((void));
void diff_archive (void);
void diff_init (void);
void verify_volume (void);
/* Module extract.c. */
void extr_init PARAMS ((void));
void extract_archive PARAMS ((void));
void apply_delayed_set_stat PARAMS ((void));
void extr_init (void);
void extract_archive (void);
void extract_finish (void);
bool rename_directory (char *src, char *dst);
/* Module delete.c. */
void delete_archive_members PARAMS ((void));
void delete_archive_members (void);
/* Module incremen.c. */
typedef struct dumpdir *dumpdir_t;
typedef struct dumpdir_iter *dumpdir_iter_t;
void collect_and_sort_names PARAMS ((void));
char *get_directory_contents PARAMS ((char *, int));
void write_dir_file PARAMS ((void));
void gnu_restore PARAMS ((int));
void write_directory_file PARAMS ((void));
dumpdir_t dumpdir_create0 (const char *contents, const char *cmask);
dumpdir_t dumpdir_create (const char *contents);
void dumpdir_free (dumpdir_t);
char *dumpdir_locate (dumpdir_t dump, const char *name);
char *dumpdir_next (dumpdir_iter_t itr);
char *dumpdir_first (dumpdir_t dump, int all, dumpdir_iter_t *pitr);
const char *get_directory_contents (char *dir_name, dev_t device);
const char *append_incremental_renames (const char *dump);
void read_directory_file (void);
void write_directory_file (void);
void purge_directory (char const *directory_name);
void list_dumpdir (char *buffer, size_t size);
void update_parent_directory (const char *name);
size_t dumpdir_size (const char *p);
bool is_dumpdir (struct tar_stat_info *stat_info);
/* Module list.c. */
@@ -395,77 +517,243 @@ enum read_header
{
HEADER_STILL_UNREAD, /* for when read_header has not been called */
HEADER_SUCCESS, /* header successfully read and checksummed */
HEADER_SUCCESS_EXTENDED, /* likewise, but we got an extended header */
HEADER_ZERO_BLOCK, /* zero block where header expected */
HEADER_END_OF_FILE, /* true end of file while header expected */
HEADER_FAILURE /* ill-formed header, or bad checksum */
};
extern union block *current_header;
extern struct stat current_stat;
extern enum archive_format current_format;
extern size_t recent_long_name_blocks;
extern size_t recent_long_link_blocks;
void decode_header PARAMS ((union block *, struct stat *,
enum archive_format *, int));
long from_oct PARAMS ((int, char *));
void list_archive PARAMS ((void));
void print_for_mkdir PARAMS ((char *, int, int));
void print_header PARAMS ((void));
void read_and PARAMS ((void (*do_) ()));
enum read_header read_header PARAMS ((void));
void skip_extended_headers PARAMS ((void));
void skip_file PARAMS ((long));
void decode_header (union block *header, struct tar_stat_info *stat_info,
enum archive_format *format_pointer, int do_user_group);
char const *tartime (struct timespec t, bool full_time);
/* Module mangle.c. */
#define GID_FROM_HEADER(where) gid_from_header (where, sizeof (where))
#define MAJOR_FROM_HEADER(where) major_from_header (where, sizeof (where))
#define MINOR_FROM_HEADER(where) minor_from_header (where, sizeof (where))
#define MODE_FROM_HEADER(where) mode_from_header (where, sizeof (where))
#define OFF_FROM_HEADER(where) off_from_header (where, sizeof (where))
#define SIZE_FROM_HEADER(where) size_from_header (where, sizeof (where))
#define TIME_FROM_HEADER(where) time_from_header (where, sizeof (where))
#define UID_FROM_HEADER(where) uid_from_header (where, sizeof (where))
#define UINTMAX_FROM_HEADER(where) uintmax_from_header (where, sizeof (where))
void extract_mangle PARAMS ((void));
gid_t gid_from_header (const char *buf, size_t size);
major_t major_from_header (const char *buf, size_t size);
minor_t minor_from_header (const char *buf, size_t size);
mode_t mode_from_header (const char *buf, size_t size);
off_t off_from_header (const char *buf, size_t size);
size_t size_from_header (const char *buf, size_t size);
time_t time_from_header (const char *buf, size_t size);
uid_t uid_from_header (const char *buf, size_t size);
uintmax_t uintmax_from_header (const char * buf, size_t size);
void list_archive (void);
void print_for_mkdir (char *dirname, int length, mode_t mode);
void print_header (struct tar_stat_info *st, off_t block_ordinal);
void read_and (void (*do_something) (void));
enum read_header read_header_primitive (bool raw_extended_headers,
struct tar_stat_info *info);
enum read_header read_header (bool raw_extended_headers);
enum read_header tar_checksum (union block *header, bool silent);
void skip_file (off_t size);
void skip_member (void);
/* Module misc.c. */
void assign_string PARAMS ((char **, const char *));
char *quote_copy_string PARAMS ((const char *));
int unquote_string PARAMS ((char *));
void assign_string (char **dest, const char *src);
char *quote_copy_string (const char *str);
int unquote_string (char *str);
char *merge_sort PARAMS ((char *, int, int, int (*) (char *, char *)));
void code_ns_fraction (int ns, char *p);
char const *code_timespec (struct timespec ts, char *sbuf);
enum { BILLION = 1000000000, LOG10_BILLION = 9 };
enum { TIMESPEC_STRSIZE_BOUND =
UINTMAX_STRSIZE_BOUND + LOG10_BILLION + sizeof "-." - 1 };
int is_dot_or_dotdot PARAMS ((const char *));
int remove_any_file PARAMS ((const char *, int));
int maybe_backup_file PARAMS ((const char *, int));
void undo_last_backup PARAMS ((void));
enum remove_option
{
ORDINARY_REMOVE_OPTION,
RECURSIVE_REMOVE_OPTION,
/* FIXME: The following value is never used. It seems to be intended
as a placeholder for a hypothetical option that should instruct tar
to recursively remove subdirectories in purge_directory(),
as opposed to the functionality of --recursive-unlink
(RECURSIVE_REMOVE_OPTION value), which removes them in
prepare_to_extract() phase. However, with the addition of more
meta-info to the incremental dumps, this should become unnecessary */
WANT_DIRECTORY_REMOVE_OPTION
};
int remove_any_file (const char *file_name, enum remove_option option);
bool maybe_backup_file (const char *file_name, bool this_is_the_archive);
void undo_last_backup (void);
int deref_stat (bool deref, char const *name, struct stat *buf);
int chdir_arg (char const *dir);
void chdir_do (int dir);
void close_diag (char const *name);
void open_diag (char const *name);
void read_diag_details (char const *name, off_t offset, size_t size);
void readlink_diag (char const *name);
void savedir_diag (char const *name);
void seek_diag_details (char const *name, off_t offset);
void stat_diag (char const *name);
void write_error_details (char const *name, size_t status, size_t size);
void write_fatal (char const *name) __attribute__ ((noreturn));
void write_fatal_details (char const *name, ssize_t status, size_t size)
__attribute__ ((noreturn));
pid_t xfork (void);
void xpipe (int fd[2]);
void *page_aligned_alloc (void **ptr, size_t size);
int set_file_atime (int fd, char const *file,
struct timespec const timespec[2]);
/* Module names.c. */
void gid_to_gname PARAMS ((gid_t, char gname[GNAME_FIELD_SIZE]));
int gname_to_gid PARAMS ((char gname[GNAME_FIELD_SIZE], gid_t *));
void uid_to_uname PARAMS ((uid_t, char uname[UNAME_FIELD_SIZE]));
int uname_to_uid PARAMS ((char uname[UNAME_FIELD_SIZE], uid_t *));
extern struct name *gnu_list_name;
void init_names PARAMS ((void));
void name_add PARAMS ((const char *));
void name_init PARAMS ((int, char *const *));
void name_term PARAMS ((void));
char *name_next PARAMS ((int change_));
void name_close PARAMS ((void));
void name_gather PARAMS ((void));
void addname PARAMS ((const char *));
int name_match PARAMS ((const char *));
void names_notfound PARAMS ((void));
void name_expand PARAMS ((void));
struct name *name_scan PARAMS ((const char *));
char *name_from_list PARAMS ((void));
void blank_name_list PARAMS ((void));
char *new_name PARAMS ((const char *, const char *));
void gid_to_gname (gid_t gid, char **gname);
int gname_to_gid (char const *gname, gid_t *pgid);
void uid_to_uname (uid_t uid, char **uname);
int uname_to_uid (char const *uname, uid_t *puid);
void add_exclude PARAMS ((char *));
void add_exclude_file PARAMS ((const char *));
int check_exclude PARAMS ((const char *));
void name_init (void);
void name_add_name (const char *name, int matching_flags);
void name_add_dir (const char *name);
void name_term (void);
const char *name_next (int change_dirs);
void name_gather (void);
struct name *addname (char const *string, int change_dir);
bool name_match (const char *name);
void names_notfound (void);
void collect_and_sort_names (void);
struct name *name_scan (const char *name);
char *name_from_list (void);
void blank_name_list (void);
char *new_name (const char *dir_name, const char *name);
size_t stripped_prefix_len (char const *file_name, size_t num);
bool all_names_found (struct tar_stat_info *st);
bool excluded_name (char const *name);
void add_avoided_name (char const *name);
bool is_avoided_name (char const *name);
bool is_individual_file (char const *name);
bool contains_dot_dot (char const *name);
#define ISFOUND(c) ((occurrence_option == 0) ? (c)->found_count : \
(c)->found_count == occurrence_option)
#define WASFOUND(c) ((occurrence_option == 0) ? (c)->found_count : \
(c)->found_count >= occurrence_option)
/* Module tar.c. */
int confirm PARAMS ((const char *, const char *));
void request_stdin PARAMS ((const char *));
void usage (int);
int confirm (const char *message_action, const char *name);
void request_stdin (const char *option);
void tar_stat_init (struct tar_stat_info *st);
void tar_stat_destroy (struct tar_stat_info *st);
void usage (int) __attribute__ ((noreturn));
int tar_timespec_cmp (struct timespec a, struct timespec b);
const char *archive_format_string (enum archive_format fmt);
const char *subcommand_string (enum subcommand c);
/* Module update.c. */
extern char *output_start;
void update_archive PARAMS ((void));
void update_archive (void);
/* Module xheader.c. */
void xheader_init (struct xheader *xhdr);
void xheader_decode (struct tar_stat_info *stat);
void xheader_decode_global (struct xheader *xhdr);
void xheader_store (char const *keyword, struct tar_stat_info *st,
void const *data);
void xheader_read (struct xheader *xhdr, union block *header, size_t size);
void xheader_write (char type, char *name, struct xheader *xhdr);
void xheader_write_global (struct xheader *xhdr);
void xheader_finish (struct xheader *hdr);
void xheader_destroy (struct xheader *hdr);
char *xheader_xhdr_name (struct tar_stat_info *st);
char *xheader_ghdr_name (void);
void xheader_set_option (char *string);
void xheader_string_begin (struct xheader *xhdr);
void xheader_string_add (struct xheader *xhdr, char const *s);
bool xheader_string_end (struct xheader *xhdr, char const *keyword);
bool xheader_keyword_deleted_p (const char *kw);
char *xheader_format_name (struct tar_stat_info *st, const char *fmt,
size_t n);
/* Module system.c */
void sys_detect_dev_null_output (void);
void sys_save_archive_dev_ino (void);
void sys_drain_input_pipe (void);
void sys_wait_for_child (pid_t);
void sys_spawn_shell (void);
bool sys_compare_uid (struct stat *a, struct stat *b);
bool sys_compare_gid (struct stat *a, struct stat *b);
bool sys_file_is_archive (struct tar_stat_info *p);
bool sys_compare_links (struct stat *link_data, struct stat *stat_data);
int sys_truncate (int fd);
pid_t sys_child_open_for_compress (void);
pid_t sys_child_open_for_uncompress (void);
size_t sys_write_archive_buffer (void);
bool sys_get_archive_stat (void);
int sys_exec_command (char *file_name, int typechar, struct tar_stat_info *st);
void sys_wait_command (void);
int sys_exec_info_script (const char **archive_name, int volume_number);
void sys_exec_checkpoint_script (const char *script_name,
const char *archive_name,
int checkpoint_number);
/* Module compare.c */
void report_difference (struct tar_stat_info *st, const char *message, ...);
/* Module sparse.c */
bool sparse_member_p (struct tar_stat_info *st);
bool sparse_fixup_header (struct tar_stat_info *st);
enum dump_status sparse_dump_file (int, struct tar_stat_info *st);
enum dump_status sparse_extract_file (int fd, struct tar_stat_info *st,
off_t *size);
enum dump_status sparse_skip_file (struct tar_stat_info *st);
bool sparse_diff_file (int, struct tar_stat_info *st);
/* Module utf8.c */
bool string_ascii_p (const char *str);
bool utf8_convert (bool to_utf, char const *input, char **output);
/* Module transform.c */
typedef enum
{
xform_regfile,
xform_link,
xform_symlink
} xform_type;
void set_transform_expr (const char *expr);
bool transform_name (char **pinput);
bool transform_member_name (char **pinput, xform_type type);
bool transform_name_fp (char **pinput, char *(*fun)(char *, void *), void *);
/* Module suffix.c */
void set_comression_program_by_suffix (const char *name, const char *defprog);
/* Module checkpoint.c */
void checkpoint_compile_action (const char *str);
void checkpoint_finish_compile (void);
void checkpoint_run (bool do_write);

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,9 +1,11 @@
/* Delete entries from a tar archive.
Copyright (C) 1988, 1992, 1994, 1996, 1997 Free Software Foundation, Inc.
Copyright (C) 1988, 1992, 1994, 1996, 1997, 2000, 2001, 2003, 2004,
2005, 2006 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any later
Free Software Foundation; either version 3, or (at your option) any later
version.
This program is distributed in the hope that it will be useful, but
@@ -13,97 +15,96 @@
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
59 Place - Suite 330, Boston, MA 02111-1307, USA. */
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
#include "system.h"
#define STDIN 0
#define STDOUT 1
#include <system.h>
#include <system-ioctl.h>
#include "common.h"
#include "rmt.h"
#include <rmt.h>
static union block *new_record = NULL;
static union block *save_record = NULL;
static int records_read = 0;
static int new_blocks = 0;
static int blocks_needed = 0;
static union block *new_record;
static int new_blocks;
static bool acting_as_filter;
/* FIXME: This module should not directly handle the following three
variables, instead, this should be done in buffer.c only. */
/* FIXME: This module should not directly handle the following
variables, instead, the interface should be cleaned up. */
extern union block *record_start;
extern union block *record_end;
extern union block *current_block;
extern union block *recent_long_name;
extern union block *recent_long_link;
extern off_t records_read;
extern off_t records_written;
/*-------------------------------------------------------------------------.
| Move archive descriptor by COUNT records worth. If COUNT is positive we |
| move forward, else we move negative. If its a tape, MTIOCTOP had better |
| work. If its something else, we try to seek on it. If we can't seek, |
| we loose! |
`-------------------------------------------------------------------------*/
/* The number of records skipped at the start of the archive, when
passing over members that are not deleted. */
off_t records_skipped;
/* Move archive descriptor by COUNT records worth. If COUNT is
positive we move forward, else we move negative. If it's a tape,
MTIOCTOP had better work. If it's something else, we try to seek
on it. If we can't seek, we lose! */
static void
move_archive (int count)
move_archive (off_t count)
{
if (count == 0)
return;
#ifdef MTIOCTOP
{
struct mtop operation;
int status;
if (count > 0)
if (count < 0
? (operation.mt_op = MTBSR,
operation.mt_count = -count,
operation.mt_count == -count)
: (operation.mt_op = MTFSR,
operation.mt_count = count,
operation.mt_count == count))
{
operation.mt_op = MTFSR;
operation.mt_count = count;
}
else
{
operation.mt_op = MTBSR;
operation.mt_count = -count;
}
if (0 <= rmtioctl (archive, MTIOCTOP, (char *) &operation))
return;
if (status = rmtioctl (archive, MTIOCTOP, (char *) &operation),
status >= 0)
return;
if (errno == EIO)
if (status = rmtioctl (archive, MTIOCTOP, (char *) &operation),
status >= 0)
return;
if (errno == EIO
&& 0 <= rmtioctl (archive, MTIOCTOP, (char *) &operation))
return;
}
}
#endif /* MTIOCTOP */
{
off_t position = rmtlseek (archive, 0L, 1);
off_t position0 = rmtlseek (archive, (off_t) 0, SEEK_CUR);
off_t increment = record_size * (off_t) count;
off_t position = position0 + increment;
position += record_size * count;
if (rmtlseek (archive, position, 0) != position)
FATAL_ERROR ((0, 0, _("Could not re-position archive file")));
if (increment / count != record_size
|| (position < position0) != (increment < 0)
|| (position = position < 0 ? 0 : position,
rmtlseek (archive, position, SEEK_SET) != position))
seek_error_details (archive_name_array[0], position);
return;
}
}
/*----------------------------------------------------------------.
| Write out the record which has been filled. If MOVE_BACK_FLAG, |
| backspace to where we started. |
`----------------------------------------------------------------*/
/* Write out the record which has been filled. If MOVE_BACK_FLAG,
backspace to where we started. */
static void
write_record (int move_back_flag)
{
save_record = record_start;
union block *save_record = record_start;
record_start = new_record;
if (archive == STDIN)
if (acting_as_filter)
{
archive = STDOUT;
archive = STDOUT_FILENO;
flush_write ();
archive = STDIN;
archive = STDIN_FILENO;
}
else
{
move_archive (-(records_read + 1));
move_archive ((records_written + records_skipped) - records_read);
flush_write ();
}
@@ -113,19 +114,39 @@ write_record (int move_back_flag)
{
/* Move the tape head back to where we were. */
if (archive != STDIN)
move_archive (records_read);
records_read--;
if (! acting_as_filter)
move_archive (records_read - (records_written + records_skipped));
}
blocks_needed = blocking_factor;
new_blocks = 0;
}
/*---.
| ? |
`---*/
static void
write_recent_blocks (union block *h, size_t blocks)
{
size_t i;
for (i = 0; i < blocks; i++)
{
new_record[new_blocks++] = h[i];
if (new_blocks == blocking_factor)
write_record (1);
}
}
static void
write_recent_bytes (char *data, size_t bytes)
{
size_t blocks = bytes / BLOCKSIZE;
size_t rest = bytes - blocks * BLOCKSIZE;
write_recent_blocks ((union block *)data, blocks);
memcpy (new_record[new_blocks].buffer, data + blocks * BLOCKSIZE, rest);
if (rest < BLOCKSIZE)
memset (new_record[new_blocks].buffer + rest, 0, BLOCKSIZE - rest);
new_blocks++;
if (new_blocks == blocking_factor)
write_record (1);
}
void
delete_archive_members (void)
@@ -135,16 +156,17 @@ delete_archive_members (void)
/* FIXME: Should clean the routine before cleaning these variables :-( */
struct name *name;
int blocks_to_skip = 0;
int blocks_to_keep = 0;
off_t blocks_to_skip = 0;
off_t blocks_to_keep = 0;
int kept_blocks_in_record;
name_gather ();
open_archive (ACCESS_UPDATE);
acting_as_filter = strcmp (archive_name_array[0], "-") == 0;
while (logical_status == HEADER_STILL_UNREAD)
do
{
enum read_header status = read_header ();
enum read_header status = read_header (true);
switch (status)
{
@@ -152,19 +174,30 @@ delete_archive_members (void)
abort ();
case HEADER_SUCCESS:
if (name = name_scan (current_file_name), !name)
if ((name = name_scan (current_stat_info.file_name)) == NULL)
{
set_next_block_after (current_header);
if (current_header->oldgnu_header.isextended)
skip_extended_headers ();
skip_file ((long) (current_stat.st_size));
skip_member ();
break;
}
name->found = 1;
logical_status = HEADER_SUCCESS;
name->found_count++;
if (!ISFOUND(name))
{
skip_member ();
break;
}
/* Fall through. */
case HEADER_SUCCESS_EXTENDED:
logical_status = status;
break;
case HEADER_ZERO_BLOCK:
if (ignore_zeros_option)
{
set_next_block_after (current_header);
break;
}
/* Fall through. */
case HEADER_END_OF_FILE:
logical_status = HEADER_END_OF_FILE;
break;
@@ -178,6 +211,7 @@ delete_archive_members (void)
/* Fall through. */
case HEADER_SUCCESS:
case HEADER_SUCCESS_EXTENDED:
case HEADER_ZERO_BLOCK:
ERROR ((0, 0, _("Skipping to next header")));
/* Fall through. */
@@ -193,144 +227,165 @@ delete_archive_members (void)
previous_status = status;
}
while (logical_status == HEADER_STILL_UNREAD);
if (logical_status != HEADER_SUCCESS)
records_skipped = records_read - 1;
new_record = xmalloc (record_size);
if (logical_status == HEADER_SUCCESS
|| logical_status == HEADER_SUCCESS_EXTENDED)
{
write_eot ();
close_archive ();
names_notfound ();
return;
}
write_archive_to_stdout = false;
write_archive_to_stdout = 0;
new_record = (union block *) xmalloc ((size_t) record_size);
/* Save away blocks before this one in this record. */
/* Save away blocks before this one in this record. */
new_blocks = current_block - record_start;
if (new_blocks)
memcpy (new_record, record_start, new_blocks * BLOCKSIZE);
new_blocks = current_block - record_start;
blocks_needed = blocking_factor - new_blocks;
if (new_blocks)
memcpy ((void *) new_record, (void *) record_start,
(size_t) (new_blocks * BLOCKSIZE));
#if 0
/* FIXME: Old code, before the goto was inserted. To be redesigned. */
set_next_block_after (current_header);
if (current_header->oldgnu_header.isextended)
skip_extended_headers ();
skip_file ((long) (current_stat.st_size));
#endif
logical_status = HEADER_STILL_UNREAD;
goto flush_file;
/* FIXME: Solaris 2.4 Sun cc (the ANSI one, not the old K&R) says:
"delete.c", line 223: warning: loop not entered at top
Reported by Bruno Haible. */
while (1)
{
enum read_header status;
/* Fill in a record. */
if (current_block == record_end)
if (logical_status == HEADER_SUCCESS)
{
flush_archive ();
records_read++;
}
status = read_header ();
if (status == HEADER_ZERO_BLOCK && ignore_zeros_option)
{
set_next_block_after (current_header);
continue;
}
if (status == HEADER_END_OF_FILE || status == HEADER_ZERO_BLOCK)
{
logical_status = HEADER_END_OF_FILE;
memset (new_record[new_blocks].buffer, 0,
(size_t) (BLOCKSIZE * blocks_needed));
new_blocks += blocks_needed;
blocks_needed = 0;
write_record (0);
break;
/* FIXME: Pheew! This is crufty code! */
logical_status = HEADER_STILL_UNREAD;
goto flush_file;
}
if (status == HEADER_FAILURE)
/* FIXME: Solaris 2.4 Sun cc (the ANSI one, not the old K&R) says:
"delete.c", line 223: warning: loop not entered at top
Reported by Bruno Haible. */
while (1)
{
ERROR ((0, 0, _("Deleting non-header from archive")));
set_next_block_after (current_header);
continue;
}
enum read_header status;
/* Found another header. */
if (name = name_scan (current_file_name), name)
{
name->found = 1;
flush_file:
set_next_block_after (current_header);
blocks_to_skip = (current_stat.st_size + BLOCKSIZE - 1) / BLOCKSIZE;
while (record_end - current_block <= blocks_to_skip)
{
blocks_to_skip -= (record_end - current_block);
flush_archive ();
records_read++;
}
current_block += blocks_to_skip;
blocks_to_skip = 0;
continue;
}
/* Copy header. */
new_record[new_blocks] = *current_header;
new_blocks++;
blocks_needed--;
blocks_to_keep
= (current_stat.st_size + BLOCKSIZE - 1) / BLOCKSIZE;
set_next_block_after (current_header);
if (blocks_needed == 0)
write_record (1);
/* Copy data. */
kept_blocks_in_record = record_end - current_block;
if (kept_blocks_in_record > blocks_to_keep)
kept_blocks_in_record = blocks_to_keep;
while (blocks_to_keep)
{
int count;
/* Fill in a record. */
if (current_block == record_end)
flush_archive ();
status = read_header (false);
xheader_decode (&current_stat_info);
if (status == HEADER_ZERO_BLOCK && ignore_zeros_option)
{
flush_read ();
records_read++;
current_block = record_start;
kept_blocks_in_record = blocking_factor;
if (kept_blocks_in_record > blocks_to_keep)
kept_blocks_in_record = blocks_to_keep;
set_next_block_after (current_header);
continue;
}
if (status == HEADER_END_OF_FILE || status == HEADER_ZERO_BLOCK)
{
logical_status = HEADER_END_OF_FILE;
break;
}
count = kept_blocks_in_record;
if (count > blocks_needed)
count = blocks_needed;
memcpy ((void *) (new_record + new_blocks),
(void *) current_block,
(size_t) (count * BLOCKSIZE));
new_blocks += count;
blocks_needed -= count;
current_block += count;
blocks_to_keep -= count;
kept_blocks_in_record -= count;
if (status == HEADER_FAILURE)
{
ERROR ((0, 0, _("Deleting non-header from archive")));
set_next_block_after (current_header);
continue;
}
if (blocks_needed == 0)
/* Found another header. */
if ((name = name_scan (current_stat_info.file_name)) != NULL)
{
name->found_count++;
if (ISFOUND(name))
{
flush_file:
set_next_block_after (current_header);
blocks_to_skip = (current_stat_info.stat.st_size
+ BLOCKSIZE - 1) / BLOCKSIZE;
while (record_end - current_block <= blocks_to_skip)
{
blocks_to_skip -= (record_end - current_block);
flush_archive ();
}
current_block += blocks_to_skip;
blocks_to_skip = 0;
continue;
}
}
/* Copy header. */
if (current_stat_info.xhdr.size)
{
write_recent_bytes (current_stat_info.xhdr.buffer,
current_stat_info.xhdr.size);
}
else
{
write_recent_blocks (recent_long_name, recent_long_name_blocks);
write_recent_blocks (recent_long_link, recent_long_link_blocks);
}
new_record[new_blocks] = *current_header;
new_blocks++;
blocks_to_keep
= (current_stat_info.stat.st_size + BLOCKSIZE - 1) / BLOCKSIZE;
set_next_block_after (current_header);
if (new_blocks == blocking_factor)
write_record (1);
/* Copy data. */
kept_blocks_in_record = record_end - current_block;
if (kept_blocks_in_record > blocks_to_keep)
kept_blocks_in_record = blocks_to_keep;
while (blocks_to_keep)
{
int count;
if (current_block == record_end)
{
flush_read ();
current_block = record_start;
kept_blocks_in_record = blocking_factor;
if (kept_blocks_in_record > blocks_to_keep)
kept_blocks_in_record = blocks_to_keep;
}
count = kept_blocks_in_record;
if (blocking_factor - new_blocks < count)
count = blocking_factor - new_blocks;
if (! count)
abort ();
memcpy (new_record + new_blocks, current_block, count * BLOCKSIZE);
new_blocks += count;
current_block += count;
blocks_to_keep -= count;
kept_blocks_in_record -= count;
if (new_blocks == blocking_factor)
write_record (1);
}
}
if (logical_status == HEADER_END_OF_FILE)
{
/* Write the end of tape. FIXME: we can't use write_eot here,
as it gets confused when the input is at end of file. */
int total_zero_blocks = 0;
do
{
int zero_blocks = blocking_factor - new_blocks;
memset (new_record + new_blocks, 0, BLOCKSIZE * zero_blocks);
total_zero_blocks += zero_blocks;
write_record (total_zero_blocks < 2);
}
while (total_zero_blocks < 2);
}
if (! acting_as_filter && ! _isrmt (archive))
{
if (sys_truncate (archive))
truncate_warn (archive_name_array[0]);
}
}
free (new_record);
write_eot ();
close_archive ();
names_notfound ();
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,121 +0,0 @@
/* Encode long filenames for GNU tar.
Copyright 1988, 92, 94, 96, 97, 99, 2000 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any later
version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "system.h"
#include "common.h"
#include <quotearg.h>
struct mangled
{
struct mangled *next;
int type;
char mangled[NAME_FIELD_SIZE];
char *linked_to;
char normal[1];
};
/* Extract a GNUTYPE_NAMES record contents. It seems that such are
not produced anymore by GNU tar, but we leave the reading code
around nevertheless, for salvaging old tapes. */
void
extract_mangle (void)
{
off_t size = current_stat.st_size;
char *buffer = xmalloc ((size_t) (size + 1));
char *copy = buffer;
char *cursor = buffer;
if (size != (size_t) size || size == (size_t) -1)
xalloc_die ();
buffer[size] = '\0';
while (size > 0)
{
union block *block = find_next_block ();
size_t available;
if (!block)
{
ERROR ((0, 0, _("Unexpected EOF in mangled names")));
return;
}
available = available_space_after (block);
if (available > size)
available = size;
memcpy (copy, block->buffer, available);
copy += available;
size -= available;
set_next_block_after ((union block *) (block->buffer + available - 1));
}
while (*cursor)
{
char *next_cursor;
char *name;
char *name_end;
next_cursor = strchr (cursor, '\n');
*next_cursor++ = '\0';
if (!strncmp (cursor, "Rename ", 7))
{
name = cursor + 7;
name_end = strchr (name, ' ');
while (strncmp (name_end, " to ", 4))
{
name_end++;
name_end = strchr (name_end, ' ');
}
*name_end = '\0';
if (next_cursor[-2] == '/')
next_cursor[-2] = '\0';
unquote_string (name_end + 4);
if (rename (name, name_end + 4))
ERROR ((0, errno, _("%s: Cannot rename to %s"),
quotearg_colon (name), quote_n (1, name_end + 4)));
else if (verbose_option)
WARN ((0, 0, _("Renamed %s to %s"), name, name_end + 4));
}
#ifdef HAVE_SYMLINK
else if (!strncmp (cursor, "Symlink ", 8))
{
name = cursor + 8;
name_end = strchr (name, ' ');
while (strncmp (name_end, " to ", 4))
{
name_end++;
name_end = strchr (name_end, ' ');
}
*name_end = '\0';
unquote_string (name);
unquote_string (name_end + 4);
if (symlink (name, name_end + 4)
&& (unlink (name_end + 4) || symlink (name, name_end + 4)))
ERROR ((0, errno, _("%s: Cannot symlink to %s"),
quotearg_colon (name), quote_n (1, name_end + 4)));
else if (verbose_option)
WARN ((0, 0, _("Symlinked %s to %s"), name, name_end + 4));
}
#endif
else
ERROR ((0, 0, _("Unknown demangling command %s"), cursor));
cursor = next_cursor;
}
}

View File

@@ -1,9 +1,11 @@
/* Miscellaneous functions, not really specific to GNU tar.
Copyright (C) 1988, 92, 94, 95, 96, 97 Free Software Foundation, Inc.
Copyright (C) 1988, 1992, 1994, 1995, 1996, 1997, 1999, 2000, 2001,
2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any later
Free Software Foundation; either version 3, or (at your option) any later
version.
This program is distributed in the hope that it will be useful, but
@@ -13,119 +15,81 @@
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
59 Place - Suite 330, Boston, MA 02111-1307, USA. */
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
#include "system.h"
#include "backupfile.h"
#include "rmt.h"
/* The following inclusion for crosschecking prototypes, only. */
#include <system.h>
#include <rmt.h>
#include "common.h"
#include <quotearg.h>
#include <save-cwd.h>
#include <xgetcwd.h>
#include <unlinkdir.h>
#include <utimens.h>
#if HAVE_STROPTS_H
# include <stropts.h>
#endif
#if HAVE_SYS_FILIO_H
# include <sys/filio.h>
#endif
/* Handling strings. */
#define ISPRINT(Char) (ISASCII (Char) && isprint (Char))
/*-------------------------------------------------------------------------.
| Assign STRING to a copy of VALUE if not NULL, or to NULL. If STRING was |
| not NULL, it is freed first. |
`-------------------------------------------------------------------------*/
/* Assign STRING to a copy of VALUE if not zero, or to zero. If
STRING was nonzero, it is freed first. */
void
assign_string (char **string, const char *value)
{
if (*string)
free (*string);
*string = value ? xstrdup (value) : NULL;
*string = value ? xstrdup (value) : 0;
}
/*------------------------------------------------------------------------.
| Allocate a copy of the string quoted as in C, and returns that. If the |
| string does not have to be quoted, it returns the NULL string. The |
| allocated copy should normally be freed with free() after the caller is |
| done with it. |
| |
| This is used in two contexts only: either listing a tar file for the |
| --list (-t) option, or generating the directory file in incremental |
| dumps. |
`------------------------------------------------------------------------*/
/* Allocate a copy of the string quoted as in C, and returns that. If
the string does not have to be quoted, it returns a null pointer.
The allocated copy should normally be freed with free() after the
caller is done with it.
This is used in one context only: generating the directory file in
incremental dumps. The quoted string is not intended for human
consumption; it is intended only for unquote_string. The quoting
is locale-independent, so that users needn't worry about locale
when reading directory files. This means that we can't use
quotearg, as quotearg is locale-dependent and is meant for human
consumption. */
char *
quote_copy_string (const char *string)
{
const char *source = string;
char *destination = NULL;
char *buffer = NULL;
char *destination = 0;
char *buffer = 0;
int copying = 0;
while (*source)
{
int character = (unsigned char) *source++;
int character = *source++;
if (character == '\\')
switch (character)
{
case '\n': case '\\':
if (!copying)
{
int length = (source - string) - 1;
size_t length = (source - string) - 1;
copying = 1;
buffer = (char *) xmalloc (length + 5 + strlen (source) * 4);
memcpy (buffer, string, (size_t) length);
buffer = xmalloc (length + 2 + 2 * strlen (source) + 1);
memcpy (buffer, string, length);
destination = buffer + length;
}
*destination++ = '\\';
*destination++ = '\\';
}
else if (ISPRINT (character))
{
*destination++ = character == '\\' ? '\\' : 'n';
break;
default:
if (copying)
*destination++ = character;
}
else
{
if (!copying)
{
int length = (source - string) - 1;
copying = 1;
buffer = (char *) xmalloc (length + 5 + strlen (source) * 4);
memcpy (buffer, string, (size_t) length);
destination = buffer + length;
}
*destination++ = '\\';
switch (character)
{
case '\n':
*destination++ = 'n';
break;
case '\t':
*destination++ = 't';
break;
case '\f':
*destination++ = 'f';
break;
case '\b':
*destination++ = 'b';
break;
case '\r':
*destination++ = 'r';
break;
case '\177':
*destination++ = '?';
break;
default:
*destination++ = (character >> 6) + '0';
*destination++ = ((character >> 3) & 07) + '0';
*destination++ = (character & 07) + '0';
break;
}
break;
}
}
if (copying)
@@ -133,21 +97,19 @@ quote_copy_string (const char *string)
*destination = '\0';
return buffer;
}
return NULL;
return 0;
}
/*-------------------------------------------------------------------------.
| Takes a quoted C string (like those produced by quote_copy_string) and |
| turns it back into the un-quoted original. This is done in place. |
| Returns 0 only if the string was not properly quoted, but completes the |
| unquoting anyway. |
| |
| This is used for reading the saved directory file in incremental dumps. |
| It is used for decoding old `N' records (demangling names). But also, |
| it is used for decoding file arguments, would they come from the shell |
| or a -T file, and for decoding the --exclude argument. |
`-------------------------------------------------------------------------*/
/* Takes a quoted C string (like those produced by quote_copy_string)
and turns it back into the un-quoted original. This is done in
place. Returns 0 only if the string was not properly quoted, but
completes the unquoting anyway.
This is used for reading the saved directory file in incremental
dumps. It is used for decoding old `N' records (demangling names).
But also, it is used for decoding file arguments, would they come
from the shell or a -T file, and for decoding the --exclude
argument. */
int
unquote_string (char *string)
{
@@ -155,6 +117,11 @@ unquote_string (char *string)
char *source = string;
char *destination = string;
/* Escape sequences other than \\ and \n are no longer generated by
quote_copy_string, but accept them for backwards compatibility,
and also because unquote_string is used for purposes other than
parsing the output of quote_copy_string. */
while (*source)
if (*source == '\\')
switch (*++source)
@@ -164,18 +131,8 @@ unquote_string (char *string)
source++;
break;
case 'n':
*destination++ = '\n';
source++;
break;
case 't':
*destination++ = '\t';
source++;
break;
case 'f':
*destination++ = '\f';
case 'a':
*destination++ = '\a';
source++;
break;
@@ -184,11 +141,31 @@ unquote_string (char *string)
source++;
break;
case 'f':
*destination++ = '\f';
source++;
break;
case 'n':
*destination++ = '\n';
source++;
break;
case 'r':
*destination++ = '\r';
source++;
break;
case 't':
*destination++ = '\t';
source++;
break;
case 'v':
*destination++ = '\v';
source++;
break;
case '?':
*destination++ = 0177;
source++;
@@ -238,244 +215,534 @@ unquote_string (char *string)
return result;
}
/* Sorting lists. */
/* Handling numbers. */
/*---.
| ? |
`---*/
/* Output fraction and trailing digits appropriate for a nanoseconds
count equal to NS, but don't output unnecessary '.' or trailing
zeros. */
char *
merge_sort (char *list, int length, int offset, int (*compare) (char *, char *))
void
code_ns_fraction (int ns, char *p)
{
char *first_list;
char *second_list;
int first_length;
int second_length;
char *result;
char **merge_point;
char *cursor;
int counter;
#define SUCCESSOR(Pointer) \
(*((char **) (((char *) (Pointer)) + offset)))
if (length == 1)
return list;
if (length == 2)
if (ns == 0)
*p = '\0';
else
{
if ((*compare) (list, SUCCESSOR (list)) > 0)
int i = 9;
*p++ = '.';
while (ns % 10 == 0)
{
result = SUCCESSOR (list);
SUCCESSOR (result) = list;
SUCCESSOR (list) = NULL;
return result;
ns /= 10;
i--;
}
return list;
p[i] = '\0';
for (;;)
{
p[--i] = '0' + ns % 10;
if (i == 0)
break;
ns /= 10;
}
}
}
char const *
code_timespec (struct timespec t, char sbuf[TIMESPEC_STRSIZE_BOUND])
{
time_t s = t.tv_sec;
int ns = t.tv_nsec;
char *np;
bool negative = s < 0;
if (negative && ns != 0)
{
s++;
ns = BILLION - ns;
}
first_list = list;
first_length = (length + 1) / 2;
second_length = length / 2;
for (cursor = list, counter = first_length - 1;
counter;
cursor = SUCCESSOR (cursor), counter--)
continue;
second_list = SUCCESSOR (cursor);
SUCCESSOR (cursor) = NULL;
first_list = merge_sort (first_list, first_length, offset, compare);
second_list = merge_sort (second_list, second_length, offset, compare);
merge_point = &result;
while (first_list && second_list)
if ((*compare) (first_list, second_list) < 0)
{
cursor = SUCCESSOR (first_list);
*merge_point = first_list;
merge_point = &SUCCESSOR (first_list);
first_list = cursor;
}
else
{
cursor = SUCCESSOR (second_list);
*merge_point = second_list;
merge_point = &SUCCESSOR (second_list);
second_list = cursor;
}
if (first_list)
*merge_point = first_list;
else
*merge_point = second_list;
return result;
#undef SUCCESSOR
np = umaxtostr (negative ? - (uintmax_t) s : (uintmax_t) s, sbuf + 1);
if (negative)
*--np = '-';
code_ns_fraction (ns, sbuf + UINTMAX_STRSIZE_BOUND);
return np;
}
/* File handling. */
/* Saved names in case backup needs to be undone. */
static char *before_backup_name = NULL;
static char *after_backup_name = NULL;
static char *before_backup_name;
static char *after_backup_name;
/*------------------------------------------------------------------------.
| Returns nonzero if p is `.' or `..'. This could be a macro for speed. |
`------------------------------------------------------------------------*/
/* Early Solaris 2.4 readdir may return d->d_name as `' in NFS-mounted
directories. The workaround here skips `' just like `.'. Without it,
GNU tar would then treat `' much like `.' and loop endlessly. */
int
is_dot_or_dotdot (const char *p)
/* Return 1 if FILE_NAME is obviously "." or "/". */
static bool
must_be_dot_or_slash (char const *file_name)
{
return (p[0] == '\0'
|| (p[0] == '.' && (p[1] == '\0'
|| (p[1] == '.' && p[2] == '\0'))));
file_name += FILE_SYSTEM_PREFIX_LEN (file_name);
if (ISSLASH (file_name[0]))
{
for (;;)
if (ISSLASH (file_name[1]))
file_name++;
else if (file_name[1] == '.'
&& ISSLASH (file_name[2 + (file_name[2] == '.')]))
file_name += 2 + (file_name[2] == '.');
else
return ! file_name[1];
}
else
{
while (file_name[0] == '.' && ISSLASH (file_name[1]))
{
file_name += 2;
while (ISSLASH (*file_name))
file_name++;
}
return ! file_name[0] || (file_name[0] == '.' && ! file_name[1]);
}
}
/*-------------------------------------------------------------------------.
| Delete PATH, whatever it might be. If RECURSE, first recursively delete |
| the contents of PATH when it is a directory. Return zero on any error, |
| with errno set. As a special case, if we fail to delete a directory |
| when not RECURSE, do not set errno (just be tolerant to this error). |
`-------------------------------------------------------------------------*/
int
remove_any_file (const char *path, int recurse)
/* Some implementations of rmdir let you remove '.' or '/'.
Report an error with errno set to zero for obvious cases of this;
otherwise call rmdir. */
static int
safer_rmdir (const char *file_name)
{
struct stat stat_buffer;
if (must_be_dot_or_slash (file_name))
{
errno = 0;
return -1;
}
if (lstat (path, &stat_buffer) < 0)
return 0;
return rmdir (file_name);
}
if (S_ISDIR (stat_buffer.st_mode))
if (recurse)
{
DIR *dirp = opendir (path);
struct dirent *dp;
/* Remove FILE_NAME, returning 1 on success. If FILE_NAME is a directory,
then if OPTION is RECURSIVE_REMOVE_OPTION is set remove FILE_NAME
recursively; otherwise, remove it only if it is empty. If FILE_NAME is
a directory that cannot be removed (e.g., because it is nonempty)
and if OPTION is WANT_DIRECTORY_REMOVE_OPTION, then return -1.
Return 0 on error, with errno set; if FILE_NAME is obviously the working
directory return zero with errno set to zero. */
int
remove_any_file (const char *file_name, enum remove_option option)
{
/* Try unlink first if we cannot unlink directories, as this saves
us a system call in the common case where we're removing a
non-directory. */
bool try_unlink_first = cannot_unlink_dir ();
if (dirp == NULL)
return 0;
if (try_unlink_first)
{
if (unlink (file_name) == 0)
return 1;
while (dp = readdir (dirp), dp && !is_dot_or_dotdot (dp->d_name))
{
char *path_buffer = new_name (path, dp->d_name);
if (!remove_any_file (path_buffer, 1))
{
int saved_errno = errno;
free (path_buffer);
closedir (dirp);
errno = saved_errno; /* FIXME: errno should be read-only */
return 0;
}
free (path_buffer);
}
closedir (dirp);
return rmdir (path) >= 0;
}
else
{
/* FIXME: Saving errno might not be needed anymore, now that
extract_archive tests for the special case before recovery. */
int saved_errno = errno;
if (rmdir (path) >= 0)
return 1;
errno = saved_errno; /* FIXME: errno should be read-only */
/* POSIX 1003.1-2001 requires EPERM when attempting to unlink a
directory without appropriate privileges, but many Linux
kernels return the more-sensible EISDIR. */
if (errno != EPERM && errno != EISDIR)
return 0;
}
}
return unlink (path) >= 0;
if (safer_rmdir (file_name) == 0)
return 1;
switch (errno)
{
case ENOTDIR:
return !try_unlink_first && unlink (file_name) == 0;
case 0:
case EEXIST:
#if defined ENOTEMPTY && ENOTEMPTY != EEXIST
case ENOTEMPTY:
#endif
switch (option)
{
case ORDINARY_REMOVE_OPTION:
break;
case WANT_DIRECTORY_REMOVE_OPTION:
return -1;
case RECURSIVE_REMOVE_OPTION:
{
char *directory = savedir (file_name);
char const *entry;
size_t entrylen;
if (! directory)
return 0;
for (entry = directory;
(entrylen = strlen (entry)) != 0;
entry += entrylen + 1)
{
char *file_name_buffer = new_name (file_name, entry);
int r = remove_any_file (file_name_buffer,
RECURSIVE_REMOVE_OPTION);
int e = errno;
free (file_name_buffer);
if (! r)
{
free (directory);
errno = e;
return 0;
}
}
free (directory);
return safer_rmdir (file_name) == 0;
}
}
break;
}
return 0;
}
/*-------------------------------------------------------------------------.
| Check if PATH already exists and make a backup of it right now. Return |
| success (nonzero) only if the backup in either unneeded, or successful. |
| |
| For now, directories are considered to never need backup. If ARCHIVE is |
| nonzero, this is the archive and so, we do not have to backup block or |
| character devices, nor remote entities. |
`-------------------------------------------------------------------------*/
int
maybe_backup_file (const char *path, int archive)
/* Check if FILE_NAME already exists and make a backup of it right now.
Return success (nonzero) only if the backup is either unneeded, or
successful. For now, directories are considered to never need
backup. If THIS_IS_THE_ARCHIVE is nonzero, this is the archive and
so, we do not have to backup block or character devices, nor remote
entities. */
bool
maybe_backup_file (const char *file_name, bool this_is_the_archive)
{
struct stat file_stat;
/* Check if we really need to backup the file. */
if (archive && _remdev (path))
return 1;
if (this_is_the_archive && _remdev (file_name))
return true;
if (stat (path, &file_stat))
if (stat (file_name, &file_stat))
{
if (errno == ENOENT)
return 1;
return true;
ERROR ((0, errno, "%s", path));
return 0;
stat_error (file_name);
return false;
}
if (S_ISDIR (file_stat.st_mode))
return 1;
return true;
#ifdef S_ISBLK
if (archive && S_ISBLK (file_stat.st_mode))
return 1;
#endif
if (this_is_the_archive
&& (S_ISBLK (file_stat.st_mode) || S_ISCHR (file_stat.st_mode)))
return true;
#ifdef S_ISCHR
if (archive && S_ISCHR (file_stat.st_mode))
return 1;
#endif
assign_string (&before_backup_name, path);
assign_string (&before_backup_name, file_name);
/* A run situation may exist between Emacs or other GNU programs trying to
make a backup for the same file simultaneously. If theoretically
possible, real problems are unlikely. Doing any better would require a
convention, GNU-wide, for all programs doing backups. */
assign_string (&after_backup_name, NULL);
after_backup_name = find_backup_file_name (path);
if (after_backup_name == NULL)
FATAL_ERROR ((0, 0, "Virtual memory exhausted"));
assign_string (&after_backup_name, 0);
after_backup_name = find_backup_file_name (file_name, backup_type);
if (! after_backup_name)
xalloc_die ();
if (rename (before_backup_name, after_backup_name) == 0)
{
if (verbose_option)
fprintf (stdlis, _("Renaming previous `%s' to `%s'\n"),
before_backup_name, after_backup_name);
return 1;
fprintf (stdlis, _("Renaming %s to %s\n"),
quote_n (0, before_backup_name),
quote_n (1, after_backup_name));
return true;
}
else
{
/* The backup operation failed. */
int e = errno;
ERROR ((0, e, _("%s: Cannot rename to %s"),
quotearg_colon (before_backup_name),
quote_n (1, after_backup_name)));
assign_string (&after_backup_name, 0);
return false;
}
/* The backup operation failed. */
ERROR ((0, errno, _("%s: Cannot rename for backup"), before_backup_name));
assign_string (&after_backup_name, NULL);
return 0;
}
/*-----------------------------------------------------------------------.
| Try to restore the recently backed up file to its original name. This |
| is usually only needed after a failed extraction. |
`-----------------------------------------------------------------------*/
/* Try to restore the recently backed up file to its original name.
This is usually only needed after a failed extraction. */
void
undo_last_backup (void)
{
if (after_backup_name)
{
if (rename (after_backup_name, before_backup_name) != 0)
ERROR ((0, errno, _("%s: Cannot rename from backup"),
before_backup_name));
{
int e = errno;
ERROR ((0, e, _("%s: Cannot rename to %s"),
quotearg_colon (after_backup_name),
quote_n (1, before_backup_name)));
}
if (verbose_option)
fprintf (stdlis, _("Renaming `%s' back to `%s'\n"),
after_backup_name, before_backup_name);
assign_string (&after_backup_name, NULL);
fprintf (stdlis, _("Renaming %s back to %s\n"),
quote_n (0, after_backup_name),
quote_n (1, before_backup_name));
assign_string (&after_backup_name, 0);
}
}
/* Depending on DEREF, apply either stat or lstat to (NAME, BUF). */
int
deref_stat (bool deref, char const *name, struct stat *buf)
{
return deref ? stat (name, buf) : lstat (name, buf);
}
/* Set FD's (i.e., FILE's) access time to TIMESPEC[0]. If that's not
possible to do by itself, set its access and data modification
times to TIMESPEC[0] and TIMESPEC[1], respectively. */
int
set_file_atime (int fd, char const *file, struct timespec const timespec[2])
{
#ifdef _FIOSATIME
if (0 <= fd)
{
struct timeval timeval;
timeval.tv_sec = timespec[0].tv_sec;
timeval.tv_usec = timespec[0].tv_nsec / 1000;
if (ioctl (fd, _FIOSATIME, &timeval) == 0)
return 0;
}
#endif
return gl_futimens (fd, file, timespec);
}
/* A description of a working directory. */
struct wd
{
char const *name;
int saved;
struct saved_cwd saved_cwd;
};
/* A vector of chdir targets. wd[0] is the initial working directory. */
static struct wd *wd;
/* The number of working directories in the vector. */
static size_t wds;
/* The allocated size of the vector. */
static size_t wd_alloc;
/* DIR is the operand of a -C option; add it to vector of chdir targets,
and return the index of its location. */
int
chdir_arg (char const *dir)
{
if (wds == wd_alloc)
{
if (wd_alloc == 0)
{
wd_alloc = 2;
wd = xmalloc (sizeof *wd * wd_alloc);
}
else
wd = x2nrealloc (wd, &wd_alloc, sizeof *wd);
if (! wds)
{
wd[wds].name = ".";
wd[wds].saved = 0;
wds++;
}
}
/* Optimize the common special case of the working directory,
or the working directory as a prefix. */
if (dir[0])
{
while (dir[0] == '.' && ISSLASH (dir[1]))
for (dir += 2; ISSLASH (*dir); dir++)
continue;
if (! dir[dir[0] == '.'])
return wds - 1;
}
wd[wds].name = dir;
wd[wds].saved = 0;
return wds++;
}
/* Change to directory I. If I is 0, change to the initial working
directory; otherwise, I must be a value returned by chdir_arg. */
void
chdir_do (int i)
{
static int previous;
if (previous != i)
{
struct wd *prev = &wd[previous];
struct wd *curr = &wd[i];
if (! prev->saved)
{
int err = 0;
prev->saved = 1;
if (save_cwd (&prev->saved_cwd) != 0)
err = errno;
else if (0 <= prev->saved_cwd.desc)
{
/* Make sure we still have at least one descriptor available. */
int fd1 = prev->saved_cwd.desc;
int fd2 = dup (fd1);
if (0 <= fd2)
close (fd2);
else if (errno == EMFILE)
{
/* Force restore_cwd to use chdir_long. */
close (fd1);
prev->saved_cwd.desc = -1;
prev->saved_cwd.name = xgetcwd ();
}
else
err = errno;
}
if (err)
FATAL_ERROR ((0, err, _("Cannot save working directory")));
}
if (curr->saved)
{
if (restore_cwd (&curr->saved_cwd))
FATAL_ERROR ((0, 0, _("Cannot change working directory")));
}
else
{
if (i && ! ISSLASH (curr->name[0]))
chdir_do (i - 1);
if (chdir (curr->name) != 0)
chdir_fatal (curr->name);
}
previous = i;
}
}
void
close_diag (char const *name)
{
if (ignore_failed_read_option)
close_warn (name);
else
close_error (name);
}
void
open_diag (char const *name)
{
if (ignore_failed_read_option)
open_warn (name);
else
open_error (name);
}
void
read_diag_details (char const *name, off_t offset, size_t size)
{
if (ignore_failed_read_option)
read_warn_details (name, offset, size);
else
read_error_details (name, offset, size);
}
void
readlink_diag (char const *name)
{
if (ignore_failed_read_option)
readlink_warn (name);
else
readlink_error (name);
}
void
savedir_diag (char const *name)
{
if (ignore_failed_read_option)
savedir_warn (name);
else
savedir_error (name);
}
void
seek_diag_details (char const *name, off_t offset)
{
if (ignore_failed_read_option)
seek_warn_details (name, offset);
else
seek_error_details (name, offset);
}
void
stat_diag (char const *name)
{
if (ignore_failed_read_option)
stat_warn (name);
else
stat_error (name);
}
void
write_fatal_details (char const *name, ssize_t status, size_t size)
{
write_error_details (name, status, size);
fatal_exit ();
}
/* Fork, aborting if unsuccessful. */
pid_t
xfork (void)
{
pid_t p = fork ();
if (p == (pid_t) -1)
call_arg_fatal ("fork", _("child process"));
return p;
}
/* Create a pipe, aborting if unsuccessful. */
void
xpipe (int fd[2])
{
if (pipe (fd) < 0)
call_arg_fatal ("pipe", _("interprocess channel"));
}
/* Return PTR, aligned upward to the next multiple of ALIGNMENT.
ALIGNMENT must be nonzero. The caller must arrange for ((char *)
PTR) through ((char *) PTR + ALIGNMENT - 1) to be addressable
locations. */
static inline void *
ptr_align (void *ptr, size_t alignment)
{
char *p0 = ptr;
char *p1 = p0 + alignment - 1;
return p1 - (size_t) p1 % alignment;
}
/* Return the address of a page-aligned buffer of at least SIZE bytes.
The caller should free *PTR when done with the buffer. */
void *
page_aligned_alloc (void **ptr, size_t size)
{
size_t alignment = getpagesize ();
size_t size1 = size + alignment;
if (size1 < size)
xalloc_die ();
*ptr = xmalloc (size1);
return ptr_align (*ptr, alignment);
}

File diff suppressed because it is too large Load Diff

578
src/rmt.c
View File

@@ -1,578 +0,0 @@
/* Remote connection server.
Copyright (C) 1994, 1995, 1996, 1997, 1999, 2000, 2001 Free Software
Foundation, Inc.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any later
version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/* Copyright (C) 1983 Regents of the University of California.
All rights reserved.
Redistribution and use in source and binary forms are permitted provided
that the above copyright notice and this paragraph are duplicated in all
such forms and that any documentation, advertising materials, and other
materials related to such distribution and use acknowledge that the
software was developed by the University of California, Berkeley. The
name of the University may not be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */
#include "system.h"
#include <copysym.h>
#include <localedir.h>
#include <safe-read.h>
#include <full-write.h>
#include <getopt.h>
#include <sys/socket.h>
#ifndef EXIT_FAILURE
# define EXIT_FAILURE 1
#endif
#ifndef EXIT_SUCCESS
# define EXIT_SUCCESS 0
#endif
/* Maximum size of a string from the requesting program. */
#define STRING_SIZE 64
/* Name of executing program. */
const char *program_name;
/* File descriptor of the tape device, or negative if none open. */
static int tape = -1;
/* Buffer containing transferred data, and its allocated size. */
static char *record_buffer;
static size_t allocated_size;
/* Buffer for constructing the reply. */
static char reply_buffer[BUFSIZ];
/* Debugging tools. */
static FILE *debug_file;
#define DEBUG(File) \
if (debug_file) fprintf(debug_file, File)
#define DEBUG1(File, Arg) \
if (debug_file) fprintf(debug_file, File, Arg)
#define DEBUG2(File, Arg1, Arg2) \
if (debug_file) fprintf(debug_file, File, Arg1, Arg2)
/* Return an error string, given an error number. */
#if HAVE_STRERROR
# ifndef strerror
char *strerror ();
# endif
#else
static char *
private_strerror (int errnum)
{
extern char *sys_errlist[];
extern int sys_nerr;
if (errnum > 0 && errnum <= sys_nerr)
return _(sys_errlist[errnum]);
return _("Unknown system error");
}
# define strerror private_strerror
#endif
static void
report_error_message (const char *string)
{
DEBUG1 ("rmtd: E 0 (%s)\n", string);
sprintf (reply_buffer, "E0\n%s\n", string);
full_write (STDOUT_FILENO, reply_buffer, strlen (reply_buffer));
}
static void
report_numbered_error (int num)
{
DEBUG2 ("rmtd: E %d (%s)\n", num, strerror (num));
sprintf (reply_buffer, "E%d\n%s\n", num, strerror (num));
full_write (STDOUT_FILENO, reply_buffer, strlen (reply_buffer));
}
static void
get_string (char *string)
{
int counter;
for (counter = 0; counter < STRING_SIZE; counter++)
{
if (safe_read (STDIN_FILENO, string + counter, 1) != 1)
exit (EXIT_SUCCESS);
if (string[counter] == '\n')
break;
}
string[counter] = '\0';
}
static void
prepare_record_buffer (size_t size)
{
if (size <= allocated_size)
return;
if (record_buffer)
free (record_buffer);
record_buffer = malloc (size);
if (! record_buffer)
{
DEBUG (_("rmtd: Cannot allocate buffer space\n"));
report_error_message (N_("Cannot allocate buffer space"));
exit (EXIT_FAILURE); /* exit status used to be 4 */
}
allocated_size = size;
#ifdef SO_RCVBUF
while (size > 1024 &&
(setsockopt (STDIN_FILENO, SOL_SOCKET, SO_RCVBUF,
(char *) &size, sizeof size)
< 0))
size -= 1024;
#else
/* FIXME: I do not see any purpose to the following line... Sigh! */
size = 1 + ((size - 1) % 1024);
#endif
}
/* Decode OFLAG_STRING, which represents the 2nd argument to `open'.
OFLAG_STRING should contain an optional integer, followed by an optional
symbolic representation of an open flag using only '|' to separate its
components (e.g. "O_WRONLY|O_CREAT|O_TRUNC"). Prefer the symbolic
representation if available, falling back on the numeric
representation, or to zero if both formats are absent.
This function should be the inverse of encode_oflag. The numeric
representation is not portable from one host to another, but it is
for backward compatibility with old-fashioned clients that do not
emit symbolic open flags. */
static int
decode_oflag (char const *oflag_string)
{
char *oflag_num_end;
int numeric_oflag = strtol (oflag_string, &oflag_num_end, 10);
int symbolic_oflag = 0;
oflag_string = oflag_num_end;
while (ISSPACE ((unsigned char) *oflag_string))
oflag_string++;
do
{
struct name_value_pair { char const *name; int value; };
static struct name_value_pair const table[] =
{
#ifdef O_APPEND
{"APPEND", O_APPEND},
#endif
{"CREAT", O_CREAT},
#ifdef O_DSYNC
{"DSYNC", O_DSYNC},
#endif
{"EXCL", O_EXCL},
#ifdef O_LARGEFILE
{"LARGEFILE", O_LARGEFILE}, /* LFS extension for opening large files */
#endif
#ifdef O_NOCTTY
{"NOCTTY", O_NOCTTY},
#endif
#ifdef O_NONBLOCK
{"NONBLOCK", O_NONBLOCK},
#endif
{"RDONLY", O_RDONLY},
{"RDWR", O_RDWR},
#ifdef O_RSYNC
{"RSYNC", O_RSYNC},
#endif
#ifdef O_SYNC
{"SYNC", O_SYNC},
#endif
{"TRUNC", O_TRUNC},
{"WRONLY", O_WRONLY}
};
struct name_value_pair const *t;
size_t s;
if (*oflag_string++ != 'O' || *oflag_string++ != '_')
return numeric_oflag;
for (t = table;
(strncmp (oflag_string, t->name, s = strlen (t->name)) != 0
|| (oflag_string[s]
&& strchr ("ABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789",
oflag_string[s])));
t++)
if (t == table + sizeof table / sizeof *table - 1)
return numeric_oflag;
symbolic_oflag |= t->value;
oflag_string += s;
}
while (*oflag_string++ == '|');
return symbolic_oflag;
}
static struct option const long_opts[] =
{
{"help", no_argument, 0, 'h'},
{"version", no_argument, 0, 'v'},
{0, 0, 0, 0}
};
static void
usage (int status)
{
if (status != EXIT_SUCCESS)
fprintf (stderr, _("Try `%s --help' for more information.\n"),
program_name);
else
{
printf (_("\
Usage: %s [OPTION]\n\
Manipulate a tape drive, accepting commands from a remote process.\n\
\n\
--version Output version info.\n\
--help Output this help.\n"),
program_name);
fputs (_("\nReport bugs to <bug-tar@gnu.org>.\n"), stdout);
}
exit (status);
}
int
main (int argc, char *const *argv)
{
char command;
ssize_t status;
/* FIXME: Localization is meaningless, unless --help and --version are
locally used. Localization would be best accomplished by the calling
tar, on messages found within error packets. */
program_name = argv[0];
setlocale (LC_ALL, "");
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain (PACKAGE);
switch (getopt_long (argc, argv, "", long_opts, NULL))
{
default:
usage (EXIT_FAILURE);
case 'h':
usage (EXIT_SUCCESS);
case 'v':
{
char buf[MB_LEN_MAX + 1];
printf ("rmt (GNU %s) %s\n", PACKAGE, VERSION);
printf ("Copyright %s 2001 Free Software Foundation, Inc.\n",
copyright_symbol (buf, sizeof buf));
puts (_("\
This program comes with NO WARRANTY, to the extent permitted by law.\n\
You may redistribute it under the terms of the GNU General Public License;\n\
see the file named COPYING for details."));
}
return EXIT_SUCCESS;
case -1:
break;
}
if (optind < argc)
{
if (optind != argc - 1)
usage (EXIT_FAILURE);
debug_file = fopen (argv[optind], "w");
if (debug_file == 0)
{
report_numbered_error (errno);
exit (EXIT_FAILURE);
}
setbuf (debug_file, 0);
}
top:
errno = 0;
status = 0;
if (safe_read (STDIN_FILENO, &command, 1) != 1)
return EXIT_SUCCESS;
switch (command)
{
/* FIXME: Maybe 'H' and 'V' for --help and --version output? */
case 'O':
{
char device_string[STRING_SIZE];
char oflag_string[STRING_SIZE];
get_string (device_string);
get_string (oflag_string);
DEBUG2 ("rmtd: O %s %s\n", device_string, oflag_string);
if (tape >= 0)
close (tape);
tape = open (device_string, decode_oflag (oflag_string), MODE_RW);
if (tape < 0)
goto ioerror;
goto respond;
}
case 'C':
{
char device_string[STRING_SIZE];
get_string (device_string); /* discard */
DEBUG ("rmtd: C\n");
if (close (tape) < 0)
goto ioerror;
tape = -1;
goto respond;
}
case 'L':
{
char count_string[STRING_SIZE];
char position_string[STRING_SIZE];
off_t count = 0;
int negative;
int whence;
char *p;
get_string (count_string);
get_string (position_string);
DEBUG2 ("rmtd: L %s %s\n", count_string, position_string);
/* Parse count_string, taking care to check for overflow.
We can't use standard functions,
since off_t might be longer than long. */
for (p = count_string; *p == ' ' || *p == '\t'; p++)
continue;
negative = *p == '-';
p += negative || *p == '+';
for (;;)
{
int digit = *p++ - '0';
if (9 < (unsigned) digit)
break;
else
{
off_t c10 = 10 * count;
off_t nc = negative ? c10 - digit : c10 + digit;
if (c10 / 10 != count || (negative ? c10 < nc : nc < c10))
{
report_error_message (N_("Seek offset out of range"));
exit (EXIT_FAILURE);
}
count = nc;
}
}
switch (atoi (position_string))
{
case 0: whence = SEEK_SET; break;
case 1: whence = SEEK_CUR; break;
case 2: whence = SEEK_END; break;
default:
report_error_message (N_("Seek direction out of range"));
exit (EXIT_FAILURE);
}
count = lseek (tape, count, whence);
if (count < 0)
goto ioerror;
/* Convert count back to string for reply.
We can't use sprintf, since off_t might be longer than long. */
p = count_string + sizeof count_string;
*--p = '\0';
do
*--p = '0' + (int) (count % 10);
while ((count /= 10) != 0);
DEBUG1 ("rmtd: A %s\n", p);
sprintf (reply_buffer, "A%s\n", p);
full_write (STDOUT_FILENO, reply_buffer, strlen (reply_buffer));
goto top;
}
case 'W':
{
char count_string[STRING_SIZE];
size_t size;
size_t counter;
get_string (count_string);
size = atol (count_string);
DEBUG1 ("rmtd: W %s\n", count_string);
prepare_record_buffer (size);
for (counter = 0; counter < size; counter += status)
{
status = safe_read (STDIN_FILENO, &record_buffer[counter],
size - counter);
if (status <= 0)
{
DEBUG (_("rmtd: Premature eof\n"));
report_error_message (N_("Premature end of file"));
exit (EXIT_FAILURE); /* exit status used to be 2 */
}
}
status = full_write (tape, record_buffer, size);
if (status < 0)
goto ioerror;
goto respond;
}
case 'R':
{
char count_string[STRING_SIZE];
size_t size;
get_string (count_string);
DEBUG1 ("rmtd: R %s\n", count_string);
size = atol (count_string);
prepare_record_buffer (size);
status = safe_read (tape, record_buffer, size);
if (status < 0)
goto ioerror;
sprintf (reply_buffer, "A%ld\n", (long) status);
full_write (STDOUT_FILENO, reply_buffer, strlen (reply_buffer));
full_write (STDOUT_FILENO, record_buffer, status);
goto top;
}
case 'I':
{
char operation_string[STRING_SIZE];
char count_string[STRING_SIZE];
get_string (operation_string);
get_string (count_string);
DEBUG2 ("rmtd: I %s %s\n", operation_string, count_string);
#ifdef MTIOCTOP
{
struct mtop mtop;
const char *p;
off_t count = 0;
int negative;
/* Parse count_string, taking care to check for overflow.
We can't use standard functions,
since off_t might be longer than long. */
for (p = count_string; *p == ' ' || *p == '\t'; p++)
continue;
negative = *p == '-';
p += negative || *p == '+';
for (;;)
{
int digit = *p++ - '0';
if (9 < (unsigned) digit)
break;
else
{
off_t c10 = 10 * count;
off_t nc = negative ? c10 - digit : c10 + digit;
if (c10 / 10 != count || (negative ? c10 < nc : nc < c10))
{
report_error_message (N_("Seek offset out of range"));
exit (EXIT_FAILURE);
}
count = nc;
}
}
mtop.mt_count = count;
if (mtop.mt_count != count)
{
report_error_message (N_("Seek offset out of range"));
exit (EXIT_FAILURE);
}
mtop.mt_op = atoi (operation_string);
if (ioctl (tape, MTIOCTOP, (char *) &mtop) < 0)
goto ioerror;
}
#endif
goto respond;
}
case 'S': /* status */
{
DEBUG ("rmtd: S\n");
#ifdef MTIOCGET
{
struct mtget operation;
if (ioctl (tape, MTIOCGET, (char *) &operation) < 0)
goto ioerror;
status = sizeof operation;
sprintf (reply_buffer, "A%ld\n", (long) status);
full_write (STDOUT_FILENO, reply_buffer, strlen (reply_buffer));
full_write (STDOUT_FILENO, (char *) &operation, sizeof operation);
}
#endif
goto top;
}
default:
DEBUG1 (_("rmtd: Garbage command %c\n"), command);
report_error_message (N_("Garbage command"));
exit (EXIT_FAILURE); /* exit status used to be 3 */
}
respond:
DEBUG1 ("rmtd: A %ld\n", (long) status);
sprintf (reply_buffer, "A%ld\n", (long) status);
full_write (STDOUT_FILENO, reply_buffer, strlen (reply_buffer));
goto top;
ioerror:
report_numbered_error (errno);
goto top;
}

View File

@@ -1,93 +0,0 @@
/* Definitions for communicating with a remote tape drive.
Copyright 1988, 1992, 1996, 1997, 2001 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
extern char *rmt_path__;
int rmt_open__ PARAMS ((const char *, int, int, const char *));
int rmt_close__ PARAMS ((int));
ssize_t rmt_read__ PARAMS ((int, char *, size_t));
ssize_t rmt_write__ PARAMS ((int, char *, size_t));
off_t rmt_lseek__ PARAMS ((int, off_t, int));
int rmt_ioctl__ PARAMS ((int, int, char *));
/* A filename is remote if it contains a colon not preceded by a slash,
to take care of `/:/' which is a shorthand for `/.../<CELL-NAME>/fs'
on machines running OSF's Distributing Computing Environment (DCE) and
Distributed File System (DFS). However, when --force-local, a
filename is never remote. */
#define _remdev(Path) \
(!force_local_option && (rmt_path__ = strchr (Path, ':')) \
&& rmt_path__ > (Path) && ! memchr (Path, rmt_path__ - (Path), '/'))
#define _isrmt(Fd) \
((Fd) >= __REM_BIAS)
#define __REM_BIAS (1 << 30)
#ifndef O_CREAT
# define O_CREAT 01000
#endif
#define rmtopen(Path, Oflag, Mode, Command) \
(_remdev (Path) ? rmt_open__ (Path, Oflag, __REM_BIAS, Command) \
: open (Path, Oflag, Mode))
#define rmtaccess(Path, Amode) \
(_remdev (Path) ? 0 : access (Path, Amode))
#define rmtstat(Path, Buffer) \
(_remdev (Path) ? (errno = EOPNOTSUPP), -1 : stat (Path, Buffer))
#define rmtcreat(Path, Mode, Command) \
(_remdev (Path) \
? rmt_open__ (Path, 1 | O_CREAT, __REM_BIAS, Command) \
: creat (Path, Mode))
#define rmtlstat(Path, Buffer) \
(_remdev (Path) ? (errno = EOPNOTSUPP), -1 : lstat (Path, Buffer))
#define rmtread(Fd, Buffer, Length) \
(_isrmt (Fd) ? rmt_read__ (Fd - __REM_BIAS, Buffer, Length) \
: safe_read (Fd, Buffer, Length))
#define rmtwrite(Fd, Buffer, Length) \
(_isrmt (Fd) ? rmt_write__ (Fd - __REM_BIAS, Buffer, Length) \
: full_write (Fd, Buffer, Length))
#define rmtlseek(Fd, Offset, Where) \
(_isrmt (Fd) ? rmt_lseek__ (Fd - __REM_BIAS, Offset, Where) \
: lseek (Fd, Offset, Where))
#define rmtclose(Fd) \
(_isrmt (Fd) ? rmt_close__ (Fd - __REM_BIAS) : close (Fd))
#define rmtioctl(Fd, Request, Argument) \
(_isrmt (Fd) ? rmt_ioctl__ (Fd - __REM_BIAS, Request, Argument) \
: ioctl (Fd, Request, Argument))
#define rmtdup(Fd) \
(_isrmt (Fd) ? (errno = EOPNOTSUPP), -1 : dup (Fd))
#define rmtfstat(Fd, Buffer) \
(_isrmt (Fd) ? (errno = EOPNOTSUPP), -1 : fstat (Fd, Buffer))
#define rmtfcntl(Fd, Command, Argument) \
(_isrmt (Fd) ? (errno = EOPNOTSUPP), -1 : fcntl (Fd, Command, Argument))
#define rmtisatty(Fd) \
(_isrmt (Fd) ? 0 : isatty (Fd))

View File

@@ -1,718 +0,0 @@
/* Functions for communicating with a remote tape drive.
Copyright 1988, 1992, 1994, 1996, 1997, 1999, 2000, 2001 Free Software
Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/* The man page rmt(8) for /etc/rmt documents the remote mag tape protocol
which rdump and rrestore use. Unfortunately, the man page is *WRONG*.
The author of the routines I'm including originally wrote his code just
based on the man page, and it didn't work, so he went to the rdump source
to figure out why. The only thing he had to change was to check for the
'F' return code in addition to the 'E', and to separate the various
arguments with \n instead of a space. I personally don't think that this
is much of a problem, but I wanted to point it out. -- Arnold Robbins
Originally written by Jeff Lee, modified some by Arnold Robbins. Redone
as a library that can replace open, read, write, etc., by Fred Fish, with
some additional work by Arnold Robbins. Modified to make all rmt* calls
into macros for speed by Jay Fenlason. Use -DWITH_REXEC for rexec
code, courtesy of Dan Kegel. */
#include "system.h"
#include <safe-read.h>
#include <full-write.h>
/* Try hard to get EOPNOTSUPP defined. 486/ISC has it in net/errno.h,
3B2/SVR3 has it in sys/inet.h. Otherwise, like on MSDOS, use EINVAL. */
#ifndef EOPNOTSUPP
# if HAVE_NET_ERRNO_H
# include <net/errno.h>
# endif
# if HAVE_SYS_INET_H
# include <sys/inet.h>
# endif
# ifndef EOPNOTSUPP
# define EOPNOTSUPP EINVAL
# endif
#endif
#include <signal.h>
#if HAVE_NETDB_H
# include <netdb.h>
#endif
#include "rmt.h"
/* Exit status if exec errors. */
#define EXIT_ON_EXEC_ERROR 128
/* FIXME: Size of buffers for reading and writing commands to rmt. */
#define COMMAND_BUFFER_SIZE 64
#ifndef RETSIGTYPE
# define RETSIGTYPE void
#endif
/* FIXME: Maximum number of simultaneous remote tape connections. */
#define MAXUNIT 4
#define PREAD 0 /* read file descriptor from pipe() */
#define PWRITE 1 /* write file descriptor from pipe() */
/* Return the parent's read side of remote tape connection Fd. */
#define READ_SIDE(Fd) (from_remote[Fd][PREAD])
/* Return the parent's write side of remote tape connection Fd. */
#define WRITE_SIDE(Fd) (to_remote[Fd][PWRITE])
/* The pipes for receiving data from remote tape drives. */
static int from_remote[MAXUNIT][2] = {{-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}};
/* The pipes for sending data to remote tape drives. */
static int to_remote[MAXUNIT][2] = {{-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}};
/* Temporary variable used by macros in rmt.h. */
char *rmt_path__;
/* Close remote tape connection HANDLE, and reset errno to ERRNO_VALUE. */
static void
_rmt_shutdown (int handle, int errno_value)
{
close (READ_SIDE (handle));
close (WRITE_SIDE (handle));
READ_SIDE (handle) = -1;
WRITE_SIDE (handle) = -1;
errno = errno_value;
}
/* Attempt to perform the remote tape command specified in BUFFER on
remote tape connection HANDLE. Return 0 if successful, -1 on
error. */
static int
do_command (int handle, const char *buffer)
{
/* Save the current pipe handler and try to make the request. */
size_t length = strlen (buffer);
RETSIGTYPE (*pipe_handler) () = signal (SIGPIPE, SIG_IGN);
ssize_t written = full_write (WRITE_SIDE (handle), buffer, length);
signal (SIGPIPE, pipe_handler);
if (written == length)
return 0;
/* Something went wrong. Close down and go home. */
_rmt_shutdown (handle, EIO);
return -1;
}
static char *
get_status_string (int handle, char *command_buffer)
{
char *cursor;
int counter;
/* Read the reply command line. */
for (counter = 0, cursor = command_buffer;
counter < COMMAND_BUFFER_SIZE;
counter++, cursor++)
{
if (safe_read (READ_SIDE (handle), cursor, 1) != 1)
{
_rmt_shutdown (handle, EIO);
return 0;
}
if (*cursor == '\n')
{
*cursor = '\0';
break;
}
}
if (counter == COMMAND_BUFFER_SIZE)
{
_rmt_shutdown (handle, EIO);
return 0;
}
/* Check the return status. */
for (cursor = command_buffer; *cursor; cursor++)
if (*cursor != ' ')
break;
if (*cursor == 'E' || *cursor == 'F')
{
errno = atoi (cursor + 1);
/* Skip the error message line. */
/* FIXME: there is better to do than merely ignoring error messages
coming from the remote end. Translate them, too... */
{
char character;
while (safe_read (READ_SIDE (handle), &character, 1) == 1)
if (character == '\n')
break;
}
if (*cursor == 'F')
_rmt_shutdown (handle, errno);
return 0;
}
/* Check for mis-synced pipes. */
if (*cursor != 'A')
{
_rmt_shutdown (handle, EIO);
return 0;
}
/* Got an `A' (success) response. */
return cursor + 1;
}
/* Read and return the status from remote tape connection HANDLE. If
an error occurred, return -1 and set errno. */
static long
get_status (int handle)
{
char command_buffer[COMMAND_BUFFER_SIZE];
const char *status = get_status_string (handle, command_buffer);
return status ? atol (status) : -1L;
}
static off_t
get_status_off (int handle)
{
char command_buffer[COMMAND_BUFFER_SIZE];
const char *status = get_status_string (handle, command_buffer);
if (! status)
return -1;
else
{
/* Parse status, taking care to check for overflow.
We can't use standard functions,
since off_t might be longer than long. */
off_t count = 0;
int negative;
for (; *status == ' ' || *status == '\t'; status++)
continue;
negative = *status == '-';
status += negative || *status == '+';
for (;;)
{
int digit = *status++ - '0';
if (9 < (unsigned) digit)
break;
else
{
off_t c10 = 10 * count;
off_t nc = negative ? c10 - digit : c10 + digit;
if (c10 / 10 != count || (negative ? c10 < nc : nc < c10))
return -1;
count = nc;
}
}
return count;
}
}
#if WITH_REXEC
/* Execute /etc/rmt as user USER on remote system HOST using rexec.
Return a file descriptor of a bidirectional socket for stdin and
stdout. If USER is zero, use the current username.
By default, this code is not used, since it requires that the user
have a .netrc file in his/her home directory, or that the
application designer be willing to have rexec prompt for login and
password info. This may be unacceptable, and .rhosts files for use
with rsh are much more common on BSD systems. */
static int
_rmt_rexec (char *host, char *user)
{
int saved_stdin = dup (STDIN_FILENO);
int saved_stdout = dup (STDOUT_FILENO);
struct servent *rexecserv;
int result;
/* When using cpio -o < filename, stdin is no longer the tty. But the
rexec subroutine reads the login and the passwd on stdin, to allow
remote execution of the command. So, reopen stdin and stdout on
/dev/tty before the rexec and give them back their original value
after. */
if (! freopen ("/dev/tty", "r", stdin))
freopen ("/dev/null", "r", stdin);
if (! freopen ("/dev/tty", "w", stdout))
freopen ("/dev/null", "w", stdout);
if (rexecserv = getservbyname ("exec", "tcp"), !rexecserv)
error (EXIT_ON_EXEC_ERROR, 0, _("exec/tcp: Service not available"));
result = rexec (&host, rexecserv->s_port, user, 0, "/etc/rmt", 0);
if (fclose (stdin) == EOF)
error (0, errno, _("stdin"));
fdopen (saved_stdin, "r");
if (fclose (stdout) == EOF)
error (0, errno, _("stdout"));
fdopen (saved_stdout, "w");
return result;
}
#endif /* WITH_REXEC */
/* Place into BUF a string representing OFLAG, which must be suitable
as argument 2 of `open'. BUF must be large enough to hold the
result. This function should generate a string that decode_oflag
can parse. */
static void
encode_oflag (char *buf, int oflag)
{
sprintf (buf, "%d ", oflag);
switch (oflag & O_ACCMODE)
{
case O_RDONLY: strcat (buf, "O_RDONLY"); break;
case O_RDWR: strcat (buf, "O_RDWR"); break;
case O_WRONLY: strcat (buf, "O_WRONLY"); break;
default: abort ();
}
#ifdef O_APPEND
if (oflag & O_APPEND) strcat (buf, "|O_APPEND");
#endif
if (oflag & O_CREAT) strcat (buf, "|O_CREAT");
#ifdef O_DSYNC
if (oflag & O_DSYNC) strcat (buf, "|O_DSYNC");
#endif
if (oflag & O_EXCL) strcat (buf, "|O_EXCL");
#ifdef O_LARGEFILE
if (oflag & O_LARGEFILE) strcat (buf, "|O_LARGEFILE");
#endif
#ifdef O_NOCTTY
if (oflag & O_NOCTTY) strcat (buf, "|O_NOCTTY");
#endif
#ifdef O_NONBLOCK
if (oflag & O_NONBLOCK) strcat (buf, "|O_NONBLOCK");
#endif
#ifdef O_RSYNC
if (oflag & O_RSYNC) strcat (buf, "|O_RSYNC");
#endif
#ifdef O_SYNC
if (oflag & O_SYNC) strcat (buf, "|O_SYNC");
#endif
if (oflag & O_TRUNC) strcat (buf, "|O_TRUNC");
}
/* Open a file (a magnetic tape device?) on the system specified in
PATH, as the given user. PATH has the form `[USER@]HOST:FILE'.
OPEN_MODE is O_RDONLY, O_WRONLY, etc. If successful, return the
remote pipe number plus BIAS. REMOTE_SHELL may be overridden. On
error, return -1. */
int
rmt_open__ (const char *path, int open_mode, int bias, const char *remote_shell)
{
int remote_pipe_number; /* pseudo, biased file descriptor */
char *path_copy ; /* copy of path string */
char *remote_host; /* remote host name */
char *remote_file; /* remote file name (often a device) */
char *remote_user; /* remote user name */
/* Find an unused pair of file descriptors. */
for (remote_pipe_number = 0;
remote_pipe_number < MAXUNIT;
remote_pipe_number++)
if (READ_SIDE (remote_pipe_number) == -1
&& WRITE_SIDE (remote_pipe_number) == -1)
break;
if (remote_pipe_number == MAXUNIT)
{
errno = EMFILE;
return -1;
}
/* Pull apart the system and device, and optional user. */
{
char *cursor;
path_copy = xstrdup (path);
remote_host = path_copy;
remote_user = 0;
remote_file = 0;
for (cursor = path_copy; *cursor; cursor++)
switch (*cursor)
{
default:
break;
case '\n':
/* Do not allow newlines in the path, since the protocol
uses newline delimiters. */
free (path_copy);
errno = ENOENT;
return -1;
case '@':
if (!remote_user)
{
remote_user = remote_host;
*cursor = '\0';
remote_host = cursor + 1;
}
break;
case ':':
if (!remote_file)
{
*cursor = '\0';
remote_file = cursor + 1;
}
break;
}
}
/* FIXME: Should somewhat validate the decoding, here. */
if (remote_user && *remote_user == '\0')
remote_user = 0;
#if WITH_REXEC
/* Execute the remote command using rexec. */
READ_SIDE (remote_pipe_number) = _rmt_rexec (remote_host, remote_user);
if (READ_SIDE (remote_pipe_number) < 0)
{
int e = errno;
free (path_copy);
errno = e;
return -1;
}
WRITE_SIDE (remote_pipe_number) = READ_SIDE (remote_pipe_number);
#else /* not WITH_REXEC */
{
const char *remote_shell_basename;
pid_t status;
/* Identify the remote command to be executed. */
if (!remote_shell)
{
#ifdef REMOTE_SHELL
remote_shell = REMOTE_SHELL;
#else
free (path_copy);
errno = EIO;
return -1;
#endif
}
remote_shell_basename = base_name (remote_shell);
/* Set up the pipes for the `rsh' command, and fork. */
if (pipe (to_remote[remote_pipe_number]) == -1
|| pipe (from_remote[remote_pipe_number]) == -1)
{
int e = errno;
free (path_copy);
errno = e;
return -1;
}
status = fork ();
if (status == -1)
{
int e = errno;
free (path_copy);
errno = e;
return -1;
}
if (status == 0)
{
/* Child. */
close (STDIN_FILENO);
dup (to_remote[remote_pipe_number][PREAD]);
close (to_remote[remote_pipe_number][PREAD]);
close (to_remote[remote_pipe_number][PWRITE]);
close (STDOUT_FILENO);
dup (from_remote[remote_pipe_number][PWRITE]);
close (from_remote[remote_pipe_number][PREAD]);
close (from_remote[remote_pipe_number][PWRITE]);
#if !MSDOS
setuid (getuid ());
setgid (getgid ());
#endif
if (remote_user)
execl (remote_shell, remote_shell_basename, remote_host,
"-l", remote_user, "/etc/rmt", (char *) 0);
else
execl (remote_shell, remote_shell_basename, remote_host,
"/etc/rmt", (char *) 0);
/* Bad problems if we get here. */
/* In a previous version, _exit was used here instead of exit. */
error (EXIT_ON_EXEC_ERROR, errno, _("Cannot execute remote shell"));
}
/* Parent. */
close (from_remote[remote_pipe_number][PWRITE]);
close (to_remote[remote_pipe_number][PREAD]);
}
#endif /* not WITH_REXEC */
/* Attempt to open the tape device. */
{
size_t remote_file_len = strlen (remote_file);
char *command_buffer = xmalloc (remote_file_len + 1000);
sprintf (command_buffer, "O%s\n", remote_file);
encode_oflag (command_buffer + remote_file_len + 2, open_mode);
strcat (command_buffer, "\n");
if (do_command (remote_pipe_number, command_buffer) == -1
|| get_status (remote_pipe_number) == -1)
{
int e = errno;
free (command_buffer);
free (path_copy);
_rmt_shutdown (remote_pipe_number, e);
return -1;
}
free (command_buffer);
}
free (path_copy);
return remote_pipe_number + bias;
}
/* Close remote tape connection HANDLE and shut down. Return 0 if
successful, -1 on error. */
int
rmt_close__ (int handle)
{
int status;
if (do_command (handle, "C\n") == -1)
return -1;
status = get_status (handle);
_rmt_shutdown (handle, errno);
return status;
}
/* Read up to LENGTH bytes into BUFFER from remote tape connection HANDLE.
Return the number of bytes read on success, -1 on error. */
ssize_t
rmt_read__ (int handle, char *buffer, size_t length)
{
char command_buffer[COMMAND_BUFFER_SIZE];
ssize_t status, rlen;
size_t counter;
sprintf (command_buffer, "R%lu\n", (unsigned long) length);
if (do_command (handle, command_buffer) == -1
|| (status = get_status (handle)) == -1)
return -1;
for (counter = 0; counter < status; counter += rlen, buffer += rlen)
{
rlen = safe_read (READ_SIDE (handle), buffer, status - counter);
if (rlen <= 0)
{
_rmt_shutdown (handle, EIO);
return -1;
}
}
return status;
}
/* Write LENGTH bytes from BUFFER to remote tape connection HANDLE.
Return the number of bytes written on success, -1 on error. */
ssize_t
rmt_write__ (int handle, char *buffer, size_t length)
{
char command_buffer[COMMAND_BUFFER_SIZE];
RETSIGTYPE (*pipe_handler) ();
size_t written;
sprintf (command_buffer, "W%lu\n", (unsigned long) length);
if (do_command (handle, command_buffer) == -1)
return -1;
pipe_handler = signal (SIGPIPE, SIG_IGN);
written = full_write (WRITE_SIDE (handle), buffer, length);
signal (SIGPIPE, pipe_handler);
if (written == length)
return get_status (handle);
/* Write error. */
_rmt_shutdown (handle, EIO);
return -1;
}
/* Perform an imitation lseek operation on remote tape connection
HANDLE. Return the new file offset if successful, -1 if on error. */
off_t
rmt_lseek__ (int handle, off_t offset, int whence)
{
char command_buffer[COMMAND_BUFFER_SIZE];
char operand_buffer[UINTMAX_STRSIZE_BOUND];
uintmax_t u = offset < 0 ? - (uintmax_t) offset : (uintmax_t) offset;
char *p = operand_buffer + sizeof operand_buffer;
do
*--p = '0' + (int) (u % 10);
while ((u /= 10) != 0);
if (offset < 0)
*--p = '-';
switch (whence)
{
case SEEK_SET: whence = 0; break;
case SEEK_CUR: whence = 1; break;
case SEEK_END: whence = 2; break;
default: abort ();
}
sprintf (command_buffer, "L%s\n%d\n", p, whence);
if (do_command (handle, command_buffer) == -1)
return -1;
return get_status_off (handle);
}
/* Perform a raw tape operation on remote tape connection HANDLE.
Return the results of the ioctl, or -1 on error. */
int
rmt_ioctl__ (int handle, int operation, char *argument)
{
switch (operation)
{
default:
errno = EOPNOTSUPP;
return -1;
#ifdef MTIOCTOP
case MTIOCTOP:
{
char command_buffer[COMMAND_BUFFER_SIZE];
char operand_buffer[UINTMAX_STRSIZE_BOUND];
uintmax_t u = (((struct mtop *) argument)->mt_count < 0
? - (uintmax_t) ((struct mtop *) argument)->mt_count
: (uintmax_t) ((struct mtop *) argument)->mt_count);
char *p = operand_buffer + sizeof operand_buffer;
do
*--p = '0' + (int) (u % 10);
while ((u /= 10) != 0);
if (((struct mtop *) argument)->mt_count < 0)
*--p = '-';
/* MTIOCTOP is the easy one. Nothing is transferred in binary. */
sprintf (command_buffer, "I%d\n%s\n",
((struct mtop *) argument)->mt_op, p);
if (do_command (handle, command_buffer) == -1)
return -1;
return get_status (handle);
}
#endif /* MTIOCTOP */
#ifdef MTIOCGET
case MTIOCGET:
{
ssize_t status;
ssize_t counter;
/* Grab the status and read it directly into the structure. This
assumes that the status buffer is not padded and that 2 shorts
fit in a long without any word alignment problems; i.e., the
whole struct is contiguous. NOTE - this is probably NOT a good
assumption. */
if (do_command (handle, "S") == -1
|| (status = get_status (handle), status == -1))
return -1;
for (; status > 0; status -= counter, argument += counter)
{
counter = safe_read (READ_SIDE (handle), argument, status);
if (counter <= 0)
{
_rmt_shutdown (handle, EIO);
return -1;
}
}
/* Check for byte position. mt_type (or mt_model) is a small integer
field (normally) so we will check its magnitude. If it is larger
than 256, we will assume that the bytes are swapped and go through
and reverse all the bytes. */
if (((struct mtget *) argument)->MTIO_CHECK_FIELD < 256)
return 0;
for (counter = 0; counter < status; counter += 2)
{
char copy = argument[counter];
argument[counter] = argument[counter + 1];
argument[counter + 1] = copy;
}
return 0;
}
#endif /* MTIOCGET */
}
}

1175
src/sparse.c Normal file

File diff suppressed because it is too large Load Diff

78
src/suffix.c Normal file
View File

@@ -0,0 +1,78 @@
/* This file is part of GNU tar.
Copyright (C) 2007 Free Software Foundation, Inc.
Written by Sergey Poznyakoff.
GNU tar is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 3, or (at your option) any later
version.
GNU tar is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
Public License for more details.
You should have received a copy of the GNU General Public License along
with GNU tar. If not, see <http://www.gnu.org/licenses/>. */
#include <system.h>
#include "common.h"
struct compression_suffix
{
const char *suffix;
size_t length;
const char *program;
};
struct compression_suffix compression_suffixes[] = {
#define S(s,p) #s, sizeof (#s) - 1, #p
{ S(gz, gzip) },
{ S(tgz, gzip) },
{ S(taz, gzip) },
{ S(Z, compress) },
{ S(taZ, compress) },
{ S(bz2, bzip2) },
{ S(tbz, bzip2) },
{ S(tbz2, bzip2) },
{ S(tz2, bzip2) },
{ S(lzma, lzma) },
{ S(tlz, lzma) },
#undef S
};
int nsuffixes = sizeof (compression_suffixes) /
sizeof (compression_suffixes[0]);
static const char *
find_compression_program (const char *name, const char *defprog)
{
char *suf = strrchr (name, '.');
if (suf)
{
int i;
size_t len;
suf++;
len = strlen (suf);
for (i = 0; i < nsuffixes; i++)
{
if (compression_suffixes[i].length == len
&& memcmp (compression_suffixes[i].suffix, suf, len) == 0)
return compression_suffixes[i].program;
}
}
return defprog;
}
void
set_comression_program_by_suffix (const char *name, const char *defprog)
{
const char *program = find_compression_program (name, defprog);
if (program)
use_compress_program_option = program;
}

894
src/system.c Normal file
View File

@@ -0,0 +1,894 @@
/* System-dependent calls for tar.
Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 3, or (at your option) any later
version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
#include <system.h>
#include "common.h"
#include <rmt.h>
#include <signal.h>
#if MSDOS
bool
sys_get_archive_stat (void)
{
return 0;
}
bool
sys_file_is_archive (struct tar_stat_info *p)
{
return false;
}
void
sys_save_archive_dev_ino (void)
{
}
void
sys_detect_dev_null_output (void)
{
static char const dev_null[] = "nul";
dev_null_output = (strcmp (archive_name_array[0], dev_null) == 0
|| (! _isrmt (archive)));
}
void
sys_drain_input_pipe (void)
{
}
void
sys_wait_for_child (pid_t child_pid)
{
}
void
sys_spawn_shell (void)
{
spawnl (P_WAIT, getenv ("COMSPEC"), "-", 0);
}
/* stat() in djgpp's C library gives a constant number of 42 as the
uid and gid of a file. So, comparing an FTP'ed archive just after
unpack would fail on MSDOS. */
bool
sys_compare_uid (struct stat *a, struct stat *b)
{
return true;
}
bool
sys_compare_gid (struct stat *a, struct stat *b)
{
return true;
}
void
sys_compare_links (struct stat *link_data, struct stat *stat_data)
{
return true;
}
int
sys_truncate (int fd)
{
return write (fd, "", 0);
}
size_t
sys_write_archive_buffer (void)
{
return full_write (archive, record_start->buffer, record_size);
}
/* Set ARCHIVE for writing, then compressing an archive. */
void
sys_child_open_for_compress (void)
{
FATAL_ERROR ((0, 0, _("Cannot use compressed or remote archives")));
}
/* Set ARCHIVE for uncompressing, then reading an archive. */
void
sys_child_open_for_uncompress (void)
{
FATAL_ERROR ((0, 0, _("Cannot use compressed or remote archives")));
}
#else
extern union block *record_start; /* FIXME */
static struct stat archive_stat; /* stat block for archive file */
bool
sys_get_archive_stat (void)
{
return fstat (archive, &archive_stat) == 0;
}
bool
sys_file_is_archive (struct tar_stat_info *p)
{
return (ar_dev && p->stat.st_dev == ar_dev && p->stat.st_ino == ar_ino);
}
/* Save archive file inode and device numbers */
void
sys_save_archive_dev_ino (void)
{
if (!_isrmt (archive) && S_ISREG (archive_stat.st_mode))
{
ar_dev = archive_stat.st_dev;
ar_ino = archive_stat.st_ino;
}
else
ar_dev = 0;
}
/* Detect if outputting to "/dev/null". */
void
sys_detect_dev_null_output (void)
{
static char const dev_null[] = "/dev/null";
struct stat dev_null_stat;
dev_null_output = (strcmp (archive_name_array[0], dev_null) == 0
|| (! _isrmt (archive)
&& S_ISCHR (archive_stat.st_mode)
&& stat (dev_null, &dev_null_stat) == 0
&& archive_stat.st_dev == dev_null_stat.st_dev
&& archive_stat.st_ino == dev_null_stat.st_ino));
}
/* Manage to fully drain a pipe we might be reading, so to not break it on
the producer after the EOF block. FIXME: one of these days, GNU tar
might become clever enough to just stop working, once there is no more
work to do, we might have to revise this area in such time. */
void
sys_drain_input_pipe (void)
{
size_t r;
if (access_mode == ACCESS_READ
&& ! _isrmt (archive)
&& (S_ISFIFO (archive_stat.st_mode) || S_ISSOCK (archive_stat.st_mode)))
while ((r = rmtread (archive, record_start->buffer, record_size)) != 0
&& r != SAFE_READ_ERROR)
continue;
}
void
sys_wait_for_child (pid_t child_pid)
{
if (child_pid)
{
int wait_status;
while (waitpid (child_pid, &wait_status, 0) == -1)
if (errno != EINTR)
{
waitpid_error (use_compress_program_option);
break;
}
if (WIFSIGNALED (wait_status))
ERROR ((0, 0, _("Child died with signal %d"),
WTERMSIG (wait_status)));
else if (WEXITSTATUS (wait_status) != 0)
ERROR ((0, 0, _("Child returned status %d"),
WEXITSTATUS (wait_status)));
}
}
void
sys_spawn_shell (void)
{
pid_t child;
const char *shell = getenv ("SHELL");
if (! shell)
shell = "/bin/sh";
child = xfork ();
if (child == 0)
{
execlp (shell, "-sh", "-i", (char *) 0);
exec_fatal (shell);
}
else
{
int wait_status;
while (waitpid (child, &wait_status, 0) == -1)
if (errno != EINTR)
{
waitpid_error (shell);
break;
}
}
}
bool
sys_compare_uid (struct stat *a, struct stat *b)
{
return a->st_uid == b->st_uid;
}
bool
sys_compare_gid (struct stat *a, struct stat *b)
{
return a->st_gid == b->st_gid;
}
bool
sys_compare_links (struct stat *link_data, struct stat *stat_data)
{
return stat_data->st_dev == link_data->st_dev
&& stat_data->st_ino == link_data->st_ino;
}
int
sys_truncate (int fd)
{
off_t pos = lseek (fd, (off_t) 0, SEEK_CUR);
return pos < 0 ? -1 : ftruncate (fd, pos);
}
/* Return nonzero if NAME is the name of a regular file, or if the file
does not exist (so it would be created as a regular file). */
static int
is_regular_file (const char *name)
{
struct stat stbuf;
if (stat (name, &stbuf) == 0)
return S_ISREG (stbuf.st_mode);
else
return errno == ENOENT;
}
size_t
sys_write_archive_buffer (void)
{
return rmtwrite (archive, record_start->buffer, record_size);
}
#define PREAD 0 /* read file descriptor from pipe() */
#define PWRITE 1 /* write file descriptor from pipe() */
/* Duplicate file descriptor FROM into becoming INTO.
INTO is closed first and has to be the next available slot. */
static void
xdup2 (int from, int into)
{
if (from != into)
{
int status = close (into);
if (status != 0 && errno != EBADF)
{
int e = errno;
FATAL_ERROR ((0, e, _("Cannot close")));
}
status = dup (from);
if (status != into)
{
if (status < 0)
{
int e = errno;
FATAL_ERROR ((0, e, _("Cannot dup")));
}
abort ();
}
xclose (from);
}
}
/* Set ARCHIVE for writing, then compressing an archive. */
pid_t
sys_child_open_for_compress (void)
{
int parent_pipe[2];
int child_pipe[2];
pid_t grandchild_pid;
pid_t child_pid;
int wait_status;
xpipe (parent_pipe);
child_pid = xfork ();
if (child_pid > 0)
{
/* The parent tar is still here! Just clean up. */
archive = parent_pipe[PWRITE];
xclose (parent_pipe[PREAD]);
return child_pid;
}
/* The new born child tar is here! */
program_name = _("tar (child)");
xdup2 (parent_pipe[PREAD], STDIN_FILENO);
xclose (parent_pipe[PWRITE]);
/* Check if we need a grandchild tar. This happens only if either:
a) the file is to be accessed by rmt: compressor doesn't know how;
b) the file is not a plain file. */
if (!_remdev (archive_name_array[0])
&& is_regular_file (archive_name_array[0]))
{
if (backup_option)
maybe_backup_file (archive_name_array[0], 1);
/* We don't need a grandchild tar. Open the archive and launch the
compressor. */
if (strcmp (archive_name_array[0], "-"))
{
archive = creat (archive_name_array[0], MODE_RW);
if (archive < 0)
{
int saved_errno = errno;
if (backup_option)
undo_last_backup ();
errno = saved_errno;
open_fatal (archive_name_array[0]);
}
xdup2 (archive, STDOUT_FILENO);
}
execlp (use_compress_program_option, use_compress_program_option, NULL);
exec_fatal (use_compress_program_option);
}
/* We do need a grandchild tar. */
xpipe (child_pipe);
grandchild_pid = xfork ();
if (grandchild_pid == 0)
{
/* The newborn grandchild tar is here! Launch the compressor. */
program_name = _("tar (grandchild)");
xdup2 (child_pipe[PWRITE], STDOUT_FILENO);
xclose (child_pipe[PREAD]);
execlp (use_compress_program_option, use_compress_program_option,
(char *) 0);
exec_fatal (use_compress_program_option);
}
/* The child tar is still here! */
/* Prepare for reblocking the data from the compressor into the archive. */
xdup2 (child_pipe[PREAD], STDIN_FILENO);
xclose (child_pipe[PWRITE]);
if (strcmp (archive_name_array[0], "-") == 0)
archive = STDOUT_FILENO;
else
{
archive = rmtcreat (archive_name_array[0], MODE_RW, rsh_command_option);
if (archive < 0)
open_fatal (archive_name_array[0]);
}
/* Let's read out of the stdin pipe and write an archive. */
while (1)
{
size_t status = 0;
char *cursor;
size_t length;
/* Assemble a record. */
for (length = 0, cursor = record_start->buffer;
length < record_size;
length += status, cursor += status)
{
size_t size = record_size - length;
status = safe_read (STDIN_FILENO, cursor, size);
if (status == SAFE_READ_ERROR)
read_fatal (use_compress_program_option);
if (status == 0)
break;
}
/* Copy the record. */
if (status == 0)
{
/* We hit the end of the file. Write last record at
full length, as the only role of the grandchild is
doing proper reblocking. */
if (length > 0)
{
memset (record_start->buffer + length, 0, record_size - length);
status = sys_write_archive_buffer ();
if (status != record_size)
archive_write_error (status);
}
/* There is nothing else to read, break out. */
break;
}
status = sys_write_archive_buffer ();
if (status != record_size)
archive_write_error (status);
}
/* Propagate any failure of the grandchild back to the parent. */
while (waitpid (grandchild_pid, &wait_status, 0) == -1)
if (errno != EINTR)
{
waitpid_error (use_compress_program_option);
break;
}
if (WIFSIGNALED (wait_status))
{
kill (child_pid, WTERMSIG (wait_status));
exit_status = TAREXIT_FAILURE;
}
else if (WEXITSTATUS (wait_status) != 0)
exit_status = WEXITSTATUS (wait_status);
exit (exit_status);
}
/* Set ARCHIVE for uncompressing, then reading an archive. */
pid_t
sys_child_open_for_uncompress (void)
{
int parent_pipe[2];
int child_pipe[2];
pid_t grandchild_pid;
pid_t child_pid;
int wait_status;
xpipe (parent_pipe);
child_pid = xfork ();
if (child_pid > 0)
{
/* The parent tar is still here! Just clean up. */
archive = parent_pipe[PREAD];
xclose (parent_pipe[PWRITE]);
return child_pid;
}
/* The newborn child tar is here! */
program_name = _("tar (child)");
xdup2 (parent_pipe[PWRITE], STDOUT_FILENO);
xclose (parent_pipe[PREAD]);
/* Check if we need a grandchild tar. This happens only if either:
a) we're reading stdin: to force unblocking;
b) the file is to be accessed by rmt: compressor doesn't know how;
c) the file is not a plain file. */
if (strcmp (archive_name_array[0], "-") != 0
&& !_remdev (archive_name_array[0])
&& is_regular_file (archive_name_array[0]))
{
/* We don't need a grandchild tar. Open the archive and lauch the
uncompressor. */
archive = open (archive_name_array[0], O_RDONLY | O_BINARY, MODE_RW);
if (archive < 0)
open_fatal (archive_name_array[0]);
xdup2 (archive, STDIN_FILENO);
execlp (use_compress_program_option, use_compress_program_option,
"-d", (char *) 0);
exec_fatal (use_compress_program_option);
}
/* We do need a grandchild tar. */
xpipe (child_pipe);
grandchild_pid = xfork ();
if (grandchild_pid == 0)
{
/* The newborn grandchild tar is here! Launch the uncompressor. */
program_name = _("tar (grandchild)");
xdup2 (child_pipe[PREAD], STDIN_FILENO);
xclose (child_pipe[PWRITE]);
execlp (use_compress_program_option, use_compress_program_option,
"-d", (char *) 0);
exec_fatal (use_compress_program_option);
}
/* The child tar is still here! */
/* Prepare for unblocking the data from the archive into the
uncompressor. */
xdup2 (child_pipe[PWRITE], STDOUT_FILENO);
xclose (child_pipe[PREAD]);
if (strcmp (archive_name_array[0], "-") == 0)
archive = STDIN_FILENO;
else
archive = rmtopen (archive_name_array[0], O_RDONLY | O_BINARY,
MODE_RW, rsh_command_option);
if (archive < 0)
open_fatal (archive_name_array[0]);
/* Let's read the archive and pipe it into stdout. */
while (1)
{
char *cursor;
size_t maximum;
size_t count;
size_t status;
clear_read_error_count ();
error_loop:
status = rmtread (archive, record_start->buffer, record_size);
if (status == SAFE_READ_ERROR)
{
archive_read_error ();
goto error_loop;
}
if (status == 0)
break;
cursor = record_start->buffer;
maximum = status;
while (maximum)
{
count = maximum < BLOCKSIZE ? maximum : BLOCKSIZE;
if (full_write (STDOUT_FILENO, cursor, count) != count)
write_error (use_compress_program_option);
cursor += count;
maximum -= count;
}
}
xclose (STDOUT_FILENO);
/* Propagate any failure of the grandchild back to the parent. */
while (waitpid (grandchild_pid, &wait_status, 0) == -1)
if (errno != EINTR)
{
waitpid_error (use_compress_program_option);
break;
}
if (WIFSIGNALED (wait_status))
{
kill (child_pid, WTERMSIG (wait_status));
exit_status = TAREXIT_FAILURE;
}
else if (WEXITSTATUS (wait_status) != 0)
exit_status = WEXITSTATUS (wait_status);
exit (exit_status);
}
static void
dec_to_env (char *envar, uintmax_t num)
{
char buf[UINTMAX_STRSIZE_BOUND];
char *numstr;
numstr = STRINGIFY_BIGINT (num, buf);
if (setenv (envar, numstr, 1) != 0)
xalloc_die ();
}
static void
time_to_env (char *envar, struct timespec t)
{
char buf[TIMESPEC_STRSIZE_BOUND];
if (setenv (envar, code_timespec (t, buf), 1) != 0)
xalloc_die ();
}
static void
oct_to_env (char *envar, unsigned long num)
{
char buf[1+1+(sizeof(unsigned long)*CHAR_BIT+2)/3];
snprintf (buf, sizeof buf, "0%lo", num);
if (setenv (envar, buf, 1) != 0)
xalloc_die ();
}
static void
str_to_env (char *envar, char const *str)
{
if (str)
{
if (setenv (envar, str, 1) != 0)
xalloc_die ();
}
else
unsetenv (envar);
}
static void
chr_to_env (char *envar, char c)
{
char buf[2];
buf[0] = c;
buf[1] = 0;
if (setenv (envar, buf, 1) != 0)
xalloc_die ();
}
static void
stat_to_env (char *name, char type, struct tar_stat_info *st)
{
str_to_env ("TAR_VERSION", PACKAGE_VERSION);
chr_to_env ("TAR_FILETYPE", type);
oct_to_env ("TAR_MODE", st->stat.st_mode);
str_to_env ("TAR_FILENAME", name);
str_to_env ("TAR_REALNAME", st->file_name);
str_to_env ("TAR_UNAME", st->uname);
str_to_env ("TAR_GNAME", st->gname);
time_to_env ("TAR_ATIME", st->atime);
time_to_env ("TAR_MTIME", st->mtime);
time_to_env ("TAR_CTIME", st->ctime);
dec_to_env ("TAR_SIZE", st->stat.st_size);
dec_to_env ("TAR_UID", st->stat.st_uid);
dec_to_env ("TAR_GID", st->stat.st_gid);
switch (type)
{
case 'b':
case 'c':
dec_to_env ("TAR_MINOR", minor (st->stat.st_rdev));
dec_to_env ("TAR_MAJOR", major (st->stat.st_rdev));
unsetenv ("TAR_LINKNAME");
break;
case 'l':
case 'h':
unsetenv ("TAR_MINOR");
unsetenv ("TAR_MAJOR");
str_to_env ("TAR_LINKNAME", st->link_name);
break;
default:
unsetenv ("TAR_MINOR");
unsetenv ("TAR_MAJOR");
unsetenv ("TAR_LINKNAME");
break;
}
}
static pid_t global_pid;
static RETSIGTYPE (*pipe_handler) (int sig);
int
sys_exec_command (char *file_name, int typechar, struct tar_stat_info *st)
{
int p[2];
char *argv[4];
xpipe (p);
pipe_handler = signal (SIGPIPE, SIG_IGN);
global_pid = xfork ();
if (global_pid != 0)
{
xclose (p[PREAD]);
return p[PWRITE];
}
/* Child */
xdup2 (p[PREAD], STDIN_FILENO);
xclose (p[PWRITE]);
stat_to_env (file_name, typechar, st);
argv[0] = "/bin/sh";
argv[1] = "-c";
argv[2] = to_command_option;
argv[3] = NULL;
execv ("/bin/sh", argv);
exec_fatal (file_name);
}
void
sys_wait_command (void)
{
int status;
if (global_pid < 0)
return;
signal (SIGPIPE, pipe_handler);
while (waitpid (global_pid, &status, 0) == -1)
if (errno != EINTR)
{
global_pid = -1;
waitpid_error (to_command_option);
return;
}
if (WIFEXITED (status))
{
if (!ignore_command_error_option && WEXITSTATUS (status))
ERROR ((0, 0, _("%lu: Child returned status %d"),
(unsigned long) global_pid, WEXITSTATUS (status)));
}
else if (WIFSIGNALED (status))
{
WARN ((0, 0, _("%lu: Child terminated on signal %d"),
(unsigned long) global_pid, WTERMSIG (status)));
}
else
ERROR ((0, 0, _("%lu: Child terminated on unknown reason"),
(unsigned long) global_pid));
global_pid = -1;
}
int
sys_exec_info_script (const char **archive_name, int volume_number)
{
pid_t pid;
char *argv[4];
char uintbuf[UINTMAX_STRSIZE_BOUND];
int p[2];
static RETSIGTYPE (*saved_handler) (int sig);
xpipe (p);
saved_handler = signal (SIGPIPE, SIG_IGN);
pid = xfork ();
if (pid != 0)
{
/* Master */
int rc;
int status;
char *buf = NULL;
size_t size = 0;
FILE *fp;
xclose (p[PWRITE]);
fp = fdopen (p[PREAD], "r");
rc = getline (&buf, &size, fp);
fclose (fp);
if (rc > 0 && buf[rc-1] == '\n')
buf[--rc] = 0;
while (waitpid (pid, &status, 0) == -1)
if (errno != EINTR)
{
signal (SIGPIPE, saved_handler);
waitpid_error (info_script_option);
return -1;
}
signal (SIGPIPE, saved_handler);
if (WIFEXITED (status))
{
if (WEXITSTATUS (status) == 0 && rc > 0)
*archive_name = buf;
else
free (buf);
return WEXITSTATUS (status);
}
free (buf);
return -1;
}
/* Child */
setenv ("TAR_VERSION", PACKAGE_VERSION, 1);
setenv ("TAR_ARCHIVE", *archive_name, 1);
setenv ("TAR_VOLUME", STRINGIFY_BIGINT (volume_number, uintbuf), 1);
setenv ("TAR_BLOCKING_FACTOR",
STRINGIFY_BIGINT (blocking_factor, uintbuf), 1);
setenv ("TAR_SUBCOMMAND", subcommand_string (subcommand_option), 1);
setenv ("TAR_FORMAT",
archive_format_string (current_format == DEFAULT_FORMAT ?
archive_format : current_format), 1);
setenv ("TAR_FD", STRINGIFY_BIGINT (p[PWRITE], uintbuf), 1);
xclose (p[PREAD]);
argv[0] = "/bin/sh";
argv[1] = "-c";
argv[2] = (char*) info_script_option;
argv[3] = NULL;
execv (argv[0], argv);
exec_fatal (info_script_option);
}
void
sys_exec_checkpoint_script (const char *script_name,
const char *archive_name,
int checkpoint_number)
{
pid_t pid;
char *argv[4];
char uintbuf[UINTMAX_STRSIZE_BOUND];
pid = xfork ();
if (pid != 0)
{
/* Master */
int status;
while (waitpid (pid, &status, 0) == -1)
if (errno != EINTR)
{
waitpid_error (script_name);
break;
}
return;
}
/* Child */
setenv ("TAR_VERSION", PACKAGE_VERSION, 1);
setenv ("TAR_ARCHIVE", archive_name, 1);
setenv ("TAR_CHECKPOINT", STRINGIFY_BIGINT (checkpoint_number, uintbuf), 1);
setenv ("TAR_BLOCKING_FACTOR",
STRINGIFY_BIGINT (blocking_factor, uintbuf), 1);
setenv ("TAR_SUBCOMMAND", subcommand_string (subcommand_option), 1);
setenv ("TAR_FORMAT",
archive_format_string (current_format == DEFAULT_FORMAT ?
archive_format : current_format), 1);
argv[0] = "/bin/sh";
argv[1] = "-c";
argv[2] = (char*) script_name;
argv[3] = NULL;
execv (argv[0], argv);
exec_fatal (script_name);
}
#endif /* not MSDOS */

View File

@@ -1,492 +0,0 @@
/* System dependent definitions for GNU tar.
Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#if HAVE_CONFIG_H
# include <config.h>
#endif
/* Declare alloca. AIX requires this to be the first thing in the file. */
#if __GNUC__
# define alloca __builtin_alloca
#else
# if HAVE_ALLOCA_H
# include <alloca.h>
# else
# ifdef _AIX
#pragma alloca
# else
# ifndef alloca
char *alloca ();
# endif
# endif
# endif
#endif
#include <sys/types.h>
/* Declare a generic pointer type. */
#if __STDC__ || defined(__TURBOC__)
# define voidstar void *
#else
# define voidstar char *
#endif
/* Declare ISASCII. */
#include <ctype.h>
#if STDC_HEADERS
# define ISASCII(Char) 1
#else
# ifdef isascii
# define ISASCII(Char) isascii (Char)
# else
# if HAVE_ISASCII
# define ISASCII(Char) isascii (Char)
# else
# define ISASCII(Char) 1
# endif
# endif
#endif
/* Declare string and memory handling routines. Take care that an ANSI
string.h and pre-ANSI memory.h might conflict, and that memory.h and
strings.h conflict on some systems. */
#if STDC_HEADERS || HAVE_STRING_H
# include <string.h>
# if !STDC_HEADERS && HAVE_MEMORY_H
# include <memory.h>
# endif
#else
# include <strings.h>
# ifndef strchr
# define strchr index
# endif
# ifndef strrchr
# define strrchr rindex
# endif
# ifndef memcpy
# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num)
# endif
# ifndef memcmp
# define memcmp(Src1, Src2, Num) bcmp (Src1, Src2, Num)
# endif
#endif
/* Declare errno. */
#include <errno.h>
#ifndef errno
extern int errno;
#endif
/* Declare open parameters. */
#if HAVE_FCNTL_H
# include <fcntl.h>
#else
# include <sys/file.h>
#endif
/* Pick only one of the next three: */
#ifndef O_RDONLY
# define O_RDONLY 0 /* only allow read */
#endif
#ifndef O_WRONLY
# define O_WRONLY 1 /* only allow write */
#endif
#ifndef O_RDWR
# define O_RDWR 2 /* both are allowed */
#endif
/* The rest can be OR-ed in to the above: */
#ifndef O_NDELAY
# define O_NDELAY 4 /* don't block on opening devices */
#endif
#ifndef O_CREAT
# define O_CREAT 8 /* create file if needed */
#endif
#ifndef O_EXCL
# define O_EXCL 16 /* file cannot already exist */
#endif
#ifndef O_TRUNC
# define O_TRUNC 32 /* truncate file on open */
#endif
#ifndef O_APPEND
# define O_APPEND 64 /* always write at end of file */
#endif
/* MS-DOG forever, with my love! */
#ifndef O_BINARY
# define O_BINARY 0
#endif
/* Emulate System V 3-argument open call */
#if EMUL_OPEN3
# define open open3
#endif
/* Declare file status routines and bits. */
#include <sys/stat.h>
#ifndef S_ISLNK
# define lstat stat
#endif
#if STAT_MACROS_BROKEN
# undef S_ISBLK
# undef S_ISCHR
# undef S_ISDIR
# undef S_ISFIFO
# undef S_ISLNK
# undef S_ISMPB
# undef S_ISMPC
# undef S_ISNWK
# undef S_ISREG
# undef S_ISSOCK
#endif
/* On MSDOS, there are missing things from <sys/stat.h>. */
#if MSDOS
# define S_ISUID 0
# define S_ISGID 0
# define S_ISVTX 0
#endif
#ifndef S_ISREG /* POSIX.1 stat stuff missing */
# define mode_t unsigned short
#endif
#if !defined(S_ISBLK) && defined(S_IFBLK)
# define S_ISBLK(Mode) (((Mode) & S_IFMT) == S_IFBLK)
#endif
#if !defined(S_ISCHR) && defined(S_IFCHR)
# define S_ISCHR(Mode) (((Mode) & S_IFMT) == S_IFCHR)
#endif
#if !defined(S_ISDIR) && defined(S_IFDIR)
# define S_ISDIR(Mode) (((Mode) & S_IFMT) == S_IFDIR)
#endif
#if !defined(S_ISREG) && defined(S_IFREG)
# define S_ISREG(Mode) (((Mode) & S_IFMT) == S_IFREG)
#endif
#if !defined(S_ISFIFO) && defined(S_IFIFO)
# define S_ISFIFO(Mode) (((Mode) & S_IFMT) == S_IFIFO)
#endif
#if !defined(S_ISLNK) && defined(S_IFLNK)
# define S_ISLNK(Mode) (((Mode) & S_IFMT) == S_IFLNK)
#endif
#if !defined(S_ISSOCK) && defined(S_IFSOCK)
# define S_ISSOCK(Mode) (((Mode) & S_IFMT) == S_IFSOCK)
#endif
#if !defined(S_ISMPB) && defined(S_IFMPB) /* V7 */
# define S_ISMPB(Mode) (((Mode) & S_IFMT) == S_IFMPB)
# define S_ISMPC(Mode) (((Mode) & S_IFMT) == S_IFMPC)
#endif
#if !defined(S_ISNWK) && defined(S_IFNWK) /* HP/UX */
# define S_ISNWK(Mode) (((Mode) & S_IFMT) == S_IFNWK)
#endif
#if !HAVE_MKFIFO
# define mkfifo(Path, Mode) (mknod (Path, (Mode) | S_IFIFO, 0))
#endif
#if !defined(S_ISCTG) && defined(S_IFCTG) /* contiguous file */
# define S_ISCTG(Mode) (((Mode) & S_IFMT) == S_IFCTG)
#endif
#if !defined(S_ISVTX)
# define S_ISVTX 0001000
#endif
#ifndef _POSIX_SOURCE
# include <sys/param.h>
#endif
/* Include <unistd.h> before any preprocessor test of _POSIX_VERSION. */
#if HAVE_UNISTD_H
# include <unistd.h>
#endif
/* Declare make device, major and minor. Since major is a function on
SVR4, we have to resort to GOT_MAJOR instead of just testing if
major is #define'd. */
#if MAJOR_IN_MKDEV
# include <sys/mkdev.h>
# define GOT_MAJOR
#endif
#if MAJOR_IN_SYSMACROS
# include <sys/sysmacros.h>
# define GOT_MAJOR
#endif
/* Some <sys/types.h> defines the macros. */
#ifdef major
# define GOT_MAJOR
#endif
#ifndef GOT_MAJOR
# if MSDOS
# define major(Device) (Device)
# define minor(Device) (Device)
# define makedev(Major, Minor) (((Major) << 8) | (Minor))
# define GOT_MAJOR
# endif
#endif
/* For HP-UX before HP-UX 8, major/minor are not in <sys/sysmacros.h>. */
#ifndef GOT_MAJOR
# if defined(hpux) || defined(__hpux__) || defined(__hpux)
# include <sys/mknod.h>
# define GOT_MAJOR
# endif
#endif
#ifndef GOT_MAJOR
# define major(Device) (((Device) >> 8) & 0xff)
# define minor(Device) ((Device) & 0xff)
# define makedev(Major, Minor) (((Major) << 8) | (Minor))
#endif
#undef GOT_MAJOR
/* Declare directory reading routines and structures. */
#if __TURBOC__
# include "msd_dir.h"
# define NAMLEN(dirent) ((dirent)->d_namlen)
#else
# if HAVE_DIRENT_H
# include <dirent.h>
# define NAMLEN(dirent) (strlen((dirent)->d_name))
# else
# define dirent direct
# define NAMLEN(dirent) ((dirent)->d_namlen)
# if HAVE_SYS_NDIR_H
# include <sys/ndir.h>
# endif
# if HAVE_SYS_DIR_H
# include <sys/dir.h>
# endif
# if HAVE_NDIR_H
# include <ndir.h>
# endif
# endif
#endif
/* Declare wait status. */
#if HAVE_SYS_WAIT_H
# include <sys/wait.h>
#endif
#if HAVE_UNION_WAIT
# define WAIT_T union wait
# ifndef WTERMSIG
# define WTERMSIG(Status) ((Status).w_termsig)
# endif
# ifndef WCOREDUMP
# define WCOREDUMP(Status) ((Status).w_coredump)
# endif
# ifndef WEXITSTATUS
# define WEXITSTATUS(Status) ((Status).w_retcode)
# endif
#else
# define WAIT_T int
# ifndef WTERMSIG
# define WTERMSIG(Status) ((Status) & 0x7f)
# endif
# ifndef WCOREDUMP
# define WCOREDUMP(Status) ((Status) & 0x80)
# endif
# ifndef WEXITSTATUS
# define WEXITSTATUS(Status) (((Status) >> 8) & 0xff)
# endif
#endif
#ifndef WIFSTOPPED
# define WIFSTOPPED(Status) (WTERMSIG(Status) == 0x7f)
#endif
#ifndef WIFSIGNALED
# define WIFSIGNALED(Status) (WTERMSIG(Status) != 0)
#endif
#ifndef WIFEXITED
# define WIFEXITED(Status) (WTERMSIG(Status) == 0)
#endif
/* FIXME: It is wrong to use BLOCKSIZE for buffers when the logical block
size is greater than 512 bytes; so ST_BLKSIZE code below, in preparation
for some cleanup in this area, later. */
/* Get or fake the disk device blocksize. Usually defined by sys/param.h
(if at all). */
#if !defined(DEV_BSIZE) && defined(BSIZE)
# define DEV_BSIZE BSIZE
#endif
#if !defined(DEV_BSIZE) && defined(BBSIZE) /* SGI */
# define DEV_BSIZE BBSIZE
#endif
#ifndef DEV_BSIZE
# define DEV_BSIZE 4096
#endif
/* Extract or fake data from a `struct stat'. ST_BLKSIZE gives the
optimal I/O blocksize for the file, in bytes. Some systems, like
Sequents, return st_blksize of 0 on pipes. */
#if !HAVE_ST_BLKSIZE
# define ST_BLKSIZE(Statbuf) DEV_BSIZE
#else
# define ST_BLKSIZE(Statbuf) \
((Statbuf).st_blksize > 0 ? (Statbuf).st_blksize : DEV_BSIZE)
#endif
/* Extract or fake data from a `struct stat'. ST_NBLOCKS gives the
number of 512-byte blocks in the file (including indirect blocks).
fileblocks.c uses BSIZE. HP-UX counts st_blocks in 1024-byte units,
this loses when mixing HP-UX and BSD filesystems with NFS. AIX PS/2
counts st_blocks in 4K units. */
#if !HAVE_ST_BLOCKS
# if defined(_POSIX_SOURCE) || !defined(BSIZE)
# define ST_NBLOCKS(Statbuf) (((Statbuf).st_size + 512 - 1) / 512)
# else
# define ST_NBLOCKS(Statbuf) (st_blocks ((Statbuf).st_size))
# endif
#else
# if defined(hpux) || defined(__hpux__) || defined(__hpux)
# define ST_NBLOCKS(Statbuf) ((Statbuf).st_blocks * 2)
# else
# if defined(_AIX) && defined(_I386)
# define ST_NBLOCKS(Statbuf) ((Statbuf).st_blocks * 8)
# else
# define ST_NBLOCKS(Statbuf) ((Statbuf).st_blocks)
# endif
# endif
#endif
/* This is a real challenge to properly get MTIO* symbols :-(. ISC uses
<sys/gentape.h>. SCO and BSDi uses <sys/tape.h>; BSDi also requires
<sys/tprintf.h> and <sys/device.h> for defining tp_dev and tpr_t. It
seems that the rest use <sys/mtio.h>, which itself requires other files,
depending on systems. Pyramid defines _IOW in <sgtty.h>, for example. */
#if HAVE_SYS_GENTAPE_H
# include <sys/gentape.h>
#else
# if HAVE_SYS_TAPE_H
# if HAVE_SYS_DEVICE_H
# include <sys/device.h>
# endif
# if HAVE_SYS_BUF_H
# include <sys/buf.h>
# endif
# if HAVE_SYS_TPRINTF_H
# include <sys/tprintf.h>
# endif
# include <sys/tape.h>
# else
# if HAVE_SYS_MTIO_H
# include <sys/ioctl.h>
# if HAVE_SGTTY_H
# include <sgtty.h>
# endif
# if HAVE_SYS_IO_TRIOCTL_H
# include <sys/io/trioctl.h>
# endif
# include <sys/mtio.h>
# endif
# endif
#endif
/* Declare standard functions. */
#if STDC_HEADERS
# include <stdlib.h>
#else
voidstar malloc ();
voidstar realloc ();
# if HAVE_GETCWD
char *getcwd ();
# endif
char *getenv ();
#endif
#include <stdio.h>
#ifndef _POSIX_VERSION
# if MSDOS
# include <io.h>
# else
off_t lseek ();
# endif
#endif
#include <pathmax.h>
#if WITH_DMALLOC
# undef HAVE_VALLOC
# define DMALLOC_FUNC_CHECK
# include <dmalloc.h>
#endif
/* Prototypes for external functions. */
#ifndef PARAMS
# if PROTOTYPES
# define PARAMS(Args) Args
# else
# define PARAMS(Args) ()
# endif
#endif
#if HAVE_LOCALE_H
# include <locale.h>
#endif
#if !HAVE_SETLOCALE
# define setlocale(Category, Locale)
#endif
#if ENABLE_NLS
# include <libintl.h>
# define _(Text) gettext (Text)
#else
# define bindtextdomain(Domain, Directory)
# define textdomain(Domain)
# define _(Text) Text
#endif
#define N_(Text) Text
/* Library modules. */
#include "error.h"
#if !HAVE_STRSTR
char *strstr PARAMS ((const char *, const char *));
#endif
#if HAVE_VALLOC
# ifndef valloc
voidstar valloc PARAMS ((size_t));
# endif
#else
# define valloc(Size) malloc (Size)
#endif
voidstar xmalloc PARAMS ((size_t));
voidstar xrealloc PARAMS ((voidstar, size_t));
char *xstrdup PARAMS ((const char *));

3086
src/tar.c

File diff suppressed because it is too large Load Diff

200
src/tar.h
View File

@@ -1,9 +1,11 @@
/* Format of tar archives.
Copyright (C) 1988, 92, 93, 94, 96, 97 Free Software Foundation, Inc.
/* GNU tar Archive Format description.
Copyright (C) 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
2000, 2001, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any later
Free Software Foundation; either version 3, or (at your option) any later
version.
This program is distributed in the hope that it will be useful, but
@@ -13,20 +15,7 @@
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/* GNU tar Archive Format description. */
/* If OLDGNU_COMPATIBILITY is not zero, tar produces archives which, by
default, are readable by older versions of GNU tar. This can be
overriden by using --posix; in this case, POSIXLY_CORRECT in environment
may be set for enforcing stricter conformance. If OLDGNU_COMPATIBILITY
is zero or undefined, tar will eventually produces archives which, by
default, POSIX compatible; then either using --posix or defining
POSIXLY_CORRECT enforces stricter conformance.
This #define will disappear in a few years. FP, June 1995. */
#define OLDGNU_COMPATIBILITY 1
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
/* tar Header Block, from POSIX 1003.1-1990. */
@@ -69,6 +58,10 @@ struct posix_header
#define FIFOTYPE '6' /* FIFO special */
#define CONTTYPE '7' /* reserved */
#define XHDTYPE 'x' /* Extended header referring to the
next file in the archive */
#define XGLTYPE 'g' /* Global extended header */
/* Bits used in the mode field, values in octal. */
#define TSUID 04000 /* set UID on execution */
#define TSGID 02000 /* set GID on execution */
@@ -122,26 +115,6 @@ struct sparse
#define SPARSES_IN_OLDGNU_HEADER 4
#define SPARSES_IN_SPARSE_HEADER 21
/* The GNU extra header contains some information GNU tar needs, but not
foreseen in POSIX header format. It is only used after a POSIX header
(and never with old GNU headers), and immediately follows this POSIX
header, when typeflag is a letter rather than a digit, so signaling a GNU
extension. */
struct extra_header
{ /* byte offset */
char atime[12]; /* 0 */
char ctime[12]; /* 12 */
char offset[12]; /* 24 */
char realsize[12]; /* 36 */
char longnames[4]; /* 48 */
char unused_pad1[68]; /* 52 */
struct sparse sp[SPARSES_IN_EXTRA_HEADER];
/* 120 */
char isextended; /* 504 */
/* 505 */
};
/* Extension header for sparse files, used immediately after the GNU extra
header, and used only if all sparse information cannot fit into that
extra header. There might even be many such extension headers, one after
@@ -166,15 +139,17 @@ struct sparse_header
struct oldgnu_header
{ /* byte offset */
char unused_pad1[345]; /* 0 */
char atime[12]; /* 345 */
char ctime[12]; /* 357 */
char offset[12]; /* 369 */
char longnames[4]; /* 381 */
char atime[12]; /* 345 Incr. archive: atime of the file */
char ctime[12]; /* 357 Incr. archive: ctime of the file */
char offset[12]; /* 369 Multivolume archive: the offset of
the start of this volume */
char longnames[4]; /* 381 Not used */
char unused_pad2; /* 385 */
struct sparse sp[SPARSES_IN_OLDGNU_HEADER];
/* 386 */
char isextended; /* 482 */
char realsize[12]; /* 483 */
char isextended; /* 482 Sparse file: Extension sparse header
follows */
char realsize[12]; /* 483 Sparse file: Real size*/
/* 495 */
};
@@ -185,7 +160,13 @@ struct oldgnu_header
#define OLDGNU_MAGIC "ustar " /* 7 chars and a null */
/* The standards committee allows only capital A through capital Z for
user-defined expansion. */
user-defined expansion. Other letters in use include:
'A' Solaris Access Control List
'E' Solaris Extended Attribute File
'I' Inode only, as in 'star'
'N' Obsolete GNU tar, for file names that do not fit into the main header.
'X' POSIX 1003.1-2001 eXtended (VU version) */
/* This is a dir entry that contains the names of files that were in the
dir at the time the dump was made. */
@@ -200,15 +181,68 @@ struct oldgnu_header
/* This is the continuation of a file that began on another volume. */
#define GNUTYPE_MULTIVOL 'M'
/* For storing filenames that do not fit into the main header. */
#define GNUTYPE_NAMES 'N'
/* This is for sparse files. */
#define GNUTYPE_SPARSE 'S'
/* This file is a tape/volume header. Ignore it on extraction. */
#define GNUTYPE_VOLHDR 'V'
/* Solaris extended header */
#define SOLARIS_XHDTYPE 'X'
/* J@"org Schilling star header */
struct star_header
{ /* byte offset */
char name[100]; /* 0 */
char mode[8]; /* 100 */
char uid[8]; /* 108 */
char gid[8]; /* 116 */
char size[12]; /* 124 */
char mtime[12]; /* 136 */
char chksum[8]; /* 148 */
char typeflag; /* 156 */
char linkname[100]; /* 157 */
char magic[6]; /* 257 */
char version[2]; /* 263 */
char uname[32]; /* 265 */
char gname[32]; /* 297 */
char devmajor[8]; /* 329 */
char devminor[8]; /* 337 */
char prefix[131]; /* 345 */
char atime[12]; /* 476 */
char ctime[12]; /* 488 */
/* 500 */
};
#define SPARSES_IN_STAR_HEADER 4
#define SPARSES_IN_STAR_EXT_HEADER 21
struct star_in_header
{
char fill[345]; /* 0 Everything that is before t_prefix */
char prefix[1]; /* 345 t_name prefix */
char fill2; /* 346 */
char fill3[8]; /* 347 */
char isextended; /* 355 */
struct sparse sp[SPARSES_IN_STAR_HEADER]; /* 356 */
char realsize[12]; /* 452 Actual size of the file */
char offset[12]; /* 464 Offset of multivolume contents */
char atime[12]; /* 476 */
char ctime[12]; /* 488 */
char mfill[8]; /* 500 */
char xmagic[4]; /* 508 "tar" */
};
struct star_ext_header
{
struct sparse sp[SPARSES_IN_STAR_EXT_HEADER];
char isextended;
};
/* END */
/* tar Header Block, overall structure. */
/* tar files are made in basic blocks of this size. */
@@ -219,17 +253,79 @@ enum archive_format
DEFAULT_FORMAT, /* format to be decided later */
V7_FORMAT, /* old V7 tar format */
OLDGNU_FORMAT, /* GNU format as per before tar 1.12 */
POSIX_FORMAT, /* restricted, pure POSIX format */
GNU_FORMAT /* POSIX format with GNU extensions */
USTAR_FORMAT, /* POSIX.1-1988 (ustar) format */
POSIX_FORMAT, /* POSIX.1-2001 format */
STAR_FORMAT, /* Star format defined in 1994 */
GNU_FORMAT /* Same as OLDGNU_FORMAT with one exception:
see FIXME note for to_chars() function
(create.c:189) */
};
/* Information about a sparse file. */
struct sp_array
{
off_t offset;
size_t numbytes;
};
struct xheader
{
struct obstack *stk;
size_t size;
char *buffer;
uintmax_t string_length;
};
struct tar_stat_info
{
char *orig_file_name; /* name of file read from the archive header */
char *file_name; /* name of file for the current archive entry
after being normalized. */
bool had_trailing_slash; /* true if the current archive entry had a
trailing slash before it was normalized. */
char *link_name; /* name of link for the current archive entry. */
char *uname; /* user name of owner */
char *gname; /* group name of owner */
struct stat stat; /* regular filesystem stat */
/* STAT doesn't always have access, data modification, and status
change times in a convenient form, so store them separately. */
struct timespec atime;
struct timespec mtime;
struct timespec ctime;
off_t archive_file_size; /* Size of file as stored in the archive.
Equals stat.st_size for non-sparse files */
bool is_sparse; /* Is the file sparse */
/* For sparse files: */
unsigned sparse_major;
unsigned sparse_minor;
size_t sparse_map_avail; /* Index to the first unused element in
sparse_map array. Zero if the file is
not sparse */
size_t sparse_map_size; /* Size of the sparse map */
struct sp_array *sparse_map;
/* Extended headers */
struct xheader xhdr;
/* For dumpdirs */
bool is_dumpdir; /* Is the member a dumpdir? */
bool skipped; /* The member contents is already read
(for GNUTYPE_DUMPDIR) */
char *dumpdir; /* Contents of the dump directory */
};
union block
{
char buffer[BLOCKSIZE];
struct posix_header header;
struct extra_header extra_header;
struct star_header star_header;
struct oldgnu_header oldgnu_header;
struct sparse_header sparse_header;
struct star_in_header star_in_header;
struct star_ext_header star_ext_header;
};
/* End of Format description. */

Some files were not shown because too many files have changed in this diff Show More