X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Flist.c;h=f0d3d5a5a3fe09e4828b0b6e5c64de30ea66caa0;hb=57b11473b0135b1e092cf045f94635c934c7c63f;hp=dad725a82f35a6040e799aece139d765c99fc1b2;hpb=f6edb92580aa886a2a0189463c19189a050dc62d;p=chaz%2Ftar diff --git a/src/list.c b/src/list.c index dad725a..f0d3d5a 100644 --- a/src/list.c +++ b/src/list.c @@ -35,6 +35,20 @@ size_t recent_long_name_blocks; /* number of blocks in recent_long_name */ size_t recent_long_link_blocks; /* likewise, for long link */ union block *recent_global_header; /* Recent global header block */ +#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, hbits) \ + mode_from_header (where, sizeof (where), hbits) +#define TIME_FROM_HEADER(where) time_from_header (where, sizeof (where)) +#define UID_FROM_HEADER(where) uid_from_header (where, sizeof (where)) + +static gid_t gid_from_header (const char *buf, size_t size); +static major_t major_from_header (const char *buf, size_t size); +static minor_t minor_from_header (const char *buf, size_t size); +static mode_t mode_from_header (const char *buf, size_t size, unsigned *hbits); +static time_t time_from_header (const char *buf, size_t size); +static uid_t uid_from_header (const char *buf, size_t size); static uintmax_t from_header (const char *, size_t, const char *, uintmax_t, uintmax_t, bool, bool); @@ -90,7 +104,8 @@ read_and (void (*do_something) (void)) /* Valid header. We should decode next field (mode) first. Ensure incoming names are null terminated. */ - + decode_header (current_header, ¤t_stat_info, + ¤t_format, 1); if (! name_match (current_stat_info.file_name) || (NEWER_OPTION_INITIALIZED (newer_mtime_option) /* FIXME: We get mtime now, and again later; this causes @@ -116,8 +131,6 @@ read_and (void (*do_something) (void)) quotearg_colon (current_stat_info.file_name))); /* Fall through. */ default: - decode_header (current_header, - ¤t_stat_info, ¤t_format, 0); skip_member (); continue; } @@ -210,8 +223,6 @@ list_archive (void) off_t block_ordinal = current_block_ordinal (); /* Print the header block. */ - - decode_header (current_header, ¤t_stat_info, ¤t_format, 0); if (verbose_option) print_header (¤t_stat_info, current_header, block_ordinal); @@ -519,7 +530,7 @@ decode_xform (char *file_name, void *data) return file_name; } -bool +static bool transform_member_name (char **pinput, int type) { return transform_name_fp (pinput, type, decode_xform, &type); @@ -877,7 +888,7 @@ from_header (char const *where0, size_t digs, char const *type, return -1; } -gid_t +static gid_t gid_from_header (const char *p, size_t s) { return from_header (p, s, "gid_t", @@ -886,7 +897,7 @@ gid_from_header (const char *p, size_t s) false, false); } -major_t +static major_t major_from_header (const char *p, size_t s) { return from_header (p, s, "major_t", @@ -894,7 +905,7 @@ major_from_header (const char *p, size_t s) (uintmax_t) TYPE_MAXIMUM (major_t), false, false); } -minor_t +static minor_t minor_from_header (const char *p, size_t s) { return from_header (p, s, "minor_t", @@ -904,7 +915,7 @@ minor_from_header (const char *p, size_t s) /* Convert P to the file mode, as understood by tar. Store unrecognized mode bits (from 10th up) in HBITS. */ -mode_t +static mode_t mode_from_header (const char *p, size_t s, unsigned *hbits) { unsigned u = from_header (p, s, "mode_t", @@ -942,7 +953,7 @@ size_from_header (const char *p, size_t s) (uintmax_t) TYPE_MAXIMUM (size_t), false, false); } -time_t +static time_t time_from_header (const char *p, size_t s) { return from_header (p, s, "time_t", @@ -950,7 +961,7 @@ time_from_header (const char *p, size_t s) (uintmax_t) TYPE_MAXIMUM (time_t), false, false); } -uid_t +static uid_t uid_from_header (const char *p, size_t s) { return from_header (p, s, "uid_t", @@ -1356,7 +1367,7 @@ skip_file (off_t size) { union block *x; - /* FIXME: Make sure mv_begin is always called before it */ + /* FIXME: Make sure mv_begin_read is always called before it */ if (seekable_archive) { @@ -1391,7 +1402,7 @@ skip_member (void) char save_typeflag = current_header->header.typeflag; set_next_block_after (current_header); - mv_begin (¤t_stat_info); + mv_begin_read (¤t_stat_info); if (current_stat_info.is_sparse) sparse_skip_file (¤t_stat_info);