Browse Source

(expand_sparse): use ftruncate to handle the trailing hole

Sergey Poznyakoff 18 years ago
parent
commit
868ee74028
1 changed files with 14 additions and 9 deletions
  1. 14 9
      scripts/xsparse.c

+ 14 - 9
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);