direct3d9: use point interpolation rather than none
[vlc.git] / compat / recvmsg.c
blob941249fef734c9d25687813900e2ad031b0a14f6
1 /*****************************************************************************
2 * recvmsg.c: POSIX recvmsg() replacement
3 *****************************************************************************
4 * Copyright © 2016 Rémi Denis-Courmont
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU Lesser General Public License as published by
8 * the Free Software Foundation; either version 2.1 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public License
17 * along with this program; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
19 *****************************************************************************/
21 #ifdef HAVE_CONFIG_H
22 # include <config.h>
23 #endif
25 #ifdef _WIN32
26 # include <errno.h>
27 # include <stdlib.h>
28 # include <winsock2.h>
30 ssize_t recvmsg(int fd, struct msghdr *msg, int flags)
32 if (msg->msg_controllen != 0)
34 errno = ENOSYS;
35 return -1;
38 if (msg->msg_iovlen > IOV_MAX)
40 errno = EINVAL;
41 return -1;
44 WSABUF *buf = malloc(msg->msg_iovlen * sizeof (*buf));
45 if (buf == NULL)
46 return -1;
48 for (unsigned i = 0; i < msg->msg_iovlen; i++)
50 buf[i].len = msg->msg_iov[i].iov_len;
51 buf[i].buf = msg->msg_iov[i].iov_base;
54 DWORD dwFlags = flags;
55 INT fromlen = msg->msg_namelen;
56 DWORD rcvd;
57 int ret;
58 if (fromlen)
59 ret = WSARecvFrom(fd, buf, msg->msg_iovlen, &rcvd, &dwFlags,
60 msg->msg_name, &fromlen, NULL, NULL);
61 else
62 ret = WSARecv(fd, buf, msg->msg_iovlen, &rcvd, &dwFlags,
63 NULL, NULL);
64 free(buf);
66 if (ret == 0)
68 msg->msg_namelen = fromlen;
69 msg->msg_flags = dwFlags;
70 return rcvd;
73 switch (WSAGetLastError())
75 case WSAEWOULDBLOCK:
76 errno = EAGAIN;
77 break;
79 return -1;
81 #endif