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 *****************************************************************************/
30 ssize_t
recvmsg(int fd
, struct msghdr
*msg
, int flags
)
32 if (msg
->msg_controllen
!= 0)
38 if (msg
->msg_iovlen
> IOV_MAX
)
44 WSABUF
*buf
= malloc(msg
->msg_iovlen
* sizeof (*buf
));
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
;
57 int ret
= WSARecvFrom(fd
, buf
, msg
->msg_iovlen
, &rcvd
, &dwFlags
,
58 msg
->msg_name
, &fromlen
, NULL
, NULL
);
63 msg
->msg_namelen
= fromlen
;
64 msg
->msg_flags
= dwFlags
;
68 switch (WSAGetLastError())