diff -ur clamav-orig/clamdtop/clamdtop.c clamav-new/clamdtop/clamdtop.c
--- clamav-orig/clamdtop/clamdtop.c	2009-03-16 11:37:28.000000000 +1100
+++ clamav-new/clamdtop/clamdtop.c	2009-03-16 16:30:26.000000000 +1100
@@ -47,8 +47,10 @@
 #include <arpa/inet.h>
 #include <netinet/in.h>
 #include <sys/socket.h>
+#ifndef __DJGPP__
 #include <sys/un.h>
 #endif
+#endif
 #include <sys/time.h>
 #include <assert.h>
 #include <errno.h>
@@ -503,7 +505,7 @@
 	int s;
 	struct timeval tv;
 	conn->tcp = 0;
-#ifdef _WIN32
+#if defined(_WIN32) || defined(__DJGPP__)
     {
 #else
 	if(soname[0] == '/' || (access(soname, F_OK) == 0)) {
diff -ur clamav-orig/clamscan/clamscan.c clamav-new/clamscan/clamscan.c
--- clamav-orig/clamscan/clamscan.c	2009-03-16 11:37:26.000000000 +1100
+++ clamav-new/clamscan/clamscan.c	2009-03-16 16:30:26.000000000 +1100
@@ -80,7 +80,7 @@
     }
 #endif
 
-#if !defined(C_WINDOWS) && !defined(C_BEOS)
+#if !defined(C_WINDOWS) && !defined(C_BEOS) && !defined(__DJGPP__)
     sigemptyset(&sigset);
     sigaddset(&sigset, SIGXFSZ);
     sigprocmask(SIG_SETMASK, &sigset, NULL);
diff -ur clamav-orig/clamscan/manager.c clamav-new/clamscan/manager.c
--- clamav-orig/clamscan/manager.c	2009-03-16 11:37:26.000000000 +1100
+++ clamav-new/clamscan/manager.c	2009-03-16 17:15:46.000000000 +1100
@@ -73,6 +73,11 @@
 #define P_tmpdir    "C:\\WINDOWS\\TEMP"
 #endif
 
+#ifdef __DJGPP__
+#undef P_tmpdir
+#define P_tmpdir    "/dev/env/TEMP"
+#endif
+
 #ifndef	O_BINARY
 #define	O_BINARY    0
 #endif
@@ -129,7 +134,7 @@
 	return 0;
     }
     info.rblocks += fsize / CL_COUNT_PRECISION;
-#ifndef C_WINDOWS
+#if !defined(C_WINDOWS) && !defined(__DJGPP__)
     if(geteuid())
 	if(checkaccess(filename, NULL, R_OK) != 1) {
 	    if(!printinfected)
@@ -214,7 +219,7 @@
 
     if((dd = opendir(dirname)) != NULL) {
 	while((dent = readdir(dd))) {
-#if !defined(C_INTERIX) && !defined(C_WINDOWS)
+#if !defined(C_INTERIX) && !defined(C_WINDOWS) && !defined(__DJGPP__)
 	    if(dent->d_ino)
 #endif
 	    {
@@ -334,7 +339,7 @@
 	struct stat sb;
 	char *file, cwd[1024], *pua_cats = NULL;
 	const struct optstruct *opt;
-#ifndef C_WINDOWS
+#if !defined(C_WINDOWS) && !defined(__DJGPP__)
 	struct rlimit rlim;
 #endif
 
@@ -468,7 +473,7 @@
 	}
     }
 
-#ifndef C_WINDOWS
+#if !defined(C_WINDOWS) && !defined(__DJGPP__)
     if(getrlimit(RLIMIT_FSIZE, &rlim) == 0) {
 	if(rlim.rlim_max < (rlim_t) cl_engine_get_num(engine, CL_ENGINE_MAX_FILESIZE, NULL))
 	    logg("^System limit for file size is lower than engine->maxfilesize\n");
diff -ur clamav-orig/freshclam/freshclam.c clamav-new/freshclam/freshclam.c
--- clamav-orig/freshclam/freshclam.c	2009-03-16 11:37:26.000000000 +1100
+++ clamav-new/freshclam/freshclam.c	2009-03-16 16:30:26.000000000 +1100
@@ -438,7 +438,7 @@
 
 	logg("#freshclam daemon %s (OS: "TARGET_OS_TYPE", ARCH: "TARGET_ARCH_TYPE", CPU: "TARGET_CPU_TYPE")\n", get_version());
 
-#ifdef	C_WINDOWS
+#if	defined(C_WINDOWS) || defined(__DJGPP__)
 	signal(SIGINT, daemon_sighandler);
 	terminate = 0;
 #else
diff -ur clamav-orig/freshclam/manager.c clamav-new/freshclam/manager.c
--- clamav-orig/freshclam/manager.c	2009-03-16 11:37:26.000000000 +1100
+++ clamav-new/freshclam/manager.c	2009-03-16 16:30:26.000000000 +1100
@@ -1412,7 +1412,7 @@
     }
 
     while((dent = readdir(dir))) {
-#if !defined(C_INTERIX) && !defined(C_WINDOWS)
+#if !defined(C_INTERIX) && !defined(C_WINDOWS) && !defined(__DJGPP__)
 	if(dent->d_ino)
 #endif
 	{
diff -ur clamav-orig/libclamav/binhex.c clamav-new/libclamav/binhex.c
--- clamav-orig/libclamav/binhex.c	2009-03-16 11:37:28.000000000 +1100
+++ clamav-new/libclamav/binhex.c	2009-03-16 16:31:12.000000000 +1100
@@ -119,10 +119,6 @@
 int
 cli_binhex(const char *dir, int desc)
 {
-#ifndef HAVE_MMAP
-	cli_warnmsg("File not decoded - binhex decoding needs mmap() (for now)\n");
-	return CL_CLEAN;
-#else
 	struct stat statb;
 	char *buf, *start, *line;
 	size_t size;
@@ -142,7 +138,11 @@
 	if(m == NULL)
 		return CL_EMEM;
 
+#ifndef HAVE_MMAP
+	start = buf = cli_copy_file_to_mem(desc, size, 0);
+#else
 	start = buf = mmap(NULL, size, PROT_READ, MAP_PRIVATE, desc, 0);
+#endif
 	if(buf == MAP_FAILED) {
 		messageDestroy(m);
 		return CL_EMAP;
@@ -187,7 +187,11 @@
 		buf = ++ptr;
 		bytesleft--;
 	}
+#ifndef HAVE_MMAP
+	free(start);
+#else
 	munmap(start, size);
+#endif
 
 	if(line)
 		free(line);
@@ -213,5 +217,4 @@
 		return CL_CLEAN;	/* a lie - but it gets things going */
 	/* return CL_EIO; */	/* probably CL_EMEM, but we can't tell at this layer */
 	return CL_EMEM;
-#endif
 }
diff -ur clamav-orig/libclamav/mbox.c clamav-new/libclamav/mbox.c
--- clamav-orig/libclamav/mbox.c	2009-03-16 11:37:28.000000000 +1100
+++ clamav-new/libclamav/mbox.c	2009-03-16 16:30:26.000000000 +1100
@@ -3857,7 +3857,7 @@
 					int nblanks;
 					struct stat statb;
 					const char *dentry_idpart;
-#ifndef C_WINDOWS
+#if (!defined(C_WINDOWS)) && (!defined(__DJGPP__))
 					if(dent->d_ino == 0)
 						continue;
 #endif
diff -ur clamav-orig/libclamav/others.c clamav-new/libclamav/others.c
--- clamav-orig/libclamav/others.c	2009-03-16 11:37:28.000000000 +1100
+++ clamav-new/libclamav/others.c	2009-03-16 16:37:12.000000000 +1100
@@ -81,6 +81,47 @@
 #define       P_tmpdir        "C:\\WINDOWS\\TEMP"
 #endif
 
+#ifdef 	      __DJGPP__
+#undef	      P_tmpdir
+#define       P_tmpdir	      "/dev/env/TEMP"
+
+/* DJGPP is missing pread/pwrite */
+ssize_t pread(int fd, void *data, size_t length, off_t offset )
+{
+        ssize_t result;
+        off_t save_offset;
+        int save_errno;
+
+        save_offset  = lseek(fd,offset,SEEK_SET);
+        if(save_offset==-1) return -1;
+
+        result = read(fd,data,length);
+
+        save_errno = errno;
+        lseek(fd, save_offset, SEEK_SET);
+        errno = save_errno;
+
+        return result;
+}
+
+#endif
+
+#ifndef HAVE_MMAP
+/* A partial mmap replacement for binhex and pdf scanning */
+void *cli_copy_file_to_mem( int fildes, size_t size, off_t offset )
+{
+	char *buf = malloc( size );
+
+	if( buf == NULL ) return( NULL );
+	if( pread( fildes, buf, size, offset ) == -1 ) {
+        	free( buf );
+        	return( NULL );
+	};
+
+	return( buf );
+}
+#endif
+
 int (*cli_unrar_open)(int fd, const char *dirname, unrar_state_t *state);
 int (*cli_unrar_extract_next_prepare)(unrar_state_t *state, const char *dirname);
 int (*cli_unrar_extract_next)(unrar_state_t *state, const char *dirname);
@@ -99,11 +140,19 @@
     }
     rhandle = lt_dlopenext("libclamunrar_iface");
     if (!rhandle) {
+#ifdef __DJGPP__
+    cli_unrar_open = unrar_open;
+    cli_unrar_extract_next_prepare = unrar_extract_next_prepare;
+    cli_unrar_extract_next = unrar_extract_next;
+    cli_unrar_close = unrar_close;
+    have_rar = 1;
+#else
 #ifdef WARN_DLOPEN_FAIL
         cli_warnmsg("Cannot dlopen: %s - unrar support unavailable\n", lt_dlerror());
 #else
         cli_dbgmsg("Cannot dlopen: %s - unrar support unavailable\n", lt_dlerror());
 #endif
+#endif
         return;
     }
     if (!(cli_unrar_open = (int(*)(int, const char *, unrar_state_t *))lt_dlsym(rhandle, "unrar_open")) ||
@@ -597,7 +646,7 @@
 	return 0;
 }
 
-#ifdef	C_WINDOWS
+#if defined(C_WINDOWS) || defined(__DJGPP__)
 /*
  * Windows doesn't allow you to delete a directory while it is still open
  */
@@ -702,7 +751,7 @@
 #else
 	    while((dent = readdir(dd))) {
 #endif
-#if	(!defined(C_INTERIX)) && (!defined(C_WINDOWS))
+#if	(!defined(C_INTERIX)) && (!defined(C_WINDOWS)) && (!defined(__DJGPP__))
 		if(dent->d_ino)
 #endif
 		{
diff -ur clamav-orig/libclamav/others.h clamav-new/libclamav/others.h
--- clamav-orig/libclamav/others.h	2009-03-16 11:03:10.000000000 +1100
+++ clamav-new/libclamav/others.h	2009-03-16 16:31:12.000000000 +1100
@@ -358,6 +358,11 @@
 void cli_dbgmsg_internal(const char *str, ...);
 #endif
 
+#ifndef HAVE_MMAP
+void *cli_copy_file_to_mem(int fildes, size_t size, off_t offset);
+#define MAP_FAILED NULL
+#endif
+
 void *cli_malloc(size_t nmemb);
 void *cli_calloc(size_t nmemb, size_t size);
 void *cli_realloc(void *ptr, size_t size);
diff -ur clamav-orig/libclamav/others_common.c clamav-new/libclamav/others_common.c
--- clamav-orig/libclamav/others_common.c	2009-03-16 11:37:28.000000000 +1100
+++ clamav-new/libclamav/others_common.c	2009-03-16 16:44:08.000000000 +1100
@@ -100,6 +100,221 @@
     fputs(buff, stderr);				    \
     va_end(args)
 
+#ifdef __DJGPP__
+/* 
+ * DJGPP is missing strptime (needed by freshclam)
+ * This is my own implementation
+ */
+
+
+static char *__day[] = {
+    "Sunday", "Monday", "Tuesday", "Wednesday",
+    "Thursday", "Friday", "Saturday"
+};
+
+static char *__month[] = {
+    "January", "February", "March", "April", "May", "June",
+    "July", "August", "September", "October", "November", "December"
+};
+
+static char *__ampm[] = {
+    "AM", "PM"
+};
+
+static int _strton( const char *nptr, const char * restrict *endptr, int max )
+{
+    int x = 0;
+
+    for( ;; ) {
+        if( !max ) break;
+        if( *nptr == '0' && !x ) {
+            nptr++;
+            continue;
+        }
+        if( isdigit( *nptr ) ) {
+            x = x * 10 + ( *nptr - '0' );
+            nptr++;
+            max--;
+        } else {
+            break;
+        }
+    }
+    *endptr = ( char * )nptr;
+
+    return( x );
+}
+
+char *strptime( const char * restrict buf, const char * restrict format,
+                struct tm * restrict tm )
+{
+    int w;
+    char *p;
+    int stri, len;
+
+    while( *format ) {
+        if( *format == '%' ) {
+            format++;
+            if( *format == 'E' || *format == 'O' ) format++;
+            switch( *format ) {
+                case '%':
+                    buf++;
+                    break;
+                case 'a':
+                case 'A':   /* Day of week full or abbreviated */
+                    for( w = 0; w < 7; w++ ) {
+                        p = __day[ w ];
+                        stri = 0;
+                        len = strlen( p );
+                        if( strnicmp( buf, p, len ) == 0 ) stri = len;
+                        else if( strnicmp( buf, p, 3 ) == 0 ) stri = 3;
+                        if( stri != 0 ) {
+                            tm->tm_wday = w;
+                            buf += stri;
+                            break;
+                        }
+                    }
+                    if( w == 7 ) return( NULL );
+                    break;
+                case 'b':
+                case 'B':
+                case 'h':
+                    for( w = 0; w < 12; w++ ) {
+                        p = __month[ w ];
+                        stri = 0;
+                        len = strlen( p );
+                        if( strnicmp( buf, p, len ) == 0 ) stri = len;
+                        else if( strnicmp( buf, p, 3 ) == 0 ) stri = 3;
+                        if( stri != 0 ) {
+                            tm->tm_mon = w;
+                            buf += stri;
+                            break;
+                        }
+                    }
+                    if( w == 12 ) return( NULL );
+                    break;
+                case 'c':
+                    buf = strptime( buf, "%a %b %d %R:%S %Y", tm );
+                    if( buf == NULL ) return( NULL );
+                    break;
+                case 'd':
+                case 'e':
+                    stri = _strton( buf, &buf, 2 );
+                    if( stri == 0 || stri > 31 ) return( NULL );
+                    tm->tm_mday = stri;
+                    break;
+                case 'D':
+                    if( ( buf = strptime( buf, "%m/%d/%y", tm ) ) == NULL )
+                        return( NULL );
+                    break;
+                case 'H':
+                    if( !isdigit( *buf ) ||
+                        ( stri = _strton( buf, &buf, 2 ) ) > 23 )
+                        return( NULL );
+                    tm->tm_hour = stri;
+                    break;
+                case 'I':
+                    stri = _strton( buf, &buf, 2 );
+                    if( stri < 1 || stri > 12 ) return( NULL );
+                    tm->tm_hour = stri - 1;
+                    break;
+                case 'j':
+                    stri = _strton( buf, &buf, 3 );
+                    if( stri < 1 || stri > 366 ) return( NULL );
+                    tm->tm_yday = stri;
+                    break;
+                case 'm':
+                    stri = _strton( buf, &buf, 2 );
+                    if( stri < 1 || stri > 12 ) return( NULL );
+                    tm->tm_mon = stri - 1;
+                    break;
+                case 'M':
+                    if( !isdigit( *buf ) ||
+                        ( stri = _strton( buf, &buf, 2 ) ) > 59 ) {
+                        return( NULL );
+                    }
+                    tm->tm_min = stri;
+                    break;
+                case 'n':
+                case 't':
+                    if( !isspace( *buf ) ) return( NULL );
+                    buf++;
+                    break;
+                case 'p':
+                    for( w = 0; w < 2; w++ ) {
+                        if( strnicmp( buf, __ampm[ w ], 2 ) == 0 ) break;
+                    }
+                    if( w == 2 ) return( NULL );
+                    if( w == 0 && tm->tm_hour > 11 ) tm->tm_hour -= 12;
+                    if( w == 1 && tm->tm_hour < 12 ) tm->tm_hour += 12;
+                    buf += 2;
+                    break;
+                case 'r':
+                    if( ( buf = strptime( buf, "%I:%M:%S%p", tm ) ) == NULL )
+                        return( NULL );
+                    break;
+                case 'R':
+                    if( ( buf = strptime( buf, "%H:%M", tm ) ) == NULL )
+                        return( NULL );
+                    break;
+                case 'S':
+                    if( !isdigit( *buf ) ||
+                        ( stri = _strton( buf, &buf, 2 ) ) > 60 )
+                        return( NULL );
+                    tm->tm_sec = stri;
+                    break;
+                case 'U':
+                    if( !isdigit( *buf ) ||
+                        ( stri = _strton( buf, &buf, 2 ) ) > 53 )
+                        return( NULL );
+                    w = stri * 7;
+                    if( stri % 7 > tm->tm_wday ) w++;
+                    tm->tm_yday = w;
+                    break;
+                case 'w':
+                    if( !isdigit( *buf ) ||
+                        ( stri = _strton( buf, &buf, 2 ) ) > 6 ) return( NULL );
+                    tm->tm_wday = stri;
+                    break;
+                case 'W':
+                    if( !isdigit( *buf ) ||
+                        ( stri = _strton( buf, &buf, 2 ) ) > 53 )
+                        return( NULL );
+                    w = stri * 7;
+                    if( stri % 7 > ( tm->tm_wday + 6 ) % 7 ) w++;
+                    tm->tm_yday = w;
+                    break;
+                case 'x':
+                    if( ( buf = strptime( buf, "%a %b %d %Y", tm ) ) == NULL )
+                        return( NULL );
+                    break;
+                case 'X':
+                    if( ( buf = strptime( buf, "%H:%M:%S", tm ) ) == NULL )
+                        return( NULL );
+                    break;
+                case 'y':
+                    stri = _strton( buf, &buf, 2 );
+                    if( stri > 99 ) return( NULL );
+                    tm->tm_year = ( stri < 69 ) ? 100 + stri : stri;
+                    break;
+                case 'Y':
+                    stri = _strton( buf, &buf, 4 );
+                    if( stri < 1969 || stri > 2068 ) return( NULL );
+                    tm->tm_year = stri - 1900;
+                    break;
+                default:
+                    buf++;
+            }
+        } else {
+            if( isspace( *format ) ) while( isspace( *buf ) ) buf++;
+            else if( *buf++ != *format ) return( NULL );
+        }
+        format++;
+    }
+    
+    return( ( char * )buf );
+}
+#endif
+
 void cli_warnmsg(const char *str, ...)
 {
     MSGCODE("LibClamAV Warning: ");
@@ -753,7 +968,12 @@
 	int i;
 
     if(!dir) {
-	if((mdir = getenv("TMPDIR")) == NULL)
+	mdir = getenv("TMPDIR");
+#ifdef __DJGPP__
+	if( mdir == NULL ) mdir = getenv("TEMP");
+	if( mdir == NULL ) mdir = getenv("TMP");
+#endif
+	if(mdir == NULL)
 #ifdef P_tmpdir
 	    mdir = P_tmpdir;
 #else
@@ -789,12 +1009,17 @@
 	return NULL;
     }
 
+#ifdef __DJGPP__ /* Support systems that don't have an lfn driver/interface */
+	sprintf(name, "%s/c", mdir);
+	strncat(name, tmp, 7);
+#else
 #ifdef	C_WINDOWS
 	sprintf(name, "%s\\clamav-", mdir);
 #else
 	sprintf(name, "%s/clamav-", mdir);
 #endif
     strncat(name, tmp, 32);
+#endif
     free(tmp);
 
     return(name);
diff -ur clamav-orig/libclamav/pdf.c clamav-new/libclamav/pdf.c
--- clamav-orig/libclamav/pdf.c	2009-03-16 11:37:28.000000000 +1100
+++ clamav-new/libclamav/pdf.c	2009-03-16 16:31:12.000000000 +1100
@@ -26,7 +26,6 @@
 #include "clamav-config.h"
 #endif
 
-#ifdef	HAVE_MMAP
 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -105,7 +104,11 @@
 	if(size <= 7)	/* doesn't even include the file header */
 		return CL_CLEAN;
 
+#ifndef HAVE_MMAP
+	p = buf = cli_copy_file_to_mem(desc, size, offset);
+#else
 	p = buf = mmap(NULL, size, PROT_READ, MAP_PRIVATE, desc, offset);
+#endif
 	if(buf == MAP_FAILED) {
 		cli_errmsg("cli_pdf: mmap() failed\n");
 		return CL_EMAP;
@@ -126,7 +129,11 @@
 	}
 
 	if(!bytesleft) {
+#ifndef HAVE_MMAP
+	    free(buf);
+#else
 	    munmap(buf, size);
+#endif
 	    cli_dbgmsg("cli_pdf: file header not found\n");
 	    return CL_CLEAN;
 	}
@@ -137,7 +144,11 @@
 			break;
 
 	if(q <= p) {
+#ifndef HAVE_MMAP
+		free(buf);
+#else
 		munmap(buf, size);
+#endif
 		cli_dbgmsg("cli_pdf: trailer not found\n");
 		return CL_CLEAN;
 	}
@@ -156,7 +167,11 @@
 		 * http://www.cs.cmu.edu/~dst/Adobe/Gallery/anon21jul01-pdf-encryption.txt
 		 * http://www.adobe.com/devnet/pdf/
 		 */
+#ifndef HAVE_MMAP
+		free(buf);
+#else
 		munmap(buf, size);
+#endif
 		cli_dbgmsg("cli_pdf: Encrypted PDF files not yet supported\n");
 		return CL_CLEAN;
 	}
@@ -179,7 +194,11 @@
 				break;
 
 	if(xrefstart == p) {
+#ifndef HAVE_MMAP
+		free(buf);
+#else
 		munmap(buf, size);
+#endif
 		cli_dbgmsg("cli_pdf: xref not found\n");
 		return CL_CLEAN;
 	}
@@ -550,7 +569,11 @@
 		if(rc != CL_CLEAN) break;
 	}
 
+#ifndef HAVE_MMAP
+	free(buf);
+#else
 	munmap(buf, size);
+#endif
 
 	tableDestroy(md5table);
 
@@ -886,16 +909,4 @@
 
 	return NULL;
 }
-#else	/*!HAVE_MMAP*/
-
-#include "clamav.h"
-#include "others.h"
-#include "pdf.h"
 
-int
-cli_pdf(const char *dir, int desc, cli_ctx *ctx, off_t offset)
-{
-	cli_dbgmsg("File not decoded - PDF decoding needs mmap() (for now)\n");
-	return CL_CLEAN;
-}
-#endif
diff -ur clamav-orig/libclamav/readdb.c clamav-new/libclamav/readdb.c
--- clamav-orig/libclamav/readdb.c	2009-03-16 11:37:28.000000000 +1100
+++ clamav-new/libclamav/readdb.c	2009-03-16 16:30:26.000000000 +1100
@@ -1605,7 +1605,7 @@
 #else
     while((dent = readdir(dd))) {
 #endif
-#if	(!defined(C_INTERIX)) && (!defined(C_WINDOWS))
+#if	(!defined(C_INTERIX)) && (!defined(C_WINDOWS)) && (!defined(__DJGPP__))
 	if(dent->d_ino)
 #endif
 	{
@@ -1719,7 +1719,7 @@
 #else
     while((dent = readdir(dd))) {
 #endif
-#if	(!defined(C_INTERIX)) && (!defined(C_WINDOWS))
+#if	(!defined(C_INTERIX)) && (!defined(C_WINDOWS)) && (!defined(__DJGPP__))
 	if(dent->d_ino)
 #endif
 	{
@@ -1802,7 +1802,7 @@
 #else
     while((dent = readdir(dd))) {
 #endif
-#if	(!defined(C_INTERIX)) && (!defined(C_WINDOWS))
+#if	(!defined(C_INTERIX)) && (!defined(C_WINDOWS)) && (!defined(__DJGPP__))
 	if(dent->d_ino)
 #endif
 	{
@@ -1909,6 +1909,16 @@
 #ifdef CL_THREAD_SAFE
     pthread_mutex_unlock(&cli_ref_mutex);
 #endif
+/*
+ * I know that disabling this for DJGPP causes a GIANT memory leak if an app
+ * were to free the database and load it again, but if we let if free each
+ * tiny memory block, it literally takes at least 5-10min if not more to
+ * finish.  And in DOS all of the memory will automatically be freed when
+ * the app terminates, so the leak isn't permanent.  If mempool were to be
+ * available for systems without mmap, this would likely be a much better
+ * solution
+ */
+#ifndef __DJGPP__
     if(engine->root) {
 	for(i = 0; i < CLI_MTARGETS; i++) {
 	    if((root = engine->root[i])) {
@@ -1981,6 +1991,7 @@
 
     cli_ftfree(engine);
     cli_freeign(engine);
+#endif
 #ifdef USE_MPOOL
     if(engine->mempool) mpool_destroy(engine->mempool);
 #endif
diff -ur clamav-orig/libclamav/scanners.c clamav-new/libclamav/scanners.c
--- clamav-orig/libclamav/scanners.c	2009-03-16 11:37:28.000000000 +1100
+++ clamav-new/libclamav/scanners.c	2009-03-16 16:30:26.000000000 +1100
@@ -128,7 +128,7 @@
 #else
 	while((dent = readdir(dd))) {
 #endif
-#if	(!defined(C_INTERIX)) && (!defined(C_WINDOWS))
+#if	(!defined(C_INTERIX)) && (!defined(C_WINDOWS)) && (!defined(__DJGPP__))
 	    if(dent->d_ino)
 #endif
 	    {
@@ -885,7 +885,7 @@
 #else
 	while((dent = readdir(dd))) {
 #endif
-#if	(!defined(C_INTERIX)) && (!defined(C_WINDOWS))
+#if	(!defined(C_INTERIX)) && (!defined(C_WINDOWS)) && (!defined(__DJGPP__))
 	    if(dent->d_ino)
 #endif
 	    {
diff -ur clamav-orig/shared/actions.c clamav-new/shared/actions.c
--- clamav-orig/shared/actions.c	2009-03-16 11:37:26.000000000 +1100
+++ clamav-new/shared/actions.c	2009-03-16 16:30:26.000000000 +1100
@@ -30,7 +30,9 @@
 #include <fcntl.h>
 #include <utime.h>
 #include <errno.h>
+#ifndef __DJGPP__
 #include <libgen.h>
+#endif
 
 #include "shared/optparser.h"
 #include "shared/output.h"
diff -ur clamav-orig/shared/misc.h clamav-new/shared/misc.h
--- clamav-orig/shared/misc.h	2009-03-16 11:37:26.000000000 +1100
+++ clamav-new/shared/misc.h	2009-03-16 17:13:22.000000000 +1100
@@ -23,6 +23,7 @@
 #include <netdb.h>
 #include <netinet/in.h>
 #include "optparser.h"
+
 /* Maximum filenames under various systems - njh */
 #ifndef	NAME_MAX	/* e.g. Linux */
 # ifdef	MAXNAMELEN	/* e.g. Solaris */
diff -ur clamav-orig/shared/optparser.c clamav-new/shared/optparser.c
--- clamav-orig/shared/optparser.c	2009-03-16 11:48:00.000000000 +1100
+++ clamav-new/shared/optparser.c	2009-03-16 17:21:28.000000000 +1100
@@ -56,13 +56,19 @@
 #define FLAG_REQUIRED	2 /* arg is required, even if there's a default value */
 #define FLAG_HIDDEN	4 /* don't print in clamconf --generate-config */
 
+#ifdef __DJGPP__
+#define FRESHCLAM_CONF CONFDIR"/clamav.cnf"
+#else
+#define FRESHCLAM_CONF CONFDIR"/freshclam.conf"
+#endif
+
 const struct clam_option clam_options[] = {
     /* name,   longopt, sopt, argtype, regex, num, str, mul, owner, description, suggested */
 
     /* cmdline only */
     { NULL, "help", 'h', TYPE_BOOL, MATCH_BOOL, 0, NULL, 0, OPT_CLAMD | OPT_FRESHCLAM | OPT_CLAMSCAN | OPT_CLAMDSCAN | OPT_SIGTOOL | OPT_MILTER | OPT_CLAMCONF | OPT_CLAMDTOP, "", "" },
     { NULL, "config-file", 'c', TYPE_STRING, NULL, 0, CONFDIR"/clamd.conf", FLAG_REQUIRED, OPT_CLAMD | OPT_CLAMDSCAN | OPT_CLAMDTOP, "", "" },
-    { NULL, "config-file", 0, TYPE_STRING, NULL, 0, CONFDIR"/freshclam.conf", FLAG_REQUIRED, OPT_FRESHCLAM, "", "" },
+    { NULL, "config-file", 0, TYPE_STRING, NULL, 0, FRESHCLAM_CONF, FLAG_REQUIRED, OPT_FRESHCLAM, "", "" },
     { NULL, "config-file", 'c', TYPE_STRING, NULL, 0, CONFDIR"/clamav-milter.conf", FLAG_REQUIRED, OPT_MILTER, "", "" },
     { NULL, "version", 'V', TYPE_BOOL, MATCH_BOOL, 0, NULL, 0, OPT_CLAMD | OPT_FRESHCLAM | OPT_CLAMSCAN | OPT_CLAMDSCAN | OPT_SIGTOOL | OPT_MILTER | OPT_CLAMCONF | OPT_CLAMDTOP, "", "" },
     { NULL, "debug", 0, TYPE_BOOL, MATCH_BOOL, 0, NULL, 0, OPT_CLAMD | OPT_FRESHCLAM | OPT_CLAMSCAN | OPT_SIGTOOL, "", "" },
diff -ur clamav-orig/sigtool/sigtool.c clamav-new/sigtool/sigtool.c
--- clamav-orig/sigtool/sigtool.c	2009-03-16 11:37:26.000000000 +1100
+++ clamav-new/sigtool/sigtool.c	2009-03-16 16:30:26.000000000 +1100
@@ -35,7 +35,9 @@
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <sys/socket.h>
+#ifndef __DJGPP__
 #include <sys/un.h>
+#endif
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <sys/wait.h>
@@ -987,7 +989,7 @@
     }
 
     while((dent = readdir(dd))) {
-#ifndef C_INTERIX
+#if !defined(C_INTERIX) && !defined(__DJGPP__)
 	if(dent->d_ino)
 #endif
 	{
@@ -1469,7 +1471,7 @@
     }
 
     while((dent = readdir(dd))) {
-#if (!defined(C_INTERIX)) && (!defined(C_WINDOWS))
+#if (!defined(C_INTERIX)) && (!defined(C_WINDOWS)) && (!defined(__DJGPP__))
 	if(dent->d_ino)
 #endif
 	{
@@ -1617,7 +1619,7 @@
     }
 
     while((dent = readdir(dd))) {
-#ifndef C_INTERIX
+#if !defined(C_INTERIX) && !defined(__DJGPP__)
 	if(dent->d_ino)
 #endif
 	{
@@ -1645,7 +1647,7 @@
     }
 
     while((dent = readdir(dd))) {
-#ifndef C_INTERIX
+#if !defined(C_INTERIX) && !defined(__DJGPP__)
 	if(dent->d_ino)
 #endif
 	{
diff -ur clamav-orig/sigtool/vba.c clamav-new/sigtool/vba.c
--- clamav-orig/sigtool/vba.c	2009-03-16 11:37:26.000000000 +1100
+++ clamav-new/sigtool/vba.c	2009-03-16 16:30:26.000000000 +1100
@@ -970,7 +970,10 @@
 
     if ((dd = opendir (dirname)) != NULL) {
 	while ((dent = readdir (dd))) {
-	    if (dent->d_ino) {
+#ifndef __DJGPP__
+	    if (dent->d_ino)
+#endif
+        {
 		if (strcmp (dent->d_name, ".") && strcmp (dent->d_name, "..")) {
 		    /* build the full name */
 		    fname = (char *) cli_calloc (strlen (dirname) + strlen (dent->d_name) + 2, sizeof (char));
@@ -1130,7 +1133,10 @@
 
     if ((dd = opendir (dirname)) != NULL) {
 	while ((dent = readdir (dd))) {
-	    if (dent->d_ino) {
+#ifndef __DJGPP__
+	    if (dent->d_ino)
+#endif
+        {
 		if (strcmp (dent->d_name, ".") && strcmp (dent->d_name, "..")) {
 		    /* build the full name */
 		    fullname = calloc (strlen (dirname) + strlen (dent->d_name) + 2, sizeof (char));