[Pkg-clamav-commits] [SCM] Debian repository for ClamAV branch, debian/unstable, updated. debian/0.95+dfsg-1-6156-g094ec9b

aCaB acab at clamav.net
Sun Apr 4 01:18:18 UTC 2010


The following commit has been merged in the debian/unstable branch:
commit b545addb04db477974ae3785509ba8e295ad03bc
Author: aCaB <acab at clamav.net>
Date:   Mon Feb 1 03:21:43 2010 +0100

    win32: fix net event handler

diff --git a/win32/clamdscan.vcproj b/win32/clamdscan.vcproj
index f4cb291..28ccdc3 100644
--- a/win32/clamdscan.vcproj
+++ b/win32/clamdscan.vcproj
@@ -228,6 +228,10 @@
 			Name="Resource Files"
 			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
 			>
+			<File
+				RelativePath=".\res\clamdscan.rc"
+				>
+			</File>
 		</Filter>
 	</Files>
 	<Globals>
diff --git a/win32/compat/net.c b/win32/compat/net.c
index a7a586d..1799bd9 100644
--- a/win32/compat/net.c
+++ b/win32/compat/net.c
@@ -18,421 +18,417 @@
  *  MA 02110-1301, USA.
  */
 
-#include <winsock2.h>
-#include <Ws2tcpip.h>
-/* #define W2K_DNSAAPI_COMPAT */
-#ifdef W2K_DNSAAPI_COMPAT
-#include <Wspiapi.h>
-#endif
-#include <stdlib.h>
-#include "net.h"
-#include "w32_errno.h"
-
-static void wsock2errno() {
-    switch(WSAGetLastError()) {
-	case WSA_INVALID_HANDLE:
-	case WSA_INVALID_PARAMETER: 
-	case WSAVERNOTSUPPORTED: 
-	case WSANOTINITIALISED: 
-	case WSAEINVALIDPROCTABLE: 
-	case WSAEINVALIDPROVIDER: 
-	case WSAEPROVIDERFAILEDINIT:
-	case WSASYSCALLFAILURE:
-	case WSASERVICE_NOT_FOUND:
-	case WSATYPE_NOT_FOUND:
-	    errno = EINVAL;
-	    break;
-	case WSA_OPERATION_ABORTED: 
-	case WSAENOMORE: 
-	case WSAECANCELLED: 
-	case WSA_E_NO_MORE: 
-	case WSA_E_CANCELLED: 
-	case WSA_IO_INCOMPLETE: 
-	case WSA_IO_PENDING: 
-	case WSAEREFUSED: 
-	case WSA_QOS_RECEIVERS: 
-	case WSA_QOS_SENDERS: 
-	case WSA_QOS_NO_SENDERS: 
-	case WSA_QOS_NO_RECEIVERS: 
-	case WSA_QOS_REQUEST_CONFIRMED: 
-	case WSA_QOS_ADMISSION_FAILURE: 
-	case WSA_QOS_POLICY_FAILURE: 
-	case WSA_QOS_BAD_STYLE: 
-	case WSA_QOS_BAD_OBJECT: 
-	case WSA_QOS_TRAFFIC_CTRL_ERROR: 
-	case WSA_QOS_GENERIC_ERROR: 
-	case WSA_QOS_ESERVICETYPE: 
-	case WSA_QOS_EFLOWSPEC: 
-	case WSA_QOS_EPROVSPECBUF: 
-	case WSA_QOS_EFILTERSTYLE: 
-	case WSA_QOS_EFILTERTYPE: 
-	case WSA_QOS_EFILTERCOUNT: 
-	case WSA_QOS_EOBJLENGTH: 
-	case WSA_QOS_EFLOWCOUNT: 
-	case WSA_QOS_EUNKOWNPSOBJ: 
-	case WSA_QOS_EPOLICYOBJ: 
-	case WSA_QOS_EFLOWDESC: 
-	case WSA_QOS_EPSFLOWSPEC: 
-	case WSA_QOS_EPSFILTERSPEC: 
-	case WSA_QOS_ESDMODEOBJ: 
-	case WSA_QOS_ESHAPERATEOBJ: 
-	case WSA_QOS_RESERVED_PETYPE: 
-	    errno = EBOGUSWSOCK;
-	    break;
-	case WSA_NOT_ENOUGH_MEMORY: 
-	    errno = ENOMEM;
-	    break;
-	case WSAEINTR: 
-	    errno = EINTR;
-	    break;
-	case WSAEBADF: 
-	    errno = EBADF;
-	    break;
-	case WSAEACCES: 
-	    errno = EACCES;
-	    break;
-	case WSAEFAULT: 
-	    errno = EFAULT;
-	    break;
-	case WSAEINVAL: 
-	    errno = EINVAL;
-	    break;
-	case WSAEMFILE: 
-	    errno = EMFILE;
-	    break;
-	case WSAEWOULDBLOCK: 
-	    errno = EAGAIN;
-	    break;
-	case WSAEINPROGRESS: 
-	    errno = EINPROGRESS;
-	    break;
-	case WSAEALREADY: 
-	    errno = EALREADY;
-	    break;
-	case WSAENOTSOCK: 
-	    errno = ENOTSOCK;
-	    break;
-	case WSAEDESTADDRREQ: 
-	    errno = EDESTADDRREQ;
-	    break;
-	case WSAEMSGSIZE: 
-	    errno = EMSGSIZE;
-	    break;
-	case WSAEPROTOTYPE: 
-	    errno = EPROTOTYPE;
-	    break;
-	case WSAENOPROTOOPT: 
-	    errno = ENOPROTOOPT;
-	    break;
-	case WSAEPROTONOSUPPORT: 
-	    errno = EPROTONOSUPPORT;
-	    break;
-	case WSAESOCKTNOSUPPORT: 
-	    errno = ESOCKTNOSUPPORT;
-	    break;
-	case WSAEOPNOTSUPP: 
-	    errno = EOPNOTSUPP;
-	    break;
-	case WSAEPFNOSUPPORT: 
-	    errno = EPFNOSUPPORT;
-	    break;
-	case WSAEAFNOSUPPORT: 
-	    errno = EAFNOSUPPORT;
-	    break;
-	case WSAEADDRINUSE: 
-	    errno = EADDRINUSE;
-	    break;
-	case WSAEADDRNOTAVAIL: 
-	    errno = EADDRNOTAVAIL;
-	    break;
-	case WSASYSNOTREADY:
-	case WSAENETDOWN: 
-	    errno = ENETDOWN;
-	    break;
-	case WSAENETUNREACH: 
-	    errno = ENETUNREACH;
-	    break;
-	case WSAENETRESET: 
-	    errno = ENETRESET;
-	    break;
-	case WSAECONNABORTED: 
-	    errno = ECONNABORTED;
-	    break;
-	case WSAECONNRESET:
-	case WSAEDISCON:
-	    errno = ECONNRESET;
-	    break;
-	case WSAENOBUFS: 
-	    errno = ENOBUFS;
-	    break;
-	case WSAEISCONN: 
-	    errno = EISCONN;
-	    break;
-	case WSAENOTCONN: 
-	    errno = ENOTCONN;
-	    break;
-	case WSAESHUTDOWN: 
-	    errno = ESHUTDOWN;
-	    break;
-	case WSAETOOMANYREFS: 
-	    errno = ETOOMANYREFS;
-	    break;
-	case WSAETIMEDOUT: 
-	    errno = ETIMEDOUT;
-	    break;
-	case WSAECONNREFUSED: 
-	    errno = ECONNREFUSED;
-	    break;
-	case WSAELOOP: 
-	    errno = ELOOP;
-	    break;
-	case WSAENAMETOOLONG: 
-	    errno = ENAMETOOLONG;
-	    break;
-	case WSAEHOSTDOWN: 
-	    errno = EHOSTDOWN;
-	    break;
-	case WSAEHOSTUNREACH: 
-	    errno = EHOSTUNREACH;
-	    break;
-	case WSAENOTEMPTY: 
-	    errno = ENOTEMPTY;
-	    break;
-	case WSAEPROCLIM: 
-	case WSAEUSERS: 
-	    errno = EUSERS;
-	    break;
-	case WSAEDQUOT: 
-	    errno = EDQUOT;
-	    break;
-	case WSAESTALE: 
-	    errno = ESTALE;
-	    break;
-	case WSAEREMOTE: 
-	    errno = EREMOTE;
-	    break;
-    }
-}
-
-int w32_socket(int domain, int type, int protocol) {
-    SOCKET s = socket(domain, type, protocol);
-    if(s == INVALID_SOCKET) {
-	wsock2errno();
-	return -1;
-    }
-    return (int)s;
-}
-
-int w32_getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen) {
-    if(getsockopt((SOCKET)sockfd, level, optname, (char *)optval, optlen) == SOCKET_ERROR) {
-	wsock2errno();
-	return -1;
-    }
-    return 0;
-}
-
-int w32_setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen) {
-    if(setsockopt((SOCKET)sockfd, level, optname, (const char*)optval, optlen) == SOCKET_ERROR) {
-	wsock2errno();
-	return -1;
-    }
-    return 0;
-}
-
-int w32_bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen) {
-    if(bind((SOCKET)sockfd, addr, addrlen) == SOCKET_ERROR) {
-	wsock2errno();
-	return -1;
-    }
-    return 0;
-}
-
-int w32_connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen) {
-    if(connect((SOCKET)sockfd, addr, addrlen)) {
-	wsock2errno();
-	return -1;
-    }
-    return 0;
-}
-
-ssize_t w32_send(int sockfd, const void *buf, size_t len, int flags) {
-    int ret = send((SOCKET)sockfd, (const char *)buf, (int)len, flags);
-    if(ret == SOCKET_ERROR) {
-	wsock2errno();
-	return -1;
-    }
-    return (ssize_t)ret;
-}
-
-ssize_t w32_recv(int sockfd, void *buf, size_t len, int flags) {
-    int ret = recv((SOCKET)sockfd, (char *)buf, len, flags);
-    if(ret == SOCKET_ERROR) {
-	wsock2errno();
-	return -1;
-    }
-    return (ssize_t)ret;
-}
-
-int w32_closesocket(int sockfd) {
-    if(closesocket((SOCKET)sockfd) == SOCKET_ERROR) {
-	wsock2errno();
-	return -1;
-    }
-    return 0;
-}
-
-struct servent *w32_getservbyname(const char *name, const char *proto) {
-    return getservbyname(name, proto);
-}
-
-int w32_getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res) {
-    return getaddrinfo(node, service, hints, res);
-}
-
-void w32_freeaddrinfo(struct addrinfo *res) {
-    freeaddrinfo(res);
-}
-
-const char *w32_inet_ntop(int af, const void *src, char *dst, socklen_t size) {
-    const char *ret;
-
-    if(af != AF_INET) {
-	errno = EAFNOSUPPORT;
-	return NULL;
-    }
-    ret = inet_ntoa(*(struct in_addr *)src);
-    if(!ret) {
-	wsock2errno();
-	return NULL;
-    }
-    if(strlen(ret) >= size) {
-	errno = ENOSPC;
-	return NULL;
-    }
-    strcpy(dst, ret);
-    return ret;
-}
-
-struct hostent *w32_gethostbyname(const char *name) {
-    return gethostbyname(name);
-}
-
-int w32_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) {
-    int ret = select(nfds, readfds, writefds, exceptfds, timeout);
-    if(ret == SOCKET_ERROR) {
-	wsock2errno();
-	return -1;
-    }
-    return ret;
-}
-
-int w32_accept(SOCKET sockfd, const struct sockaddr *addr, socklen_t *addrlen) {
-    if((sockfd = accept(sockfd, addr, addrlen)) == INVALID_SOCKET) {
-	wsock2errno();
-	return -1;
-    }
-    return (int)sockfd;
-}
-
-int w32_listen(int sockfd, int backlog) {
-    if(listen((SOCKET)sockfd, backlog)) {
-	wsock2errno();
-	return -1;
-    }
-    return 0;
-}
-
-int w32_shutdown(int sockfd, int how) {
-    if(shutdown((SOCKET)sockfd, how)) {
-	wsock2errno();
-	return -1;
-    }
-    return 0;
-}
-
-
-struct w32polldata {
-    HANDLE setme;
-    HANDLE event;
-    HANDLE waiter;
-    struct pollfd *polldata;
-};
-
-VOID CALLBACK poll_cb(PVOID param, BOOLEAN timedout) {
-    WSANETWORKEVENTS evt;
-    struct w32polldata *item = (struct w32polldata *)param;
-    if(!timedout) {
-	unsigned int i;
-	WSAEnumNetworkEvents(item->polldata->fd, item->event, &evt);
-	switch(evt.lNetworkEvents) {
-	    case FD_ACCEPT:
-		i = FD_ACCEPT_BIT;
-		item->polldata->revents = POLLIN;
-		break;
-	    case FD_READ:
-		i = FD_READ_BIT;
-		item->polldata->revents = POLLIN;
-		break;
-	    case FD_CLOSE:
-		i = FD_CLOSE_BIT;
-		item->polldata->revents = POLLHUP;
-		break;
-	    default:
-		i = -1;
-		item->polldata->revents = POLLERR;
-	}
-	if(i>=0 && evt.iErrorCode[i])
-	    item->polldata->revents = POLLERR;
-	SetEvent(item->setme);
-    }
-}
-
-int poll_with_event(struct pollfd *fds, int nfds, int timeout, HANDLE event) {
-    HANDLE *setme, cankill;
-    struct w32polldata *items;
-    unsigned int i, ret = 0;
-
-    if(timeout <0) timeout = INFINITE;
-    if(!nfds) {
-	if(event) {
-	    if(WaitForSingleObject(event, timeout) == WAIT_OBJECT_0)
-		return 1;
-	} else
-	    Sleep(timeout);
-	return 0;
-    }
-    setme = malloc(2 * sizeof(HANDLE));
-    setme[0] = CreateEvent(NULL, TRUE, FALSE, NULL);
-    setme[1] = event;
-    items = malloc(nfds * sizeof(struct w32polldata));
-    for(i=0; i<nfds; i++) {
-	items[i].event = CreateEvent(NULL, TRUE, FALSE, NULL);
-	items[i].polldata = &fds[i];
-	items[i].setme = setme[0];
-	if(WSAEventSelect(fds[i].fd, items[i].event, FD_ACCEPT|FD_READ|FD_CLOSE)) {
-	    /* handle error here */
-	}
-	if(RegisterWaitForSingleObject(&items[i].waiter, items[i].event, poll_cb, &items[i], timeout, WT_EXECUTEONLYONCE)) {
-	    /* handle errors here */
-	}
-    }
-    if((ret = WaitForMultipleObjects(2 - (event == NULL), setme, FALSE, timeout)) == WAIT_OBJECT_0 + 1) {
-	ret = 1;
-    } else {
-	ret = 0;
-    }
-    cankill = CreateEvent(NULL, TRUE, FALSE, NULL);
-    for(i=0; i<nfds; i++) {
-	ResetEvent(cankill);
-	UnregisterWaitEx(items[i].waiter, cankill);
-	WSAEventSelect(fds[i].fd, items[i].event, 0);
-	WaitForSingleObject(cankill, INFINITE);
-	CloseHandle(items[i].event);
-	ret += (items[i].polldata->revents != 0);
-    }
-    CloseHandle(cankill);
-    free(items);
-    CloseHandle(setme[0]);
-    free(setme);
-    return ret;
-}
+#include <winsock2.h>
+#include <Ws2tcpip.h>
+/* #define W2K_DNSAAPI_COMPAT */
+#ifdef W2K_DNSAAPI_COMPAT
+#include <Wspiapi.h>
+#endif
+#include <stdlib.h>
+#include "net.h"
+#include "w32_errno.h"
+
+static void wsock2errno() {
+    switch(WSAGetLastError()) {
+	case WSA_INVALID_HANDLE:
+	case WSA_INVALID_PARAMETER: 
+	case WSAVERNOTSUPPORTED: 
+	case WSANOTINITIALISED: 
+	case WSAEINVALIDPROCTABLE: 
+	case WSAEINVALIDPROVIDER: 
+	case WSAEPROVIDERFAILEDINIT:
+	case WSASYSCALLFAILURE:
+	case WSASERVICE_NOT_FOUND:
+	case WSATYPE_NOT_FOUND:
+	    errno = EINVAL;
+	    break;
+	case WSA_OPERATION_ABORTED: 
+	case WSAENOMORE: 
+	case WSAECANCELLED: 
+	case WSA_E_NO_MORE: 
+	case WSA_E_CANCELLED: 
+	case WSA_IO_INCOMPLETE: 
+	case WSA_IO_PENDING: 
+	case WSAEREFUSED: 
+	case WSA_QOS_RECEIVERS: 
+	case WSA_QOS_SENDERS: 
+	case WSA_QOS_NO_SENDERS: 
+	case WSA_QOS_NO_RECEIVERS: 
+	case WSA_QOS_REQUEST_CONFIRMED: 
+	case WSA_QOS_ADMISSION_FAILURE: 
+	case WSA_QOS_POLICY_FAILURE: 
+	case WSA_QOS_BAD_STYLE: 
+	case WSA_QOS_BAD_OBJECT: 
+	case WSA_QOS_TRAFFIC_CTRL_ERROR: 
+	case WSA_QOS_GENERIC_ERROR: 
+	case WSA_QOS_ESERVICETYPE: 
+	case WSA_QOS_EFLOWSPEC: 
+	case WSA_QOS_EPROVSPECBUF: 
+	case WSA_QOS_EFILTERSTYLE: 
+	case WSA_QOS_EFILTERTYPE: 
+	case WSA_QOS_EFILTERCOUNT: 
+	case WSA_QOS_EOBJLENGTH: 
+	case WSA_QOS_EFLOWCOUNT: 
+	case WSA_QOS_EUNKOWNPSOBJ: 
+	case WSA_QOS_EPOLICYOBJ: 
+	case WSA_QOS_EFLOWDESC: 
+	case WSA_QOS_EPSFLOWSPEC: 
+	case WSA_QOS_EPSFILTERSPEC: 
+	case WSA_QOS_ESDMODEOBJ: 
+	case WSA_QOS_ESHAPERATEOBJ: 
+	case WSA_QOS_RESERVED_PETYPE: 
+	    errno = EBOGUSWSOCK;
+	    break;
+	case WSA_NOT_ENOUGH_MEMORY: 
+	    errno = ENOMEM;
+	    break;
+	case WSAEINTR: 
+	    errno = EINTR;
+	    break;
+	case WSAEBADF: 
+	    errno = EBADF;
+	    break;
+	case WSAEACCES: 
+	    errno = EACCES;
+	    break;
+	case WSAEFAULT: 
+	    errno = EFAULT;
+	    break;
+	case WSAEINVAL: 
+	    errno = EINVAL;
+	    break;
+	case WSAEMFILE: 
+	    errno = EMFILE;
+	    break;
+	case WSAEWOULDBLOCK: 
+	    errno = EAGAIN;
+	    break;
+	case WSAEINPROGRESS: 
+	    errno = EINPROGRESS;
+	    break;
+	case WSAEALREADY: 
+	    errno = EALREADY;
+	    break;
+	case WSAENOTSOCK: 
+	    errno = ENOTSOCK;
+	    break;
+	case WSAEDESTADDRREQ: 
+	    errno = EDESTADDRREQ;
+	    break;
+	case WSAEMSGSIZE: 
+	    errno = EMSGSIZE;
+	    break;
+	case WSAEPROTOTYPE: 
+	    errno = EPROTOTYPE;
+	    break;
+	case WSAENOPROTOOPT: 
+	    errno = ENOPROTOOPT;
+	    break;
+	case WSAEPROTONOSUPPORT: 
+	    errno = EPROTONOSUPPORT;
+	    break;
+	case WSAESOCKTNOSUPPORT: 
+	    errno = ESOCKTNOSUPPORT;
+	    break;
+	case WSAEOPNOTSUPP: 
+	    errno = EOPNOTSUPP;
+	    break;
+	case WSAEPFNOSUPPORT: 
+	    errno = EPFNOSUPPORT;
+	    break;
+	case WSAEAFNOSUPPORT: 
+	    errno = EAFNOSUPPORT;
+	    break;
+	case WSAEADDRINUSE: 
+	    errno = EADDRINUSE;
+	    break;
+	case WSAEADDRNOTAVAIL: 
+	    errno = EADDRNOTAVAIL;
+	    break;
+	case WSASYSNOTREADY:
+	case WSAENETDOWN: 
+	    errno = ENETDOWN;
+	    break;
+	case WSAENETUNREACH: 
+	    errno = ENETUNREACH;
+	    break;
+	case WSAENETRESET: 
+	    errno = ENETRESET;
+	    break;
+	case WSAECONNABORTED: 
+	    errno = ECONNABORTED;
+	    break;
+	case WSAECONNRESET:
+	case WSAEDISCON:
+	    errno = ECONNRESET;
+	    break;
+	case WSAENOBUFS: 
+	    errno = ENOBUFS;
+	    break;
+	case WSAEISCONN: 
+	    errno = EISCONN;
+	    break;
+	case WSAENOTCONN: 
+	    errno = ENOTCONN;
+	    break;
+	case WSAESHUTDOWN: 
+	    errno = ESHUTDOWN;
+	    break;
+	case WSAETOOMANYREFS: 
+	    errno = ETOOMANYREFS;
+	    break;
+	case WSAETIMEDOUT: 
+	    errno = ETIMEDOUT;
+	    break;
+	case WSAECONNREFUSED: 
+	    errno = ECONNREFUSED;
+	    break;
+	case WSAELOOP: 
+	    errno = ELOOP;
+	    break;
+	case WSAENAMETOOLONG: 
+	    errno = ENAMETOOLONG;
+	    break;
+	case WSAEHOSTDOWN: 
+	    errno = EHOSTDOWN;
+	    break;
+	case WSAEHOSTUNREACH: 
+	    errno = EHOSTUNREACH;
+	    break;
+	case WSAENOTEMPTY: 
+	    errno = ENOTEMPTY;
+	    break;
+	case WSAEPROCLIM: 
+	case WSAEUSERS: 
+	    errno = EUSERS;
+	    break;
+	case WSAEDQUOT: 
+	    errno = EDQUOT;
+	    break;
+	case WSAESTALE: 
+	    errno = ESTALE;
+	    break;
+	case WSAEREMOTE: 
+	    errno = EREMOTE;
+	    break;
+    }
+}
+
+int w32_socket(int domain, int type, int protocol) {
+    SOCKET s = socket(domain, type, protocol);
+    if(s == INVALID_SOCKET) {
+	wsock2errno();
+	return -1;
+    }
+    return (int)s;
+}
+
+int w32_getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen) {
+    if(getsockopt((SOCKET)sockfd, level, optname, (char *)optval, optlen) == SOCKET_ERROR) {
+	wsock2errno();
+	return -1;
+    }
+    return 0;
+}
+
+int w32_setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen) {
+    if(setsockopt((SOCKET)sockfd, level, optname, (const char*)optval, optlen) == SOCKET_ERROR) {
+	wsock2errno();
+	return -1;
+    }
+    return 0;
+}
+
+int w32_bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen) {
+    if(bind((SOCKET)sockfd, addr, addrlen) == SOCKET_ERROR) {
+	wsock2errno();
+	return -1;
+    }
+    return 0;
+}
+
+int w32_connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen) {
+    if(connect((SOCKET)sockfd, addr, addrlen)) {
+	wsock2errno();
+	return -1;
+    }
+    return 0;
+}
+
+ssize_t w32_send(int sockfd, const void *buf, size_t len, int flags) {
+    int ret = send((SOCKET)sockfd, (const char *)buf, (int)len, flags);
+    if(ret == SOCKET_ERROR) {
+	wsock2errno();
+	return -1;
+    }
+    return (ssize_t)ret;
+}
+
+ssize_t w32_recv(int sockfd, void *buf, size_t len, int flags) {
+    int ret = recv((SOCKET)sockfd, (char *)buf, len, flags);
+    if(ret == SOCKET_ERROR) {
+	wsock2errno();
+	return -1;
+    }
+    return (ssize_t)ret;
+}
+
+int w32_closesocket(int sockfd) {
+    if(closesocket((SOCKET)sockfd) == SOCKET_ERROR) {
+	wsock2errno();
+	return -1;
+    }
+    return 0;
+}
+
+struct servent *w32_getservbyname(const char *name, const char *proto) {
+    return getservbyname(name, proto);
+}
+
+int w32_getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res) {
+    return getaddrinfo(node, service, hints, res);
+}
+
+void w32_freeaddrinfo(struct addrinfo *res) {
+    freeaddrinfo(res);
+}
+
+const char *w32_inet_ntop(int af, const void *src, char *dst, socklen_t size) {
+    const char *ret;
+
+    if(af != AF_INET) {
+	errno = EAFNOSUPPORT;
+	return NULL;
+    }
+    ret = inet_ntoa(*(struct in_addr *)src);
+    if(!ret) {
+	wsock2errno();
+	return NULL;
+    }
+    if(strlen(ret) >= size) {
+	errno = ENOSPC;
+	return NULL;
+    }
+    strcpy(dst, ret);
+    return ret;
+}
+
+struct hostent *w32_gethostbyname(const char *name) {
+    return gethostbyname(name);
+}
+
+int w32_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout) {
+    int ret = select(nfds, readfds, writefds, exceptfds, timeout);
+    if(ret == SOCKET_ERROR) {
+	wsock2errno();
+	return -1;
+    }
+    return ret;
+}
+
+int w32_accept(SOCKET sockfd, const struct sockaddr *addr, socklen_t *addrlen) {
+    if((sockfd = accept(sockfd, addr, addrlen)) == INVALID_SOCKET) {
+	wsock2errno();
+	return -1;
+    }
+    return (int)sockfd;
+}
+
+int w32_listen(int sockfd, int backlog) {
+    if(listen((SOCKET)sockfd, backlog)) {
+	wsock2errno();
+	return -1;
+    }
+    return 0;
+}
+
+int w32_shutdown(int sockfd, int how) {
+    if(shutdown((SOCKET)sockfd, how)) {
+	wsock2errno();
+	return -1;
+    }
+    return 0;
+}
+
+
+struct w32polldata {
+    HANDLE setme;
+    HANDLE event;
+    HANDLE waiter;
+    struct pollfd *polldata;
+};
+
+VOID CALLBACK poll_cb(PVOID param, BOOLEAN timedout) {
+    WSANETWORKEVENTS evt;
+    struct w32polldata *item = (struct w32polldata *)param;
+    if(!timedout) {
+	unsigned int i;
+	WSAEnumNetworkEvents(item->polldata->fd, item->event, &evt);
+	if(evt.lNetworkEvents & FD_ACCEPT) {
+	    item->polldata->revents |= POLLIN;
+	    if(evt.iErrorCode[FD_ACCEPT_BIT])
+		item->polldata->revents = POLLERR;
+	}
+	if(evt.lNetworkEvents & FD_READ) {
+	    item->polldata->revents |= POLLIN;
+	    if(evt.iErrorCode[FD_READ_BIT])
+		item->polldata->revents = POLLERR;
+	}
+	if(evt.lNetworkEvents & FD_CLOSE) {
+	    item->polldata->revents |= POLLHUP;
+	    if(evt.iErrorCode[FD_CLOSE_BIT])
+		item->polldata->revents = POLLERR;
+	}
+	SetEvent(item->setme);
+    }
+}
+
+int poll_with_event(struct pollfd *fds, int nfds, int timeout, HANDLE event) {
+    HANDLE *setme, cankill;
+    struct w32polldata *items;
+    unsigned int i, ret = 0;
+
+    if(timeout <0) timeout = INFINITE;
+    if(!nfds) {
+	if(event) {
+	    if(WaitForSingleObject(event, timeout) == WAIT_OBJECT_0)
+		return 1;
+	} else
+	    Sleep(timeout);
+	return 0;
+    }
+    setme = malloc(2 * sizeof(HANDLE));
+    setme[0] = CreateEvent(NULL, TRUE, FALSE, NULL);
+    setme[1] = event;
+    items = malloc(nfds * sizeof(struct w32polldata));
+    for(i=0; i<nfds; i++) {
+	items[i].event = CreateEvent(NULL, TRUE, FALSE, NULL);
+	items[i].polldata = &fds[i];
+	items[i].setme = setme[0];
+	if(WSAEventSelect(fds[i].fd, items[i].event, FD_ACCEPT|FD_READ|FD_CLOSE)) {
+	    /* handle error here */
+	}
+	if(RegisterWaitForSingleObject(&items[i].waiter, items[i].event, poll_cb, &items[i], timeout, WT_EXECUTEONLYONCE)) {
+	    /* handle errors here */
+	}
+    }
+    if((ret = WaitForMultipleObjects(2 - (event == NULL), setme, FALSE, timeout)) == WAIT_OBJECT_0 + 1) {
+	ret = 1;
+    } else {
+	ret = 0;
+    }
+    cankill = CreateEvent(NULL, TRUE, FALSE, NULL);
+    for(i=0; i<nfds; i++) {
+	ResetEvent(cankill);
+	UnregisterWaitEx(items[i].waiter, cankill);
+	WSAEventSelect(fds[i].fd, items[i].event, 0);
+	WaitForSingleObject(cankill, INFINITE);
+	CloseHandle(items[i].event);
+	ret += (items[i].polldata->revents != 0);
+    }
+    CloseHandle(cankill);
+    free(items);
+    CloseHandle(setme[0]);
+    free(setme);
+    return ret;
+}
diff --git a/win32/res/clamdscan.rc b/win32/res/clamdscan.rc
new file mode 100644
index 0000000..f823a84
--- /dev/null
+++ b/win32/res/clamdscan.rc
@@ -0,0 +1,6 @@
+#define RES_FNAME "clamdscan.exe"
+#define RES_NAME "clamdscan"
+#define RES_FDESC "ClamAV - clamdscan"
+#include "common.rc"
+
+1337 ICON "clam.ico"

-- 
Debian repository for ClamAV



More information about the Pkg-clamav-commits mailing list