XEmacs 21.4.15
[chise/xemacs-chise.git.1] / nt / minitar.c
index a704d5f..d5e3d40 100644 (file)
 
 #include <zlib.h>
 
-static int
-Usage(char *name)
+static void
+Usage (char *name)
 {
-  fprintf(stderr,"Usage: %s file.tar.gz [base-dir]\n",name);
-  fprintf(stderr,"\tExtracts the contents compressed tar file to base-dir\n");
-  exit(-1);
+  fprintf (stderr, "Usage: %s file.tar.gz [base-dir]\n", name);
+  fprintf (stderr, "\tExtracts the contents compressed tar file to base-dir\n");
+  exit (-1);
 }
 
 
@@ -36,10 +36,10 @@ Usage(char *name)
 #define MAXNAMELEN 1024
 
 static int
-octal(char *str)
+octal (char *str)
 {
   int ret = -1;
-  sscanf(str,"%o",&ret);
+  sscanf (str, "%o", &ret);
   return ret;
 }
 
@@ -48,39 +48,40 @@ octal(char *str)
    path component, so it is not created as a directory */
 
 static int
-makepath(char *path)
+makepath (char *path)
 {
   char tmp[MAXNAMELEN];
   char *cp;
 
-  for (cp=path; cp; cp = (char*)strchr(cp+1,'/')){
-    if (!*cp)
-      break;
-    if (*cp != '/')
-      continue;
-    strncpy(tmp, path, cp-path);
-    tmp[cp-path] = '\0';
-    if (strlen(tmp) == 0)
-      continue;
+  for (cp=path; cp; cp = (char*)strchr (cp+1, '/'))
+    {
+      if (!*cp)
+       break;
+      if (*cp != '/')
+       continue;
+      strncpy (tmp, path, cp-path);
+      tmp[cp-path] = '\0';
+      if (strlen (tmp) == 0)
+       continue;
 #ifdef WIN32_NATIVE
-    if (mkdir(tmp)){
+      if (mkdir (tmp))
 #else
-    if (mkdir(tmp,0777)){
+       if (mkdir (tmp, 0777))
 #endif
-      if (errno == EEXIST)
-       continue;
-      else
-       return -1;
+         {
+           if (errno == EEXIST)
+             continue;
+           else
+             return -1;
+         }
     }
-  }
   return 0;
 }
 
-  
-                    
+
 
 int
-main(int argc, char **argv)
+main (int argc, char **argv)
 {
   char fullname[MAXNAMELEN];
   char *basedir = ".";
@@ -101,124 +102,145 @@ main(int argc, char **argv)
   int directory = 0;
 
   if (argc < 2 || argc > 3)
-    Usage(argv[0]);
+    Usage (argv[0]);
 
   tarfile = argv[1];
   if (argc==3)
     basedir = argv[2];
 
-  if (! (infile = gzopen(tarfile,"rb"))){
-    fprintf(stderr,"Cannot open %s\n", tarfile);
-    exit(-2);
-  }
-  
-  while (1){
-  
-
-    nread = gzread(infile,block,512);
-
-    if (!in_block && nread == 0)
-      break;
-
-    if (nread != BLOCKSIZE){
-      fprintf(stderr,"Error: incomplete block read. Exiting.\n");
-      exit(-2);
+  if (! (infile = gzopen (tarfile, "rb")))
+    {
+      fprintf (stderr, "Cannot open %s\n", tarfile);
+      exit (-2);
     }
+  
+  while (1)
+    {
+      nread = gzread (infile, block, 512);
 
-    if (!in_block){
-      if (block[0]=='\0')  /* We're done */
+      if (!in_block && nread == 0)
        break;
 
-      strncpy(magic,block+257,6);
-      magic[6] = '\0';
-      if (strcmp(magic,"ustar ")){
-       fprintf(stderr,
-               "Error: incorrect magic number in tar header. Exiting\n");
-      }
-
-      strncpy(name,block,100);
-      name[100] = '\0';
-      sprintf(fullname,"%s/%s",basedir,name);
-      printf("%s\n",fullname);
-      type = block[156];
+      if (nread != BLOCKSIZE)
+       {
+         fprintf (stderr, "Error: incomplete block read. Exiting.\n");
+         exit (-2);
+       }
+
+      if (!in_block)
+       {
+         if (block[0]=='\0')  /* We're done */
+           break;
+
+         strncpy (magic, block+257, 6);
+         magic[6] = '\0';
+         if (strcmp (magic, "ustar "))
+           {
+             fprintf (stderr,
+                      "Error: incorrect magic number in tar header. Exiting\n");
+             exit (-2);
+           }
+
+         strncpy (name, block, 100);
+         name[100] = '\0';
+         sprintf (fullname, "%s/%s", basedir, name);
+         printf ("%s\n", fullname);
+         type = block[156];
       
-      switch(type){
-      case '0':
-      case '\0':
-       directory = 0;
-       break;
-      case '5':
-       directory = 1;
-       break;
-      default:
-       fprintf(stderr,"Error: unknown type flag %c. Exiting.\n",type);
-       break;
-      }
+         switch (type)
+           {
+           case '0':
+           case '\0':
+             directory = 0;
+             break;
+           case '5':
+             directory = 1;
+             break;
+           default:
+             fprintf (stderr, "Error: unknown type flag %c. Exiting.\n", type);
+             exit (-2);
+             break;
+           }
       
-      if (directory){
-       in_block = 0;
+         if (directory)
+           {
+             in_block = 0;
        
-       /* makepath will ignore the final path component, so make sure 
-          dirnames have a trailing slash */
-
-       if (fullname[strlen(fullname)-1] != '/')
-         strcat(fullname,"/");
-       if (makepath(fullname)){
-         fprintf(stderr, "Error: cannot create directory %s. Exiting.\n",
-                 fullname);
-         exit(-2);
+             /* makepath will ignore the final path component, so make sure 
+                dirnames have a trailing slash */
+
+             if (fullname[strlen (fullname)-1] != '/')
+               strcat (fullname, "/");
+             if (makepath (fullname))
+               {
+                 fprintf (stderr, "Error: cannot create directory %s. Exiting.\n",
+                          fullname);
+                 exit (-2);
+               }
+             continue;
+           }
+         else
+           { /*file */
+             in_block = 1;
+             if (outfile)
+               {
+                 if (fclose (outfile))
+                   {
+                     fprintf (stderr, "Error: cannot close file %s. Exiting.\n",
+                              fullname);
+                     exit (-2);
+                   }
+                 outfile = (FILE*)0;
+               }
+
+             if (!(outfile = fopen (fullname, "wb")))
+               {
+                 /*try creating the directory, maybe it's not there */
+                 if (makepath (fullname))
+                   {
+                     fprintf (stderr, "Error: cannot create file %s. Exiting.\n",
+                              fullname);
+                     exit (-2);
+                   }
+                 /* now try again to open the file */
+                 if (!(outfile = fopen (fullname, "wb")))
+                   {
+                     fprintf (stderr, "Error: cannot create file %s. Exiting.\n",
+                              fullname);
+                     exit (-2);
+                   }
+               }
+
+             strncpy (osize, block+124, 12);
+             osize[12] = '\0';
+             size = octal (osize);
+             if (size<0)
+               {
+                 fprintf (stderr, "Error: invalid size in tar header. Exiting.\n");
+                 exit (-2);
+               }
+             if (size==0)      /* file of size 0 is done */
+               in_block = 0;
+           }
        }
-       continue;
-      } else { /*file */
-       in_block = 1;
-       if (outfile){
-         if (fclose(outfile)){
-           fprintf(stderr,"Error: cannot close file %s. Exiting.\n",
-                   fullname);
-           exit(-2);
-         }
-         outfile = (FILE*)0;
-       }
-
-       if ( !(outfile = fopen(fullname,"wb"))){
-         /*try creating the directory, maybe it's not there */
-         if (makepath(fullname)){
-           fprintf(stderr,"Error: cannot create file %s. Exiting.\n",
-                   fullname);
-           exit(-2);
-         }
-         /* now try again to open the file */
-         if (!(outfile = fopen(fullname,"wb"))){
-           fprintf(stderr,"Error: cannot create file %s. Exiting.\n",
-                   fullname);
-           exit(-2);
-         }
-       }
-
-       strncpy(osize,block+124,12);
-       osize[12] = '\0';
-       size = octal(osize);
-       if (size<0){
-         fprintf(stderr,"Error: invalid size in tar header. Exiting.\n");
-         exit(-2);
-       }
-      }
-    } else { /* write or continue writing file contents */
-      nbytes = size>512? 512:size;
+      else
+       { /* write or continue writing file contents */
+         nbytes = size>512? 512:size;
       
-      nwritten = fwrite(block, 1, nbytes, outfile);
-      if (nwritten != nbytes){
-       fprintf(stderr, "Error: only wrote %d bytes to file %s. Exiting.\n",
-               nwritten, fullname);
-      }
-      size -= nbytes;
-      if (size==0)
-       in_block = 0;
+         nwritten = fwrite (block, 1, nbytes, outfile);
+         if (nwritten != nbytes)
+           {
+             fprintf (stderr, "Error: only wrote %d bytes to file %s. Exiting.\n",
+                      nwritten, fullname);
+             exit (-2);
+           }
+         size -= nbytes;
+         if (size==0)
+           in_block = 0;
+       }
     }
-  }
-  exit (0);
-}      
-
+  return 0;
+}