aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Willi <martin@revosec.ch>2014-11-06 14:18:22 +0100
committerMartin Willi <martin@revosec.ch>2014-11-21 12:02:08 +0100
commita301a9c939a9b6fcd9f0309b730e5fa1319124ea (patch)
tree9b2a440e8b5bf6279d39cc6419c9cfe7eadd08f3
parent09624c6cec97dc729f3f3c0984d6289b115b846b (diff)
downloadstrongswan-a301a9c939a9b6fcd9f0309b730e5fa1319124ea.tar.bz2
strongswan-a301a9c939a9b6fcd9f0309b730e5fa1319124ea.tar.xz
windows: Provide a write(2) wrapper that uses send(2) on sockets
-rw-r--r--src/libstrongswan/utils/windows.c16
-rw-r--r--src/libstrongswan/utils/windows.h6
2 files changed, 22 insertions, 0 deletions
diff --git a/src/libstrongswan/utils/windows.c b/src/libstrongswan/utils/windows.c
index e511db026..241ad055a 100644
--- a/src/libstrongswan/utils/windows.c
+++ b/src/libstrongswan/utils/windows.c
@@ -662,6 +662,22 @@ ssize_t windows_read(int fd, void *buf, size_t count)
/**
* See header
*/
+#undef write
+ssize_t windows_write(int fd, void *buf, size_t count)
+{
+ ssize_t ret;
+
+ ret = send(fd, buf, count, 0);
+ if (ret == -1 && WSAGetLastError() == WSAENOTSOCK)
+ {
+ ret = write(fd, buf, count);
+ }
+ return ret;
+}
+
+/**
+ * See header
+ */
int poll(struct pollfd *fds, int nfds, int timeout)
{
return wserr(WSAPoll(fds, nfds, timeout));
diff --git a/src/libstrongswan/utils/windows.h b/src/libstrongswan/utils/windows.h
index ffd95b3fb..147d3aa2c 100644
--- a/src/libstrongswan/utils/windows.h
+++ b/src/libstrongswan/utils/windows.h
@@ -371,6 +371,12 @@ ssize_t windows_sendto(int sockfd, const void *buf, size_t len, int flags,
#define read windows_read
ssize_t windows_read(int fd, void *buf, size_t count);
+/**
+ * write(2) working on files and sockets
+ */
+#define write windows_write
+ssize_t windows_write(int fd, void *buf, size_t count);
+
#if _WIN32_WINNT < 0x0600
/**
* Define pollfd and flags on our own if not specified