Changeset 976b9f6dc9259e4532a01502d00aa91c95f455e8

Show
Ignore:
Timestamp:
05/03/08 22:07:15 (3 months ago)
Author:
Rémi Denis-Courmont <rem@videolan.org>
git-committer:
Rémi Denis-Courmont <rem@videolan.org> 1209845235 +0300
git-parent:

[832088e49692faa50f7319e430df17b7c5b1a24b]

git-author:
Rémi Denis-Courmont <rem@videolan.org> 1209838435 +0300
Message:

Provide sendmsg and recvmsg replacements

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • include/vlc_network.h

    r449fd28 r976b9f6  
    4242#   define net_errno (WSAGetLastError()) 
    4343extern const char *net_strerror( int val ); 
     44 
     45struct iovec 
     46{ 
     47    void  *iov_base; 
     48    size_t iov_len; 
     49}; 
     50 
     51struct msghdr 
     52{ 
     53    void         *msg_name; 
     54    size_t        msg_namelen; 
     55    struct iovec *msg_iov; 
     56    size_t        msg_iovlen; 
     57    void         *msg_control; 
     58    size_t        msg_controllen; 
     59    int           msg_flags; 
     60}; 
     61 
     62VLC_EXPORT( ssize_t, sendmsg, ( int, struct msghdr *, int ) ); 
     63VLC_EXPORT( ssize_t, recvmsg, ( int, struct msghdr *, int ) ); 
     64 
    4465#   ifndef IPV6_V6ONLY 
    4566#       define IPV6_V6ONLY 27 
  • src/network/winsock.c

    r9ddd88e r976b9f6  
    148148    return "Unknown network stack error"; 
    149149} 
     150 
     151ssize_t sendmsg (int s, struct msghdr *hdr, int flags) 
     152{ 
     153    /* WSASendMsg would be more straightforward, and would support ancilliary 
     154     * data, but it's not yet in mingw32. */ 
     155    if ((hdr->msg_iovlen > 100) || (hdr->msg_controllen > 0)) 
     156    { 
     157        errno = EINVAL; 
     158        return -1; 
     159    } 
     160 
     161    WSABUF buf[hdr->msg_iovlen]; 
     162    for (size_t i = 0; i < sizeof (buf) / sizeof (buf[0]); i++) 
     163        buf[i].buf = hdr->msg_iov[i].iov_base, 
     164        buf[i].len = hdr->msg_iov[i].iov_len; 
     165 
     166    DWORD sent; 
     167    if (WSASendTo (s, buf, sizeof (buf) / sizeof (buf[0]), &sent, flags, 
     168                   hdr->msg_name, hdr->msg_namelen, NULL, NULL) == 0) 
     169        return sent; 
     170    return -1; 
     171} 
     172 
     173ssize_t recvmsg (int s, struct msghdr *hdr, int flags) 
     174{ 
     175    /* WSARecvMsg would be more straightforward, and would support ancilliary 
     176     * data, but it's not yet in mingw32. */ 
     177    if (hdr->msg_iovlen > 100) 
     178    { 
     179        errno = EINVAL; 
     180        return -1; 
     181    } 
     182 
     183    WSABUF buf[hdr->msg_iovlen]; 
     184    for (size_t i = 0; i < sizeof (buf) / sizeof (buf[0]); i++) 
     185        buf[i].buf = hdr->msg_iov[i].iov_base, 
     186        buf[i].len = hdr->msg_iov[i].iov_len; 
     187 
     188    DWORD recvd; 
     189    hdr->msg_controllen = 0; 
     190    hdr->msg_flags = 0; 
     191 
     192    if (WSARecvFrom (s, buf, sizeof (buf) / sizeof (buf[0]), &recvd, flags, 
     193                     hdr->msg_name, hdr->msg_namelen, NULL, NULL) == 0) 
     194        return recvd; 
     195 
     196#ifdef MSG_TRUNC 
     197    if (WSAGetLastError() == WSAEMSGSIZE) 
     198    { 
     199        hdr->msg_flags |= MSG_TRUNC; 
     200        return recvd; 
     201    } 
     202#else 
     203# warning Out-of-date Winsock header files! 
     204#endif 
     205    return -1; 
     206}