(expand_sparse): use ftruncate to handle the trailing hole

This commit is contained in:
Sergey Poznyakoff
2007-01-19 15:41:55 +00:00
parent 8c90bf0414
commit 868ee74028

View File

@@ -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);