diff options
author | garga <garga@FreeBSD.org> | 2007-02-16 08:19:32 +0800 |
---|---|---|
committer | garga <garga@FreeBSD.org> | 2007-02-16 08:19:32 +0800 |
commit | a45d11431eef6283a7a4665ad85e525616836e68 (patch) | |
tree | 0721f12fadde6ea707da56b4f6725dec18f301e7 /security | |
parent | c9b9da8c5f9537a5e0798940248eb9f18d0790f6 (diff) | |
download | freebsd-ports-gnome-a45d11431eef6283a7a4665ad85e525616836e68.tar.gz freebsd-ports-gnome-a45d11431eef6283a7a4665ad85e525616836e68.tar.zst freebsd-ports-gnome-a45d11431eef6283a7a4665ad85e525616836e68.zip |
- Update to 0.90
- Cleanup a little bit
PR: ports/109185 (Based on)
Submitted by: Michael Scheidell <scheidell@secnap.net>
Diffstat (limited to 'security')
-rw-r--r-- | security/clamav/Makefile | 56 | ||||
-rw-r--r-- | security/clamav/distinfo | 6 | ||||
-rw-r--r-- | security/clamav/files/extra-patch-libclamav__unrarlib.h | 11 | ||||
-rw-r--r-- | security/clamav/files/extra-patch-libunrar | 3221 | ||||
-rw-r--r-- | security/clamav/files/patch-configure | 20 | ||||
-rw-r--r-- | security/clamav/files/patch-libclamav::zziplib::zzip-conf.h | 11 | ||||
-rw-r--r-- | security/clamav/files/patch-libclamav_clamav.h | 11 | ||||
-rw-r--r-- | security/clamav/files/pkg-deinstall.in | 17 | ||||
-rw-r--r-- | security/clamav/files/pkg-install.in | 32 | ||||
-rw-r--r-- | security/clamav/pkg-plist | 1 |
10 files changed, 44 insertions, 3342 deletions
diff --git a/security/clamav/Makefile b/security/clamav/Makefile index 079c78a89a8b..d988232397f0 100644 --- a/security/clamav/Makefile +++ b/security/clamav/Makefile @@ -6,8 +6,7 @@ # PORTNAME= clamav -PORTVERSION= 0.88.7 -PORTREVISION= 1 +PORTVERSION= 0.90 CATEGORIES= security MASTER_SITES= SF @@ -18,12 +17,10 @@ LIB_DEPENDS= gmp.7:${PORTSDIR}/math/libgmp4 RUN_DEPENDS= lha:${PORTSDIR}/archivers/lha \ arj:${PORTSDIR}/archivers/arj \ unzoo:${PORTSDIR}/archivers/unzoo \ - arc:${PORTSDIR}/archivers/arc \ - unzip:${PORTSDIR}/archivers/unzip + arc:${PORTSDIR}/archivers/arc OPTIONS= MILTER "Compile the milter interface" Off \ CURL "Support URL downloading" Off \ - LIBUNRAR "Support for external Unrar library" Off \ STDERR "Print logs to stderr instead of stdout" Off USE_AUTOTOOLS= libtool:15 @@ -31,7 +28,7 @@ CONFIGURE_TARGET= --build=${MACHINE_ARCH}-portbld-freebsd${OSREL} USE_LDCONFIG= yes USE_RC_SUBR= clamav-clamd clamav-freshclam -PORTDOCS= NEWS ChangeLog html +PORTDOCS= * DBDIR= /var/db/clamav LOGDIR= /var/log/clamav @@ -55,14 +52,21 @@ LDFLAGS+= -L${LOCALBASE}/lib \ CONFIGURE_ENV+= CPPFLAGS="${CPPFLAGS}" \ LDFLAGS="${LDFLAGS}" -MAN1= clamscan.1 freshclam.1 sigtool.1 clamdscan.1 -MAN5= clamd.conf.5 freshclam.conf.5 -MAN8= clamd.8 clamav-milter.8 +MAN1= clamconf.1 \ + clamscan.1 \ + freshclam.1 \ + sigtool.1 \ + clamdscan.1 +MAN5= clamd.conf.5 \ + freshclam.conf.5 +MAN8= clamd.8 \ + clamav-milter.8 CONFLICTS= clamav-devel-[0-9]* CLAMAVUSER?= clamav CLAMAVGROUP?= clamav + CLAMAV_CLAMD_SOCKET?= ${RUNDIR}/clamd CLAMAV_MILTER_SOCKET?= ${RUNDIR}/clmilter.sock @@ -83,10 +87,10 @@ SED_CONF= -E -e 's|^\#?(Example)$$|\#\1|' \ -e 's|^\#?(User) .*$$|\1 ${CLAMAVUSER}|' \ -e 's|^\#?(AllowSupplementaryGroups)$$|\1|' \ -e 's|^\#?(ScanMail)$$|\1|' \ - -e 's|^\#?(NotifyClamd)$$|\1|' \ -e 's|^\#?(DatabaseDirectory) .*$$|\1 ${DBDIR}|' \ -e 's|^\#?(DatabaseOwner) .*$$|\1 ${CLAMAVUSER}|' \ - -e 's|^\#?(FixStaleSocket)$$|\1|' + -e 's|^\#?(FixStaleSocket)$$|\1|' \ + -e 's|^\#?(NotifyClamd) .*$$|\1 ${PREFIX}/etc/clamd.conf|' PLIST_SUB+= CLAMAVUSER=${CLAMAVUSER} \ CLAMAVGROUP=${CLAMAVGROUP} @@ -122,16 +126,6 @@ CONFIGURE_ARGS+= --with-libcurl CONFIGURE_ARGS+= --without-libcurl .endif -.if defined(WITH_LIBUNRAR) -CFLAGS+= -DUNRAR3 -LDFLAGS+= -lunrar -LIB_DEPENDS+= unrar.3:${PORTSDIR}/archivers/libunrar -EXTRA_PATCHES= ${FILESDIR}/extra-patch-libunrar -.else -RUN_DEPENDS+= unrar:${PORTSDIR}/archivers/unrar -EXTRA_PATCHES= ${FILESDIR}/extra-patch-libclamav__unrarlib.h -.endif - .if defined(WITH_STDERR) EXTRA_PATCHES+= ${FILESDIR}/extra-patch-shared_output.c .endif @@ -141,15 +135,6 @@ post-patch: ${CONFIGURE_WRKSRC}/${CONFIGURE_SCRIPT} @${REINPLACE_CMD} -e 's,unarj,arj,g' \ ${WRKSRC}/docs/man/clamscan.1 - -pre-build: - @if ${LDCONFIG} -r | ${GREP} -qw -e -lclamav; then \ - ${ECHO_MSG} "===> *** WARNING ***"; \ - ${ECHO_MSG} " Installed version of libclamav found."; \ - ${ECHO_MSG} " This might cause build problems."; \ - fi - -post-build: @${REINPLACE_CMD} ${SED_CONF} ${BUILD_WRKSRC}/etc/clamd.conf @${REINPLACE_CMD} ${SED_CONF} ${BUILD_WRKSRC}/etc/freshclam.conf @@ -158,20 +143,15 @@ pre-install: ${SH} ${PKGINSTALL} ${PKGNAME} PRE-INSTALL post-install: - @${CHOWN} -R ${CLAMAVUSER}:${CLAMAVGROUP} ${DESTDIR}${DBDIR} .for c in clamd freshclam @[ -f ${TARGETDIR}/etc/${c}.conf ] || \ ${CP} ${TARGETDIR}/etc/${c}.conf.default ${TARGETDIR}/etc/${c}.conf .endfor .if !defined(NOPORTDOCS) - @${MKDIR} ${DOCSDIR} - @${INSTALL_DATA} ${INSTALL_WRKSRC}/NEWS ${INSTALL_WRKSRC}/ChangeLog \ - ${DOCSDIR} @${MKDIR} ${DOCSDIR}/html - @${INSTALL_DATA} ${INSTALL_WRKSRC}/docs/html/*.* \ - ${DOCSDIR}/html + @${INSTALL_DATA} ${INSTALL_WRKSRC}/NEWS ${INSTALL_WRKSRC}/ChangeLog ${DOCSDIR} + @${INSTALL_DATA} ${INSTALL_WRKSRC}/docs/html/* ${DOCSDIR}/html .endif - @${SETENV} PKG_PREFIX=${PREFIX} \ - ${SH} ${PKGINSTALL} ${PKGNAME} POST-INSTALL + @${SETENV} PKG_PREFIX=${PREFIX} ${SH} ${PKGINSTALL} ${PKGNAME} POST-INSTALL .include <bsd.port.post.mk> diff --git a/security/clamav/distinfo b/security/clamav/distinfo index 741ccd57d377..483a3c6b13e5 100644 --- a/security/clamav/distinfo +++ b/security/clamav/distinfo @@ -1,3 +1,3 @@ -MD5 (clamav-0.88.7.tar.gz) = 34a9d58cf5bcb04dbe3eb32b5367a3f8 -SHA256 (clamav-0.88.7.tar.gz) = 702cb5928bff3d0e647a4a6b505d434e3a0f10f2af74bddac5239a200b92d1e2 -SIZE (clamav-0.88.7.tar.gz) = 9510548 +MD5 (clamav-0.90.tar.gz) = f04372e49c3c5ff3bd94bbe1fef2eaca +SHA256 (clamav-0.90.tar.gz) = c39005318d4a7d27d9710c3d71396b8c500e0bc5a184cb7392051c9ca9dea60d +SIZE (clamav-0.90.tar.gz) = 11575374 diff --git a/security/clamav/files/extra-patch-libclamav__unrarlib.h b/security/clamav/files/extra-patch-libclamav__unrarlib.h deleted file mode 100644 index 4d8f466fed78..000000000000 --- a/security/clamav/files/extra-patch-libclamav__unrarlib.h +++ /dev/null @@ -1,11 +0,0 @@ ---- libclamav/unrarlib.h.orig Fri May 13 09:07:21 2005 -+++ libclamav/unrarlib.h Fri May 13 09:07:26 2005 -@@ -198,7 +198,7 @@ - - - #ifdef __cplusplus --}; -+} - #endif - - #endif diff --git a/security/clamav/files/extra-patch-libunrar b/security/clamav/files/extra-patch-libunrar deleted file mode 100644 index 3145ad16c458..000000000000 --- a/security/clamav/files/extra-patch-libunrar +++ /dev/null @@ -1,3221 +0,0 @@ ---- ./libclamav/scanners.c.orig Thu Sep 15 18:45:30 2005 -+++ ./libclamav/scanners.c Wed Oct 12 14:40:13 2005 -@@ -42,12 +42,13 @@ - - #include <mspack.h> - -+#ifndef UNRAR3 - #ifdef CL_THREAD_SAFE - # include <pthread.h> - pthread_mutex_t cli_scanrar_mutex = PTHREAD_MUTEX_INITIALIZER; - #endif - int cli_scanrar_inuse = 0; -- -+#endif - extern short cli_leavetemps_flag; - - extern int cli_mbox(const char *dir, int desc, unsigned int options); /* FIXME */ -@@ -111,6 +112,7 @@ - static int cli_scanfile(const char *filename, const char **virname, unsigned long int *scanned, const struct cl_node *root, const struct cl_limits *limits, unsigned int options, unsigned int arec, unsigned int mrec); - - -+#ifndef UNRAR3 - #ifdef CL_THREAD_SAFE - static void cli_unlock_mutex(void *mtx) - { -@@ -330,6 +332,7 @@ - - return ret; - } -+#endif - - #ifdef HAVE_ZLIB_H - static int cli_scanzip(int desc, const char **virname, long int *scanned, const struct cl_node *root, const struct cl_limits *limits, unsigned int options, unsigned int arec, unsigned int mrec) -@@ -1216,6 +1219,43 @@ - return ret; - } - -+#ifdef UNRAR3 -+static int cli_scanrar3(int desc, const char **virname, long int *scanned, const struct cl_node *root, const struct cl_limits *limits, unsigned int options, unsigned int arec, unsigned int mrec) -+{ -+ const char *tmpdir; -+ char *dir; -+ int ret = CL_CLEAN; -+ -+ -+ cli_dbgmsg("in cli_scanrar3()\n"); -+ -+ if((tmpdir = getenv("TMPDIR")) == NULL) -+#ifdef P_tmpdir -+ tmpdir = P_tmpdir; -+#else -+ tmpdir = "/tmp"; -+#endif -+ -+ /* generate temporary directory */ -+ dir = cli_gentemp(tmpdir); -+ if(mkdir(dir, 0700)) { -+ cli_errmsg("Rar3: Can't create temporary directory %s\n", dir); -+ return CL_ETMPDIR; -+ } -+ -+ if((ret = cli_unrar3(dir, desc))) -+ cli_dbgmsg("Rar3: %s\n", cl_strerror(ret)); -+ else -+ ret = cli_scandir(dir, virname, scanned, root, limits, options, arec, mrec); -+ -+ if(!cli_leavetemps_flag) -+ cli_rmdirs(dir); -+ -+ free(dir); -+ return ret; -+} -+#endif -+ - static int cli_scanmschm(int desc, const char **virname, unsigned long int *scanned, const struct cl_node *root, const struct cl_limits *limits, unsigned int options, unsigned int arec, unsigned int mrec) - { - char *tempname; -@@ -1403,8 +1443,13 @@ - - switch(type) { - case CL_TYPE_RAR: -+#ifdef UNRAR3 -+ if(!DISABLE_RAR && SCAN_ARCHIVE) -+ ret = cli_scanrar3(desc, virname, scanned, root, limits, options, arec, mrec); -+#else - if(!DISABLE_RAR && SCAN_ARCHIVE && !cli_scanrar_inuse) - ret = cli_scanrar(desc, virname, scanned, root, limits, options, arec, mrec); -+#endif - break; - - case CL_TYPE_ZIP: -@@ -1541,8 +1586,17 @@ - * in raw mode. Now we will try to unpack them - */ - case CL_TYPE_MSEXE: -+#ifdef UNRAR3 -+ if(!DISABLE_RAR && SCAN_ARCHIVE) -+ ret = cli_scanrar3(desc, virname, scanned, root, limits, options, arec, mrec); -+ if(SCAN_PE && ret != CL_VIRUS) -+#else - if(SCAN_PE) -+#endif -+ { -+ lseek(desc, 0, SEEK_SET); - ret = cli_scanpe(desc, virname, scanned, root, limits, options, arec, mrec); -+ } - break; - - default: ---- ./libclamav/unrarlib.c.orig Thu Jun 23 17:03:12 2005 -+++ ./libclamav/unrarlib.c Wed Oct 12 14:40:13 2005 -@@ -1,2774 +1,119 @@ --/* It contains some changes needed for libclamav and isn't compatible with -- * the original version, --tk -+/* -+ * Copyright (C) 2004 McMCC <mcmcc@mail.ru> -+ * -+ * Support check archives RAR v.3.x -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -+ * - */ --/* *************************************************************************** -- ** -- ** This file is part of the UniquE RAR File Library. -- ** -- ** Copyright (C) 2000-2002 by Christian Scheurer (www.ChristianScheurer.ch) -- ** UNIX port copyright (c) 2000-2002 by Johannes Winkelmann (jw@tks6.net) -- ** -- ** The contents of this file are subject to the UniquE RAR File Library -- ** License (the "unrarlib-license.txt"). You may not use this file except -- ** in compliance with the License. You may obtain a copy of the License -- ** at http://www.unrarlib.org/license.html. -- ** Software distributed under the License is distributed on an "AS IS" -- ** basis, WITHOUT WARRANTY OF ANY KIND, either express or implied warranty. -- ** -- ** Alternatively, the contents of this file may be used under the terms -- ** of the GNU General Public License Version 2 or later (the "GPL"), in -- ** which case the provisions of the GPL are applicable instead of those -- ** above. If you wish to allow use of your version of this file only -- ** under the terms of the GPL and not to allow others to use your version -- ** of this file under the terms of the UniquE RAR File Library License, -- ** indicate your decision by deleting the provisions above and replace -- ** them with the notice and other provisions required by the GPL. If you -- ** do not delete the provisions above, a recipient may use your version -- ** of this file under the terms of the GPL or the UniquE RAR File Library -- ** License. -- ** -- ************************************************************************** */ -- --/* *************************************************************************** -- ** -- ** UniquE RAR File Library -- ** The free file lib for the demoscene -- ** multi-OS version (Win32, Linux and SunOS) -- ** -- ***************************************************************************** -- ** -- ** ==> Please configure the program in "unrarlib.h". <== -- ** -- ** RAR decompression code: -- ** (C) Eugene Roshal -- ** Modifications to a FileLib: -- ** (C) 2000-2002 Christian Scheurer aka. UniquE/Vantage (cs@unrarlib.org) -- ** Linux port: -- ** (C) 2000-2002 Johannes Winkelmann (jw@tks6.net) -- ** -- ** The UniquE RAR File Library gives you the ability to access RAR archives -- ** (any compression method supported in RAR v2.0 including Multimedia -- ** Compression and encryption) directly from your program with ease an by -- ** adding only 12kB (6kB UPX-compressed) additional code to your program. -- ** Both solid and normal (recommended for fast random access to the files!) -- ** archives are supported. This FileLib is made for the Demo scene, so it's -- ** designed for easy use within your demos and intros. -- ** Please read "licence.txt" to learn more about how you may use URARFileLib -- ** in your productions. -- ** -- ***************************************************************************** -- ** -- ** ==> see the "CHANGES" file to see what's new -- ** -- ************************************************************************** */ -- --/* -- include files ------------------------------------------------------- */ --#if HAVE_CONFIG_H --#include "clamav-config.h" --#endif -- --#include "unrarlib.h" /* include global configuration */ --#include "others.h" --/* ------------------------------------------------------------------------ */ -- -+static char const rcsid[] = "$Id: unrarlib.c,v 1.0 2004/10/20 18:18:46 mcmcc Exp $"; - -- --/* -- global stuff -------------------------------------------------------- */ --#ifdef _WIN_32 -- --#include <windows.h> /* WIN32 definitions */ - #include <stdio.h> --#include <string.h> -- -- --#define ENABLE_ACCESS -- --#define HOST_OS WIN_32 -- --#define FM_NORMAL 0x00 --#define FM_RDONLY 0x01 --#define FM_HIDDEN 0x02 --#define FM_SYSTEM 0x04 --#define FM_LABEL 0x08 --#define FM_DIREC 0x10 --#define FM_ARCH 0x20 -- --#define PATHDIVIDER "\\" --#define CPATHDIVIDER '\\' --#define MASKALL "*.*" -- --#define READBINARY "rb" --#define READTEXT "rt" --#define UPDATEBINARY "r+b" --#define CREATEBINARY "w+b" --#define CREATETEXT "w" --#define APPENDTEXT "at" -- --#endif -- --#ifdef _UNIX -- --#include <stdio.h> /* LINUX/UNIX definitions */ - #include <stdlib.h> --#include <unistd.h> --#include <ctype.h> --#include <string.h> - #include <errno.h> -- --#define ENABLE_ACCESS -- --#define HOST_OS UNIX -- --#define FM_LABEL 0x0000 --#define FM_DIREC 0x4000 -- --#define PATHDIVIDER "/" --#define CPATHDIVIDER '/' --#define MASKALL "*.*" -- --#define READBINARY "r" --#define READTEXT "r" --#define UPDATEBINARY "r+" --#define CREATEBINARY "w+" --#define CREATETEXT "w" --#define APPENDTEXT "a" -- -- --/* emulation of the windows API and data types */ --/* 20-08-2000 Johannes Winkelmann, jw@tks6.net */ -- --typedef long DWORD; --typedef short BOOL; --#define TRUE 1 --#define FALSE 0 -- -- --#ifdef _DEBUG_LOG /* define macros for debugging */ -+#include <string.h> - #include <unistd.h> --#include <sys/time.h> -- --DWORD GetTickCount() --{ -- struct timeval tv; -- gettimeofday( &tv, 0 ); -- return (tv.tv_usec / 1000); --} --#endif -- --#endif -- -- -- -- -- --#ifdef _DEBUG_LOG /* define macros for debugging */ -- --BOOL debug_log_first_start = TRUE; -- --#define debug_log(a); debug_log_proc(a, __FILE__, __LINE__); --#define debug_init(a); debug_init_proc(a); -- --void debug_log_proc(char *text, char *sourcefile, int sourceline); --void debug_init_proc(char *file_name); -- --#else --#define debug_log(a); cli_dbgmsg("%s:%d %s\n", __FILE__, __LINE__, a); --#define debug_init(a); /* no debug this time */ --#endif -- -- -- -- -- --#define MAXWINSIZE 0x100000 --#define MAXWINMASK (MAXWINSIZE-1) --#define UNP_MEMORY MAXWINSIZE --#define Min(x,y) (((x)<(y)) ? (x):(y)) --#define Max(x,y) (((x)>(y)) ? (x):(y)) --#define NM 260 -- --#define SIZEOF_MARKHEAD 7 --#define SIZEOF_OLDMHD 7 --#define SIZEOF_NEWMHD 13 --#define SIZEOF_OLDLHD 21 --#define SIZEOF_NEWLHD 32 --#define SIZEOF_SHORTBLOCKHEAD 7 --#define SIZEOF_LONGBLOCKHEAD 11 --#define SIZEOF_COMMHEAD 13 --#define SIZEOF_PROTECTHEAD 26 -- -- --#define PACK_VER 20 /* version of decompression code*/ --#define UNP_VER 20 --#define PROTECT_VER 20 -- -- --enum { M_DENYREAD,M_DENYWRITE,M_DENYNONE,M_DENYALL }; --enum { FILE_EMPTY,FILE_ADD,FILE_UPDATE,FILE_COPYOLD,FILE_COPYBLOCK }; --enum { SUCCESS,WARNING,FATAL_ERROR,CRC_ERROR,LOCK_ERROR,WRITE_ERROR, -- OPEN_ERROR,USER_ERROR,MEMORY_ERROR,USER_BREAK=255,IMM_ABORT=0x8000 }; --enum { EN_LOCK=1,EN_VOL=2 }; --enum { SD_MEMORY=1,SD_FILES=2 }; --enum { NAMES_DONTCHANGE }; --enum { LOG_ARC=1,LOG_FILE=2 }; --enum { OLD_DECODE=0,OLD_ENCODE=1,NEW_CRYPT=2 }; --enum { OLD_UNPACK,NEW_UNPACK }; -- -- --#define MHD_COMMENT 2 --#define MHD_LOCK 4 --#define MHD_PACK_COMMENT 16 --#define MHD_AV 32 --#define MHD_PROTECT 64 -- --#define LHD_SPLIT_BEFORE 1 --#define LHD_SPLIT_AFTER 2 --#define LHD_PASSWORD 4 --#define LHD_COMMENT 8 --#define LHD_SOLID 16 -- --#define LHD_WINDOWMASK 0x00e0 --#define LHD_WINDOW64 0 --#define LHD_WINDOW128 32 --#define LHD_WINDOW256 64 --#define LHD_WINDOW512 96 --#define LHD_WINDOW1024 128 --#define LHD_DIRECTORY 0x00e0 -- --#define LONG_BLOCK 0x8000 --#define READSUBBLOCK 0x8000 -- --enum { ALL_HEAD=0,MARK_HEAD=0x72,MAIN_HEAD=0x73,FILE_HEAD=0x74, -- COMM_HEAD=0x75,AV_HEAD=0x76,SUB_HEAD=0x77,PROTECT_HEAD=0x78}; --enum { EA_HEAD=0x100 }; --enum { MS_DOS=0,OS2=1,WIN_32=2,UNIX=3 }; -- -- --struct MarkHeader --{ -- UBYTE Mark[7]; --}; -- -- --struct NewMainArchiveHeader --{ -- UWORD HeadCRC; -- UBYTE HeadType; -- UWORD Flags; -- UWORD HeadSize; -- UWORD Reserved; -- UDWORD Reserved1; --}; -- -- --struct NewFileHeader --{ -- UWORD HeadCRC; -- UBYTE HeadType; -- UWORD Flags; -- UWORD HeadSize; -- UDWORD PackSize; -- UDWORD UnpSize; -- UBYTE HostOS; -- UDWORD FileCRC; -- UDWORD FileTime; -- UBYTE UnpVer; -- UBYTE Method; -- UWORD NameSize; -- UDWORD FileAttr; --}; -- -- --struct BlockHeader --{ -- UWORD HeadCRC; -- UBYTE HeadType; -- UWORD Flags; -- UWORD HeadSize; -- UDWORD DataSize; --}; -- -- --struct Decode --{ -- unsigned int MaxNum; -- unsigned int DecodeLen[16]; -- unsigned int DecodePos[16]; -- unsigned int DecodeNum[2]; --}; -- -- --static struct MarkHeader MarkHead; --static struct NewMainArchiveHeader NewMhd; --static struct NewFileHeader NewLhd; --static struct BlockHeader BlockHead; -- --static UBYTE *TempMemory = NULL; /* temporary unpack-buffer */ --static char *CommMemory = NULL; -- -- --static UBYTE *UnpMemory = NULL; --static char ArgName[NM]; /* current file in rar archive */ --static char ArcFileName[NM]; /* file to decompress */ -- --#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION /* mem-to-mem decompression */ --static MemoryFile *MemRARFile; /* pointer to RAR file in memory*/ --#else --static FILE *ArcPtr; /* input RAR file handler */ --#endif --static char Password[255]; /* password to decrypt files */ -- --static unsigned char *temp_output_buffer; /* extract files to this pointer*/ --static unsigned long *temp_output_buffer_offset; /* size of temp. extract buffer */ -- --static int MainHeadSize; -- --static long CurBlockPos,NextBlockPos; -- --static unsigned long CurUnpRead; --static long UnpPackedSize; --static long DestUnpSize; -- --static UDWORD HeaderCRC; --static int Encryption; -- --static unsigned int UnpPtr,WrPtr; -- --static unsigned char PN1,PN2,PN3; --static unsigned short OldKey[4]; -- -- -- --/* function header definitions */ --static int ReadHeader(int BlockType); --static BOOL ExtrFile(int desc); --static int tread(void *stream,void *buf,unsigned len); --static int tseek(void *stream,long offset,int fromwhere); --/* static BOOL UnstoreFile(void); */ --static int IsArchive(void); --static int ReadBlock(int BlockType); --static unsigned int UnpRead(unsigned char *Addr,unsigned int Count); --static void UnpInitData(void); --static void Unpack(unsigned char *UnpAddr, BOOL FileFound); --static UBYTE DecodeAudio(int Delta); --static void DecodeNumber(struct Decode *Dec); --static void UpdKeys(UBYTE *Buf); --static void SetCryptKeys(char* NewPassword); --static void SetOldKeys(char *NewPassword); --static void DecryptBlock(unsigned char *Buf); --static void InitCRC(void); --static UDWORD CalcCRC32(UDWORD StartCRC,UBYTE *Addr,UDWORD Size); --static void UnpReadBuf(int FirstBuf); --static void ReadTables(void); --static void ReadLastTables(void); --static void MakeDecodeTables(unsigned char *LenTab, -- struct Decode *Dec, -- int Size); --static int stricomp(char *Str1,char *Str2); --/* ------------------------------------------------------------------------ */ -- -- --/* -- global functions ---------------------------------------------------- */ -- --int urarlib_get(void *output, -- unsigned long *size, -- char *filename, -- int desc, -- char *libpassword) --/* Get a file from a RAR file to the "output" buffer. The UniquE RAR FileLib -- * does everything from allocating memory, decrypting and unpacking the file -- * from the archive. TRUE is returned if the file could be successfully -- * extracted, else a FALSE indicates a failure. -- */ --{ -- BOOL retcode = FALSE; -- --#ifdef _DEBUG_LOG -- int str_offs; /* used for debug-strings */ -- char DebugMsg[500]; /* used to compose debug msg */ -- -- if(debug_log_first_start) -- { -- debug_log_first_start=FALSE; /* only create a new log file */ -- debug_init(_DEBUG_LOG_FILE); /* on startup */ -- } -- --#endif -- -- InitCRC(); /* init some vars */ -- -- strcpy(ArgName, filename); /* set file(s) to extract */ --#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION -- MemRARFile = rarfile; /* set pointer to mem-RAR file */ --#endif -- if(libpassword != NULL) -- strcpy(Password, libpassword); /* init password */ -- -- temp_output_buffer = NULL; -- temp_output_buffer_offset=size; /* set size of the temp buffer */ -- -- retcode = ExtrFile(desc); /* unpack file now! */ -- -- -- memset(Password,0,sizeof(Password)); /* clear password */ -- --#ifndef _USE_MEMORY_TO_MEMORY_DECOMPRESSION -- if (ArcPtr!=NULL){ -- /* FIXME: possible FILE* leak */ -- cli_dbgmsg("%s:%d NOT Close ArcPtr from fd %d\n", __FILE__, __LINE__, desc); -- /* -- fclose(ArcPtr); -- lseek(desc, 0, SEEK_SET); -- ArcPtr = NULL; -- */ -- } --#endif -- -- if(UnpMemory) -- free(UnpMemory); -- -- if(TempMemory) -- free(TempMemory); -- -- if(CommMemory) -- free(CommMemory); -- -- UnpMemory=NULL; -- TempMemory=NULL; -- CommMemory=NULL; -- -- -- if(retcode == FALSE) -- { -- if(temp_output_buffer) -- free(temp_output_buffer); /* free memory and return NULL */ -- temp_output_buffer=NULL; -- *(DWORD*)output=0; /* pointer on errors */ -- *size=0; --#ifdef _DEBUG_LOG -- -- -- /* sorry for this ugly code, but older SunOS gcc compilers don't support */ -- /* white spaces within strings */ -- str_offs = sprintf(DebugMsg, "Error - couldn't extract "); -- str_offs += sprintf(DebugMsg + str_offs, ">%s<", filename); -- str_offs += sprintf(DebugMsg + str_offs, " and allocated "); -- str_offs += sprintf(DebugMsg + str_offs, "%u Bytes", (unsigned int)*size); -- str_offs += sprintf(DebugMsg + str_offs, " of unused memory!"); -- -- } else -- { -- sprintf(DebugMsg, "Extracted %u Bytes.", (unsigned int)*size); -- } -- debug_log(DebugMsg); --#else -- } --#endif -- *(DWORD*)output=(DWORD)temp_output_buffer;/* return pointer for unpacked*/ -- /* data */ -- -- return retcode; --} -- -- --int urarlib_list(int desc, ArchiveList_struct *list) --{ -- ArchiveList_struct *tmp_List = NULL; -- int NoOfFilesInArchive = 0; /* number of files in archive */ -- int newdesc; -- --#ifdef _DEBUG_LOG -- if(debug_log_first_start) -- { -- debug_log_first_start=FALSE; /* only create a new log file */ -- debug_init(_DEBUG_LOG_FILE); /* on startup */ -- } --#endif -- -- InitCRC(); /* init some vars */ -- --#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION -- MemRARFile = rarfile; /* assign pointer to RAR file */ -- MemRARFile->offset = 0; -- if (!IsArchive()) -- { -- debug_log("Not a RAR file"); -- return NoOfFilesInArchive; /* error => exit! */ -- } --#else -- /* open and identify archive */ -- newdesc = dup(desc); -- cli_dbgmsg("ExtrFile(): dup(%d) = %d\n", desc, newdesc); -- if ((ArcPtr=fdopen(newdesc,READBINARY))!=NULL) -- { -- if (!IsArchive()) -- { -- cli_dbgmsg("urarlib_list(): Not a valid archive."); -- debug_log("Not a RAR file"); -- fclose(ArcPtr); -- lseek(desc, 0, SEEK_SET); -- ArcPtr = NULL; -- return NoOfFilesInArchive; /* error => exit! */ -- } -- } -- else { -- cli_dbgmsg("urarlib_list(): Error opening file: %s", strerror(errno)); -- debug_log("Error opening file."); -- cli_dbgmsg("%s:%d Close fd %d\n", __FILE__, __LINE__, newdesc); -- close(newdesc); -- return NoOfFilesInArchive; -- } --#endif -- -- if ((UnpMemory=malloc(UNP_MEMORY))==NULL) -- { -- cli_dbgmsg("urarlib_list(): out of memory."); -- debug_log("Can't allocate memory for decompression!"); -- fclose(ArcPtr); -- return NoOfFilesInArchive; -- } -- --#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION -- MemRARFile->offset+=NewMhd.HeadSize-MainHeadSize; --#else -- tseek(ArcPtr,NewMhd.HeadSize-MainHeadSize,SEEK_CUR); --#endif -- (*(DWORD*)list) = (DWORD)NULL; /* init file list */ -- /* do while file is not extracted and there's no error */ -- for(;;) -- { -- int ReadBlockResult; -- if ((ReadBlockResult = ReadBlock(FILE_HEAD | READSUBBLOCK)) <= 0) /* read name of the next */ -- { /* file within the RAR archive */ -- cli_dbgmsg("Couldn't read next filename from archive (I/O error): %d\n", ReadBlockResult); -- break; /* error, file not found in */ -- } /* archive or I/O error */ -- if (BlockHead.HeadType==SUB_HEAD) -- { -- debug_log("Sorry, sub-headers not supported."); -- NoOfFilesInArchive = 0; -- break; /* error => exit */ -- } -- -- if((void*)(*(DWORD*)list) == NULL) /* first entry */ -- { -- tmp_List = malloc(sizeof(ArchiveList_struct)); -- tmp_List->next = NULL; -- -- (*(DWORD*)list) = (DWORD)tmp_List; -- -- } else /* add entry */ -- { -- tmp_List->next = malloc(sizeof(ArchiveList_struct)); -- tmp_List = (ArchiveList_struct*) tmp_List->next; -- tmp_List->next = NULL; -- } -- -- tmp_List->item.Name = malloc(NewLhd.NameSize + 1); -- strcpy(tmp_List->item.Name, ArcFileName); -- tmp_List->item.NameSize = NewLhd.NameSize; -- tmp_List->item.PackSize = NewLhd.PackSize; -- tmp_List->item.UnpSize = NewLhd.UnpSize; -- tmp_List->item.HostOS = NewLhd.HostOS; -- tmp_List->item.FileCRC = NewLhd.FileCRC; -- tmp_List->item.FileTime = NewLhd.FileTime; -- tmp_List->item.UnpVer = NewLhd.UnpVer; -- tmp_List->item.Method = NewLhd.Method; -- tmp_List->item.FileAttr = NewLhd.FileAttr; -- tmp_List->item.Flags = NewLhd.Flags; -- -- NoOfFilesInArchive++; /* count files */ -- --#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION -- MemRARFile->offset = NextBlockPos; --#else -- if (ArcPtr!=NULL) tseek(ArcPtr,NextBlockPos,SEEK_SET); --#endif -- -- }; -- -- /* free memory, clear password and close archive */ -- memset(Password,0,sizeof(Password)); /* clear password */ --#ifndef _USE_MEMORY_TO_MEMORY_DECOMPRESSION -- if (ArcPtr!=NULL){ -- fclose(ArcPtr); -- ArcPtr = NULL; -- lseek(desc, 0, SEEK_SET); -- } --#endif -- -- if(UnpMemory) -- free(UnpMemory); -- -- if(TempMemory) -- free(TempMemory); -- -- if(CommMemory) -- free(CommMemory); -- -- UnpMemory=NULL; -- TempMemory=NULL; -- CommMemory=NULL; -- -- return NoOfFilesInArchive; --} -- -- -- --/* urarlib_freelist: -- * (after the suggestion and code of Duy Nguyen, Sean O'Blarney -- * and Johannes Winkelmann who independently wrote a patch) -- * free the memory of a ArchiveList_struct created by urarlib_list. -- * -- * input: *list pointer to an ArchiveList_struct -- * output: - -- */ -- --void urarlib_freelist(ArchiveList_struct *list) --{ -- ArchiveList_struct* tmp = list; -- -- while ( list ) { -- tmp = list->next; -- free( list->item.Name ); -- free( list ); -- list = tmp; -- } --} -- -- --/* ------------------------------------------------------------------------ */ -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --/**************************************************************************** -- **************************************************************************** -- **************************************************************************** -- **************************************************************************** -- ******* ******* -- ******* ******* -- ******* ******* -- ******* B L O C K I / O ******* -- ******* ******* -- ******* ******* -- ******* ******* -- **************************************************************************** -- **************************************************************************** -- **************************************************************************** -- ****************************************************************************/ -- -- -- --#define GetHeaderByte(N) Header[N] -- --#define GetHeaderWord(N) (Header[N]+((UWORD)Header[N+1]<<8)) -- --#define GetHeaderDword(N) (Header[N]+((UWORD)Header[N+1]<<8)+\ -- ((UDWORD)Header[N+2]<<16)+\ -- ((UDWORD)Header[N+3]<<24)) -- -- --int ReadBlock(int BlockType) --{ -- struct NewFileHeader SaveFileHead; -- int Size=0,ReadSubBlock=0; -- static int LastBlock; -- memcpy(&SaveFileHead,&NewLhd,sizeof(SaveFileHead)); -- if (BlockType & READSUBBLOCK) { -- ReadSubBlock=1; -- BlockType &= 0xff; -- } -- { -- while (1) -- { --#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION -- CurBlockPos=MemRARFile->offset; /* get offset of mem-file */ --#else -- CurBlockPos=ftell(ArcPtr); --#endif -- Size=ReadHeader(FILE_HEAD); -- if (Size!=0) -- { -- if (NewLhd.HeadSize<SIZEOF_SHORTBLOCKHEAD) -- return(0); -- NextBlockPos=CurBlockPos+NewLhd.HeadSize; -- if (NewLhd.Flags & LONG_BLOCK) -- NextBlockPos+=NewLhd.PackSize; -- if (NextBlockPos<=CurBlockPos) -- return(0); -- } -- -- if (Size > 0 && BlockType!=SUB_HEAD) -- LastBlock=BlockType; -- if (Size==0 || BlockType==ALL_HEAD || NewLhd.HeadType==BlockType || -- (NewLhd.HeadType==SUB_HEAD && ReadSubBlock && LastBlock==BlockType)) -- break; --#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION -- MemRARFile->offset = NextBlockPos; --#else -- tseek(ArcPtr, NextBlockPos, SEEK_SET); --#endif -+#include <sys/stat.h> -+#include <fcntl.h> -+#include <sys/param.h> -+#include <libunrar3/dll.hpp> -+#include "clamav.h" -+#include "others.h" -+#include "unrarlib.h" -+#include "mbox.h" -+#include "blob.h" -+ -+int cli_unrar3(const char *dir, int desc) -+{ -+ -+ struct RAROpenArchiveDataEx OpenArchiveData; -+ struct RARHeaderData HeaderData; -+ int iReadHeaderCode, iProcessFileCode, fd, s_buff; -+ char buff[4096], uname[48]; -+ const char *tmpdir; -+ HANDLE hArcData; -+ FILE *out; -+ -+ if((tmpdir = getenv("TMPDIR")) == NULL) -+#ifdef P_tmpdir -+ tmpdir = P_tmpdir; -+#else -+ tmpdir = "/tmp"; -+#endif -+ -+ sprintf(uname, "%s/rarXXXXXX", tmpdir); -+ -+ if((fd = mkstemp(uname)) < 0 || (out = fdopen(fd, "w+")) == NULL) -+ { -+ -+ cli_dbgmsg("cli_unrar3: can't generate temporary file %s or open descriptor %d.\n", -+ uname, fd); -+ if(fd >= 0) -+ close(fd); -+ unlink(uname); -+ return CL_ETMPFILE; -+ } -+ -+ while((s_buff=read(desc, buff, sizeof(buff))) > 0) -+ { -+ if(fwrite(buff, 1, s_buff, out) != s_buff) -+ { -+ cli_dbgmsg("cli_unrar3: can't write to file %s.\n", uname); -+ fclose(out); -+ close(fd); -+ unlink(uname); -+ return CL_EOPEN; -+ } - } -- } -- -- BlockHead.HeadCRC=NewLhd.HeadCRC; -- BlockHead.HeadType=NewLhd.HeadType; -- BlockHead.Flags=NewLhd.Flags; -- BlockHead.HeadSize=NewLhd.HeadSize; -- BlockHead.DataSize=NewLhd.PackSize; -- -- if (BlockType!=NewLhd.HeadType) BlockType=ALL_HEAD; -- -- if((FILE_HEAD == BlockType) && (Size>0)) -- { -- NewLhd.NameSize=Min(NewLhd.NameSize,sizeof(ArcFileName)-1); --#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION -- tread(MemRARFile, ArcFileName, NewLhd.NameSize); --#else -- tread(ArcPtr,ArcFileName,NewLhd.NameSize); --#endif -- ArcFileName[NewLhd.NameSize]=0; --#ifdef _DEBUG_LOG -- if (NewLhd.HeadCRC!=(UWORD)~CalcCRC32(HeaderCRC,(UBYTE*)&ArcFileName[0], -- NewLhd.NameSize)) -- { -- debug_log("file header broken"); -+ fclose(out); -+ close(fd); -+ -+ memset(&OpenArchiveData, 0, sizeof(OpenArchiveData)); -+ -+ OpenArchiveData.ArcName = uname; /* name arch */ -+ OpenArchiveData.CmtBuf = NULL; -+ OpenArchiveData.OpenMode = RAR_OM_EXTRACT; -+ -+ hArcData = RAROpenArchiveEx(&OpenArchiveData); -+ -+ if (OpenArchiveData.OpenResult != 0) -+ { -+ cli_dbgmsg("cli_unrar3: error archive open (%d)\n", OpenArchiveData.OpenResult); -+ unlink(uname); -+ return CL_EOPEN; -+ } -+ -+ HeaderData.CmtBuf = NULL; -+ -+ while ((iReadHeaderCode = RARReadHeader(hArcData, &HeaderData)) == 0) -+ { -+ iProcessFileCode = RARProcessFile(hArcData, RAR_EXTRACT, (char *)dir, NULL); -+ if (iProcessFileCode != 0) -+ { -+ cli_dbgmsg("cli_unrar3: error archive extract (%d)\n", iProcessFileCode); -+ break; -+ } -+ - } --#endif -- Size+=NewLhd.NameSize; -- } else -- { -- memcpy(&NewLhd,&SaveFileHead,sizeof(NewLhd)); --#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION -- MemRARFile->offset = CurBlockPos; --#else -- tseek(ArcPtr,CurBlockPos,SEEK_SET); --#endif -- } -- -- -- return(Size); --} -- -- --int ReadHeader(int BlockType) --{ -- int Size = 0; -- unsigned char Header[64]; -- memset(Header, 0, sizeof(Header)); -- switch(BlockType) -- { -- case MAIN_HEAD: --#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION -- Size=tread(MemRARFile, Header, SIZEOF_NEWMHD); --#else -- Size=tread(ArcPtr,Header,SIZEOF_NEWMHD); --#endif -- NewMhd.HeadCRC=(unsigned short)GetHeaderWord(0); -- NewMhd.HeadType=GetHeaderByte(2); -- NewMhd.Flags=(unsigned short)GetHeaderWord(3); -- NewMhd.HeadSize=(unsigned short)GetHeaderWord(5); -- NewMhd.Reserved=(unsigned short)GetHeaderWord(7); -- NewMhd.Reserved1=GetHeaderDword(9); -- HeaderCRC=CalcCRC32(0xFFFFFFFFL,&Header[2],SIZEOF_NEWMHD-2); -- break; -- case FILE_HEAD: --#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION -- Size=tread(MemRARFile, Header, SIZEOF_NEWLHD); --#else -- Size=tread(ArcPtr,Header,SIZEOF_NEWLHD); --#endif -- NewLhd.HeadCRC=(unsigned short)GetHeaderWord(0); -- NewLhd.HeadType=GetHeaderByte(2); -- NewLhd.Flags=(unsigned short)GetHeaderWord(3); -- NewLhd.HeadSize=(unsigned short)GetHeaderWord(5); -- NewLhd.PackSize=GetHeaderDword(7); -- NewLhd.UnpSize=GetHeaderDword(11); -- NewLhd.HostOS=GetHeaderByte(15); -- NewLhd.FileCRC=GetHeaderDword(16); -- NewLhd.FileTime=GetHeaderDword(20); -- NewLhd.UnpVer=GetHeaderByte(24); -- NewLhd.Method=GetHeaderByte(25); -- NewLhd.NameSize=(unsigned short)GetHeaderWord(26); -- NewLhd.FileAttr=GetHeaderDword(28); -- HeaderCRC=CalcCRC32(0xFFFFFFFFL,Header+2,SIZEOF_NEWLHD-2); -- break; -- --#ifdef _DEBUG_LOG -- case COMM_HEAD: /* log errors in case of debug */ -- debug_log("Comment headers not supported! "\ -- "Please create archives without comments."); -- break; -- case PROTECT_HEAD: -- debug_log("Protected headers not supported!"); -- break; -- case ALL_HEAD: -- debug_log("ShortBlockHeader not supported!"); -- break; -- default: -- debug_log("Unknown//unsupported !"); --#else -- default: /* else do nothing */ -- break; --#endif -- } -- return(Size); -+ -+ RARCloseArchive(hArcData); -+ unlink(uname); -+ -+ /* -+ if (iProcessFileCode == ERAR_BAD_DATA) -+ return CL_ERAR; -+ */ -+ return CL_CLEAN; - } -- --/* ************************************************************************** -- **************************************************************************** -- **************************************************************************** -- ************************************************************************** */ -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --/* ************************************************************************** -- **************************************************************************** -- **************************************************************************** -- **************************************************************************** -- ******* ******* -- ******* ******* -- ******* ******* -- ******* E X T R A C T L O O P ******* -- ******* ******* -- ******* ******* -- ******* ******* -- **************************************************************************** -- **************************************************************************** -- **************************************************************************** -- ************************************************************************** */ -- -- --int IsArchive(void) --{ --#ifdef _DEBUG_LOG -- int str_offs; /* used for debug-strings */ -- char DebugMsg[500]; /* used to compose debug msg */ --#endif -- --#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION -- if (tread(MemRARFile, MarkHead.Mark, SIZEOF_MARKHEAD) != SIZEOF_MARKHEAD) { -- debug_log("IsArchive(): short read: FALSE"); -- return(FALSE); -- } --#else -- if (tread(ArcPtr,MarkHead.Mark,SIZEOF_MARKHEAD)!=SIZEOF_MARKHEAD) { -- debug_log("IsArchive(): short read: FALSE"); -- return(FALSE); -- } --#endif -- /* Old archive => error */ -- if (MarkHead.Mark[0]==0x52 && MarkHead.Mark[1]==0x45 && -- MarkHead.Mark[2]==0x7e && MarkHead.Mark[3]==0x5e) -- { -- debug_log("Attention: format as OLD detected! Can't handle archive!"); -- } -- else -- /* original RAR v2.0 */ -- if ((MarkHead.Mark[0]==0x52 && MarkHead.Mark[1]==0x61 && /* original */ -- MarkHead.Mark[2]==0x72 && MarkHead.Mark[3]==0x21 && /* RAR header*/ -- MarkHead.Mark[4]==0x1a && MarkHead.Mark[5]==0x07 && -- MarkHead.Mark[6]==0x00) || -- /* "UniquE!" - header */ -- (MarkHead.Mark[0]=='U' && MarkHead.Mark[1]=='n' && /* "UniquE!" */ -- MarkHead.Mark[2]=='i' && MarkHead.Mark[3]=='q' && /* header */ -- MarkHead.Mark[4]=='u' && MarkHead.Mark[5]=='E' && -- MarkHead.Mark[6]=='!')) -- -- { -- if (ReadHeader(MAIN_HEAD)!=SIZEOF_NEWMHD) { -- debug_log("IsArchive(): ReadHeader() failed"); -- return(FALSE); -- } -- } else -- { -- --#ifdef _DEBUG_LOG -- /* sorry for this ugly code, but older SunOS gcc compilers don't */ -- /* support white spaces within strings */ -- str_offs = sprintf(DebugMsg, "unknown archive type (only plain RAR "); -- str_offs += sprintf(DebugMsg + str_offs, "supported (normal and solid "); -- str_offs += sprintf(DebugMsg + str_offs, "archives), SFX and Volumes "); -- str_offs += sprintf(DebugMsg + str_offs, "are NOT supported!)"); -- -- debug_log(DebugMsg); --#endif -- -- } -- -- -- MainHeadSize=SIZEOF_NEWMHD; -- -- return(TRUE); --} -- -- --BOOL ExtrFile(int desc) --{ -- BOOL ReturnCode=TRUE; -- BOOL FileFound=FALSE; /* TRUE=use current extracted */ -- /* data FALSE=throw data away, */ -- /* wrong file */ -- int newdesc; -- --#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION -- MemRARFile->offset = 0; /* start reading from offset 0 */ -- if (!IsArchive()) -- { -- debug_log("Not a RAR file"); -- return FALSE; /* error => exit! */ -- } -- --#else -- /* open and identify archive */ -- newdesc = dup(desc); -- cli_dbgmsg("ExtrFile(): dup(%d) = %d\n", desc, newdesc); -- if ((ArcPtr=fdopen(newdesc,READBINARY))!=NULL) -- { -- if (!IsArchive()) -- { -- debug_log("Not a RAR file"); -- fclose(ArcPtr); -- ArcPtr = NULL; -- return FALSE; /* error => exit! */ -- } -- } else -- { -- debug_log("Error opening file."); -- return FALSE; -- } --#endif -- -- -- if ((UnpMemory=malloc(UNP_MEMORY))==NULL) -- { -- cli_dbgmsg("unrarlib: Can't allocate memory for decompression!"); -- return FALSE; -- } else cli_dbgmsg("unrarlib: Allocated %d bytes.\n", UNP_MEMORY); -- --#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION -- MemRARFile->offset+=NewMhd.HeadSize-MainHeadSize; --#else -- tseek(ArcPtr,NewMhd.HeadSize-MainHeadSize,SEEK_CUR); --#endif -- -- /* do while file is not extracted and there's no error */ -- do -- { -- -- if (ReadBlock(FILE_HEAD | READSUBBLOCK) <= 0) /* read name of the next */ -- { /* file within the RAR archive */ --/* -- * -- * 21.11.2000 UnQ There's a problem with some linux distros when a file -- * can not be found in an archive. -- * 07.09.2004 ThL Seems more like a logical bug in this lib, since it -- * appears to occur once for every archive. -- */ -- -- /* -- debug_log("Couldn't read next filename from archive (I/O error)."); -- */ -- ReturnCode=FALSE; -- break; /* error, file not found in */ -- } /* archive or I/O error */ -- if (BlockHead.HeadType==SUB_HEAD) -- { -- debug_log("Sorry, sub-headers not supported."); -- ReturnCode=FALSE; -- break; /* error => exit */ -- } -- -- -- if(TRUE == (FileFound=(stricomp(ArgName, ArcFileName) == 0))) -- /* *** file found! *** */ -- { -- { -- cli_dbgmsg("unrarlib: Allocating %d bytes\n", NewLhd.UnpSize); -- if((temp_output_buffer=malloc(NewLhd.UnpSize)) == NULL) { ;/* allocate memory for the*/ -- cli_errmsg("unrarlib: Can't malloc %d bytes\n", NewLhd.UnpSize); -- ReturnCode = FALSE; -- break; -- } -- } -- *temp_output_buffer_offset=0; /* file. The default offset */ -- /* within the buffer is 0 */ -- } -- -- /* in case of a solid archive, we need to decompress any single file till -- * we have found the one we are looking for. In case of normal archives -- * (recommended!!), we skip the files until we are sure that it is the -- * one we want. -- */ -- if((NewMhd.Flags & 0x08) || FileFound) -- { -- if (NewLhd.UnpVer<13 || NewLhd.UnpVer>UNP_VER) -- { -- cli_dbgmsg("unknown compression method: %d (min=13 max=%d)\n", NewLhd.UnpVer, UNP_VER); -- ReturnCode=FALSE; -- break; /* error, can't extract file! */ -- } -- -- CurUnpRead=0; -- if ((*Password!=0) && (NewLhd.Flags & LHD_PASSWORD)) -- Encryption=NewLhd.UnpVer; -- else -- Encryption=0; -- if (Encryption) SetCryptKeys(Password); -- -- UnpPackedSize=NewLhd.PackSize; -- DestUnpSize=NewLhd.UnpSize; -- -- if (NewLhd.Method==0x30) -- { -- cli_dbgmsg("unrarlib: Unstore method temporarily not supported\n"); -- /* UnstoreFile(); */ -- ReturnCode=FALSE; -- break; /* error, can't extract file! */ -- } else -- { -- cli_dbgmsg("unrarlib: Unpack()\n"); -- Unpack(UnpMemory, FileFound); -- } -- -- --#ifdef _DO_CRC32_CHECK /* calculate CRC32 */ -- if((UBYTE*)temp_output_buffer != NULL) -- { -- if(NewLhd.FileCRC!=~CalcCRC32(0xFFFFFFFFL, -- (UBYTE*)temp_output_buffer, -- NewLhd.UnpSize)) -- { -- debug_log("CRC32 error - file couldn't be decompressed correctly!"); -- ReturnCode=FALSE; -- break; /* error, can't extract file! */ -- } -- } --#endif -- -- } -- --#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION -- MemRARFile->offset = NextBlockPos; --#else -- if (ArcPtr!=NULL) tseek(ArcPtr,NextBlockPos,SEEK_SET); --#endif -- } while(stricomp(ArgName, ArcFileName) != 0);/* exit if file is extracted */ -- -- /* free memory, clear password and close archive */ -- if(UnpMemory) -- free(UnpMemory); -- -- UnpMemory=NULL; --#ifndef _USE_MEMORY_TO_MEMORY_DECOMPRESSION -- if (ArcPtr!=NULL){ -- fclose(ArcPtr); -- lseek(desc, 0, SEEK_SET); -- ArcPtr = NULL; -- } --#endif -- -- return ReturnCode; --} -- --/* ************************************************************************** -- **************************************************************************** -- **************************************************************************** -- ************************************************************************** */ -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --/* ************************************************************************** -- **************************************************************************** -- **************************************************************************** -- **************************************************************************** -- ******* ******* -- ******* ******* -- ******* ******* -- ******* G L O B A L F U N C T I O N S ******* -- ******* ******* -- ******* ******* -- ******* ******* -- **************************************************************************** -- **************************************************************************** -- **************************************************************************** -- ************************************************************************** */ -- -- --int tread(void *stream,void *buf,unsigned len) --{ --#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION -- -- if(((MemRARFile->offset + len) > MemRARFile->size) || (len == 0)) -- return 0; -- -- memcpy(buf, -- (BYTE*)(((MemoryFile*)stream)->data)+((MemoryFile*)stream)->offset, -- len % ((((MemoryFile*)stream)->size) - 1)); -- -- MemRARFile->offset+=len; /* update read pointer */ -- return len % ((((MemoryFile*)stream)->size) - 1); --#else -- return(fread(buf,1,len,(FILE*)stream)); --#endif --} -- -- --#ifndef _USE_MEMORY_TO_MEMORY_DECOMPRESSION --int tseek(void *stream,long offset,int fromwhere) --{ -- return(fseek((FILE*)stream,offset,fromwhere)); --} --#endif -- -- --static char* strupper(char *Str) --{ -- char *ChPtr; -- for (ChPtr=Str;*ChPtr;ChPtr++) -- *ChPtr=(char)toupper(*ChPtr); -- return(Str); --} -- -- --int stricomp(char *Str1,char *Str2) --/* compare strings without regard of '\' and '/' */ --{ -- char S1[512],S2[512]; -- char *chptr; -- -- strncpy(S1,Str1,sizeof(S1)); -- strncpy(S2,Str2,sizeof(S2)); -- -- while((chptr = strchr(S1, '\\')) != NULL) /* ignore backslash */ -- { -- *chptr = '_'; -- } -- -- while((chptr = strchr(S2, '\\')) != NULL) /* ignore backslash */ -- { -- *chptr = '_'; -- } -- -- while((chptr = strchr(S1, '/')) != NULL) /* ignore slash */ -- { -- *chptr = '_'; -- } -- -- while((chptr = strchr(S2, '/')) != NULL) /* ignore slash */ -- { -- *chptr = '_'; -- } -- -- return(strcmp(strupper(S1),strupper(S2))); --} -- -- --/* ************************************************************************** -- **************************************************************************** -- **************************************************************************** -- ************************************************************************** */ -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --/* ************************************************************************** -- **************************************************************************** -- **************************************************************************** -- **************************************************************************** -- ******* ******* -- ******* ******* -- ******* ******* -- ******* U N P A C K C O D E ******* -- ******* ******* -- ******* ******* -- ******* ******* -- **************************************************************************** -- **************************************************************************** -- **************************************************************************** -- ************************************************************************** */ -- -- --/* ***************************** -- * ** unpack stored RAR files ** -- * *****************************/ -- --/* --BOOL UnstoreFile(void) --{ -- if ((long)(*temp_output_buffer_offset=UnpRead(temp_output_buffer, -- NewLhd.UnpSize))==-1) -- { -- cli_dbgmsg("unrarlib: Read error of stored file!"); -- return FALSE; -- } -- return TRUE; --} --*/ -- -- --/* **************************************** -- * ** RAR decompression code starts here ** -- * ****************************************/ -- --#define NC 298 /* alphabet = {0,1,2, .,NC - 1} */ --#define DC 48 --#define RC 28 --#define BC 19 --#define MC 257 -- --enum {CODE_HUFFMAN=0,CODE_LZ=1,CODE_LZ2=2,CODE_REPEATLZ=3,CODE_CACHELZ=4, -- CODE_STARTFILE=5,CODE_ENDFILE=6,CODE_STARTMM=8,CODE_ENDMM=7, -- CODE_MMDELTA=9}; -- --struct AudioVariables --{ -- int K1,K2,K3,K4,K5; -- int D1,D2,D3,D4; -- int LastDelta; -- unsigned int Dif[11]; -- unsigned int ByteCount; -- int LastChar; --}; -- -- --#define NC 298 /* alphabet = {0, 1, 2, ..., NC - 1} */ --#define DC 48 --#define RC 28 --#define BC 19 --#define MC 257 -- -- --static struct AudioVariables AudV[4]; -- --#define GetBits() \ -- BitField = ( ( ( (UDWORD)InBuf[InAddr] << 16 ) | \ -- ( (UWORD) InBuf[InAddr+1] << 8 ) | \ -- ( InBuf[InAddr+2] ) ) \ -- >> (8-InBit) ) & 0xffff; -- -- --#define AddBits(Bits) \ -- InAddr += ( InBit + (Bits) ) >> 3; \ -- InBit = ( InBit + (Bits) ) & 7; -- --static unsigned char *UnpBuf; --static unsigned int BitField; --static unsigned int Number; -- --static unsigned char InBuf[8192]; /* input read buffer */ -- --static unsigned char UnpOldTable[MC*4]; -- --static unsigned int InAddr,InBit,ReadTop; -- --static unsigned int LastDist,LastLength; --static unsigned int Length,Distance; -- --static unsigned int OldDist[4],OldDistPtr; -- -- --static struct LitDecode --{ -- unsigned int MaxNum; -- unsigned int DecodeLen[16]; -- unsigned int DecodePos[16]; -- unsigned int DecodeNum[NC]; --} LD; -- --static struct DistDecode --{ -- unsigned int MaxNum; -- unsigned int DecodeLen[16]; -- unsigned int DecodePos[16]; -- unsigned int DecodeNum[DC]; --} DD; -- --static struct RepDecode --{ -- unsigned int MaxNum; -- unsigned int DecodeLen[16]; -- unsigned int DecodePos[16]; -- unsigned int DecodeNum[RC]; --} RD; -- --static struct MultDecode --{ -- unsigned int MaxNum; -- unsigned int DecodeLen[16]; -- unsigned int DecodePos[16]; -- unsigned int DecodeNum[MC]; --} MD[4]; -- --static struct BitDecode --{ -- unsigned int MaxNum; -- unsigned int DecodeLen[16]; -- unsigned int DecodePos[16]; -- unsigned int DecodeNum[BC]; --} BD; -- --static struct MultDecode *MDPtr[4]={&MD[0],&MD[1],&MD[2],&MD[3]}; -- --static int UnpAudioBlock,UnpChannels,CurChannel,ChannelDelta; -- -- --void Unpack(unsigned char *UnpAddr, BOOL FileFound) --/* *** 38.3% of all CPU time is spent within this function!!! */ --{ -- static unsigned char LDecode[]={0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32, -- 40,48,56,64,80,96,112,128,160,192,224}; -- static unsigned char LBits[]= {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3, -- 3,3,3,4,4,4,4,5,5,5,5}; -- static int DDecode[]={0,1,2,3,4,6,8,12,16,24,32,48,64,96,128,192,256,384, -- 512,768,1024,1536,2048,3072,4096,6144,8192,12288, -- 16384,24576,32768U,49152U,65536,98304,131072,196608, -- 262144,327680,393216,458752,524288,589824,655360, -- 720896,786432,851968,917504,983040}; -- static unsigned char DBits[]= {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9, -- 9,10,10,11,11,12,12,13,13,14,14,15,15,16, -- 16,16,16,16,16,16,16,16,16,16,16,16,16}; -- static unsigned char SDDecode[]={0,4,8,16,32,64,128,192}; -- static unsigned char SDBits[]={2,2,3, 4, 5, 6, 6, 6}; -- unsigned int Bits; -- -- -- UnpBuf=UnpAddr; /* UnpAddr is a pointer to the */ -- UnpInitData(); /* unpack buffer */ -- UnpReadBuf(1); -- if (!(NewLhd.Flags & LHD_SOLID)) -- ReadTables(); -- DestUnpSize--; -- -- while (DestUnpSize>=0) -- { -- UnpPtr&=MAXWINMASK; -- -- if (InAddr>sizeof(InBuf)-30) -- UnpReadBuf(0); -- if (((WrPtr-UnpPtr) & MAXWINMASK)<270 && WrPtr!=UnpPtr) -- { -- -- -- if (FileFound) -- { -- -- if (UnpPtr<WrPtr) -- { -- if((*temp_output_buffer_offset + ((0-WrPtr) & MAXWINMASK) + UnpPtr) > NewLhd.UnpSize) -- { -- debug_log("Fatal! Buffer overrun during decompression!"); -- DestUnpSize=-1; -- -- } else -- { -- /* copy extracted data to output buffer */ -- memcpy(temp_output_buffer + *temp_output_buffer_offset, -- &UnpBuf[WrPtr], (0-WrPtr) & MAXWINMASK); -- /* update offset within buffer */ -- *temp_output_buffer_offset+= (0-WrPtr) & MAXWINMASK; -- /* copy extracted data to output buffer */ -- memcpy(temp_output_buffer + *temp_output_buffer_offset, UnpBuf, -- UnpPtr); -- /* update offset within buffer */ -- *temp_output_buffer_offset+=UnpPtr; -- } -- } else -- { -- if((*temp_output_buffer_offset + (UnpPtr-WrPtr)) > NewLhd.UnpSize) -- { -- debug_log("Fatal! Buffer overrun during decompression!"); -- DestUnpSize=-1; -- } else -- { -- /* copy extracted data to output buffer */ -- memcpy(temp_output_buffer + *temp_output_buffer_offset, -- &UnpBuf[WrPtr], UnpPtr-WrPtr); -- *temp_output_buffer_offset+=UnpPtr-WrPtr; /* update offset within buffer */ -- } -- -- } -- } -- -- WrPtr=UnpPtr; -- } -- -- if (UnpAudioBlock) -- { -- DecodeNumber((struct Decode *)MDPtr[CurChannel]); -- if (Number==256) -- { -- ReadTables(); -- continue; -- } -- UnpBuf[UnpPtr++]=DecodeAudio(Number); -- if (++CurChannel==UnpChannels) -- CurChannel=0; -- DestUnpSize--; -- continue; -- } -- -- DecodeNumber((struct Decode *)&LD); -- if (Number<256) -- { -- UnpBuf[UnpPtr++]=(UBYTE)Number; -- DestUnpSize--; -- continue; -- } -- if (Number>269) -- { -- Length=LDecode[Number-=270]+3; -- if ((Bits=LBits[Number])>0) -- { -- GetBits(); -- Length+=BitField>>(16-Bits); -- AddBits(Bits); -- } -- -- DecodeNumber((struct Decode *)&DD); -- Distance=DDecode[Number]+1; -- if ((Bits=DBits[Number])>0) -- { -- GetBits(); -- Distance+=BitField>>(16-Bits); -- AddBits(Bits); -- } -- -- if (Distance>=0x40000L) -- Length++; -- -- if (Distance>=0x2000) -- Length++; -- -- LastDist=OldDist[OldDistPtr++ & 3]=Distance; -- DestUnpSize-=(LastLength=Length); -- while (Length--) -- { -- UnpBuf[UnpPtr]=UnpBuf[(UnpPtr-Distance) & MAXWINMASK]; -- UnpPtr=(UnpPtr+1) & MAXWINMASK; -- } -- -- continue; -- } -- if (Number==269) -- { -- ReadTables(); -- continue; -- } -- if (Number==256) -- { -- Length=LastLength; -- Distance=LastDist; -- LastDist=OldDist[OldDistPtr++ & 3]=Distance; -- DestUnpSize-=(LastLength=Length); -- while (Length--) -- { -- UnpBuf[UnpPtr]=UnpBuf[(UnpPtr-Distance) & MAXWINMASK]; -- UnpPtr=(UnpPtr+1) & MAXWINMASK; -- } -- continue; -- } -- if (Number<261) -- { -- Distance=OldDist[(OldDistPtr-(Number-256)) & 3]; -- DecodeNumber((struct Decode *)&RD); -- Length=LDecode[Number]+2; -- if ((Bits=LBits[Number])>0) -- { -- GetBits(); -- Length+=BitField>>(16-Bits); -- AddBits(Bits); -- } -- if (Distance>=0x40000) -- Length++; -- if (Distance>=0x2000) -- Length++; -- if (Distance>=0x101) -- Length++; -- LastDist=OldDist[OldDistPtr++ & 3]=Distance; -- DestUnpSize-=(LastLength=Length); -- while (Length--) -- { -- UnpBuf[UnpPtr]=UnpBuf[(UnpPtr-Distance) & MAXWINMASK]; -- UnpPtr=(UnpPtr+1) & MAXWINMASK; -- } -- continue; -- } -- if (Number<270) -- { -- Distance=SDDecode[Number-=261]+1; -- if ((Bits=SDBits[Number])>0) -- { -- GetBits(); -- Distance+=BitField>>(16-Bits); -- AddBits(Bits); -- } -- Length=2; -- LastDist=OldDist[OldDistPtr++ & 3]=Distance; -- DestUnpSize-=(LastLength=Length); -- while (Length--) -- { -- UnpBuf[UnpPtr]=UnpBuf[(UnpPtr-Distance) & MAXWINMASK]; -- UnpPtr=(UnpPtr+1) & MAXWINMASK; -- } -- continue; -- } -- } -- ReadLastTables(); -- -- if (FileFound) /* flush buffer */ -- { -- -- if (UnpPtr<WrPtr) -- { -- if((*temp_output_buffer_offset + ((0-WrPtr) & MAXWINMASK) + UnpPtr) > NewLhd.UnpSize) -- { -- debug_log("Fatal! Buffer overrun during decompression!"); -- DestUnpSize=-1; -- } else -- { -- /* copy extracted data to output buffer */ -- memcpy(temp_output_buffer + *temp_output_buffer_offset, &UnpBuf[WrPtr], -- (0-WrPtr) & MAXWINMASK); -- /* update offset within buffer */ -- *temp_output_buffer_offset+= (0-WrPtr) & MAXWINMASK; -- /* copy extracted data to output buffer */ -- memcpy(temp_output_buffer + *temp_output_buffer_offset, UnpBuf, UnpPtr); -- /* update offset within buffer */ -- *temp_output_buffer_offset+=UnpPtr; -- } -- } else -- { -- if((*temp_output_buffer_offset + (UnpPtr-WrPtr)) > NewLhd.UnpSize) -- { -- debug_log("Fatal! Buffer overrun during decompression!"); -- DestUnpSize=-1; -- } else -- { -- /* copy extracted data to output buffer */ -- memcpy(temp_output_buffer + *temp_output_buffer_offset, &UnpBuf[WrPtr], -- UnpPtr-WrPtr); -- /* update offset within buffer */ -- *temp_output_buffer_offset+=UnpPtr-WrPtr; -- } -- } -- } -- -- WrPtr=UnpPtr; --} -- -- --unsigned int UnpRead(unsigned char *Addr,unsigned int Count) --{ -- int RetCode=0; -- unsigned int I,ReadSize,TotalRead=0; -- unsigned char *ReadAddr; -- ReadAddr=Addr; -- while (Count > 0) -- { -- ReadSize=(unsigned int)((Count>(unsigned long)UnpPackedSize) ? -- UnpPackedSize : Count); --#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION -- cli_dbgmsg("unrarlib: UnpREAD: Using memory->memory decompression\n"); -- if(MemRARFile->data == NULL) -- return(0); -- RetCode=tread(MemRARFile, ReadAddr, ReadSize); --#else -- if (ArcPtr==NULL) -- return(0); -- RetCode=tread(ArcPtr,ReadAddr,ReadSize); --#endif -- CurUnpRead+=RetCode; -- ReadAddr+=RetCode; -- TotalRead+=RetCode; -- Count-=RetCode; -- UnpPackedSize-=RetCode; -- break; -- } -- -- cli_dbgmsg("CurUnpRead == %d, TotalRead == %d, Count == %d, UnpPackedSize == %d\n", CurUnpRead, TotalRead, Count, UnpPackedSize); -- -- if (RetCode!= -1) -- { -- RetCode=TotalRead; -- if (Encryption) -- { -- if (Encryption<20) -- { -- cli_dbgmsg("unrarlib: Old Crypt() not supported!"); -- } -- else -- { -- for (I=0;I<(unsigned int)RetCode;I+=16) -- DecryptBlock(&Addr[I]); -- } -- } -- } -- return(RetCode); --} -- -- --void UnpReadBuf(int FirstBuf) --{ -- int RetCode; -- if (FirstBuf) -- { -- ReadTop=UnpRead(InBuf,sizeof(InBuf)); -- InAddr=0; -- } -- else -- { -- memcpy(InBuf,&InBuf[sizeof(InBuf)-32],32); -- InAddr&=0x1f; -- RetCode=UnpRead(&InBuf[32],sizeof(InBuf)-32); -- if (RetCode>0) -- ReadTop=RetCode+32; -- else -- ReadTop=InAddr; -- } --} -- -- --void ReadTables(void) --{ -- UBYTE BitLength[BC]; -- unsigned char Table[MC*4]; -- int TableSize,N,I; -- if (InAddr>sizeof(InBuf)-25) -- UnpReadBuf(0); -- GetBits(); -- UnpAudioBlock=(BitField & 0x8000); -- -- if (!(BitField & 0x4000)) -- memset(UnpOldTable,0,sizeof(UnpOldTable)); -- AddBits(2); -- -- -- if (UnpAudioBlock) -- { -- UnpChannels=((BitField>>12) & 3)+1; -- if (CurChannel>=UnpChannels) -- CurChannel=0; -- AddBits(2); -- TableSize=MC*UnpChannels; -- } -- else -- TableSize=NC+DC+RC; -- -- -- for (I=0;I<BC;I++) -- { -- GetBits(); -- BitLength[I]=(UBYTE)(BitField >> 12); -- AddBits(4); -- } -- MakeDecodeTables(BitLength,(struct Decode *)&BD,BC); -- I=0; -- while (I<TableSize) -- { -- if (InAddr>sizeof(InBuf)-5) -- UnpReadBuf(0); -- DecodeNumber((struct Decode *)&BD); -- if (Number<16) { -- Table[I]=(Number+UnpOldTable[I]) & 0xf; -- I++; -- } -- else -- if (Number==16) -- { -- GetBits(); -- N=(BitField >> 14)+3; -- AddBits(2); -- while (N-- > 0 && I<TableSize) -- { -- Table[I]=Table[I-1]; -- I++; -- } -- } -- else -- { -- if (Number==17) -- { -- GetBits(); -- N=(BitField >> 13)+3; -- AddBits(3); -- } -- else -- { -- GetBits(); -- N=(BitField >> 9)+11; -- AddBits(7); -- } -- while (N-- > 0 && I<TableSize) -- Table[I++]=0; -- } -- } -- if (UnpAudioBlock) -- for (I=0;I<UnpChannels;I++) -- MakeDecodeTables(&Table[I*MC],(struct Decode *)MDPtr[I],MC); -- else -- { -- MakeDecodeTables(&Table[0],(struct Decode *)&LD,NC); -- MakeDecodeTables(&Table[NC],(struct Decode *)&DD,DC); -- MakeDecodeTables(&Table[NC+DC],(struct Decode *)&RD,RC); -- } -- memcpy(UnpOldTable,Table,sizeof(UnpOldTable)); --} -- -- --static void ReadLastTables(void) --{ -- if (ReadTop>=InAddr+5) -- { -- if (UnpAudioBlock) -- { -- DecodeNumber((struct Decode *)MDPtr[CurChannel]); -- if (Number==256) -- ReadTables(); -- } -- else -- { -- DecodeNumber((struct Decode *)&LD); -- if (Number==269) -- ReadTables(); -- } -- } --} -- -- --static void MakeDecodeTables(unsigned char *LenTab, -- struct Decode *Dec, -- int Size) --{ -- int LenCount[16],TmpPos[16],I; -- long M,N; -- memset(LenCount,0,sizeof(LenCount)); -- for (I=0;I<Size;I++) -- LenCount[LenTab[I] & 0xF]++; -- -- LenCount[0]=0; -- for (TmpPos[0]=Dec->DecodePos[0]=Dec->DecodeLen[0]=0,N=0,I=1;I<16;I++) -- { -- N=2*(N+LenCount[I]); -- M=N<<(15-I); -- if (M>0xFFFF) -- M=0xFFFF; -- Dec->DecodeLen[I]=(unsigned int)M; -- TmpPos[I]=Dec->DecodePos[I]=Dec->DecodePos[I-1]+LenCount[I-1]; -- } -- -- for (I=0;I<Size;I++) -- if (LenTab[I]!=0) -- Dec->DecodeNum[TmpPos[LenTab[I] & 0xF]++]=I; -- Dec->MaxNum=Size; --} -- -- --static void DecodeNumber(struct Decode *Deco) --/* *** 52.6% of all CPU time is spent within this function!!! */ --{ -- unsigned int I; -- register unsigned int N; -- GetBits(); -- --#ifdef _USE_ASM -- --#ifdef _WIN_32 -- __asm { -- -- xor eax, eax -- mov eax, BitField /* N=BitField & 0xFFFE; */ -- and eax, 0xFFFFFFFE -- mov [N], eax -- mov edx, [Deco] /* EAX=N, EDX=Deco */ -- -- cmp eax, dword ptr[edx + 8*4 + 4] /* if (N<Dec->DecodeLen[8]) */ -- jae else_G -- -- cmp eax, dword ptr[edx + 4*4 + 4] /* if (N<Dec->DecodeLen[4]) */ -- jae else_F -- -- -- cmp eax, dword ptr[edx + 2*4 + 4] /* if (N<Dec->DecodeLen[2]) */ -- jae else_C -- -- cmp eax, dword ptr[edx + 1*4 + 4] /* if (N<Dec->DecodeLen[1]) */ -- jae else_1 -- mov I, 1 /* I=1; */ -- jmp next_1 -- else_1: /* else */ -- mov I, 2 /* I=2; */ -- next_1: -- -- jmp next_C -- else_C: /* else */ -- -- cmp eax, dword ptr[edx + 3*4 + 4] /* if (N<Dec->DecodeLen[3]) */ -- jae else_2 -- mov I, 3 /* I=3; */ -- jmp next_2 -- else_2: /* else */ -- mov I, 4 /* I=4; */ -- next_2: -- -- next_C: /* else */ -- -- jmp next_F -- else_F: -- -- -- cmp eax, dword ptr[edx + 6*4 + 4] /* if (N<Dec->DecodeLen[6]) */ -- jae else_E -- -- cmp eax, dword ptr[edx + 5*4 + 4] /* if (N<Dec->DecodeLen[5]) */ -- jae else_3 -- mov I, 5 /* I=5; */ -- jmp next_3 -- else_3: /* else */ -- mov I, 6 /* I=6; */ -- next_3: -- -- jmp next_E -- else_E: /* else */ -- -- cmp eax, dword ptr[edx + 7*4 + 4] /* if (N<Dec->DecodeLen[7]) */ -- jae else_4 -- mov I, 7 /* I=7; */ -- jmp next_4 -- else_4: /* else */ -- mov I, 8 /* I=8; */ -- next_4: -- -- next_E: -- -- next_F: -- -- jmp next_G -- else_G: -- -- cmp eax, dword ptr[edx + 12*4 + 4] /* if (N<Dec->DecodeLen[12]) */ -- jae else_D -- -- cmp eax, dword ptr[edx + 10*4 + 4] /* if (N<Dec->DecodeLen[10]) */ -- jae else_B -- -- cmp eax, dword ptr[edx + 9*4 + 4] /* if (N<Dec->DecodeLen[9]) */ -- jae else_5 -- mov I, 9 /* I=9; */ -- jmp next_5 -- else_5: /* else */ -- mov I, 10 /* I=10; */ -- next_5: -- -- jmp next_B -- else_B: /* else */ -- -- cmp eax, dword ptr[edx + 11*4 + 4] /* if (N<Dec->DecodeLen[11]) */ -- jae else_6 -- mov I, 11 /* I=11; */ -- jmp next_6 -- else_6: /* else */ -- mov I, 12 /* I=12; */ -- next_6: -- -- next_B: -- -- -- jmp next_D -- else_D: /* else */ -- -- cmp eax, dword ptr[edx + 14*4 + 4] /* if (N<Dec->DecodeLen[14]) */ -- jae else_A -- -- cmp eax, dword ptr[edx + 13*4 + 4] /* if (N<Dec->DecodeLen[13]) */ -- jae else_7 -- mov I, 13 /* I=13; */ -- jmp next_7 -- else_7: /* else */ -- mov I, 14 /* I=14; */ -- next_7: -- -- jmp next_A -- else_A: /* else */ -- mov I, 15 /* I=15; */ -- next_A: -- -- next_D: -- next_G: --} --#else -- __asm__ __volatile__ ( -- "andl $0xFFFFFFFE, %%eax" --" movl %%eax, %1" --" cmpl 8*4(%%edx), %%eax /* 5379 */" --" jae else_G" --"" --" cmpl 4*4(%%edx), %%eax" --" jae else_F" --"" --" cmpl 2*4(%%edx), %%eax" --" jae else_C" --"" --" cmpl 1*4(%%edx), %%eax" --"" --" jae else_1" --" movl $1, %0" --" jmp next_1" --" else_1: " --" movl $2, %0" --" next_1:" --" " --" jmp next_C" --" else_C: " --"" --" cmpl 3*4(%%edx), %%eax " --" jae else_2" --" movl $3, %0" --" jmp next_2" --" else_2: " --" movl $4, %0" --" next_2:" --"" --" next_C: " --"" --" jmp next_F" --" else_F:" --"" --" cmpl 6*4(%%edx), %%eax" --" jae else_E" --"" --" cmpl 5*4(%%edx), %%eax" --" jae else_3" --" movl $5, %0 " --" jmp next_3" --" else_3: " --" movl $6, %0 " --" next_3:" --"" --" jmp next_E" --" else_E: " --"" --" cmpl 7*4(%%edx), %%eax" --" jae else_4" --" movl $7, %0 " --" jmp next_4" --" else_4: " --" movl $8, %0 " --" next_4:" --"" --" next_E:" --"" --" next_F:" --"" --" jmp next_G" --" else_G:" --"" --" cmpl 12*4(%%edx), %%eax" --" jae else_D" --"" --" cmpl 10*4(%%edx), %%eax" --" jae else_B" --"" --" cmpl 9*4(%%edx), %%eax" --" jae else_5" --" movl $9, %0 " --" jmp next_5" --" else_5: " --" movl $10, %0 " --" next_5:" --"" --" jmp next_B" --" else_B: " --"" --" cmpl 11*4(%%edx), %%eax" --" " --" jae else_6" --" movl $11, %0 " --" jmp next_6" --" else_6: " --" movl $12, %0 " --" next_6:" --"" --" next_B:" --" " --" " --" jmp next_D" --" else_D: " --"" --" cmpl 14*4(%%edx), %%eax" --" jae else_A" --"" --" cmpl 13*4(%%edx), %%eax" --" jae else_7" --" movl $13, %0" --" jmp next_7" --" else_7: " --" movl $14, %0" --" next_7:" --"" --" jmp next_A" --" else_A: " --" movl $15, %0 " --" next_A:" --" " --" next_D: " --" next_G:" -- : "=g" (I), "=r"(N) -- : "eax" ((long)BitField), "edx"((long)Deco->DecodeLen) -- : "memory" -- ); --#endif /* #ifdef _WIN_32 ... #elif defined _X86_ASM_ */ -- --#else -- N=BitField & 0xFFFE; -- if (N<Deco->DecodeLen[8]) { -- if (N<Deco->DecodeLen[4]) { -- if (N<Deco->DecodeLen[2]) { -- if (N<Deco->DecodeLen[1]) -- I=1; -- else -- I=2; -- } else { -- if (N<Deco->DecodeLen[3]) -- I=3; -- else -- I=4; -- } -- } else { -- if (N<Deco->DecodeLen[6]) { -- if (N<Deco->DecodeLen[5]) -- I=5; -- else -- I=6; -- } else { -- if (N<Deco->DecodeLen[7]) -- I=7; -- else -- I=8; -- } -- } -- } else { -- if (N<Deco->DecodeLen[12]) { -- if (N<Deco->DecodeLen[10]) { -- if (N<Deco->DecodeLen[9]) -- I=9; -- else -- I=10; -- } else { -- if (N<Deco->DecodeLen[11]) -- I=11; -- else -- I=12; -- } -- } else { -- if (N<Deco->DecodeLen[14]) { -- if (N<Deco->DecodeLen[13]) -- I=13; -- else -- I=14; -- -- } else { -- I=15; -- } -- } -- -- } --#endif -- -- AddBits(I); -- if ((N=Deco->DecodePos[I]+((N-Deco->DecodeLen[I-1])>>(16-I)))>=Deco->MaxNum) -- N=0; -- Number=Deco->DecodeNum[N]; --} -- -- --void UnpInitData() --{ -- InAddr=InBit=0; -- if (!(NewLhd.Flags & LHD_SOLID)) -- { -- ChannelDelta=CurChannel=0; -- --#ifdef _USE_ASM -- --#ifdef _WIN_32 /* Win32 with VisualC */ -- -- __asm { -- push edi -- push eax -- push ecx -- -- cld /* increment EDI and ESI */ -- mov al, 0x00 -- mov ecx, SIZE AudV -- mov edi, Offset AudV -- rep stosb /* clear memory */ -- -- mov ecx, SIZE OldDist -- mov edi, Offset OldDist -- rep stosb /* clear memory */ -- -- mov ecx, SIZE UnpOldTable -- mov edi, Offset UnpOldTable -- rep stosb /* clear memory */ -- -- pop ecx -- pop eax -- pop edi -- -- -- mov [OldDistPtr], 0 -- mov [LastDist], 0 -- mov [LastLength], 0 -- mov [UnpPtr], 0 -- mov [WrPtr], 0 -- mov [OldDistPtr], 0 -- mov [LastLength], 0 -- mov [LastDist], 0 -- mov [UnpPtr], 0 -- mov [WrPtr], 0 -- -- } -- memset(UnpBuf,0,MAXWINSIZE); -- -- --#else /* unix/linux on i386 cpus */ -- __asm__ __volatile ( --" cld /* increment EDI and ESI */" --" movb $0x00, %%al" --" movl %0, %%ecx" --" movl %1, %%edi" --" rep " --" stosb /* clear memory */" --"" --" movl %2, %%ecx" --" mov %3, %%edi" --" rep " --" stosb /* clear memory */" --"" --" movl %4, %%ecx" --" movl %5, %%edi" --" rep " --" stosb /* clear memory */" --"" --" movl $0, (OldDistPtr)" --" movl $0, (LastDist)" --" movl $0, (LastLength)" --" movl $0, (UnpPtr)" --" movl $0, (WrPtr)" --" movl $0, (OldDistPtr)" --" movl $0, (LastLength)" --" movl $0, (LastDist)" --" movl $0, (UnpPtr)" --" movl $0, (WrPtr)" -- : -- : "m" ((long)sizeof(AudV)), -- "m" ((long)AudV), -- "m" ((long)sizeof(OldDist)), -- "m" ((long)OldDist), -- "m" ((long)sizeof(UnpOldTable)), -- "m" ((long)UnpOldTable) -- : "memory", "edi", "eax", "ecx" -- ); -- memset(UnpBuf,0,MAXWINSIZE); --#endif -- --#else /* unix/linux on non-i386 cpu */ -- memset(AudV,0,sizeof(AudV)); -- memset(OldDist,0,sizeof(OldDist)); -- OldDistPtr=0; -- LastDist=LastLength=0; -- memset(UnpBuf,0,MAXWINSIZE); -- memset(UnpOldTable,0,sizeof(UnpOldTable)); -- UnpPtr=WrPtr=0; --#endif -- -- } --} -- -- --UBYTE DecodeAudio(int Delta) --{ -- struct AudioVariables *V; -- unsigned int Ch; -- unsigned int NumMinDif,MinDif; -- int PCh,I; -- -- V=&AudV[CurChannel]; -- V->ByteCount++; -- V->D4=V->D3; -- V->D3=V->D2; -- V->D2=V->LastDelta-V->D1; -- V->D1=V->LastDelta; -- PCh=8*V->LastChar+V->K1*V->D1+V->K2*V->D2+ -- V->K3*V->D3+V->K4*V->D4+V->K5*ChannelDelta; -- PCh=(PCh>>3) & 0xFF; -- -- Ch=PCh-Delta; -- -- I=((signed char)Delta)<<3; -- -- V->Dif[0]+=abs(I); -- V->Dif[1]+=abs(I-V->D1); -- V->Dif[2]+=abs(I+V->D1); -- V->Dif[3]+=abs(I-V->D2); -- V->Dif[4]+=abs(I+V->D2); -- V->Dif[5]+=abs(I-V->D3); -- V->Dif[6]+=abs(I+V->D3); -- V->Dif[7]+=abs(I-V->D4); -- V->Dif[8]+=abs(I+V->D4); -- V->Dif[9]+=abs(I-ChannelDelta); -- V->Dif[10]+=abs(I+ChannelDelta); -- -- ChannelDelta=V->LastDelta=(signed char)(Ch-V->LastChar); -- V->LastChar=Ch; -- -- if ((V->ByteCount & 0x1F)==0) -- { -- MinDif=V->Dif[0]; -- NumMinDif=0; -- V->Dif[0]=0; -- for (I=1;(unsigned int)I<sizeof(V->Dif)/sizeof(V->Dif[0]);I++) -- { -- if (V->Dif[I]<MinDif) -- { -- MinDif=V->Dif[I]; -- NumMinDif=I; -- } -- V->Dif[I]=0; -- } -- switch(NumMinDif) -- { -- case 1: -- if (V->K1>=-16) -- V->K1--; -- break; -- case 2: -- if (V->K1<16) -- V->K1++; -- break; -- case 3: -- if (V->K2>=-16) -- V->K2--; -- break; -- case 4: -- if (V->K2<16) -- V->K2++; -- break; -- case 5: -- if (V->K3>=-16) -- V->K3--; -- break; -- case 6: -- if (V->K3<16) -- V->K3++; -- break; -- case 7: -- if (V->K4>=-16) -- V->K4--; -- break; -- case 8: -- if (V->K4<16) -- V->K4++; -- break; -- case 9: -- if (V->K5>=-16) -- V->K5--; -- break; -- case 10: -- if (V->K5<16) -- V->K5++; -- break; -- } -- } -- return((UBYTE)Ch); --} -- -- -- -- -- -- -- --/* *************************************************** -- * ** CRCCrypt Code - decryption engine starts here ** -- * ***************************************************/ -- -- --#define NROUNDS 32 -- --#define rol(x,n) (((x)<<(n)) | ((x)>>(8*sizeof(x)-(n)))) --#define ror(x,n) (((x)>>(n)) | ((x)<<(8*sizeof(x)-(n)))) -- --#define substLong(t) ( (UDWORD)SubstTable[(int)t&255] | \ -- ((UDWORD)SubstTable[(int)(t>> 8)&255]<< 8) | \ -- ((UDWORD)SubstTable[(int)(t>>16)&255]<<16) | \ -- ((UDWORD)SubstTable[(int)(t>>24)&255]<<24) ) -- -- --static UDWORD CRCTab[256]; -- --static UBYTE SubstTable[256]; --static const UBYTE InitSubstTable[256]={ -- 215, 19,149, 35, 73,197,192,205,249, 28, 16,119, 48,221, 2, 42, -- 232, 1,177,233, 14, 88,219, 25,223,195,244, 90, 87,239,153,137, -- 255,199,147, 70, 92, 66,246, 13,216, 40, 62, 29,217,230, 86, 6, -- 71, 24,171,196,101,113,218,123, 93, 91,163,178,202, 67, 44,235, -- 107,250, 75,234, 49,167,125,211, 83,114,157,144, 32,193,143, 36, -- 158,124,247,187, 89,214,141, 47,121,228, 61,130,213,194,174,251, -- 97,110, 54,229,115, 57,152, 94,105,243,212, 55,209,245, 63, 11, -- 164,200, 31,156, 81,176,227, 21, 76, 99,139,188,127, 17,248, 51, -- 207,120,189,210, 8,226, 41, 72,183,203,135,165,166, 60, 98, 7, -- 122, 38,155,170, 69,172,252,238, 39,134, 59,128,236, 27,240, 80, -- 131, 3, 85,206,145, 79,154,142,159,220,201,133, 74, 64, 20,129, -- 224,185,138,103,173,182, 43, 34,254, 82,198,151,231,180, 58, 10, -- 118, 26,102, 12, 50,132, 22,191,136,111,162,179, 45, 4,148,108, -- 161, 56, 78,126,242,222, 15,175,146, 23, 33,241,181,190, 77,225, -- 0, 46,169,186, 68, 95,237, 65, 53,208,253,168, 9, 18,100, 52, -- 116,184,160, 96,109, 37, 30,106,140,104,150, 5,204,117,112, 84 --}; -- --static UDWORD Key[4]; -- -- --static void EncryptBlock(UBYTE *Buf) --{ -- int I; -- -- UDWORD A,B,C,D,T,TA,TB; --#ifdef NON_INTEL_BYTE_ORDER -- A=((UDWORD)Buf[0]|((UDWORD)Buf[1]<<8)|((UDWORD)Buf[2]<<16)| -- ((UDWORD)Buf[3]<<24))^Key[0]; -- B=((UDWORD)Buf[4]|((UDWORD)Buf[5]<<8)|((UDWORD)Buf[6]<<16)| -- ((UDWORD)Buf[7]<<24))^Key[1]; -- C=((UDWORD)Buf[8]|((UDWORD)Buf[9]<<8)|((UDWORD)Buf[10]<<16)| -- ((UDWORD)Buf[11]<<24))^Key[2]; -- D=((UDWORD)Buf[12]|((UDWORD)Buf[13]<<8)|((UDWORD)Buf[14]<<16)| -- ((UDWORD)Buf[15]<<24))^Key[3]; --#else -- UDWORD *BufPtr; -- BufPtr=(UDWORD *)Buf; -- A=BufPtr[0]^Key[0]; -- B=BufPtr[1]^Key[1]; -- C=BufPtr[2]^Key[2]; -- D=BufPtr[3]^Key[3]; --#endif -- for(I=0;I<NROUNDS;I++) -- { -- T=((C+rol(D,11))^Key[I&3]); -- TA=A^substLong(T); -- T=((D^rol(C,17))+Key[I&3]); -- TB=B^substLong(T); -- A=C; -- B=D; -- C=TA; -- D=TB; -- } --#ifdef NON_INTEL_BYTE_ORDER -- C^=Key[0]; -- Buf[0]=(UBYTE)C; -- Buf[1]=(UBYTE)(C>>8); -- Buf[2]=(UBYTE)(C>>16); -- Buf[3]=(UBYTE)(C>>24); -- D^=Key[1]; -- Buf[4]=(UBYTE)D; -- Buf[5]=(UBYTE)(D>>8); -- Buf[6]=(UBYTE)(D>>16); -- Buf[7]=(UBYTE)(D>>24); -- A^=Key[2]; -- Buf[8]=(UBYTE)A; -- Buf[9]=(UBYTE)(A>>8); -- Buf[10]=(UBYTE)(A>>16); -- Buf[11]=(UBYTE)(A>>24); -- B^=Key[3]; -- Buf[12]=(UBYTE)B; -- Buf[13]=(UBYTE)(B>>8); -- Buf[14]=(UBYTE)(B>>16); -- Buf[15]=(UBYTE)(B>>24); --#else -- BufPtr[0]=C^Key[0]; -- BufPtr[1]=D^Key[1]; -- BufPtr[2]=A^Key[2]; -- BufPtr[3]=B^Key[3]; --#endif -- UpdKeys(Buf); --} -- -- --void DecryptBlock(UBYTE *Buf) --{ -- int I; -- UBYTE InBuf[16]; -- UDWORD A,B,C,D,T,TA,TB; --#ifdef NON_INTEL_BYTE_ORDER -- A=((UDWORD)Buf[0]|((UDWORD)Buf[1]<<8)|((UDWORD)Buf[2]<<16)| -- ((UDWORD)Buf[3]<<24))^Key[0]; -- B=((UDWORD)Buf[4]|((UDWORD)Buf[5]<<8)|((UDWORD)Buf[6]<<16)| -- ((UDWORD)Buf[7]<<24))^Key[1]; -- C=((UDWORD)Buf[8]|((UDWORD)Buf[9]<<8)|((UDWORD)Buf[10]<<16)| -- ((UDWORD)Buf[11]<<24))^Key[2]; -- D=((UDWORD)Buf[12]|((UDWORD)Buf[13]<<8)|((UDWORD)Buf[14]<<16)| -- ((UDWORD)Buf[15]<<24))^Key[3]; --#else -- UDWORD *BufPtr; -- BufPtr=(UDWORD *)Buf; -- A=BufPtr[0]^Key[0]; /* xxx may be this can be */ -- B=BufPtr[1]^Key[1]; /* optimized in assembler */ -- C=BufPtr[2]^Key[2]; -- D=BufPtr[3]^Key[3]; --#endif -- memcpy(InBuf,Buf,sizeof(InBuf)); -- for(I=NROUNDS-1;I>=0;I--) -- { -- T=((C+rol(D,11))^Key[I&3]); -- TA=A^substLong(T); -- T=((D^rol(C,17))+Key[I&3]); -- TB=B^substLong(T); -- A=C; -- B=D; -- C=TA; -- D=TB; -- } --#ifdef NON_INTEL_BYTE_ORDER -- C^=Key[0]; -- Buf[0]=(UBYTE)C; -- Buf[1]=(UBYTE)(C>>8); -- Buf[2]=(UBYTE)(C>>16); -- Buf[3]=(UBYTE)(C>>24); -- D^=Key[1]; -- Buf[4]=(UBYTE)D; -- Buf[5]=(UBYTE)(D>>8); -- Buf[6]=(UBYTE)(D>>16); -- Buf[7]=(UBYTE)(D>>24); -- A^=Key[2]; -- Buf[8]=(UBYTE)A; -- Buf[9]=(UBYTE)(A>>8); -- Buf[10]=(UBYTE)(A>>16); -- Buf[11]=(UBYTE)(A>>24); -- B^=Key[3]; -- Buf[12]=(UBYTE)B; -- Buf[13]=(UBYTE)(B>>8); -- Buf[14]=(UBYTE)(B>>16); -- Buf[15]=(UBYTE)(B>>24); --#else -- BufPtr[0]=C^Key[0]; -- BufPtr[1]=D^Key[1]; -- BufPtr[2]=A^Key[2]; -- BufPtr[3]=B^Key[3]; --#endif -- UpdKeys(InBuf); --} -- -- --void UpdKeys(UBYTE *Buf) --{ -- int I; -- for (I=0;I<16;I+=4) -- { -- Key[0]^=CRCTab[Buf[I]]; /* xxx may be I'll rewrite this */ -- Key[1]^=CRCTab[Buf[I+1]]; /* in asm for speedup */ -- Key[2]^=CRCTab[Buf[I+2]]; -- Key[3]^=CRCTab[Buf[I+3]]; -- } --} -- --static void SetCryptKeys(char *NewPassword) --{ -- unsigned int I,J,K,PswLength; -- unsigned char N1,N2; -- unsigned char Psw[256]; -- --#if !defined _USE_ASM -- UBYTE Ch; --#endif -- -- SetOldKeys(NewPassword); -- -- Key[0]=0xD3A3B879L; -- Key[1]=0x3F6D12F7L; -- Key[2]=0x7515A235L; -- Key[3]=0xA4E7F123L; -- memset(Psw,0,sizeof(Psw)); -- strcpy((char *)Psw,NewPassword); -- PswLength=strlen(NewPassword); -- memcpy(SubstTable,InitSubstTable,sizeof(SubstTable)); -- -- for (J=0;J<256;J++) -- for (I=0;I<PswLength;I+=2) -- { -- N2=(unsigned char)CRCTab[(Psw[I+1]+J)&0xFF]; -- for (K=1, N1=(unsigned char)CRCTab[(Psw[I]-J)&0xFF]; -- (N1!=N2); -- N1++, K++) -- { --#ifdef _USE_ASM -- --#ifdef _WIN_32 -- __asm { -- -- mov ebx, Offset SubstTable -- mov edx, ebx -- -- xor ecx, ecx /* read SubstTable[N1]... */ -- mov cl, N1 -- add ebx, ecx -- mov al, byte ptr[ebx] -- -- mov cl, N1 /* read SubstTable[(N1+I+K)&0xFF]... */ -- add ecx, I -- add ecx, K -- and ecx, 0xFF -- add edx, ecx -- mov ah, byte ptr[edx] -- -- mov byte ptr[ebx], ah /* and write back */ -- mov byte ptr[edx], al -- -- } --#else -- __asm__ __volatile__ ( --" xorl %%ecx, %%ecx" --" movl %2, %%ecx /* ecx = N1 */" --" mov %%ebx, %%edx" --" addl %%ecx, %%ebx" --"" --" addl %0, %%ecx" --" addl %1, %%ecx" --" andl $0x000000FF, %%ecx" --" addl %%ecx, %%edx" --" " --" movb (%%ebx), %%al" --" movb (%%edx), %%ah" --"" --" movb %%ah, (%%ebx) /* and write back */" --" movb %%al, (%%edx)" -- : : "g" ((long)I), -- "g" ((long)K), -- "g" ((long)N1), -- "ebx"((long)SubstTable) -- : "ecx", "edx" -- -- ); --#endif -- --#else -- /* Swap(&SubstTable[N1],&SubstTable[(N1+I+K)&0xFF]); */ -- Ch=SubstTable[N1]; -- SubstTable[N1]=SubstTable[(N1+I+K)&0xFF]; -- SubstTable[(N1+I+K)&0xFF]=Ch; --#endif -- } -- } -- for (I=0;I<PswLength;I+=16) -- EncryptBlock(&Psw[I]); --} -- -- --void SetOldKeys(char *NewPassword) --{ -- UDWORD PswCRC; -- UBYTE Ch; -- PswCRC=CalcCRC32(0xFFFFFFFFL,(UBYTE*)NewPassword,strlen(NewPassword)); -- OldKey[0]=(UWORD)PswCRC; -- OldKey[1]=(UWORD)(PswCRC>>16); -- OldKey[2]=OldKey[3]=0; -- PN1=PN2=PN3=0; -- while ((Ch=*NewPassword)!=0) -- { -- PN1+=Ch; -- PN2^=Ch; -- PN3+=Ch; -- PN3=(UBYTE)rol(PN3,1); -- OldKey[2]^=((UWORD)(Ch^CRCTab[Ch])); -- OldKey[3]+=((UWORD)(Ch+(CRCTab[Ch]>>16))); -- NewPassword++; -- } --} -- --static short crcInitialized = 0; --void InitCRC(void) --{ -- int I, J; -- UDWORD C; -- if (crcInitialized) return; -- -- cli_dbgmsg("%s:%d:%s Initialize CRC table\n", __FILE__, __LINE__, "InitCRC"); -- for (I=0;I<256;I++) -- { -- for (C=I,J=0;J<8;J++) -- C=(C & 1) ? (C>>1)^0xEDB88320L : (C>>1); -- CRCTab[I]=C; -- } -- crcInitialized = 1; --} -- -- --static UDWORD CalcCRC32(UDWORD StartCRC,UBYTE *Addr,UDWORD Size) --{ -- unsigned int I; -- for (I=0; I<Size; I++) -- StartCRC = CRCTab[(UBYTE)StartCRC ^ Addr[I]] ^ (StartCRC >> 8); -- return(StartCRC); --} -- -- --/* ************************************************************************** -- **************************************************************************** -- **************************************************************************** -- ************************************************************************** */ -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --/* ************************************************************************** -- **************************************************************************** -- **************************************************************************** -- **************************************************************************** -- ******* ******* -- ******* ******* -- ******* ******* -- ******* D E B U G F U N C T I O N S ******* -- ******* ******* -- ******* ******* -- ******* ******* -- **************************************************************************** -- **************************************************************************** -- **************************************************************************** -- ************************************************************************** */ --#ifdef _DEBUG_LOG -- -- --/* -- global stuff -------------------------------------------------------- */ --char log_file_name[256]; /* file name for the log file */ --DWORD debug_start_time; /* starttime of debug */ --BOOL debug_started = FALSE; /* debug_log writes only if */ -- /* this is TRUE */ --/* ------------------------------------------------------------------------ */ -- -- --/* -- global functions ---------------------------------------------------- */ --void debug_init_proc(char *file_name) --/* Create/Rewrite a log file */ --{ -- FILE *fp; -- char date[] = __DATE__; -- char time[] = __TIME__; -- -- debug_start_time = GetTickCount(); /* get start time */ -- strcpy(log_file_name, file_name); /* save file name */ -- -- if((fp = fopen(log_file_name, CREATETEXT)) != NULL) -- { -- debug_started = TRUE; /* enable debug */ -- fprintf(fp, "Debug log of UniquE's RARFileLib\n"\ -- "~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~\n"); -- fprintf(fp, "(executable compiled on %s at %s)\n\n", date, time); -- fclose(fp); -- } --} -- -- --void debug_log_proc(char *text, char *sourcefile, int sourceline) --/* add a line to the log file */ --{ -- FILE *fp; -- -- if(debug_started == FALSE) return; /* exit if not initialized */ -- -- if((fp = fopen(log_file_name, APPENDTEXT)) != NULL) /* append to logfile */ -- -- { -- fprintf(fp, " %8u ms (line %u in %s):\n - %s\n", -- (unsigned int)(GetTickCount() - debug_start_time), -- sourceline, sourcefile, text); -- fclose(fp); -- } --} -- --/* ------------------------------------------------------------------------ */ --#endif --/* ************************************************************************** -- **************************************************************************** -- **************************************************************************** -- ************************************************************************** */ -- -- --/* end of file urarlib.c */ ---- ./libclamav/unrarlib.h.orig Thu Jun 23 17:03:12 2005 -+++ ./libclamav/unrarlib.h Wed Oct 12 14:40:13 2005 -@@ -1,205 +1,22 @@ --/* *************************************************************************** -- ** -- ** This file is part of the UniquE RAR File Library. -- ** -- ** Copyright (C) 2000-2002 by Christian Scheurer (www.ChristianScheurer.ch) -- ** UNIX port copyright (c) 2000-2002 by Johannes Winkelmann (jw@tks6.net) -- ** -- ** The contents of this file are subject to the UniquE RAR File Library -- ** License (the "unrarlib-license.txt"). You may not use this file except -- ** in compliance with the License. You may obtain a copy of the License -- ** at http://www.unrarlib.org/license.html. -- ** Software distributed under the License is distributed on an "AS IS" -- ** basis, WITHOUT WARRANTY OF ANY KIND, either express or implied warranty. -- ** -- ** Alternatively, the contents of this file may be used under the terms -- ** of the GNU General Public License Version 2 or later (the "GPL"), in -- ** which case the provisions of the GPL are applicable instead of those -- ** above. If you wish to allow use of your version of this file only -- ** under the terms of the GPL and not to allow others to use your version -- ** of this file under the terms of the UniquE RAR File Library License, -- ** indicate your decision by deleting the provisions above and replace -- ** them with the notice and other provisions required by the GPL. If you -- ** do not delete the provisions above, a recipient may use your version -- ** of this file under the terms of the GPL or the UniquE RAR File Library -- ** License. -- ** -- ************************************************************************** */ -- --/* include file for the "UniquE RAR File Library" */ --/* (C) 2000-2002 by Christian Scheurer aka. UniquE */ --/* multi-OS version (Win32, Linux and SUN) */ -- --#ifndef __URARLIB_H --#define __URARLIB_H -- --#ifdef __cplusplus --extern "C" --{ --#endif -- -- --/* ************************************************************************ */ --/* ************************************************************************ */ --/* ** ** */ --/* ** CONFIGURATION of the UniquE RAR FileLib ** */ --/* ** ==> you may change the setting for the lib HERE! ** */ --/* ** ** */ --/* ************************************************************************ */ --/* ************************************************************************ */ -- -- --/* #define _DEBUG_LOG */ /* generate debug messages */ -- --#define _DO_CRC32_CHECK /* perform cyclical redundancy */ -- /* check (CRC32) - disable this */ -- /* for a little speed-up */ --/*#define _USE_ASM*/ /* -- * enable assembly extensions -- * x86 cpus. -- */ -- --/*#define _USE_MEMORY_TO_MEMORY_DECOMPRESSION*/ /* read file from memory or a */ -- /* resource instead of reading */ -- /* from a file. NOTE: you wont't*/ -- /* be able to decompress from */ -- /* file if you enable this */ -- /* option! */ -- -- --#ifdef WIN32 /* autodetect Win32 and Linux */ --#define _WIN_32 /* Win32 with VisualC */ --#define _DEBUG_LOG_FILE "C:\\temp\\debug_unrar.txt" /* log file path */ --#else --#define _UNIX /* Linux or Unix with GCC */ --#define _DEBUG_LOG_FILE "/tmp/debug_unrar.txt" /* log file path */ --/*#define NON_INTEL_BYTE_ORDER*/ /* GCC on motorola systems */ -- --#endif -- --/* ------------------------------------------------------------------------ */ -- --/* detected by clamav/configure */ --#if 1 - WORDS_BIGENDIAN --#define NON_INTEL_BYTE_ORDER --#endif -- --/* -- global type definitions --------------------------------------------- */ -- --#ifdef NON_INTEL_BYTE_ORDER --#ifdef _USE_ASM --#warning Disabling assembly because NON_INTEL_BYTE_ORDER is set --#undef _USE_ASM --#endif --#endif -- --#ifdef _WIN_32 --typedef unsigned char UBYTE; /* WIN32 definitions */ --typedef unsigned short UWORD; --typedef unsigned long UDWORD; --#endif -- --#ifdef _UNIX /* LINUX/UNIX definitions */ --typedef unsigned char UBYTE; --typedef unsigned short UWORD; --typedef unsigned long UDWORD; --#endif -- --#define RAR_FENTRY_ATTR_DIRECTORY ( 0x10 | 0x4000 ) -- --/* This structure is used for listing archive content */ --struct RAR20_archive_entry /* These infos about files are */ --{ /* stored in RAR v2.0 archives */ -- char *Name; -- UWORD NameSize; -- UDWORD PackSize; -- UDWORD UnpSize; -- UBYTE HostOS; /* MSDOS=0,OS2=1,WIN32=2,UNIX=3 */ -- UDWORD FileCRC; -- UDWORD FileTime; -- UBYTE UnpVer; -- UBYTE Method; -- UDWORD FileAttr; -- UWORD Flags; --}; -- --typedef struct archivelist /* used to list archives */ --{ -- struct RAR20_archive_entry item; -- struct archivelist *next; --} ArchiveList_struct; -- -- --#ifdef _USE_MEMORY_TO_MEMORY_DECOMPRESSION --typedef struct memory_file /* used to decompress files in */ --{ /* memory */ -- void *data; /* pointer to the file data */ -- unsigned long size; /* total size of the file data */ -- unsigned long offset; /* offset within "memory-file" */ --} MemoryFile; --#endif -- --/* -- global functions ---------------------------------------------------- */ -- --/* urarlib_get: -- * decompresses and decrypt data from a RAR file to a buffer in system memory. -+/* -+ * Copyright (C) 2004 McMCC <mcmcc@mail.ru> - * -- * input: *output pointer to an empty char*. This pointer will show -- * to the extracted data -- * *size shows where to write the size of the decompressed -- * file -- * (**NOTE: URARLib _does_ memory allocation etc.!**) -- * *filename pointer to string containing the file to decompress -- * *rarfile pointer to a string with the full name and path of -- * the RAR file or pointer to a RAR file in memory if -- * memory-to-memory decompression is active. -- * *libpassword pointer to a string with the password used to -- * en-/decrypt the RAR -- * output: int returns TRUE on success or FALSE on error -- * (FALSE=0, TRUE=1) -- */ -- --extern int urarlib_get(void *output, -- unsigned long *size, -- char *filename, -- int desc, -- char *libpassword); -- -- -- --/* urarlib_list: -- * list the content of a RAR archive. -+ * Support check archives RAR v.3.x - * -- * input: *rarfile pointer to a string with the full name and path of -- * the RAR file or pointer to a RAR file in memory if -- * memory-to-memory decompression is active. -- * *list pointer to an ArchiveList_struct that can be -- * filled with details about the archive -- * to the extracted data -- * output: int number of files/directories within archive -- */ -- --extern int urarlib_list(int desc, ArchiveList_struct *list); -- -- --/* urarlib_freelist: -- * (after the suggestion and code of Duy Nguyen, Sean O'Blarney -- * and Johannes Winkelmann who independently wrote a patch) -- * free the memory of a ArchiveList_struct created by urarlib_list. -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * -- * input: *list pointer to an ArchiveList_struct -- * output: - - */ - --extern void urarlib_freelist(ArchiveList_struct *list); -- --/* ------------------------------------------------------------------------ */ -- -- -- --#ifdef __cplusplus --}; --#endif -- --#endif -- -+int cli_unrar3(const char *dir, int desc); diff --git a/security/clamav/files/patch-configure b/security/clamav/files/patch-configure index 2ac2e4dfeb61..96f1b1ce1785 100644 --- a/security/clamav/files/patch-configure +++ b/security/clamav/files/patch-configure @@ -1,25 +1,5 @@ --- configure.orig Thu Jun 23 23:12:00 2005 +++ configure Tue Jun 28 20:53:10 2005 -@@ -10914,6 +10914,9 @@ - cat >>conftest.$ac_ext <<_ACEOF - /* end confdefs.h. */ - $ac_includes_default -+#include <sys/types.h> -+#include <netinet/in.h> -+#include <arpa/nameser.h> - #include <resolv.h> - _ACEOF - rm -f conftest.$ac_objext -@@ -10957,6 +10960,9 @@ - cat confdefs.h >>conftest.$ac_ext - cat >>conftest.$ac_ext <<_ACEOF - /* end confdefs.h. */ -+#include <sys/types.h> -+#include <netinet/in.h> -+#include <arpa/nameser.h> - #include <resolv.h> - _ACEOF - if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 @@ -11195,19 +11201,25 @@ sendmailver_c=`echo $sendmailver | awk -F. '{printf $3}'` diff --git a/security/clamav/files/patch-libclamav::zziplib::zzip-conf.h b/security/clamav/files/patch-libclamav::zziplib::zzip-conf.h deleted file mode 100644 index fe62753a8889..000000000000 --- a/security/clamav/files/patch-libclamav::zziplib::zzip-conf.h +++ /dev/null @@ -1,11 +0,0 @@ ---- libclamav/zziplib/zzip-conf.h.orig Mon Nov 24 17:52:56 2003 -+++ libclamav/zziplib/zzip-conf.h Mon Nov 24 17:53:05 2003 -@@ -11,6 +11,8 @@ - #ifndef _ZZIP_CONF_H - #define _ZZIP_CONF_H 1 - -+#include <sys/types.h> -+ - #if !defined ZZIP_OMIT_CONFIG_H - # if defined _MSC_VER || defined __BORLANDC__ || defined __WATCOMC__ - # include <zzip-msvc.h> diff --git a/security/clamav/files/patch-libclamav_clamav.h b/security/clamav/files/patch-libclamav_clamav.h deleted file mode 100644 index a67b0cfbf6bd..000000000000 --- a/security/clamav/files/patch-libclamav_clamav.h +++ /dev/null @@ -1,11 +0,0 @@ ---- libclamav/clamav.h.orig Fri May 13 09:11:42 2005 -+++ libclamav/clamav.h Fri May 13 09:11:46 2005 -@@ -221,7 +221,7 @@ - extern const char *cl_perror(int clerror); /* deprecated */ - - #ifdef __cplusplus --}; -+} - #endif - - #endif diff --git a/security/clamav/files/pkg-deinstall.in b/security/clamav/files/pkg-deinstall.in index 0075621d1650..32b25c24a4d1 100644 --- a/security/clamav/files/pkg-deinstall.in +++ b/security/clamav/files/pkg-deinstall.in @@ -1,5 +1,5 @@ #!/bin/sh -# $FreeBSD: /tmp/pcvs/ports/security/clamav/files/pkg-deinstall.in,v 1.1 2005-05-13 08:16:40 jylefort Exp $ +# $FreeBSD: /tmp/pcvs/ports/security/clamav/files/pkg-deinstall.in,v 1.2 2007-02-16 00:19:32 garga Exp $ if [ "$2" != "POST-DEINSTALL" ]; then exit 0 @@ -7,7 +7,20 @@ fi CLAMAVUSER=%%CLAMAVUSER%% +echo +echo "====================================================" +echo +echo "If you want remove clamav permanently from you system" +echo "execute following commands:" +echo +echo " # rm -rf %%LOGDIR%%" +echo " # rm -rf %%RUNDIR%%" +echo " # rm -rf %%DBDIR%%" if pw usershow "${CLAMAVUSER}" 2>/dev/null 1>&2; then - echo "To delete ${CLAMAVUSER} user permanently, use 'pw userdel \"${CLAMAVUSER}\"'" + echo " # pw userdel ${CLAMAVUSER}" fi +echo +echo "====================================================" +echo + exit 0 diff --git a/security/clamav/files/pkg-install.in b/security/clamav/files/pkg-install.in index 729a0036f07c..bd223b539fa6 100644 --- a/security/clamav/files/pkg-install.in +++ b/security/clamav/files/pkg-install.in @@ -1,5 +1,5 @@ #!/bin/sh -# $FreeBSD: /tmp/pcvs/ports/security/clamav/files/pkg-install.in,v 1.2 2006-08-08 19:33:04 garga Exp $ +# $FreeBSD: /tmp/pcvs/ports/security/clamav/files/pkg-install.in,v 1.3 2007-02-16 00:19:32 garga Exp $ PREFIX=${PKG_PREFIX:-%%PREFIX%%} @@ -48,32 +48,14 @@ if [ "$2" = "PRE-INSTALL" ]; then elif [ "$2" = "POST-INSTALL" ]; then - if [ ! -d "${DESTDIR}${DBDIR}" ]; then - ${MKDIR} ${DBDIR} || exit 1 - ${CHOWN} ${CLAMAVUSER}:${CLAMAVGROUP} ${DBDIR} || exit 1 - fi + [ ! -d "${DESTDIR}${DBDIR}" ] && (${MKDIR} ${DBDIR} || exit 1) + ${CHOWN} -R ${CLAMAVUSER}:${CLAMAVGROUP} ${DBDIR} || exit 1 - if [ ! -d "${DESTDIR}${LOGDIR}" ]; then - ${MKDIR} ${LOGDIR} || exit 1 - ${CHOWN} ${CLAMAVUSER}:${CLAMAVGROUP} ${LOGDIR} || exit 1 - fi + [ ! -d "${DESTDIR}${LOGDIR}" ] && (${MKDIR} ${LOGDIR} || exit 1) + ${CHOWN} -R ${CLAMAVUSER}:${CLAMAVGROUP} ${LOGDIR} || exit 1 - if [ ! -d "${DESTDIR}${RUNDIR}" ]; then - ${MKDIR} ${RUNDIR} || exit 1 - ${CHOWN} ${CLAMAVUSER}:${CLAMAVGROUP} ${RUNDIR} || exit 1 - fi - - if [ -f "${TARGETDIR}/etc/clamav.conf" ]; then - echo - echo "**************** WARNING ****************" - echo "* *" - echo "* The configuration file has changed: *" - echo "* Please edit $PREFIX/etc/clamd.conf *" - echo "* and remove $PREFIX/etc/clamav.conf *" - echo "* *" - echo "**************** WARNING ****************" - echo - fi + [ ! -d "${DESTDIR}${RUNDIR}" ] && (${MKDIR} ${RUNDIR} || exit 1) + ${CHOWN} -R ${CLAMAVUSER}:${CLAMAVGROUP} ${RUNDIR} || exit 1 fi diff --git a/security/clamav/pkg-plist b/security/clamav/pkg-plist index 6deae405f325..a071176ce2de 100644 --- a/security/clamav/pkg-plist +++ b/security/clamav/pkg-plist @@ -1,5 +1,6 @@ @comment $FreeBSD$ bin/clamav-config +bin/clamconf bin/clamscan bin/clamdscan bin/freshclam |