diff options
-rw-r--r-- | meson.build | 8 | ||||
-rw-r--r-- | src/basic/missing_syscall.h | 38 |
2 files changed, 46 insertions, 0 deletions
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 <unistd.h>'''], ['get_mempolicy', '''#include <stdlib.h> #include <unistd.h>'''], + ['pidfd_send_signal', '''#include <stdlib.h> + #include <unistd.h> + #include <signal.h> + #include <sys/wait.h>'''], + ['pidfd_open', '''#include <stdlib.h> + #include <unistd.h> + #include <signal.h> + #include <sys/wait.h>'''], ] 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 <errno.h> #include <fcntl.h> +#include <signal.h> #include <sys/syscall.h> #include <sys/types.h> +#include <sys/wait.h> #include <unistd.h> #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 |