X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=scripts%2Fxsparse.c;fp=scripts%2Fxsparse.c;h=99bb82a05ae805355d583b8d17270a534daac20d;hb=868ee7402884604c679ee13f6fe9772e05ba3ddd;hp=87fad1a9dd82ef6fdcf4c78d21989c8618be8d89;hpb=8c90bf0414ae2dce0c4b4e475d8576261fed1c6f;p=chaz%2Ftar diff --git a/scripts/xsparse.c b/scripts/xsparse.c index 87fad1a..99bb82a 100644 --- a/scripts/xsparse.c +++ b/scripts/xsparse.c @@ -1,7 +1,7 @@ /* 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 @@ -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);