aboutsummaryrefslogtreecommitdiffstats
path: root/assuan/assuan-io.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--assuan/assuan-io.c60
1 files changed, 59 insertions, 1 deletions
diff --git a/assuan/assuan-io.c b/assuan/assuan-io.c
index d1f0d5e4..6d895791 100644
--- a/assuan/assuan-io.c
+++ b/assuan/assuan-io.c
@@ -25,7 +25,9 @@
#include <sys/time.h>
#include <sys/types.h>
-#include <sys/socket.h>
+#ifdef HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#endif
#include <unistd.h>
#include <errno.h>
#ifdef HAVE_W32_SYSTEM
@@ -49,18 +51,69 @@ _assuan_waitpid (pid_t pid, int *status, int options)
ssize_t
_assuan_simple_read (assuan_context_t ctx, void *buffer, size_t size)
{
+#ifdef HAVE_W32_SYSTEM
+ /* Due to the peculiarities of the W32 API we can't use read for a
+ network socket and thus we try to use recv first and fallback to
+ read if recv detects that it is not a network socket. */
+ int n;
+
+ n = recv (ctx->inbound.fd, buffer, size, 0);
+ if (n == -1 && WSAGetLastError () == WSAENOTSOCK)
+ {
+ DWORD nread = 0;
+
+ n = ReadFile ((HANDLE)ctx->inbound.fd, buffer, size, &nread, NULL);
+ if (!n)
+ {
+ errno = EIO; /* FIXME: We should have a proper mapping. */
+ n = -1;
+ }
+ else
+ n = (int)nread;
+ }
+ return n;
+#else /*!HAVE_W32_SYSTEM*/
return read (ctx->inbound.fd, buffer, size);
+#endif /*!HAVE_W32_SYSTEM*/
}
ssize_t
_assuan_simple_write (assuan_context_t ctx, const void *buffer, size_t size)
{
+#ifdef HAVE_W32_SYSTEM
+ /* Due to the peculiarities of the W32 API we can't use write for a
+ network socket and thus we try to use send first and fallback to
+ write if send detects that it is not a network socket. */
+ int n;
+
+ n = send (ctx->outbound.fd, buffer, size, 0);
+ if (n == -1 && WSAGetLastError () == WSAENOTSOCK)
+ {
+ DWORD nwrite;
+
+ n = WriteFile ((HANDLE)ctx->outbound.fd, buffer, size, &nwrite, NULL);
+ if (!n)
+ {
+ errno = EIO; /* FIXME: We should have a proper mapping. */
+ n = -1;
+ }
+ else
+ n = (int)nwrite;
+ }
+ return n;
+#else /*!HAVE_W32_SYSTEM*/
return write (ctx->outbound.fd, buffer, size);
+#endif /*!HAVE_W32_SYSTEM*/
}
+#ifdef HAVE_W32_SYSTEM
+int
+_assuan_simple_sendmsg (assuan_context_t ctx, void *msg)
+#else
ssize_t
_assuan_simple_sendmsg (assuan_context_t ctx, struct msghdr *msg)
+#endif
{
#ifdef HAVE_W32_SYSTEM
return _assuan_error (ASSUAN_Not_Implemented);
@@ -73,8 +126,13 @@ _assuan_simple_sendmsg (assuan_context_t ctx, struct msghdr *msg)
}
+#ifdef HAVE_W32_SYSTEM
+int
+_assuan_simple_recvmsg (assuan_context_t ctx, void *msg)
+#else
ssize_t
_assuan_simple_recvmsg (assuan_context_t ctx, struct msghdr *msg)
+#endif
{
#ifdef HAVE_W32_SYSTEM
return _assuan_error (ASSUAN_Not_Implemented);