]> git.sesse.net Git - vlc/commitdiff
Provide sendmsg and recvmsg replacements
authorRémi Denis-Courmont <rem@videolan.org>
Sat, 3 May 2008 18:13:55 +0000 (21:13 +0300)
committerRémi Denis-Courmont <rem@videolan.org>
Sat, 3 May 2008 20:07:15 +0000 (23:07 +0300)
include/vlc_network.h
src/network/winsock.c

index 260634ef341a397ee4fc8f72d29df9f2d8b70449..643b4eba66de02a162c7c9959fc7d0bfd9a5e314 100644 (file)
 #   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
index e3b66eabb42472b9509264f39b150bc5f481b541..fecd3fd417afd1d8c0aa8a7febc908daaa7cb3e0 100644 (file)
@@ -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;
+}