diff --git a/clamd/others.c b/clamd/others.c
index b3271b17b..c24653ad3 100644
--- a/clamd/others.c
+++ b/clamd/others.c
@@ -207,7 +207,7 @@ int poll_fd(int fd, int timeout_sec, int check_signals)
if (fds_add(&fds, fd, 1, timeout_sec) == -1)
return -1;
do {
- ret = fds_poll_recv(&fds, timeout_sec, check_signals);
+ ret = fds_poll_recv(&fds, timeout_sec, check_signals, NULL);
} while (ret == -1 && errno == EINTR);
fds_free(&fds);
return ret;
@@ -431,7 +431,7 @@ void fds_remove(struct fd_data *data, int fd)
* Must be called with buf_mutex lock held.
*/
/* TODO: handle ReadTimeout */
-int fds_poll_recv(struct fd_data *data, int timeout, int check_signals)
+int fds_poll_recv(struct fd_data *data, int timeout, int check_signals, void *dummy)
{
unsigned fdsok = data->nfds;
size_t i;
@@ -496,7 +496,11 @@ int fds_poll_recv(struct fd_data *data, int timeout, int check_signals)
int n = data->nfds;
fds_unlock(data);
+#ifdef _WIN32
+ retval = poll_with_event(data->poll_data, n, timeout, dummy);
+#else
retval = poll(data->poll_data, n, timeout);
+#endif
fds_lock(data);
if (retval > 0) {
diff --git a/clamd/others.h b/clamd/others.h
index ddd9b25c3..828f7df60 100644
--- a/clamd/others.h
+++ b/clamd/others.h
@@ -79,7 +79,7 @@ int writen(int fd, void *buff, unsigned int count);
int fds_add(struct fd_data *data, int fd, int listen_only, int timeout);
void fds_remove(struct fd_data *data, int fd);
void fds_cleanup(struct fd_data *data);
-int fds_poll_recv(struct fd_data *data, int timeout, int check_signals);
+int fds_poll_recv(struct fd_data *data, int timeout, int check_signals, void *dummy);
void fds_free(struct fd_data *data);
#endif
diff --git a/clamd/server-th.c b/clamd/server-th.c
index 6e92e4f9b..7b248082d 100644
--- a/clamd/server-th.c
+++ b/clamd/server-th.c
@@ -69,6 +69,9 @@ pthread_mutex_t reload_mutex = PTHREAD_MUTEX_INITIALIZER;
int sighup = 0;
static struct cl_stat dbstat;
+static void *event_wake_recv = NULL;
+static void *event_wake_accept = NULL;
+
static void scanner_thread(void *arg)
{
client_conn_t *conn = (client_conn_t *) arg;
@@ -326,7 +329,7 @@ static void *acceptloop_th(void *arg)
pthread_mutex_lock(fds->buf_mutex);
for (;;) {
/* Block waiting for data to become available for reading */
- int new_sd = fds_poll_recv(fds, -1, 0);
+ int new_sd = fds_poll_recv(fds, -1, 0, event_wake_accept);
/* TODO: what about sockets that get rm-ed? */
if (!fds->nfds) {
@@ -418,7 +421,7 @@ static void *acceptloop_th(void *arg)
/* notify recvloop */
#ifdef _WIN32
- SetEvent(data->event_wake_recv);
+ SetEvent(event_wake_recv);
#else
if (write(data->syncpipe_wake_recv[1], "", 1) == -1) {
logg("!write syncpipe failed\n");
@@ -462,7 +465,7 @@ static void *acceptloop_th(void *arg)
progexit = 1;
pthread_mutex_unlock(&exit_mutex);
#ifdef _WIN32
- SetEvent(data->event_wake_recv);
+ SetEvent(event_wake_recv);
#else
if (write(data->syncpipe_wake_recv[1], "", 1) < 0) {
logg("$Syncpipe write failed\n");
@@ -1065,8 +1068,8 @@ int recvloop_th(int *socketds, unsigned nsockets, struct cl_engine *engine, unsi
return 1;
}
#ifdef _WIN32
- acceptdata.event_wake_accept = CreateEvent(NULL, TRUE, FALSE, NULL);
- acceptdata.event_wake_recv = CreateEvent(NULL, TRUE, FALSE, NULL);
+ event_wake_accept = CreateEvent(NULL, TRUE, FALSE, NULL);
+ event_wake_recv = CreateEvent(NULL, TRUE, FALSE, NULL);
#else
if (pipe(acceptdata.syncpipe_wake_recv) == -1 ||
(pipe(acceptdata.syncpipe_wake_accept) == -1)) {
@@ -1102,9 +1105,12 @@ int recvloop_th(int *socketds, unsigned nsockets, struct cl_engine *engine, unsi
/* signal that we can accept more connections */
if (fds->nfds <= (unsigned)max_queue)
pthread_cond_signal(&acceptdata.cond_nfds);
- new_sd = fds_poll_recv(fds, selfchk ? (int)selfchk : -1, 1);
+ new_sd = fds_poll_recv(fds, selfchk ? (int)selfchk : -1, 1, event_wake_recv);
+
+#ifndef _WIN32
if (!fds->nfds) {
+ continue;
/* at least the dummy/sync pipe should have remained */
logg("!All recv() descriptors gone: fatal\n");
pthread_mutex_lock(&exit_mutex);
@@ -1113,6 +1119,7 @@ int recvloop_th(int *socketds, unsigned nsockets, struct cl_engine *engine, unsi
pthread_mutex_unlock(fds->buf_mutex);
break;
}
+#endif
if (new_sd == -1 && errno != EINTR) {
logg("!Failed to poll sockets, fatal\n");
@@ -1122,7 +1129,7 @@ int recvloop_th(int *socketds, unsigned nsockets, struct cl_engine *engine, unsi
}
- i = (rr_last + 1) % fds->nfds;
+ if(fds->nfds) i = (rr_last + 1) % fds->nfds;
for (j = 0; j < fds->nfds && new_sd >= 0; j++, i = (i+1) % fds->nfds) {
size_t pos = 0;
int error = 0;
@@ -1311,7 +1318,7 @@ int recvloop_th(int *socketds, unsigned nsockets, struct cl_engine *engine, unsi
progexit = 1;
pthread_mutex_unlock(&exit_mutex);
#ifdef _WIN32
- SetEvent(acceptdata.event_wake_accept);
+ SetEvent(event_wake_accept);
#else
if (write(acceptdata.syncpipe_wake_accept[1], "", 1) < 0) {
logg("^Write to syncpipe failed\n");
@@ -1337,8 +1344,8 @@ int recvloop_th(int *socketds, unsigned nsockets, struct cl_engine *engine, unsi
pthread_join(accept_th, NULL);
fds_free(fds);
#ifdef _WIN32
- CloseHandle(acceptdata.event_wake_accept);
- CloseHandle(acceptdata.event_wake_recv);
+ CloseHandle(event_wake_accept);
+ CloseHandle(event_wake_recv);
#else
close(acceptdata.syncpipe_wake_accept[1]);
close(acceptdata.syncpipe_wake_recv[1]);
diff --git a/win32/clamav-config.h b/win32/clamav-config.h
index cbbeccdce..e60a5ae0a 100644
--- a/win32/clamav-config.h
+++ b/win32/clamav-config.h
@@ -493,7 +493,7 @@
/* #undef USE_SYSLOG */
/* Version number of package */
-#define VERSION "devel-r5076-706-g0380088"
+#define VERSION "devel-r5076-715-gd29df4c"
/* Version suffix for package */
#define VERSION_SUFFIX ""
diff --git a/win32/clamd.vcproj b/win32/clamd.vcproj
index c246e841b..c332f45aa 100644
--- a/win32/clamd.vcproj
+++ b/win32/clamd.vcproj
@@ -1,251 +1,251 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/win32/compat/net.c b/win32/compat/net.c
index 311375214..0b7325eca 100644
--- a/win32/compat/net.c
+++ b/win32/compat/net.c
@@ -327,11 +327,12 @@ int w32_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, s
}
int w32_accept(int sockfd, const struct sockaddr *addr, socklen_t *addrlen) {
- if(accept((SOCKET)sockfd, addr, addrlen)) {
+ int sock;
+ if((sock = (int)accept((SOCKET)sockfd, addr, addrlen)<0)) {
wsock2errno();
return -1;
}
- return 0;
+ return sock;
}
int w32_listen(int sockfd, int backlog) {
@@ -358,7 +359,7 @@ struct w32polldata {
struct pollfd *polldata;
};
-VOID CALLBACK poll_cb(PVOID param, BOOLEAN timedout) {
+static VOID CALLBACK poll_cb(PVOID param, BOOLEAN timedout) {
WSANETWORKEVENTS evt;
struct w32polldata *item = (struct w32polldata *)param;
if(!timedout) {
@@ -368,6 +369,23 @@ VOID CALLBACK poll_cb(PVOID param, BOOLEAN timedout) {
if(evt.iErrorCode[i] & (FD_ACCEPT|FD_READ)) item->polldata->revents |= POLLIN;
if(evt.iErrorCode[i] & FD_CLOSE) item->polldata->revents |= POLLHUP;
}
+<<<<<<< HEAD:win32/compat/net.c
+ if(SetEvent(item->setme)==0) {
+ int a = GetLastError();
+ a++;
+ }
+ }
+}
+
+int poll_with_event(struct pollfd *fds, int nfds, int timeout, HANDLE event) {
+ HANDLE *setme;
+ struct w32polldata *items;
+ unsigned int i, ret = 0;
+
+ setme = malloc(2 * sizeof(HANDLE));
+ setme[0] = CreateEvent(NULL, TRUE, FALSE, NULL);
+ setme[1] = event;
+=======
}
}
@@ -376,6 +394,7 @@ int w32_poll(struct pollfd *fds, int nfds, int timeout) {
struct w32polldata *items;
unsigned int i, ret = 0;
+>>>>>>> d29df4cf2d499717dde976c27fa293470cfcf114:win32/compat/net.c
timeout = timeout>=0 ? timeout*1000 : INFINITE;
if(!nfds) {
Sleep(timeout);
@@ -385,7 +404,11 @@ int w32_poll(struct pollfd *fds, int nfds, int timeout) {
for(i=0; i>>>>>> d29df4cf2d499717dde976c27fa293470cfcf114:win32/compat/net.c
if(WSAEventSelect(fds[i].fd, items[i].event, FD_ACCEPT|FD_READ|FD_CLOSE)) {
/* handle error here */
}
@@ -393,7 +416,11 @@ int w32_poll(struct pollfd *fds, int nfds, int timeout) {
/* handle errors here */
}
}
+<<<<<<< HEAD:win32/compat/net.c
+ WaitForMultipleObjects(2 - (event == NULL) , setme, FALSE, timeout);
+=======
WaitForSingleObject(setme, timeout); /* FIXME - add the pipe here */
+>>>>>>> d29df4cf2d499717dde976c27fa293470cfcf114:win32/compat/net.c
for(i=0; irevents != 0);
}
free(items);
+<<<<<<< HEAD:win32/compat/net.c
+ CloseHandle(setme[0]);
+ free(setme);
+=======
+>>>>>>> d29df4cf2d499717dde976c27fa293470cfcf114:win32/compat/net.c
return ret;
}
diff --git a/win32/compat/net.h b/win32/compat/net.h
index 6b765e133..e69f0bfdc 100644
--- a/win32/compat/net.h
+++ b/win32/compat/net.h
@@ -39,7 +39,7 @@ void w32_freeaddrinfo(struct addrinfo *res);
const char *w32_inet_ntop(int af, const void *src, char *dst, socklen_t size);
struct hostent *w32_gethostbyname(const char *name);
int w32_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
-int w32_poll(struct pollfd *fds, int nfds, int timeout);
+int poll_with_event(struct pollfd *fds, int nfds, int timeout, HANDLE event);
int w32_accept(int sockfd, const struct sockaddr *addr, socklen_t *addrlen);
int w32_listen(int sockfd, int backlog);
int w32_shutdown(int sockfd, int how);
diff --git a/win32/libclamav.def b/win32/libclamav.def
index a80f97f8d..5002ad432 100644
--- a/win32/libclamav.def
+++ b/win32/libclamav.def
@@ -142,7 +142,7 @@ EXPORTS w32_freeaddrinfo
EXPORTS w32_inet_ntop
EXPORTS w32_gethostbyname
EXPORTS w32_select
-EXPORTS w32_poll
+EXPORTS poll_with_event
EXPORTS w32_stat
EXPORTS w32_strerror
EXPORTS w32_strerror_r