| /* Copyright (c) 2015 Google Inc. |
| * Barret Rhoden <brho@cs.berkeley.edu> |
| * See LICENSE for details. |
| * |
| * recvmsg(), on top of recvfrom(). */ |
| |
| #include <sys/types.h> |
| #include <sys/socket.h> |
| #include <errno.h> |
| |
| /* In recvfrom.c */ |
| extern ssize_t __recvfrom_iov(int fd, const struct iovec *iov, int iovcnt, |
| int flags, __SOCKADDR_ARG from, |
| socklen_t * __restrict fromlen); |
| |
| /* Receive a message as described by MSG from socket FD. Returns the number of |
| * bytes read or -1 for errors. */ |
| ssize_t __recvmsg(int fd, struct msghdr *msg, int flags) |
| { |
| ssize_t ret; |
| |
| ret = __recvfrom_iov(fd, msg->msg_iov, msg->msg_iovlen, |
| flags, msg->msg_name, &msg->msg_namelen); |
| if (ret == -1) |
| return ret; |
| /* On successful calls, there's extra info we can return via *msg */ |
| msg->msg_controllen = 0; |
| msg->msg_flags = 0; |
| return ret; |
| } |
| weak_alias(__recvmsg, recvmsg) |