X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Flist.c;h=4bf302e6d629fbc57726ea9ac071483c009ad3a5;hb=137ebf41fd97baa7e4f2a66e0da0bdb182ca6f7b;hp=2d05873d846b327a3e91aa4e6452ebf9865d5b39;hpb=e86e864544a87003ac900d60135a3ca9424cfb95;p=chaz%2Ftar diff --git a/src/list.c b/src/list.c index 2d05873..4bf302e 100644 --- a/src/list.c +++ b/src/list.c @@ -107,7 +107,6 @@ read_and (void (*do_something) (void)) { case GNUTYPE_VOLHDR: case GNUTYPE_MULTIVOL: - case GNUTYPE_NAMES: break; case DIRTYPE: @@ -281,8 +280,8 @@ tar_checksum (union block *header, bool silent) } /* Read a block that's supposed to be a header block. Return its - address in "current_header", and if it is good, the file's size in - current_stat_info.stat.st_size. + address in "current_header", and if it is good, the file's size + and names (file name, link name) in *info. Return 1 for success, 0 if the checksum is bad, EOF on eof, 2 for a block full of zeros (EOF marker). @@ -294,7 +293,7 @@ tar_checksum (union block *header, bool silent) the header which this routine reads. */ enum read_header -read_header (bool raw_extended_headers) +read_header_primitive (bool raw_extended_headers, struct tar_stat_info *info) { union block *header; union block *header_copy; @@ -321,9 +320,9 @@ read_header (bool raw_extended_headers) /* Good block. Decode file size and return. */ if (header->header.typeflag == LNKTYPE) - current_stat_info.stat.st_size = 0; /* links 0 size on tape */ + info->stat.st_size = 0; /* links 0 size on tape */ else - current_stat_info.stat.st_size = OFF_FROM_HEADER (header->header.size); + info->stat.st_size = OFF_FROM_HEADER (header->header.size); if (header->header.typeflag == GNUTYPE_LONGNAME || header->header.typeflag == GNUTYPE_LONGLINK @@ -336,14 +335,13 @@ read_header (bool raw_extended_headers) else if (header->header.typeflag == GNUTYPE_LONGNAME || header->header.typeflag == GNUTYPE_LONGLINK) { - size_t name_size = current_stat_info.stat.st_size; + size_t name_size = info->stat.st_size; size_t n = name_size % BLOCKSIZE; size = name_size + BLOCKSIZE; if (n) size += BLOCKSIZE - n; - if (name_size != current_stat_info.stat.st_size - || size < name_size) + if (name_size != info->stat.st_size || size < name_size) xalloc_die (); header_copy = xmalloc (size + 1); @@ -434,9 +432,9 @@ read_header (bool raw_extended_headers) recent_long_name = 0; recent_long_name_blocks = 0; } - assign_string (¤t_stat_info.orig_file_name, name); - assign_string (¤t_stat_info.file_name, name); - current_stat_info.had_trailing_slash = strip_trailing_slashes (current_stat_info.file_name); + assign_string (&info->orig_file_name, name); + assign_string (&info->file_name, name); + info->had_trailing_slash = strip_trailing_slashes (info->file_name); if (recent_long_link) free (recent_long_link); @@ -455,13 +453,34 @@ read_header (bool raw_extended_headers) recent_long_link = 0; recent_long_link_blocks = 0; } - assign_string (¤t_stat_info.link_name, name); + assign_string (&info->link_name, name); return HEADER_SUCCESS; } } } +enum read_header +read_header (bool raw_extended_headers) +{ + return read_header_primitive (raw_extended_headers, ¤t_stat_info); +} + +static char * +decode_xform (char *file_name) +{ + file_name = safer_name_suffix (file_name, false, absolute_names_option); + if (strip_name_components) + { + size_t prefix_len = stripped_prefix_len (file_name, + strip_name_components); + if (prefix_len == (size_t) -1) + prefix_len = strlen (file_name); + file_name += prefix_len; + } + return file_name; +} + #define ISOCTAL(c) ((c)>='0'&&(c)<='7') /* Decode things from a file HEADER block into STAT_INFO, also setting @@ -579,6 +598,8 @@ decode_header (union block *header, struct tar_stat_info *stat_info, || stat_info->dumpdir) stat_info->is_dumpdir = true; } + + transform_name_fp (&stat_info->file_name, decode_xform); } /* Convert buffer at WHERE0 of size DIGS from external format to @@ -975,7 +996,7 @@ print_header (struct tar_stat_info *st, off_t block_ordinal) char modes[11]; char const *time_stamp; int time_stamp_len; - char *temp_name = st->orig_file_name ? st->orig_file_name : st->file_name; + char *temp_name; /* These hold formatted ints. */ char uform[UINTMAX_STRSIZE_BOUND], gform[UINTMAX_STRSIZE_BOUND]; @@ -989,21 +1010,8 @@ print_header (struct tar_stat_info *st, off_t block_ordinal) if (test_label_option && current_header->header.typeflag != GNUTYPE_VOLHDR) return; - if (show_stored_names_option) - { - switch (subcommand_option) - { - case CAT_SUBCOMMAND: - case UPDATE_SUBCOMMAND: - case APPEND_SUBCOMMAND: - case CREATE_SUBCOMMAND: - temp_name = st->file_name ? st->file_name : st->orig_file_name; - break; - - default: - temp_name = st->orig_file_name ? st->orig_file_name : st->file_name; - } - } + if (show_transformed_names_option) + temp_name = st->file_name ? st->file_name : st->orig_file_name; else temp_name = st->orig_file_name ? st->orig_file_name : st->file_name; @@ -1038,10 +1046,6 @@ print_header (struct tar_stat_info *st, off_t block_ordinal) modes[0] = 'M'; break; - case GNUTYPE_NAMES: - modes[0] = 'N'; - break; - case GNUTYPE_LONGNAME: case GNUTYPE_LONGLINK: modes[0] = 'L'; @@ -1225,10 +1229,6 @@ print_header (struct tar_stat_info *st, off_t block_ordinal) uintbuf)); fprintf (stdlis, _("--Continued at byte %s--\n"), size); break; - - case GNUTYPE_NAMES: - fprintf (stdlis, _("--Mangled file names--\n")); - break; } } fflush (stdlis);