X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fdelete.c;h=8b4c1b225c027860b538997edb0859f47c94fd4b;hb=75b511727c15f83976620c48cafeb0036d0087cd;hp=bb09af8154bac990a66c358786777e0bb19b2ad4;hpb=d858a433c82626309e0d974ca923a79ac7f7f18f;p=chaz%2Ftar diff --git a/src/delete.c b/src/delete.c index bb09af8..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) { @@ -150,7 +165,7 @@ delete_archive_members (void) do { - enum read_header status = read_header (1); + enum read_header status = read_header (true); switch (status) { @@ -189,6 +204,7 @@ delete_archive_members (void) /* Fall through. */ case HEADER_SUCCESS: + case HEADER_SUCCESS_EXTENDED: case HEADER_ZERO_BLOCK: ERROR ((0, 0, _("Skipping to next header"))); /* Fall through. */ @@ -238,8 +254,11 @@ delete_archive_members (void) if (current_block == record_end) flush_archive (); - status = read_header (0); - + 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); @@ -279,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