X-Git-Url: https://git.cworth.org/git?p=tar;a=blobdiff_plain;f=src%2Flist.c;h=fabe8b382725f76c368c581ce5a74b1ad17f4d98;hp=6dbc439a0c61580b74a73d11efb671467381652a;hb=de7372b23c3da92fbfaea2d1ac592f0b2ba87914;hpb=fbbfb9406a82e647ce27b6462b11a802fa48f31a diff --git a/src/list.c b/src/list.c index 6dbc439..fabe8b3 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); @@ -78,7 +92,7 @@ read_and (void (*do_something) (void)) prev_status = status; tar_stat_destroy (¤t_stat_info); - status = read_header (¤t_header, ¤t_stat_info, + status = read_header (¤t_header, ¤t_stat_info, read_header_auto); switch (status) { @@ -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; } @@ -140,7 +153,7 @@ read_and (void (*do_something) (void)) { char buf[UINTMAX_STRSIZE_BOUND]; - status = read_header (¤t_header, ¤t_stat_info, + status = read_header (¤t_header, ¤t_stat_info, read_header_auto); if (status == HEADER_ZERO_BLOCK) break; @@ -218,8 +231,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); @@ -504,18 +515,18 @@ decode_xform (char *file_name, void *data) links subject to filename transformation. In the absence of another solution, symbolic links are exempt from component stripping and name suffix normalization, but subject to filename transformation - proper. */ + proper. */ return file_name; - + case XFORM_LINK: file_name = safer_name_suffix (file_name, true, absolute_names_option); break; - + case XFORM_REGFILE: file_name = safer_name_suffix (file_name, false, absolute_names_option); break; } - + if (strip_name_components) { size_t prefix_len = stripped_prefix_len (file_name, @@ -527,7 +538,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); @@ -555,7 +566,7 @@ decode_header (union block *header, struct tar_stat_info *stat_info, enum archive_format format; unsigned hbits; /* high bits of the file mode. */ mode_t mode = MODE_FROM_HEADER (header->header.mode, &hbits); - + if (strcmp (header->header.magic, TMAGIC) == 0) { if (header->star_header.prefix[130] == 0 @@ -653,13 +664,17 @@ decode_header (union block *header, struct tar_stat_info *stat_info, stat_info->is_dumpdir = true; } + if (header->header.typeflag == GNUTYPE_VOLHDR) + /* Name transformations don't apply to volume headers. */ + return; + transform_member_name (&stat_info->file_name, XFORM_REGFILE); switch (header->header.typeflag) { case SYMTYPE: transform_member_name (&stat_info->link_name, XFORM_SYMLINK); break; - + case LNKTYPE: transform_member_name (&stat_info->link_name, XFORM_LINK); } @@ -885,7 +900,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", @@ -894,7 +909,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", @@ -902,7 +917,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", @@ -912,7 +927,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", @@ -943,14 +958,7 @@ off_from_header (const char *p, size_t s) (uintmax_t) TYPE_MAXIMUM (off_t), false, false); } -size_t -size_from_header (const char *p, size_t s) -{ - return from_header (p, s, "size_t", (uintmax_t) 0, - (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", @@ -958,7 +966,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", @@ -1154,7 +1162,7 @@ simple_print_header (struct tar_stat_info *st, union block *blk, /* Time stamp. */ - time_stamp = tartime (st->mtime, false); + time_stamp = tartime (st->mtime, full_time_option); time_stamp_len = strlen (time_stamp); if (datewidth < time_stamp_len) datewidth = time_stamp_len; @@ -1300,8 +1308,8 @@ simple_print_header (struct tar_stat_info *st, union block *blk, } -void -print_volume_label () +static void +print_volume_label (void) { struct tar_stat_info vstat; union block vblk; @@ -1364,7 +1372,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) { @@ -1399,7 +1407,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); @@ -1420,22 +1428,23 @@ test_archive_label () if (read_header (¤t_header, ¤t_stat_info, read_header_auto) == HEADER_SUCCESS) { - char *s = NULL; - decode_header (current_header, ¤t_stat_info, ¤t_format, 0); if (current_header->header.typeflag == GNUTYPE_VOLHDR) assign_string (&volume_label, current_header->header.name); - if (volume_label - && (name_match (volume_label) - || (multi_volume_option - && (s = drop_volume_label_suffix (volume_label)) - && name_match (s)))) - if (verbose_option) - print_volume_label (); - free (s); + if (volume_label) + { + if (verbose_option) + print_volume_label (); + if (!name_match (volume_label) && multi_volume_option) + { + char *s = drop_volume_label_suffix (volume_label); + name_match (s); + free (s); + } + } } close_archive (); - names_notfound (); + label_notfound (); }