X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=scripts%2Fxsparse.c;h=c77c3f5ced78b0e1c96baf816726cdf754d59876;hb=b216fed6340d073d33351145be033ecc5b903c7a;hp=87fad1a9dd82ef6fdcf4c78d21989c8618be8d89;hpb=85a4e0fdebf2358a4d30da9d8f889fd63e6c6823;p=chaz%2Ftar diff --git a/scripts/xsparse.c b/scripts/xsparse.c index 87fad1a..c77c3f5 100644 --- a/scripts/xsparse.c +++ b/scripts/xsparse.c @@ -1,13 +1,13 @@ /* xsparse - expands compressed sparse file images extracted from GNU tar archives. - Copyright (C) 2006 Free Software Foundation, Inc. + Copyright (C) 2006, 2007 Free Software Foundation, Inc. Written by Sergey Poznyakoff 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 @@ -302,15 +302,20 @@ expand_sparse (FILE *sfp, int ofd) { size_t size = sparse_map[i].numbytes; - lseek (ofd, sparse_map[i].offset, SEEK_SET); - while (size) + if (size == 0) + ftruncate (ofd, sparse_map[i].offset); + else { - size_t rdsize = (size < maxbytes) ? size : maxbytes; - if (rdsize != fread (buffer, 1, rdsize, sfp)) - die (1, "read error (%d)", errno); - if (rdsize != write (ofd, buffer, rdsize)) - die (1, "write error (%d)", errno); - size -= rdsize; + lseek (ofd, sparse_map[i].offset, SEEK_SET); + while (size) + { + size_t rdsize = (size < maxbytes) ? size : maxbytes; + if (rdsize != fread (buffer, 1, rdsize, sfp)) + die (1, "read error (%d)", errno); + if (rdsize != write (ofd, buffer, rdsize)) + die (1, "write error (%d)", errno); + size -= rdsize; + } } } free (buffer);