X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fsparse.c;h=9fde5080d5304a32253fd67d72e1a99a0c69bf56;hb=01c4475b17bf80cc04e6927b809190f2956e2f89;hp=8d1ff9071ae5a96463b01321325a0b779b547060;hpb=ea9e2d8d8ed26b201c0bef9136014216983d3e8f;p=chaz%2Ftar diff --git a/src/sparse.c b/src/sparse.c index 8d1ff90..9fde508 100644 --- a/src/sparse.c +++ b/src/sparse.c @@ -1,10 +1,10 @@ /* Functions for dealing with sparse files - Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. + Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2, or (at your option) any later + Free Software Foundation; either version 3, or (at your option) any later version. This program is distributed in the hope that it will be useful, but @@ -466,7 +466,7 @@ sparse_skip_file (struct tar_stat_info *st) file.fd = -1; rc = tar_sparse_decode_header (&file); - skip_file (file.stat_info->archive_file_size); + skip_file (file.stat_info->archive_file_size - file.dumped_size); return (tar_sparse_done (&file) && rc) ? dump_status_ok : dump_status_short; } @@ -945,16 +945,19 @@ pax_dump_header_0 (struct tar_sparse_file *file) file->stat_info->file_name = xheader_format_name (file->stat_info, "%d/GNUSparseFile.%p/%f", 0); - xheader_string_begin (); + xheader_string_begin (&file->stat_info->xhdr); for (i = 0; i < file->stat_info->sparse_map_avail; i++) { if (i) - xheader_string_add (","); - xheader_string_add (umaxtostr (map[i].offset, nbuf)); - xheader_string_add (","); - xheader_string_add (umaxtostr (map[i].numbytes, nbuf)); + xheader_string_add (&file->stat_info->xhdr, ","); + xheader_string_add (&file->stat_info->xhdr, + umaxtostr (map[i].offset, nbuf)); + xheader_string_add (&file->stat_info->xhdr, ","); + xheader_string_add (&file->stat_info->xhdr, + umaxtostr (map[i].numbytes, nbuf)); } - if (!xheader_string_end ("GNU.sparse.map")) + if (!xheader_string_end (&file->stat_info->xhdr, + "GNU.sparse.map")) { free (file->stat_info->file_name); file->stat_info->file_name = save_file_name; @@ -1014,6 +1017,7 @@ pax_dump_header_1 (struct tar_sparse_file *file) } size = (size + BLOCKSIZE - 1) / BLOCKSIZE; file->stat_info->archive_file_size += size * BLOCKSIZE; + file->dumped_size += size * BLOCKSIZE; /* Store sparse file identification */ xheader_store ("GNU.sparse.major", file->stat_info, NULL); @@ -1104,7 +1108,8 @@ pax_decode_header (struct tar_sparse_file *file) if (src == endp) \ { \ set_next_block_after (b); \ - b = find_next_block (); \ + file->dumped_size += BLOCKSIZE; \ + b = find_next_block (); \ src = b->buffer; \ endp = b->buffer + BLOCKSIZE; \ } \ @@ -1115,6 +1120,7 @@ pax_decode_header (struct tar_sparse_file *file) } while (0) set_next_block_after (current_header); + file->dumped_size += BLOCKSIZE; blk = find_next_block (); p = blk->buffer; COPY_BUF (blk,nbuf,p);