*** /home/njh/src/clamav-devel/./libclamav/htmlnorm.c	2006-10-09 17:00:07.000000000 +0100
--- ./libclamav/htmlnorm.c	2006-10-09 17:32:30.000000000 +0100
***************
*** 495,501 ****
  		if (fd_tmp < 0) {
  			return FALSE;
  		}
! 		stream_in = fdopen(fd_tmp, "r");
  		if (!stream_in) {
  			close(fd_tmp);
  			return FALSE;
--- 495,501 ----
  		if (fd_tmp < 0) {
  			return FALSE;
  		}
! 		stream_in = fdopen(fd_tmp, "rb");
  		if (!stream_in) {
  			close(fd_tmp);
  			return FALSE;
***************
*** 537,543 ****
  		}
  		
  		snprintf(filename, 1024, "%s/comment.html", dirname);
! 		file_buff_o1->fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC, S_IWUSR|S_IRUSR);
  		if (!file_buff_o1->fd) {
  			cli_dbgmsg("open failed: %s\n", filename);
  			free(file_buff_o1);
--- 537,543 ----
  		}
  		
  		snprintf(filename, 1024, "%s/comment.html", dirname);
! 		file_buff_o1->fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, S_IWUSR|S_IRUSR);
  		if (!file_buff_o1->fd) {
  			cli_dbgmsg("open failed: %s\n", filename);
  			free(file_buff_o1);
***************
*** 548,554 ****
  		}
  
  		snprintf(filename, 1024, "%s/nocomment.html", dirname);
! 		file_buff_o2->fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC, S_IWUSR|S_IRUSR);
  		if (!file_buff_o2->fd) {
  			cli_dbgmsg("open failed: %s\n", filename);
  			close(file_buff_o1->fd);
--- 548,554 ----
  		}
  
  		snprintf(filename, 1024, "%s/nocomment.html", dirname);
! 		file_buff_o2->fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, S_IWUSR|S_IRUSR);
  		if (!file_buff_o2->fd) {
  			cli_dbgmsg("open failed: %s\n", filename);
  			close(file_buff_o1->fd);
***************
*** 560,566 ****
  		}
  
  		snprintf(filename, 1024, "%s/script.html", dirname);
! 		file_buff_script->fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC, S_IWUSR|S_IRUSR);
  		if (!file_buff_script->fd) {
  			cli_dbgmsg("open failed: %s\n", filename);
  			close(file_buff_o1->fd);
--- 560,566 ----
  		}
  
  		snprintf(filename, 1024, "%s/script.html", dirname);
! 		file_buff_script->fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, S_IWUSR|S_IRUSR);
  		if (!file_buff_script->fd) {
  			cli_dbgmsg("open failed: %s\n", filename);
  			close(file_buff_o1->fd);
***************
*** 1273,1279 ****
  				snprintf(filename, 1024, "%s/rfc2397", dirname);
  				tmp_file = cli_gentemp(filename);
  				cli_dbgmsg("RFC2397 data file: %s\n", tmp_file);
! 				file_tmp_o1->fd = open(tmp_file, O_WRONLY|O_CREAT|O_TRUNC, S_IWUSR|S_IRUSR);
  				free(tmp_file);
  				if (!file_tmp_o1->fd) {
  					cli_dbgmsg("open failed: %s\n", filename);
--- 1273,1279 ----
  				snprintf(filename, 1024, "%s/rfc2397", dirname);
  				tmp_file = cli_gentemp(filename);
  				cli_dbgmsg("RFC2397 data file: %s\n", tmp_file);
! 				file_tmp_o1->fd = open(tmp_file, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, S_IWUSR|S_IRUSR);
  				free(tmp_file);
  				if (!file_tmp_o1->fd) {
  					cli_dbgmsg("open failed: %s\n", filename);
***************
*** 1475,1488 ****
  	if (fd_tmp < 0) {
  		return FALSE;
  	}
! 	stream_in = fdopen(fd_tmp, "r");
  	if (!stream_in) {
  		close(fd_tmp);
  		return FALSE;
  	}
  	
  	snprintf(filename, 1024, "%s/screnc.html", dirname);
! 	file_buff.fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC, S_IWUSR|S_IRUSR);
  	file_buff.length = 0;
  	
  	if (!file_buff.fd) {
--- 1475,1488 ----
  	if (fd_tmp < 0) {
  		return FALSE;
  	}
! 	stream_in = fdopen(fd_tmp, "rb");
  	if (!stream_in) {
  		close(fd_tmp);
  		return FALSE;
  	}
  	
  	snprintf(filename, 1024, "%s/screnc.html", dirname);
! 	file_buff.fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, S_IWUSR|S_IRUSR);
  	file_buff.length = 0;
  	
  	if (!file_buff.fd) {
*** /home/njh/src/clamav-devel/./libclamav/readdb.c	2006-10-09 17:00:07.000000000 +0100
--- ./libclamav/readdb.c	2006-10-09 20:28:22.000000000 +0100
***************
*** 1284,1290 ****
  	struct stat sb;
  	int ret;
  
- 
      if(stat(path, &sb) == -1) {
          cli_errmsg("cl_loaddbdir(): Can't get status of %s\n", path);
          return CL_EIO;
--- 1284,1289 ----
*** /home/njh/src/clamav-devel/./libclamav/blob.c	2006-10-08 13:22:52.000000000 +0100
--- ./libclamav/blob.c	2006-09-27 11:30:16.000000000 +0100
***************
*** 16,22 ****
   *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
   *  MA 02110-1301, USA.
   */
! static	char	const	rcsid[] = "$Id: patches,v 1.13 2006/10/10 21:26:41 njh Exp $";
  
  #if HAVE_CONFIG_H
  #include "clamav-config.h"
--- 16,22 ----
   *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
   *  MA 02110-1301, USA.
   */
! static	char	const	rcsid[] = "$Id: patches,v 1.13 2006/10/10 21:26:41 njh Exp $";
  
  #if HAVE_CONFIG_H
  #include "clamav-config.h"
***************
*** 440,446 ****
  	cli_dbgmsg("fileblobSetFilename: _mktemp_s(%s)\n", fullname);
  	if(_mktemp_s(fullname, strlen(fullname) + 1) != 0) {
  		char *name;
! 
  		/* _mktemp_s only allows 26 files */
  		cli_dbgmsg("fileblobSetFilename: _mktemp_s(%s) failed: %s\n", fullname, strerror(errno));
  		name = cli_gentemp(dir);
--- 440,446 ----
  	cli_dbgmsg("fileblobSetFilename: _mktemp_s(%s)\n", fullname);
  	if(_mktemp_s(fullname, strlen(fullname) + 1) != 0) {
  		char *name;
! 		
  		/* _mktemp_s only allows 26 files */
  		cli_dbgmsg("fileblobSetFilename: _mktemp_s(%s) failed: %s\n", fullname, strerror(errno));
  		name = cli_gentemp(dir);
*** /home/njh/src/clamav-devel/./libclamav/others.c	2006-09-23 13:37:39.000000000 +0100
--- ./libclamav/others.c	2006-10-09 21:14:22.000000000 +0100
***************
*** 384,390 ****
--- 384,394 ----
  	return NULL;
      }
  
+ #if defined(_MSC_VER) && defined(_DEBUG)
+     alloc = _realloc_dbg(ptr, size, _NORMAL_BLOCK, __FILE__, __LINE__);
+ #else
      alloc = realloc(ptr, size);
+ #endif
  
      if(!alloc) {
  	cli_errmsg("cli_realloc(): Can't re-allocate memory to %u byte.\n", size);
*** /home/njh/src/clamav-devel/./libclamav/unrar/unrar.c	2006-09-26 10:11:01.000000000 +0100
--- ./libclamav/unrar/unrar.c	2006-10-09 17:34:56.000000000 +0100
***************
*** 1470,1476 ****
  			metadata_tail->encrypted = TRUE;
  		} else /*if (file_header->unpack_size)*/ {
  			snprintf(filename, 1024, "%s/%lu.ura", dirname, file_count);
! 			ofd = open(filename, O_WRONLY|O_CREAT|O_TRUNC, 0600);
  			if (ofd < 0) {
  				free(file_header->filename);
  				free(file_header);
--- 1470,1476 ----
  			metadata_tail->encrypted = TRUE;
  		} else /*if (file_header->unpack_size)*/ {
  			snprintf(filename, 1024, "%s/%lu.ura", dirname, file_count);
! 			ofd = open(filename, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0600);
  			if (ofd < 0) {
  				free(file_header->filename);
  				free(file_header);
*** /home/njh/src/clamav-devel/./libclamav/binhex.c	2006-10-08 13:25:05.000000000 +0100
--- ./libclamav/binhex.c	2006-08-11 21:05:12.000000000 +0100
***************
*** 18,25 ****
   *
   * Change History:
   * $Log: patches,v $
   * Revision 1.13  2006/10/10 21:26:41  njh
   * Sync with CVS
   *
!  * Revision 1.22  2006/07/31 09:19:52  njh
!  * Use MAP_PRIVATE
   *
   * Revision 1.21  2006/07/01 16:17:35  njh
   * Added destroy flag
--- 18,25 ----
   *
   * Change History:
   * $Log: patches,v $
   * Revision 1.13  2006/10/10 21:26:41  njh
   * Sync with CVS
   *
!  * Revision 1.1  2006/08/11 20:05:13  njh
!  * First Draft
   *
   * Revision 1.21  2006/07/01 16:17:35  njh
   * Added destroy flag
***************
*** 82,88 ****
   * First draft of binhex.c
   *
   */
! static	char	const	rcsid[] = "$Id: patches,v 1.13 2006/10/10 21:26:41 njh Exp $";
  
  #include "clamav.h"
  
--- 82,88 ----
   * First draft of binhex.c
   *
   */
! static	char	const	rcsid[] = "$Id: patches,v 1.13 2006/10/10 21:26:41 njh Exp $";
  
  #include "clamav.h"
  
***************
*** 197,203 ****
  		cli_errmsg("No binhex line found\n");
  		return CL_EFORMAT;
  	}
! 
  	/* similar to binhexMessage */
  	messageSetEncoding(m, "x-binhex");
  
--- 197,203 ----
  		cli_errmsg("No binhex line found\n");
  		return CL_EFORMAT;
  	}
! 	
  	/* similar to binhexMessage */
  	messageSetEncoding(m, "x-binhex");
  
*** /home/njh/src/clamav-devel/./libclamav/line.h	2006-04-09 20:59:27.000000000 +0100
--- ./libclamav/line.h	2006-08-11 21:05:12.000000000 +0100
***************
*** 17,22 ****
--- 17,25 ----
   *  MA 02110-1301, USA.
   *
   * $Log: patches,v $
   * Revision 1.13  2006/10/10 21:26:41  njh
   * Sync with CVS
   *
+  * Revision 1.1  2006/08/11 20:05:13  njh
+  * First Draft
+  *
   * Revision 1.5  2006/04/09 19:59:27  kojm
   * update GPL headers with new address for FSF
   *
*** /home/njh/src/clamav-devel/./libclamav/text.h	2006-07-01 17:17:35.000000000 +0100
--- ./libclamav/text.h	2006-08-11 21:05:12.000000000 +0100
***************
*** 17,22 ****
--- 17,25 ----
   *  MA 02110-1301, USA.
   *
   * $Log: patches,v $
   * Revision 1.13  2006/10/10 21:26:41  njh
   * Sync with CVS
   *
+  * Revision 1.1  2006/08/11 20:05:13  njh
+  * First Draft
+  *
   * Revision 1.9  2006/07/01 16:17:35  njh
   * Added destroy flag
   *
*** /home/njh/src/clamav-devel/./libclamav/is_tar.h	2005-03-22 21:26:25.000000000 +0000
--- ./libclamav/is_tar.h	2006-08-11 21:05:12.000000000 +0100
***************
*** 5,11 ****
   *
   * Created 25 August 1985 by John Gilmore, ihnp4!hoptoad!gnu.
   *
!  * $Id: patches,v 1.13 2006/10/10 21:26:41 njh Exp $ # checkin only
   */
  
  /*
--- 5,11 ----
   *
   * Created 25 August 1985 by John Gilmore, ihnp4!hoptoad!gnu.
   *
!  * $Id: patches,v 1.13 2006/10/10 21:26:41 njh Exp $ # checkin only
   */
  
  /*
*** /home/njh/src/clamav-devel/./libclamav/is_tar.c	2006-06-17 22:00:44.000000000 +0100
--- ./libclamav/is_tar.c	2006-08-11 21:05:12.000000000 +0100
***************
*** 5,11 ****
   * Public Domain version written 26 Aug 1985 John Gilmore (ihnp4!hoptoad!gnu).
   *
   * @(#)list.c 1.18 9/23/86 Public Domain - gnu
!  * $Id: patches,v 1.13 2006/10/10 21:26:41 njh Exp $
   *
   * Comments changed and some code/comments reformatted
   * for file command by Ian Darwin.
--- 5,11 ----
   * Public Domain version written 26 Aug 1985 John Gilmore (ihnp4!hoptoad!gnu).
   *
   * @(#)list.c 1.18 9/23/86 Public Domain - gnu
!  * $Id: patches,v 1.13 2006/10/10 21:26:41 njh Exp $
   *
   * Comments changed and some code/comments reformatted
   * for file command by Ian Darwin.
*** /home/njh/src/clamav-devel/./libclamav/scanners.c	2006-10-09 17:48:45.000000000 +0100
--- ./libclamav/scanners.c	2006-07-31 20:42:08.000000000 +0100
***************
*** 38,43 ****
--- 38,44 ----
  #include <netinet/in.h>
  #endif
  
+ 
  #if HAVE_MMAP
  #if HAVE_SYS_MMAN_H
  #include <sys/mman.h>
***************
*** 48,57 ****
  
  #include <mspack.h>
  
- #ifndef	O_BINARY
- #define	O_BINARY	0
- #endif
- 
  extern short cli_leavetemps_flag;
  
  #include "clamav.h"
--- 49,54 ----
***************
*** 73,79 ****
  #include "untar.h"
  #include "special.h"
  #include "binhex.h"
- #include "js.h"
  /* #include "uuencode.h" */
  #include "tnef.h"
  #include "pst.h"
--- 70,75 ----
***************
*** 1143,1169 ****
  	return ret;
      }
  
- #ifdef	CL_EXPERIMENTAL
- 	if(ret == CL_CLEAN) {
- 		char *t = cli_gentemp(NULL);
- 		if(mkdir(t, 0700)) {
- 			cli_dbgmsg("ScanHTML -> Can't create temporary directory %s\n", t);
- 			free(t);
- 			if(!cli_leavetemps_flag)
- 				cli_rmdirs(tempname);
- 			free(tempname);
- 			return CL_ETMPDIR;
- 		}
- 
- 		lseek(desc, 0L, SEEK_SET);
- 		ret = cli_scanjs(t, desc);
- 		if(ret == CL_CLEAN)
- 		    ret = cli_scandir(t, ctx);
- 		if(!cli_leavetemps_flag)
- 			cli_rmdirs(t);
- 	}
- #endif
- 
      if (ret == CL_CLEAN) {
      	snprintf(fullname, 1024, "%s/rfc2397", tempname);
      	ret = cli_scandir(fullname, ctx);
--- 1139,1144 ----
*** /home/njh/src/clamav-devel/./libclamav/untar.c	2006-08-20 20:42:02.000000000 +0100
--- ./libclamav/untar.c	2006-08-20 20:47:28.000000000 +0100
***************
*** 22,27 ****
--- 22,30 ----
   *
   * Change History:
   * $Log: patches,v $
   * Revision 1.13  2006/10/10 21:26:41  njh
   * Sync with CVS
   *
+  * Revision 1.2  2006/08/20 19:47:28  njh
+  * Fix error return
+  *
   * Revision 1.31  2006/08/20 19:42:02  njh
   * Fix error return
   *
***************
*** 116,122 ****
   * First draft
   *
   */
! static	char	const	rcsid[] = "$Id: patches,v 1.13 2006/10/10 21:26:41 njh Exp $";
  
  #include <stdio.h>
  #include <errno.h>
--- 119,125 ----
   * First draft
   *
   */
! static	char	const	rcsid[] = "$Id: patches,v 1.13 2006/10/10 21:26:41 njh Exp $";
  
  #include <stdio.h>
  #include <errno.h>
*** /home/njh/src/clamav-devel/./libclamav/untar.h	2006-04-09 20:59:28.000000000 +0100
--- ./libclamav/untar.h	2006-08-11 21:05:12.000000000 +0100
***************
*** 18,23 ****
--- 18,26 ----
   *
   * Change History:
   * $Log: patches,v $
   * Revision 1.13  2006/10/10 21:26:41  njh
   * Sync with CVS
   *
+  * Revision 1.1  2006/08/11 20:05:13  njh
+  * First Draft
+  *
   * Revision 1.4  2006/04/09 19:59:28  kojm
   * update GPL headers with new address for FSF
   *
*** /home/njh/src/clamav-devel/./libclamav/pst.c	2006-09-16 21:22:21.000000000 +0100
--- ./libclamav/pst.c	2006-08-29 08:44:40.000000000 +0100
***************
*** 36,42 ****
   * TODO: Remove the vcard handling
   * FIXME: The code does little error checking of OOM scenarios
   */
! static	char	const	rcsid[] = "$Id: patches,v 1.13 2006/10/10 21:26:41 njh Exp $";
  
  #if HAVE_CONFIG_H
  #include "clamav-config.h"	/* must come first */
--- 36,42 ----
   * TODO: Remove the vcard handling
   * FIXME: The code does little error checking of OOM scenarios
   */
! static	char	const	rcsid[] = "$Id: patches,v 1.13 2006/10/10 21:26:41 njh Exp $";
  
  #if HAVE_CONFIG_H
  #include "clamav-config.h"	/* must come first */
***************
*** 57,64 ****
  #include "cltypes.h"
  #include "others.h"
  
! #if	defined(C_SOLARIS) || defined(C_WINDOWS) || defined(_HPUX_SOURCE)
! typedef	uint16_t	u_int16_t;	/* should be in cltypes.h */
  typedef	uint32_t	u_int32_t;
  #endif
  
--- 57,64 ----
  #include "cltypes.h"
  #include "others.h"
  
! #if	defined(C_SOLARIS) || defined(C_WINDOWS)	/* should be in cltypes.h */
! typedef	uint16_t	u_int16_t;
  typedef	uint32_t	u_int32_t;
  #endif
  
***************
*** 1193,1199 ****
    struct _pst_table_ptr_struct table, table2;
    pst_desc desc_rec;
    pst_desc_ll *d_ptr=NULL, *d_par=NULL;
!   int32_t i = 0, prev_id=-1;
    char *buf = NULL, *bptr;
  
    struct _pst_d_ptr_ll {
--- 1193,1199 ----
    struct _pst_table_ptr_struct table, table2;
    pst_desc desc_rec;
    pst_desc_ll *d_ptr=NULL, *d_par=NULL;
!   int32_t i = 0, y, prev_id=-1;
    char *buf = NULL, *bptr;
  
    struct _pst_d_ptr_ll {
***************
*** 1514,1519 ****
--- 1514,1520 ----
        return -1;
      }
  
+     y = 0;
      while(table.start != 0 /*&& y < 0x1F && table.start < end_val*/) {
  
        if (table2.start <= table.start) {
***************
*** 2070,2076 ****
  }
  
  int32_t _pst_process(pst_num_array *list , pst_item *item) {
!   int32_t x;
    int32_t next = 0;
    pst_item_attach *attach;
    pst_item_extra_field *ef;
--- 2071,2077 ----
  }
  
  int32_t _pst_process(pst_num_array *list , pst_item *item) {
!   int32_t x, t;
    int32_t next = 0;
    pst_item_attach *attach;
    pst_item_extra_field *ef;
***************
*** 2125,2130 ****
--- 2126,2132 ----
  	MALLOC_EMAIL(item);
  	memcpy(&(item->email->importance), list->items[x]->data, sizeof(item->email->importance));
  	LE32_CPU(item->email->importance);
+ 	t = item->email->importance;
  	//	INC_CHECK_X();
  	break;
        case 0x001A: // PR_MESSAGE_CLASS Ascii type of messages - NOT FOLDERS
***************
*** 2175,2180 ****
--- 2177,2183 ----
  	MALLOC_EMAIL(item);
  	memcpy(&(item->email->priority), list->items[x]->data, sizeof(item->email->priority));
  	LE32_CPU(item->email->priority);
+ 	t = item->email->priority;
  	//	INC_CHECK_X();
  	break;
        case 0x0029:// PR_READ_RECEIPT_REQUESTED
***************
*** 2209,2214 ****
--- 2212,2218 ----
  	MALLOC_EMAIL(item);
  	memcpy(&(item->email->orig_sensitivity), list->items[x]->data, sizeof(item->email->orig_sensitivity));
  	LE32_CPU(item->email->orig_sensitivity);
+ 	t = item->email->orig_sensitivity;
  	//	INC_CHECK_X();
  	break;
        case 0x0036: // PR_SENSITIVITY
***************
*** 2221,2226 ****
--- 2225,2231 ----
  	MALLOC_EMAIL(item);
  	memcpy(&(item->email->sensitivity), list->items[x]->data, sizeof(item->email->sensitivity));
  	LE32_CPU(item->email->sensitivity);
+ 	t = item->email->sensitivity;
  	//	INC_CHECK_X();
  	break;
        case 0x0037: // PR_SUBJECT raw subject
***************
*** 2849,2854 ****
--- 2854,2860 ----
  	MOVE_NEXT(attach);
  	memcpy(&(attach->method), list->items[x]->data, sizeof(attach->method));
  	LE32_CPU(attach->method);
+ 	t = attach->method;
  	//INC_CHECK_X();
  	break;
        case 0x370B: // PR_RENDERING_POSITION
*** /home/njh/src/clamav-devel/./libclamav/regex_list.c	2006-10-08 21:42:25.000000000 +0100
--- ./libclamav/regex_list.c	2006-10-09 11:33:08.000000000 +0100
***************
*** 713,718 ****
--- 713,723 ----
  
  static int cli_iswctype(const char c,const enum wctype_t type)
  {
+ 	if(c & 0x80) {
+ 		cli_dbgmsg("iswctype top bit is set\n");
+ 	 	return 0;
+ 	 }
+ 		
  	switch(type) {
  		case ALNUM:
  			return isalnum(c);
***************
*** 738,747 ****
  			return isprint(c);
  		case XDIGIT:
  			return isxdigit(c);
! 		default: {
! 				 cli_warnmsg("Unknown char class in iswctype\n");
! 	 			 return 0;
! 			 }
  	}
  }
  
--- 743,751 ----
  			return isprint(c);
  		case XDIGIT:
  			return isxdigit(c);
! 		default:
! 			cli_warnmsg("Unknown char class in iswctype\n");
! 	 		return 0;
  	}
  }
  
*** /home/njh/src/clamav-devel/./libclamav/line.c	2006-04-09 20:59:27.000000000 +0100
--- ./libclamav/line.c	2006-08-11 21:05:12.000000000 +0100
***************
*** 17,22 ****
--- 17,25 ----
   *  MA 02110-1301, USA.
   *
   * $Log: patches,v $
   * Revision 1.13  2006/10/10 21:26:41  njh
   * Sync with CVS
   *
+  * Revision 1.1  2006/08/11 20:05:13  njh
+  * First Draft
+  *
   * Revision 1.10  2006/04/09 19:59:27  kojm
   * update GPL headers with new address for FSF
   *
***************
*** 49,55 ****
   *
   */
  
! static	char	const	rcsid[] = "$Id: patches,v 1.13 2006/10/10 21:26:41 njh Exp $";
  
  #if HAVE_CONFIG_H
  #include "clamav-config.h"
--- 52,58 ----
   *
   */
  
! static	char	const	rcsid[] = "$Id: patches,v 1.13 2006/10/10 21:26:41 njh Exp $";
  
  #if HAVE_CONFIG_H
  #include "clamav-config.h"
*** /home/njh/src/clamav-devel/./libclamav/binhex.h	2006-04-09 20:59:27.000000000 +0100
--- ./libclamav/binhex.h	2006-08-11 21:05:12.000000000 +0100
***************
*** 18,23 ****
--- 18,26 ----
   *
   * Change History:
   * $Log: patches,v $
   * Revision 1.13  2006/10/10 21:26:41  njh
   * Sync with CVS
   *
+  * Revision 1.1  2006/08/11 20:05:13  njh
+  * First Draft
+  *
   * Revision 1.4  2006/04/09 19:59:27  kojm
   * update GPL headers with new address for FSF
   *
*** /home/njh/src/clamav-devel/./libclamav/chmunpack.c	2006-10-09 17:00:07.000000000 +0100
--- ./libclamav/chmunpack.c	2006-10-09 17:31:12.000000000 +0100
***************
*** 829,835 ****
  	if (mf_in.desc < 0) {
  		return FALSE;
  	}
! 	mf_in.fh = fdopen(mf_in.desc, "r");
  	if (!mf_in.fh) {
  		close(mf_in.desc);
  		return FALSE;
--- 829,835 ----
  	if (mf_in.desc < 0) {
  		return FALSE;
  	}
! 	mf_in.fh = fdopen(mf_in.desc, "rb");
  	if (!mf_in.fh) {
  		close(mf_in.desc);
  		return FALSE;
***************
*** 844,850 ****
  		fclose(mf_in.fh);
  		return FALSE;
  	}
! 	mf_out.fh = fdopen(mf_out.desc, "w");
  	if (!mf_out.fh) {
  		cli_dbgmsg("fdopen failed\n", filename);
  		free(mf_in.name);
--- 844,850 ----
  		fclose(mf_in.fh);
  		return FALSE;
  	}
! 	mf_out.fh = fdopen(mf_out.desc, "wb");
  	if (!mf_out.fh) {
  		cli_dbgmsg("fdopen failed\n", filename);
  		free(mf_in.name);
*** /home/njh/src/clamav-devel/./libclamav/pdf.c	2006-10-08 13:24:32.000000000 +0100
--- ./libclamav/pdf.c	2006-09-17 15:50:58.000000000 +0100
***************
*** 15,21 ****
   *  along with this program; if not, write to the Free Software
   *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
   */
! static	char	const	rcsid[] = "$Id: patches,v 1.13 2006/10/10 21:26:41 njh Exp $";
  
  #if HAVE_CONFIG_H
  #include "clamav-config.h"
--- 15,21 ----
   *  along with this program; if not, write to the Free Software
   *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
   */
! static	char	const	rcsid[] = "$Id: patches,v 1.13 2006/10/10 21:26:41 njh Exp $";
  
  #if HAVE_CONFIG_H
  #include "clamav-config.h"
***************
*** 178,184 ****
  		char *md5digest;
  		size_t length, objlen, streamlen;
  		char fullname[NAME_MAX + 1];
! 
  		if(q == xrefstart)
  			break;
  		if(memcmp(q, "xref", 4) == 0)
--- 178,184 ----
  		char *md5digest;
  		size_t length, objlen, streamlen;
  		char fullname[NAME_MAX + 1];
!   
  		if(q == xrefstart)
  			break;
  		if(memcmp(q, "xref", 4) == 0)
***************
*** 297,303 ****
  			}
  		} else
  			fout = open(fullname, O_WRONLY|O_CREAT|O_EXCL|O_TRUNC|O_BINARY, 0600);
! #else
  		mktemp(fullname);
  		fout = open(fullname, O_WRONLY|O_CREAT|O_EXCL|O_TRUNC|O_BINARY, 0600);
  #endif
--- 297,303 ----
  			}
  		} else
  			fout = open(fullname, O_WRONLY|O_CREAT|O_EXCL|O_TRUNC|O_BINARY, 0600);
! #else	
  		mktemp(fullname);
  		fout = open(fullname, O_WRONLY|O_CREAT|O_EXCL|O_TRUNC|O_BINARY, 0600);
  #endif
*** /home/njh/src/clamav-devel/./clamscan/treewalk.h	2006-06-08 21:00:50.000000000 +0100
--- ./clamscan/treewalk.h	2006-07-26 14:36:44.000000000 +0100
***************
*** 20,26 ****
--- 20,29 ----
  #ifndef __TREEWALK_H
  #define __TREEWALK_H
  
+ #ifndef	C_WINDOWS
  #include <pwd.h>
+ #endif
+ 
  #include <clamav.h>
  
  #include "options.h"
*** /home/njh/src/clamav-devel/./clamscan/others.c	2006-04-09 20:59:26.000000000 +0100
--- ./clamscan/others.c	2006-07-26 15:03:16.000000000 +0100
***************
*** 29,41 ****
--- 29,47 ----
  #include <stdlib.h>
  #include <string.h>
  #include <ctype.h>
+ #ifdef	HAVE_UNISTD_H
  #include <unistd.h>
+ #endif
  #include <errno.h>
+ #ifndef	C_WINDOWS
  #include <pwd.h>
+ #endif
  #include <sys/types.h>
  #include <sys/stat.h>
+ #ifndef	C_WINDOWS
  #include <sys/wait.h>
  #include <sys/time.h>
+ #endif
  #include <time.h>
  #include <fcntl.h>
  #include <signal.h>
***************
*** 73,78 ****
--- 79,92 ----
      }
  }
  
+ #ifdef	C_WINDOWS
+ /* FIXME: Handle users correctly */
+ int
+ checkaccess(const char *path, const char *username, int mode)
+ {
+ 	return _access(path, mode);
+ }
+ #else
  int checkaccess(const char *path, const char *username, int mode)
  {
  	struct passwd *user;
***************
*** 117,122 ****
--- 131,137 ----
  
      return ret;
  }
+ #endif
  
  int match_regex(const char *filename, const char *pattern)
  {
*** /home/njh/src/clamav-devel/./clamscan/treewalk.c	2006-10-09 10:09:17.000000000 +0100
--- ./clamscan/treewalk.c	2006-10-09 21:23:06.000000000 +0100
***************
*** 24,35 ****
--- 24,39 ----
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
+ #ifdef	HAVE_UNISTD_H
  #include <unistd.h>
+ #endif
  #include <sys/stat.h>
  #include <sys/types.h>
+ #ifndef	C_WINDOWS
  #include <sys/wait.h>
  #include <grp.h>
  #include <dirent.h>
+ #endif
  #include <errno.h>
  
  #include "shared.h"
***************
*** 97,103 ****
  
      if((dd = opendir(dirname)) != NULL) {
  	while((dent = readdir(dd))) {
! #ifndef C_INTERIX
  	    if(dent->d_ino)
  #endif
  	    {
--- 101,107 ----
  
      if((dd = opendir(dirname)) != NULL) {
  	while((dent = readdir(dd))) {
! #if	(!defined(C_INTERIX)) && (!defined(C_WINDOWS)) && (!defined(C_CYGWIN))
  	    if(dent->d_ino)
  #endif
  	    {
***************
*** 136,141 ****
--- 140,152 ----
  
  }
  
+ #ifdef	C_WINDOWS
+ int
+ clamav_rmdirs(const char *dir)
+ {
+ 	return rmdirs(dir);
+ }
+ #else
  int clamav_rmdirs(const char *dir)
  {
  #ifndef C_CYGWIN
***************
*** 184,189 ****
--- 195,201 ----
      }
  
  }
+ #endif
  
  int fixperms(const char *dirname)
  {
***************
*** 195,201 ****
  
      if((dd = opendir(dirname)) != NULL) {
  	while((dent = readdir(dd))) {
! #ifndef C_INTERIX
  	    if(dent->d_ino)
  #endif
  	    {
--- 207,213 ----
  
      if((dd = opendir(dirname)) != NULL) {
  	while((dent = readdir(dd))) {
! #if	(!defined(C_INTERIX)) && (!defined(C_WINDOWS)) && (!defined(C_CYGWIN))
  	    if(dent->d_ino)
  #endif
  	    {
***************
*** 241,247 ****
  
      if((dd = opendir(dirname)) != NULL) {
  	while((dent = readdir(dd))) {
! #ifndef C_INTERIX
  	    if(dent->d_ino)
  #endif
  	    {
--- 253,259 ----
  
      if((dd = opendir(dirname)) != NULL) {
  	while((dent = readdir(dd))) {
! #if	(!defined(C_INTERIX)) && (!defined(C_WINDOWS)) && (!defined(C_CYGWIN))
  	    if(dent->d_ino)
  #endif
  	    {
*** /home/njh/src/clamav-devel/./clamscan/manager.c	2006-09-15 13:27:22.000000000 +0100
--- ./clamscan/manager.c	2006-10-10 09:21:58.000000000 +0100
***************
*** 30,40 ****
--- 30,48 ----
  #include <ctype.h>
  #include <sys/stat.h>
  #include <sys/types.h>
+ #ifdef	C_WINDOWS
+ #include <sys/utime.h>
+ #else
  #include <sys/wait.h>
  #include <utime.h>
+ #endif
+ #ifdef	HAVE_INITGROUPS
  #include <grp.h>
+ #endif
  #include <fcntl.h>
+ #ifdef	HAVE_UNISTD_H
  #include <unistd.h>
+ #endif
  #include <sys/types.h>
  #include <signal.h>
  #include <clamav.h>
***************
*** 57,62 ****
--- 65,75 ----
  dev_t procdev;
  #endif
  
+ #ifdef	C_WINDOWS
+ #undef	P_tmpdir
+ 
+ #define	P_tmpdir	"C:\\WINDOWS\\TEMP"
+ #endif
  
  int scanmanager(const struct optstruct *opt)
  {
***************
*** 69,77 ****
  	struct stat sb;
  	char *fullpath = NULL, cwd[1024];
  
- 
  /* njh@bandsman.co.uk: BeOS */
! #if !defined(C_CYGWIN) && !defined(C_OS2) && !defined(C_BEOS)
      if(!geteuid()) {
  	if((user = getpwnam(UNPUSER)) == NULL) {
  	    logg("^Can't get information about user "UNPUSER"\n");
--- 82,89 ----
  	struct stat sb;
  	char *fullpath = NULL, cwd[1024];
  
  /* njh@bandsman.co.uk: BeOS */
! #if !defined(C_CYGWIN) && !defined(C_OS2) && !defined(C_BEOS) && !defined(C_WINDOWS)
      if(!geteuid()) {
  	if((user = getpwnam(UNPUSER)) == NULL) {
  	    logg("^Can't get information about user "UNPUSER"\n");
***************
*** 360,371 ****
--- 372,385 ----
  	return 0;
      }
  
+ #ifndef	C_WINDOWS
      if(geteuid())
  	if(checkaccess(filename, NULL, R_OK) != 1) {
  	    if(!printinfected)
  		logg("%s: Access denied\n", filename);
  	    return 0;
  	}
+ #endif
  
      claminfo.files++;
  
***************
*** 476,482 ****
      tmpdir = getenv("TMPDIR");
  
      if(tmpdir == NULL)
! #ifdef P_tmpdir
  	tmpdir = P_tmpdir;
  #else
  	tmpdir = "/tmp";
--- 490,496 ----
      tmpdir = getenv("TMPDIR");
  
      if(tmpdir == NULL)
! #ifdef	P_tmpdir
  	tmpdir = P_tmpdir;
  #else
  	tmpdir = "/tmp";
***************
*** 495,501 ****
  	exit(63); /* critical */
      }
  
! #ifndef C_OS2
      if(user)
  	chown(gendir, user->pw_uid, user->pw_gid);
  #endif
--- 509,516 ----
  	exit(63); /* critical */
      }
  
! #if	(!defined(C_OS2)) && (!defined(C_WINDOWS))
! 	/* FIXME: do the correct native windows way */
      if(user)
  	chown(gendir, user->pw_uid, user->pw_gid);
  #endif
***************
*** 674,680 ****
      tmpdir = getenv("TMPDIR");
  
      if(tmpdir == NULL)
! #ifdef P_tmpdir
  	tmpdir = P_tmpdir;
  #else
  	tmpdir = "/tmp";
--- 689,695 ----
      tmpdir = getenv("TMPDIR");
  
      if(tmpdir == NULL)
! #ifdef	P_tmpdir
  	tmpdir = P_tmpdir;
  #else
  	tmpdir = "/tmp";
***************
*** 710,716 ****
  
      fixperms(gendir);
  
! #ifndef C_OS2
      if(user) {
  	chown(gendir, user->pw_uid, user->pw_gid);
  	chown(tmpfile, user->pw_uid, user->pw_gid);
--- 725,731 ----
  
      fixperms(gendir);
  
! #if	(!defined(C_OS2)) && (!defined(C_WINDOWS))
      if(user) {
  	chown(gendir, user->pw_uid, user->pw_gid);
  	chown(tmpfile, user->pw_uid, user->pw_gid);
***************
*** 753,759 ****
  
      logg("*Scanning %s\n", filename);
  
!     if((fd = open(filename, O_RDONLY)) == -1) {
  	logg("^Can't open file %s\n", filename);
  	return 54;
      }
--- 768,774 ----
  
      logg("*Scanning %s\n", filename);
  
!     if((fd = open(filename, O_RDONLY|O_BINARY)) == -1) {
  	logg("^Can't open file %s\n", filename);
  	return 54;
      }
***************
*** 788,794 ****
      tmpdir = getenv("TMPDIR");
  
      if(tmpdir == NULL)
! #ifdef P_tmpdir
  	tmpdir = P_tmpdir;
  #else
  	tmpdir = "/tmp";
--- 803,809 ----
      tmpdir = getenv("TMPDIR");
  
      if(tmpdir == NULL)
! #ifdef	P_tmpdir
  	tmpdir = P_tmpdir;
  #else
  	tmpdir = "/tmp";
***************
*** 806,811 ****
--- 821,833 ----
  	return 63;
      }
  
+ #ifdef	C_WINDOWS
+ 	if(setmode(fileno(stdin), O_BINARY) < 0) {
+ 		logg("^Can't set binary mode on stdin\n");
+ 		return 63;
+ 	}
+ #endif
+ 
      while((ret = fread(buff, 1, FILEBUFF, stdin)))
  	fwrite(buff, 1, ret, fs);
  
***************
*** 840,845 ****
--- 862,875 ----
   * 0 -> OK
   */
  
+ #ifdef	C_WINDOWS
+ int clamav_unpack(const char *prog, char **args, const char *tmpdir, const struct passwd *user, const struct optstruct *opt)
+ {
+ 	/* TODO: use spamvp(P_WAIT, prog, args); */
+ 	cli_errmsg("clamav_unpack is not supported under Windows yet\n");
+ 	return -1;
+ }
+ #else
  int clamav_unpack(const char *prog, char **args, const char *tmpdir, const struct passwd *user, const struct optstruct *opt)
  {
  	pid_t pid;
***************
*** 870,876 ****
  	case -1:
  	    return -1;
  	case 0:
! #ifndef C_CYGWIN
  	    if(!geteuid() && user) {
  
  #ifdef HAVE_SETGROUPS
--- 900,906 ----
  	case -1:
  	    return -1;
  	case 0:
! #if	(!defined(C_CYGWIN)) && (!defined(C_WINDOWS))
  	    if(!geteuid() && user) {
  
  #ifdef HAVE_SETGROUPS
***************
*** 946,958 ****
  
      return 0;
  }
  
  void move_infected(const char *filename, const struct optstruct *opt)
  {
  	char *movedir, *movefilename, *tmp, numext[4 + 1];
  	struct stat fstat, mfstat;
  	int n, len, movefilename_size;
! 	struct utimbuf ubuf;
  
  
      if(!(movedir = opt_arg(opt, "move"))) {
--- 976,989 ----
  
      return 0;
  }
+ #endif
  
  void move_infected(const char *filename, const struct optstruct *opt)
  {
  	char *movedir, *movefilename, *tmp, numext[4 + 1];
  	struct stat fstat, mfstat;
  	int n, len, movefilename_size;
! 	struct _utimbuf ubuf;
  
  
      if(!(movedir = opt_arg(opt, "move"))) {
***************
*** 1030,1036 ****
  	}
  
  	chmod(movefilename, fstat.st_mode);
! #ifndef C_OS2
  	chown(movefilename, fstat.st_uid, fstat.st_gid);
  #endif
  
--- 1061,1067 ----
  	}
  
  	chmod(movefilename, fstat.st_mode);
! #if	(!defined(C_OS2)) && (!defined(C_WINDOWS))
  	chown(movefilename, fstat.st_uid, fstat.st_gid);
  #endif
  
*** /home/njh/src/clamav-devel/./clamscan/clamscan.c	2006-09-15 13:27:22.000000000 +0100
--- ./clamscan/clamscan.c	2006-10-10 09:50:04.000000000 +0100
***************
*** 24,32 ****
--- 24,39 ----
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
+ #ifdef	HAVE_UNISTD_H
  #include <unistd.h>
+ #endif
+ #ifdef	C_WINDOWS
+ #include <fcntl.h>
+ #else
  #include <sys/time.h>
+ #endif
  #include <time.h>
+ #include <ctype.h>
  
  #include "clamscan_opt.h"
  #include "others.h"
***************
*** 53,62 ****
  	int ds, dms, ret;
  	double mb;
  	struct timeval t1, t2;
  	struct timezone tz;
  	struct optstruct *opt;
  	const char *pt;
! 
  
      opt = opt_parse(argc, argv, clamscan_shortopt, clamscan_longopt, NULL);
      if(!opt) {
--- 60,77 ----
  	int ds, dms, ret;
  	double mb;
  	struct timeval t1, t2;
+ #ifndef	C_WINDOWS
  	struct timezone tz;
+ #endif
  	struct optstruct *opt;
  	const char *pt;
! 	
! #if	defined(C_WINDOWS) && defined(CL_THREAD_SAFE)
! 	if(!pthread_win32_process_attach_np()) {
! 		mprintf("!Can't start the win32 pthreads layer\n");
! 		return 1;
! 	}
! #endif
  
      opt = opt_parse(argc, argv, clamscan_shortopt, clamscan_longopt, NULL);
      if(!opt) {
***************
*** 174,184 ****
  
      memset(&claminfo, 0, sizeof(struct s_info));
  
      gettimeofday(&t1, &tz);
      ret = scanmanager(opt);
  
      if(!opt_check(opt, "disable-summary") && !opt_check(opt, "no-summary")) {
! 	gettimeofday(&t2, &tz);
  	ds = t2.tv_sec - t1.tv_sec;
  	dms = t2.tv_usec - t1.tv_usec;
  	ds -= (dms < 0) ? (1):(0);
--- 189,210 ----
  
      memset(&claminfo, 0, sizeof(struct s_info));
  
+ #ifdef	C_WINDOWS
+ 	_set_fmode(_O_BINARY);
+ 
+ 	gettimeofday(&t1, NULL);
+ #else
      gettimeofday(&t1, &tz);
+ #endif
+ 
      ret = scanmanager(opt);
  
      if(!opt_check(opt, "disable-summary") && !opt_check(opt, "no-summary")) {
! #ifdef	C_WINDOWS
! 	gettimeofday(&t2, NULL);
! #else
!     gettimeofday(&t2, &tz);
! #endif
  	ds = t2.tv_sec - t1.tv_sec;
  	dms = t2.tv_usec - t1.tv_usec;
  	ds -= (dms < 0) ? (1):(0);
***************
*** 204,209 ****
--- 230,243 ----
      }
  
      opt_free(opt);
+     
+ #if	defined(C_WINDOWS) && defined(CL_THREAD_SAFE)
+ 	if(!pthread_win32_process_detach_np()) {
+ 		mprintf("!Can't stop the win32 pthreads layer\n");
+ 		return 1;
+ 	}
+ #endif
+ 
      return ret;
  }
  
*** /home/njh/src/clamav-devel/./clamscan/manager.h	2006-05-15 19:30:18.000000000 +0100
--- ./clamscan/manager.h	2006-10-10 10:12:40.000000000 +0100
***************
*** 21,27 ****
--- 21,29 ----
  #define __MANAGER_H
  
  #include <clamav.h>
+ #ifndef	C_WINDOWS
  #include <pwd.h>
+ #endif
  #include "options.h"
  
  int scanmanager(const struct optstruct *opt);
***************
*** 42,45 ****
--- 44,52 ----
  
  void move_infected(const char *filename, const struct optstruct *opt);
  
+ #ifdef	_DEBUG
+ /* breaks mspack/qtmd.c :-( */
+ #define	free(p)	_free_dbg(p, _NORMAL_BLOCK)
+ #endif
+ 
  #endif
*** /home/njh/src/clamav-devel/./shared/network.c	2006-09-27 17:24:10.000000000 +0100
--- ./shared/network.c	2006-08-01 17:57:24.000000000 +0100
***************
*** 78,84 ****
  	if(gethostbyname_r(hostname, &hp, (struct hostent_data *)buf) < 0)
  		return h_errno;
  #else
! 	/* Single thread the code e.g. VS2005 */
  	struct hostent *hp2;
  #ifdef  CL_THREAD_SAFE
  	static pthread_mutex_t hostent_mutex = PTHREAD_MUTEX_INITIALIZER;
--- 78,84 ----
  	if(gethostbyname_r(hostname, &hp, (struct hostent_data *)buf) < 0)
  		return h_errno;
  #else
! 	/* Single thread the code */
  	struct hostent *hp2;
  #ifdef  CL_THREAD_SAFE
  	static pthread_mutex_t hostent_mutex = PTHREAD_MUTEX_INITIALIZER;
*** /home/njh/src/clamav-devel/./shared/getopt.c	2004-03-29 01:00:58.000000000 +0100
--- ./shared/getopt.c	2006-07-26 15:49:38.000000000 +0100
***************
*** 41,47 ****
--- 41,49 ----
  
  #include <stdio.h>
  
+ #ifndef	C_WINDOWS
  int strncmp(const char *s1, const char *s2, size_t n);
+ #endif
  
  /* Comment out all this code if we are using the GNU C Library, and are not
     actually compiling the library itself.  This code is part of the GNU C
*** /home/njh/src/clamav-devel/./shared/cdiff.c	2006-10-07 16:31:11.000000000 +0100
--- ./shared/cdiff.c	2006-10-09 19:39:06.000000000 +0100
***************
*** 27,33 ****
--- 27,35 ----
  #include <ctype.h>
  #include <sys/types.h>
  #include <sys/stat.h>
+ #ifdef	HAVE_UNISTD_H
  #include <unistd.h>
+ #endif
  
  #include "shared/memory.h"
  #include "shared/misc.h"
***************
*** 356,362 ****
  
      if(del || xchg) {
  
! 	if(!(fh = fopen(ctx->open_db, "r"))) {
  	    logg("!cdiff_cmd_close: Can't open file %s for reading\n", ctx->open_db);
  	    return -1;
  	}
--- 358,364 ----
  
      if(del || xchg) {
  
! 	if(!(fh = fopen(ctx->open_db, "rb"))) {
  	    logg("!cdiff_cmd_close: Can't open file %s for reading\n", ctx->open_db);
  	    return -1;
  	}
***************
*** 367,373 ****
  	    return -1;
  	}
  
! 	if(!(tmpfh = fopen(tmp, "w"))) {
  	    logg("!cdiff_cmd_close: Can't open file %s for writing\n", tmp);
  	    fclose(fh);
  	    free(tmp);
--- 369,375 ----
  	    return -1;
  	}
  
! 	if(!(tmpfh = fopen(tmp, "wb"))) {
  	    logg("!cdiff_cmd_close: Can't open file %s for writing\n", tmp);
  	    fclose(fh);
  	    free(tmp);
***************
*** 452,458 ****
  
      if(add) {
  
! 	if(!(fh = fopen(ctx->open_db, "a"))) {
  	    logg("!cdiff_cmd_close: Can't open file %s for appending\n", ctx->open_db);
  	    return -1;
  	}
--- 454,460 ----
  
      if(add) {
  
! 	if(!(fh = fopen(ctx->open_db, "ab"))) {
  	    logg("!cdiff_cmd_close: Can't open file %s for appending\n", ctx->open_db);
  	    return -1;
  	}
***************
*** 523,529 ****
  	return -1;
      }
  
!     if(!(src = fopen(srcdb, "r"))) {
  	logg("!cdiff_cmd_move: Can't open %s for reading\n", srcdb);
  	free(start_str);
  	free(end_str);
--- 525,531 ----
  	return -1;
      }
  
!     if(!(src = fopen(srcdb, "rb"))) {
  	logg("!cdiff_cmd_move: Can't open %s for reading\n", srcdb);
  	free(start_str);
  	free(end_str);
***************
*** 540,546 ****
  	return -1;
      }
  
!     if(!(dst = fopen(dstdb, "a"))) {
  	logg("!cdiff_cmd_move: Can't open %s for appending\n", dstdb);
  	free(start_str);
  	free(end_str);
--- 542,548 ----
  	return -1;
      }
  
!     if(!(dst = fopen(dstdb, "ab"))) {
  	logg("!cdiff_cmd_move: Can't open %s for appending\n", dstdb);
  	free(start_str);
  	free(end_str);
***************
*** 561,567 ****
  	return -1;
      }
  
!     if(!(tmp = fopen(tmpdb, "w"))) {
  	logg("!cdiff_cmd_move: Can't open file %s for writing\n", tmpdb);
  	free(start_str);
  	free(end_str);
--- 563,569 ----
  	return -1;
      }
  
!     if(!(tmp = fopen(tmpdb, "wb"))) {
  	logg("!cdiff_cmd_move: Can't open file %s for writing\n", tmpdb);
  	free(start_str);
  	free(end_str);
***************
*** 724,730 ****
  	return -1;
      }
  
!     if(!(fh = fdopen(desc, "r"))) {
  	logg("!cdiff_apply: fdopen() failed for descriptor %d\n", desc);
  	close(desc);
  	return -1;
--- 726,732 ----
  	return -1;
      }
  
!     if(!(fh = fdopen(desc, "rb"))) {
  	logg("!cdiff_apply: fdopen() failed for descriptor %d\n", desc);
  	close(desc);
  	return -1;
*** /home/njh/src/clamav-devel/./shared/network.h	2006-04-09 20:59:28.000000000 +0100
--- ./shared/network.h	2006-07-31 14:59:30.000000000 +0100
***************
*** 21,28 ****
--- 21,33 ----
  #ifndef __NETWORK_H
  #define __NETWORK_H
  
+ #ifdef	HAVE_SYS_TYPES_H
  #include <sys/types.h>
+ #endif
+ 
+ #ifndef	C_WINDOWS
  #include <netdb.h>
+ #endif
  
  int r_gethostbyname(const char *hostname, struct hostent *hp, char *buf, size_t len);
  
*** /home/njh/src/clamav-devel/./shared/output.c	2006-08-31 09:03:18.000000000 +0100
--- ./shared/output.c	2006-08-31 09:23:58.000000000 +0100
***************
*** 16,21 ****
--- 16,26 ----
   *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
   *  MA 02110-1301, USA.
   */
+ #ifdef        _MSC_VER
+ #include <windows.h>
+ #include <winsock.h>
+ #endif
+ 
  
  #if HAVE_CONFIG_H
  #include "clamav-config.h"
***************
*** 30,42 ****
--- 35,51 ----
  #include <stdlib.h>
  #include <string.h>
  #include <ctype.h>
+ #ifdef	HAVE_UNISTD_H
  #include <unistd.h>
+ #endif
  #include <fcntl.h>
  #include <time.h>
  #include <sys/stat.h>
  #include <errno.h>
+ #ifndef	C_WINDOWS
  #include <sys/time.h>
  #include <sys/socket.h>
+ #endif
  #if HAVE_SYS_TYPES_H
  #include <sys/types.h>
  #endif
***************
*** 122,128 ****
--- 131,139 ----
  int logg(const char *str, ...)
  {
  	va_list args, argscpy, argsout;
+ #ifdef	F_WRLCK
  	struct flock fl;
+ #endif
  	char *pt, *timestr, vbuff[1025];
  	time_t currtime;
  	struct stat sb;
***************
*** 140,146 ****
      if(logg_file) {
  	if(!logg_fd) {
  	    old_umask = umask(0037);
! 	    if((logg_fd = fopen(logg_file, "a")) == NULL) {
  		umask(old_umask);
  #ifdef CL_THREAD_SAFE
  		pthread_mutex_unlock(&logg_mutex);
--- 151,157 ----
      if(logg_file) {
  	if(!logg_fd) {
  	    old_umask = umask(0037);
! 	    if((logg_fd = fopen(logg_file, "at")) == NULL) {
  		umask(old_umask);
  #ifdef CL_THREAD_SAFE
  		pthread_mutex_unlock(&logg_mutex);
***************
*** 149,154 ****
--- 160,166 ----
  		return -1;
  	    } else umask(old_umask);
  
+ #ifdef	F_WRLCK
  	    if(logg_lock) {
  		memset(&fl, 0, sizeof(fl));
  		fl.l_type = F_WRLCK;
***************
*** 159,164 ****
--- 171,177 ----
  		    return -1;
  		}
  	    }
+ #endif
  	}
  
  	if(logg_size) {
*** /home/njh/src/clamav-devel/./shared/misc.c	2006-09-27 13:08:01.000000000 +0100
--- ./shared/misc.c	2006-09-17 16:55:56.000000000 +0100
***************
*** 37,52 ****
  #include <ctype.h>
  #include <errno.h>
  
! #include "shared/cfgparser.h"
! #include "shared/memory.h"
! #include "shared/output.h"
  
! #include "libclamav/clamav.h"
! #include "libclamav/cvd.h"
! 
! #ifndef	O_BINARY
! #define	O_BINARY	0
! #endif
  
  
  char *freshdbdir(void)
--- 37,48 ----
  #include <ctype.h>
  #include <errno.h>
  
! #include "clamav.h"
! #include "cfgparser.h"
! #include "memory.h"
! #include "output.h"
  
! #include "../libclamav/cvd.h"
  
  
  char *freshdbdir(void)
*** /home/njh/src/clamav-devel/./shared/cfgparser.c	2006-10-10 08:17:06.000000000 +0100
--- ./shared/cfgparser.c	2006-10-10 09:25:36.000000000 +0100
***************
*** 139,145 ****
  	}
      }
  
!     if((fs = fopen(cfgfile, "r")) == NULL) {
  	/* do not print error message here! */
  	freecfg(copt);
  	return NULL;
--- 139,145 ----
  	}
      }
  
!     if((fs = fopen(cfgfile, "rb")) == NULL) {
  	/* do not print error message here! */
  	freecfg(copt);
  	return NULL;
*** /home/njh/src/clamav-devel/./shared/memory.c	2006-04-09 20:59:28.000000000 +0100
--- ./shared/memory.c	2006-10-10 10:09:58.000000000 +0100
***************
*** 19,31 ****
--- 19,41 ----
  
  #include <stdio.h>
  #include <stdlib.h>
+ #ifdef	HAVE_UNISTD_H
  #include <unistd.h>
+ #endif
+ 
+ #if	defined(_MSC_VER) && defined(_DEBUG)
+ #include <crtdbg.h>
+ #endif
  
  void *mmalloc(size_t size)
  {
  	void *alloc;
  
+ #if defined(_MSC_VER) && defined(_DEBUG)
+     alloc = _malloc_dbg(size, _NORMAL_BLOCK, __FILE__, __LINE__);
+ #else
      alloc = malloc(size);
+ #endif
  
      if(!alloc) {
  	fprintf(stderr, "CRITICAL: Can't allocate memory (%ld bytes).\n", (long int) size);
***************
*** 38,44 ****
--- 48,58 ----
  {
  	void *alloc;
  
+ #if defined(_MSC_VER) && defined(_DEBUG)
+     alloc = _calloc_dbg(nmemb, size, _NORMAL_BLOCK, __FILE__, __LINE__);
+ #else
      alloc = calloc(nmemb, size);
+ #endif
  
      if(!alloc) {
  	fprintf(stderr, "CRITICAL: Can't allocate memory (%ld bytes).\n", (long int) nmemb * size);
*** /home/njh/src/clamav-devel/./shared/memory.h	2006-04-09 20:59:28.000000000 +0100
--- ./shared/memory.h	2006-10-10 10:16:24.000000000 +0100
***************
*** 25,28 ****
--- 25,33 ----
  void *mmalloc(size_t size);
  void *mcalloc(size_t nmemb, size_t size);
  
+ #ifdef	_DEBUG
+ #include <crtdbg.h>
+ #define	free(p)	_free_dbg(p, _NORMAL_BLOCK)
+ #endif
+ 
  #endif
*** /home/njh/src/clamav-devel/./freshclam/manager.c	2006-09-15 13:11:55.000000000 +0100
--- ./freshclam/manager.c	2006-09-17 11:23:36.000000000 +0100
***************
*** 20,25 ****
--- 20,29 ----
   *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
   *  MA 02110-1301, USA.
   */
+ #ifdef        _MSC_VER
+ #include <windows.h>
+ #include <winsock.h>
+ #endif
  
  #if HAVE_CONFIG_H
  #include "clamav-config.h"
***************
*** 27,40 ****
--- 31,50 ----
  
  #include <stdio.h>
  #include <stdlib.h>
+ #ifdef	HAVE_UNISTD_H
  #include <unistd.h>
+ #endif
  #include <string.h>
  #include <ctype.h>
+ #ifndef	C_WINDOWS
  #include <netinet/in.h>
  #include <netdb.h>
+ #endif
  #include <sys/types.h>
+ #ifndef	C_WINDOWS
  #include <sys/socket.h>
  #include <sys/time.h>
+ #endif
  #include <time.h>
  #include <fcntl.h>
  #include <sys/stat.h>
***************
*** 63,68 ****
--- 73,82 ----
  #define	O_BINARY	0
  #endif
  
+ #ifndef	C_WINDOWS
+ #define	closesocket(s)	close(s)
+ #endif
+ 
  
  static int wwwconnect(const char *server, const char *proxy, int pport, char *ip, const char *localip, int ctimeout)
  {
***************
*** 143,149 ****
--- 157,165 ----
  		else
  			port = 8080;
  
+ #ifndef	C_WINDOWS
  		endservent();
+ #endif
  #else
  		port = 8080;
  #endif
***************
*** 178,184 ****
  		break;
  	}
          logg("^Can't get information about %s: %s\n", hostpt, herr);
! 	close(socketfd);
  	return -1;
      }
  
--- 194,200 ----
  		break;
  	}
          logg("^Can't get information about %s: %s\n", hostpt, herr);
! 	closesocket(socketfd);
  	return -1;
      }
  
***************
*** 208,214 ****
  	}
      }
  
!     close(socketfd);
      return -2;
  }
  
--- 224,230 ----
  	}
      }
  
!     closesocket(socketfd);
      return -2;
  }
  
***************
*** 362,370 ****
      if(!ip[0])
  	strcpy(ip, ipaddr);
  
!     if(write(sd, cmd, strlen(cmd)) < 0) {
  	logg("!remote_cvdhead: write failed\n");
! 	close(sd);
  	return NULL;
      }
  
--- 378,386 ----
      if(!ip[0])
  	strcpy(ip, ipaddr);
  
!     if(send(sd, cmd, strlen(cmd), 0) < 0) {
  	logg("!remote_cvdhead: write failed\n");
! 	closesocket(sd);
  	return NULL;
      }
  
***************
*** 380,386 ****
  	if(cnt <= 0)
  	    break;
      }
!     close(sd);
  
      if(bread == -1) {
  	logg("!remote_cvdhead: Error while reading CVD header from %s\n", hostname);
--- 396,402 ----
  	if(cnt <= 0)
  	    break;
      }
!     closesocket(sd);
  
      if(bread == -1) {
  	logg("!remote_cvdhead: Error while reading CVD header from %s\n", hostname);
***************
*** 498,504 ****
      if(!ip[0])
  	strcpy(ip, ipaddr);
  
!     if(write(sd, cmd, strlen(cmd)) < 0) {
  	logg("!getfile: Can't write to socket\n");
  	return 52;
      }
--- 514,520 ----
      if(!ip[0])
  	strcpy(ip, ipaddr);
  
!     if(send(sd, cmd, strlen(cmd), 0) < 0) {
  	logg("!getfile: Can't write to socket\n");
  	return 52;
      }
***************
*** 536,542 ****
      /* check whether the resource actually existed or not */
      if((strstr(buffer, "HTTP/1.1 404")) != NULL || (strstr(buffer, "HTTP/1.0 404")) != NULL) { 
  	logg("!getfile: %s not found on remote server\n", srcfile);
! 	close(sd);
  	return 58;
      }
  
--- 552,558 ----
      /* check whether the resource actually existed or not */
      if((strstr(buffer, "HTTP/1.1 404")) != NULL || (strstr(buffer, "HTTP/1.0 404")) != NULL) { 
  	logg("!getfile: %s not found on remote server\n", srcfile);
! 	closesocket(sd);
  	return 58;
      }
  
***************
*** 565,571 ****
  	getcwd(currdir, sizeof(currdir));
  	logg("!getfile: Can't create new file %s in %s\n", destfile, currdir);
  	logg("Hint: The database directory must be writable for UID %d or GID %d\n", getuid(), getgid());
! 	close(sd);
  	return 57;
      }
  
--- 581,587 ----
  	getcwd(currdir, sizeof(currdir));
  	logg("!getfile: Can't create new file %s in %s\n", destfile, currdir);
  	logg("Hint: The database directory must be writable for UID %d or GID %d\n", getuid(), getgid());
! 	closesocket(sd);
  	return 57;
      }
  
***************
*** 578,584 ****
  	    logg("getfile: Can't write %d bytes to %s\n", bread, destfile);
  	    unlink(destfile);
  	    close(fd);
! 	    close(sd);
  	    return 57; /* FIXME */
  	}
  
--- 594,600 ----
  	    logg("getfile: Can't write %d bytes to %s\n", bread, destfile);
  	    unlink(destfile);
  	    close(fd);
! 	    closesocket(sd);
  	    return 57; /* FIXME */
  	}
  
***************
*** 595,601 ****
              fflush(stdout);
          }
      }
!     close(sd);
      close(fd);
  
      if(totalsize > 0)
--- 611,617 ----
              fflush(stdout);
          }
      }
!     closesocket(sd);
      close(fd);
  
      if(totalsize > 0)
***************
*** 722,728 ****
          return ret;
      }
  
!     if((fd = open(tempname, O_RDONLY)) == -1) {
  	logg("!getpatch: Can't open %s for reading\n", tempname);
          unlink(tempname);
          free(tempname);
--- 738,744 ----
          return ret;
      }
  
!     if((fd = open(tempname, O_RDONLY|O_BINARY)) == -1) {
  	logg("!getpatch: Can't open %s for reading\n", tempname);
          unlink(tempname);
          free(tempname);
***************
*** 971,979 ****
  	char ipaddr[16], *dnsreply = NULL, *pt, *localip = NULL, *newver = NULL;
  	const char *arg = NULL;
  	struct cfgstruct *cpt;
- #ifdef HAVE_RESOLV_H
  	const char *dnsdbinfo;
- #endif
  
      time(&currtime);
      logg("ClamAV update process started at %s", ctime(&currtime));
--- 987,993 ----
***************
*** 983,989 ****
      logg("See the FAQ at http://www.clamav.net/faq.html for an explanation.\n");
  #endif
  
- #ifdef HAVE_RESOLV_H
      dnsdbinfo = cfgopt(copt, "DNSDatabaseInfo")->strarg;
  
      if(opt_check(opt, "no-dns")) {
--- 997,1002 ----
***************
*** 1042,1052 ****
  	    }
  	}
  
! 	if(!dnsreply) {
  	    logg("^Invalid DNS reply. Falling back to HTTP mode.\n");
  	}
      }
- #endif /* HAVE_RESOLV_H */
  
      if(opt_check(opt, "local-address")) {
          localip = opt_arg(opt, "local-address");
--- 1055,1064 ----
  	    }
  	}
  
! 	if((!dnsreply) && (!ttl)) {
  	    logg("^Invalid DNS reply. Falling back to HTTP mode.\n");
  	}
      }
  
      if(opt_check(opt, "local-address")) {
          localip = opt_arg(opt, "local-address");
*** /home/njh/src/clamav-devel/./freshclam/execute.c	2006-08-31 08:38:17.000000000 +0100
--- ./freshclam/execute.c	2006-10-06 23:03:52.000000000 +0100
***************
*** 1,5 ****
  /*
!  *  By Per Jessen <per@computer.org>
   *
   *  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
--- 1,5 ----
  /*
!  *  By Per Jessen <per@computer.org> with changes by the ClamAV team
   *
   *  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
***************
*** 23,31 ****
--- 23,36 ----
  
  #include <stdio.h>
  #include <stdlib.h>
+ #ifdef	HAVE_UNISTD_H
  #include <unistd.h>
+ #endif
  #include <string.h>
  #include <errno.h>
+ #ifdef	C_WINDOWS
+ #include <process.h>
+ #endif
  
  #include "shared/output.h"
  
***************
*** 35,40 ****
--- 40,55 ----
  
  void execute( const char *type, const char *text )
  {
+ #ifdef        C_WINDOWS
+ 	if(active_children < MAX_CHILDREN) {
+ 		if(spawnlp(P_DETACH, text, text, NULL) == -1) {
+ 			logg("^%s: couldn't execute \"%s\".\n", type, text);
+ 			return;
+ 		}
+ 		active_children++;	/* FIXME: this is never reduced */
+ 	} else
+ 		logg("^%s: already %d processes active.\n", type, active_children);
+ #else
  	pid_t pid;
  
  	if ( active_children<MAX_CHILDREN )
***************
*** 55,58 ****
--- 70,74 ----
  	{
  		logg("^%s: already %d processes active.\n", type, active_children);
  	}
+ #endif
  }
*** /home/njh/src/clamav-devel/./freshclam/nonblock.c	2006-09-15 13:11:55.000000000 +0100
--- ./freshclam/nonblock.c	2006-09-15 13:11:28.000000000 +0100
***************
*** 15,20 ****
--- 15,23 ----
   *  along with this program; if not, write to the Free Software
   *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
   */
+ #ifdef	_MSC_VER
+ #include <winsock.h>
+ #endif
  
  #if HAVE_CONFIG_H
  #include "clamav-config.h"
***************
*** 24,37 ****
  
  #include <stdio.h>
  #include <stdlib.h>
  #include <unistd.h>
  #include <string.h>
  #include <ctype.h>
  #include <netinet/in.h>
  #include <netdb.h>
  #include <sys/types.h>
! #include <sys/socket.h>
  #include <sys/time.h>
  #include <time.h>
  #include <fcntl.h>
  #include <sys/stat.h>
--- 27,46 ----
  
  #include <stdio.h>
  #include <stdlib.h>
+ #ifdef	HAVE_UNISTD_H
  #include <unistd.h>
+ #endif
  #include <string.h>
  #include <ctype.h>
+ #ifndef	C_WINDOWS
  #include <netinet/in.h>
  #include <netdb.h>
+ #endif
  #include <sys/types.h>
! /*#include <sys/socket.h>	/* in nonblock.h */
! #ifndef	C_WINDOWS
  #include <sys/time.h>
+ #endif
  #include <time.h>
  #include <fcntl.h>
  #include <sys/stat.h>
***************
*** 40,45 ****
--- 49,64 ----
  
  #include "shared/output.h"
  
+ #if	(!defined(EALREADY)) && (defined(WSAEALREADY))
+ #define EALREADY	WSAEALREADY
+ #endif
+ #if	(!defined(EINPROGRESS)) && (defined(WSAEINPROGRESS))
+ #define EINPROGRESS	WSAEINPROGRESS
+ #endif
+ #if	(!defined(EISCONN)) && (defined(WSAEISCONN))
+ #define EISCONN	WSAEISCONN
+ #endif
+ 
  #ifdef SO_ERROR
  
  #ifndef timercmp
***************
*** 229,234 ****
--- 248,254 ----
  
  static long nonblock_fcntl(int sock)
  {
+ #ifdef	F_GETFL
  	long fcntl_flags; /* Save fcntl() flags */
  
  	fcntl_flags = fcntl(sock, F_GETFL, 0);
***************
*** 242,257 ****
--- 262,282 ----
  	}
  
  	return fcntl_flags;
+ #else
+ 	return 0;
+ #endif
  }
  
  static void restore_fcntl(int sock, long fcntl_flags)
  {
+ #ifdef	F_SETFL
  	if (fcntl_flags != -1) {
  		if (fcntl(sock, F_SETFL, fcntl_flags)) {
  			logg("restore_fcntl: restoring: fcntl(%d, F_SETFL): errno=%d: %s\n",
  			     sock, errno, strerror(errno));
  		}
  	}
+ #endif
  }
  
  /*
*** /home/njh/src/clamav-devel/./freshclam/nonblock.h	2006-09-04 09:24:02.000000000 +0100
--- ./freshclam/nonblock.h	2006-09-04 09:35:10.000000000 +0100
***************
*** 24,30 ****
--- 24,32 ----
  #endif
  
  #include <sys/types.h>
+ #ifndef	C_WINDOWS
  #include <sys/socket.h>
+ #endif
  
  /*
  	wait_connect(): wrapper for connect(), with explicit 'secs' timeout
*** /home/njh/src/clamav-devel/./freshclam/notify.c	2006-08-31 08:53:35.000000000 +0100
--- ./freshclam/notify.c	2006-08-31 09:26:34.000000000 +0100
***************
*** 16,21 ****
--- 16,26 ----
   *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
   *  MA 02110-1301, USA.
   */
+ #ifdef        _MSC_VER
+ #include <windows.h>
+ #include <winsock.h>
+ #endif
+ 
  
  #if HAVE_CONFIG_H
  #include "clamav-config.h"
***************
*** 24,45 ****
--- 29,60 ----
  #ifdef BUILD_CLAMD
  
  #include <stdio.h>
+ #ifdef	HAVE_UNISTD_H
  #include <unistd.h>
+ #endif
  #include <sys/types.h>
+ #ifndef	C_WINDOWS
  #include <sys/socket.h>
  #include <sys/un.h>
  #include <netinet/in.h>
  #include <arpa/inet.h>
  #include <netdb.h>
+ #endif
  #include <string.h>
  
  #include "shared/cfgparser.h"
  #include "shared/output.h"
  
+ #ifndef	C_WINDOWS
+ #define	closesocket(s)	close(s)
+ #endif
+ 
  int notify(const char *cfgfile)
  {
  	char buff[20];
+ #ifndef	C_WINDOWS
  	struct sockaddr_un server;
+ #endif
          struct sockaddr_in server2;
  	struct hostent *he;
  	struct cfgstruct *copt, *cpt;
***************
*** 52,57 ****
--- 67,73 ----
  	return 1;
      }
  
+ #ifndef	C_WINDOWS
      if((cpt = cfgopt(copt, "LocalSocket"))->enabled) {
  	socktype = "UNIX";
  	server.sun_family = AF_UNIX;
***************
*** 64,76 ****
  	}
  
  	if(connect(sockd, (struct sockaddr *) &server, sizeof(struct sockaddr_un)) < 0) {
! 	    close(sockd);
  	    logg("^Clamd was NOT notified: Can't connect to clamd through %s\n", cpt->strarg);
  	    perror("connect()");
  	    return 1;
  	}
  
!     } else if((cpt = cfgopt(copt, "TCPSocket"))->enabled) {
  
  	socktype = "TCP";
  #ifdef PF_INET
--- 80,94 ----
  	}
  
  	if(connect(sockd, (struct sockaddr *) &server, sizeof(struct sockaddr_un)) < 0) {
! 	    closesocket(sockd);
  	    logg("^Clamd was NOT notified: Can't connect to clamd through %s\n", cpt->strarg);
  	    perror("connect()");
  	    return 1;
  	}
  
!     } else
! #endif
!     if((cpt = cfgopt(copt, "TCPSocket"))->enabled) {
  
  	socktype = "TCP";
  #ifdef PF_INET
***************
*** 98,104 ****
  
  
  	if(connect(sockd, (struct sockaddr *) &server2, sizeof(struct sockaddr_in)) < 0) {
! 	    close(sockd);
  	    logg("^Clamd was NOT notified: Can't connect to clamd on %s:%d\n",
  		    inet_ntoa(server2.sin_addr), ntohs(server2.sin_port));
  	    perror("connect()");
--- 116,122 ----
  
  
  	if(connect(sockd, (struct sockaddr *) &server2, sizeof(struct sockaddr_in)) < 0) {
! 	    closesocket(sockd);
  	    logg("^Clamd was NOT notified: Can't connect to clamd on %s:%d\n",
  		    inet_ntoa(server2.sin_addr), ntohs(server2.sin_port));
  	    perror("connect()");
***************
*** 110,132 ****
  	return 1;
      }
  
!     if(write(sockd, "RELOAD", 6) < 0) {
  	logg("^Clamd was NOT notified: Could not write to %s socket\n", socktype);
  	perror("write()");
! 	close(sockd);
  	return 1;
      }
  
      /* TODO: Handle timeout */
      memset(buff, 0, sizeof(buff));
!     if((bread = read(sockd, buff, sizeof(buff))) > 0)
  	if(!strstr(buff, "RELOADING")) {
  	    logg("^Clamd was NOT notified: Unknown answer from clamd: '%s'\n", buff);
! 	    close(sockd);
  	    return 1;
  	}
  
!     close(sockd);
      logg("Clamd successfully notified about the update.\n");
      return 0;
  }
--- 128,150 ----
  	return 1;
      }
  
!     if(send(sockd, "RELOAD", 6, 0) < 0) {
  	logg("^Clamd was NOT notified: Could not write to %s socket\n", socktype);
  	perror("write()");
! 	closesocket(sockd);
  	return 1;
      }
  
      /* TODO: Handle timeout */
      memset(buff, 0, sizeof(buff));
!     if((bread = recv(sockd, buff, sizeof(buff), 0)) > 0)
  	if(!strstr(buff, "RELOADING")) {
  	    logg("^Clamd was NOT notified: Unknown answer from clamd: '%s'\n", buff);
! 	    closesocket(sockd);
  	    return 1;
  	}
  
!     closesocket(sockd);
      logg("Clamd successfully notified about the update.\n");
      return 0;
  }
*** /home/njh/src/clamav-devel/./clamd/clamd.c	2006-09-15 13:30:20.000000000 +0100
--- ./clamd/clamd.c	2006-09-15 13:29:56.000000000 +0100
***************
*** 16,22 ****
   *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
   *  MA 02110-1301, USA.
   */
! 
  #ifdef	_MSC_VER
  #include <winsock.h>
  #endif
--- 16,22 ----
   *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
   *  MA 02110-1301, USA.
   */
!  
  #ifdef	_MSC_VER
  #include <winsock.h>
  #endif
*** /home/njh/src/clamav-devel/./clamd/localserver.c	2006-09-13 18:50:46.000000000 +0100
--- ./clamd/localserver.c	2006-09-13 20:15:20.000000000 +0100
***************
*** 24,32 ****
--- 24,36 ----
  #include <stdio.h>
  #include <string.h>
  #include <sys/types.h>
+ #ifndef	C_WINDOWS
  #include <sys/socket.h>
+ #endif
  #include <sys/stat.h>
+ #ifndef	C_WINDOWS
  #include <sys/un.h>
+ #endif
  #include <errno.h>
  
  #include "libclamav/clamav.h"
*** /home/njh/src/clamav-devel/./clamdscan/clamdscan.c	2006-05-15 19:30:18.000000000 +0100
--- ./clamdscan/clamdscan.c	2006-08-04 11:37:50.000000000 +0100
***************
*** 16,21 ****
--- 16,26 ----
   *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
   *  MA 02110-1301, USA.
   */
+  
+ #ifdef	_MSC_VER
+ #include <windows.h>
+ #include <winsock.h>
+ #endif
  
  #if HAVE_CONFIG_H
  #include "clamav-config.h"
***************
*** 24,31 ****
--- 29,44 ----
  #include <stdio.h>
  #include <string.h>
  #include <stdlib.h>
+ #ifdef	HAVE_UNISTD_H
  #include <unistd.h>
+ #endif
+ #ifdef	C_WINDOWS
+ #ifdef	CL_THREAD_SAFE
+ #include <pthread.h>
+ #endif
+ #else
  #include <sys/time.h>
+ #endif
  #include <time.h>
  #include <signal.h>
  
***************
*** 49,62 ****
  {
  	int ds, dms, ret, infected;
  	struct timeval t1, t2;
  	struct timezone tz;
  	time_t starttime;
  	struct optstruct *opt;
  	char *clamdscan_accepted[] = { "help", "version", "verbose", "quiet",
  				  "stdout", "log", "move", "remove",
  				  "config-file", "no-summary",
  				  "disable-summary", NULL };
! 
  
      opt = opt_parse(argc, argv, clamscan_shortopt, clamscan_longopt, clamdscan_accepted);
      if(!opt) {
--- 62,83 ----
  {
  	int ds, dms, ret, infected;
  	struct timeval t1, t2;
+ #ifndef	C_WINDOWS
  	struct timezone tz;
+ #endif
  	time_t starttime;
  	struct optstruct *opt;
  	char *clamdscan_accepted[] = { "help", "version", "verbose", "quiet",
  				  "stdout", "log", "move", "remove",
  				  "config-file", "no-summary",
  				  "disable-summary", NULL };
! 				  
! #ifdef	C_WINDOWS
! 	if(!pthread_win32_process_attach_np()) {
! 		mprintf("!Can't start the win32 pthreads layer\n");
! 		return 1;
! 	}
! #endif
  
      opt = opt_parse(argc, argv, clamscan_shortopt, clamscan_longopt, clamdscan_accepted);
      if(!opt) {
***************
*** 105,117 ****
      time(&starttime);
      /* ctime() does \n, but I need it once more */
  
!     gettimeofday(&t1, &tz);
  
      ret = client(opt, &infected);
  
      /* TODO: Implement STATUS in clamd */
      if(!opt_check(opt, "disable-summary") && !opt_check(opt, "no-summary")) {
  	gettimeofday(&t2, &tz);
  	ds = t2.tv_sec - t1.tv_sec;
  	dms = t2.tv_usec - t1.tv_usec;
  	ds -= (dms < 0) ? (1):(0);
--- 126,146 ----
      time(&starttime);
      /* ctime() does \n, but I need it once more */
  
! #ifdef	C_WINDOWS
! 	gettimeofday(&t1, NULL);
! #else
! 	gettimeofday(&t1, &tz);
! #endif
  
      ret = client(opt, &infected);
  
      /* TODO: Implement STATUS in clamd */
      if(!opt_check(opt, "disable-summary") && !opt_check(opt, "no-summary")) {
+ #ifdef	C_WINDOWS
+ 	gettimeofday(&t2, NULL);
+ #else
  	gettimeofday(&t2, &tz);
+ #endif
  	ds = t2.tv_sec - t1.tv_sec;
  	dms = t2.tv_usec - t1.tv_usec;
  	ds -= (dms < 0) ? (1):(0);
***************
*** 128,133 ****
--- 157,171 ----
      }
  
      opt_free(opt);
+ 
+ #ifdef	C_WINDOWS
+ 	WSACleanup();
+ 	if(!pthread_win32_process_detach_np()) {
+ 		mprintf("!Can't stop the win32 pthreads layer\n");
+ 		return 1;
+ 	}
+ #endif
+ 
      exit(ret);
  }
  
*** /home/njh/src/clamav-devel/./clamdscan/client.c	2006-09-12 09:09:03.000000000 +0100
--- ./clamdscan/client.c	2006-09-12 10:37:54.000000000 +0100
***************
*** 16,37 ****
--- 16,44 ----
   *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
   *  MA 02110-1301, USA.
   */
+ #ifdef	_MSC_VER
+ #include <winsock.h>
+ #endif
  
  #if HAVE_CONFIG_H
  #include "clamav-config.h"
  #endif
  
  #include <stdio.h>
+ #ifdef	HAVE_UNISTD_H
  #include <unistd.h>
+ #endif
  #include <string.h>
  #include <sys/types.h>
  #include <sys/stat.h>
+ #ifndef	C_WINDOWS
  #include <sys/socket.h>
  #include <sys/un.h>
  #include <netinet/in.h>
  #include <arpa/inet.h>
  #include <netdb.h>
  #include <utime.h>
+ #endif
  #include <errno.h>
  
  #ifdef HAVE_SYS_UIO_H
***************
*** 54,65 ****
--- 61,140 ----
  # define SOCKET_INET	AF_INET
  #endif
  
+ #ifndef	C_WINDOWS
+ #define	closesocket(s)	close(s)
+ #endif
+ 
  /* #define ENABLE_FD_PASSING	    FIXME: Doesn't work yet */
  
  void move_infected(const char *filename, const struct optstruct *opt);
  int notremoved = 0, notmoved = 0;
  static int hwaccel = 0;
  
+ #ifdef	C_WINDOWS
+ static  int     get_a_line(int sockd, char *buf, size_t len);
+ 
+ static int
+ dsresult(int sockd, const struct optstruct *opt)
+ {
+ 	char buff[BUFSIZ], *pt;
+ 	int infected = 0, waserror = 0;
+ 
+ 	while(get_a_line(sockd, buff, sizeof(buff))) {
+ 		if(strstr(buff, "FOUND\n")) {
+ 			infected++;
+ 			logg("%s", buff);
+ 			if(opt_check(opt, "move")) {
+ 				/* filename: Virus FOUND */
+ 				if((pt = strrchr(buff, ':'))) {
+ 					*pt = 0;
+ 					move_infected(buff, opt);
+ 				} else
+ 					mprintf("@Broken data format. File not moved.\n");
+ 			} else if(opt_check(opt, "remove")) {
+ 				if(!(pt = strrchr(buff, ':')))
+ 					mprintf("@Broken data format. File not removed.\n");
+ 				else {
+ 					*pt = 0;
+ 					if(unlink(buff)) {
+ 						mprintf("%s: Can't remove.\n", buff);
+ 						logg("%s: Can't remove.\n", buff);
+ 						notremoved++;
+ 					} else {
+ 						mprintf("%s: Removed.\n", buff);
+ 						logg("%s: Removed.\n", buff);
+ 					}
+ 				}
+ 			}
+ 		}
+ 
+ 		if(strstr(buff, "ERROR\n")) {
+ 			logg("%s", buff);
+ 			waserror = 1;
+ 		}
+ 	}
+ 
+ 	return infected ? infected : (waserror ? -1 : 0);
+ }
+ 
+ static int
+ get_a_line(int sockd, char *buf, size_t len)
+ {
+ 	char *ptr;
+ 
+ 	for(ptr = buf; ptr < &buf[len]; ptr++) {
+ 		/* FIXME: very inefficient to call recv so many times */
+ 		if(recv(sockd, ptr, sizeof(char), 0) <= 0)
+ 			return 0;
+ 		if(*ptr == '\n') {
+ 			*++ptr = '\0';
+ 			return 1;
+ 		}
+ 	}
+ 	return 1;
+ }
+ 
+ #else
  static int dsresult(int sockd, const struct optstruct *opt)
  {
  	int infected = 0, waserror = 0;
***************
*** 67,76 ****
  	FILE *fd;
  
  
! #ifndef C_OS2
      if((fd = fdopen(dup(sockd), "r")) == NULL) {
! #else /* FIXME: accoriding to YD OS/2 does not support dup() for sockets */
!     if((fd = fdopen(sockd, "r")) == NULL) {
  #endif
  	logg("^Can't open descriptor for reading.\n");
  	return -1;
--- 142,151 ----
  	FILE *fd;
  
  
! #ifndef (C_OS2)
      if((fd = fdopen(dup(sockd), "r")) == NULL) {
! #else /* FIXME: according to YD OS/2 does not support dup() for sockets */
!     if((fd = fdopen(sockd, "rb")) == NULL) {
  #endif
  	logg("^Can't open descriptor for reading.\n");
  	return -1;
***************
*** 118,123 ****
--- 193,199 ----
  
      return infected ? infected : (waserror ? -1 : 0);
  }
+ #endif	/* C_WINDOWS */
  
  static int dsfile(int sockd, const char *scantype, const char *filename, const struct optstruct *opt)
  {
***************
*** 128,134 ****
      scancmd = mcalloc(strlen(filename) + 20, sizeof(char));
      sprintf(scancmd, "%s %s", scantype, filename);
  
!     if(write(sockd, scancmd, strlen(scancmd)) <= 0) {
  	logg("^Can't write to the socket.\n");
  	free(scancmd);
  	return -1;
--- 204,210 ----
      scancmd = mcalloc(strlen(filename) + 20, sizeof(char));
      sprintf(scancmd, "%s %s", scantype, filename);
  
!     if(send(sockd, scancmd, strlen(scancmd), 0) <= 0) {
  	logg("^Can't write to the socket.\n");
  	free(scancmd);
  	return -1;
***************
*** 202,208 ****
  	char buff[4096], *pt;
  
  
!     if(write(sockd, "STREAM", 6) <= 0) {
  	logg("^Can't write to the socket.\n");
  	return 2;
      }
--- 278,284 ----
  	char buff[4096], *pt;
  
  
!     if(send(sockd, "STREAM", 6, 0) <= 0) {
  	logg("^Can't write to the socket.\n");
  	return 2;
      }
***************
*** 312,318 ****
--- 388,396 ----
  
  static int dconnect(const struct optstruct *opt)
  {
+ #ifndef	C_WINDOWS
  	struct sockaddr_un server;
+ #endif
  	struct sockaddr_in server2;
  	struct hostent *he;
  	struct cfgstruct *copt, *cpt;
***************
*** 328,341 ****
  	return -1;
      }
  
      memset((char *) &server, 0, sizeof(server));
      memset((char *) &server2, 0, sizeof(server2));
  
      /* Set default address to connect to */
      server2.sin_addr.s_addr = inet_addr("127.0.0.1");    
  
-     if((cpt = cfgopt(copt, "LocalSocket"))->enabled) {
  
  	server.sun_family = AF_UNIX;
  	strncpy(server.sun_path, cpt->strarg, sizeof(server.sun_path));
  
--- 406,424 ----
  	return -1;
      }
  
+ #ifndef	C_WINDOWS
      memset((char *) &server, 0, sizeof(server));
+ #endif
      memset((char *) &server2, 0, sizeof(server2));
  
      /* Set default address to connect to */
      server2.sin_addr.s_addr = inet_addr("127.0.0.1");    
  
  
+     if((cpt = cfgopt(copt, "LocalSocket"))->enabled) {
+ #ifdef	C_WINDOWS
+ 	logg("^LocalSocket is not supported under Windows");
+ #else
  	server.sun_family = AF_UNIX;
  	strncpy(server.sun_path, cpt->strarg, sizeof(server.sun_path));
  
***************
*** 353,360 ****
--- 436,452 ----
  	    freecfg(copt);
  	    return -1;
  	}
+ #endif
  
      } else if((cpt = cfgopt(copt, "TCPSocket"))->enabled) {
+ #ifdef  C_WINDOWS
+                 WSADATA wsaData;
+ 
+                 if(WSAStartup(MAKEWORD(2,2), &wsaData) != NO_ERROR) {
+                         logg("!Error at WSAStartup(): %d\n", WSAGetLastError());
+                         return -1;
+                 }
+ #endif
  
  	if((sockd = socket(SOCKET_INET, SOCK_STREAM, 0)) < 0) {
  	    perror("socket()");
***************
*** 368,374 ****
  
  	if((cpt = cfgopt(copt, "TCPAddr"))->enabled) {
  	    if ((he = gethostbyname(cpt->strarg)) == 0) {
! 		close(sockd);
  		perror("gethostbyname()");
  		logg("^Can't lookup clamd hostname.\n");
  		freecfg(copt);
--- 460,466 ----
  
  	if((cpt = cfgopt(copt, "TCPAddr"))->enabled) {
  	    if ((he = gethostbyname(cpt->strarg)) == 0) {
! 		closesocket(sockd);
  		perror("gethostbyname()");
  		logg("^Can't lookup clamd hostname.\n");
  		freecfg(copt);
***************
*** 378,384 ****
  	}
  
  	if(connect(sockd, (struct sockaddr *) &server2, sizeof(struct sockaddr_in)) < 0) {
! 	    close(sockd);
  	    perror("connect()");
  	    logg("^Can't connect to clamd.\n");
  	    freecfg(copt);
--- 470,476 ----
  	}
  
  	if(connect(sockd, (struct sockaddr *) &server2, sizeof(struct sockaddr_in)) < 0) {
! 	    closesocket(sockd);
  	    perror("connect()");
  	    logg("^Can't connect to clamd.\n");
  	    freecfg(copt);
***************
*** 433,439 ****
  	else
  	    errors++;
  
! 	close(sockd);
  
  #if defined(ENABLE_FD_PASSING) && defined(HAVE_SENDMSG) && (defined(HAVE_ACCRIGHTS_IN_MSGHDR) || defined(HAVE_CONTROL_IN_MSGHDR)) && !defined(C_CYGWIN)
      } else if(!strcmp(opt->filename, "-")) { /* scan data from stdin */
--- 525,531 ----
  	else
  	    errors++;
  
! 	closesocket(sockd);
  
  #if defined(ENABLE_FD_PASSING) && defined(HAVE_SENDMSG) && (defined(HAVE_ACCRIGHTS_IN_MSGHDR) || defined(HAVE_CONTROL_IN_MSGHDR)) && !defined(C_CYGWIN)
      } else if(!strcmp(opt->filename, "-")) { /* scan data from stdin */
***************
*** 494,500 ****
  			else
  			    errors++;
  
! 			close(sockd);
  			break;
  
  		    default:
--- 586,592 ----
  			else
  			    errors++;
  
! 			closesocket(sockd);
  			break;
  
  		    default:
***************
*** 515,521 ****
--- 607,615 ----
  	char *movedir, *movefilename, *tmp, numext[4 + 1];
  	struct stat fstat, mfstat;
  	int n, len, movefilename_size;
+ #ifndef	C_WINDOWS
  	struct utimbuf ubuf;
+ #endif
  
  
      if(!(movedir = opt_arg(opt, "move"))) {
***************
*** 600,608 ****
--- 694,704 ----
  	chmod(movefilename, fstat.st_mode);
  	chown(movefilename, fstat.st_uid, fstat.st_gid);
  
+ #ifndef	C_WINDOWS
  	ubuf.actime = fstat.st_atime;
  	ubuf.modtime = fstat.st_mtime;
  	utime(movefilename, &ubuf);
+ #endif
  
  	if(unlink(filename)) {
  	    logg("^cannot unlink '%s': %s\n", filename, strerror(errno));
*** /home/njh/src/clamav-devel/./clamconf/clamconf.c	2006-09-15 13:38:59.000000000 +0100
--- ./clamconf/clamconf.c	2006-09-15 13:38:42.000000000 +0100
***************
*** 26,32 ****
--- 26,34 ----
  #include <string.h>
  #include <sys/types.h>
  #include <sys/stat.h>
+ #ifdef	HAVE_UNISTD_H
  #include <unistd.h>
+ #endif
  
  #include "cfgparser.h"
  #define _GNU_SOURCE
*** /home/njh/src/clamav-devel/./sigtool/sigtool.c	2006-09-27 11:29:31.000000000 +0100
--- ./sigtool/sigtool.c	2006-09-13 17:48:54.000000000 +0100
***************
*** 270,276 ****
  	int i;
  	struct stat sb;
  	char file[32], *md5;
! 	char *extlist[] = { "db", "fp", "hdb", "mdb", "ndb", "pdb", "rmd", "zmd", "sdb", NULL };
  
  
      snprintf(file, sizeof(file), "%s.info", db);
--- 270,276 ----
  	int i;
  	struct stat sb;
  	char file[32], *md5;
! 	char *extlist[] = { "db", "fp", "hdb", "ndb", "rmd", "zmd", "sdb", NULL };
  
  
      snprintf(file, sizeof(file), "%s.info", db);
***************
*** 345,353 ****
  
      if(stat("main.db", &foo) == -1 && stat("daily.db", &foo) == -1 &&
         stat("main.hdb", &foo) == -1 && stat("daily.hdb", &foo) == -1 &&
-        stat("main.mdb", &foo) == -1 && stat("daily.mdb", &foo) == -1 &&
         stat("main.ndb", &foo) == -1 && stat("daily.ndb", &foo) == -1 &&
-        stat("main.pdb", &foo) == -1 && stat("daily.pdb", &foo) == -1 &&
         stat("main.sdb", &foo) == -1 && stat("daily.sdb", &foo) == -1 &&
         stat("main.zmd", &foo) == -1 && stat("daily.zmd", &foo) == -1 &&
         stat("main.rmd", &foo) == -1 && stat("daily.rmd", &foo) == -1)
--- 345,351 ----
***************
*** 368,374 ****
      } else {
  	lines = countlines("main.db") + countlines("daily.db") +
  		countlines("main.hdb") + countlines("daily.hdb") +
- 		countlines("main.mdb") + countlines("daily.mdb") +
  		countlines("main.ndb") + countlines("daily.ndb") +
  		countlines("main.sdb") + countlines("daily.sdb") +
  		countlines("main.zmd") + countlines("daily.zmd") +
--- 366,371 ----
***************
*** 484,493 ****
  				 "main.ndb", "daily.ndb", "main.sdb",
  				 "daily.sdb", "main.zmd", "daily.zmd",
  				 "main.rmd", "daily.rmd", "main.fp",
! 				 "daily.fp", "main.mdb", "daily.mdb",
! 				 "daily.info", "main.info", "main.wdb",
! 				 "daily.wdb", "main.pdb", "daily.pdb",
! 				 NULL };
  		args[2] = tarfile;
  		if(!opt_check(opt, "debug")) {
  		    if((dn = open("/dev/null", O_WRONLY)) == -1) {
--- 481,487 ----
  				 "main.ndb", "daily.ndb", "main.sdb",
  				 "daily.sdb", "main.zmd", "daily.zmd",
  				 "main.rmd", "daily.rmd", "main.fp",
! 				 "daily.fp", "daily.info", "main.info", NULL };
  		args[2] = tarfile;
  		if(!opt_check(opt, "debug")) {
  		    if((dn = open("/dev/null", O_WRONLY)) == -1) {
***************
*** 818,824 ****
  	    if(strcmp(dent->d_name, ".") && strcmp(dent->d_name, "..") &&
  	    (cli_strbcasestr(dent->d_name, ".db")  ||
  	     cli_strbcasestr(dent->d_name, ".hdb") ||
- 	     cli_strbcasestr(dent->d_name, ".mdb") ||
  	     cli_strbcasestr(dent->d_name, ".ndb") ||
  	     cli_strbcasestr(dent->d_name, ".sdb") ||
  	     cli_strbcasestr(dent->d_name, ".zmd") ||
--- 812,817 ----
***************
*** 946,952 ****
  	    mprintf("%s\n", start);
  	}
  
!     } else if(cli_strbcasestr(filename, ".hdb") || cli_strbcasestr(filename, ".mdb")) { /* hash database */
  
  	while(fgets(buffer, FILEBUFF, fd)) {
  	    line++;
--- 939,945 ----
  	    mprintf("%s\n", start);
  	}
  
!     } else if(cli_strbcasestr(filename, ".hdb")) { /* hash database */
  
  	while(fgets(buffer, FILEBUFF, fd)) {
  	    line++;
*** /home/njh/src/clamav-devel/./sigtool/vba.c	2006-04-09 20:59:28.000000000 +0100
--- ./sigtool/vba.c	2006-08-04 13:32:54.000000000 +0100
***************
*** 17,30 ****
--- 17,38 ----
   *  MA 02110-1301, USA.
   */
  
+ #if HAVE_CONFIG_H
+ #include "clamav-config.h"
+ #endif
+ 
  #include <stdio.h>
  #include <string.h>
  #include <stdlib.h>
+ #ifdef	HAVE_UNISTD_H
  #include <unistd.h>
+ #endif
  #include <sys/types.h>
  #include <sys/stat.h>
  #include <fcntl.h>
+ #ifndef	C_WINDOWS
  #include <dirent.h>
+ #endif
  #include <clamav.h>
  #include <ctype.h>
  
***************
*** 963,969 ****
--- 971,981 ----
  
      if ((dd = opendir (dirname)) != NULL) {
  	while ((dent = readdir (dd))) {
+ #if  (!defined(C_CYGWIN)) && (!defined(C_WINDOWS))
  	    if (dent->d_ino) {
+ #else
+ 	 {
+ #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));
***************
*** 1120,1126 ****
--- 1132,1142 ----
  
      if ((dd = opendir (dirname)) != NULL) {
  	while ((dent = readdir (dd))) {
+ #if  (!defined(C_CYGWIN)) && (!defined(C_WINDOWS))
  	    if (dent->d_ino) {
+ #else
+ 	    {
+ #endif
  		if (strcmp (dent->d_name, ".") && strcmp (dent->d_name, "..")) {
  		    /* build the full name */
  		    fname = calloc (strlen (dirname) + strlen (dent->d_name) + 2, sizeof (char));
