windows: Provide a poll(2) wrapper calling WSAPoll()
authorMartin Willi <martin@revosec.ch>
Thu, 6 Nov 2014 11:11:25 +0000 (12:11 +0100)
committerMartin Willi <martin@revosec.ch>
Fri, 21 Nov 2014 10:16:48 +0000 (11:16 +0100)
src/libstrongswan/utils/utils.h
src/libstrongswan/utils/windows.c
src/libstrongswan/utils/windows.h

index da253cc..9e00b8a 100644 (file)
@@ -37,6 +37,7 @@
 # include <netdb.h>
 # include <netinet/in.h>
 # include <sched.h>
+# include <poll.h>
 #endif
 
 /**
index 8820287..6ce9d77 100644 (file)
@@ -13,6 +13,9 @@
  * for more details.
  */
 
+/* WSAPoll() */
+#define _WIN32_WINNT 0x0600
+
 #include "utils.h"
 
 #include <errno.h>
@@ -639,3 +642,11 @@ ssize_t windows_sendto(int sockfd, const void *buf, size_t len, int flags,
        }
        return outlen;
 }
+
+/**
+ * See header
+ */
+int poll(struct pollfd *fds, int nfds, int timeout)
+{
+       return wserr(WSAPoll(fds, nfds, timeout));
+}
index 3761e10..80106ec 100644 (file)
@@ -362,6 +362,34 @@ ssize_t windows_send(int sockfd, const void *buf, size_t len, int flags);
 ssize_t windows_sendto(int sockfd, const void *buf, size_t len, int flags,
                                           const struct sockaddr *dest_addr, socklen_t addrlen);
 
+#if _WIN32_WINNT < 0x0600
+/**
+ * Define pollfd and flags on our own if not specified
+ */
+struct pollfd {
+       SOCKET fd;
+       short events;
+       short revents;
+};
+enum {
+       POLLERR =               0x0001,
+       POLLHUP =               0x0002,
+       POLLNVAL =              0x0004,
+       POLLWRNORM =    0x0010,
+       POLLWRBAND =    0x0020,
+       POLLPRI =               0x0400,
+       POLLRDNORM =    0x0100,
+       POLLRDBAND =    0x0200,
+       POLLIN =                POLLRDNORM | POLLRDBAND,
+       POLLOUT =               POLLWRNORM,
+};
+#endif /* _WIN32_WINNT < 0x0600 */
+
+/**
+ * poll(2), implemented using Winsock2 WSAPoll()
+ */
+int poll(struct pollfd *fds, int nfds, int timeout);
+
 /**
  * Declaration missing on older WinGW
  */