From 5f152f43d04e5aad6a3f98f45f020a66e3aac717 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 25 Oct 2019 16:06:06 +0200 Subject: [PATCH] missing: define new pidfd syscalls --- meson.build | 8 ++++++++ src/basic/missing_syscall.h | 38 +++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/meson.build b/meson.build index 21d6968abd..edde42ea74 100644 --- a/meson.build +++ b/meson.build @@ -517,6 +517,14 @@ foreach ident : [ #include '''], ['get_mempolicy', '''#include #include '''], + ['pidfd_send_signal', '''#include + #include + #include + #include '''], + ['pidfd_open', '''#include + #include + #include + #include '''], ] have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE') diff --git a/src/basic/missing_syscall.h b/src/basic/missing_syscall.h index 1255d8b197..bea7be699d 100644 --- a/src/basic/missing_syscall.h +++ b/src/basic/missing_syscall.h @@ -5,8 +5,10 @@ #include #include +#include #include #include +#include #include #ifdef ARCH_MIPS @@ -524,3 +526,39 @@ static inline long missing_get_mempolicy(int *mode, unsigned long *nodemask, #define get_mempolicy missing_get_mempolicy #endif + +#if !HAVE_PIDFD_OPEN +/* may be (invalid) negative number due to libseccomp, see PR 13319 */ +# if ! (defined __NR_pidfd_open && __NR_pidfd_open > 0) +# if defined __NR_pidfd_open +# undef __NR_pidfd_open +# endif +# define __NR_pidfd_open 434 +#endif +static inline int pidfd_open(pid_t pid, unsigned flags) { +#ifdef __NR_pidfd_open + return syscall(__NR_pidfd_open, pid, flags); +#else + errno = ENOSYS; + return -1; +#endif +} +#endif + +#if !HAVE_PIDFD_SEND_SIGNAL +/* may be (invalid) negative number due to libseccomp, see PR 13319 */ +# if ! (defined __NR_pidfd_send_signal && __NR_pidfd_send_signal > 0) +# if defined __NR_pidfd_send_signal +# undef __NR_pidfd_send_signal +# endif +# define __NR_pidfd_send_signal 424 +#endif +static inline int pidfd_send_signal(int fd, int sig, siginfo_t *info, unsigned flags) { +#ifdef __NR_pidfd_open + return syscall(__NR_pidfd_send_signal, fd, sig, info, flags); +#else + errno = ENOSYS; + return -1; +#endif +} +#endif