diff -u -r -X excluding.txt clamav-devel-latest-20041130/clamd/clamd.c clamav-devel-latest-20041130.pizzolato/clamd/clamd.c
--- clamav-devel-latest-20041130/clamd/clamd.c	2004-10-20 14:54:07.000000000 -0700
+++ clamav-devel-latest-20041130.pizzolato/clamd/clamd.c	2004-12-03 10:35:29.413809700 -0800
@@ -68,7 +68,8 @@
 	time_t currtime;
 	struct cl_node *root = NULL;
 	const char *dbdir, *cfgfile;
-	int ret, virnum = 0, tcpsock;
+	int ret, virnum = 0, tcpsock = 0, localsock = 0;
+	int lsockets[2], nlsockets = 0;
 #ifdef C_LINUX
 	struct stat sb;
 #endif
@@ -183,15 +184,11 @@
 
     /* check socket type */
 
-    if(cfgopt(copt, "TCPSocket") && cfgopt(copt, "LocalSocket")) {
-	fprintf(stderr, "ERROR: You can select one mode only (local/TCP).\n");
-	logg("!Two modes (local & TCP) selected.\n");
-	exit(1);
-    } else if(cfgopt(copt, "TCPSocket")) {
+    if(cfgopt(copt, "TCPSocket"))
 	tcpsock = 1;
-    } else if(cfgopt(copt, "LocalSocket")) {
-	tcpsock = 0;
-    } else {
+    if(cfgopt(copt, "LocalSocket"))
+	localsock = 1;
+    if(!tcpsock && !localsock) {
 	fprintf(stderr, "ERROR: You must select server type (local/tcp).\n");
 	logg("!Please select server type (local/TCP).\n");
 	exit(1);
@@ -281,9 +278,11 @@
 
 
     if(tcpsock)
-	ret = tcpserver(opt, copt, root);
-    else
-	ret = localserver(opt, copt, root);
+	lsockets[nlsockets++] = tcpserver(copt, root);
+    if(localsock)
+	lsockets[nlsockets++] = localserver(copt, root);
+
+    ret = acceptloop_th(lsockets, nlsockets, root, copt);
 
     printf("server ended; result=%d\n", ret);
     logg_close();
Only in clamav-devel-latest-20041130.pizzolato/clamd: clamd.exe.stackdump
diff -u -r -X excluding.txt clamav-devel-latest-20041130/clamd/localserver.c clamav-devel-latest-20041130.pizzolato/clamd/localserver.c
--- clamav-devel-latest-20041130/clamd/localserver.c	2004-04-06 15:43:43.000000000 -0700
+++ clamav-devel-latest-20041130.pizzolato/clamd/localserver.c	2004-12-03 10:03:03.056864700 -0800
@@ -36,7 +36,7 @@
 #include "server.h"
 #include "output.h"
 
-int localserver(const struct optstruct *opt, const struct cfgstruct *copt, struct cl_node *root)
+int localserver(const struct cfgstruct *copt, struct cl_node *root)
 {
 	struct sockaddr_un server;
 	int sockfd, backlog;
@@ -105,7 +105,5 @@
 	exit(1);
     }
 
-    acceptloop_th(sockfd, root, copt);
-
-    return 0;
+    return sockfd;
 }
diff -u -r -X excluding.txt clamav-devel-latest-20041130/clamd/localserver.h clamav-devel-latest-20041130.pizzolato/clamd/localserver.h
--- clamav-devel-latest-20041130/clamd/localserver.h	2003-07-29 08:48:08.000000000 -0700
+++ clamav-devel-latest-20041130.pizzolato/clamd/localserver.h	2004-12-03 10:03:03.257158700 -0800
@@ -19,6 +19,6 @@
 #ifndef __LOCALSERVER_H
 #define __LOCALSERVER_H
 
-int localserver(const struct optstruct *opt, const struct cfgstruct *copt, struct cl_node *root);
+int localserver(const struct cfgstruct *copt, struct cl_node *root);
 
 #endif
diff -u -r -X excluding.txt clamav-devel-latest-20041130/clamd/others.c clamav-devel-latest-20041130.pizzolato/clamd/others.c
--- clamav-devel-latest-20041130/clamd/others.c	2004-10-09 16:38:19.000000000 -0700
+++ clamav-devel-latest-20041130.pizzolato/clamd/others.c	2004-12-03 10:03:03.187055800 -0800
@@ -87,45 +87,70 @@
     free(cmd);
 }
 
-int poll_fd(int fd, int timeout_sec)
+int poll_fds(int *fds, int nfds, int timeout_sec)
 {
 	int retval;
+	int i;
 #ifdef HAVE_POLL
-	struct pollfd poll_data[1];
+	struct pollfd poll_1[1];
+	struct pollfd *poll_data = &poll_1;
 
-    poll_data[0].fd = fd;
-    poll_data[0].events = POLLIN;
-    poll_data[0].revents = 0;
+    if (nfds>1)
+	poll_data = malloc(nfds*sizeof(*poll_data));
+    for (i=0; i<nfds; i++) {
+	poll_data[i].fd = fds[i];
+	poll_data[i].events = POLLIN;
+	poll_data[i].revents = 0;
+    }
 
     if (timeout_sec > 0) {
     	timeout_sec *= 1000;
     }
     while (1) {
-    	retval = poll(poll_data, 1, timeout_sec);
+    	retval = poll(poll_data, nfds, timeout_sec);
 	if (retval == -1) {
    	    if (errno == EINTR) {
 		continue;
 	    }
+	    if (nfds>1)
+		free(poll_data);
 	    return -1;
 	}
+	if (nfds>1) {
+	    if (retval>0) {
+		for (i=0; i<nfds; i++) {
+		    if (poll_data[i].revents) {
+			retval = i+1;
+			break;
+		    }
+		}
+	    }
+	    free(poll_data);
+	}
 	return retval;
     }
 
 #else
 	fd_set rfds;
 	struct timeval tv;
+	int maxfd = 0;
 
-    if (fd >= DEFAULT_FD_SETSIZE) {
-	return -1;
+    for (i=0; i<nfds; i++) {
+	if (fds[i] >= DEFAULT_FD_SETSIZE) {
+	    return -1;
+	}
+	if (fds[i] > maxfd)
+	    maxfd = fds[i];
     }
 
     while (1) {
 	FD_ZERO(&rfds);
-	FD_SET(fd, &rfds);
+	for (i=0; i<nfds; i++)
+	    FD_SET(fds[i], &rfds);
 	tv.tv_sec = timeout_sec;
 	tv.tv_usec = 0;
 
-	retval = select(fd+1, &rfds, NULL, NULL,
+	retval = select(maxfd+1, &rfds, NULL, NULL,
 			(timeout_sec>0 ? &tv : NULL));
 	if (retval == -1) {
 	    if (errno == EINTR) {
@@ -133,6 +158,14 @@
 	    }
 	    return -1;
 	}
+	if ((nfds>1) && (retval>0)) {
+	    for (i=0; i<nfds; i++) {
+		if (FD_ISSET(fds[i],&rfds)) {
+		    retval = i+1;
+		    break;
+		}
+	    }
+	}
 	return retval;
     }
 #endif
@@ -140,6 +173,11 @@
     return -1;
 }
 
+int poll_fd(int fd, int timeout_sec)
+{
+    return poll_fds(&fd, 1, timeout_sec);
+}
+
 int is_fd_connected(int fd)
 {
 #ifdef HAVE_POLL
diff -u -r -X excluding.txt clamav-devel-latest-20041130/clamd/others.h clamav-devel-latest-20041130.pizzolato/clamd/others.h
--- clamav-devel-latest-20041130/clamd/others.h	2004-04-13 18:27:22.000000000 -0700
+++ clamav-devel-latest-20041130.pizzolato/clamd/others.h	2004-12-03 10:03:03.217099900 -0800
@@ -28,6 +28,7 @@
 
 
 int poll_fd(int fd, int timeout_sec);
+int poll_fds(int *fds, int nfds, int timeout_sec);
 int is_fd_connected(int fd);
 void virusaction(const char *virname, const struct cfgstruct *copt);
 int writen(int fd, void *buff, unsigned int count);
diff -u -r -X excluding.txt clamav-devel-latest-20041130/clamd/server-th.c clamav-devel-latest-20041130.pizzolato/clamd/server-th.c
--- clamav-devel-latest-20041130/clamd/server-th.c	2004-11-08 23:59:01.000000000 -0800
+++ clamav-devel-latest-20041130.pizzolato/clamd/server-th.c	2004-12-03 10:37:17.612628500 -0800
@@ -193,10 +193,11 @@
     return root;
 }
 
-int acceptloop_th(int socketd, struct cl_node *root, const struct cfgstruct *copt)
+int acceptloop_th(int *socketds, int nsockets, struct cl_node *root, const struct cfgstruct *copt)
 {
 	int new_sd, max_threads, stdopt;
 	unsigned int options = 0;
+	int i;
 	threadpool_t *thr_pool;
 	struct sigaction sigact;
 	mode_t old_umask;
@@ -466,7 +467,15 @@
 
     time(&start_time);
 
-    for(;;) {				
+    for(;;) {
+	int socketd = socketds[0];
+	if (nsockets>1) {
+	    int pollret = poll_fds(socketds, nsockets, -1);
+	    if (pollret>0)
+		socketd = socketds[pollret-1];
+	    else
+		socketd = socketds[0];  /* on a poll error use first socket */
+	}
 	new_sd = accept(socketd, NULL, NULL);
 	if((new_sd == -1) && (errno != EINTR)) {
 	    /* very bad - need to exit or restart */
@@ -558,10 +567,12 @@
 	pthread_join(clamuko_pid, NULL);
     }
 #endif
-    logg("*Shutting down the main socket.\n");
-    shutdown(socketd, 2);
-    logg("*Closing the main socket.\n");
-    close(socketd);
+    logg("*Shutting down the main socket%s.\n", (nsockets>1)?"s":"");
+    for (i=0; i<nsockets; i++)
+	shutdown(socketds[i], 2);
+    logg("*Closing the main socket%s.\n", (nsockets>1)?"s":"");
+    for (i=0; i<nsockets; i++)
+	close(socketds[i]);
     if((cpt = cfgopt(copt, "LocalSocket"))) {
 	if(unlink(cpt->strarg) == -1)
 	    logg("!Can't unlink the socket file %s\n", cpt->strarg);
diff -u -r -X excluding.txt clamav-devel-latest-20041130/clamd/server.h clamav-devel-latest-20041130.pizzolato/clamd/server.h
--- clamav-devel-latest-20041130/clamd/server.h	2004-02-16 16:08:25.000000000 -0800
+++ clamav-devel-latest-20041130.pizzolato/clamd/server.h	2004-12-03 10:03:03.297217500 -0800
@@ -48,8 +48,7 @@
     int options;
 };
 
-int acceptloop_proc(int socketd, struct cl_node *root, const struct cfgstruct *copt);
-int acceptloop_th(int socketd, struct cl_node *root, const struct cfgstruct *copt);
+int acceptloop_th(int *socketds, int nsockets, struct cl_node *root, const struct cfgstruct *copt);
 void sighandler(int sig);
 void sighandler_th(int sig);
 void daemonize(void);
diff -u -r -X excluding.txt clamav-devel-latest-20041130/clamd/tcpserver.c clamav-devel-latest-20041130.pizzolato/clamd/tcpserver.c
--- clamav-devel-latest-20041130/clamd/tcpserver.c	2004-03-28 16:00:57.000000000 -0800
+++ clamav-devel-latest-20041130.pizzolato/clamd/tcpserver.c	2004-12-03 10:03:03.157011700 -0800
@@ -38,7 +38,7 @@
 #include "server.h"
 #include "output.h"
 
-int tcpserver(const struct optstruct *opt, const struct cfgstruct *copt, struct cl_node *root)
+int tcpserver(const struct cfgstruct *copt, struct cl_node *root)
 {
 	struct sockaddr_in server;
 	int sockfd, backlog;
@@ -106,10 +106,5 @@
 	exit(1);
     }
 
-    /* if(cfgopt(copt, "UseProcesses"))
-	acceptloop_proc(sockfd, root, copt);
-    else */
-	acceptloop_th(sockfd, root, copt);
-
-    return 0;
+    return sockfd;
 }
diff -u -r -X excluding.txt clamav-devel-latest-20041130/clamd/tcpserver.h clamav-devel-latest-20041130.pizzolato/clamd/tcpserver.h
--- clamav-devel-latest-20041130/clamd/tcpserver.h	2004-03-28 16:00:57.000000000 -0800
+++ clamav-devel-latest-20041130.pizzolato/clamd/tcpserver.h	2004-12-03 10:03:03.277188100 -0800
@@ -22,6 +22,6 @@
 #include "options.h"
 #include "cfgparser.h"
 
-int tcpserver(const struct optstruct *opt, const struct cfgstruct *copt, struct cl_node *root);
+int tcpserver(const struct cfgstruct *copt, struct cl_node *root);
 
 #endif
diff -u -r -X excluding.txt clamav-devel-latest-20041130/clamdscan/client.c clamav-devel-latest-20041130.pizzolato/clamdscan/client.c
--- clamav-devel-latest-20041130/clamdscan/client.c	2004-11-28 15:26:28.000000000 -0800
+++ clamav-devel-latest-20041130.pizzolato/clamdscan/client.c	2004-12-03 12:01:57.829585700 -0800
@@ -269,10 +269,7 @@
     /* Set default address to connect to */
     server2.sin_addr.s_addr = inet_addr("127.0.0.1");    
 
-    if(cfgopt(copt, "TCPSocket") && cfgopt(copt, "LocalSocket")) {
-	mprintf("@Clamd is not configured properly.\n");
-	return -1;
-    } else if((cpt = cfgopt(copt, "LocalSocket"))) {
+    if((cpt = cfgopt(copt, "LocalSocket"))) {
 
 	server.sun_family = AF_UNIX;
 	strncpy(server.sun_path, cpt->strarg, sizeof(server.sun_path));
diff -u -r -X excluding.txt clamav-devel-latest-20041130/freshclam/notify.c clamav-devel-latest-20041130.pizzolato/freshclam/notify.c
--- clamav-devel-latest-20041130/freshclam/notify.c	2004-07-19 10:54:40.000000000 -0700
+++ clamav-devel-latest-20041130.pizzolato/freshclam/notify.c	2004-12-03 12:17:48.705321300 -0800
@@ -52,10 +52,7 @@
 	return 1;
     }
 
-    if(cfgopt(copt, "TCPSocket") && cfgopt(copt, "LocalSocket")) {
-	mprintf("@Clamd was NOT notified: Both socket types (TCP and local) declared in %s\n", cfgfile);
-	return 1;
-    } else if((cpt = cfgopt(copt, "LocalSocket"))) {
+    if((cpt = cfgopt(copt, "LocalSocket"))) {
 	socktype = "UNIX";
 	server.sun_family = AF_UNIX;
 	strncpy(server.sun_path, cpt->strarg, sizeof(server.sun_path));
