Implement writev on Windows
authorBruce Cran <bcran@fusionio.com>
Fri, 1 Nov 2013 18:31:03 +0000 (12:31 -0600)
committerJens Axboe <axboe@kernel.dk>
Fri, 1 Nov 2013 18:31:03 +0000 (12:31 -0600)
The network code depends on writev(), so implement it for Windows.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
os/windows/posix.c
os/windows/posix/include/sys/uio.h
os/windows/posix/include/sys/wait.h

index 8153b455a8ff75a3ff1bde544d6b283312abc781..d238c64a16219607ced8eb7dd4807552361046e6 100755 (executable)
@@ -19,6 +19,8 @@
 #include <sys/uio.h>
 #include <sys/resource.h>
 #include <sys/poll.h>
 #include <sys/uio.h>
 #include <sys/resource.h>
 #include <sys/poll.h>
+#include <sys/wait.h>
+#include <setjmp.h>
 
 #include "../os-windows.h"
 #include "../../lib/hweight.h"
 
 #include "../os-windows.h"
 #include "../../lib/hweight.h"
@@ -707,9 +709,22 @@ ssize_t readv(int fildes, const struct iovec *iov, int iovcnt)
 
 ssize_t writev(int fildes, const struct iovec *iov, int iovcnt)
 {
 
 ssize_t writev(int fildes, const struct iovec *iov, int iovcnt)
 {
-       log_err("%s is not implemented\n", __func__);
-       errno = ENOSYS;
-       return -1;
+       int i;
+       DWORD bytes_written = 0;
+       for (i = 0; i < iovcnt; i++)
+       {
+               int len = send((SOCKET)fildes, iov[i].iov_base, iov[i].iov_len, 0);
+               if (len == SOCKET_ERROR)
+               {
+                       DWORD err = GetLastError();
+                       errno = win_to_posix_error(err);
+                       bytes_written = -1;
+                       break;
+               }
+               bytes_written += len;
+       }
+
+       return bytes_written;
 }
 
 long long strtoll(const char *restrict str, char **restrict endptr,
 }
 
 long long strtoll(const char *restrict str, char **restrict endptr,
@@ -751,7 +766,6 @@ int poll(struct pollfd fds[], nfds_t nfds, int timeout)
 
                FD_SET(fds[i].fd, &exceptfds);
        }
 
                FD_SET(fds[i].fd, &exceptfds);
        }
-
        rc = select(nfds, &readfds, &writefds, &exceptfds, to);
 
        if (rc != SOCKET_ERROR) {
        rc = select(nfds, &readfds, &writefds, &exceptfds, to);
 
        if (rc != SOCKET_ERROR) {
@@ -771,7 +785,6 @@ int poll(struct pollfd fds[], nfds_t nfds, int timeout)
                                fds[i].revents |= POLLHUP;
                }
        }
                                fds[i].revents |= POLLHUP;
                }
        }
-
        return rc;
 }
 
        return rc;
 }
 
index 25f83d6083f1c01c3958fc68756c48c43e6d56d0..402e988b38b7d7101429311d46d3dbe9defa345e 100644 (file)
@@ -4,8 +4,8 @@
 #include <inttypes.h>
 #include <unistd.h>
 
 #include <inttypes.h>
 #include <unistd.h>
 
- struct iovec
- {
+struct iovec
+{
        void    *iov_base;  /* Base address of a memory region for input or output */
        size_t   iov_len;   /* The size of the memory pointed to by iov_base */
 };
        void    *iov_base;  /* Base address of a memory region for input or output */
        size_t   iov_len;   /* The size of the memory pointed to by iov_base */
 };
index 5b8fd3ae17c210831cf87e14b087f4a014e9d5bd..ac50aa86435949f81444b94fb8cfe4dd69305ac0 100644 (file)
@@ -5,7 +5,7 @@
 #define WIFEXITED(a)   0
 #define WTERMSIG(a)            0
 #define WEXITSTATUS(a) 0
 #define WIFEXITED(a)   0
 #define WTERMSIG(a)            0
 #define WEXITSTATUS(a) 0
-#define WNOHANG                        0
+#define WNOHANG                        1
 
 pid_t waitpid(pid_t, int *stat_loc, int options);
 
 
 pid_t waitpid(pid_t, int *stat_loc, int options);