X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Flist.c;h=5b06e80ecb9b7a27115fb5e5154934d25170918c;hb=eada0a9b35a9324daaf0efa8443646e28d5f9bb5;hp=850faeb1e2e584434616b7d04d6e5a9f7a25db95;hpb=53eec8f0391a945334bfcd8c898267ac18af1120;p=chaz%2Ftar diff --git a/src/list.c b/src/list.c index 850faeb..5b06e80 100644 --- a/src/list.c +++ b/src/list.c @@ -76,10 +76,11 @@ read_and (void (*do_something) (void)) while (1) { prev_status = status; - status = read_header (0); + status = read_header (false); switch (status) { case HEADER_STILL_UNREAD: + case HEADER_SUCCESS_EXTENDED: abort (); case HEADER_SUCCESS: @@ -159,6 +160,9 @@ read_and (void (*do_something) (void)) case HEADER_FAILURE: /* We are in the middle of a cascade of errors. */ break; + + case HEADER_SUCCESS_EXTENDED: + abort (); } continue; } @@ -175,12 +179,9 @@ list_archive (void) { /* Print the header block. */ + decode_header (current_header, ¤t_stat_info, ¤t_format, 0); if (verbose_option) - { - if (verbose_option > 1) - decode_header (current_header, ¤t_stat_info, ¤t_format, 0); - print_header (-1); - } + print_header (-1); if (incremental_option && current_header->header.typeflag == GNUTYPE_DUMPDIR) { @@ -319,72 +320,72 @@ read_header (bool raw_extended_headers) /* Good block. Decode file size and return. */ - if (header->header.typeflag == XHDTYPE - || header->header.typeflag == XGLTYPE) - { - xheader_read (header, OFF_FROM_HEADER (header->header.size)); - continue; - } - if (header->header.typeflag == LNKTYPE) current_stat_info.stat.st_size = 0; /* links 0 size on tape */ else current_stat_info.stat.st_size = OFF_FROM_HEADER (header->header.size); if (header->header.typeflag == GNUTYPE_LONGNAME - || header->header.typeflag == GNUTYPE_LONGLINK) + || header->header.typeflag == GNUTYPE_LONGLINK + || header->header.typeflag == XHDTYPE + || header->header.typeflag == XGLTYPE) { if (raw_extended_headers) return HEADER_SUCCESS_EXTENDED; - else + else if (header->header.typeflag == GNUTYPE_LONGNAME + || header->header.typeflag == GNUTYPE_LONGLINK) { size_t name_size = current_stat_info.stat.st_size; size = name_size - name_size % BLOCKSIZE + 2 * BLOCKSIZE; - if (name_size != current_stat_info.stat.st_size || size < name_size) + if (name_size != current_stat_info.stat.st_size + || size < name_size) xalloc_die (); - } - - header_copy = xmalloc (size + 1); - - if (header->header.typeflag == GNUTYPE_LONGNAME) - { - if (next_long_name) - free (next_long_name); - next_long_name = header_copy; - next_long_name_blocks = size / BLOCKSIZE; - } - else - { - if (next_long_link) - free (next_long_link); - next_long_link = header_copy; - next_long_link_blocks = size / BLOCKSIZE; - } - set_next_block_after (header); - *header_copy = *header; - bp = header_copy->buffer + BLOCKSIZE; - - for (size -= BLOCKSIZE; size > 0; size -= written) - { - data_block = find_next_block (); - if (! data_block) + header_copy = xmalloc (size + 1); + + if (header->header.typeflag == GNUTYPE_LONGNAME) { - ERROR ((0, 0, _("Unexpected EOF in archive"))); - break; + if (next_long_name) + free (next_long_name); + next_long_name = header_copy; + next_long_name_blocks = size / BLOCKSIZE; } - written = available_space_after (data_block); - if (written > size) - written = size; - - memcpy (bp, data_block->buffer, written); - bp += written; - set_next_block_after ((union block *) - (data_block->buffer + written - 1)); - } + else + { + if (next_long_link) + free (next_long_link); + next_long_link = header_copy; + next_long_link_blocks = size / BLOCKSIZE; + } + + set_next_block_after (header); + *header_copy = *header; + bp = header_copy->buffer + BLOCKSIZE; - *bp = '\0'; + for (size -= BLOCKSIZE; size > 0; size -= written) + { + data_block = find_next_block (); + if (! data_block) + { + ERROR ((0, 0, _("Unexpected EOF in archive"))); + break; + } + written = available_space_after (data_block); + if (written > size) + written = size; + + memcpy (bp, data_block->buffer, written); + bp += written; + set_next_block_after ((union block *) + (data_block->buffer + written - 1)); + } + *bp = '\0'; + } + else if (header->header.typeflag == XHDTYPE + || header->header.typeflag == XGLTYPE) + xheader_read (header, OFF_FROM_HEADER (header->header.size)); + /* Loop! */ }