From: Christian Brauner Date: Wed, 3 Oct 2018 11:08:51 +0000 (+0200) Subject: syscall_wrappers: move signalfd() X-Git-Tag: lxc-3.1.0~65^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=303037d2f6793be350111180382d369a820f3bb6;p=thirdparty%2Flxc.git syscall_wrappers: move signalfd() Signed-off-by: Christian Brauner --- diff --git a/src/lxc/storage/nbd.c b/src/lxc/storage/nbd.c index cc2289426..2fae1fdb2 100644 --- a/src/lxc/storage/nbd.c +++ b/src/lxc/storage/nbd.c @@ -38,6 +38,7 @@ #include "nbd.h" #include "storage.h" #include "storage_utils.h" +#include "syscall_wrappers.h" #include "utils.h" #ifndef HAVE_STRLCPY diff --git a/src/lxc/syscall_wrappers.h b/src/lxc/syscall_wrappers.h index 8661ceb4f..42d94db28 100644 --- a/src/lxc/syscall_wrappers.h +++ b/src/lxc/syscall_wrappers.h @@ -24,6 +24,7 @@ #define _GNU_SOURCE 1 #endif #include +#include #include #include #include @@ -37,6 +38,10 @@ #include #endif +#ifdef HAVE_SYS_SIGNALFD_H +#include +#endif + typedef int32_t key_serial_t; #if !HAVE_KEYCTL @@ -155,6 +160,81 @@ static inline int setns(int fd, int nstype) } #endif +#ifndef HAVE_SYS_SIGNALFD_H +struct signalfd_siginfo { + uint32_t ssi_signo; + int32_t ssi_errno; + int32_t ssi_code; + uint32_t ssi_pid; + uint32_t ssi_uid; + int32_t ssi_fd; + uint32_t ssi_tid; + uint32_t ssi_band; + uint32_t ssi_overrun; + uint32_t ssi_trapno; + int32_t ssi_status; + int32_t ssi_int; + uint64_t ssi_ptr; + uint64_t ssi_utime; + uint64_t ssi_stime; + uint64_t ssi_addr; + uint8_t __pad[48]; +}; + +#ifndef __NR_signalfd4 +/* assume kernel headers are too old */ +#if __i386__ +#define __NR_signalfd4 327 +#elif __x86_64__ +#define __NR_signalfd4 289 +#elif __powerpc__ +#define __NR_signalfd4 313 +#elif __s390x__ +#define __NR_signalfd4 322 +#elif __arm__ +#define __NR_signalfd4 355 +#elif __mips__ && _MIPS_SIM == _ABIO32 +#define __NR_signalfd4 4324 +#elif __mips__ && _MIPS_SIM == _ABI64 +#define __NR_signalfd4 5283 +#elif __mips__ && _MIPS_SIM == _ABIN32 +#define __NR_signalfd4 6287 +#endif +#endif + +#ifndef __NR_signalfd +/* assume kernel headers are too old */ +#if __i386__ +#define __NR_signalfd 321 +#elif __x86_64__ +#define __NR_signalfd 282 +#elif __powerpc__ +#define __NR_signalfd 305 +#elif __s390x__ +#define __NR_signalfd 316 +#elif __arm__ +#define __NR_signalfd 349 +#elif __mips__ && _MIPS_SIM == _ABIO32 +#define __NR_signalfd 4317 +#elif __mips__ && _MIPS_SIM == _ABI64 +#define __NR_signalfd 5276 +#elif __mips__ && _MIPS_SIM == _ABIN32 +#define __NR_signalfd 6280 +#endif +#endif + +static inline int signalfd(int fd, const sigset_t *mask, int flags) +{ + int retval; + + retval = syscall(__NR_signalfd4, fd, mask, _NSIG / 8, flags); + if (errno == ENOSYS && flags == 0) + retval = syscall(__NR_signalfd, fd, mask, _NSIG / 8); + + return retval; +} +#endif + /* Define unshare() if missing from the C library */ #ifndef HAVE_UNSHARE static inline int unshare(int flags) diff --git a/src/lxc/terminal.c b/src/lxc/terminal.c index 03bd8983b..4060e7f9b 100644 --- a/src/lxc/terminal.c +++ b/src/lxc/terminal.c @@ -45,6 +45,7 @@ #include "lxclock.h" #include "mainloop.h" #include "start.h" +#include "syscall_wrappers.h" #include "terminal.h" #include "utils.h" diff --git a/src/lxc/utils.h b/src/lxc/utils.h index 5f16eaedb..f7247a2d8 100644 --- a/src/lxc/utils.h +++ b/src/lxc/utils.h @@ -56,86 +56,6 @@ extern char *get_rundir(void); #endif #endif -/* Define signalfd() if missing from the C library */ -#ifdef HAVE_SYS_SIGNALFD_H -# include -#else -/* assume kernel headers are too old */ -#include -struct signalfd_siginfo -{ - uint32_t ssi_signo; - int32_t ssi_errno; - int32_t ssi_code; - uint32_t ssi_pid; - uint32_t ssi_uid; - int32_t ssi_fd; - uint32_t ssi_tid; - uint32_t ssi_band; - uint32_t ssi_overrun; - uint32_t ssi_trapno; - int32_t ssi_status; - int32_t ssi_int; - uint64_t ssi_ptr; - uint64_t ssi_utime; - uint64_t ssi_stime; - uint64_t ssi_addr; - uint8_t __pad[48]; -}; - -# ifndef __NR_signalfd4 -/* assume kernel headers are too old */ -# if __i386__ -# define __NR_signalfd4 327 -# elif __x86_64__ -# define __NR_signalfd4 289 -# elif __powerpc__ -# define __NR_signalfd4 313 -# elif __s390x__ -# define __NR_signalfd4 322 -# elif __arm__ -# define __NR_signalfd4 355 -# elif __mips__ && _MIPS_SIM == _ABIO32 -# define __NR_signalfd4 4324 -# elif __mips__ && _MIPS_SIM == _ABI64 -# define __NR_signalfd4 5283 -# elif __mips__ && _MIPS_SIM == _ABIN32 -# define __NR_signalfd4 6287 -# endif -#endif - -# ifndef __NR_signalfd -/* assume kernel headers are too old */ -# if __i386__ -# define __NR_signalfd 321 -# elif __x86_64__ -# define __NR_signalfd 282 -# elif __powerpc__ -# define __NR_signalfd 305 -# elif __s390x__ -# define __NR_signalfd 316 -# elif __arm__ -# define __NR_signalfd 349 -# elif __mips__ && _MIPS_SIM == _ABIO32 -# define __NR_signalfd 4317 -# elif __mips__ && _MIPS_SIM == _ABI64 -# define __NR_signalfd 5276 -# elif __mips__ && _MIPS_SIM == _ABIN32 -# define __NR_signalfd 6280 -# endif -#endif - -static inline int signalfd(int fd, const sigset_t *mask, int flags) -{ - int retval; - - retval = syscall (__NR_signalfd4, fd, mask, _NSIG / 8, flags); - if (errno == ENOSYS && flags == 0) - retval = syscall (__NR_signalfd, fd, mask, _NSIG / 8); - return retval; -} -#endif - static inline int lxc_set_cloexec(int fd) { return fcntl(fd, F_SETFD, FD_CLOEXEC);