summaryrefslogtreecommitdiff
path: root/contrib/untgz
diff options
context:
space:
mode:
authorMark Adler <madler@alumni.caltech.edu>2011-09-09 23:22:37 -0700
committerMark Adler <madler@alumni.caltech.edu>2011-09-09 23:22:37 -0700
commit4b5a43a219d51066c01ff2ab86af18b967f2d0dd (patch)
tree4dcaf0cd18751d04cf638a9a6ec521990d4f2e90 /contrib/untgz
parent086e982175da84b3db958191031380794315f95f (diff)
downloadzlib-4b5a43a219d51066c01ff2ab86af18b967f2d0dd.tar.gz
zlib 1.2.0.5v1.2.0.5
Diffstat (limited to 'contrib/untgz')
-rw-r--r--contrib/untgz/Makefile6
-rw-r--r--contrib/untgz/Makefile.msc17
-rw-r--r--contrib/untgz/makefile.w3263
-rw-r--r--contrib/untgz/untgz.c507
4 files changed, 278 insertions, 315 deletions
diff --git a/contrib/untgz/Makefile b/contrib/untgz/Makefile
index 409b4bd..b54266f 100644
--- a/contrib/untgz/Makefile
+++ b/contrib/untgz/Makefile
@@ -1,14 +1,14 @@
CC=cc
CFLAGS=-g
-untgz: untgz.o ../../libz.a
- $(CC) $(CFLAGS) -o untgz untgz.o -L../.. -lz
+untgz: untgz.o ../../libz.a
+ $(CC) $(CFLAGS) -o untgz untgz.o -L../.. -lz
untgz.o: untgz.c ../../zlib.h
$(CC) $(CFLAGS) -c -I../.. untgz.c
../../libz.a:
- cd ../..; make
+ cd ../..; ./configure; make
clean:
rm -f untgz untgz.o *~
diff --git a/contrib/untgz/Makefile.msc b/contrib/untgz/Makefile.msc
new file mode 100644
index 0000000..77b8602
--- /dev/null
+++ b/contrib/untgz/Makefile.msc
@@ -0,0 +1,17 @@
+CC=cl
+CFLAGS=-MD
+
+untgz.exe: untgz.obj ..\..\zlib.lib
+ $(CC) $(CFLAGS) untgz.obj ..\..\zlib.lib
+
+untgz.obj: untgz.c ..\..\zlib.h
+ $(CC) $(CFLAGS) -c -I..\.. untgz.c
+
+..\..\zlib.lib:
+ cd ..\..
+ $(MAKE) -f win32\makefile.msc
+ cd contrib\untgz
+
+clean:
+ -del untgz.obj
+ -del untgz.exe
diff --git a/contrib/untgz/makefile.w32 b/contrib/untgz/makefile.w32
deleted file mode 100644
index c99dc28..0000000
--- a/contrib/untgz/makefile.w32
+++ /dev/null
@@ -1,63 +0,0 @@
-# Makefile for zlib. Modified for mingw32
-# For conditions of distribution and use, see copyright notice in zlib.h
-
-# To compile,
-#
-# make -fmakefile.w32
-#
-
-CC=gcc
-
-# Generate dependencies (see end of the file)
-
-CPPFLAGS=-MMD
-
-#CFLAGS=-MMD -O
-#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
-#CFLAGS=-MMD -g -DDEBUG
-CFLAGS=-O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
- -Wstrict-prototypes -Wmissing-prototypes
-
-# If cp.exe is not found, replace with copy /Y .
-CP=cp -f
-
-# The default value of RM is "rm -f."
-# If "rm.exe" is not found, uncomment:
-# RM=del
-
-LD=gcc
-LDLIBS=-L. -lz
-LDFLAGS=-s
-
-
-INCL=zlib.h zconf.h
-LIBS=libz.a
-
-AR=ar rcs
-
-OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
- zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o \
- inffast.o
-
-TEST_OBJS = minigzip.o untgz.o
-
-all: minigzip.exe untgz.exe
-
-rebuild: clean all
-
-libz.a: $(OBJS)
- $(AR) $@ $(OBJS)
-
-%.exe : %.o $(LIBS)
- $(LD) $(LDFLAGS) -o $@ $< $(LDLIBS)
-
-.PHONY : clean
-
-clean:
- $(RM) *.d *.o *.exe libz.a foo.gz
-
-DEPS := $(wildcard *.d)
-ifneq ($(DEPS),)
-include $(DEPS)
-endif
-
diff --git a/contrib/untgz/untgz.c b/contrib/untgz/untgz.c
index 4a431ff..478d744 100644
--- a/contrib/untgz/untgz.c
+++ b/contrib/untgz/untgz.c
@@ -21,6 +21,7 @@
#include "zlib.h"
#ifdef WIN32
+#include <windows.h>
# ifndef F_OK
# define F_OK (0)
# endif
@@ -39,37 +40,37 @@
/* Values used in typeflag field. */
-#define REGTYPE '0' /* regular file */
-#define AREGTYPE '\0' /* regular file */
-#define LNKTYPE '1' /* link */
-#define SYMTYPE '2' /* reserved */
-#define CHRTYPE '3' /* character special */
-#define BLKTYPE '4' /* block special */
-#define DIRTYPE '5' /* directory */
-#define FIFOTYPE '6' /* FIFO special */
-#define CONTTYPE '7' /* reserved */
+#define REGTYPE '0' /* regular file */
+#define AREGTYPE '\0' /* regular file */
+#define LNKTYPE '1' /* link */
+#define SYMTYPE '2' /* reserved */
+#define CHRTYPE '3' /* character special */
+#define BLKTYPE '4' /* block special */
+#define DIRTYPE '5' /* directory */
+#define FIFOTYPE '6' /* FIFO special */
+#define CONTTYPE '7' /* reserved */
#define BLOCKSIZE 512
struct tar_header
-{ /* byte offset */
- char name[100]; /* 0 */
- char mode[8]; /* 100 */
- char uid[8]; /* 108 */
- char gid[8]; /* 116 */
- char size[12]; /* 124 */
- char mtime[12]; /* 136 */
- char chksum[8]; /* 148 */
- char typeflag; /* 156 */
- char linkname[100]; /* 157 */
- char magic[6]; /* 257 */
- char version[2]; /* 263 */
- char uname[32]; /* 265 */
- char gname[32]; /* 297 */
- char devmajor[8]; /* 329 */
- char devminor[8]; /* 337 */
- char prefix[155]; /* 345 */
- /* 500 */
+{ /* byte offset */
+ char name[100]; /* 0 */
+ char mode[8]; /* 100 */
+ char uid[8]; /* 108 */
+ char gid[8]; /* 116 */
+ char size[12]; /* 124 */
+ char mtime[12]; /* 136 */
+ char chksum[8]; /* 148 */
+ char typeflag; /* 156 */
+ char linkname[100]; /* 157 */
+ char magic[6]; /* 257 */
+ char version[2]; /* 263 */
+ char uname[32]; /* 265 */
+ char gname[32]; /* 297 */
+ char devmajor[8]; /* 329 */
+ char devminor[8]; /* 337 */
+ char prefix[155]; /* 345 */
+ /* 500 */
};
union tar_buffer {
@@ -79,42 +80,43 @@ union tar_buffer {
enum { TGZ_EXTRACT = 0, TGZ_LIST };
-static char *TGZfname OF((const char *));
-void TGZnotfound OF((const char *));
+static char *TGZfname OF((const char *));
+void TGZnotfound OF((const char *));
-int getoct OF((char *, int));
-char *strtime OF((time_t *));
-int ExprMatch OF((char *,char *));
+int getoct OF((char *, int));
+char *strtime OF((time_t *));
+int setftime OF((char *, time_t));
+int ExprMatch OF((char *, char *));
-int makedir OF((char *));
-int matchname OF((int,int,char **,char *));
+int makedir OF((char *));
+int matchname OF((int, int, char **, char *));
-void error OF((const char *));
-int tar OF((gzFile, int, int, int, char **));
+void error OF((const char *));
+int tar OF((gzFile, int, int, int, char **));
-void help OF((int));
-int main OF((int, char **));
+void help OF((int));
+int main OF((int, char **));
char *prog;
/* This will give a benign warning */
-static char *TGZprefix[] = { "\0", ".tgz", ".tar.gz", ".tar", NULL };
+static char *TGZsuffix[] = { "\0", ".tar", ".tar.gz", ".taz", ".tgz", NULL };
/* Return the real name of the TGZ archive */
/* or NULL if it does not exist. */
-static char *TGZfname OF((const char *fname))
+static char *TGZfname (const char *fname)
{
static char buffer[1024];
int origlen,i;
-
+
strcpy(buffer,fname);
origlen = strlen(buffer);
- for (i=0; TGZprefix[i]; i++)
+ for (i=0; TGZsuffix[i]; i++)
{
- strcpy(buffer+origlen,TGZprefix[i]);
+ strcpy(buffer+origlen,TGZsuffix[i]);
if (access(buffer,F_OK) == 0)
return buffer;
}
@@ -123,33 +125,33 @@ static char *TGZfname OF((const char *fname))
/* error message for the filename */
-void TGZnotfound OF((const char *fname))
+void TGZnotfound (const char *fname)
{
int i;
fprintf(stderr,"%s : couldn't find ",prog);
- for (i=0;TGZprefix[i];i++)
- fprintf(stderr,(TGZprefix[i+1]) ? "%s%s, " : "or %s%s\n",
+ for (i=0;TGZsuffix[i];i++)
+ fprintf(stderr,(TGZsuffix[i+1]) ? "%s%s, " : "or %s%s\n",
fname,
- TGZprefix[i]);
+ TGZsuffix[i]);
exit(1);
}
/* help functions */
-int getoct(char *p,int width)
+int getoct (char *p,int width)
{
int result = 0;
char c;
-
+
while (width --)
{
c = *p++;
if (c == ' ')
- continue;
+ continue;
if (c == 0)
- break;
+ break;
result = result * 8 + (c - '0');
}
return result;
@@ -162,9 +164,49 @@ char *strtime (time_t *t)
local = localtime(t);
sprintf(result,"%2d/%02d/%4d %02d:%02d:%02d",
- local->tm_mday, local->tm_mon+1, local->tm_year+1900,
- local->tm_hour, local->tm_min, local->tm_sec);
+ local->tm_mday, local->tm_mon+1, local->tm_year+1900,
+ local->tm_hour, local->tm_min, local->tm_sec);
+ return result;
+}
+
+int setftime (char *fname,time_t ftime)
+{
+#ifdef WIN32
+ SYSTEMTIME st;
+ FILETIME locft, modft;
+ struct tm *loctm;
+ HANDLE hFile;
+ int result;
+
+ loctm = localtime(&ftime);
+ if (loctm == NULL)
+ return -1;
+
+ st.wYear = (WORD)loctm->tm_year + 1900;
+ st.wMonth = (WORD)loctm->tm_mon + 1;
+ st.wDayOfWeek = (WORD)loctm->tm_wday;
+ st.wDay = (WORD)loctm->tm_mday;
+ st.wHour = (WORD)loctm->tm_hour;
+ st.wMinute = (WORD)loctm->tm_min;
+ st.wSecond = (WORD)loctm->tm_sec;
+ st.wMilliseconds = 0;
+ if (!SystemTimeToFileTime(&st, &locft) ||
+ !LocalFileTimeToFileTime(&locft, &modft))
+ return -1;
+
+ hFile = CreateFile(fname, GENERIC_READ | GENERIC_WRITE,
+ 0, NULL, OPEN_EXISTING, 0, 0);
+ if (hFile == INVALID_HANDLE_VALUE)
+ return -1;
+ result = SetFileTime(hFile, NULL, NULL, &modft) ? 0 : -1;
+ CloseHandle(hFile);
return result;
+#else
+ struct utimbuf settime;
+
+ settime.actime = settime.modtime = ftime;
+ return utime(fname,&settime);
+#endif
}
@@ -172,35 +214,35 @@ char *strtime (time_t *t)
#define ISSPECIAL(c) (((c) == '*') || ((c) == '/'))
-int ExprMatch(char *string,char *expr)
+int ExprMatch (char *string,char *expr)
{
while (1)
{
if (ISSPECIAL(*expr))
- {
- if (*expr == '/')
- {
- if (*string != '\\' && *string != '/')
- return 0;
- string ++; expr++;
- }
- else if (*expr == '*')
- {
- if (*expr ++ == 0)
- return 1;
- while (*++string != *expr)
- if (*string == 0)
- return 0;
- }
- }
+ {
+ if (*expr == '/')
+ {
+ if (*string != '\\' && *string != '/')
+ return 0;
+ string ++; expr++;
+ }
+ else if (*expr == '*')
+ {
+ if (*expr ++ == 0)
+ return 1;
+ while (*++string != *expr)
+ if (*string == 0)
+ return 0;
+ }
+ }
else
- {
- if (*string != *expr)
- return 0;
- if (*expr++ == 0)
- return 1;
- string++;
- }
+ {
+ if (*string != *expr)
+ return 0;
+ if (*expr++ == 0)
+ return 1;
+ string++;
+ }
}
}
@@ -216,7 +258,7 @@ int makedir (char *newdir)
char *buffer = strdup(newdir);
char *p;
int len = strlen(buffer);
-
+
if (len <= 0) {
free(buffer);
return 0;
@@ -234,19 +276,19 @@ int makedir (char *newdir)
while (1)
{
char hold;
-
+
while(*p && *p != '\\' && *p != '/')
- p++;
+ p++;
hold = *p;
*p = 0;
if ((mkdir(buffer, 0775) == -1) && (errno == ENOENT))
- {
- fprintf(stderr,"%s: couldn't create directory %s\n",prog,buffer);
- free(buffer);
- return 0;
- }
+ {
+ fprintf(stderr,"%s: couldn't create directory %s\n",prog,buffer);
+ free(buffer);
+ return 0;
+ }
if (hold == 0)
- break;
+ break;
*p++ = hold;
}
free(buffer);
@@ -255,7 +297,7 @@ int makedir (char *newdir)
int matchname (int arg,int argc,char **argv,char *fname)
{
- if (arg == argc) /* no arguments given (untgz tgzarchive) */
+ if (arg == argc) /* no arguments given (untgz tgzarchive) */
return 1;
while (arg < argc)
@@ -278,144 +320,111 @@ int tar (gzFile in,int action,int arg,int argc,char **argv)
FILE *outfile = NULL;
char fname[BLOCKSIZE];
time_t tartime;
-
+
if (action == TGZ_LIST)
printf(" day time size file\n"
- " ---------- -------- --------- -------------------------------------\n");
+ " ---------- -------- --------- -------------------------------------\n");
while (1)
{
len = gzread(in, &buffer, BLOCKSIZE);
if (len < 0)
- error (gzerror(in, &err));
+ error (gzerror(in, &err));
/*
* Always expect complete blocks to process
* the tar information.
*/
if (len != BLOCKSIZE)
- error("gzread: incomplete block read");
-
+ error("gzread: incomplete block read");
+
/*
* If we have to get a tar header
*/
if (getheader == 1)
- {
- /*
- * if we met the end of the tar
- * or the end-of-tar block,
- * we are done
- */
- if ((len == 0) || (buffer.header.name[0]== 0)) break;
-
- tartime = (time_t)getoct(buffer.header.mtime,12);
- strcpy(fname,buffer.header.name);
-
- switch (buffer.header.typeflag)
- {
- case DIRTYPE:
- if (action == TGZ_LIST)
- printf(" %s <dir> %s\n",strtime(&tartime),fname);
- if (action == TGZ_EXTRACT)
- makedir(fname);
- break;
- case REGTYPE:
- case AREGTYPE:
- remaining = getoct(buffer.header.size,12);
- if (action == TGZ_LIST)
- printf(" %s %9d %s\n",strtime(&tartime),remaining,fname);
- if (action == TGZ_EXTRACT)
- {
- if ((remaining) && (matchname(arg,argc,argv,fname)))
- {
- outfile = fopen(fname,"wb");
- if (outfile == NULL) {
- /* try creating directory */
- char *p = strrchr(fname, '/');
- if (p != NULL) {
- *p = '\0';
- makedir(fname);
- *p = '/';
- outfile = fopen(fname,"wb");
- }
- }
- fprintf(stderr,
- "%s %s\n",
- (outfile) ? "Extracting" : "Couldn't create",
- fname);
- }
- else
- outfile = NULL;
- }
- /*
- * could have no contents
- */
- getheader = (remaining) ? 0 : 1;
- break;
- default:
- if (action == TGZ_LIST)
- printf(" %s <---> %s\n",strtime(&tartime),fname);
- break;
- }
- }
+ {
+ /*
+ * if we met the end of the tar
+ * or the end-of-tar block,
+ * we are done
+ */
+ if ((len == 0) || (buffer.header.name[0]== 0)) break;
+
+ tartime = (time_t)getoct(buffer.header.mtime,12);
+ strcpy(fname,buffer.header.name);
+
+ switch (buffer.header.typeflag)
+ {
+ case DIRTYPE:
+ if (action == TGZ_LIST)
+ printf(" %s <dir> %s\n",strtime(&tartime),fname);
+ if (action == TGZ_EXTRACT)
+ makedir(fname);
+ break;
+ case REGTYPE:
+ case AREGTYPE:
+ remaining = getoct(buffer.header.size,12);
+ if (action == TGZ_LIST)
+ printf(" %s %9d %s\n",strtime(&tartime),remaining,fname);
+ if (action == TGZ_EXTRACT)
+ {
+ if ((remaining) && (matchname(arg,argc,argv,fname)))
+ {
+ outfile = fopen(fname,"wb");
+ if (outfile == NULL) {
+ /* try creating directory */
+ char *p = strrchr(fname, '/');
+ if (p != NULL) {
+ *p = '\0';
+ makedir(fname);
+ *p = '/';
+ outfile = fopen(fname,"wb");
+ }
+ }
+ fprintf(stderr,
+ "%s %s\n",
+ (outfile) ? "Extracting" : "Couldn't create",
+ fname);
+ }
+ else
+ outfile = NULL;
+ }
+ /*
+ * could have no contents
+ */
+ getheader = (remaining) ? 0 : 1;
+ break;
+ default:
+ if (action == TGZ_LIST)
+ printf(" %s <---> %s\n",strtime(&tartime),fname);
+ break;
+ }
+ }
else
- {
- unsigned int bytes = (remaining > BLOCKSIZE) ? BLOCKSIZE : remaining;
-
- if ((action == TGZ_EXTRACT) && (outfile != NULL))
- {
- if (fwrite(&buffer,sizeof(char),bytes,outfile) != bytes)
- {
- fprintf(stderr,"%s : error writing %s skipping...\n",prog,fname);
- fclose(outfile);
- unlink(fname);
- }
- }
- remaining -= bytes;
- if (remaining == 0)
- {
- getheader = 1;
- if ((action == TGZ_EXTRACT) && (outfile != NULL))
- {
-#ifdef WIN32
- HANDLE hFile;
- FILETIME ftm,ftLocal;
- SYSTEMTIME st;
- struct tm localt;
-
- fclose(outfile);
-
- localt = *localtime(&tartime);
-
- hFile = CreateFile(fname, GENERIC_READ | GENERIC_WRITE,
- 0, NULL, OPEN_EXISTING, 0, NULL);
-
- st.wYear = (WORD)localt.tm_year+1900;
- st.wMonth = (WORD)localt.tm_mon;
- st.wDayOfWeek = (WORD)localt.tm_wday;
- st.wDay = (WORD)localt.tm_mday;
- st.wHour = (WORD)localt.tm_hour;
- st.wMinute = (WORD)localt.tm_min;
- st.wSecond = (WORD)localt.tm_sec;
- st.wMilliseconds = 0;
- SystemTimeToFileTime(&st,&ftLocal);
- LocalFileTimeToFileTime(&ftLocal,&ftm);
- SetFileTime(hFile,&ftm,NULL,&ftm);
- CloseHandle(hFile);
-
- outfile = NULL;
-#else
- struct utimbuf settime;
-
- settime.actime = settime.modtime = tartime;
-
- fclose(outfile);
- outfile = NULL;
- utime(fname,&settime);
-#endif
- }
- }
- }
+ {
+ unsigned int bytes = (remaining > BLOCKSIZE) ? BLOCKSIZE : remaining;
+
+ if ((action == TGZ_EXTRACT) && (outfile != NULL))
+ {
+ if (fwrite(&buffer,sizeof(char),bytes,outfile) != bytes)
+ {
+ fprintf(stderr,"%s : error writing %s skipping...\n",prog,fname);
+ fclose(outfile);
+ unlink(fname);
+ }
+ }
+ remaining -= bytes;
+ if (remaining == 0)
+ {
+ getheader = 1;
+ if ((action == TGZ_EXTRACT) && (outfile != NULL))
+ {
+ fclose(outfile);
+ outfile = NULL;
+ setftime(fname,tartime);
+ }
+ }
+ }
}
-
+
if (gzclose(in) != Z_OK)
error("failed gzclose");
@@ -428,12 +437,12 @@ int tar (gzFile in,int action,int arg,int argc,char **argv)
void help(int exitval)
{
fprintf(stderr,
- "untgz v 0.1\n"
- " an sample application of zlib 1.0.4\n\n"
- "Usage : untgz TGZfile to extract all files\n"
- " untgz TGZfile fname ... to extract selected files\n"
- " untgz -l TGZfile to list archive contents\n"
- " untgz -h to display this help\n\n");
+ "untgz version 0.1\n"
+ " a sample application of zlib\n\n"
+ "Usage : untgz file.tgz to extract all files\n"
+ " untgz file.tgz fname ... to extract selected files\n"
+ " untgz -l file.tgz to list archive contents\n"
+ " untgz -h to display this help\n\n");
exit(exitval);
}
@@ -446,50 +455,50 @@ void error(const char *msg)
/* ====================================================================== */
-int _CRT_glob = 0; /* disable globbing of the arguments */
+int _CRT_glob = 0; /* disable globbing of the arguments */
int main(int argc,char **argv)
{
- int action = TGZ_EXTRACT;
- int arg = 1;
- char *TGZfile;
- gzFile *f;
-
+ int action = TGZ_EXTRACT;
+ int arg = 1;
+ char *TGZfile;
+ gzFile *f;
+
prog = strrchr(argv[0],'\\');
if (prog == NULL)
{
- prog = strrchr(argv[0],'/');
- if (prog == NULL)
- {
- prog = strrchr(argv[0],':');
- if (prog == NULL)
- prog = argv[0];
- else
- prog++;
- }
- else
- prog++;
+ prog = strrchr(argv[0],'/');
+ if (prog == NULL)
+ {
+ prog = strrchr(argv[0],':');
+ if (prog == NULL)
+ prog = argv[0];
+ else
+ prog++;
+ }
+ else
+ prog++;
}
else
prog++;
-
+
if (argc == 1)
help(0);
if (strcmp(argv[arg],"-l") == 0)
{
- action = TGZ_LIST;
- if (argc == ++arg)
- help(0);
+ action = TGZ_LIST;
+ if (argc == ++arg)
+ help(0);
}
else if (strcmp(argv[arg],"-h") == 0)
{
- help(0);
+ help(0);
}
if ((TGZfile = TGZfname(argv[arg])) == NULL)
- TGZnotfound(argv[arg]);
+ TGZnotfound(argv[arg]);
++arg;
if ((action == TGZ_LIST) && (arg != argc))
@@ -502,20 +511,20 @@ int main(int argc,char **argv)
{
case TGZ_LIST:
case TGZ_EXTRACT:
- f = gzopen(TGZfile,"rb");
- if (f == NULL)
- {
- fprintf(stderr,"%s: Couldn't gzopen %s\n",
- prog,
- TGZfile);
- return 1;
- }
- exit(tar(f, action, arg, argc, argv));
+ f = gzopen(TGZfile,"rb");
+ if (f == NULL)
+ {
+ fprintf(stderr,"%s: Couldn't gzopen %s\n",
+ prog,
+ TGZfile);
+ return 1;
+ }
+ exit(tar(f, action, arg, argc, argv));
break;
-
+
default:
- error("Unknown option!");
- exit(1);
+ error("Unknown option!");
+ exit(1);
}
return 0;