]> Dogcows Code - chaz/tar/blobdiff - scripts/xsparse.c
tar: change interdir_made from int to bool
[chaz/tar] / scripts / xsparse.c
index 87fad1a9dd82ef6fdcf4c78d21989c8618be8d89..fd91b48726c2b75a71367c3271d6742610f89ae3 100644 (file)
@@ -1,13 +1,13 @@
 /* xsparse - expands compressed sparse file images extracted from GNU tar
    archives.
 
 /* 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
 
    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
    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
    version.
 
    This program is distributed in the hope that it will be useful, but
@@ -22,6 +22,7 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <stdarg.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <stdarg.h>
+#include <string.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include <sys/stat.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include <sys/stat.h>
@@ -128,12 +129,12 @@ get_var (FILE *fp, char **name, char **value)
   static char *buffer;
   static size_t bufsize = OFF_T_STRSIZE_BOUND;
   char *p, *q;
   static char *buffer;
   static size_t bufsize = OFF_T_STRSIZE_BOUND;
   char *p, *q;
-  
+
   buffer = emalloc (bufsize);
   do
     {
       size_t len, s;
   buffer = emalloc (bufsize);
   do
     {
       size_t len, s;
-      
+
       if (!fgets (buffer, bufsize, fp))
        return 0;
       len = strlen (buffer);
       if (!fgets (buffer, bufsize, fp))
        return 0;
       len = strlen (buffer);
@@ -185,12 +186,12 @@ read_xheader (char *name)
 
   if (verbose)
     printf ("Reading extended header file\n");
 
   if (verbose)
     printf ("Reading extended header file\n");
-  
+
   while (get_var (fp, &kw, &val))
     {
       if (verbose)
        printf ("Found variable GNU.sparse.%s = %s\n", kw, val);
   while (get_var (fp, &kw, &val))
     {
       if (verbose)
        printf ("Found variable GNU.sparse.%s = %s\n", kw, val);
-      
+
       if (expect && strcmp (kw, expect))
        die (1, "bad keyword sequence: expected `%s' but found `%s'",
             expect, kw);
       if (expect && strcmp (kw, expect))
        die (1, "bad keyword sequence: expected `%s' but found `%s'",
             expect, kw);
@@ -266,7 +267,7 @@ read_map (FILE *ifp)
 
   if (verbose)
     printf ("Reading v.1.0 sparse map\n");
 
   if (verbose)
     printf ("Reading v.1.0 sparse map\n");
-  
+
   get_line (nbuf, sizeof nbuf, ifp);
   sparse_map_size = string_to_size (nbuf, NULL);
   sparse_map = emalloc (sparse_map_size * sizeof *sparse_map);
   get_line (nbuf, sizeof nbuf, ifp);
   sparse_map_size = string_to_size (nbuf, NULL);
   sparse_map = emalloc (sparse_map_size * sizeof *sparse_map);
@@ -279,9 +280,9 @@ read_map (FILE *ifp)
       sparse_map[i].numbytes = string_to_size (nbuf, NULL);
     }
 
       sparse_map[i].numbytes = string_to_size (nbuf, NULL);
     }
 
-  fseek (ifp, ((ftell (ifp) + BLOCKSIZE - 1) / BLOCKSIZE) * BLOCKSIZE,
-        SEEK_SET);
-}  
+  fseeko (ifp, ((ftell (ifp) + BLOCKSIZE - 1) / BLOCKSIZE) * BLOCKSIZE,
+         SEEK_SET);
+}
 
 void
 expand_sparse (FILE *sfp, int ofd)
 
 void
 expand_sparse (FILE *sfp, int ofd)
@@ -293,24 +294,29 @@ expand_sparse (FILE *sfp, int ofd)
   for (i = 0; i < sparse_map_size; i++)
     if (maxbytes < sparse_map[i].numbytes)
       maxbytes = sparse_map[i].numbytes;
   for (i = 0; i < sparse_map_size; i++)
     if (maxbytes < sparse_map[i].numbytes)
       maxbytes = sparse_map[i].numbytes;
-  
+
   for (buffer = malloc (maxbytes); !buffer; maxbytes /= 2)
     if (maxbytes == 0)
       die (1, "not enough memory");
   for (buffer = malloc (maxbytes); !buffer; maxbytes /= 2)
     if (maxbytes == 0)
       die (1, "not enough memory");
-  
+
   for (i = 0; i < sparse_map_size; i++)
     {
       size_t size = sparse_map[i].numbytes;
 
   for (i = 0; i < sparse_map_size; i++)
     {
       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);
        }
     }
   free (buffer);
@@ -336,13 +342,13 @@ guess_outname (char *name)
 {
   char *p;
   char *s;
 {
   char *p;
   char *s;
-  
+
   if (name[0] == '.' && name[1] == '/')
     name += 2;
 
   p = name + strlen (name) - 1;
   s = NULL;
   if (name[0] == '.' && name[1] == '/')
     name += 2;
 
   p = name + strlen (name) - 1;
   s = NULL;
-      
+
   for (; p > name && *p != '/'; p--)
     ;
   if (*p == '/')
   for (; p > name && *p != '/'; p--)
     ;
   if (*p == '/')
@@ -352,7 +358,7 @@ guess_outname (char *name)
       for (p--; p > name && *p != '/'; p--)
        ;
     }
       for (p--; p > name && *p != '/'; p--)
        ;
     }
-  
+
   if (*p != '/')
     {
       if (s)
   if (*p != '/')
     {
       if (s)
@@ -383,7 +389,7 @@ main (int argc, char **argv)
   FILE *ifp;
   struct stat st;
   int ofd;
   FILE *ifp;
   struct stat st;
   int ofd;
-  
+
   progname = argv[0];
   while ((c = getopt (argc, argv, "hnvx:")) != EOF)
     {
   progname = argv[0];
   while ((c = getopt (argc, argv, "hnvx:")) != EOF)
     {
@@ -402,7 +408,7 @@ main (int argc, char **argv)
        case 'v':
          verbose++;
          break;
        case 'v':
          verbose++;
          break;
-         
+
        default:
          exit (1);
        }
        default:
          exit (1);
        }
@@ -423,17 +429,17 @@ main (int argc, char **argv)
 
   if (stat (inname, &st))
     die (1, "cannot stat %s (%d)", inname, errno);
 
   if (stat (inname, &st))
     die (1, "cannot stat %s (%d)", inname, errno);
-  
+
   ifp = fopen (inname, "r");
   if (ifp == NULL)
     die (1, "cannot open file %s (%d)", inname, errno);
   ifp = fopen (inname, "r");
   if (ifp == NULL)
     die (1, "cannot open file %s (%d)", inname, errno);
-  
+
   if (!xheader_file || version_major == 1)
     read_map (ifp);
 
   if (!outname)
     guess_outname (inname);
   if (!xheader_file || version_major == 1)
     read_map (ifp);
 
   if (!outname)
     guess_outname (inname);
-  
+
   ofd = open (outname, O_RDWR|O_CREAT|O_TRUNC, st.st_mode);
   if (ofd == -1)
     die (1, "cannot open file %s (%d)", outname, errno);
   ofd = open (outname, O_RDWR|O_CREAT|O_TRUNC, st.st_mode);
   if (ofd == -1)
     die (1, "cannot open file %s (%d)", outname, errno);
@@ -446,7 +452,7 @@ main (int argc, char **argv)
       printf ("Finished dry run\n");
       return 0;
     }
       printf ("Finished dry run\n");
       return 0;
     }
-  
+
   expand_sparse (ifp, ofd);
 
   fclose (ifp);
   expand_sparse (ifp, ofd);
 
   fclose (ifp);
@@ -454,7 +460,7 @@ main (int argc, char **argv)
 
   if (verbose)
     printf ("Done\n");
 
   if (verbose)
     printf ("Done\n");
-  
+
   if (outsize)
     {
       if (stat (outname, &st))
   if (outsize)
     {
       if (stat (outname, &st))
@@ -462,7 +468,6 @@ main (int argc, char **argv)
       if (st.st_size != outsize)
        die (1, "expanded file has wrong size");
     }
       if (st.st_size != outsize)
        die (1, "expanded file has wrong size");
     }
-  
+
   return 0;
 }
   return 0;
 }
-
This page took 0.030519 seconds and 4 git commands to generate.