]> sourceware.org Git - newlib-cygwin.git/commitdiff
* cygwin.din: Add recvmsg and sendmsg.
authorCorinna Vinschen <corinna@vinschen.de>
Sat, 19 Jan 2002 16:11:00 +0000 (16:11 +0000)
committerCorinna Vinschen <corinna@vinschen.de>
Sat, 19 Jan 2002 16:11:00 +0000 (16:11 +0000)
        * net.cc: Add cygwin_recvmsg and cygwin_sendmsg.
        * /usr/include/sys/socket.h: Add recvmsg and sendmsg.

winsup/cygwin/ChangeLog
winsup/cygwin/cygwin.din
winsup/cygwin/include/sys/socket.h
winsup/cygwin/net.cc

index 02544ea467c74d313b22a405e8cbde8abb0bf35e..f25090f71a545c7560a1c2cae94800bdcb62bfa0 100644 (file)
@@ -1,3 +1,9 @@
+2002-01-19  Mark Bradshaw  <bradshaw@staff.crosswalk.com>
+
+        * cygwin.din: Add recvmsg and sendmsg.
+        * net.cc: Add cygwin_recvmsg and cygwin_sendmsg.
+        * /usr/include/sys/socket.h: Add recvmsg and sendmsg.
+
 2002-01-19  Corinna Vinschen  <corinna@vinschen.de>
 
        * security.cc (create_token): Close processes token handle as soon
index cff55aeaa40a61845e6bd91bce1fd60631b6082e..4f98f282828a300c13a36d89d6930b532b826e88 100644 (file)
@@ -1036,6 +1036,8 @@ setsockopt = cygwin_setsockopt
 inet_aton = cygwin_inet_aton
 inet_ntoa = cygwin_inet_ntoa
 recvfrom = cygwin_recvfrom
+recvmsg = cygwin_recvmsg
+sendmsg = cygwin_sendmsg
 sendto = cygwin_sendto
 shutdown = cygwin_shutdown
 sethostent
index ca76419ebe1a8794e95898fafd23c8ab27c075dc..51ed54e54ebad69df894baffc74bcdb198f792e7 100644 (file)
@@ -35,7 +35,9 @@ extern "C"
   int recv (int, void *__buff, int __len, unsigned int __flags);
   int recvfrom (int, char *__buff, int __len, int __flags,
                         struct sockaddr *__from, int *__fromlen);
+  int recvmsg(int s, struct msghdr *msg, int flags);
   int send (int, const void *__buff, int __len, unsigned int __flags);
+  int sendmsg(int s, const struct msghdr *msg, int flags);
   int sendto (int, const void *, int, unsigned int, const struct sockaddr *, int);
   int setsockopt (int __s, int __level, int __optname, const void *optval, int __optlen);
   int getsockopt (int __s, int __level, int __optname, void *__optval, int *__optlen);
index c73a5af18d4f253f3939a2d8ba3a9ee91f19128f..790b0990e218ebb76bc49f41d09f66e141a7c50c 100644 (file)
@@ -34,6 +34,7 @@ details. */
 #include "sigproc.h"
 #include "pinfo.h"
 #include "registry.h"
+#include <sys/uio.h>
 
 extern "C" {
 int h_errno;
@@ -2519,3 +2520,63 @@ extern "C" void
 endhostent (void)
 {
 }
+
+/* exported as recvmsg: standards? */
+extern "C" int 
+cygwin_recvmsg(int s, struct msghdr *msg, int flags)
+{
+    int ret, nb;
+    size_t tot = 0;
+    int i;
+    char *buf, *p;
+    struct iovec *iov = msg->msg_iov;
+
+    for(i = 0; i < msg->msg_iovlen; ++i)
+       tot += iov[i].iov_len;
+    buf = (char *) malloc(tot);
+    if (tot != 0 && buf == NULL) {
+       errno = ENOMEM;
+       return -1;
+    }
+    nb = ret = cygwin_recvfrom (s, buf, tot, flags, 
+      (struct sockaddr *) msg->msg_name, (int *) &msg->msg_namelen);
+    p = buf;
+    while (nb > 0) {
+       ssize_t cnt = min(nb, iov->iov_len);
+
+       memcpy (iov->iov_base, p, cnt);
+       p += cnt;
+       nb -= cnt;
+       ++iov;
+    }
+    free(buf);
+    return ret;
+}
+
+/* exported as sendmsg: standards? */
+extern "C" int
+cygwin_sendmsg(int s, const struct msghdr *msg, int flags)
+{
+    int ret;
+    size_t tot = 0;
+    int i;
+    char *buf, *p;
+    struct iovec *iov = msg->msg_iov;
+
+    for(i = 0; i < msg->msg_iovlen; ++i)
+       tot += iov[i].iov_len;
+    buf = (char *) malloc(tot);
+    if (tot != 0 && buf == NULL) {
+       errno = ENOMEM;
+       return -1;
+    }
+    p = buf;
+    for (i = 0; i < msg->msg_iovlen; ++i) {
+       memcpy (p, iov[i].iov_base, iov[i].iov_len);
+       p += iov[i].iov_len;
+    }
+    ret = cygwin_sendto (s, buf, tot, flags, 
+      (struct sockaddr *) msg->msg_name, msg->msg_namelen);
+    free (buf);
+    return ret;
+}
\ No newline at end of file
This page took 0.038465 seconds and 5 git commands to generate.