Commit Graph

1018 Commits

Author SHA1 Message Date
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
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
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
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
ef9ad717ba * src/xheader.c (strtoimax, strtoumax): Remove decls; now done
in system.h.
2005-11-06 22:48:34 +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
9684c2728d (diff_dumpdir): Pass a valid device number to get_directory_contents. 2005-10-28 09:28:20 +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
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
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
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
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
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
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
220ffceb44 (read_directory_file): Use strtoumax to read snapshot file contents. 2005-08-17 14:51:50 +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
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
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
d9045bf409 (size_decoder): Do not set archive_file_size 2005-06-23 09:51:05 +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
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
c6cde895e3 (dump_file0): Check for is_avoided_name() first. Fixes bug reported by Martin Lohmeier 2005-06-13 19:09:45 +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