Skip to content

Commit

Permalink
missing_syscall: add epoll_pwait2() wrapper
Browse files Browse the repository at this point in the history
  • Loading branch information
poettering committed Feb 26, 2021
1 parent 8b2620e commit 420297c
Show file tree
Hide file tree
Showing 4 changed files with 102 additions and 1 deletion.
2 changes: 2 additions & 0 deletions meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -549,6 +549,7 @@ foreach ident : [
['mallinfo', '''#include <malloc.h>'''],
['execveat', '''#include <unistd.h>'''],
['close_range', '''#include <unistd.h>'''],
['epoll_pwait2', '''#include <sys/epoll.h>'''],
]

have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
Expand Down Expand Up @@ -672,6 +673,7 @@ foreach header : ['crypt.h',
'sys/auxv.h',
'valgrind/memcheck.h',
'valgrind/valgrind.h',
'linux/time_types.h',
]

conf.set10('HAVE_' + header.underscorify().to_upper(),
Expand Down
43 changes: 43 additions & 0 deletions src/basic/missing_syscall.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@

#include <errno.h>
#include <fcntl.h>
#if HAVE_LINUX_TIME_TYPES_H
/* This header defines __kernel_timespec for us, but is only available since Linux 5.1, hence conditionally
* include this. */
#include <linux/time_types.h>
#endif
#include <signal.h>
#include <sys/syscall.h>
#include <sys/types.h>
Expand Down Expand Up @@ -382,3 +387,41 @@ static inline int missing_close_range(int first_fd, int end_fd, unsigned flags)

# define close_range missing_close_range
#endif

/* ======================================================================= */

#if !HAVE_EPOLL_PWAIT2

/* Defined to be equivalent to the kernel's _NSIG_WORDS, i.e. the size of the array of longs that is
* encapsulated by sigset_t. */
#define KERNEL_NSIG_WORDS (64 / (sizeof(long) * 8))
#define KERNEL_NSIG_BYTES (KERNEL_NSIG_WORDS * sizeof(long))

struct epoll_event;

static inline int missing_epoll_pwait2(
int fd,
struct epoll_event *events,
int maxevents,
const struct timespec *timeout,
const sigset_t *sigset) {

# if defined(__NR_epoll_pwait2) && HAVE_LINUX_TIME_TYPES_H
if (timeout) {
/* Convert from userspace timespec to kernel timespec */
struct __kernel_timespec ts = {
.tv_sec = timeout->tv_sec,
.tv_nsec = timeout->tv_nsec,
};

return syscall(__NR_epoll_pwait2, fd, events, maxevents, &ts, sigset, sigset ? KERNEL_NSIG_BYTES : 0);
} else
return syscall(__NR_epoll_pwait2, fd, events, maxevents, NULL, sigset, sigset ? KERNEL_NSIG_BYTES : 0);
# else
errno = ENOSYS;
return -1;
# endif
}

# define epoll_pwait2 missing_epoll_pwait2
#endif
55 changes: 55 additions & 0 deletions src/basic/missing_syscall_def.h
Original file line number Diff line number Diff line change
Expand Up @@ -673,3 +673,58 @@ assert_cc(__NR_statx == systemd_NR_statx);
# endif
#endif

#ifndef __IGNORE_epoll_pwait2
# if defined(__aarch64__)
# define systemd_NR_epoll_pwait2 441
# elif defined(__alpha__)
# define systemd_NR_epoll_pwait2 551
# elif defined(__arc__) || defined(__tilegx__)
# define systemd_NR_epoll_pwait2 441
# elif defined(__arm__)
# define systemd_NR_epoll_pwait2 441
# elif defined(__i386__)
# define systemd_NR_epoll_pwait2 441
# elif defined(__ia64__)
# define systemd_NR_epoll_pwait2 1465
# elif defined(__m68k__)
# define systemd_NR_epoll_pwait2 441
# elif defined(_MIPS_SIM)
# if _MIPS_SIM == _MIPS_SIM_ABI32
# define systemd_NR_epoll_pwait2 4441
# elif _MIPS_SIM == _MIPS_SIM_NABI32
# define systemd_NR_epoll_pwait2 6441
# elif _MIPS_SIM == _MIPS_SIM_ABI64
# define systemd_NR_epoll_pwait2 5441
# else
# error "Unknown MIPS ABI"
# endif
# elif defined(__powerpc__)
# define systemd_NR_epoll_pwait2 441
# elif defined(__s390__)
# define systemd_NR_epoll_pwait2 441
# elif defined(__sparc__)
# define systemd_NR_epoll_pwait2 441
# elif defined(__x86_64__)
# if defined(__ILP32__)
# define systemd_NR_epoll_pwait2 (441 | /* __X32_SYSCALL_BIT */ 0x40000000)
# else
# define systemd_NR_epoll_pwait2 441
# endif
# else
# warning "epoll_pwait2() syscall number is unknown for your architecture"
# endif

/* may be an (invalid) negative number due to libseccomp, see PR 13319 */
# if defined __NR_epoll_pwait2 && __NR_epoll_pwait2 >= 0
# if defined systemd_NR_epoll_pwait2
assert_cc(__NR_epoll_pwait2 == systemd_NR_epoll_pwait2);
# endif
# else
# if defined __NR_epoll_pwait2
# undef __NR_epoll_pwait2
# endif
# if defined systemd_NR_epoll_pwait2 && systemd_NR_epoll_pwait2 >= 0
# define __NR_epoll_pwait2 systemd_NR_epoll_pwait2
# endif
# endif
#endif
3 changes: 2 additions & 1 deletion src/basic/missing_syscalls.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@
'pkey_mprotect',
'renameat2',
'setns',
'statx']
'statx',
'epoll_pwait2']

def dictify(f):
def wrap(*args, **kwargs):
Expand Down

0 comments on commit 420297c

Please sign in to comment.