X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=scripts%2Fxsparse.c;h=c77c3f5ced78b0e1c96baf816726cdf754d59876;hb=969d2b986b5848fe3d20003ea268690c12ae2ed3;hp=2728bbce22d919522e855c81982e778a0a6fa94f;hpb=bf5ba3dbefa4878d712b83ea16c95220c2197417;p=chaz%2Ftar diff --git a/scripts/xsparse.c b/scripts/xsparse.c index 2728bbc..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 @@ -23,7 +23,6 @@ #include #include #include -#include #include #include #include @@ -303,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);