X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Fsparse.c;h=93aee99ed63ae49a3301aa2b4ea17fdff512a6cb;hb=586c684815d71063cb39670f2398b5261de91ed5;hp=f2d9f58bf407ed642d66ffa1373e211e1fd6f927;hpb=4b3dd17c002c2499c60c957780db10011805f015;p=chaz%2Ftar diff --git a/src/sparse.c b/src/sparse.c index f2d9f58..93aee99 100644 --- a/src/sparse.c +++ b/src/sparse.c @@ -1,6 +1,6 @@ /* 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 @@ -409,15 +409,6 @@ sparse_dump_file (int fd, struct tar_stat_info *st) return (tar_sparse_done (&file) && rc) ? dump_status_ok : dump_status_short; } -/* Returns true if the file represented by stat is a sparse one */ -bool -sparse_file_p (struct tar_stat_info *st) -{ - return (ST_NBLOCKS (st->stat) - < (st->stat.st_size / ST_NBLOCKSIZE - + (st->stat.st_size % ST_NBLOCKSIZE != 0))); -} - bool sparse_member_p (struct tar_stat_info *st) { @@ -475,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; } @@ -1023,6 +1014,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); @@ -1113,7 +1105,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; \ } \ @@ -1124,6 +1117,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);