3616 lines
137 KiB
Diff
3616 lines
137 KiB
Diff
--- extract.c 2005-02-26 05:47:30.000000000 +0100
|
|
+++ extract.c 2007-12-03 13:49:01.000000000 +0100
|
|
@@ -308,7 +308,7 @@ int extract_or_test_files(__G) /* ret
|
|
int reached_end, no_endsig_found;
|
|
int error, error_in_archive=PK_COOL;
|
|
int *fn_matched=NULL, *xn_matched=NULL;
|
|
- unsigned members_processed;
|
|
+ Z_OFF_T members_processed;
|
|
ulg num_skipped=0L, num_bad_pwd=0L;
|
|
Z_OFF_T old_extra_bytes = 0L;
|
|
#ifdef SET_DIR_ATTRIB
|
|
@@ -541,7 +541,7 @@ int extract_or_test_files(__G) /* ret
|
|
G.cur_zipfile_bufstart = ftell((FILE *)G.zipfd);
|
|
#else /* !USE_STRM_INPUT */
|
|
G.cur_zipfile_bufstart =
|
|
- lseek(G.zipfd, cd_bufstart, SEEK_SET);
|
|
+ lseek64(G.zipfd,(Z_OFF_T)cd_bufstart, SEEK_SET);
|
|
#endif /* ?USE_STRM_INPUT */
|
|
read(G.zipfd, (char *)G.inbuf, INBUFSIZ); /* been here before... */
|
|
G.inptr = cd_inptr;
|
|
@@ -942,7 +942,8 @@ static int extract_or_test_entrylist(__G
|
|
Trace((stderr,
|
|
"debug: bufstart = %ld, cur_zipfile_bufstart = %ld\n",
|
|
(long)bufstart, (long)G.cur_zipfile_bufstart));
|
|
- if (request < 0) {
|
|
+ if ((request < 0) || (request > MAX_ZIP_SIZE)) { /* >2^32-8193 */
|
|
+ printf("retry - request = 0x%lu\n", (ulg)request);
|
|
Info(slide, 0x401, ((char *)slide, LoadFarStringSmall(SeekMsg),
|
|
G.zipfn, LoadFarString(ReportMsg)));
|
|
error_in_archive = PK_ERR;
|
|
@@ -982,7 +983,7 @@ static int extract_or_test_entrylist(__G
|
|
G.cur_zipfile_bufstart = ftell((FILE *)G.zipfd);
|
|
#else /* !USE_STRM_INPUT */
|
|
G.cur_zipfile_bufstart =
|
|
- lseek(G.zipfd, bufstart, SEEK_SET);
|
|
+ lseek64(G.zipfd, bufstart, SEEK_SET);
|
|
#endif /* ?USE_STRM_INPUT */
|
|
if ((G.incnt = read(G.zipfd, (char *)G.inbuf, INBUFSIZ)) <= 0)
|
|
{
|
|
--- fileio.c 2005-02-27 03:10:12.000000000 +0100
|
|
+++ fileio.c 2007-12-03 13:49:01.000000000 +0100
|
|
@@ -113,6 +113,9 @@ static int disk_error OF((__GPRO));
|
|
/* Strings used in fileio.c */
|
|
/****************************/
|
|
|
|
+static ZCONST char Far ZipFileTooBig[] =
|
|
+ "error: Zip file too big (greater than %lu bytes)\n";
|
|
+
|
|
static ZCONST char Far CannotOpenZipfile[] =
|
|
"error: cannot open zipfile [ %s ]\n %s\n";
|
|
|
|
@@ -183,6 +186,7 @@ static ZCONST char Far ExtraFieldTooLong
|
|
int open_input_file(__G) /* return 1 if open failed */
|
|
__GDEF
|
|
{
|
|
+ struct stat64 sb;
|
|
/*
|
|
* open the zipfile for reading and in BINARY mode to prevent cr/lf
|
|
* translation, which would corrupt the bitstreams
|
|
@@ -201,9 +205,9 @@ int open_input_file(__G) /* return 1
|
|
G.zipfd = fopen(G.zipfn, FOPR);
|
|
#else /* !USE_STRM_INPUT */
|
|
# ifdef O_BINARY
|
|
- G.zipfd = open(G.zipfn, O_RDONLY | O_BINARY);
|
|
+ G.zipfd = open(G.zipfn, O_RDONLY | O_BINARY | O_LARGEFILE);
|
|
# else
|
|
- G.zipfd = open(G.zipfn, O_RDONLY);
|
|
+ G.zipfd = open(G.zipfn, O_RDONLY | O_LARGEFILE);
|
|
# endif
|
|
#endif /* ?USE_STRM_INPUT */
|
|
#endif /* ?CMS_MVS */
|
|
@@ -221,6 +225,12 @@ int open_input_file(__G) /* return 1
|
|
G.zipfn, strerror(errno)));
|
|
return 1;
|
|
}
|
|
+ fstat64(G.zipfd, &sb);
|
|
+ if (sb.st_size > MAX_ZIP_SIZE) {
|
|
+ Info(slide, 0x401, ((char *)slide,
|
|
+ LoadFarString(ZipFileTooBig),
|
|
+ ((ulg)MAX_ZIP_SIZE)));
|
|
+ }
|
|
return 0;
|
|
|
|
} /* end function open_input_file() */
|
|
@@ -238,6 +248,7 @@ int open_input_file(__G) /* return 1
|
|
int open_outfile(__G) /* return 1 if fail */
|
|
__GDEF
|
|
{
|
|
+ int fd;
|
|
#ifdef DLL
|
|
if (G.redirect_data)
|
|
return (redirect_outfile(__G) == FALSE);
|
|
@@ -259,7 +270,7 @@ int open_outfile(__G) /* return
|
|
}
|
|
#endif /* BORLAND_STAT_BUG */
|
|
#ifdef SYMLINKS
|
|
- if (SSTAT(G.filename, &G.statbuf) == 0 || lstat(G.filename,&G.statbuf) == 0)
|
|
+ if (SSTAT(G.filename, &G.statbuf) == 0 || lstat64(G.filename,&G.statbuf) == 0)
|
|
#else
|
|
if (SSTAT(G.filename, &G.statbuf) == 0)
|
|
#endif /* ?SYMLINKS */
|
|
@@ -413,7 +424,9 @@ int open_outfile(__G) /* return
|
|
#endif /* NOVELL_BUG_FAILSAFE */
|
|
Trace((stderr, "open_outfile: doing fopen(%s) for writing\n",
|
|
FnFilter1(G.filename)));
|
|
- if ((G.outfile = fopen(G.filename, FOPW)) == (FILE *)NULL) {
|
|
+
|
|
+ fd = open(G.filename, O_WRONLY | O_LARGEFILE | O_CREAT);
|
|
+ if ((G.outfile = fdopen(fd, FOPW)) == (FILE *)NULL) {
|
|
Info(slide, 0x401, ((char *)slide, LoadFarString(CannotCreateFile),
|
|
FnFilter1(G.filename)));
|
|
return 1;
|
|
@@ -682,7 +695,7 @@ int seek_zipf(__G__ abs_offset)
|
|
Z_OFF_T inbuf_offset = request % INBUFSIZ;
|
|
Z_OFF_T bufstart = request - inbuf_offset;
|
|
|
|
- if (request < 0) {
|
|
+ if (request < 0) {
|
|
Info(slide, 1, ((char *)slide, LoadFarStringSmall(SeekMsg),
|
|
G.zipfn, LoadFarString(ReportMsg)));
|
|
return(PK_BADERR);
|
|
@@ -694,7 +707,7 @@ int seek_zipf(__G__ abs_offset)
|
|
fseek(G.zipfd, bufstart, SEEK_SET);
|
|
G.cur_zipfile_bufstart = ftell(G.zipfd);
|
|
#else /* !USE_STRM_INPUT */
|
|
- G.cur_zipfile_bufstart = lseek(G.zipfd, bufstart, SEEK_SET);
|
|
+ G.cur_zipfile_bufstart = lseek64(G.zipfd, bufstart, SEEK_SET);
|
|
#endif /* ?USE_STRM_INPUT */
|
|
Trace((stderr,
|
|
" request = %ld, (abs+extra) = %ld, inbuf_offset = %ld\n",
|
|
@@ -1850,7 +1863,7 @@ int check_for_newer(__G__ filename) /*
|
|
Trace((stderr, "check_for_newer: doing lstat(%s)\n",
|
|
FnFilter1(filename)));
|
|
/* GRR OPTION: could instead do this test ONLY if G.symlnk is true */
|
|
- if (lstat(filename, &G.statbuf) == 0) {
|
|
+ if (lstat64(filename, &G.statbuf) == 0) {
|
|
Trace((stderr,
|
|
"check_for_newer: lstat(%s) returns 0: symlink does exist\n",
|
|
FnFilter1(filename)));
|
|
@@ -1867,7 +1880,7 @@ int check_for_newer(__G__ filename) /*
|
|
|
|
#ifdef SYMLINKS
|
|
/* GRR OPTION: could instead do this test ONLY if G.symlnk is true */
|
|
- if (lstat(filename, &G.statbuf) == 0 && S_ISLNK(G.statbuf.st_mode)) {
|
|
+ if (lstat64(filename, &G.statbuf) == 0 && S_ISLNK(G.statbuf.st_mode)) {
|
|
Trace((stderr, "check_for_newer: %s is a symbolic link\n",
|
|
FnFilter1(filename)));
|
|
if (QCOND2 && !IS_OVERWRT_ALL)
|
|
--- globals.h 2004-11-22 01:42:00.000000000 +0100
|
|
+++ globals.h 2007-12-03 13:49:01.000000000 +0100
|
|
@@ -256,7 +256,12 @@ typedef struct Globals {
|
|
local_file_hdr lrec; /* used in unzip.c, extract.c */
|
|
cdir_file_hdr crec; /* used in unzip.c, extract.c, misc.c */
|
|
ecdir_rec ecrec; /* used in unzip.c, extract.c */
|
|
- struct stat statbuf; /* used by main, mapname, check_for_newer */
|
|
+#ifdef _LARGEFILE64_SOURCE
|
|
+ struct stat64 statbuf; /* used by main, mapname, check_for_newer */
|
|
+#else
|
|
+ struct stat statbuf; /* used by main, mapname, check_for_newer */
|
|
+#endif
|
|
+
|
|
|
|
int mem_mode;
|
|
uch *outbufptr; /* extract.c static */
|
|
--- list.c 2005-01-27 02:02:02.000000000 +0100
|
|
+++ list.c 2007-12-03 13:55:10.000000000 +0100
|
|
@@ -62,12 +62,12 @@
|
|
"%8lu %-7s%8lu %4s %02u%c%02u%c%02u %02u:%02u %08lx %c";
|
|
static ZCONST char Far LongFileTrailer[] =
|
|
"-------- ------- --- \
|
|
- -------\n%8lu %8lu %4s %lu file%s\n";
|
|
+ -------\n%8ju %8ju %4s %lu file%s\n";
|
|
#ifdef OS2_EAS
|
|
static ZCONST char Far ShortHdrStats[] =
|
|
"%9lu %6lu %6lu %02u%c%02u%c%02u %02u:%02u %c";
|
|
static ZCONST char Far ShortFileTrailer[] = " -------- ----- ----- \
|
|
- -------\n%9lu %6lu %6lu %lu file%s\n";
|
|
+ -------\n%9ju %6lu %6lu %lu file%s\n";
|
|
static ZCONST char Far OS2ExtAttrTrailer[] =
|
|
"%lu file%s %lu bytes of OS/2 extended attributes attached.\n";
|
|
static ZCONST char Far OS2ACLTrailer[] =
|
|
@@ -76,7 +76,7 @@
|
|
static ZCONST char Far ShortHdrStats[] =
|
|
"%9lu %02u%c%02u%c%02u %02u:%02u %c";
|
|
static ZCONST char Far ShortFileTrailer[] = " -------- \
|
|
- -------\n%9lu %lu file%s\n";
|
|
+ -------\n%9ju %lu file%s\n";
|
|
#endif /* ?OS2_EAS */
|
|
#endif /* !WINDLL */
|
|
|
|
@@ -105,7 +105,8 @@ int list_files(__G) /* return PK-type
|
|
struct tm *t;
|
|
#endif
|
|
unsigned yr, mo, dy, hh, mm;
|
|
- ulg csiz, tot_csize=0L, tot_ucsize=0L;
|
|
+ ulg csiz;
|
|
+ unsigned long long tot_csize=0, tot_ucsize=0;
|
|
#ifdef OS2_EAS
|
|
ulg ea_size, tot_easize=0L, tot_eafiles=0L;
|
|
ulg acl_size, tot_aclsize=0L, tot_aclfiles=0L;
|
|
--- process.c 2007-12-03 13:44:30.000000000 +0100
|
|
+++ process.c 2007-12-03 13:49:01.000000000 +0100
|
|
@@ -934,8 +934,8 @@ static int find_ecrec(__G__ searchlen)
|
|
Treat case of short zipfile separately.
|
|
---------------------------------------------------------------------------*/
|
|
|
|
- if (G.ziplen <= INBUFSIZ) {
|
|
- lseek(G.zipfd, 0L, SEEK_SET);
|
|
+ if ((unsigned long)G.ziplen <= (unsigned long)INBUFSIZ) {
|
|
+ lseek64(G.zipfd, 0L, SEEK_SET);
|
|
if ((G.incnt = read(G.zipfd,(char *)G.inbuf,(unsigned int)G.ziplen))
|
|
== (int)G.ziplen)
|
|
|
|
@@ -962,7 +962,7 @@ static int find_ecrec(__G__ searchlen)
|
|
fseek((FILE *)G.zipfd, G.ziplen-tail_len, SEEK_SET);
|
|
G.cur_zipfile_bufstart = ftell((FILE *)G.zipfd);
|
|
#else /* !USE_STRM_INPUT */
|
|
- G.cur_zipfile_bufstart = lseek(G.zipfd, G.ziplen-tail_len,
|
|
+ G.cur_zipfile_bufstart = lseek64(G.zipfd, G.ziplen-tail_len,
|
|
SEEK_SET);
|
|
#endif /* ?USE_STRM_INPUT */
|
|
if ((G.incnt = read(G.zipfd, (char *)G.inbuf,
|
|
@@ -996,7 +996,7 @@ static int find_ecrec(__G__ searchlen)
|
|
|
|
for (i = 1; !found && (i <= numblks); ++i) {
|
|
G.cur_zipfile_bufstart -= INBUFSIZ;
|
|
- lseek(G.zipfd, G.cur_zipfile_bufstart, SEEK_SET);
|
|
+ lseek64(G.zipfd, G.cur_zipfile_bufstart, SEEK_SET);
|
|
if ((G.incnt = read(G.zipfd,(char *)G.inbuf,INBUFSIZ))
|
|
!= INBUFSIZ)
|
|
break; /* fall through and fail */
|
|
--- process.c.orig 1970-01-01 01:00:00.000000000 +0100
|
|
+++ process.c.orig 2007-12-03 13:44:30.000000000 +0100
|
|
@@ -0,0 +1,1690 @@
|
|
+/*
|
|
+ Copyright (c) 1990-2004 Info-ZIP. All rights reserved.
|
|
+
|
|
+ See the accompanying file LICENSE, version 2000-Apr-09 or later
|
|
+ (the contents of which are also included in unzip.h) for terms of use.
|
|
+ If, for some reason, all these files are missing, the Info-ZIP license
|
|
+ also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
|
|
+*/
|
|
+/*---------------------------------------------------------------------------
|
|
+
|
|
+ process.c
|
|
+
|
|
+ This file contains the top-level routines for processing multiple zipfiles.
|
|
+
|
|
+ Contains: process_zipfiles()
|
|
+ free_G_buffers()
|
|
+ do_seekable()
|
|
+ find_ecrec()
|
|
+ uz_end_central()
|
|
+ process_cdir_file_hdr()
|
|
+ get_cdir_ent()
|
|
+ process_local_file_hdr()
|
|
+ ef_scan_for_izux()
|
|
+ getRISCOSexfield()
|
|
+
|
|
+ ---------------------------------------------------------------------------*/
|
|
+
|
|
+
|
|
+#define UNZIP_INTERNAL
|
|
+#include "unzip.h"
|
|
+#ifdef WINDLL
|
|
+# ifdef POCKET_UNZIP
|
|
+# include "wince/intrface.h"
|
|
+# else
|
|
+# include "windll/windll.h"
|
|
+# endif
|
|
+#endif
|
|
+
|
|
+static int do_seekable OF((__GPRO__ int lastchance));
|
|
+static int find_ecrec OF((__GPRO__ long searchlen));
|
|
+
|
|
+static ZCONST char Far CannotAllocateBuffers[] =
|
|
+ "error: cannot allocate unzip buffers\n";
|
|
+
|
|
+#ifdef SFX
|
|
+ static ZCONST char Far CannotFindMyself[] =
|
|
+ "unzipsfx: cannot find myself! [%s]\n";
|
|
+# ifdef CHEAP_SFX_AUTORUN
|
|
+ static ZCONST char Far AutorunPrompt[] =
|
|
+ "\nAuto-run command: %s\nExecute this command? [y/n] ";
|
|
+ static ZCONST char Far NotAutoRunning[] =
|
|
+ "Not executing auto-run command.";
|
|
+# endif
|
|
+
|
|
+#else /* !SFX */
|
|
+ /* process_zipfiles() strings */
|
|
+# if (defined(IZ_CHECK_TZ) && defined(USE_EF_UT_TIME))
|
|
+ static ZCONST char Far WarnInvalidTZ[] =
|
|
+ "Warning: TZ environment variable not found, cannot use UTC times!!\n";
|
|
+# endif
|
|
+ static ZCONST char Far FilesProcessOK[] =
|
|
+ "%d archive%s successfully processed.\n";
|
|
+ static ZCONST char Far ArchiveWarning[] =
|
|
+ "%d archive%s had warnings but no fatal errors.\n";
|
|
+ static ZCONST char Far ArchiveFatalError[] =
|
|
+ "%d archive%s had fatal errors.\n";
|
|
+ static ZCONST char Far FileHadNoZipfileDir[] =
|
|
+ "%d file%s had no zipfile directory.\n";
|
|
+ static ZCONST char Far ZipfileWasDir[] = "1 \"zipfile\" was a directory.\n";
|
|
+ static ZCONST char Far ManyZipfilesWereDir[] =
|
|
+ "%d \"zipfiles\" were directories.\n";
|
|
+ static ZCONST char Far NoZipfileFound[] = "No zipfiles found.\n";
|
|
+
|
|
+ /* do_seekable() strings */
|
|
+# ifdef UNIX
|
|
+ static ZCONST char Far CannotFindZipfileDirMsg[] =
|
|
+ "%s: cannot find zipfile directory in one of %s or\n\
|
|
+ %s%s.zip, and cannot find %s, period.\n";
|
|
+ static ZCONST char Far CannotFindEitherZipfile[] =
|
|
+ "%s: cannot find or open %s, %s.zip or %s.\n";
|
|
+# else /* !UNIX */
|
|
+# ifndef AMIGA
|
|
+ static ZCONST char Far CannotFindWildcardMatch[] =
|
|
+ "%s: cannot find any matches for wildcard specification \"%s\".\n";
|
|
+# endif /* !AMIGA */
|
|
+ static ZCONST char Far CannotFindZipfileDirMsg[] =
|
|
+ "%s: cannot find zipfile directory in %s,\n\
|
|
+ %sand cannot find %s, period.\n";
|
|
+ static ZCONST char Far CannotFindEitherZipfile[] =
|
|
+ "%s: cannot find either %s or %s.\n";
|
|
+# endif /* ?UNIX */
|
|
+ extern ZCONST char Far Zipnfo[]; /* in unzip.c */
|
|
+#ifndef WINDLL
|
|
+ static ZCONST char Far Unzip[] = "unzip";
|
|
+#else
|
|
+ static ZCONST char Far Unzip[] = "UnZip DLL";
|
|
+#endif
|
|
+ static ZCONST char Far MaybeExe[] =
|
|
+ "note: %s may be a plain executable, not an archive\n";
|
|
+ static ZCONST char Far CentDirNotInZipMsg[] = "\n\
|
|
+ [%s]:\n\
|
|
+ Zipfile is disk %u of a multi-disk archive, and this is not the disk on\n\
|
|
+ which the central zipfile directory begins (disk %u).\n";
|
|
+ static ZCONST char Far EndCentDirBogus[] =
|
|
+ "\nwarning [%s]: end-of-central-directory record claims this\n\
|
|
+ is disk %u but that the central directory starts on disk %u; this is a\n\
|
|
+ contradiction. Attempting to process anyway.\n";
|
|
+# ifdef NO_MULTIPART
|
|
+ static ZCONST char Far NoMultiDiskArcSupport[] =
|
|
+ "\nerror [%s]: zipfile is part of multi-disk archive\n\
|
|
+ (sorry, not yet supported).\n";
|
|
+ static ZCONST char Far MaybePakBug[] = "warning [%s]:\
|
|
+ zipfile claims to be 2nd disk of a 2-part archive;\n\
|
|
+ attempting to process anyway. If no further errors occur, this archive\n\
|
|
+ was probably created by PAK v2.51 or earlier. This bug was reported to\n\
|
|
+ NoGate in March 1991 and was supposed to have been fixed by mid-1991; as\n\
|
|
+ of mid-1992 it still hadn't been. (If further errors do occur, archive\n\
|
|
+ was probably created by PKZIP 2.04c or later; UnZip does not yet support\n\
|
|
+ multi-part archives.)\n";
|
|
+# else
|
|
+ static ZCONST char Far MaybePakBug[] = "warning [%s]:\
|
|
+ zipfile claims to be last disk of a multi-part archive;\n\
|
|
+ attempting to process anyway, assuming all parts have been concatenated\n\
|
|
+ together in order. Expect \"errors\" and warnings...true multi-part support\
|
|
+\n doesn't exist yet (coming soon).\n";
|
|
+# endif
|
|
+ static ZCONST char Far ExtraBytesAtStart[] =
|
|
+ "warning [%s]: %ld extra byte%s at beginning or within zipfile\n\
|
|
+ (attempting to process anyway)\n";
|
|
+#endif /* ?SFX */
|
|
+
|
|
+static ZCONST char Far MissingBytes[] =
|
|
+ "error [%s]: missing %ld bytes in zipfile\n\
|
|
+ (attempting to process anyway)\n";
|
|
+static ZCONST char Far NullCentDirOffset[] =
|
|
+ "error [%s]: NULL central directory offset\n\
|
|
+ (attempting to process anyway)\n";
|
|
+static ZCONST char Far ZipfileEmpty[] = "warning [%s]: zipfile is empty\n";
|
|
+static ZCONST char Far CentDirStartNotFound[] =
|
|
+ "error [%s]: start of central directory not found;\n\
|
|
+ zipfile corrupt.\n%s";
|
|
+#ifndef SFX
|
|
+ static ZCONST char Far CentDirTooLong[] =
|
|
+ "error [%s]: reported length of central directory is\n\
|
|
+ %ld bytes too long (Atari STZip zipfile? J.H.Holm ZIPSPLIT 1.1\n\
|
|
+ zipfile?). Compensating...\n";
|
|
+ static ZCONST char Far CentDirEndSigNotFound[] = "\
|
|
+ End-of-central-directory signature not found. Either this file is not\n\
|
|
+ a zipfile, or it constitutes one disk of a multi-part archive. In the\n\
|
|
+ latter case the central directory and zipfile comment will be found on\n\
|
|
+ the last disk(s) of this archive.\n";
|
|
+#else /* SFX */
|
|
+ static ZCONST char Far CentDirEndSigNotFound[] =
|
|
+ " End-of-central-directory signature not found.\n";
|
|
+#endif /* ?SFX */
|
|
+static ZCONST char Far ZipfileCommTrunc1[] =
|
|
+ "\ncaution: zipfile comment truncated\n";
|
|
+
|
|
+static ZCONST char Far FileNameTooLong[] =
|
|
+ "%s: error: %s (truncated): %s\n";
|
|
+
|
|
+/*******************************/
|
|
+/* Function process_zipfiles() */
|
|
+/*******************************/
|
|
+
|
|
+int process_zipfiles(__G) /* return PK-type error code */
|
|
+ __GDEF
|
|
+{
|
|
+#ifndef SFX
|
|
+ char *lastzipfn = (char *)NULL;
|
|
+ int NumWinFiles, NumLoseFiles, NumWarnFiles;
|
|
+ int NumMissDirs, NumMissFiles;
|
|
+#endif
|
|
+ int error=0, error_in_archive=0;
|
|
+
|
|
+
|
|
+/*---------------------------------------------------------------------------
|
|
+ Start by allocating buffers and (re)constructing the various PK signature
|
|
+ strings.
|
|
+ ---------------------------------------------------------------------------*/
|
|
+
|
|
+ G.inbuf = (uch *)malloc(INBUFSIZ + 4); /* 4 extra for hold[] (below) */
|
|
+ G.outbuf = (uch *)malloc(OUTBUFSIZ + 1); /* 1 extra for string term. */
|
|
+
|
|
+ if ((G.inbuf == (uch *)NULL) || (G.outbuf == (uch *)NULL)) {
|
|
+ Info(slide, 0x401, ((char *)slide,
|
|
+ LoadFarString(CannotAllocateBuffers)));
|
|
+ return(PK_MEM);
|
|
+ }
|
|
+ G.hold = G.inbuf + INBUFSIZ; /* to check for boundary-spanning sigs */
|
|
+#ifndef VMS /* VMS uses its own buffer scheme for textmode flush(). */
|
|
+#ifdef SMALL_MEM
|
|
+ G.outbuf2 = G.outbuf+RAWBUFSIZ; /* never changes */
|
|
+#endif
|
|
+#endif /* !VMS */
|
|
+
|
|
+#if 0 /* CRC_32_TAB has been NULLified by CONSTRUCTGLOBALS !!!! */
|
|
+ /* allocate the CRC table only later when we know we have a zipfile */
|
|
+ CRC_32_TAB = NULL;
|
|
+#endif /* 0 */
|
|
+
|
|
+ /* finish up initialization of magic signature strings */
|
|
+ local_hdr_sig[0] /* = extd_local_sig[0] */ = /* ASCII 'P', */
|
|
+ central_hdr_sig[0] = end_central_sig[0] = 0x50; /* not EBCDIC */
|
|
+
|
|
+ local_hdr_sig[1] /* = extd_local_sig[1] */ = /* ASCII 'K', */
|
|
+ central_hdr_sig[1] = end_central_sig[1] = 0x4B; /* not EBCDIC */
|
|
+
|
|
+/*---------------------------------------------------------------------------
|
|
+ Make sure timezone info is set correctly; localtime() returns GMT on
|
|
+ some OSes (e.g., Solaris 2.x) if this isn't done first. The ifdefs were
|
|
+ initially copied from dos_to_unix_time() in fileio.c. probably, they are
|
|
+ still too strict; any listed OS that supplies tzset(), regardless of
|
|
+ whether the function does anything, should be removed from the ifdefs.
|
|
+ ---------------------------------------------------------------------------*/
|
|
+
|
|
+#if (defined(WIN32) && defined(USE_EF_UT_TIME))
|
|
+ /* For the Win32 environment, we may have to "prepare" the environment
|
|
+ prior to the tzset() call, to work around tzset() implementation bugs.
|
|
+ */
|
|
+ iz_w32_prepareTZenv();
|
|
+#endif
|
|
+
|
|
+#if (defined(IZ_CHECK_TZ) && defined(USE_EF_UT_TIME))
|
|
+# ifndef VALID_TIMEZONE
|
|
+# define VALID_TIMEZONE(tmp) \
|
|
+ (((tmp = getenv("TZ")) != NULL) && (*tmp != '\0'))
|
|
+# endif
|
|
+ {
|
|
+ char *p;
|
|
+ G.tz_is_valid = VALID_TIMEZONE(p);
|
|
+# ifndef SFX
|
|
+ if (!G.tz_is_valid) {
|
|
+ Info(slide, 0x401, ((char *)slide, LoadFarString(WarnInvalidTZ)));
|
|
+ error_in_archive = error = PK_WARN;
|
|
+ }
|
|
+# endif /* !SFX */
|
|
+ }
|
|
+#endif /* IZ_CHECK_TZ && USE_EF_UT_TIME */
|
|
+
|
|
+/* For systems that do not have tzset() but supply this function using another
|
|
+ name (_tzset() or something similar), an appropiate "#define tzset ..."
|
|
+ should be added to the system specifc configuration section. */
|
|
+#if (!defined(T20_VMS) && !defined(MACOS) && !defined(RISCOS) && !defined(QDOS))
|
|
+#if (!defined(BSD) && !defined(MTS) && !defined(CMS_MVS) && !defined(TANDEM))
|
|
+ tzset();
|
|
+#endif
|
|
+#endif
|
|
+
|
|
+/*---------------------------------------------------------------------------
|
|
+ Initialize the internal flag holding the mode of processing "overwrite
|
|
+ existing file" cases. We do not use the calling interface flags directly
|
|
+ because the overwrite mode may be changed by user interaction while
|
|
+ processing archive files. Such a change should not affect the option
|
|
+ settings as passed through the DLL calling interface.
|
|
+ In case of conflicting options, the 'safer' flag uO.overwrite_none takes
|
|
+ precedence.
|
|
+ ---------------------------------------------------------------------------*/
|
|
+ G.overwrite_mode = (uO.overwrite_none ? OVERWRT_NEVER :
|
|
+ (uO.overwrite_all ? OVERWRT_ALWAYS : OVERWRT_QUERY));
|
|
+
|
|
+/*---------------------------------------------------------------------------
|
|
+ Match (possible) wildcard zipfile specification with existing files and
|
|
+ attempt to process each. If no hits, try again after appending ".zip"
|
|
+ suffix. If still no luck, give up.
|
|
+ ---------------------------------------------------------------------------*/
|
|
+
|
|
+#ifdef SFX
|
|
+ if ((error = do_seekable(__G__ 0)) == PK_NOZIP) {
|
|
+#ifdef EXE_EXTENSION
|
|
+ int len=strlen(G.argv0);
|
|
+
|
|
+ /* append .exe if appropriate; also .sfx? */
|
|
+ if ( (G.zipfn = (char *)malloc(len+sizeof(EXE_EXTENSION))) !=
|
|
+ (char *)NULL ) {
|
|
+ strcpy(G.zipfn, G.argv0);
|
|
+ strcpy(G.zipfn+len, EXE_EXTENSION);
|
|
+ error = do_seekable(__G__ 0);
|
|
+ free(G.zipfn);
|
|
+ G.zipfn = G.argv0; /* for "cannot find myself" message only */
|
|
+ }
|
|
+#endif /* EXE_EXTENSION */
|
|
+#ifdef WIN32
|
|
+ G.zipfn = G.argv0; /* for "cannot find myself" message only */
|
|
+#endif
|
|
+ }
|
|
+ if (error) {
|
|
+ if (error == IZ_DIR)
|
|
+ error_in_archive = PK_NOZIP;
|
|
+ else
|
|
+ error_in_archive = error;
|
|
+ if (error == PK_NOZIP)
|
|
+ Info(slide, 1, ((char *)slide, LoadFarString(CannotFindMyself),
|
|
+ G.zipfn));
|
|
+ }
|
|
+#ifdef CHEAP_SFX_AUTORUN
|
|
+ if (G.autorun_command[0] && !uO.qflag) { /* NO autorun without prompt! */
|
|
+ Info(slide, 0x81, ((char *)slide, LoadFarString(AutorunPrompt),
|
|
+ FnFilter1(G.autorun_command)));
|
|
+ if (fgets(G.answerbuf, 9, stdin) != (char *)NULL
|
|
+ && toupper(*G.answerbuf) == 'Y')
|
|
+ system(G.autorun_command);
|
|
+ else
|
|
+ Info(slide, 1, ((char *)slide, LoadFarString(NotAutoRunning)));
|
|
+ }
|
|
+#endif /* CHEAP_SFX_AUTORUN */
|
|
+
|
|
+#else /* !SFX */
|
|
+ NumWinFiles = NumLoseFiles = NumWarnFiles = 0;
|
|
+ NumMissDirs = NumMissFiles = 0;
|
|
+
|
|
+ while ((G.zipfn = do_wild(__G__ G.wildzipfn)) != (char *)NULL) {
|
|
+ Trace((stderr, "do_wild( %s ) returns %s\n", G.wildzipfn, G.zipfn));
|
|
+
|
|
+ lastzipfn = G.zipfn;
|
|
+
|
|
+ if (strlen(G.wildzipfn) > strlen(G.zipfn))
|
|
+ {
|
|
+ Info(slide, 1, ((char *)slide,
|
|
+ LoadFarString(FileNameTooLong),
|
|
+ uO.zipinfo_mode? LoadFarStringSmall(Zipnfo) : LoadFarStringSmall(Unzip),
|
|
+ G.zipfn, strerror(ENAMETOOLONG)));
|
|
+
|
|
+ free_G_buffers(__G);
|
|
+ return PK_NOZIP;
|
|
+ }
|
|
+
|
|
+ /* print a blank line between the output of different zipfiles */
|
|
+ if (!uO.qflag && error != PK_NOZIP && error != IZ_DIR
|
|
+#ifdef TIMESTAMP
|
|
+ && (!uO.T_flag || uO.zipinfo_mode)
|
|
+#endif
|
|
+ && (NumWinFiles+NumLoseFiles+NumWarnFiles+NumMissFiles) > 0)
|
|
+ (*G.message)((zvoid *)&G, (uch *)"\n", 1L, 0);
|
|
+
|
|
+ if ((error = do_seekable(__G__ 0)) == PK_WARN)
|
|
+ ++NumWarnFiles;
|
|
+ else if (error == IZ_DIR)
|
|
+ ++NumMissDirs;
|
|
+ else if (error == PK_NOZIP)
|
|
+ ++NumMissFiles;
|
|
+ else if (error)
|
|
+ ++NumLoseFiles;
|
|
+ else
|
|
+ ++NumWinFiles;
|
|
+
|
|
+ Trace((stderr, "do_seekable(0) returns %d\n", error));
|
|
+ if (error != IZ_DIR && error > error_in_archive)
|
|
+ error_in_archive = error;
|
|
+#ifdef WINDLL
|
|
+ if (error == IZ_CTRLC) {
|
|
+ free_G_buffers(__G);
|
|
+ return error;
|
|
+ }
|
|
+#endif
|
|
+
|
|
+ } /* end while-loop (wildcard zipfiles) */
|
|
+
|
|
+ if ((NumWinFiles + NumWarnFiles + NumLoseFiles) == 0 &&
|
|
+ (NumMissDirs + NumMissFiles) == 1 && lastzipfn != (char *)NULL)
|
|
+ {
|
|
+#if (!defined(UNIX) && !defined(AMIGA)) /* filenames with wildcard characters */
|
|
+ if (iswild(G.wildzipfn)) {
|
|
+ if (iswild(lastzipfn)) {
|
|
+ NumMissDirs = NumMissFiles = 0;
|
|
+ error_in_archive = PK_COOL;
|
|
+ Info(slide, 0x401, ((char *)slide,
|
|
+ LoadFarString(CannotFindWildcardMatch), uO.zipinfo_mode?
|
|
+ LoadFarStringSmall(Zipnfo) : LoadFarStringSmall(Unzip),
|
|
+ G.wildzipfn));
|
|
+ }
|
|
+ } else
|
|
+#endif
|
|
+ {
|
|
+ char *p = lastzipfn + strlen(lastzipfn);
|
|
+
|
|
+ G.zipfn = lastzipfn;
|
|
+ strcpy(p, ZSUFX);
|
|
+
|
|
+ NumMissDirs = NumMissFiles = 0;
|
|
+ error_in_archive = PK_COOL;
|
|
+
|
|
+#if defined(UNIX) || defined(QDOS)
|
|
+ /* only Unix has case-sensitive filesystems */
|
|
+ /* Well FlexOS (sometimes) also has them, but support is per media */
|
|
+ /* and a pig to code for, so treat as case insensitive for now */
|
|
+ /* we do this under QDOS to check for .zip as well as _zip */
|
|
+ if ((error = do_seekable(__G__ 0)) == PK_NOZIP || error == IZ_DIR) {
|
|
+ if (error == IZ_DIR)
|
|
+ ++NumMissDirs;
|
|
+ strcpy(p, ALT_ZSUFX);
|
|
+ error = do_seekable(__G__ 1);
|
|
+ }
|
|
+#else
|
|
+ error = do_seekable(__G__ 1);
|
|
+#endif
|
|
+ Trace((stderr, "do_seekable(1) returns %d\n", error));
|
|
+ switch (error) {
|
|
+ case PK_WARN:
|
|
+ ++NumWarnFiles;
|
|
+ break;
|
|
+ case IZ_DIR:
|
|
+ ++NumMissDirs;
|
|
+ error = PK_NOZIP;
|
|
+ break;
|
|
+ case PK_NOZIP:
|
|
+ /* increment again => bug:
|
|
+ "1 file had no zipfile directory." */
|
|
+ /* ++NumMissFiles */ ;
|
|
+ break;
|
|
+ default:
|
|
+ if (error)
|
|
+ ++NumLoseFiles;
|
|
+ else
|
|
+ ++NumWinFiles;
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ if (error > error_in_archive)
|
|
+ error_in_archive = error;
|
|
+#ifdef WINDLL
|
|
+ if (error == IZ_CTRLC) {
|
|
+ free_G_buffers(__G);
|
|
+ return error;
|
|
+ }
|
|
+#endif
|
|
+ }
|
|
+ }
|
|
+#endif /* ?SFX */
|
|
+
|
|
+/*---------------------------------------------------------------------------
|
|
+ Print summary of all zipfiles, assuming zipfile spec was a wildcard (no
|
|
+ need for a summary if just one zipfile).
|
|
+ ---------------------------------------------------------------------------*/
|
|
+
|
|
+#ifndef SFX
|
|
+ if (iswild(G.wildzipfn) && uO.qflag < 3
|
|
+#ifdef TIMESTAMP
|
|
+ && !(uO.T_flag && uO.qflag && !uO.zipinfo_mode)
|
|
+#endif
|
|
+ )
|
|
+ {
|
|
+ if ((NumMissFiles + NumLoseFiles + NumWarnFiles > 0 || NumWinFiles != 1)
|
|
+#ifdef TIMESTAMP
|
|
+ && !(uO.T_flag && !uO.zipinfo_mode)
|
|
+#endif
|
|
+ && !(uO.tflag && uO.qflag > 1))
|
|
+ (*G.message)((zvoid *)&G, (uch *)"\n", 1L, 0x401);
|
|
+ if ((NumWinFiles > 1) || (NumWinFiles == 1 &&
|
|
+ NumMissDirs + NumMissFiles + NumLoseFiles + NumWarnFiles > 0))
|
|
+ Info(slide, 0x401, ((char *)slide, LoadFarString(FilesProcessOK),
|
|
+ NumWinFiles, (NumWinFiles == 1)? " was" : "s were"));
|
|
+ if (NumWarnFiles > 0)
|
|
+ Info(slide, 0x401, ((char *)slide, LoadFarString(ArchiveWarning),
|
|
+ NumWarnFiles, (NumWarnFiles == 1)? "" : "s"));
|
|
+ if (NumLoseFiles > 0)
|
|
+ Info(slide, 0x401, ((char *)slide, LoadFarString(ArchiveFatalError),
|
|
+ NumLoseFiles, (NumLoseFiles == 1)? "" : "s"));
|
|
+ if (NumMissFiles > 0)
|
|
+ Info(slide, 0x401, ((char *)slide,
|
|
+ LoadFarString(FileHadNoZipfileDir), NumMissFiles,
|
|
+ (NumMissFiles == 1)? "" : "s"));
|
|
+ if (NumMissDirs == 1)
|
|
+ Info(slide, 0x401, ((char *)slide, LoadFarString(ZipfileWasDir)));
|
|
+ else if (NumMissDirs > 0)
|
|
+ Info(slide, 0x401, ((char *)slide,
|
|
+ LoadFarString(ManyZipfilesWereDir), NumMissDirs));
|
|
+ if (NumWinFiles + NumLoseFiles + NumWarnFiles == 0)
|
|
+ Info(slide, 0x401, ((char *)slide, LoadFarString(NoZipfileFound)));
|
|
+ }
|
|
+#endif /* !SFX */
|
|
+
|
|
+ /* free allocated memory */
|
|
+ free_G_buffers(__G);
|
|
+
|
|
+ return error_in_archive;
|
|
+
|
|
+} /* end function process_zipfiles() */
|
|
+
|
|
+
|
|
+
|
|
+
|
|
+
|
|
+/*****************************/
|
|
+/* Function free_G_buffers() */
|
|
+/*****************************/
|
|
+
|
|
+void free_G_buffers(__G) /* releases all memory allocated in global vars */
|
|
+ __GDEF
|
|
+{
|
|
+#ifndef SFX
|
|
+ unsigned i;
|
|
+#endif
|
|
+
|
|
+#ifdef SYSTEM_SPECIFIC_DTOR
|
|
+ SYSTEM_SPECIFIC_DTOR(__G);
|
|
+#endif
|
|
+
|
|
+ inflate_free(__G);
|
|
+ checkdir(__G__ (char *)NULL, END);
|
|
+
|
|
+#ifdef DYNALLOC_CRCTAB
|
|
+ if (CRC_32_TAB) {
|
|
+ free_crc_table();
|
|
+ CRC_32_TAB = NULL;
|
|
+ }
|
|
+#endif
|
|
+
|
|
+ if (G.key != (char *)NULL) {
|
|
+ free(G.key);
|
|
+ G.key = (char *)NULL;
|
|
+ }
|
|
+
|
|
+ if (G.extra_field != (uch *)NULL) {
|
|
+ free(G.extra_field);
|
|
+ G.extra_field = (uch *)NULL;
|
|
+ }
|
|
+
|
|
+#if (!defined(VMS) && !defined(SMALL_MEM))
|
|
+ /* VMS uses its own buffer scheme for textmode flush() */
|
|
+ if (G.outbuf2) {
|
|
+ free(G.outbuf2); /* malloc'd ONLY if unshrink and -a */
|
|
+ G.outbuf2 = (uch *)NULL;
|
|
+ }
|
|
+#endif
|
|
+
|
|
+ if (G.outbuf)
|
|
+ free(G.outbuf);
|
|
+ if (G.inbuf)
|
|
+ free(G.inbuf);
|
|
+ G.inbuf = G.outbuf = (uch *)NULL;
|
|
+
|
|
+#ifndef SFX
|
|
+ for (i = 0; i < DIR_BLKSIZ; i++) {
|
|
+ if (G.info[i].cfilname != (char Far *)NULL) {
|
|
+ zffree(G.info[i].cfilname);
|
|
+ G.info[i].cfilname = (char Far *)NULL;
|
|
+ }
|
|
+ }
|
|
+#endif
|
|
+
|
|
+#ifdef MALLOC_WORK
|
|
+ if (G.area.Slide) {
|
|
+ free(G.area.Slide);
|
|
+ G.area.Slide = (uch *)NULL;
|
|
+ }
|
|
+#endif
|
|
+
|
|
+} /* end function free_G_buffers() */
|
|
+
|
|
+
|
|
+
|
|
+
|
|
+
|
|
+/**************************/
|
|
+/* Function do_seekable() */
|
|
+/**************************/
|
|
+
|
|
+static int do_seekable(__G__ lastchance) /* return PK-type error code */
|
|
+ __GDEF
|
|
+ int lastchance;
|
|
+{
|
|
+#ifndef SFX
|
|
+ /* static int no_ecrec = FALSE; SKM: moved to globals.h */
|
|
+ int maybe_exe=FALSE;
|
|
+ int too_weird_to_continue=FALSE;
|
|
+#ifdef TIMESTAMP
|
|
+ time_t uxstamp;
|
|
+ ulg nmember = 0L;
|
|
+#endif
|
|
+#endif
|
|
+ int error=0, error_in_archive;
|
|
+
|
|
+
|
|
+/*---------------------------------------------------------------------------
|
|
+ Open the zipfile for reading in BINARY mode to prevent CR/LF translation,
|
|
+ which would corrupt the bit streams.
|
|
+ ---------------------------------------------------------------------------*/
|
|
+
|
|
+ if (SSTAT(G.zipfn, &G.statbuf) ||
|
|
+#ifdef THEOS
|
|
+ (error = S_ISLIB(G.statbuf.st_mode)) != 0 ||
|
|
+#endif
|
|
+ (error = S_ISDIR(G.statbuf.st_mode)) != 0)
|
|
+ {
|
|
+#ifndef SFX
|
|
+ if (lastchance && (uO.qflag < 3)) {
|
|
+#if defined(UNIX) || defined(QDOS)
|
|
+ if (G.no_ecrec)
|
|
+ Info(slide, 1, ((char *)slide,
|
|
+ LoadFarString(CannotFindZipfileDirMsg), uO.zipinfo_mode?
|
|
+ LoadFarStringSmall(Zipnfo) : LoadFarStringSmall(Unzip),
|
|
+ G.wildzipfn, uO.zipinfo_mode? " " : "", G.wildzipfn,
|
|
+ G.zipfn));
|
|
+ else
|
|
+ Info(slide, 1, ((char *)slide,
|
|
+ LoadFarString(CannotFindEitherZipfile), uO.zipinfo_mode?
|
|
+ LoadFarStringSmall(Zipnfo) : LoadFarStringSmall(Unzip),
|
|
+ G.wildzipfn, G.wildzipfn, G.zipfn));
|
|
+#else /* !(UNIX || QDOS) */
|
|
+ if (G.no_ecrec)
|
|
+ Info(slide, 0x401, ((char *)slide,
|
|
+ LoadFarString(CannotFindZipfileDirMsg), uO.zipinfo_mode?
|
|
+ LoadFarStringSmall(Zipnfo) : LoadFarStringSmall(Unzip),
|
|
+ G.wildzipfn, uO.zipinfo_mode? " " : "", G.zipfn));
|
|
+ else
|
|
+ Info(slide, 0x401, ((char *)slide,
|
|
+ LoadFarString(CannotFindEitherZipfile), uO.zipinfo_mode?
|
|
+ LoadFarStringSmall(Zipnfo) : LoadFarStringSmall(Unzip),
|
|
+ G.wildzipfn, G.zipfn));
|
|
+#endif /* ?(UNIX || QDOS) */
|
|
+ }
|
|
+#endif /* !SFX */
|
|
+ return error? IZ_DIR : PK_NOZIP;
|
|
+ }
|
|
+ G.ziplen = G.statbuf.st_size;
|
|
+
|
|
+#ifndef SFX
|
|
+#if defined(UNIX) || defined(DOS_OS2_W32) || defined(THEOS)
|
|
+ if (G.statbuf.st_mode & S_IEXEC) /* no extension on Unix exes: might */
|
|
+ maybe_exe = TRUE; /* find unzip, not unzip.zip; etc. */
|
|
+#endif
|
|
+#endif /* !SFX */
|
|
+
|
|
+#ifdef VMS
|
|
+ if (check_format(__G)) /* check for variable-length format */
|
|
+ return PK_ERR;
|
|
+#endif
|
|
+
|
|
+ if (open_input_file(__G)) /* this should never happen, given */
|
|
+ return PK_NOZIP; /* the stat() test above, but... */
|
|
+
|
|
+/*---------------------------------------------------------------------------
|
|
+ Find and process the end-of-central-directory header. UnZip need only
|
|
+ check last 65557 bytes of zipfile: comment may be up to 65535, end-of-
|
|
+ central-directory record is 18 bytes, and signature itself is 4 bytes;
|
|
+ add some to allow for appended garbage. Since ZipInfo is often used as
|
|
+ a debugging tool, search the whole zipfile if zipinfo_mode is true.
|
|
+ ---------------------------------------------------------------------------*/
|
|
+
|
|
+ /* initialize the CRC table pointer (once) */
|
|
+ if (CRC_32_TAB == NULL) {
|
|
+ if ((CRC_32_TAB = get_crc_table()) == NULL) {
|
|
+ CLOSE_INFILE();
|
|
+ return PK_MEM;
|
|
+ }
|
|
+ }
|
|
+
|
|
+#if (!defined(SFX) || defined(SFX_EXDIR))
|
|
+ /* check out if specified extraction root directory exists */
|
|
+ if (uO.exdir != (char *)NULL && G.extract_flag) {
|
|
+ G.create_dirs = !uO.fflag;
|
|
+ if ((error = checkdir(__G__ uO.exdir, ROOT)) > MPN_INF_SKIP) {
|
|
+ /* out of memory, or file in way */
|
|
+ CLOSE_INFILE();
|
|
+ return (error == MPN_NOMEM ? PK_MEM : PK_ERR);
|
|
+ }
|
|
+ }
|
|
+#endif /* !SFX || SFX_EXDIR */
|
|
+
|
|
+ G.cur_zipfile_bufstart = 0;
|
|
+ G.inptr = G.inbuf;
|
|
+
|
|
+#if (!defined(WINDLL) && !defined(SFX))
|
|
+#ifdef TIMESTAMP
|
|
+ if (!uO.zipinfo_mode && !uO.qflag && !uO.T_flag)
|
|
+#else
|
|
+ if (!uO.zipinfo_mode && !uO.qflag)
|
|
+#endif
|
|
+#ifdef WIN32 /* Win32 console may require codepage conversion for G.zipfn */
|
|
+ Info(slide, 0, ((char *)slide, "Archive: %s\n", FnFilter1(G.zipfn)));
|
|
+#else
|
|
+ Info(slide, 0, ((char *)slide, "Archive: %s\n", G.zipfn));
|
|
+#endif
|
|
+#endif /* !WINDLL && !SFX */
|
|
+
|
|
+ if ((
|
|
+#ifndef NO_ZIPINFO
|
|
+ uO.zipinfo_mode &&
|
|
+ ((error_in_archive = find_ecrec(__G__ G.ziplen)) != 0 ||
|
|
+ (error_in_archive = zi_end_central(__G)) > PK_WARN))
|
|
+ || (!uO.zipinfo_mode &&
|
|
+#endif
|
|
+ ((error_in_archive = find_ecrec(__G__ MIN(G.ziplen,66000L))) != 0 ||
|
|
+ (error_in_archive = uz_end_central(__G)) > PK_WARN)))
|
|
+ {
|
|
+ CLOSE_INFILE();
|
|
+
|
|
+#ifdef SFX
|
|
+ ++lastchance; /* avoid picky compiler warnings */
|
|
+ return error_in_archive;
|
|
+#else
|
|
+ if (maybe_exe)
|
|
+ Info(slide, 0x401, ((char *)slide, LoadFarString(MaybeExe),
|
|
+ G.zipfn));
|
|
+ if (lastchance)
|
|
+ return error_in_archive;
|
|
+ else {
|
|
+ G.no_ecrec = TRUE; /* assume we found wrong file: e.g., */
|
|
+ return PK_NOZIP; /* unzip instead of unzip.zip */
|
|
+ }
|
|
+#endif /* ?SFX */
|
|
+ }
|
|
+
|
|
+ if ((uO.zflag > 0) && !uO.zipinfo_mode) { /* unzip: zflag = comment ONLY */
|
|
+ CLOSE_INFILE();
|
|
+ return error_in_archive;
|
|
+ }
|
|
+
|
|
+/*---------------------------------------------------------------------------
|
|
+ Test the end-of-central-directory info for incompatibilities (multi-disk
|
|
+ archives) or inconsistencies (missing or extra bytes in zipfile).
|
|
+ ---------------------------------------------------------------------------*/
|
|
+
|
|
+#ifdef NO_MULTIPART
|
|
+ error = !uO.zipinfo_mode && (G.ecrec.number_this_disk == 1) &&
|
|
+ (G.ecrec.num_disk_start_cdir == 1);
|
|
+#else
|
|
+ error = !uO.zipinfo_mode && (G.ecrec.number_this_disk != 0);
|
|
+#endif
|
|
+
|
|
+#ifndef SFX
|
|
+ if (uO.zipinfo_mode &&
|
|
+ G.ecrec.number_this_disk != G.ecrec.num_disk_start_cdir)
|
|
+ {
|
|
+ if (G.ecrec.number_this_disk > G.ecrec.num_disk_start_cdir) {
|
|
+ Info(slide, 0x401, ((char *)slide,
|
|
+ LoadFarString(CentDirNotInZipMsg), G.zipfn,
|
|
+ G.ecrec.number_this_disk, G.ecrec.num_disk_start_cdir));
|
|
+ error_in_archive = PK_FIND;
|
|
+ too_weird_to_continue = TRUE;
|
|
+ } else {
|
|
+ Info(slide, 0x401, ((char *)slide,
|
|
+ LoadFarString(EndCentDirBogus), G.zipfn,
|
|
+ G.ecrec.number_this_disk, G.ecrec.num_disk_start_cdir));
|
|
+ error_in_archive = PK_WARN;
|
|
+ }
|
|
+#ifdef NO_MULTIPART /* concatenation of multiple parts works in some cases */
|
|
+ } else if (!uO.zipinfo_mode && !error && G.ecrec.number_this_disk != 0) {
|
|
+ Info(slide, 0x401, ((char *)slide, LoadFarString(NoMultiDiskArcSupport),
|
|
+ G.zipfn));
|
|
+ error_in_archive = PK_FIND;
|
|
+ too_weird_to_continue = TRUE;
|
|
+#endif
|
|
+ }
|
|
+
|
|
+ if (!too_weird_to_continue) { /* (relatively) normal zipfile: go for it */
|
|
+ if (error) {
|
|
+ Info(slide, 0x401, ((char *)slide, LoadFarString(MaybePakBug),
|
|
+ G.zipfn));
|
|
+ error_in_archive = PK_WARN;
|
|
+ }
|
|
+#endif /* !SFX */
|
|
+ if ((G.extra_bytes = G.real_ecrec_offset-G.expect_ecrec_offset) <
|
|
+ (Z_OFF_T)0)
|
|
+ {
|
|
+ Info(slide, 0x401, ((char *)slide, LoadFarString(MissingBytes),
|
|
+ G.zipfn, (long)(-G.extra_bytes)));
|
|
+ error_in_archive = PK_ERR;
|
|
+ } else if (G.extra_bytes > 0) {
|
|
+ if ((G.ecrec.offset_start_central_directory == 0) &&
|
|
+ (G.ecrec.size_central_directory != 0)) /* zip 1.5 -go bug */
|
|
+ {
|
|
+ Info(slide, 0x401, ((char *)slide,
|
|
+ LoadFarString(NullCentDirOffset), G.zipfn));
|
|
+ G.ecrec.offset_start_central_directory = G.extra_bytes;
|
|
+ G.extra_bytes = 0;
|
|
+ error_in_archive = PK_ERR;
|
|
+ }
|
|
+#ifndef SFX
|
|
+ else {
|
|
+ Info(slide, 0x401, ((char *)slide,
|
|
+ LoadFarString(ExtraBytesAtStart), G.zipfn,
|
|
+ (long)G.extra_bytes, (G.extra_bytes == 1)? "":"s"));
|
|
+ error_in_archive = PK_WARN;
|
|
+ }
|
|
+#endif /* !SFX */
|
|
+ }
|
|
+
|
|
+ /*-----------------------------------------------------------------------
|
|
+ Check for empty zipfile and exit now if so.
|
|
+ -----------------------------------------------------------------------*/
|
|
+
|
|
+ if (G.expect_ecrec_offset==0L && G.ecrec.size_central_directory==0) {
|
|
+ if (uO.zipinfo_mode)
|
|
+ Info(slide, 0, ((char *)slide, "%sEmpty zipfile.\n",
|
|
+ uO.lflag>9? "\n " : ""));
|
|
+ else
|
|
+ Info(slide, 0x401, ((char *)slide, LoadFarString(ZipfileEmpty),
|
|
+ G.zipfn));
|
|
+ CLOSE_INFILE();
|
|
+ return (error_in_archive > PK_WARN)? error_in_archive : PK_WARN;
|
|
+ }
|
|
+
|
|
+ /*-----------------------------------------------------------------------
|
|
+ Compensate for missing or extra bytes, and seek to where the start
|
|
+ of central directory should be. If header not found, uncompensate
|
|
+ and try again (necessary for at least some Atari archives created
|
|
+ with STZip, as well as archives created by J.H. Holm's ZIPSPLIT 1.1).
|
|
+ -----------------------------------------------------------------------*/
|
|
+
|
|
+ error = seek_zipf(__G__ G.ecrec.offset_start_central_directory);
|
|
+ if (error == PK_BADERR) {
|
|
+ CLOSE_INFILE();
|
|
+ return PK_BADERR;
|
|
+ }
|
|
+#ifdef OLD_SEEK_TEST
|
|
+ if (error != PK_OK || readbuf(__G__ G.sig, 4) == 0) {
|
|
+ CLOSE_INFILE();
|
|
+ return PK_ERR; /* file may be locked, or possibly disk error(?) */
|
|
+ }
|
|
+ if (strncmp(G.sig, central_hdr_sig, 4))
|
|
+#else
|
|
+ if ((error != PK_OK) || (readbuf(__G__ G.sig, 4) == 0) ||
|
|
+ strncmp(G.sig, central_hdr_sig, 4))
|
|
+#endif
|
|
+ {
|
|
+#ifndef SFX
|
|
+ long tmp = G.extra_bytes;
|
|
+#endif
|
|
+
|
|
+ G.extra_bytes = 0;
|
|
+ error = seek_zipf(__G__ G.ecrec.offset_start_central_directory);
|
|
+ if ((error != PK_OK) || (readbuf(__G__ G.sig, 4) == 0) ||
|
|
+ strncmp(G.sig, central_hdr_sig, 4))
|
|
+ {
|
|
+ if (error != PK_BADERR)
|
|
+ Info(slide, 0x401, ((char *)slide,
|
|
+ LoadFarString(CentDirStartNotFound), G.zipfn,
|
|
+ LoadFarStringSmall(ReportMsg)));
|
|
+ CLOSE_INFILE();
|
|
+ return (error != PK_OK ? error : PK_BADERR);
|
|
+ }
|
|
+#ifndef SFX
|
|
+ Info(slide, 0x401, ((char *)slide, LoadFarString(CentDirTooLong),
|
|
+ G.zipfn, -tmp));
|
|
+#endif
|
|
+ error_in_archive = PK_ERR;
|
|
+ }
|
|
+
|
|
+ /*-----------------------------------------------------------------------
|
|
+ Seek to the start of the central directory one last time, since we
|
|
+ have just read the first entry's signature bytes; then list, extract
|
|
+ or test member files as instructed, and close the zipfile.
|
|
+ -----------------------------------------------------------------------*/
|
|
+
|
|
+ error = seek_zipf(__G__ G.ecrec.offset_start_central_directory);
|
|
+ if (error != PK_OK) {
|
|
+ CLOSE_INFILE();
|
|
+ return error;
|
|
+ }
|
|
+
|
|
+ Trace((stderr, "about to extract/list files (error = %d)\n",
|
|
+ error_in_archive));
|
|
+
|
|
+#ifdef DLL
|
|
+ /* G.fValidate is used only to look at an archive to see if
|
|
+ it appears to be a valid archive. There is no interest
|
|
+ in what the archive contains, nor in validating that the
|
|
+ entries in the archive are in good condition. This is
|
|
+ currently used only in the Windows DLLs for purposes of
|
|
+ checking archives within an archive to determine whether
|
|
+ or not to display the inner archives.
|
|
+ */
|
|
+ if (!G.fValidate)
|
|
+#endif
|
|
+ {
|
|
+#ifndef NO_ZIPINFO
|
|
+ if (uO.zipinfo_mode)
|
|
+ error = zipinfo(__G); /* ZIPINFO 'EM */
|
|
+ else
|
|
+#endif
|
|
+#ifndef SFX
|
|
+#ifdef TIMESTAMP
|
|
+ if (uO.T_flag)
|
|
+ error = get_time_stamp(__G__ &uxstamp, &nmember);
|
|
+ else
|
|
+#endif
|
|
+ if (uO.vflag && !uO.tflag && !uO.cflag)
|
|
+ error = list_files(__G); /* LIST 'EM */
|
|
+ else
|
|
+#endif /* !SFX */
|
|
+ error = extract_or_test_files(__G); /* EXTRACT OR TEST 'EM */
|
|
+
|
|
+ Trace((stderr, "done with extract/list files (error = %d)\n",
|
|
+ error));
|
|
+ }
|
|
+
|
|
+ if (error > error_in_archive) /* don't overwrite stronger error */
|
|
+ error_in_archive = error; /* with (for example) a warning */
|
|
+#ifndef SFX
|
|
+ } /* end if (!too_weird_to_continue) */
|
|
+#endif
|
|
+
|
|
+ CLOSE_INFILE();
|
|
+
|
|
+#ifdef TIMESTAMP
|
|
+ if (uO.T_flag && !uO.zipinfo_mode && (nmember > 0L)) {
|
|
+# ifdef WIN32
|
|
+ if (stamp_file(__G__ G.zipfn, uxstamp)) { /* TIME-STAMP 'EM */
|
|
+# else
|
|
+ if (stamp_file(G.zipfn, uxstamp)) { /* TIME-STAMP 'EM */
|
|
+# endif
|
|
+ if (uO.qflag < 3)
|
|
+ Info(slide, 0x201, ((char *)slide,
|
|
+ "warning: cannot set time for %s\n", G.zipfn));
|
|
+ if (error_in_archive < PK_WARN)
|
|
+ error_in_archive = PK_WARN;
|
|
+ }
|
|
+ }
|
|
+#endif
|
|
+ return error_in_archive;
|
|
+
|
|
+} /* end function do_seekable() */
|
|
+
|
|
+
|
|
+
|
|
+
|
|
+
|
|
+/*************************/
|
|
+/* Function find_ecrec() */
|
|
+/*************************/
|
|
+
|
|
+static int find_ecrec(__G__ searchlen) /* return PK-class error */
|
|
+ __GDEF
|
|
+ long searchlen;
|
|
+{
|
|
+ int i, numblks, found=FALSE;
|
|
+ Z_OFF_T tail_len;
|
|
+ ec_byte_rec byterec;
|
|
+
|
|
+
|
|
+/*---------------------------------------------------------------------------
|
|
+ Treat case of short zipfile separately.
|
|
+ ---------------------------------------------------------------------------*/
|
|
+
|
|
+ if (G.ziplen <= INBUFSIZ) {
|
|
+ lseek(G.zipfd, 0L, SEEK_SET);
|
|
+ if ((G.incnt = read(G.zipfd,(char *)G.inbuf,(unsigned int)G.ziplen))
|
|
+ == (int)G.ziplen)
|
|
+
|
|
+ /* 'P' must be at least (ECREC_SIZE+4) bytes from end of zipfile */
|
|
+ for (G.inptr = G.inbuf+(int)G.ziplen-(ECREC_SIZE+4);
|
|
+ G.inptr >= G.inbuf;
|
|
+ --G.inptr) {
|
|
+ if ( (*G.inptr == (uch)0x50) && /* ASCII 'P' */
|
|
+ !strncmp((char *)G.inptr, end_central_sig, 4)) {
|
|
+ G.incnt -= (int)(G.inptr - G.inbuf);
|
|
+ found = TRUE;
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+
|
|
+/*---------------------------------------------------------------------------
|
|
+ Zipfile is longer than INBUFSIZ: may need to loop. Start with short
|
|
+ block at end of zipfile (if not TOO short).
|
|
+ ---------------------------------------------------------------------------*/
|
|
+
|
|
+ } else {
|
|
+ if ((tail_len = G.ziplen % INBUFSIZ) > ECREC_SIZE) {
|
|
+#ifdef USE_STRM_INPUT
|
|
+ fseek((FILE *)G.zipfd, G.ziplen-tail_len, SEEK_SET);
|
|
+ G.cur_zipfile_bufstart = ftell((FILE *)G.zipfd);
|
|
+#else /* !USE_STRM_INPUT */
|
|
+ G.cur_zipfile_bufstart = lseek(G.zipfd, G.ziplen-tail_len,
|
|
+ SEEK_SET);
|
|
+#endif /* ?USE_STRM_INPUT */
|
|
+ if ((G.incnt = read(G.zipfd, (char *)G.inbuf,
|
|
+ (unsigned int)tail_len)) != (int)tail_len)
|
|
+ goto fail; /* it's expedient... */
|
|
+
|
|
+ /* 'P' must be at least (ECREC_SIZE+4) bytes from end of zipfile */
|
|
+ for (G.inptr = G.inbuf+(int)tail_len-(ECREC_SIZE+4);
|
|
+ G.inptr >= G.inbuf;
|
|
+ --G.inptr) {
|
|
+ if ( (*G.inptr == (uch)0x50) && /* ASCII 'P' */
|
|
+ !strncmp((char *)G.inptr, end_central_sig, 4)) {
|
|
+ G.incnt -= (int)(G.inptr - G.inbuf);
|
|
+ found = TRUE;
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+ /* sig may span block boundary: */
|
|
+ memcpy((char *)G.hold, (char *)G.inbuf, 3);
|
|
+ } else
|
|
+ G.cur_zipfile_bufstart = G.ziplen - tail_len;
|
|
+
|
|
+ /*-----------------------------------------------------------------------
|
|
+ Loop through blocks of zipfile data, starting at the end and going
|
|
+ toward the beginning. In general, need not check whole zipfile for
|
|
+ signature, but may want to do so if testing.
|
|
+ -----------------------------------------------------------------------*/
|
|
+
|
|
+ numblks = (int)((searchlen - tail_len + (INBUFSIZ-1)) / INBUFSIZ);
|
|
+ /* ==amount= ==done== ==rounding== =blksiz= */
|
|
+
|
|
+ for (i = 1; !found && (i <= numblks); ++i) {
|
|
+ G.cur_zipfile_bufstart -= INBUFSIZ;
|
|
+ lseek(G.zipfd, G.cur_zipfile_bufstart, SEEK_SET);
|
|
+ if ((G.incnt = read(G.zipfd,(char *)G.inbuf,INBUFSIZ))
|
|
+ != INBUFSIZ)
|
|
+ break; /* fall through and fail */
|
|
+
|
|
+ for (G.inptr = G.inbuf+INBUFSIZ-1; G.inptr >= G.inbuf;
|
|
+ --G.inptr)
|
|
+ if ((native(*G.inptr) == 'P') &&
|
|
+ !strncmp((char *)G.inptr, end_central_sig, 4)) {
|
|
+ G.incnt -= (int)(G.inptr - G.inbuf);
|
|
+ found = TRUE;
|
|
+ break;
|
|
+ }
|
|
+ /* sig may span block boundary: */
|
|
+ memcpy((char *)G.hold, (char *)G.inbuf, 3);
|
|
+ }
|
|
+ } /* end if (ziplen > INBUFSIZ) */
|
|
+
|
|
+/*---------------------------------------------------------------------------
|
|
+ Searched through whole region where signature should be without finding
|
|
+ it. Print informational message and die a horrible death.
|
|
+ ---------------------------------------------------------------------------*/
|
|
+
|
|
+fail:
|
|
+ if (!found) {
|
|
+ if (uO.qflag || uO.zipinfo_mode)
|
|
+ Info(slide, 0x401, ((char *)slide, "[%s]\n", G.zipfn));
|
|
+ Info(slide, 0x401, ((char *)slide,
|
|
+ LoadFarString(CentDirEndSigNotFound)));
|
|
+ return PK_ERR; /* failed */
|
|
+ }
|
|
+
|
|
+/*---------------------------------------------------------------------------
|
|
+ Found the signature, so get the end-central data before returning. Do
|
|
+ any necessary machine-type conversions (byte ordering, structure padding
|
|
+ compensation) by reading data into character array and copying to struct.
|
|
+ ---------------------------------------------------------------------------*/
|
|
+
|
|
+ G.real_ecrec_offset = G.cur_zipfile_bufstart + (G.inptr-G.inbuf);
|
|
+#ifdef TEST
|
|
+ printf("\n found end-of-central-dir signature at offset %ld (%.8lXh)\n",
|
|
+ G.real_ecrec_offset, G.real_ecrec_offset);
|
|
+ printf(" from beginning of file; offset %d (%.4Xh) within block\n",
|
|
+ G.inptr-G.inbuf, G.inptr-G.inbuf);
|
|
+#endif
|
|
+
|
|
+ if (readbuf(__G__ (char *)byterec, ECREC_SIZE+4) == 0)
|
|
+ return PK_EOF;
|
|
+
|
|
+ G.ecrec.number_this_disk =
|
|
+ makeword(&byterec[NUMBER_THIS_DISK]);
|
|
+ G.ecrec.num_disk_start_cdir =
|
|
+ makeword(&byterec[NUM_DISK_WITH_START_CENTRAL_DIR]);
|
|
+ G.ecrec.num_entries_centrl_dir_ths_disk =
|
|
+ makeword(&byterec[NUM_ENTRIES_CENTRL_DIR_THS_DISK]);
|
|
+ G.ecrec.total_entries_central_dir =
|
|
+ makeword(&byterec[TOTAL_ENTRIES_CENTRAL_DIR]);
|
|
+ G.ecrec.size_central_directory =
|
|
+ makelong(&byterec[SIZE_CENTRAL_DIRECTORY]);
|
|
+ G.ecrec.offset_start_central_directory =
|
|
+ makelong(&byterec[OFFSET_START_CENTRAL_DIRECTORY]);
|
|
+ G.ecrec.zipfile_comment_length =
|
|
+ makeword(&byterec[ZIPFILE_COMMENT_LENGTH]);
|
|
+
|
|
+ G.expect_ecrec_offset = G.ecrec.offset_start_central_directory +
|
|
+ G.ecrec.size_central_directory;
|
|
+ return PK_COOL;
|
|
+
|
|
+} /* end function find_ecrec() */
|
|
+
|
|
+
|
|
+
|
|
+
|
|
+
|
|
+/*****************************/
|
|
+/* Function uz_end_central() */
|
|
+/*****************************/
|
|
+
|
|
+int uz_end_central(__G) /* return PK-type error code */
|
|
+ __GDEF
|
|
+{
|
|
+ int error = PK_COOL;
|
|
+
|
|
+
|
|
+/*---------------------------------------------------------------------------
|
|
+ Get the zipfile comment (up to 64KB long), if any, and print it out.
|
|
+ Then position the file pointer to the beginning of the central directory
|
|
+ and fill buffer.
|
|
+ ---------------------------------------------------------------------------*/
|
|
+
|
|
+#ifdef WINDLL
|
|
+ /* for comment button: */
|
|
+ if ((!G.fValidate) && (G.lpUserFunctions != NULL))
|
|
+ G.lpUserFunctions->cchComment = G.ecrec.zipfile_comment_length;
|
|
+ if (G.ecrec.zipfile_comment_length && (uO.zflag > 0))
|
|
+#else /* !WINDLL */
|
|
+ if (G.ecrec.zipfile_comment_length && (uO.zflag > 0 ||
|
|
+ (uO.zflag == 0 &&
|
|
+#ifdef TIMESTAMP
|
|
+ !uO.T_flag &&
|
|
+#endif
|
|
+ !uO.qflag)))
|
|
+#endif /* ?WINDLL */
|
|
+ {
|
|
+#if (defined(SFX) && defined(CHEAP_SFX_AUTORUN))
|
|
+ if (do_string(__G__ G.ecrec.zipfile_comment_length, CHECK_AUTORUN)) {
|
|
+#else
|
|
+ if (do_string(__G__ G.ecrec.zipfile_comment_length, DISPLAY)) {
|
|
+#endif
|
|
+ Info(slide, 0x401, ((char *)slide,
|
|
+ LoadFarString(ZipfileCommTrunc1)));
|
|
+ error = PK_WARN;
|
|
+ }
|
|
+ }
|
|
+#if (defined(SFX) && defined(CHEAP_SFX_AUTORUN))
|
|
+ else if (G.ecrec.zipfile_comment_length) {
|
|
+ if (do_string(__G__ G.ecrec.zipfile_comment_length, CHECK_AUTORUN_Q)) {
|
|
+ Info(slide, 0x401, ((char *)slide,
|
|
+ LoadFarString(ZipfileCommTrunc1)));
|
|
+ error = PK_WARN;
|
|
+ }
|
|
+ }
|
|
+#endif
|
|
+ return error;
|
|
+
|
|
+} /* end function uz_end_central() */
|
|
+
|
|
+
|
|
+
|
|
+
|
|
+
|
|
+/************************************/
|
|
+/* Function process_cdir_file_hdr() */
|
|
+/************************************/
|
|
+
|
|
+int process_cdir_file_hdr(__G) /* return PK-type error code */
|
|
+ __GDEF
|
|
+{
|
|
+ int error;
|
|
+
|
|
+
|
|
+/*---------------------------------------------------------------------------
|
|
+ Get central directory info, save host and method numbers, and set flag
|
|
+ for lowercase conversion of filename, depending on the OS from which the
|
|
+ file is coming.
|
|
+ ---------------------------------------------------------------------------*/
|
|
+
|
|
+ if ((error = get_cdir_ent(__G)) != 0)
|
|
+ return error;
|
|
+
|
|
+ G.pInfo->hostver = G.crec.version_made_by[0];
|
|
+ G.pInfo->hostnum = MIN(G.crec.version_made_by[1], NUM_HOSTS);
|
|
+/* extnum = MIN(crec.version_needed_to_extract[1], NUM_HOSTS); */
|
|
+
|
|
+ G.pInfo->lcflag = 0;
|
|
+ if (uO.L_flag == 1) /* name conversion for monocase systems */
|
|
+ switch (G.pInfo->hostnum) {
|
|
+ case FS_FAT_: /* PKZIP and zip -k store in uppercase */
|
|
+ case CPM_: /* like MS-DOS, right? */
|
|
+ case VM_CMS_: /* all caps? */
|
|
+ case MVS_: /* all caps? */
|
|
+ case TANDEM_:
|
|
+ case TOPS20_:
|
|
+ case VMS_: /* our Zip uses lowercase, but ASi's doesn't */
|
|
+ /* case Z_SYSTEM_: ? */
|
|
+ /* case QDOS_: ? */
|
|
+ G.pInfo->lcflag = 1; /* convert filename to lowercase */
|
|
+ break;
|
|
+
|
|
+ default: /* AMIGA_, FS_HPFS_, FS_NTFS_, MAC_, UNIX_, ATARI_, */
|
|
+ break; /* FS_VFAT_, ATHEOS_, BEOS_ (Z_SYSTEM_), THEOS_: */
|
|
+ /* no conversion */
|
|
+ }
|
|
+ else if (uO.L_flag > 1) /* let -LL force lower case for all names */
|
|
+ G.pInfo->lcflag = 1;
|
|
+
|
|
+ /* do Amigas (AMIGA_) also have volume labels? */
|
|
+ if (IS_VOLID(G.crec.external_file_attributes) &&
|
|
+ (G.pInfo->hostnum == FS_FAT_ || G.pInfo->hostnum == FS_HPFS_ ||
|
|
+ G.pInfo->hostnum == FS_NTFS_ || G.pInfo->hostnum == ATARI_))
|
|
+ {
|
|
+ G.pInfo->vollabel = TRUE;
|
|
+ G.pInfo->lcflag = 0; /* preserve case of volume labels */
|
|
+ } else
|
|
+ G.pInfo->vollabel = FALSE;
|
|
+
|
|
+ /* this flag is needed to detect archives made by "PKZIP for Unix" when
|
|
+ deciding which kind of codepage conversion has to be applied to
|
|
+ strings (see do_string() function in fileio.c) */
|
|
+ G.pInfo->HasUxAtt = (G.crec.external_file_attributes & 0xffff0000L) != 0L;
|
|
+
|
|
+ return PK_COOL;
|
|
+
|
|
+} /* end function process_cdir_file_hdr() */
|
|
+
|
|
+
|
|
+
|
|
+
|
|
+
|
|
+/***************************/
|
|
+/* Function get_cdir_ent() */
|
|
+/***************************/
|
|
+
|
|
+int get_cdir_ent(__G) /* return PK-type error code */
|
|
+ __GDEF
|
|
+{
|
|
+ cdir_byte_hdr byterec;
|
|
+
|
|
+
|
|
+/*---------------------------------------------------------------------------
|
|
+ Read the next central directory entry and do any necessary machine-type
|
|
+ conversions (byte ordering, structure padding compensation--do so by
|
|
+ copying the data from the array into which it was read (byterec) to the
|
|
+ usable struct (crec)).
|
|
+ ---------------------------------------------------------------------------*/
|
|
+
|
|
+ if (readbuf(__G__ (char *)byterec, CREC_SIZE) == 0)
|
|
+ return PK_EOF;
|
|
+
|
|
+ G.crec.version_made_by[0] = byterec[C_VERSION_MADE_BY_0];
|
|
+ G.crec.version_made_by[1] = byterec[C_VERSION_MADE_BY_1];
|
|
+ G.crec.version_needed_to_extract[0] =
|
|
+ byterec[C_VERSION_NEEDED_TO_EXTRACT_0];
|
|
+ G.crec.version_needed_to_extract[1] =
|
|
+ byterec[C_VERSION_NEEDED_TO_EXTRACT_1];
|
|
+
|
|
+ G.crec.general_purpose_bit_flag =
|
|
+ makeword(&byterec[C_GENERAL_PURPOSE_BIT_FLAG]);
|
|
+ G.crec.compression_method =
|
|
+ makeword(&byterec[C_COMPRESSION_METHOD]);
|
|
+ G.crec.last_mod_dos_datetime =
|
|
+ makelong(&byterec[C_LAST_MOD_DOS_DATETIME]);
|
|
+ G.crec.crc32 =
|
|
+ makelong(&byterec[C_CRC32]);
|
|
+ G.crec.csize =
|
|
+ makelong(&byterec[C_COMPRESSED_SIZE]);
|
|
+ G.crec.ucsize =
|
|
+ makelong(&byterec[C_UNCOMPRESSED_SIZE]);
|
|
+ G.crec.filename_length =
|
|
+ makeword(&byterec[C_FILENAME_LENGTH]);
|
|
+ G.crec.extra_field_length =
|
|
+ makeword(&byterec[C_EXTRA_FIELD_LENGTH]);
|
|
+ G.crec.file_comment_length =
|
|
+ makeword(&byterec[C_FILE_COMMENT_LENGTH]);
|
|
+ G.crec.disk_number_start =
|
|
+ makeword(&byterec[C_DISK_NUMBER_START]);
|
|
+ G.crec.internal_file_attributes =
|
|
+ makeword(&byterec[C_INTERNAL_FILE_ATTRIBUTES]);
|
|
+ G.crec.external_file_attributes =
|
|
+ makelong(&byterec[C_EXTERNAL_FILE_ATTRIBUTES]); /* LONG, not word! */
|
|
+ G.crec.relative_offset_local_header =
|
|
+ makelong(&byterec[C_RELATIVE_OFFSET_LOCAL_HEADER]);
|
|
+
|
|
+ return PK_COOL;
|
|
+
|
|
+} /* end function get_cdir_ent() */
|
|
+
|
|
+
|
|
+
|
|
+
|
|
+
|
|
+/*************************************/
|
|
+/* Function process_local_file_hdr() */
|
|
+/*************************************/
|
|
+
|
|
+int process_local_file_hdr(__G) /* return PK-type error code */
|
|
+ __GDEF
|
|
+{
|
|
+ local_byte_hdr byterec;
|
|
+
|
|
+
|
|
+/*---------------------------------------------------------------------------
|
|
+ Read the next local file header and do any necessary machine-type con-
|
|
+ versions (byte ordering, structure padding compensation--do so by copy-
|
|
+ ing the data from the array into which it was read (byterec) to the
|
|
+ usable struct (lrec)).
|
|
+ ---------------------------------------------------------------------------*/
|
|
+
|
|
+ if (readbuf(__G__ (char *)byterec, LREC_SIZE) == 0)
|
|
+ return PK_EOF;
|
|
+
|
|
+ G.lrec.version_needed_to_extract[0] =
|
|
+ byterec[L_VERSION_NEEDED_TO_EXTRACT_0];
|
|
+ G.lrec.version_needed_to_extract[1] =
|
|
+ byterec[L_VERSION_NEEDED_TO_EXTRACT_1];
|
|
+
|
|
+ G.lrec.general_purpose_bit_flag =
|
|
+ makeword(&byterec[L_GENERAL_PURPOSE_BIT_FLAG]);
|
|
+ G.lrec.compression_method = makeword(&byterec[L_COMPRESSION_METHOD]);
|
|
+ G.lrec.last_mod_dos_datetime = makelong(&byterec[L_LAST_MOD_DOS_DATETIME]);
|
|
+ G.lrec.crc32 = makelong(&byterec[L_CRC32]);
|
|
+ G.lrec.csize = makelong(&byterec[L_COMPRESSED_SIZE]);
|
|
+ G.lrec.ucsize = makelong(&byterec[L_UNCOMPRESSED_SIZE]);
|
|
+ G.lrec.filename_length = makeword(&byterec[L_FILENAME_LENGTH]);
|
|
+ G.lrec.extra_field_length = makeword(&byterec[L_EXTRA_FIELD_LENGTH]);
|
|
+
|
|
+ if ((G.lrec.general_purpose_bit_flag & 8) != 0) {
|
|
+ /* can't trust local header, use central directory: */
|
|
+ G.lrec.crc32 = G.pInfo->crc;
|
|
+ G.lrec.csize = G.pInfo->compr_size;
|
|
+ G.lrec.ucsize = G.pInfo->uncompr_size;
|
|
+ }
|
|
+
|
|
+ G.csize = (long)G.lrec.csize;
|
|
+
|
|
+ return PK_COOL;
|
|
+
|
|
+} /* end function process_local_file_hdr() */
|
|
+
|
|
+
|
|
+#ifdef USE_EF_UT_TIME
|
|
+
|
|
+/*******************************/
|
|
+/* Function ef_scan_for_izux() */
|
|
+/*******************************/
|
|
+
|
|
+unsigned ef_scan_for_izux(ef_buf, ef_len, ef_is_c, dos_mdatetime,
|
|
+ z_utim, z_uidgid)
|
|
+ ZCONST uch *ef_buf; /* buffer containing extra field */
|
|
+ unsigned ef_len; /* total length of extra field */
|
|
+ int ef_is_c; /* flag indicating "is central extra field" */
|
|
+ ulg dos_mdatetime; /* last_mod_file_date_time in DOS format */
|
|
+ iztimes *z_utim; /* return storage: atime, mtime, ctime */
|
|
+ ush *z_uidgid; /* return storage: uid and gid */
|
|
+{
|
|
+ unsigned flags = 0;
|
|
+ unsigned eb_id;
|
|
+ unsigned eb_len;
|
|
+ int have_new_type_eb = FALSE;
|
|
+ long i_time; /* buffer for Unix style 32-bit integer time value */
|
|
+#ifdef TIME_T_TYPE_DOUBLE
|
|
+ int ut_in_archive_sgn = 0;
|
|
+#else
|
|
+ int ut_zip_unzip_compatible = FALSE;
|
|
+#endif
|
|
+
|
|
+/*---------------------------------------------------------------------------
|
|
+ This function scans the extra field for EF_TIME, EF_IZUNIX2, EF_IZUNIX, or
|
|
+ EF_PKUNIX blocks containing Unix-style time_t (GMT) values for the entry's
|
|
+ access, creation, and modification time.
|
|
+ If a valid block is found, the time stamps are copied to the iztimes
|
|
+ structure (provided the z_utim pointer is not NULL).
|
|
+ If a IZUNIX2 block is found or the IZUNIX block contains UID/GID fields,
|
|
+ and the z_uidgid array pointer is valid (!= NULL), the owner info is
|
|
+ transfered as well.
|
|
+ The presence of an EF_TIME or EF_IZUNIX2 block results in ignoring all
|
|
+ data from probably present obsolete EF_IZUNIX blocks.
|
|
+ If multiple blocks of the same type are found, only the information from
|
|
+ the last block is used.
|
|
+ The return value is a combination of the EF_TIME Flags field with an
|
|
+ additional flag bit indicating the presence of valid UID/GID info,
|
|
+ or 0 in case of failure.
|
|
+ ---------------------------------------------------------------------------*/
|
|
+
|
|
+ if (ef_len == 0 || ef_buf == NULL || (z_utim == 0 && z_uidgid == NULL))
|
|
+ return 0;
|
|
+
|
|
+ TTrace((stderr,"\nef_scan_for_izux: scanning extra field of length %u\n",
|
|
+ ef_len));
|
|
+
|
|
+ while (ef_len >= EB_HEADSIZE) {
|
|
+ eb_id = makeword(EB_ID + ef_buf);
|
|
+ eb_len = makeword(EB_LEN + ef_buf);
|
|
+
|
|
+ if (eb_len > (ef_len - EB_HEADSIZE)) {
|
|
+ /* discovered some extra field inconsistency! */
|
|
+ TTrace((stderr,
|
|
+ "ef_scan_for_izux: block length %u > rest ef_size %u\n", eb_len,
|
|
+ ef_len - EB_HEADSIZE));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ switch (eb_id) {
|
|
+ case EF_TIME:
|
|
+ flags &= ~0x0ff; /* ignore previous IZUNIX or EF_TIME fields */
|
|
+ have_new_type_eb = TRUE;
|
|
+ if ( eb_len >= EB_UT_MINLEN && z_utim != NULL) {
|
|
+ unsigned eb_idx = EB_UT_TIME1;
|
|
+ TTrace((stderr,"ef_scan_for_izux: found TIME extra field\n"));
|
|
+ flags |= (ef_buf[EB_HEADSIZE+EB_UT_FLAGS] & 0x0ff);
|
|
+ if ((flags & EB_UT_FL_MTIME)) {
|
|
+ if ((eb_idx+4) <= eb_len) {
|
|
+ i_time = (long)makelong((EB_HEADSIZE+eb_idx) + ef_buf);
|
|
+ eb_idx += 4;
|
|
+ TTrace((stderr," UT e.f. modification time = %ld\n",
|
|
+ i_time));
|
|
+
|
|
+#ifdef TIME_T_TYPE_DOUBLE
|
|
+ if ((ulg)(i_time) & (ulg)(0x80000000L)) {
|
|
+ if (dos_mdatetime == DOSTIME_MINIMUM) {
|
|
+ ut_in_archive_sgn = -1;
|
|
+ z_utim->mtime =
|
|
+ (time_t)((long)i_time | (~(long)0x7fffffffL));
|
|
+ } else if (dos_mdatetime >= DOSTIME_2038_01_18) {
|
|
+ ut_in_archive_sgn = 1;
|
|
+ z_utim->mtime =
|
|
+ (time_t)((ulg)i_time & (ulg)0xffffffffL);
|
|
+ } else {
|
|
+ ut_in_archive_sgn = 0;
|
|
+ /* cannot determine sign of mtime;
|
|
+ without modtime: ignore complete UT field */
|
|
+ flags &= ~0x0ff; /* no time_t times available */
|
|
+ TTrace((stderr,
|
|
+ " UT modtime range error; ignore e.f.!\n"));
|
|
+ break; /* stop scanning this field */
|
|
+ }
|
|
+ } else {
|
|
+ /* cannot determine, safe assumption is FALSE */
|
|
+ ut_in_archive_sgn = 0;
|
|
+ z_utim->mtime = (time_t)i_time;
|
|
+ }
|
|
+#else /* !TIME_T_TYPE_DOUBLE */
|
|
+ if ((ulg)(i_time) & (ulg)(0x80000000L)) {
|
|
+ ut_zip_unzip_compatible =
|
|
+ ((time_t)0x80000000L < (time_t)0L)
|
|
+ ? (dos_mdatetime == DOSTIME_MINIMUM)
|
|
+ : (dos_mdatetime >= DOSTIME_2038_01_18);
|
|
+ if (!ut_zip_unzip_compatible) {
|
|
+ /* UnZip interprets mtime differently than Zip;
|
|
+ without modtime: ignore complete UT field */
|
|
+ flags &= ~0x0ff; /* no time_t times available */
|
|
+ TTrace((stderr,
|
|
+ " UT modtime range error; ignore e.f.!\n"));
|
|
+ break; /* stop scanning this field */
|
|
+ }
|
|
+ } else {
|
|
+ /* cannot determine, safe assumption is FALSE */
|
|
+ ut_zip_unzip_compatible = FALSE;
|
|
+ }
|
|
+ z_utim->mtime = (time_t)i_time;
|
|
+#endif /* ?TIME_T_TYPE_DOUBLE */
|
|
+ } else {
|
|
+ flags &= ~EB_UT_FL_MTIME;
|
|
+ TTrace((stderr," UT e.f. truncated; no modtime\n"));
|
|
+ }
|
|
+ }
|
|
+ if (ef_is_c) {
|
|
+ break; /* central version of TIME field ends here */
|
|
+ }
|
|
+
|
|
+ if (flags & EB_UT_FL_ATIME) {
|
|
+ if ((eb_idx+4) <= eb_len) {
|
|
+ i_time = (long)makelong((EB_HEADSIZE+eb_idx) + ef_buf);
|
|
+ eb_idx += 4;
|
|
+ TTrace((stderr," UT e.f. access time = %ld\n",
|
|
+ i_time));
|
|
+#ifdef TIME_T_TYPE_DOUBLE
|
|
+ if ((ulg)(i_time) & (ulg)(0x80000000L)) {
|
|
+ if (ut_in_archive_sgn == -1)
|
|
+ z_utim->atime =
|
|
+ (time_t)((long)i_time | (~(long)0x7fffffffL));
|
|
+ } else if (ut_in_archive_sgn == 1) {
|
|
+ z_utim->atime =
|
|
+ (time_t)((ulg)i_time & (ulg)0xffffffffL);
|
|
+ } else {
|
|
+ /* sign of 32-bit time is unknown -> ignore it */
|
|
+ flags &= ~EB_UT_FL_ATIME;
|
|
+ TTrace((stderr,
|
|
+ " UT access time range error: skip time!\n"));
|
|
+ }
|
|
+ } else {
|
|
+ z_utim->atime = (time_t)i_time;
|
|
+ }
|
|
+#else /* !TIME_T_TYPE_DOUBLE */
|
|
+ if (((ulg)(i_time) & (ulg)(0x80000000L)) &&
|
|
+ !ut_zip_unzip_compatible) {
|
|
+ flags &= ~EB_UT_FL_ATIME;
|
|
+ TTrace((stderr,
|
|
+ " UT access time range error: skip time!\n"));
|
|
+ } else {
|
|
+ z_utim->atime = (time_t)i_time;
|
|
+ }
|
|
+#endif /* ?TIME_T_TYPE_DOUBLE */
|
|
+ } else {
|
|
+ flags &= ~EB_UT_FL_ATIME;
|
|
+ }
|
|
+ }
|
|
+ if (flags & EB_UT_FL_CTIME) {
|
|
+ if ((eb_idx+4) <= eb_len) {
|
|
+ i_time = (long)makelong((EB_HEADSIZE+eb_idx) + ef_buf);
|
|
+ TTrace((stderr," UT e.f. creation time = %ld\n",
|
|
+ i_time));
|
|
+#ifdef TIME_T_TYPE_DOUBLE
|
|
+ if ((ulg)(i_time) & (ulg)(0x80000000L)) {
|
|
+ if (ut_in_archive_sgn == -1)
|
|
+ z_utim->ctime =
|
|
+ (time_t)((long)i_time | (~(long)0x7fffffffL));
|
|
+ } else if (ut_in_archive_sgn == 1) {
|
|
+ z_utim->ctime =
|
|
+ (time_t)((ulg)i_time & (ulg)0xffffffffL);
|
|
+ } else {
|
|
+ /* sign of 32-bit time is unknown -> ignore it */
|
|
+ flags &= ~EB_UT_FL_CTIME;
|
|
+ TTrace((stderr,
|
|
+ " UT creation time range error: skip time!\n"));
|
|
+ }
|
|
+ } else {
|
|
+ z_utim->ctime = (time_t)i_time;
|
|
+ }
|
|
+#else /* !TIME_T_TYPE_DOUBLE */
|
|
+ if (((ulg)(i_time) & (ulg)(0x80000000L)) &&
|
|
+ !ut_zip_unzip_compatible) {
|
|
+ flags &= ~EB_UT_FL_CTIME;
|
|
+ TTrace((stderr,
|
|
+ " UT creation time range error: skip time!\n"));
|
|
+ } else {
|
|
+ z_utim->ctime = (time_t)i_time;
|
|
+ }
|
|
+#endif /* ?TIME_T_TYPE_DOUBLE */
|
|
+ } else {
|
|
+ flags &= ~EB_UT_FL_CTIME;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ break;
|
|
+
|
|
+ case EF_IZUNIX2:
|
|
+ if (!have_new_type_eb) {
|
|
+ flags &= ~0x0ff; /* ignore any previous IZUNIX field */
|
|
+ have_new_type_eb = TRUE;
|
|
+ }
|
|
+ if (eb_len >= EB_UX2_MINLEN && z_uidgid != NULL) {
|
|
+ z_uidgid[0] = makeword((EB_HEADSIZE+EB_UX2_UID) + ef_buf);
|
|
+ z_uidgid[1] = makeword((EB_HEADSIZE+EB_UX2_GID) + ef_buf);
|
|
+ flags |= EB_UX2_VALID; /* signal success */
|
|
+ }
|
|
+ break;
|
|
+
|
|
+ case EF_IZUNIX:
|
|
+ case EF_PKUNIX: /* PKUNIX e.f. layout is identical to IZUNIX */
|
|
+ if (eb_len >= EB_UX_MINLEN) {
|
|
+ TTrace((stderr,"ef_scan_for_izux: found %s extra field\n",
|
|
+ (eb_id == EF_IZUNIX ? "IZUNIX" : "PKUNIX")));
|
|
+ if (have_new_type_eb) {
|
|
+ break; /* Ignore IZUNIX extra field block ! */
|
|
+ }
|
|
+ if (z_utim != NULL) {
|
|
+ flags |= (EB_UT_FL_MTIME | EB_UT_FL_ATIME);
|
|
+ i_time = (long)makelong((EB_HEADSIZE+EB_UX_MTIME)+ef_buf);
|
|
+ TTrace((stderr," Unix EF modtime = %ld\n", i_time));
|
|
+#ifdef TIME_T_TYPE_DOUBLE
|
|
+ if ((ulg)(i_time) & (ulg)(0x80000000L)) {
|
|
+ if (dos_mdatetime == DOSTIME_MINIMUM) {
|
|
+ ut_in_archive_sgn = -1;
|
|
+ z_utim->mtime =
|
|
+ (time_t)((long)i_time | (~(long)0x7fffffffL));
|
|
+ } else if (dos_mdatetime >= DOSTIME_2038_01_18) {
|
|
+ ut_in_archive_sgn = 1;
|
|
+ z_utim->mtime =
|
|
+ (time_t)((ulg)i_time & (ulg)0xffffffffL);
|
|
+ } else {
|
|
+ ut_in_archive_sgn = 0;
|
|
+ /* cannot determine sign of mtime;
|
|
+ without modtime: ignore complete UT field */
|
|
+ flags &= ~0x0ff; /* no time_t times available */
|
|
+ TTrace((stderr,
|
|
+ " UX modtime range error: ignore e.f.!\n"));
|
|
+ }
|
|
+ } else {
|
|
+ /* cannot determine, safe assumption is FALSE */
|
|
+ ut_in_archive_sgn = 0;
|
|
+ z_utim->mtime = (time_t)i_time;
|
|
+ }
|
|
+#else /* !TIME_T_TYPE_DOUBLE */
|
|
+ if ((ulg)(i_time) & (ulg)(0x80000000L)) {
|
|
+ ut_zip_unzip_compatible =
|
|
+ ((time_t)0x80000000L < (time_t)0L)
|
|
+ ? (dos_mdatetime == DOSTIME_MINIMUM)
|
|
+ : (dos_mdatetime >= DOSTIME_2038_01_18);
|
|
+ if (!ut_zip_unzip_compatible) {
|
|
+ /* UnZip interpretes mtime differently than Zip;
|
|
+ without modtime: ignore complete UT field */
|
|
+ flags &= ~0x0ff; /* no time_t times available */
|
|
+ TTrace((stderr,
|
|
+ " UX modtime range error: ignore e.f.!\n"));
|
|
+ }
|
|
+ } else {
|
|
+ /* cannot determine, safe assumption is FALSE */
|
|
+ ut_zip_unzip_compatible = FALSE;
|
|
+ }
|
|
+ z_utim->mtime = (time_t)i_time;
|
|
+#endif /* ?TIME_T_TYPE_DOUBLE */
|
|
+ i_time = (long)makelong((EB_HEADSIZE+EB_UX_ATIME)+ef_buf);
|
|
+ TTrace((stderr," Unix EF actime = %ld\n", i_time));
|
|
+#ifdef TIME_T_TYPE_DOUBLE
|
|
+ if ((ulg)(i_time) & (ulg)(0x80000000L)) {
|
|
+ if (ut_in_archive_sgn == -1)
|
|
+ z_utim->atime =
|
|
+ (time_t)((long)i_time | (~(long)0x7fffffffL));
|
|
+ } else if (ut_in_archive_sgn == 1) {
|
|
+ z_utim->atime =
|
|
+ (time_t)((ulg)i_time & (ulg)0xffffffffL);
|
|
+ } else if (flags & 0x0ff) {
|
|
+ /* sign of 32-bit time is unknown -> ignore it */
|
|
+ flags &= ~EB_UT_FL_ATIME;
|
|
+ TTrace((stderr,
|
|
+ " UX access time range error: skip time!\n"));
|
|
+ }
|
|
+ } else {
|
|
+ z_utim->atime = (time_t)i_time;
|
|
+ }
|
|
+#else /* !TIME_T_TYPE_DOUBLE */
|
|
+ if (((ulg)(i_time) & (ulg)(0x80000000L)) &&
|
|
+ !ut_zip_unzip_compatible && (flags & 0x0ff)) {
|
|
+ /* atime not in range of UnZip's time_t */
|
|
+ flags &= ~EB_UT_FL_ATIME;
|
|
+ TTrace((stderr,
|
|
+ " UX access time range error: skip time!\n"));
|
|
+ } else {
|
|
+ z_utim->atime = (time_t)i_time;
|
|
+ }
|
|
+#endif /* ?TIME_T_TYPE_DOUBLE */
|
|
+ }
|
|
+ if (eb_len >= EB_UX_FULLSIZE && z_uidgid != NULL) {
|
|
+ z_uidgid[0] = makeword((EB_HEADSIZE+EB_UX_UID) + ef_buf);
|
|
+ z_uidgid[1] = makeword((EB_HEADSIZE+EB_UX_GID) + ef_buf);
|
|
+ flags |= EB_UX2_VALID;
|
|
+ }
|
|
+ }
|
|
+ break;
|
|
+
|
|
+ default:
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ /* Skip this extra field block */
|
|
+ ef_buf += (eb_len + EB_HEADSIZE);
|
|
+ ef_len -= (eb_len + EB_HEADSIZE);
|
|
+ }
|
|
+
|
|
+ return flags;
|
|
+}
|
|
+
|
|
+#endif /* USE_EF_UT_TIME */
|
|
+
|
|
+
|
|
+#if (defined(RISCOS) || defined(ACORN_FTYPE_NFS))
|
|
+
|
|
+#define SPARKID_2 0x30435241 /* = "ARC0" */
|
|
+
|
|
+/*******************************/
|
|
+/* Function getRISCOSexfield() */
|
|
+/*******************************/
|
|
+
|
|
+zvoid *getRISCOSexfield(ef_buf, ef_len)
|
|
+ ZCONST uch *ef_buf; /* buffer containing extra field */
|
|
+ unsigned ef_len; /* total length of extra field */
|
|
+{
|
|
+ unsigned eb_id;
|
|
+ unsigned eb_len;
|
|
+
|
|
+/*---------------------------------------------------------------------------
|
|
+ This function scans the extra field for a Acorn SPARK filetype ef-block.
|
|
+ If a valid block is found, the function returns a pointer to the start
|
|
+ of the SPARK_EF block in the extra field buffer. Otherwise, a NULL
|
|
+ pointer is returned.
|
|
+ ---------------------------------------------------------------------------*/
|
|
+
|
|
+ if (ef_len == 0 || ef_buf == NULL)
|
|
+ return NULL;
|
|
+
|
|
+ TTrace((stderr,"\ngetRISCOSexfield: scanning extra field of length %u\n",
|
|
+ ef_len));
|
|
+
|
|
+ while (ef_len >= EB_HEADSIZE) {
|
|
+ eb_id = makeword(EB_ID + ef_buf);
|
|
+ eb_len = makeword(EB_LEN + ef_buf);
|
|
+
|
|
+ if (eb_len > (ef_len - EB_HEADSIZE)) {
|
|
+ /* discovered some extra field inconsistency! */
|
|
+ TTrace((stderr,
|
|
+ "getRISCOSexfield: block length %u > rest ef_size %u\n", eb_len,
|
|
+ ef_len - EB_HEADSIZE));
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ if (eb_id == EF_SPARK && (eb_len == 24 || eb_len == 20)) {
|
|
+ if (makelong(EB_HEADSIZE + ef_buf) == SPARKID_2) {
|
|
+ /* Return a pointer to the valid SPARK filetype ef block */
|
|
+ return (zvoid *)ef_buf;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* Skip this extra field block */
|
|
+ ef_buf += (eb_len + EB_HEADSIZE);
|
|
+ ef_len -= (eb_len + EB_HEADSIZE);
|
|
+ }
|
|
+
|
|
+ return NULL;
|
|
+}
|
|
+
|
|
+#endif /* (RISCOS || ACORN_FTYPE_NFS) */
|
|
--- unix/Makefile 2007-12-03 13:44:30.000000000 +0100
|
|
+++ unix/Makefile 2007-12-03 13:54:38.000000000 +0100
|
|
@@ -783,7 +783,7 @@ linux_asm: linux
|
|
# Linux (Posix, approximately SysV): virtually any version since before 0.96,
|
|
# for any platform. Change "-O" to "-O3" or whatever, as desired...
|
|
linux_noasm: unix_make
|
|
- $(MAKE) unzips CC=gcc LD=gcc CF="$(RPM_OPT_FLAGS) -I. $(LOC)"
|
|
+ $(MAKE) unzips CC=gcc LD=gcc CF="$(RPM_OPT_FLAGS) -D_LARGEFILE64_SOURCE -I. $(LOC)"
|
|
|
|
# Linux with lcc compiler: __inline__ (stat.h) not recognized, and must edit
|
|
# /usr/include/gnu/types.h to get rid of "long long" if __LCC__ defined. -O3
|
|
--- unix/Makefile.orig 2007-12-03 13:44:29.000000000 +0100
|
|
+++ unix/Makefile.orig 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,989 +0,0 @@
|
|
-#==============================================================================
|
|
-# Makefile for UnZip, UnZipSFX and fUnZip: Unix and MS-DOS ("real" makes only)
|
|
-# Version: 5.52 04 Feb 2005
|
|
-#==============================================================================
|
|
-
|
|
-
|
|
-# INSTRUCTIONS (such as they are):
|
|
-#
|
|
-# "make sunos" -- makes UnZip in current directory on a generic SunOS 4.x Sun
|
|
-# "make list" -- lists all supported systems (targets)
|
|
-# "make help" -- provides pointers on what targets to try if problems occur
|
|
-# "make wombat" -- chokes and dies if you haven't added the specifics for your
|
|
-# Wombat 68000 (or whatever) to the systems list
|
|
-#
|
|
-# CF are flags for the C compiler. LF are flags for the loader. LF2 are more
|
|
-# flags for the loader, if they need to be at the end of the line instead of at
|
|
-# the beginning (for example, some libraries). FL and FL2 are the corre-
|
|
-# sponding flags for fUnZip. LOCAL_UNZIP is an environment variable that can
|
|
-# be used to add default C flags to your compile without editing the Makefile
|
|
-# (e.g., -DDEBUG_STRUC, or -FPi87 on PCs using Microsoft C).
|
|
-#
|
|
-# Some versions of make do not define the macro "$(MAKE)"; this is rare, but
|
|
-# if things don't work, try using "make" instead of "$(MAKE)" in your system's
|
|
-# makerule. Or try adding the following line to your .login file:
|
|
-# setenv MAKE "make"
|
|
-# (That never works--makes that are too stupid to define MAKE are also too
|
|
-# stupid to look in the environment--but try it anyway for kicks. :-) )
|
|
-#
|
|
-# Memcpy and memset are provided for those systems that don't have them; they
|
|
-# are in fileio.c and will be used if -DZMEM is included in CF. These days
|
|
-# almost all systems have them.
|
|
-#
|
|
-# Be sure to test your new UnZip (and UnZipSFX and fUnZip); successful compila-
|
|
-# tion does not always imply a working program.
|
|
-
|
|
-
|
|
-#####################
|
|
-# MACRO DEFINITIONS #
|
|
-#####################
|
|
-
|
|
-# Defaults most systems use (use LOCAL_UNZIP in environment to add flags,
|
|
-# such as -DDOSWILD).
|
|
-
|
|
-# UnZip flags
|
|
-CC = cc# try using "gcc" target rather than changing this (CC and LD
|
|
-LD = $(CC)# must match, else "unresolved symbol: ___main" is possible)
|
|
-AS = as
|
|
-LOC = $(LOCAL_UNZIP)
|
|
-AF = $(LOC)
|
|
-CF = -O -I. -DUNIX $(LOC)
|
|
-LF = -o unzip
|
|
-LF2 = -s
|
|
-
|
|
-# UnZipSFX flags
|
|
-SL = -o unzipsfx
|
|
-SL2 = $(LF2)
|
|
-
|
|
-# fUnZip flags
|
|
-FL = -o funzip
|
|
-FL2 = $(LF2)
|
|
-
|
|
-# general-purpose stuff
|
|
-#CP = cp
|
|
-CP = cp
|
|
-LN = ln -s
|
|
-RM = rm -f
|
|
-CHMOD = chmod
|
|
-BINPERMS = 755
|
|
-MANPERMS = 644
|
|
-STRIP = strip
|
|
-E =
|
|
-O = .o
|
|
-M = unix
|
|
-SHELL = /bin/sh
|
|
-
|
|
-# Version info for unix/unix.c
|
|
-HOST_VERSINFO=-DIZ_CC_NAME='\"\$$(CC) \"' -DIZ_OS_NAME='\"`uname -a`\"'
|
|
-
|
|
-# defaults for crc32 stuff and system dependent headers
|
|
-CRC32 = crc32
|
|
-OSDEP_H =
|
|
-
|
|
-# object files
|
|
-OBJS1 = unzip$O $(CRC32)$O crctab$O crypt$O envargs$O explode$O
|
|
-OBJS2 = extract$O fileio$O globals$O inflate$O list$O match$O
|
|
-OBJS3 = process$O ttyio$O unreduce$O unshrink$O zipinfo$O
|
|
-OBJS = $(OBJS1) $(OBJS2) $(OBJS3) $M$O
|
|
-LOBJS = $(OBJS)
|
|
-OBJSDLL = $(OBJS:.o=.pic.o) api.pic.o
|
|
-OBJX = unzipsfx$O $(CRC32)$O crctab_$O crypt_$O extract_$O fileio_$O \
|
|
- globals_$O inflate_$O match_$O process_$O ttyio_$O $M_$O
|
|
-LOBJX = $(OBJX)
|
|
-OBJF = funzip$O $(CRC32)$O cryptf$O globalsf$O inflatef$O ttyiof$O
|
|
-#OBJS_OS2 = $(OBJS1:.o=.obj) $(OBJS2:.o=.obj) os2.obj
|
|
-#OBJF_OS2 = $(OBJF:.o=.obj)
|
|
-UNZIP_H = unzip.h unzpriv.h globals.h $(OSDEP_H)
|
|
-
|
|
-# installation
|
|
-# (probably can change next two to `install' and `install -d' if you have it)
|
|
-INSTALL = cp
|
|
-INSTALL_PROGRAM = $(INSTALL)
|
|
-INSTALL_D = mkdir -p
|
|
-# on some systems, manext=l and MANDIR=/usr/man/man$(manext) may be appropriate
|
|
-manext = 1
|
|
-prefix = /usr
|
|
-BINDIR = $(prefix)/bin# where to install executables
|
|
-MANDIR = $(prefix)/man/man$(manext)# where to install man pages
|
|
-INSTALLEDBIN = $(BINDIR)/funzip$E $(BINDIR)/unzip$E $(BINDIR)/unzipsfx$E \
|
|
- $(BINDIR)/zipgrep$E $(BINDIR)/zipinfo$E
|
|
-INSTALLEDMAN = $(MANDIR)/funzip.$(manext) $(MANDIR)/unzip.$(manext) \
|
|
- $(MANDIR)/unzipsfx.$(manext) $(MANDIR)/zipgrep.$(manext) \
|
|
- $(MANDIR)/zipinfo.$(manext)
|
|
-
|
|
-# Solaris 2.x stuff:
|
|
-PKGDIR = IZunzip
|
|
-VERSION = Version 5.52
|
|
-
|
|
-UNZIPS = unzip$E funzip$E unzipsfx$E
|
|
-# this is a little ugly...well, OK, it's a lot ugly:
|
|
-MANS = man/funzip.1 man/unzip.1 man/unzipsfx.1 man/zipgrep.1 man/zipinfo.1
|
|
-DOCS = funzip.txt unzip.txt unzipsfx.txt zipgrep.txt zipinfo.txt
|
|
-
|
|
-# list of supported systems/targets in this version
|
|
-SYSTEMSG = generic generic2 generic3 generic_zlib generic_shlib
|
|
-SYSTEMS1 = 386i 3Bx 7300 7300_gcc aix aix_rt amdahl amdahl_eft apollo aviion
|
|
-SYSTEMS2 = bsd bsdi bsdi_noasm bull coherent convex cray cray_opt cyber_sgi
|
|
-SYSTEMS3 = cygwin dec dnix encore eta freebsd gcc gould hk68 hp hpux
|
|
-SYSTEMS4 = isc isc_gcc isi linux linux_dos linux_noasm linux_shlib linux_shlibz
|
|
-SYSTEMS5 = lynx macosx macosx_gcc minix mips mpeix next next10 next2x next3x
|
|
-SYSTEMS6 = nextfat osf1 pixel ptx pyramid qnxnto realix regulus rs6000 sco
|
|
-SYSTEMS7 = sco_dos sco_sl sco_x286 sequent sgi solaris solaris_pkg stardent
|
|
-SYSTEMS8 = stellar sunos3 sunos4 sysv sysv_gcc sysv6300 tahoe ti_sysv ultrix
|
|
-SYSTEMS9 = vax v7 wombat xenix xos
|
|
-
|
|
-
|
|
-####################
|
|
-# DEFAULT HANDLING #
|
|
-####################
|
|
-
|
|
-# By default, print help on which makefile targets to try. (The SYSTEM
|
|
-# variable is no longer supported; use "make <target>" instead.)
|
|
-
|
|
-help:
|
|
- @echo ""
|
|
- @echo\
|
|
- " If you're not sure about the characteristics of your system, try typing"
|
|
- @echo\
|
|
- ' "make generic". If the compiler barfs and says something unpleasant about'
|
|
- @echo\
|
|
- ' "timezone redefined," try typing "make clean" followed by "make generic2".'
|
|
- @echo\
|
|
- ' If, on the other hand, it complains about an undefined symbol _ftime, try'
|
|
- @echo\
|
|
- ' typing "make clean" followed by "make generic3". One of these actions'
|
|
- @echo\
|
|
- ' should produce a working copy of unzip on most Unix systems. If you know'
|
|
- @echo\
|
|
- ' a bit more about the machine on which you work, you might try "make list"'
|
|
- @echo\
|
|
- ' for a list of the specific systems supported herein. (Many of them do'
|
|
- @echo\
|
|
- " exactly the same thing, so don't agonize too much over which to pick if"
|
|
- @echo\
|
|
- ' two or more sound equally likely.) Also check out the INSTALL file for'
|
|
- @echo\
|
|
- ' notes on compiling various targets. As a last resort, feel free to read'
|
|
- @echo\
|
|
- ' the numerous comments within the Makefile itself.'
|
|
- @echo\
|
|
- ' Have a mostly pretty good day.'
|
|
- @echo ""
|
|
-
|
|
-list:
|
|
- @echo ""
|
|
- @echo\
|
|
- 'Type "make <system>", where <system> is one of the following:'
|
|
- @echo ""
|
|
- @echo " $(SYSTEMSG)"
|
|
- @echo ""
|
|
- @echo " $(SYSTEMS1)"
|
|
- @echo " $(SYSTEMS2)"
|
|
- @echo " $(SYSTEMS3)"
|
|
- @echo " $(SYSTEMS4)"
|
|
- @echo " $(SYSTEMS5)"
|
|
- @echo " $(SYSTEMS6)"
|
|
- @echo " $(SYSTEMS7)"
|
|
- @echo " $(SYSTEMS8)"
|
|
- @echo " $(SYSTEMS9)"
|
|
-# @echo ""
|
|
-# @echo\
|
|
-# 'Targets for related utilities (ZipInfo and fUnZip) include:'
|
|
-# @echo ""
|
|
-# @echo " $(SYS_UTIL1)"
|
|
-# @echo " $(SYS_UTIL2)"
|
|
- @echo ""
|
|
- @echo\
|
|
- 'For further (very useful) information, please read the comments in Makefile.'
|
|
- @echo ""
|
|
-
|
|
-generic_msg:
|
|
- @echo ""
|
|
- @echo\
|
|
- ' Attempting "make generic" now. If this fails for some reason, type'
|
|
- @echo\
|
|
- ' "make help" and/or "make list" for suggestions.'
|
|
- @echo ""
|
|
-
|
|
-
|
|
-###############################################
|
|
-# BASIC COMPILE INSTRUCTIONS AND DEPENDENCIES #
|
|
-###############################################
|
|
-
|
|
-# this is for GNU make; comment out and notify zip-bugs if it causes errors
|
|
-.SUFFIXES: .c .o .obj .pic.o
|
|
-
|
|
-# yes, we should be able to use the $O macro to combine these two, but it
|
|
-# fails on some brain-damaged makes (e.g., AIX's)...no big deal
|
|
-.c.o:
|
|
- $(CC) -c $(CF) $*.c
|
|
-
|
|
-.c.obj:
|
|
- $(CC) -c $(CF) $*.c
|
|
-
|
|
-.c.pic.o:
|
|
- $(CC) -c $(CF) -o $@ $*.c
|
|
-
|
|
-# this doesn't work...directories are always a pain with implicit rules
|
|
-#.1.txt: man/$<
|
|
-# nroff -Tman -man $< | col -b | uniq | \
|
|
-# sed 's/Sun Release ..../Info-ZIP /' > $@
|
|
-
|
|
-
|
|
-# these rules may be specific to Linux (or at least the GNU groff package)
|
|
-# and are really intended only for the authors' use in creating non-Unix
|
|
-# documentation files (which are provided with both source and binary
|
|
-# distributions). We should probably add a ".1.txt" rule for more generic
|
|
-# systems...
|
|
-
|
|
-funzip.txt: man/funzip.1
|
|
- nroff -Tascii -man man/funzip.1 | col -b | uniq | expand > $@
|
|
-
|
|
-unzip.txt: man/unzip.1
|
|
- nroff -Tascii -man man/unzip.1 | col -b | uniq | expand > $@
|
|
-
|
|
-unzipsfx.txt: man/unzipsfx.1
|
|
- nroff -Tascii -man man/unzipsfx.1 | col -b | uniq | expand > $@
|
|
-
|
|
-zipgrep.txt: man/zipgrep.1
|
|
- nroff -Tascii -man man/zipgrep.1 | col -b | uniq | expand > $@
|
|
-
|
|
-zipinfo.txt: man/zipinfo.1
|
|
- nroff -Tascii -man man/zipinfo.1 | col -b | uniq | expand > $@
|
|
-
|
|
-
|
|
-all: generic_msg generic
|
|
-unzips: $(UNZIPS)
|
|
-objs: $(OBJS)
|
|
-objsdll: $(OBJSDLL)
|
|
-docs: $(DOCS)
|
|
-unzipsman: unzips docs
|
|
-unzipsdocs: unzips docs
|
|
-
|
|
-
|
|
-# EDIT HERE FOR PARALLEL MAKES on Sequent (and others?)--screws up MS-DOS
|
|
-# make utilities if default: change "unzip$E:" to "unzip$E:&"
|
|
-
|
|
-unzip$E: $(OBJS) # add `&' for parallel makes
|
|
- $(LD) $(LF) $(LOBJS) $(LF2)
|
|
-
|
|
-unzipsfx$E: $(OBJX) # add `&' for parallel makes
|
|
- $(LD) $(SL) $(LOBJX) $(SL2)
|
|
-
|
|
-funzip$E: $(OBJF) # add `&' for parallel makes
|
|
- $(LD) $(FL) $(OBJF) $(FL2)
|
|
-
|
|
-zipinfo$E: unzip$E # `&' is pointless here...
|
|
- @echo\
|
|
- ' This is a Unix-specific target. ZipInfo is not enabled in some MS-DOS'
|
|
- @echo\
|
|
- ' versions of UnZip; if it is in yours, copy unzip.exe to zipinfo.exe'
|
|
- @echo\
|
|
- ' or else invoke as "unzip -Z" (in a batch file, for example).'
|
|
- $(LN) unzip$E zipinfo$E
|
|
-
|
|
-
|
|
-crc32$O: crc32.c $(UNZIP_H) zip.h
|
|
-crctab$O: crctab.c $(UNZIP_H) zip.h
|
|
-crypt$O: crypt.c $(UNZIP_H) zip.h crypt.h ttyio.h
|
|
-envargs$O: envargs.c $(UNZIP_H)
|
|
-explode$O: explode.c $(UNZIP_H)
|
|
-extract$O: extract.c $(UNZIP_H) crypt.h
|
|
-fileio$O: fileio.c $(UNZIP_H) crypt.h ttyio.h ebcdic.h
|
|
-funzip$O: funzip.c $(UNZIP_H) crypt.h ttyio.h tables.h
|
|
-globals$O: globals.c $(UNZIP_H)
|
|
-inflate$O: inflate.c inflate.h $(UNZIP_H)
|
|
-list$O: list.c $(UNZIP_H)
|
|
-match$O: match.c $(UNZIP_H)
|
|
-process$O: process.c $(UNZIP_H)
|
|
-ttyio$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h
|
|
-unreduce$O: unreduce.c $(UNZIP_H)
|
|
-unshrink$O: unshrink.c $(UNZIP_H)
|
|
-unzip$O: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h
|
|
-zipinfo$O: zipinfo.c $(UNZIP_H)
|
|
-
|
|
-unzipsfx$O: unzip.c $(UNZIP_H) crypt.h unzvers.h consts.h # unzipsfx only
|
|
- -$(CP) unzip.c unzipsfx.c
|
|
- $(CC) -c $(CF) -DSFX unzipsfx.c
|
|
- $(RM) unzipsfx.c
|
|
-
|
|
-crctab_$O: crctab.c $(UNZIP_H) zip.h
|
|
- -$(CP) crctab.c crctab_.c
|
|
- $(CC) -c $(CF) -DSFX crctab_.c
|
|
- $(RM) crctab_.c
|
|
-
|
|
-crypt_$O: crypt.c $(UNZIP_H) zip.h crypt.h ttyio.h # unzipsfx only
|
|
- -$(CP) crypt.c crypt_.c
|
|
- $(CC) -c $(CF) -DSFX crypt_.c
|
|
- $(RM) crypt_.c
|
|
-
|
|
-extract_$O: extract.c $(UNZIP_H) crypt.h # unzipsfx only
|
|
- -$(CP) extract.c extract_.c
|
|
- $(CC) -c $(CF) -DSFX extract_.c
|
|
- $(RM) extract_.c
|
|
-
|
|
-fileio_$O: fileio.c $(UNZIP_H) crypt.h ttyio.h ebcdic.h
|
|
- -$(CP) fileio.c fileio_.c
|
|
- $(CC) -c $(CF) -DSFX fileio_.c
|
|
- $(RM) fileio_.c
|
|
-
|
|
-globals_$O: globals.c $(UNZIP_H) # unzipsfx only
|
|
- -$(CP) globals.c globals_.c
|
|
- $(CC) -c $(CF) -DSFX globals_.c
|
|
- $(RM) globals_.c
|
|
-
|
|
-inflate_$O: inflate.c inflate.h $(UNZIP_H) crypt.h # unzipsfx only
|
|
- -$(CP) inflate.c inflate_.c
|
|
- $(CC) -c $(CF) -DSFX inflate_.c
|
|
- $(RM) inflate_.c
|
|
-
|
|
-match_$O: match.c $(UNZIP_H) # unzipsfx only
|
|
- -$(CP) match.c match_.c
|
|
- $(CC) -c $(CF) -DSFX match_.c
|
|
- $(RM) match_.c
|
|
-
|
|
-process_$O: process.c $(UNZIP_H) # unzipsfx only
|
|
- -$(CP) process.c process_.c
|
|
- $(CC) -c $(CF) -DSFX process_.c
|
|
- $(RM) process_.c
|
|
-
|
|
-ttyio_$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h # unzipsfx only
|
|
- -$(CP) ttyio.c ttyio_.c
|
|
- $(CC) -c $(CF) -DSFX ttyio_.c
|
|
- $(RM) ttyio_.c
|
|
-
|
|
-
|
|
-cryptf$O: crypt.c $(UNZIP_H) zip.h crypt.h ttyio.h # funzip only
|
|
- -$(CP) crypt.c cryptf.c
|
|
- $(CC) -c $(CF) -DFUNZIP cryptf.c
|
|
- $(RM) cryptf.c
|
|
-
|
|
-globalsf$O: globals.c $(UNZIP_H) # funzip only
|
|
- -$(CP) globals.c globalsf.c
|
|
- $(CC) -c $(CF) -DFUNZIP globalsf.c
|
|
- $(RM) globalsf.c
|
|
-
|
|
-inflatef$O: inflate.c inflate.h $(UNZIP_H) crypt.h # funzip only
|
|
- -$(CP) inflate.c inflatef.c
|
|
- $(CC) -c $(CF) -DFUNZIP inflatef.c
|
|
- $(RM) inflatef.c
|
|
-
|
|
-ttyiof$O: ttyio.c $(UNZIP_H) zip.h crypt.h ttyio.h # funzip only
|
|
- -$(CP) ttyio.c ttyiof.c
|
|
- $(CC) -c $(CF) -DFUNZIP ttyiof.c
|
|
- $(RM) ttyiof.c
|
|
-
|
|
-
|
|
-# optional assembler replacements
|
|
-crc_i86$O: msdos/crc_i86.asm # 16bit only
|
|
- $(AS) $(AF) msdos/crc_i86.asm $(ASEOL)
|
|
-
|
|
-crc_gcc$O: crc_i386.S # 32bit, GNU AS
|
|
- $(AS) $(AF) -x assembler-with-cpp -c -o $@ crc_i386.S
|
|
-
|
|
-crc_gcc.pic.o: crc_i386.S # 32bit, GNU AS
|
|
- $(AS) $(AF) -x assembler-with-cpp -c -o $@ crc_i386.S
|
|
-
|
|
-crc_sysv$O: crc_i386.S # 32bit, SysV AS
|
|
- $(CC) -E $(AF) crc_i386.S > crc_i386s.s
|
|
- $(AS) -o $@ crc_i386s.s
|
|
- $(RM) crc_i386s.s
|
|
-
|
|
-msdos$O: msdos/msdos.c $(UNZIP_H) unzvers.h # DOS only
|
|
- $(CC) -c $(CF) msdos/msdos.c
|
|
-
|
|
-msdos_$O: msdos/msdos.c $(UNZIP_H) # DOS unzipsfx
|
|
- -$(CP) msdos/msdos.c msdos_.c > nul
|
|
- $(CC) -c $(CF) -DSFX msdos_.c
|
|
- $(RM) msdos_.c
|
|
-
|
|
-#os2$O: os2/os2.c $(UNZIP_H) # OS/2 only
|
|
-# $(CC) -c $(CF) os2/os2.c
|
|
-
|
|
-unix$O: unix/unix.c $(UNZIP_H) unzvers.h # Unix only
|
|
- $(CC) -c $(CF) unix/unix.c
|
|
-
|
|
-unix_$O: unix/unix.c $(UNZIP_H) # Unix unzipsfx
|
|
- -$(CP) unix/unix.c unix_.c
|
|
- $(CC) -c $(CF) -DSFX unix_.c
|
|
- $(RM) unix_.c
|
|
-
|
|
-unix.pic.o: unix/unix.c $(UNZIP_H) unzvers.h # Unix shlib
|
|
- $(CC) -c $(CF) -o $@ unix/unix.c
|
|
-
|
|
-
|
|
-unix_make:
|
|
-# @echo\
|
|
-# '(Ignore any errors from `make'"' due to the following command; it's harmless.)"
|
|
- -@2>&1 $(LN) unix/Makefile . > /dev/null || echo > /dev/null
|
|
-
|
|
-# this really only works for Unix targets, unless E and O specified on cmd line
|
|
-clean:
|
|
- @echo ""
|
|
- @echo ' This is a Unix-specific target. (Just so you know.)'
|
|
- @echo ""
|
|
- rm -f $(UNZIPS) $(OBJS) $(OBJF) $(OBJX) api$O apihelp$O crc_gcc$O \
|
|
- crc_sysv$O unzipstb$O crypt_.c extract_.c globals_.c inflate_.c \
|
|
- ttyio_.c crc_i386s.s msdos_.c process_.c unix_.c unzipsfx.c
|
|
- rm -rf ./$(PKGDIR)
|
|
-
|
|
-# Package generation interface (by J.Bush). Originally tested under Sun
|
|
-# Solaris 2.x. Other SVr4s may be very similar and could possibly use this.
|
|
-# Note: expects version info to be stored in VERSION macro variable.
|
|
-# See "README" under ./unix/Packaging
|
|
-#
|
|
-svr4package: unzips
|
|
- @echo "Creating SVR4 package for Unix ..."
|
|
- -@rm -rf ./$(PKGDIR) ./$(PKGDIR)_`uname -p`.pkg
|
|
- -@sed -e "s/.VERSION./$(VERSION)/g" \
|
|
- -e "s/.PSTAMP./$(LOGNAME)_`date | tr ' ' '_'`/g" \
|
|
- -e "s/.ARCH./Solaris_`uname -rp | tr ' ' ','`/g" \
|
|
- ./unix/Packaging/pkginfo.in > ./unix/Packaging/pkginfo
|
|
- -@sed -e "s/.ARCH./`uname -p`/g" \
|
|
- ./unix/Packaging/preinstall.in > ./unix/Packaging/preinstall
|
|
- /usr/bin/pkgmk -d . -b . -r . -f ./unix/Packaging/prototype $(PKGDIR)
|
|
- /usr/bin/pkgtrans -o -s . $(PKGDIR)_`uname -p`.pkg $(PKGDIR)
|
|
- @echo " "
|
|
- @echo "To install, copy $(PKGDIR)_`uname -p`.pkg to the target system, and"
|
|
- @echo "issue the command (as root): pkgadd -d $(PKGDIR)_`uname -p`.pkg"
|
|
- @echo " "
|
|
-
|
|
-install: $(MANS)
|
|
- -$(INSTALL_D) $(BINDIR)
|
|
- $(INSTALL_PROGRAM) $(UNZIPS) $(BINDIR)
|
|
- $(INSTALL) unix/zipgrep $(BINDIR)
|
|
- $(RM) $(BINDIR)/zipinfo$E
|
|
- $(LN) $(BINDIR)/unzip$E $(BINDIR)/zipinfo$E
|
|
- -$(INSTALL_D) $(MANDIR)
|
|
- $(INSTALL) man/funzip.1 $(MANDIR)/funzip.$(manext)
|
|
- $(INSTALL) man/unzip.1 $(MANDIR)/unzip.$(manext)
|
|
- $(INSTALL) man/unzipsfx.1 $(MANDIR)/unzipsfx.$(manext)
|
|
- $(INSTALL) man/zipgrep.1 $(MANDIR)/zipgrep.$(manext)
|
|
- $(INSTALL) man/zipinfo.1 $(MANDIR)/zipinfo.$(manext)
|
|
- $(CHMOD) $(BINPERMS) $(INSTALLEDBIN)
|
|
- $(CHMOD) $(MANPERMS) $(INSTALLEDMAN)
|
|
-
|
|
-uninstall:
|
|
- $(RM) $(INSTALLEDBIN) $(INSTALLEDMAN)
|
|
-
|
|
-
|
|
-# the test zipfile
|
|
-TESTZIP = testmake.zip
|
|
-
|
|
-# test some basic features of the build
|
|
-test: check
|
|
-
|
|
-check:
|
|
- @echo '##### This is a Unix-specific target. (Just so you know.)'
|
|
- @echo '##### Make sure unzip, funzip and unzipsfx are compiled and'
|
|
- @echo '##### in this directory.'
|
|
- @if test ! -f ./unzip; then \
|
|
- echo "##### ERROR: can't find ./unzip"; exit 1; fi
|
|
- @if test ! -f ./funzip; then \
|
|
- echo "##### ERROR: can't find ./funzip"; exit 1; fi
|
|
- @if test ! -f ./unzipsfx; then \
|
|
- echo "##### ERROR: can't find ./unzipsfx"; exit 1; fi
|
|
-#
|
|
- @if test ! -f $(TESTZIP); then \
|
|
- echo "##### ERROR: can't find test file $(TESTZIP)"; exit 1; fi
|
|
-#
|
|
- @echo "##### testing extraction"
|
|
- @./unzip -bo $(TESTZIP) testmake.zipinfo
|
|
- @if test ! -f testmake.zipinfo ; then \
|
|
- echo "##### ERROR: file extraction from $(TESTZIP) failed"; \
|
|
- exit 1; fi
|
|
-#
|
|
- @echo '##### testing zipinfo (unzip -Z)'
|
|
- @./unzip -Z $(TESTZIP) > testmake.unzip-Z
|
|
- @if diff testmake.unzip-Z testmake.zipinfo; then echo "OK."; else \
|
|
- echo "##### WARNING: zipinfo output doesn't match stored version"; \
|
|
- echo '##### (If the only difference is the file times, compare your'; \
|
|
- echo '##### timezone with the Central European timezone, which is one'; \
|
|
- echo '##### hour east of Greenwich but effectively 2 hours east'; \
|
|
- echo '##### during summer Daylight Savings Time. The upper two'; \
|
|
- echo '##### lines should correspond to your local time when the'; \
|
|
- echo '##### files were created, on 19 November 1998 at 10:46pm CET.'; \
|
|
- echo '##### If the times are consistent, please ignore this warning.)'; \
|
|
- fi
|
|
- @$(RM) testmake.unzip-Z testmake.zipinfo
|
|
-#
|
|
- @echo '##### testing unzip -d exdir option'
|
|
- @./unzip -bo $(TESTZIP) -d testun notes
|
|
- @cat testun/notes
|
|
-#
|
|
- @echo '##### testing unzip -o and funzip (ignore funzip warning)'
|
|
- @./unzip -boq $(TESTZIP) notes -d testun
|
|
- @./funzip < $(TESTZIP) > testun/notes2
|
|
- @if diff testun/notes testun/notes2; then true; else \
|
|
- echo '##### ERROR: funzip output disagrees with unzip'; fi
|
|
-#
|
|
- @echo '##### testing unzipsfx (self-extractor)'
|
|
- @cat unzipsfx $(TESTZIP) > testsfx
|
|
- @$(CHMOD) 0700 testsfx
|
|
- @./testsfx -bo notes
|
|
- @if diff notes testun/notes; then true; else \
|
|
- echo '##### ERROR: unzipsfx file disagrees with unzip'; fi
|
|
- @$(RM) testsfx notes testun/notes testun/notes2
|
|
- @rmdir testun
|
|
-#
|
|
- @echo '##### testing complete.'
|
|
-
|
|
-
|
|
-################################
|
|
-# INDIVIDUAL MACHINE MAKERULES #
|
|
-################################
|
|
-
|
|
-#----------------------------------------------------------------------------
|
|
-# Generic targets (can't assume make utility groks "$(MAKE)")
|
|
-#----------------------------------------------------------------------------
|
|
-
|
|
-generic: unzips # first try if unknown
|
|
-
|
|
-generic2: unix_make # second try if unknown: hope make is called "make"
|
|
- make -f unix/Makefile unzips CF="$(CF) -DBSD"
|
|
-
|
|
-generic3: unix_make # third try if unknown: hope make is called "make"
|
|
- make -f unix/Makefile unzips CF="$(CF) -DSYSV"
|
|
-
|
|
-# Generic unzip and funzip target using either shared or static zlib for
|
|
-# inflate rather than the original UnZip version. (libz was libgz prior
|
|
-# to 0.94) Need to figure out how to force unzipsfx to use static libz.
|
|
-
|
|
-generic_zlib: unix_make
|
|
- @echo\
|
|
- "This target assumes zlib (libz.a or libz.so.*) is already installed."
|
|
- $(MAKE) unzip funzip CF="$(CF) -DUSE_ZLIB" LF2="-lz $(LF2)"
|
|
-
|
|
-# Generic GNU C shared library. This is an example of how to compile UnZip as
|
|
-# a shared library. (Doing so as a static library would be similar.) See also
|
|
-# the linux_shlib target.
|
|
-
|
|
-generic_shlib: unix_make
|
|
- @echo\
|
|
- 'This target requires GNU C. When done, do "setenv LD_LIBRARY_PATH `pwd`"'
|
|
- @echo\
|
|
- 'or similar in order to test the shared library in place (with ./unzip_shlib ,'
|
|
- @echo\
|
|
- 'which is UnZip linked with the DLL). This target is an example only.'
|
|
- @echo ""
|
|
- $(MAKE) objsdll CC=gcc CF="-O3 -Wall -I. -fPIC -DDLL -DUNIX $(LOC)"
|
|
- gcc -shared -Wl,-soname,libunzip.so.0 -o libunzip.so.0.4 $(OBJSDLL)
|
|
- $(RM) libunzip.so.0 libunzip.so
|
|
- $(LN) -s libunzip.so.0.4 libunzip.so.0
|
|
- $(LN) -s libunzip.so.0 libunzip.so
|
|
- gcc -c -O unzipstb.c
|
|
- gcc -o unzip_shlib unzipstb.o -L. -lunzip
|
|
-
|
|
-#----------------------------------------------------------------------------
|
|
-# "Normal" group (BSD vs. SysV may be set in unzip.h via predefined macros):
|
|
-#----------------------------------------------------------------------------
|
|
-
|
|
-386i: unzips # sun386i, SunOS 4.0.2
|
|
-#3Bx: unzips # AT&T 3B2/1000-80; should work on any WE32XXX machine
|
|
-#aix_rt: unzips # IBM RT 6150 under AIX 2.2.1
|
|
-bull: unzips # Bull DPX/2, BOS 2.00.45 (doesn't require -Xk switch)
|
|
-convex: unzips # Convex C-120 and C-210 (-O is enough; -ext is default)
|
|
-cray: unzips # Cray-2 and Y-MP, using default (possibly old) compiler
|
|
-dec: unzips # DEC 5820 (MIPS RISC), test version of Ultrix v4.0
|
|
-encore: unzips # Multimax
|
|
-eta: unzips # ETA-10P*, hybrid SysV with BSD 4.3 enhancements
|
|
-gould: unzips # Gould PN9000 running UTX/32 2.1Bu01
|
|
-hp: unzips # HP 9000 series (68020), 4.3BSD or HP-UX A.B3.10 Ver D
|
|
-hpux: unzips # (to match zip's makefile entry)
|
|
-mips: unzips # MIPS M120-5(?), SysV.3 [error in sys/param.h file?]
|
|
-next10: unzips # NeXT (generic; use next2x or next3x for better opt.)
|
|
-osf1: unzips # DECstation, including Alpha-based; DEC OSF/1 v1.x
|
|
-pyr_: unzips # [failsafe target for pyramid target below]
|
|
-pyr_ucb: unzips # Pyramids running BSD universe by default (see below)
|
|
-realix: unzips # Modcomp Real/IX (SysV.3); note "gcc" = GLS C, not GNU
|
|
-sco: unzips # Xenix/386 (tested on 2.3.1); SCO Unix 3.2.0.
|
|
-sgi: unzips # Silicon Graphics; Irix 3.3.2, 4.0.x, 5.2, etc.
|
|
-stellar: unzips # gs-2000
|
|
-sun: unzips # old target; no good with solaris...use "sunos" now
|
|
-sunos: unzips # no good with SunOS 3.x...use "sunos3" or "sunos4" now
|
|
-sunos4: unzips # Sun 3, 4; SunOS 4.x (SOME SYSTEMS ARE SYSTEM V!)
|
|
-tahoe: unzips # tahoe (CCI Power6/32), 4.3BSD
|
|
-ultrix: unzips # VAXen, DEC 58x0 (MIPS guts), DECstation 2100; v4.x
|
|
-vax: unzips # general-purpose VAX target (not counting VMS)
|
|
-
|
|
-#----------------------------------------------------------------------------
|
|
-# BSD group (for timezone structs [struct timeb]):
|
|
-#----------------------------------------------------------------------------
|
|
-
|
|
-bsd: _bsd # generic BSD (BSD 4.2 & Ultrix handled in unzip.h)
|
|
-
|
|
-_bsd: unix_make
|
|
- $(MAKE) unzips CF="$(CF) -DBSD"
|
|
-
|
|
-#----------------------------------------------------------------------------
|
|
-# SysV group (for extern long timezone and ioctl.h instead of sgtty.h):
|
|
-#----------------------------------------------------------------------------
|
|
-
|
|
-aix_rt: _sysv # IBM RT 6150 under AIX 2.2.1
|
|
-aviion: _sysv # Data General AViiONs, DG/UX 4.3x
|
|
-pyr_att: _sysv # Pyramids running AT&T (SysV) universe by default
|
|
-solaris: _sysv # Sun SPARC & x86, Solaris 2.x
|
|
-solaris_pkg: _sysvp # Sun SPARC & x86, Solaris 2.x; make package when done
|
|
-stardent: _sysv # Stardent ...
|
|
-sysv: _sysv # generic System V Unix (Xenix handled in unzip.h)
|
|
-xos: _sysv # Olivetti LSX-3005..3045, X/OS 2.3 and 2.4
|
|
-
|
|
-_sysv: unix_make
|
|
- $(MAKE) unzips CF="$(CF) -DSYSV"
|
|
-
|
|
-# extension to perform SVR4 package-creation after compilation
|
|
-_sysvp: _sysv svr4package
|
|
-
|
|
-#----------------------------------------------------------------------------
|
|
-# Version 7 group (old/obsolescent):
|
|
-#----------------------------------------------------------------------------
|
|
-
|
|
-pixel: _v7 # Pixel 80, 100 (68000-based, V7/mostly BSD4.1 compat.)
|
|
-v7: _v7 # generic Unix Version 7 box (prob. only Pixel...)
|
|
-
|
|
-_v7:
|
|
- make -f unix/Makefile unzips \
|
|
- CF="$(CF) -DV7 -DNO_PARAM_H -DSHORT_NAMES -DBSD -DZMEM"
|
|
-
|
|
-#----------------------------------------------------------------------------
|
|
-# "Unique" group (require non-standard options):
|
|
-#----------------------------------------------------------------------------
|
|
-
|
|
-# AT&T 3B2/1000-80; should work on any WE32XXX machine
|
|
-3Bx: unix_make
|
|
- $(MAKE) unzips CF="$(CF) -DCBREAK=2"
|
|
-
|
|
-# AT&T 7300 (M68000/SysV.3) (add -DSYSV? -DNO_LIMITS?)
|
|
-7300: unix_make
|
|
- $(MAKE) unzips CF="$(CF) -DNO_DIR -DNO_MKDIR -DNO_STRNICMP -DNO_UID_GID -DCBREAK=2"
|
|
-
|
|
-7300_gcc: unix_make
|
|
- $(MAKE) unzips CC=gcc LD=gcc LF2="" \
|
|
- CF="-O2 -I. -DNO_DIR -DNO_MKDIR -DNO_STDLIB_H -DNO_STRNICMP -DNO_UID_GID -DCBREAK=2 $(LOC)"
|
|
- $(STRIP) $(UNZIPS)
|
|
-
|
|
-# IBM AIX 3.x on an RS/6000: see rs6000 target below
|
|
-aix: rs6000
|
|
-
|
|
-# Amdahl (IBMish) mainframe, UTS (SysV) 1.2.4, 2.0.1, 3.x
|
|
-amdahl: unix_make
|
|
- $(MAKE) unzips CF="$(CF) -DSYSV -DNO_UID_GID"
|
|
-
|
|
-# Amdahl UTS 2.1.4 with "extended file types" filesystem (aarrrggghhhh...)
|
|
-amdahl_eft: unix_make
|
|
- $(MAKE) unzips CF="$(CF) -eft -DSYSV -DNO_UID_GID"
|
|
-
|
|
-# Apollo Domain/OS machines (added -D...SOURCE options) [Gordon Fox, 960810]
|
|
-apollo: unix_make
|
|
- $(MAKE) unzips CF="$(CF) -D_INCLUDE_BSD_SOURCE -D_INCLUDE_XOPEN_SOURCE"
|
|
-
|
|
-# BSDI BSD/OS on 386 platform, using the assembler replacement for crc32.c
|
|
-bsdi: unix_make
|
|
- @echo 'NOTE: use bsdi_noasm target for non-Intel BSD/OS compiles.'
|
|
- $(MAKE) unzips CC=gcc2 LD=shlicc2 AS=gcc2\
|
|
- CF="-O3 -Wall -I. -DASM_CRC -DUNIX -DBSD $(LOC)" CRC32=crc_gcc
|
|
-
|
|
-# BSDI BSD/OS
|
|
-bsdi_noasm: unix_make
|
|
-# @echo 'NOTE: use bsd target for non-Intel BSD/OS compiles.'
|
|
- $(MAKE) unzips CC=gcc2 LD=shlicc2 AS=gcc2\
|
|
- CF="-O3 -Wall -I. -DUNIX -DBSD $(LOC)"
|
|
-
|
|
-# Coherent 3.x/4.x, Mark Williams C. ``For Coherent's CC, it needs either
|
|
-# -T0 or -T150000 (or bigger) added to the CFLAGS, otherwise the compiler
|
|
-# runs out of memory and dies in zipinfo.c.'' [Fred "Fredex" Smith, 940719]
|
|
-coherent: unix_make
|
|
- $(MAKE) unzips CF="$(CF) -T0"
|
|
-
|
|
-# Cray-2, Y-MP or C90, running Unicos 5.x to 8.x (SysV + BSD enhancements)
|
|
-# and Standard (ANSI) C compiler 3.0 or later.
|
|
-cray_opt: unix_make
|
|
- $(MAKE) unzips CF="$(CF) -h scalar3 -h vector3"
|
|
-
|
|
-# The unzip41 build on a Cyber 910/SGI running Irix v3.3.3 was successful
|
|
-# with the following change to Makefile:
|
|
-cyber_sgi: unix_make
|
|
- $(MAKE) unzips CF="$(CF) -I/usr/include/bsd"\
|
|
- LF="-lbsd $(LF)" SL="-lbsd $(SL)"
|
|
-
|
|
-# The Cygwin environment on a Win32 system, treated as an UNIX emulator.
|
|
-# This port does not offer full access to the Windows file system.
|
|
-# Info-ZIP recommends using "win32/Makefile.gcc" instead.
|
|
-cygwin: unix_make
|
|
- $(MAKE) unzips CC=gcc LD=gcc AS=gcc\
|
|
- CF="-O3 -I. -DUNIX -DASM_CRC $(LOC)"\
|
|
- AF="-Di386 $(AF)" CRC32=crc_gcc\
|
|
- E=".exe" CP="cp" LN="ln -s"
|
|
-
|
|
-# 680x0, DIAB dnix 5.2/5.3 (a Swedish System V clone)
|
|
-#
|
|
-# Options for the dnix cc:
|
|
-# -X7 = cc is strict ANSI C
|
|
-# -X9 = warnings if a function is used without a declaration
|
|
-#
|
|
-dnix: unix_make
|
|
- $(MAKE) unzips CF="$(CF) -X7 -X9 -DDNIX"
|
|
-
|
|
-# FreeBSD on Intel:
|
|
-freebsd: unix_make
|
|
- @echo 'NOTE: use bsd target for non-Intel FreeBSD compiles (if any).'
|
|
- $(MAKE) unzips CC=gcc LD=gcc AS=gcc\
|
|
- CF="-O3 -Wall -I. -DASM_CRC -DUNIX -DBSD $(LOC)"\
|
|
- AF="-Di386 $(AF)" CRC32=crc_gcc
|
|
-
|
|
-# Generic BSDish Unix gcc. ``The -O3 only works with later versions of gcc;
|
|
-# you may have to use -O2 or -O for earlier versions. I have no idea why
|
|
-# -s causes this bug in gcc.'' [Bug: "nm: unzip: no name list", "collect:
|
|
-# /usr/bin/nm returned 1 exit status".] If you don't have strip, don't
|
|
-# worry about it (it just makes the executable smaller and can be replaced
|
|
-# with "echo" instead).
|
|
-#
|
|
-gcc: unix_make
|
|
- $(MAKE) unzips CC=gcc LD=gcc CF="-O3 -I. $(LOC)" LF2=""
|
|
- $(STRIP) $(UNZIPS)
|
|
-
|
|
-# Heurikon HK68 (68010), UniPlus+ System V 5.0, Green Hills C-68000
|
|
-hk68: unix_make
|
|
- $(MAKE) unzips CC="gcc" LD="gcc"\
|
|
- LF="-n $(LF)" SL="-n $(SL)" FL="-n $(FL)"\
|
|
- CF="-ga -X138 -I. $(LOC) -Dlocaltime=localti -Dtimezone=timezon"
|
|
-
|
|
-# ISC Unix on 386 platform
|
|
-isc: unix_make
|
|
- $(MAKE) unzips LF2="-lc_s $(LF2)" CRC32=crc_sysv \
|
|
- CF="-O -I. -DASM_CRC -DSYSV -DNO_UID_GID -DNEED_PTEM $(LOC)" \
|
|
- AF="-DNO_UNDERLINE -Djecxz=jcxz -DALIGNMENT='.align 16' $(AF)"
|
|
-
|
|
-isc_gcc: unix_make
|
|
- $(MAKE) unzips AS=gcc CC=gcc LD=gcc CRC32=crc_gcc LF="-shlib $(LF)" \
|
|
- SL="-shlib $(SL)" FL="-shlib $(FL)" \
|
|
- LF2="" CF="-O3 -I. -DSYSV -DASM_CRC -DNO_UID_GID -DNEED_PTEM $(LOC)" \
|
|
- AF="-DNO_UNDERLINE -Djecxz=jcxz -DALIGNMENT='.align 16' $(AF)"
|
|
- $(STRIP) $(UNZIPS)
|
|
-
|
|
-# "ISI machine (68025 CPU)" (based on e-mail from Rob White <rsw@tfs.com>;
|
|
-# no further information). May also need DIRENT defined.
|
|
-isi: unix_make
|
|
- $(MAKE) unzips CF="$(CF) -DDECLARE_ERRNO"
|
|
-
|
|
-# Linux on 386 platform, using the assembler replacement for crc32.c. (-O4 and
|
|
-# -fno-strength-reduce have virtually no effect beyond -O3. Add "-m486
|
|
-# -malign-functions=2 -malign-jumps=2 -malign-loops=2" for Pentium [Pro]
|
|
-# systems.)
|
|
-linux: unix_make
|
|
- @echo 'NOTE: use linux_noasm target for non-Intel Linux compiles.'
|
|
- $(MAKE) unzips CC=gcc LD=gcc AS=gcc\
|
|
- CF="-O3 -Wall -I. -DASM_CRC $(LOC)"\
|
|
- AF="-Di386 $(AF)" CRC32=crc_gcc
|
|
-# GRR: this echo is pointless; if user gets this far, no difference to install
|
|
-# @echo 'Be sure to use the install_asm target rather than the install target'
|
|
-
|
|
-linux_asm: linux
|
|
-
|
|
-# Linux (Posix, approximately SysV): virtually any version since before 0.96,
|
|
-# for any platform. Change "-O" to "-O3" or whatever, as desired...
|
|
-linux_noasm: unix_make
|
|
- $(MAKE) unzips CC=gcc LD=gcc CF="-O -Wall -I. $(LOC)"
|
|
-
|
|
-# Linux with lcc compiler: __inline__ (stat.h) not recognized, and must edit
|
|
-# /usr/include/gnu/types.h to get rid of "long long" if __LCC__ defined. -O3
|
|
-# (or -O2 or -O) is ignored. [GRR 960828: test target only]
|
|
-#
|
|
-linux_lcc: unix_make
|
|
- $(MAKE) unzips CC=lcc LD=lcc CF="-O3 -Wall -I. -D__inline__= $(LOC)"
|
|
-
|
|
-# Linux host with go32 (djgpp) cross-compiler (go32crs.tgz) for 32-bit DOS.
|
|
-linux_dos: unix_make
|
|
- $(MAKE) unzips CC=go32gcc LD=go32gcc M=msdos CF="-O2 -Wall -I. $(LOC)"
|
|
-# go32-strip unzip
|
|
-# Due to limitations of the cross-compiling package, this has to be
|
|
-# done manually:
|
|
- @echo Copy $(UNZIPS) to your DOS partition and use coff2exe.
|
|
-
|
|
-# Linux ELF shared library (ooo, it's so easy). This is a test target for
|
|
-# now, and it only makes the UnZip/ZipInfo stuff (not fUnZip or UnZipSFX).
|
|
-# The version number may eventually change to match the UnZip version. Or
|
|
-# not. Whatever. Also do "setenv LD_LIBRARY_PATH `pwd`" or similar to test
|
|
-# the DLL in place (with unzip_shlib, which is UnZip linked with the shared
|
|
-# library).
|
|
-#
|
|
-linux_shlib: unix_make
|
|
-# $(MAKE) objsdll CC=gcc CF="-O3 -Wall -I. -fPIC -DDLL $(LOC)"
|
|
- $(MAKE) objsdll CC=gcc CF="-O3 -Wall -I. -fPIC -DDLL -DASM_CRC $(LOC)"\
|
|
- AS=gcc AF="-fPIC -Di386 $(AF)" CRC32=crc_gcc
|
|
- ln -sf crc_gcc.pic.o crc32.pic.o
|
|
- gcc -shared -Wl,-soname,libunzip.so.0 -o libunzip.so.0.4 $(OBJSDLL)
|
|
- ln -sf libunzip.so.0.4 libunzip.so.0
|
|
- ln -sf libunzip.so.0 libunzip.so
|
|
- gcc -c -O unzipstb.c
|
|
- gcc -o unzip_shlib unzipstb.o -L. -lunzip
|
|
-
|
|
-# Linux ELF shared library, as above, but using inflate() from zlib (libz.so)
|
|
-# instead of the original UnZip version. (libz was libgz prior to 0.94)
|
|
-linux_shlibz: unix_make
|
|
-# $(MAKE) objsdll CC=gcc CF="-O3 -Wall -I. -fPIC -DDLL -DUSE_ZLIB $(LOC)"
|
|
- $(MAKE) objsdll CC=gcc AS=gcc AF="-fPIC -Di386 $(AF)" CRC32=crc_gcc\
|
|
- CF="-O3 -Wall -I. -fPIC -DDLL -DUSE_ZLIB -DASM_CRC $(LOC)"
|
|
- ln -sf crc_gcc.pic.o crc32.pic.o
|
|
- gcc -shared -Wl,-soname,libunzip.so.0 -o libunzip.so.0.4 $(OBJSDLL)
|
|
- ln -sf libunzip.so.0.4 libunzip.so.0
|
|
- gcc -c -O unzipstb.c
|
|
- gcc -o unzip unzipstb.o -L. -lunzip -lz
|
|
-
|
|
-# LynxOS-x86 2.3.0 and newer, a real-time BSD-like OS; uses gcc.
|
|
-lynx: unix_make
|
|
- $(MAKE) unzips CC=gcc CF="$(CF) -DLynx -DLYNX -DBSD -DUNIX"
|
|
-
|
|
-# Macintosh MacOS X (Unix-compatible enviroment), using standard compiler
|
|
-macosx: unix_make
|
|
- $(MAKE) unzips CF="-O3 -Wall -I. -DBSD -DUNIX $(LOC)" LF2=""
|
|
- $(STRIP) $(UNZIPS)
|
|
-
|
|
-# Macintosh MacOS X (Unix-compatible enviroment), using gcc
|
|
-macosx_gcc: unix_make
|
|
- $(MAKE) unzips CC=gcc CF="-O3 -Wall -I. -DBSD -DUNIX $(LOC)" LF2=""
|
|
- $(STRIP) $(UNZIPS)
|
|
-
|
|
-# Minix 1.5 PC for the 386. Invoke as is to use default cc, or as "make
|
|
-# minix CC=gcc" to use gcc. Try "make linux" if you have a working termios.h.
|
|
-minix: unix_make
|
|
- $(MAKE) unzips CF="$(CF) -DMINIX -DSHORT_NAMES" CC=$(CC) LD=$(CC)
|
|
-
|
|
-# MPE/iX, the Unix variant for HP 3000 systems.
|
|
-mpeix: unix_make
|
|
- $(MAKE) unzips CC=c89\
|
|
- CF="$(CF) -DUNIX -D_POSIX_SOURCE -DHAVE_TERMIOS_H -DPASSWD_FROM_STDIN -DNO_PARAM_H"\
|
|
- LF2=-lbsd CP=cp LN="ln -s"
|
|
-
|
|
-# NeXT info.
|
|
-next:
|
|
- @echo
|
|
- @echo\
|
|
- ' Please pick a specific NeXT target: "make next10" will create a generic'
|
|
- @echo\
|
|
- ' NeXT executable; "make next2x" will create a smaller executable (for'
|
|
- @echo\
|
|
- ' NeXTstep 2.0 and higher); "make next3x" will create a small executable'
|
|
- @echo\
|
|
- ' with significantly better optimization (NeXTstep 3.0 and higher only);'
|
|
- @echo\
|
|
- ' "make nextfat" will create a fat, multi-architecture (NeXT plus Intel)'
|
|
- @echo\
|
|
- ' executable (NeXTstep 3.1 and higher only).'
|
|
- @echo
|
|
-
|
|
-# 68030 BSD 4.3+Mach. NeXT 2.x: make the executable smaller.
|
|
-next2x: unix_make
|
|
- $(MAKE) unzips LF2="-object -s"
|
|
-
|
|
-# NeXT 3.x: as above, plus better optimization.
|
|
-next3x: unix_make
|
|
- $(MAKE) unzips CF="-O2 -I. $(LOC)" LF2="-object -s"
|
|
-
|
|
-# NeXT 3.1+: make the executable fat (multi-architecture binary [MAB],
|
|
-# for "black" [NeXT] and "white" [x86] hardware, so far).
|
|
-nextfat: unix_make
|
|
- $(MAKE) unzips CF="-O2 -I. $(LOC) -arch i386 -arch m68k" \
|
|
- LF2="-arch i386 -arch m68k -object -s"
|
|
-
|
|
-# IBM OS/390 (formerly MVS) compiled under "OpenEdition" shell
|
|
-os390: unix_make
|
|
- set -x; \
|
|
- $(MAKE) -f unix/Makefile unzips \
|
|
- CC=c89 LD="\$$(CC) -Wl,EDIT=NO" \
|
|
- CF="$(CF) -DSYSV -DUNIX -DOS390 -DEBCDIC -DNO_PARAM_H \
|
|
- -D_ALL_SOURCE $(HOST_VERSINFO)" LF2=""
|
|
-
|
|
-# Sequent Symmetry running Dynix/ptx (sort of SysV.3): needs to link
|
|
-# with libseq to get symlink().
|
|
-ptx: unix_make
|
|
- $(MAKE) unzips CF="$(CF) -DSYSV -DTERMIO -DPTX" LF2="$(LF2) -lseq"
|
|
-
|
|
-# Pyramid 90X (probably all) under >= OSx4.1, either universe. (This is an
|
|
-# experimental target! If it fails, use either pyr_ucb or pyr_att instead.)
|
|
-# The make in the BSD half is too stupid to understand $(MAKE), sigh...
|
|
-pyramid: unix_make
|
|
- -make -f unix/Makefile pyr_`universe`
|
|
-
|
|
-# QNX/Neutrino is "special" because you don't have any native development
|
|
-# tools yet. Set ARCH to "x86", "ppcbe", "ppcle", "mipsbe", or "mipsle"
|
|
-# to produce x86, PowerPC (big- or little-endian) and MIPS (big-
|
|
-# or little-endian) using gcc. [cjh]
|
|
-qnxnto: unix_make
|
|
- @if [ "$(ARCH)" = "" ] ; then \
|
|
- echo "You didn't set ARCH; I'll assume you meant ARCH=x86..." ; \
|
|
- echo "" ; \
|
|
- $(MAKE) -f unix/Makefile CC="qcc -Vgcc_ntox86" unzips ; \
|
|
- else \
|
|
- echo "Making unzip for $(ARCH)..." ; \
|
|
- echo "" ; \
|
|
- $(MAKE) -f unix/Makefile CC="qcc -Vgcc_nto$(ARCH)" unzips ; \
|
|
- fi
|
|
-
|
|
-# REGULUS: 68040-based, "real-time" SysV.3 mutant; uses gcc, with "REGULUS"
|
|
-# predefined.
|
|
-regulus: unix_make
|
|
- $(MAKE) unzips CF="$(CF) -traditional -DSYSV -DNO_MKDIR"
|
|
-
|
|
-# IBM RS/6000 under AIX 3.2
|
|
-rs6000: unix_make
|
|
- $(MAKE) unzips CF="$(CF) -DBSD -D_BSD -DUNIX" LF2="-lbsd"
|
|
-
|
|
-# SCO cross compile from Unix to DOS. Tested with Xenix/386 and OpenDeskTop.
|
|
-# Should work with Xenix/286 as well. (davidsen) Note that you *must* remove
|
|
-# the Unix objects and executable before doing this! (Piet Plomp: gcc won't
|
|
-# recognize the -M0 flag that forces 8086 code.) (GRR: may need to reduce
|
|
-# stack to 0c00h if using 286/small-model code...?)
|
|
-sco_dos: unix_make
|
|
- $(MAKE) unzips CF="-O -I. $(LOC) -dos -M0" M=msdos \
|
|
- LF="-dos -F 2000" LF2="-o unzip.exe" \
|
|
- FL="-dos" FL2="-o funzip.exe" SL="-dos" SL2="-o unzipsfx.exe"
|
|
-
|
|
-# SCO UNIX with shared libraries and no international support. If you are
|
|
-# not using a USA-style keyboard and display, you may want to remove -nointl
|
|
-# to get support. It adds quite a bit to the size of the executable.
|
|
-sco_sl: unix_make
|
|
- $(MAKE) unzips LF="$(LF) -nointl" LF2="$(LF2) -lc_s"\
|
|
- SL="$(SL) -nointl" FL="$(FL) -nointl"
|
|
-
|
|
-# SCO Xenix/286 2.2.3 or later with development system 2.2.1 or later
|
|
-sco_x286: unix_make
|
|
- $(MAKE) unzips CF="$(CF) -Mel2 -LARGE -DNO_MKDIR" \
|
|
- LF="$(LF) -Mel2 -LARGE -lx" SL="$(SL) -Mel2 -LARGE" \
|
|
- FL="$(FL) -Mel2 -LARGE"
|
|
-
|
|
-# Sequent Symmetry with Dynix. (386, but needs -DZMEM)
|
|
-# This should also work on Balance but I can't test it just yet.
|
|
-sequent: unix_make
|
|
- $(MAKE) unzips CF="$(CF) -DBSD -DZMEM"
|
|
-
|
|
-# Sun 2, 3, 4 running SunOS 3.x
|
|
-sunos3: unix_make
|
|
- $(MAKE) unzips CF="$(CF) -DNO_UID_GID -DUID_USHORT"
|
|
-
|
|
-# Generic System V + GNU C
|
|
-sysv_gcc: unix_make
|
|
- $(MAKE) unzips CC=gcc LD=gcc CF="-O2 -I. -DUNIX -DSYSV $(LOC)" LF2=""
|
|
- $(STRIP) $(UNZIPS)
|
|
-
|
|
-# AT&T 6300+, System V.2 Unix: run-time out-of-memory error if don't use -Ml;
|
|
-# also compile-time error if work arrays dimensioned at HSIZE+2 (>32K)
|
|
-sysv6300: unix_make
|
|
- $(MAKE) unzips CF="$(CF) -Ml -DSYSV" LF="$(LF) -Ml"\
|
|
- SL="$(SL) -Ml" FL="$(FL) -Ml"
|
|
-
|
|
-# Texas Instruments System V.3 (running on HP 9000-1500)
|
|
-ti_sysv: unix_make
|
|
- $(MAKE) unzips CF="$(CF) -DSYSV -DNO_UID_GID -DUID_USHORT"
|
|
-
|
|
-# SCO Xenix (Joe Foster 950508: "unzip needs to be linked with -lx [for the
|
|
-# opendir(), readdir(), telldir(), rewinddir(), and closedir() calls]")
|
|
-xenix: unix_make
|
|
- $(MAKE) unzips LF2="$(LF2) -lx"
|
|
-
|
|
-# Wombat 68000 (or whatever).
|
|
-# I didn't do this. I swear. No, really.
|
|
-wombat: unix_make
|
|
- @echo
|
|
- @echo ' Ha ha! Just kidding.'
|
|
- @echo
|
|
--- unzip.h 2007-12-03 13:44:30.000000000 +0100
|
|
+++ unzip.h 2007-12-03 13:49:01.000000000 +0100
|
|
@@ -606,6 +606,8 @@ typedef struct central_directory_file_he
|
|
#define UZ_ST_CONTINUE 0
|
|
#define UZ_ST_BREAK 1
|
|
|
|
+#define MAX_ZIP_SIZE 0xffffdffe
|
|
+
|
|
|
|
/*---------------------------------------------------------------------------
|
|
Prototypes for public UnZip API (DLL) functions.
|
|
--- unzip.h.orig 1970-01-01 01:00:00.000000000 +0100
|
|
+++ unzip.h.orig 2007-12-03 13:44:30.000000000 +0100
|
|
@@ -0,0 +1,660 @@
|
|
+/*---------------------------------------------------------------------------
|
|
+
|
|
+ unzip.h (new)
|
|
+
|
|
+ Copyright (c) 1990-2005 Info-ZIP. All rights reserved.
|
|
+
|
|
+ This header file contains the public macros and typedefs required by
|
|
+ both the UnZip sources and by any application using the UnZip API. If
|
|
+ UNZIP_INTERNAL is defined, it includes unzpriv.h (containing includes,
|
|
+ prototypes and extern variables used by the actual UnZip sources).
|
|
+
|
|
+ ---------------------------------------------------------------------------*/
|
|
+/*---------------------------------------------------------------------------
|
|
+This is version 2005-Feb-10 of the Info-ZIP copyright and license.
|
|
+The definitive version of this document should be available at
|
|
+ftp://ftp.info-zip.org/pub/infozip/license.html indefinitely.
|
|
+
|
|
+
|
|
+Copyright (c) 1990-2005 Info-ZIP. All rights reserved.
|
|
+
|
|
+For the purposes of this copyright and license, "Info-ZIP" is defined as
|
|
+the following set of individuals:
|
|
+
|
|
+ Mark Adler, John Bush, Karl Davis, Harald Denker, Jean-Michel Dubois,
|
|
+ Jean-loup Gailly, Hunter Goatley, Ed Gordon, Ian Gorman, Chris Herborth,
|
|
+ Dirk Haase, Greg Hartwig, Robert Heath, Jonathan Hudson, Paul Kienitz,
|
|
+ David Kirschbaum, Johnny Lee, Onno van der Linden, Igor Mandrichenko,
|
|
+ Steve P. Miller, Sergio Monesi, Keith Owens, George Petrov, Greg Roelofs,
|
|
+ Kai Uwe Rommel, Steve Salisbury, Dave Smith, Steven M. Schweda,
|
|
+ Christian Spieler, Cosmin Truta, Antoine Verheijen, Paul von Behren,
|
|
+ Rich Wales, Mike White
|
|
+
|
|
+This software is provided "as is," without warranty of any kind, express
|
|
+or implied. In no event shall Info-ZIP or its contributors be held liable
|
|
+for any direct, indirect, incidental, special or consequential damages
|
|
+arising out of the use of or inability to use this software.
|
|
+
|
|
+Permission is granted to anyone to use this software for any purpose,
|
|
+including commercial applications, and to alter it and redistribute it
|
|
+freely, subject to the following restrictions:
|
|
+
|
|
+ 1. Redistributions of source code must retain the above copyright notice,
|
|
+ definition, disclaimer, and this list of conditions.
|
|
+
|
|
+ 2. Redistributions in binary form (compiled executables) must reproduce
|
|
+ the above copyright notice, definition, disclaimer, and this list of
|
|
+ conditions in documentation and/or other materials provided with the
|
|
+ distribution. The sole exception to this condition is redistribution
|
|
+ of a standard UnZipSFX binary (including SFXWiz) as part of a
|
|
+ self-extracting archive; that is permitted without inclusion of this
|
|
+ license, as long as the normal SFX banner has not been removed from
|
|
+ the binary or disabled.
|
|
+
|
|
+ 3. Altered versions--including, but not limited to, ports to new operating
|
|
+ systems, existing ports with new graphical interfaces, and dynamic,
|
|
+ shared, or static library versions--must be plainly marked as such
|
|
+ and must not be misrepresented as being the original source. Such
|
|
+ altered versions also must not be misrepresented as being Info-ZIP
|
|
+ releases--including, but not limited to, labeling of the altered
|
|
+ versions with the names "Info-ZIP" (or any variation thereof, including,
|
|
+ but not limited to, different capitalizations), "Pocket UnZip," "WiZ"
|
|
+ or "MacZip" without the explicit permission of Info-ZIP. Such altered
|
|
+ versions are further prohibited from misrepresentative use of the
|
|
+ Zip-Bugs or Info-ZIP e-mail addresses or of the Info-ZIP URL(s).
|
|
+
|
|
+ 4. Info-ZIP retains the right to use the names "Info-ZIP," "Zip," "UnZip,"
|
|
+ "UnZipSFX," "WiZ," "Pocket UnZip," "Pocket Zip," and "MacZip" for its
|
|
+ own source and binary releases.
|
|
+ ---------------------------------------------------------------------------*/
|
|
+
|
|
+#ifndef __unzip_h /* prevent multiple inclusions */
|
|
+#define __unzip_h
|
|
+
|
|
+/*---------------------------------------------------------------------------
|
|
+ Predefined, machine-specific macros.
|
|
+ ---------------------------------------------------------------------------*/
|
|
+
|
|
+#ifdef __GO32__ /* MS-DOS extender: NOT Unix */
|
|
+# ifdef unix
|
|
+# undef unix
|
|
+# endif
|
|
+# ifdef _unix
|
|
+# undef _unix
|
|
+# endif
|
|
+# ifdef __unix
|
|
+# undef __unix
|
|
+# endif
|
|
+# ifdef __unix__
|
|
+# undef __unix__
|
|
+# endif
|
|
+#endif
|
|
+
|
|
+#if ((defined(__convex__) || defined(__convexc__)) && !defined(CONVEX))
|
|
+# define CONVEX
|
|
+#endif
|
|
+
|
|
+#if (defined(unix) || defined(_unix) || defined(__unix) || defined(__unix__))
|
|
+# ifndef UNIX
|
|
+# define UNIX
|
|
+# endif
|
|
+#endif /* unix || _unix || __unix || __unix__ */
|
|
+#if (defined(M_XENIX) || defined(COHERENT) || defined(__hpux))
|
|
+# ifndef UNIX
|
|
+# define UNIX
|
|
+# endif
|
|
+#endif /* M_XENIX || COHERENT || __hpux */
|
|
+#if (defined(__NetBSD__) || defined(__FreeBSD__))
|
|
+# ifndef UNIX
|
|
+# define UNIX
|
|
+# endif
|
|
+#endif /* __NetBSD__ || __FreeBSD__ */
|
|
+#if (defined(CONVEX) || defined(MINIX) || defined(_AIX) || defined(__QNX__))
|
|
+# ifndef UNIX
|
|
+# define UNIX
|
|
+# endif
|
|
+#endif /* CONVEX || MINIX || _AIX || __QNX__ */
|
|
+
|
|
+#if (defined(VM_CMS) || defined(MVS))
|
|
+# define CMS_MVS
|
|
+#endif
|
|
+
|
|
+#if (defined(__OS2__) && !defined(OS2))
|
|
+# define OS2
|
|
+#endif
|
|
+
|
|
+#if (defined(__TANDEM) && !defined(TANDEM))
|
|
+# define TANDEM
|
|
+#endif
|
|
+
|
|
+#if (defined(__VMS) && !defined(VMS))
|
|
+# define VMS
|
|
+#endif
|
|
+
|
|
+#if ((defined(__WIN32__) || defined(_WIN32)) && !defined(WIN32))
|
|
+# define WIN32
|
|
+#endif
|
|
+#if ((defined(__WINNT__) || defined(__WINNT)) && !defined(WIN32))
|
|
+# define WIN32
|
|
+#endif
|
|
+
|
|
+#if defined(_WIN32_WCE)
|
|
+# ifndef WIN32 /* WinCE is treated as a variant of the Win32 API */
|
|
+# define WIN32
|
|
+# endif
|
|
+# ifndef UNICODE /* WinCE requires UNICODE wide character support */
|
|
+# define UNICODE
|
|
+# endif
|
|
+#endif
|
|
+
|
|
+#ifdef __COMPILER_KCC__
|
|
+# include <c-env.h>
|
|
+# ifdef SYS_T20
|
|
+# define TOPS20
|
|
+# endif
|
|
+#endif /* __COMPILER_KCC__ */
|
|
+
|
|
+/* Borland C does not define __TURBOC__ if compiling for a 32-bit platform */
|
|
+#ifdef __BORLANDC__
|
|
+# ifndef __TURBOC__
|
|
+# define __TURBOC__
|
|
+# endif
|
|
+# if (!defined(__MSDOS__) && !defined(OS2) && !defined(WIN32))
|
|
+# define __MSDOS__
|
|
+# endif
|
|
+#endif
|
|
+
|
|
+/* define MSDOS for Turbo C (unless OS/2) and Power C as well as Microsoft C */
|
|
+#ifdef __POWERC
|
|
+# define __TURBOC__
|
|
+# define MSDOS
|
|
+#endif /* __POWERC */
|
|
+
|
|
+#if (defined(__MSDOS__) && !defined(MSDOS)) /* just to make sure */
|
|
+# define MSDOS
|
|
+#endif
|
|
+
|
|
+/* RSXNTDJ (at least up to v1.3) compiles for WIN32 (RSXNT) using a derivate
|
|
+ of the EMX environment, but defines MSDOS and __GO32__. ARG !!! */
|
|
+#if (defined(MSDOS) && defined(WIN32))
|
|
+# undef MSDOS /* WIN32 is >>>not<<< MSDOS */
|
|
+#endif
|
|
+#if (defined(__GO32__) && defined(__EMX__) && defined(__RSXNT__))
|
|
+# undef __GO32__
|
|
+#endif
|
|
+
|
|
+#if (defined(linux) && !defined(LINUX))
|
|
+# define LINUX
|
|
+#endif
|
|
+
|
|
+#ifdef __riscos
|
|
+# define RISCOS
|
|
+#endif
|
|
+
|
|
+#if (defined(THINK_C) || defined(MPW))
|
|
+# define MACOS
|
|
+#endif
|
|
+#if (defined(__MWERKS__) && defined(macintosh))
|
|
+# define MACOS
|
|
+#endif
|
|
+
|
|
+/* use prototypes and ANSI libraries if __STDC__, or MS-DOS, or OS/2, or Win32,
|
|
+ * or IBM C Set/2, or Borland C, or Watcom C, or GNU gcc (emx or Cygwin),
|
|
+ * or Macintosh, or Sequent, or Atari, or IBM RS/6000, or Silicon Graphics,
|
|
+ * or Convex?, or AtheOS, or BeOS.
|
|
+ */
|
|
+#if (defined(__STDC__) || defined(MSDOS) || defined(OS2) || defined(WIN32))
|
|
+# ifndef PROTO
|
|
+# define PROTO
|
|
+# endif
|
|
+# ifndef MODERN
|
|
+# define MODERN
|
|
+# endif
|
|
+#endif
|
|
+#if (defined(__IBMC__) || defined(__BORLANDC__) || defined(__WATCOMC__))
|
|
+# ifndef PROTO
|
|
+# define PROTO
|
|
+# endif
|
|
+# ifndef MODERN
|
|
+# define MODERN
|
|
+# endif
|
|
+#endif
|
|
+#if (defined(__EMX__) || defined(__CYGWIN__))
|
|
+# ifndef PROTO
|
|
+# define PROTO
|
|
+# endif
|
|
+# ifndef MODERN
|
|
+# define MODERN
|
|
+# endif
|
|
+#endif
|
|
+#if (defined(MACOS) || defined(ATARI_ST) || defined(RISCOS) || defined(THEOS))
|
|
+# ifndef PROTO
|
|
+# define PROTO
|
|
+# endif
|
|
+# ifndef MODERN
|
|
+# define MODERN
|
|
+# endif
|
|
+#endif
|
|
+/* Sequent running Dynix/ptx: non-modern compiler */
|
|
+#if (defined(_AIX) || defined(sgi) || (defined(_SEQUENT_) && !defined(PTX)))
|
|
+# ifndef PROTO
|
|
+# define PROTO
|
|
+# endif
|
|
+# ifndef MODERN
|
|
+# define MODERN
|
|
+# endif
|
|
+#endif
|
|
+#if (defined(CMS_MVS) || defined(__ATHEOS__) || defined(__BEOS__))
|
|
+/* || defined(CONVEX) ? */
|
|
+# ifndef PROTO
|
|
+# define PROTO
|
|
+# endif
|
|
+# ifndef MODERN
|
|
+# define MODERN
|
|
+# endif
|
|
+#endif
|
|
+
|
|
+/* turn off prototypes if requested */
|
|
+#if (defined(NOPROTO) && defined(PROTO))
|
|
+# undef PROTO
|
|
+#endif
|
|
+
|
|
+/* used to remove arguments in function prototypes for non-ANSI C */
|
|
+#ifdef PROTO
|
|
+# define OF(a) a
|
|
+#else
|
|
+# define OF(a) ()
|
|
+#endif
|
|
+
|
|
+/* enable the "const" keyword only if MODERN and if not otherwise instructed */
|
|
+#ifdef MODERN
|
|
+# if (!defined(ZCONST) && (defined(USE_CONST) || !defined(NO_CONST)))
|
|
+# define ZCONST const
|
|
+# endif
|
|
+#endif
|
|
+
|
|
+#ifndef ZCONST
|
|
+# define ZCONST
|
|
+#endif
|
|
+
|
|
+
|
|
+/*---------------------------------------------------------------------------
|
|
+ Grab system-specific public include headers.
|
|
+ ---------------------------------------------------------------------------*/
|
|
+
|
|
+#ifdef POCKET_UNZIP /* WinCE port */
|
|
+# include "wince/punzip.h" /* must appear before windows.h */
|
|
+#endif
|
|
+
|
|
+#ifdef WINDLL
|
|
+ /* for UnZip, the "basic" part of the win32 api is sufficient */
|
|
+# ifndef WIN32_LEAN_AND_MEAN
|
|
+# define WIN32_LEAN_AND_MEAN
|
|
+# define IZ_HASDEFINED_WIN32LEAN
|
|
+# endif
|
|
+# include <windows.h>
|
|
+# include "windll/structs.h"
|
|
+# ifdef IZ_HASDEFINED_WIN32LEAN
|
|
+# undef WIN32_LEAN_AND_MEAN
|
|
+# undef IZ_HASDEFINED_WIN32LEAN
|
|
+# endif
|
|
+#endif
|
|
+
|
|
+/*---------------------------------------------------------------------------
|
|
+ Grab system-dependent definition of EXPENTRY for prototypes below.
|
|
+ ---------------------------------------------------------------------------*/
|
|
+
|
|
+#if 0
|
|
+#if (defined(OS2) && !defined(FUNZIP))
|
|
+# ifdef UNZIP_INTERNAL
|
|
+# define INCL_NOPM
|
|
+# define INCL_DOSNLS
|
|
+# define INCL_DOSPROCESS
|
|
+# define INCL_DOSDEVICES
|
|
+# define INCL_DOSDEVIOCTL
|
|
+# define INCL_DOSERRORS
|
|
+# define INCL_DOSMISC
|
|
+# ifdef OS2DLL
|
|
+# define INCL_REXXSAA
|
|
+# include <rexxsaa.h>
|
|
+# endif
|
|
+# endif /* UNZIP_INTERNAL */
|
|
+# include <os2.h>
|
|
+# define UZ_EXP EXPENTRY
|
|
+#endif /* OS2 && !FUNZIP */
|
|
+#endif /* 0 */
|
|
+
|
|
+#if (defined(OS2) && !defined(FUNZIP))
|
|
+# if (defined(__IBMC__) || defined(__WATCOMC__))
|
|
+# define UZ_EXP _System /* compiler keyword */
|
|
+# else
|
|
+# define UZ_EXP
|
|
+# endif
|
|
+#endif /* OS2 && !FUNZIP */
|
|
+
|
|
+#if (defined(WINDLL) || defined(USE_UNZIP_LIB))
|
|
+# ifndef EXPENTRY
|
|
+# define UZ_EXP WINAPI
|
|
+# else
|
|
+# define UZ_EXP EXPENTRY
|
|
+# endif
|
|
+#endif
|
|
+
|
|
+#ifndef UZ_EXP
|
|
+# define UZ_EXP
|
|
+#endif
|
|
+
|
|
+#ifdef __cplusplus
|
|
+extern "C" {
|
|
+#endif
|
|
+
|
|
+/*---------------------------------------------------------------------------
|
|
+ Public typedefs.
|
|
+ ---------------------------------------------------------------------------*/
|
|
+
|
|
+#ifndef _IZ_TYPES_DEFINED
|
|
+#ifdef MODERN
|
|
+ typedef void zvoid;
|
|
+#else /* !MODERN */
|
|
+# ifndef AOS_VS /* mostly modern? */
|
|
+# ifndef VAXC /* not fully modern, but has knows 'void' */
|
|
+# define void int
|
|
+# endif /* !VAXC */
|
|
+# endif /* !AOS_VS */
|
|
+ typedef char zvoid;
|
|
+#endif /* ?MODERN */
|
|
+typedef unsigned char uch; /* code assumes unsigned bytes; these type- */
|
|
+typedef unsigned short ush; /* defs replace byte/UWORD/ULONG (which are */
|
|
+typedef unsigned long ulg; /* predefined on some systems) & match zip */
|
|
+#define _IZ_TYPES_DEFINED
|
|
+#endif /* !_IZ_TYPES_DEFINED */
|
|
+
|
|
+/* InputFn is not yet used and is likely to change: */
|
|
+#ifdef PROTO
|
|
+ typedef int (UZ_EXP MsgFn) (zvoid *pG, uch *buf, ulg size, int flag);
|
|
+ typedef int (UZ_EXP InputFn) (zvoid *pG, uch *buf, int *size, int flag);
|
|
+ typedef void (UZ_EXP PauseFn) (zvoid *pG, ZCONST char *prompt, int flag);
|
|
+ typedef int (UZ_EXP PasswdFn) (zvoid *pG, int *rcnt, char *pwbuf,
|
|
+ int size, ZCONST char *zfn,
|
|
+ ZCONST char *efn);
|
|
+ typedef int (UZ_EXP StatCBFn) (zvoid *pG, int fnflag, ZCONST char *zfn,
|
|
+ ZCONST char *efn, ZCONST zvoid *details);
|
|
+ typedef void (UZ_EXP UsrIniFn) (void);
|
|
+#else /* !PROTO */
|
|
+ typedef int (UZ_EXP MsgFn) ();
|
|
+ typedef int (UZ_EXP InputFn) ();
|
|
+ typedef void (UZ_EXP PauseFn) ();
|
|
+ typedef int (UZ_EXP PasswdFn) ();
|
|
+ typedef int (UZ_EXP StatCBFn) ();
|
|
+ typedef void (UZ_EXP UsrIniFn) ();
|
|
+#endif /* ?PROTO */
|
|
+
|
|
+typedef struct _UzpBuffer { /* rxstr */
|
|
+ ulg strlength; /* length of string */
|
|
+ char *strptr; /* pointer to string */
|
|
+} UzpBuffer;
|
|
+
|
|
+typedef struct _UzpInit {
|
|
+ ulg structlen; /* length of the struct being passed */
|
|
+
|
|
+ /* GRR: can we assume that each of these is a 32-bit pointer? if not,
|
|
+ * does it matter? add "far" keyword to make sure? */
|
|
+ MsgFn *msgfn;
|
|
+ InputFn *inputfn;
|
|
+ PauseFn *pausefn;
|
|
+ UsrIniFn *userfn; /* user init function to be called after */
|
|
+ /* globals constructed and initialized */
|
|
+
|
|
+ /* pointer to program's environment area or something? */
|
|
+ /* hooks for performance testing? */
|
|
+ /* hooks for extra unzip -v output? (detect CPU or other hardware?) */
|
|
+ /* anything else? let me (Greg) know... */
|
|
+} UzpInit;
|
|
+
|
|
+typedef struct _UzpCB {
|
|
+ ulg structlen; /* length of the struct being passed */
|
|
+ /* GRR: can we assume that each of these is a 32-bit pointer? if not,
|
|
+ * does it matter? add "far" keyword to make sure? */
|
|
+ MsgFn *msgfn;
|
|
+ InputFn *inputfn;
|
|
+ PauseFn *pausefn;
|
|
+ PasswdFn *passwdfn;
|
|
+ StatCBFn *statrepfn;
|
|
+} UzpCB;
|
|
+
|
|
+/* the collection of general UnZip option flags and option arguments */
|
|
+typedef struct _UzpOpts {
|
|
+#ifndef FUNZIP
|
|
+ char *exdir; /* pointer to extraction root directory (-d option) */
|
|
+ char *pwdarg; /* pointer to command-line password (-P option) */
|
|
+ int zipinfo_mode; /* behave like ZipInfo or like normal UnZip? */
|
|
+ int aflag; /* -a: do ASCII-EBCDIC and/or end-of-line translation */
|
|
+#ifdef VMS
|
|
+ int bflag; /* -b: force fixed record format for binary files */
|
|
+#endif
|
|
+#ifdef TANDEM
|
|
+ int bflag; /* -b: create text files in 'C' format (180)*/
|
|
+#endif
|
|
+#ifdef UNIXBACKUP
|
|
+ int B_flag; /* -B: back up existing files by renaming to *~ first */
|
|
+#endif
|
|
+ int cflag; /* -c: output to stdout */
|
|
+ int C_flag; /* -C: match filenames case-insensitively */
|
|
+#ifdef MACOS
|
|
+ int E_flag; /* -E: [MacOS] show Mac extra field during restoring */
|
|
+#endif
|
|
+ int fflag; /* -f: "freshen" (extract only newer files) */
|
|
+#if (defined(RISCOS) || defined(ACORN_FTYPE_NFS))
|
|
+ int acorn_nfs_ext; /* -F: RISC OS types & NFS filetype extensions */
|
|
+#endif
|
|
+ int hflag; /* -h: header line (zipinfo) */
|
|
+#ifdef MACOS
|
|
+ int i_flag; /* -i: [MacOS] ignore filenames stored in Mac e.f. */
|
|
+#endif
|
|
+#ifdef RISCOS
|
|
+ int scanimage; /* -I: scan image files */
|
|
+#endif
|
|
+ int jflag; /* -j: junk pathnames (unzip) */
|
|
+#if (defined(__ATHEOS__) || defined(__BEOS__) || defined(MACOS))
|
|
+ int J_flag; /* -J: ignore AtheOS/BeOS/MacOS e. f. info (unzip) */
|
|
+#endif
|
|
+#if (defined(__ATHEOS__) || defined(__BEOS__) || defined(UNIX))
|
|
+ int K_flag; /* -K: keep setuid/setgid/tacky permissions */
|
|
+#endif
|
|
+ int lflag; /* -12slmv: listing format (zipinfo) */
|
|
+ int iso8859_2; /* -O: ISO8859-2 is used instead ISO8859-1 */
|
|
+ int L_flag; /* -L: convert filenames from some OSes to lowercase */
|
|
+ int overwrite_none; /* -n: never overwrite files (no prompting) */
|
|
+#ifdef AMIGA
|
|
+ int N_flag; /* -N: restore comments as AmigaDOS filenotes */
|
|
+#endif
|
|
+ int overwrite_all; /* -o: OK to overwrite files without prompting */
|
|
+#endif /* !FUNZIP */
|
|
+ int qflag; /* -q: produce a lot less output */
|
|
+#ifdef TANDEM
|
|
+ int rflag; /* -r: remove file extensions */
|
|
+#endif
|
|
+#ifndef FUNZIP
|
|
+#if (defined(MSDOS) || defined(FLEXOS) || defined(OS2) || defined(WIN32))
|
|
+ int sflag; /* -s: convert spaces in filenames to underscores */
|
|
+#endif
|
|
+ int no_conv_enc; /* -S: suppress encoding conversion */
|
|
+#if (defined(NLM))
|
|
+ int sflag; /* -s: convert spaces in filenames to underscores */
|
|
+#endif
|
|
+#if (defined(MSDOS) || defined(__human68k__) || defined(OS2) || defined(WIN32))
|
|
+ int volflag; /* -$: extract volume labels */
|
|
+#endif
|
|
+ int tflag; /* -t: test (unzip) or totals line (zipinfo) */
|
|
+ int T_flag; /* -T: timestamps (unzip) or dec. time fmt (zipinfo) */
|
|
+ int uflag; /* -u: "update" (extract only newer/brand-new files) */
|
|
+ int vflag; /* -v: (verbosely) list directory */
|
|
+ int V_flag; /* -V: don't strip VMS version numbers */
|
|
+ int W_flag; /* -W: wildcard '*' won't match '/' dir separator */
|
|
+#if (defined (__ATHEOS__) || defined(__BEOS__) || defined(UNIX))
|
|
+ int X_flag; /* -X: restore owner/protection or UID/GID or ACLs */
|
|
+#else
|
|
+#if (defined(TANDEM) || defined(THEOS))
|
|
+ int X_flag; /* -X: restore owner/protection or UID/GID or ACLs */
|
|
+#else
|
|
+#if (defined(OS2) || defined(VMS) || defined(WIN32))
|
|
+ int X_flag; /* -X: restore owner/protection or UID/GID or ACLs */
|
|
+#endif
|
|
+#endif
|
|
+#endif
|
|
+ int zflag; /* -z: display the zipfile comment (only, for unzip) */
|
|
+#if (!defined(RISCOS) && !defined(CMS_MVS) && !defined(TANDEM))
|
|
+ int ddotflag; /* -:: don't skip over "../" path elements */
|
|
+#endif
|
|
+#endif /* !FUNZIP */
|
|
+} UzpOpts;
|
|
+
|
|
+/* intended to be a private struct: */
|
|
+typedef struct _ver {
|
|
+ uch major; /* e.g., integer 5 */
|
|
+ uch minor; /* e.g., 2 */
|
|
+ uch patchlevel; /* e.g., 0 */
|
|
+ uch not_used;
|
|
+} _version_type;
|
|
+
|
|
+typedef struct _UzpVer {
|
|
+ ulg structlen; /* length of the struct being passed */
|
|
+ ulg flag; /* bit 0: is_beta bit 1: uses_zlib */
|
|
+ char *betalevel; /* e.g., "g BETA" or "" */
|
|
+ char *date; /* e.g., "4 Sep 95" (beta) or "4 September 1995" */
|
|
+ char *zlib_version; /* e.g., "0.95" or NULL */
|
|
+ _version_type unzip;
|
|
+ _version_type zipinfo;
|
|
+ _version_type os2dll;
|
|
+ _version_type windll;
|
|
+} UzpVer;
|
|
+
|
|
+/* for Visual BASIC access to Windows DLLs: */
|
|
+typedef struct _UzpVer2 {
|
|
+ ulg structlen; /* length of the struct being passed */
|
|
+ ulg flag; /* bit 0: is_beta bit 1: uses_zlib */
|
|
+ char betalevel[10]; /* e.g., "g BETA" or "" */
|
|
+ char date[20]; /* e.g., "4 Sep 95" (beta) or "4 September 1995" */
|
|
+ char zlib_version[10]; /* e.g., "0.95" or NULL */
|
|
+ _version_type unzip;
|
|
+ _version_type zipinfo;
|
|
+ _version_type os2dll;
|
|
+ _version_type windll;
|
|
+} UzpVer2;
|
|
+
|
|
+typedef struct central_directory_file_header { /* CENTRAL */
|
|
+ uch version_made_by[2];
|
|
+ uch version_needed_to_extract[2];
|
|
+ ush general_purpose_bit_flag;
|
|
+ ush compression_method;
|
|
+ ulg last_mod_dos_datetime;
|
|
+ ulg crc32;
|
|
+ ulg csize;
|
|
+ ulg ucsize;
|
|
+ ush filename_length;
|
|
+ ush extra_field_length;
|
|
+ ush file_comment_length;
|
|
+ ush disk_number_start;
|
|
+ ush internal_file_attributes;
|
|
+ ulg external_file_attributes;
|
|
+ ulg relative_offset_local_header;
|
|
+} cdir_file_hdr;
|
|
+
|
|
+
|
|
+#define UZPINIT_LEN sizeof(UzpInit)
|
|
+#define UZPVER_LEN sizeof(UzpVer)
|
|
+#define cbList(func) int (* UZ_EXP func)(char *filename, cdir_file_hdr *crec)
|
|
+
|
|
+
|
|
+/*---------------------------------------------------------------------------
|
|
+ Return (and exit) values of the public UnZip API functions.
|
|
+ ---------------------------------------------------------------------------*/
|
|
+
|
|
+/* external return codes */
|
|
+#define PK_OK 0 /* no error */
|
|
+#define PK_COOL 0 /* no error */
|
|
+#define PK_WARN 1 /* warning error */
|
|
+#define PK_ERR 2 /* error in zipfile */
|
|
+#define PK_BADERR 3 /* severe error in zipfile */
|
|
+#define PK_MEM 4 /* insufficient memory (during initialization) */
|
|
+#define PK_MEM2 5 /* insufficient memory (password failure) */
|
|
+#define PK_MEM3 6 /* insufficient memory (file decompression) */
|
|
+#define PK_MEM4 7 /* insufficient memory (memory decompression) */
|
|
+#define PK_MEM5 8 /* insufficient memory (not yet used) */
|
|
+#define PK_NOZIP 9 /* zipfile not found */
|
|
+#define PK_PARAM 10 /* bad or illegal parameters specified */
|
|
+#define PK_FIND 11 /* no files found */
|
|
+#define PK_DISK 50 /* disk full */
|
|
+#define PK_EOF 51 /* unexpected EOF */
|
|
+
|
|
+#define IZ_CTRLC 80 /* user hit ^C to terminate */
|
|
+#define IZ_UNSUP 81 /* no files found: all unsup. compr/encrypt. */
|
|
+#define IZ_BADPWD 82 /* no files found: all had bad password */
|
|
+
|
|
+/* return codes of password fetches (negative = user abort; positive = error) */
|
|
+#define IZ_PW_ENTERED 0 /* got some password string; use/try it */
|
|
+#define IZ_PW_CANCEL -1 /* no password available (for this entry) */
|
|
+#define IZ_PW_CANCELALL -2 /* no password, skip any further pwd. request */
|
|
+#define IZ_PW_ERROR 5 /* = PK_MEM2 : failure (no mem, no tty, ...) */
|
|
+
|
|
+/* flag values for status callback function */
|
|
+#define UZ_ST_START_EXTRACT 1 /* no details */
|
|
+#define UZ_ST_IN_PROGRESS 2 /* no details */
|
|
+#define UZ_ST_FINISH_MEMBER 3 /* 'details': extracted size */
|
|
+
|
|
+/* return values of status callback function */
|
|
+#define UZ_ST_CONTINUE 0
|
|
+#define UZ_ST_BREAK 1
|
|
+
|
|
+
|
|
+/*---------------------------------------------------------------------------
|
|
+ Prototypes for public UnZip API (DLL) functions.
|
|
+ ---------------------------------------------------------------------------*/
|
|
+
|
|
+#define UzpMatch match
|
|
+
|
|
+int UZ_EXP UzpMain OF((int argc, char **argv));
|
|
+int UZ_EXP UzpAltMain OF((int argc, char **argv, UzpInit *init));
|
|
+UzpVer * UZ_EXP UzpVersion OF((void));
|
|
+void UZ_EXP UzpFreeMemBuffer OF((UzpBuffer *retstr));
|
|
+#ifndef WINDLL
|
|
+int UZ_EXP UzpUnzipToMemory OF((char *zip, char *file, UzpOpts *optflgs,
|
|
+ UzpCB *UsrFunc, UzpBuffer *retstr));
|
|
+int UZ_EXP UzpGrep OF((char *archive, char *file,
|
|
+ char *pattern, int cmd, int SkipBin,
|
|
+ UzpCB *UsrFunc));
|
|
+#endif
|
|
+#ifdef OS2
|
|
+int UZ_EXP UzpFileTree OF((char *name, cbList(callBack),
|
|
+ char *cpInclude[], char *cpExclude[]));
|
|
+#endif
|
|
+
|
|
+void UZ_EXP UzpVersion2 OF((UzpVer2 *version));
|
|
+int UZ_EXP UzpValidate OF((char *archive, int AllCodes));
|
|
+
|
|
+
|
|
+/* default I/O functions (can be swapped out via UzpAltMain() entry point): */
|
|
+
|
|
+int UZ_EXP UzpMessagePrnt OF((zvoid *pG, uch *buf, ulg size, int flag));
|
|
+int UZ_EXP UzpMessageNull OF((zvoid *pG, uch *buf, ulg size, int flag));
|
|
+int UZ_EXP UzpInput OF((zvoid *pG, uch *buf, int *size, int flag));
|
|
+void UZ_EXP UzpMorePause OF((zvoid *pG, ZCONST char *prompt, int flag));
|
|
+int UZ_EXP UzpPassword OF((zvoid *pG, int *rcnt, char *pwbuf,
|
|
+ int size, ZCONST char *zfn,
|
|
+ ZCONST char *efn));
|
|
+
|
|
+#ifdef __cplusplus
|
|
+}
|
|
+#endif
|
|
+
|
|
+
|
|
+/*---------------------------------------------------------------------------
|
|
+ Remaining private stuff for UnZip compilation.
|
|
+ ---------------------------------------------------------------------------*/
|
|
+
|
|
+#ifdef UNZIP_INTERNAL
|
|
+# include "unzpriv.h"
|
|
+#endif
|
|
+
|
|
+
|
|
+#endif /* !__unzip_h */
|
|
--- unzpriv.h 2007-12-03 13:44:30.000000000 +0100
|
|
+++ unzpriv.h 2007-12-03 13:49:01.000000000 +0100
|
|
@@ -785,9 +785,9 @@
|
|
#endif
|
|
#ifndef SSTAT
|
|
# ifdef WILD_STAT_BUG
|
|
-# define SSTAT(path,pbuf) (iswild(path) || stat(path,pbuf))
|
|
+# define SSTAT(path,pbuf) (iswild(path) || stat64(path,pbuf))
|
|
# else
|
|
-# define SSTAT stat
|
|
+# define SSTAT stat64
|
|
# endif
|
|
#endif
|
|
#ifndef STRNICMP
|