X-Git-Url: http://git.chise.org/gitweb/?p=chise%2Fxemacs-chise.git.1;a=blobdiff_plain;f=nt%2Fminitar.c;h=d5e3d40ee31ed85ad16f3116d8b3e8d01f2a07c9;hp=a704d5f470178aad1ac261a78b1f7ece670a3b34;hb=e41b671ad8ef8f9d0464058e49a3a1ff9a5e4d4d;hpb=499b5ad5e2308fd04e3654aaa462d099f1769fd1 diff --git a/nt/minitar.c b/nt/minitar.c index a704d5f..d5e3d40 100644 --- a/nt/minitar.c +++ b/nt/minitar.c @@ -23,12 +23,12 @@ #include -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; +}