Module: xenomai-3 Branch: next Commit: c24ce7d30c62811d41abeb0b2d49e9811ae929aa URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=c24ce7d30c62811d41abeb0b2d49e9811ae929aa
Author: Philippe Gerum <[email protected]> Date: Tue Jan 23 19:19:31 2018 +0100 lib/cobalt: add sendmmsg(), recvmmsg() syscalls --- include/cobalt/sys/socket.h | 8 ++++++++ lib/cobalt/cobalt.wrappers | 2 ++ lib/cobalt/rtdm.c | 34 ++++++++++++++++++++++++++++++++++ lib/cobalt/wrappers.c | 14 ++++++++++++++ 4 files changed, 58 insertions(+) diff --git a/include/cobalt/sys/socket.h b/include/cobalt/sys/socket.h index 273f0b5..156b493 100644 --- a/include/cobalt/sys/socket.h +++ b/include/cobalt/sys/socket.h @@ -33,9 +33,17 @@ COBALT_DECL(int, socket(int protocol_family, COBALT_DECL(ssize_t, recvmsg(int fd, struct msghdr *msg, int flags)); +COBALT_DECL(int, recvmmsg(int fd, + struct mmsghdr *msgvec, unsigned int vlen, + unsigned int flags, struct timespec *timeout)); + COBALT_DECL(ssize_t, sendmsg(int fd, const struct msghdr *msg, int flags)); +COBALT_DECL(int, sendmmsg(int fd, + struct mmsghdr *msgvec, unsigned int vlen, + unsigned int flags)); + COBALT_DECL(ssize_t, recvfrom(int fd, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen)); diff --git a/lib/cobalt/cobalt.wrappers b/lib/cobalt/cobalt.wrappers index 91bd5ef..a0448bd 100644 --- a/lib/cobalt/cobalt.wrappers +++ b/lib/cobalt/cobalt.wrappers @@ -59,7 +59,9 @@ --wrap read --wrap write --wrap recvmsg +--wrap recvmmsg --wrap sendmsg +--wrap sendmmsg --wrap recvfrom --wrap sendto --wrap recv diff --git a/lib/cobalt/rtdm.c b/lib/cobalt/rtdm.c index 9e88ca9..6b8898e 100644 --- a/lib/cobalt/rtdm.c +++ b/lib/cobalt/rtdm.c @@ -227,6 +227,23 @@ COBALT_IMPL(ssize_t, recvmsg, (int fd, struct msghdr *msg, int flags)) return __STD(recvmsg(fd, msg, flags)); } +COBALT_IMPL(int, recvmmsg, (int fd, struct mmsghdr *msgvec, unsigned int vlen, + unsigned int flags, struct timespec *timeout)) +{ + int ret, oldtype; + + pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype); + + ret = XENOMAI_SYSCALL5(sc_cobalt_recvmmsg, fd, msgvec, vlen, flags, timeout); + + pthread_setcanceltype(oldtype, NULL); + + if (ret != -EBADF && ret != -ENOSYS) + return set_errno(ret); + + return __STD(recvmmsg(fd, msgvec, vlen, flags, timeout)); +} + static ssize_t do_sendmsg(int fd, const struct msghdr *msg, int flags) { int ret, oldtype; @@ -251,6 +268,23 @@ COBALT_IMPL(ssize_t, sendmsg, (int fd, const struct msghdr *msg, int flags)) return __STD(sendmsg(fd, msg, flags)); } +COBALT_IMPL(int, sendmmsg, (int fd, struct mmsghdr *msgvec, + unsigned int vlen, unsigned int flags)) +{ + int ret, oldtype; + + pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype); + + ret = XENOMAI_SYSCALL4(sc_cobalt_sendmmsg, fd, msgvec, vlen, flags); + + pthread_setcanceltype(oldtype, NULL); + + if (ret != -EBADF && ret != -ENOSYS) + return set_errno(ret); + + return __STD(sendmmsg(fd, msgvec, vlen, flags)); +} + COBALT_IMPL(ssize_t, recvfrom, (int fd, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen)) { diff --git a/lib/cobalt/wrappers.c b/lib/cobalt/wrappers.c index 0507786..20ad63a 100644 --- a/lib/cobalt/wrappers.c +++ b/lib/cobalt/wrappers.c @@ -257,12 +257,26 @@ ssize_t __real_recvmsg(int fd, struct msghdr * msg, int flags) } __weak +int __real_recvmmsg(int fd, struct mmsghdr *msgvec, unsigned int vlen, + unsigned int flags, struct timespec *timeout) +{ + return recvmmsg(fd, msgvec, vlen, flags, timeout); +} + +__weak ssize_t __real_sendmsg(int fd, const struct msghdr * msg, int flags) { return sendmsg(fd, msg, flags); } __weak +int __real_sendmmsg(int fd, struct mmsghdr *msgvec, unsigned int vlen, + unsigned int flags) +{ + return sendmmsg(fd, msgvec, vlen, flags); +} + +__weak ssize_t __real_recvfrom(int fd, void *buf, size_t len, int flags, struct sockaddr * from, socklen_t * fromlen) { _______________________________________________ Xenomai-git mailing list [email protected] https://xenomai.org/mailman/listinfo/xenomai-git
