From: Sergey Poznyakoff Date: Thu, 4 Sep 2003 13:58:42 +0000 (+0000) Subject: Fixed deletion from the POSIX archives. X-Git-Url: https://git.dogcows.com/gitweb?a=commitdiff_plain;h=08780d289dad01bd13e62c70e6de65b15ab650f4;p=chaz%2Ftar Fixed deletion from the POSIX archives. --- diff --git a/src/delete.c b/src/delete.c index a854adc..8b4c1b2 100644 --- a/src/delete.c +++ b/src/delete.c @@ -132,6 +132,21 @@ write_recent_blocks (union block *h, size_t blocks) } } +static void +write_recent_bytes (char *data, size_t bytes) +{ + size_t blocks = bytes / BLOCKSIZE; + size_t rest = bytes - blocks * BLOCKSIZE; + + write_recent_blocks ((union block *)data, blocks); + memcpy (new_record[new_blocks].buffer, data + blocks * BLOCKSIZE, rest); + if (rest < BLOCKSIZE) + memset (new_record[new_blocks].buffer + rest, 0, BLOCKSIZE - rest); + new_blocks++; + if (new_blocks == blocking_factor) + write_record (1); +} + void delete_archive_members (void) { @@ -240,7 +255,10 @@ delete_archive_members (void) if (current_block == record_end) flush_archive (); status = read_header (false); - + + if (extended_header.size) + xheader_decode (¤t_stat_info); + if (status == HEADER_ZERO_BLOCK && ignore_zeros_option) { set_next_block_after (current_header); @@ -280,8 +298,16 @@ delete_archive_members (void) /* Copy header. */ - write_recent_blocks (recent_long_name, recent_long_name_blocks); - write_recent_blocks (recent_long_link, recent_long_link_blocks); + if (extended_header.size) + { + write_recent_bytes (extended_header.buffer, + extended_header.size); + } + else + { + write_recent_blocks (recent_long_name, recent_long_name_blocks); + write_recent_blocks (recent_long_link, recent_long_link_blocks); + } new_record[new_blocks] = *current_header; new_blocks++; blocks_to_keep