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

Reply via email to