X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fsparse.c;h=6a976763419e78a5d5041fe3a01046e787dccdc8;hb=e7c99a4dd16685012e42519f1b4fb2b37b19dec5;hp=9a9c2a82edefabe8584fcb9a7cb69dc3b7bf9bbb;hpb=df7b55a8f6354e30e8da62eec7f706df033d0c81;p=chaz%2Ftar diff --git a/src/sparse.c b/src/sparse.c index 9a9c2a8..6a97676 100644 --- a/src/sparse.c +++ b/src/sparse.c @@ -1,7 +1,6 @@ /* Functions for dealing with sparse files - Copyright (C) 2003, 2004, 2005, 2006, 2007, 2010 Free Software - Foundation, Inc. + Copyright 2003-2007, 2010, 2013-2014 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 @@ -14,8 +13,7 @@ Public License for more details. You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + with this program. If not, see . */ #include #include @@ -811,6 +809,7 @@ star_get_sparse_info (struct tar_sparse_file *file) set_next_block_after (h); for (i = 0; i < SPARSES_IN_STAR_EXT_HEADER && rc == add_ok; i++) rc = oldgnu_add_sparse (file, &h->star_ext_header.sp[i]); + file->dumped_size += BLOCKSIZE; } if (rc == add_fail) @@ -919,6 +918,18 @@ pax_sparse_member_p (struct tar_sparse_file *file) || file->stat_info->sparse_major > 0; } +/* Start a header that uses the effective (shrunken) file size. */ +static union block * +pax_start_header (struct tar_stat_info *st) +{ + off_t realsize = st->stat.st_size; + union block *blk; + st->stat.st_size = st->archive_file_size; + blk = start_header (st); + st->stat.st_size = realsize; + return blk; +} + static bool pax_dump_header_0 (struct tar_sparse_file *file) { @@ -968,9 +979,7 @@ pax_dump_header_0 (struct tar_sparse_file *file) return false; } } - blk = start_header (file->stat_info); - /* Store the effective (shrunken) file size */ - OFF_TO_CHARS (file->stat_info->archive_file_size, blk->header.size); + blk = pax_start_header (file->stat_info); finish_header (file->stat_info, blk, block_ordinal); if (save_file_name) { @@ -1035,9 +1044,7 @@ pax_dump_header_1 (struct tar_sparse_file *file) if (strlen (file->stat_info->file_name) > NAME_FIELD_SIZE) file->stat_info->file_name[NAME_FIELD_SIZE] = 0; - blk = start_header (file->stat_info); - /* Store the effective (shrunken) file size */ - OFF_TO_CHARS (file->stat_info->archive_file_size, blk->header.size); + blk = pax_start_header (file->stat_info); finish_header (file->stat_info, blk, block_ordinal); free (file->stat_info->file_name); file->stat_info->file_name = save_file_name;