2
0
mirror of https://github.com/openvswitch/ovs synced 2025-09-03 15:55:19 +00:00

socket-util: Support sendmmsg() regardless of platform.

This will have its first user in an upcoming commit.

Signed-off-by: Ben Pfaff <blp@ovn.org>
This commit is contained in:
Ben Pfaff
2017-07-12 17:38:33 -07:00
parent 5b4db7b54f
commit 8a8c1b93b1
4 changed files with 72 additions and 1 deletions

View File

@@ -1020,3 +1020,41 @@ sock_strerror(int error)
return ovs_strerror(error);
#endif
}
static int
emulate_sendmmsg(int fd, struct mmsghdr *msgs, unsigned int n,
unsigned int flags)
{
for (unsigned int i = 0; i < n; i++) {
ssize_t retval = sendmsg(fd, &msgs[i].msg_hdr, flags);
if (retval < 0) {
return i ? i : retval;
}
msgs[i].msg_len = retval;
}
return n;
}
#ifndef HAVE_SENDMMSG
int
sendmmsg(int fd, struct mmsghdr *msgs, unsigned int n, unsigned int flags)
{
return emulate_sendmmsg(fd, msgs, n, flags);
}
#else
int
wrap_sendmmsg(int fd, struct mmsghdr *msgs, unsigned int n, unsigned int flags)
{
static bool sendmmsg_broken = false;
if (!sendmmsg_broken) {
int save_errno = errno;
int retval = sendmmsg(fd, msgs, n, flags);
if (retval >= 0 || errno != ENOSYS) {
return retval;
}
sendmmsg_broken = true;
errno = save_errno;
}
return emulate_sendmmsg(fd, msgs, n, flags);
}
#endif