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