From: RĂ©mi Denis-Courmont Date: Sat, 3 May 2008 18:13:55 +0000 (+0300) Subject: Provide sendmsg and recvmsg replacements X-Git-Tag: 0.9.0-test0~1212 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=976b9f6dc9259e4532a01502d00aa91c95f455e8;p=vlc Provide sendmsg and recvmsg replacements --- diff --git a/include/vlc_network.h b/include/vlc_network.h index 260634ef34..643b4eba66 100644 --- a/include/vlc_network.h +++ b/include/vlc_network.h @@ -41,6 +41,27 @@ # define ENETUNREACH WSAENETUNREACH # define net_errno (WSAGetLastError()) extern const char *net_strerror( int val ); + +struct iovec +{ + void *iov_base; + size_t iov_len; +}; + +struct msghdr +{ + void *msg_name; + size_t msg_namelen; + struct iovec *msg_iov; + size_t msg_iovlen; + void *msg_control; + size_t msg_controllen; + int msg_flags; +}; + +VLC_EXPORT( ssize_t, sendmsg, ( int, struct msghdr *, int ) ); +VLC_EXPORT( ssize_t, recvmsg, ( int, struct msghdr *, int ) ); + # ifndef IPV6_V6ONLY # define IPV6_V6ONLY 27 # endif diff --git a/src/network/winsock.c b/src/network/winsock.c index e3b66eabb4..fecd3fd417 100644 --- a/src/network/winsock.c +++ b/src/network/winsock.c @@ -147,3 +147,60 @@ const char *net_strerror( int value ) /* Remember to update src/misc/messages.c if you change this one */ return "Unknown network stack error"; } + +ssize_t sendmsg (int s, struct msghdr *hdr, int flags) +{ + /* WSASendMsg would be more straightforward, and would support ancilliary + * data, but it's not yet in mingw32. */ + if ((hdr->msg_iovlen > 100) || (hdr->msg_controllen > 0)) + { + errno = EINVAL; + return -1; + } + + WSABUF buf[hdr->msg_iovlen]; + for (size_t i = 0; i < sizeof (buf) / sizeof (buf[0]); i++) + buf[i].buf = hdr->msg_iov[i].iov_base, + buf[i].len = hdr->msg_iov[i].iov_len; + + DWORD sent; + if (WSASendTo (s, buf, sizeof (buf) / sizeof (buf[0]), &sent, flags, + hdr->msg_name, hdr->msg_namelen, NULL, NULL) == 0) + return sent; + return -1; +} + +ssize_t recvmsg (int s, struct msghdr *hdr, int flags) +{ + /* WSARecvMsg would be more straightforward, and would support ancilliary + * data, but it's not yet in mingw32. */ + if (hdr->msg_iovlen > 100) + { + errno = EINVAL; + return -1; + } + + WSABUF buf[hdr->msg_iovlen]; + for (size_t i = 0; i < sizeof (buf) / sizeof (buf[0]); i++) + buf[i].buf = hdr->msg_iov[i].iov_base, + buf[i].len = hdr->msg_iov[i].iov_len; + + DWORD recvd; + hdr->msg_controllen = 0; + hdr->msg_flags = 0; + + if (WSARecvFrom (s, buf, sizeof (buf) / sizeof (buf[0]), &recvd, flags, + hdr->msg_name, hdr->msg_namelen, NULL, NULL) == 0) + return recvd; + +#ifdef MSG_TRUNC + if (WSAGetLastError() == WSAEMSGSIZE) + { + hdr->msg_flags |= MSG_TRUNC; + return recvd; + } +#else +# warning Out-of-date Winsock header files! +#endif + return -1; +}