zlib 1.2.0.5
This commit is contained in:
@@ -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 *~
|
||||
|
||||
17
contrib/untgz/Makefile.msc
Normal file
17
contrib/untgz/Makefile.msc
Normal file
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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,45 +164,85 @@ 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
|
||||
}
|
||||
|
||||
|
||||
/* regular expression matching */
|
||||
|
||||
#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;
|
||||
{
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
}
|
||||
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;
|
||||
{
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
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;
|
||||
|
||||
Reference in New Issue
Block a user