aboutsummaryrefslogtreecommitdiffstats
path: root/src/libstrongswan/utils/windows.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstrongswan/utils/windows.c')
-rw-r--r--src/libstrongswan/utils/windows.c99
1 files changed, 99 insertions, 0 deletions
diff --git a/src/libstrongswan/utils/windows.c b/src/libstrongswan/utils/windows.c
index a519b3b0d..06e0f8295 100644
--- a/src/libstrongswan/utils/windows.c
+++ b/src/libstrongswan/utils/windows.c
@@ -97,3 +97,102 @@ int socketpair(int domain, int type, int protocol, int sv[2])
closesocket(c);
return -1;
}
+
+/**
+ * Check and clear the dontwait flag
+ */
+static bool check_dontwait(int *flags)
+{
+ if (*flags & MSG_DONTWAIT)
+ {
+ *flags &= ~MSG_DONTWAIT;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/**
+ * See header
+ */
+#undef recv
+ssize_t windows_recv(int sockfd, void *buf, size_t len, int flags)
+{
+ u_long on = 1, off = 0;
+ ssize_t outlen = -1;
+
+ if (!check_dontwait(&flags))
+ {
+ return recv(sockfd, buf, len, flags);
+ }
+ if (ioctlsocket(sockfd, FIONBIO, &on) == 0)
+ {
+ outlen = recv(sockfd, buf, len, flags);
+ ioctlsocket(sockfd, FIONBIO, &off);
+ }
+ return outlen;
+}
+
+/**
+ * See header
+ */
+#undef recvfrom
+ssize_t windows_recvfrom(int sockfd, void *buf, size_t len, int flags,
+ struct sockaddr *src_addr, socklen_t *addrlen)
+{
+ u_long on = 1, off = 0;
+ ssize_t outlen = -1;
+
+ if (!check_dontwait(&flags))
+ {
+ return recvfrom(sockfd, buf, len, flags, src_addr, addrlen);
+ }
+ if (ioctlsocket(sockfd, FIONBIO, &on) == 0)
+ {
+ outlen = recvfrom(sockfd, buf, len, flags, src_addr, addrlen);
+ ioctlsocket(sockfd, FIONBIO, &off);
+ }
+ return outlen;
+}
+
+/**
+ * See header
+ */
+#undef send
+ssize_t windows_send(int sockfd, const void *buf, size_t len, int flags)
+{
+ u_long on = 1, off = 0;
+ ssize_t outlen = -1;
+
+ if (!check_dontwait(&flags))
+ {
+ return send(sockfd, buf, len, flags);
+ }
+ if (ioctlsocket(sockfd, FIONBIO, &on) == 0)
+ {
+ outlen = send(sockfd, buf, len, flags);
+ ioctlsocket(sockfd, FIONBIO, &off);
+ }
+ return outlen;
+}
+
+/**
+ * See header
+ */
+#undef sendto
+ssize_t windows_sendto(int sockfd, const void *buf, size_t len, int flags,
+ const struct sockaddr *dest_addr, socklen_t addrlen)
+{
+ u_long on = 1, off = 0;
+ ssize_t outlen = -1;
+
+ if (!check_dontwait(&flags))
+ {
+ return sendto(sockfd, buf, len, flags, dest_addr, addrlen);
+ }
+ if (ioctlsocket(sockfd, FIONBIO, &on) == 0)
+ {
+ outlen = sendto(sockfd, buf, len, flags, dest_addr, addrlen);
+ ioctlsocket(sockfd, FIONBIO, &off);
+ }
+ return outlen;
+}