Index: cygwin.din =================================================================== RCS file: /cvs/src/src/winsup/cygwin/cygwin.din,v retrieving revision 1.42 diff -b -u -p -r1.42 cygwin.din --- cygwin.din 2002/01/17 10:39:36 1.42 +++ cygwin.din 2002/01/19 05:20:35 @@ -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: net.cc =================================================================== RCS file: /cvs/src/src/winsup/cygwin/net.cc,v retrieving revision 1.95 diff -b -u -p -r1.95 net.cc --- net.cc 2002/01/09 20:57:55 1.95 +++ net.cc 2002/01/19 05:20:45 @@ -34,6 +34,7 @@ details. */ #include "sigproc.h" #include "pinfo.h" #include "registry.h" +#include 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