2020-11-09 13:23:58 +09:00
|
|
|
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
2016-03-17 13:26:13 -04:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
/* Missing glibc definitions to access certain kernel APIs */
|
|
|
|
|
|
2019-01-11 17:24:21 +01:00
|
|
|
#include <errno.h>
|
2018-12-04 08:26:09 +01:00
|
|
|
#include <fcntl.h>
|
2021-02-25 16:56:07 +01:00
|
|
|
#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
|
2019-10-25 16:06:06 +02:00
|
|
|
#include <signal.h>
|
2018-12-04 08:26:09 +01:00
|
|
|
#include <sys/syscall.h>
|
2016-10-18 17:57:10 +02:00
|
|
|
#include <sys/types.h>
|
2019-10-25 16:06:06 +02:00
|
|
|
#include <sys/wait.h>
|
2018-12-06 06:32:41 +01:00
|
|
|
#include <unistd.h>
|
|
|
|
|
|
|
|
|
|
#ifdef ARCH_MIPS
|
|
|
|
|
#include <asm/sgidefs.h>
|
|
|
|
|
#endif
|
2016-10-18 17:57:10 +02:00
|
|
|
|
2021-11-02 18:15:32 +01:00
|
|
|
#include "macro.h"
|
2018-12-04 07:41:15 +01:00
|
|
|
#include "missing_keyctl.h"
|
2018-12-04 07:56:19 +01:00
|
|
|
#include "missing_stat.h"
|
2021-01-15 17:06:19 +01:00
|
|
|
#include "missing_syscall_def.h"
|
2018-12-04 07:41:15 +01:00
|
|
|
|
2018-12-06 06:32:41 +01:00
|
|
|
/* linux/kcmp.h */
|
|
|
|
|
#ifndef KCMP_FILE /* 3f4994cfc15f38a3159c6e3a4b3ab2e1481a6b02 (3.19) */
|
|
|
|
|
#define KCMP_FILE 0
|
|
|
|
|
#endif
|
|
|
|
|
|
2021-01-15 17:06:19 +01:00
|
|
|
/* ======================================================================= */
|
|
|
|
|
|
2017-10-03 10:32:34 +02:00
|
|
|
#if !HAVE_PIVOT_ROOT
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
static inline int missing_pivot_root(const char *new_root, const char *put_old) {
|
2018-02-21 17:27:34 +01:00
|
|
|
return syscall(__NR_pivot_root, new_root, put_old);
|
2016-03-17 13:26:13 -04:00
|
|
|
}
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
|
|
|
|
|
# define pivot_root missing_pivot_root
|
2016-03-17 13:26:13 -04:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* ======================================================================= */
|
|
|
|
|
|
2021-09-14 16:27:32 +02:00
|
|
|
#if !HAVE_IOPRIO_GET
|
|
|
|
|
static inline int missing_ioprio_get(int which, int who) {
|
|
|
|
|
return syscall(__NR_ioprio_get, which, who);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# define ioprio_get missing_ioprio_get
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* ======================================================================= */
|
|
|
|
|
|
|
|
|
|
#if !HAVE_IOPRIO_SET
|
|
|
|
|
static inline int missing_ioprio_set(int which, int who, int ioprio) {
|
|
|
|
|
return syscall(__NR_ioprio_set, which, who, ioprio);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# define ioprio_set missing_ioprio_set
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* ======================================================================= */
|
|
|
|
|
|
2020-08-18 09:22:20 +02:00
|
|
|
#if !HAVE_MEMFD_CREATE
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
static inline int missing_memfd_create(const char *name, unsigned int flags) {
|
2016-03-17 13:26:13 -04:00
|
|
|
# ifdef __NR_memfd_create
|
|
|
|
|
return syscall(__NR_memfd_create, name, flags);
|
|
|
|
|
# else
|
|
|
|
|
errno = ENOSYS;
|
|
|
|
|
return -1;
|
|
|
|
|
# endif
|
|
|
|
|
}
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
|
|
|
|
|
# define memfd_create missing_memfd_create
|
2016-03-17 13:26:13 -04:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* ======================================================================= */
|
|
|
|
|
|
2020-08-18 09:22:20 +02:00
|
|
|
#if !HAVE_GETRANDOM
|
2021-12-24 19:20:36 -05:00
|
|
|
/* glibc says getrandom() returns ssize_t */
|
|
|
|
|
static inline ssize_t missing_getrandom(void *buffer, size_t count, unsigned flags) {
|
2016-03-17 13:26:13 -04:00
|
|
|
# ifdef __NR_getrandom
|
|
|
|
|
return syscall(__NR_getrandom, buffer, count, flags);
|
|
|
|
|
# else
|
|
|
|
|
errno = ENOSYS;
|
|
|
|
|
return -1;
|
|
|
|
|
# endif
|
|
|
|
|
}
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
|
|
|
|
|
# define getrandom missing_getrandom
|
2016-03-17 13:26:13 -04:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* ======================================================================= */
|
|
|
|
|
|
2020-08-18 09:22:20 +02:00
|
|
|
/* The syscall has been defined since forever, but the glibc wrapper was missing. */
|
2017-10-03 10:32:34 +02:00
|
|
|
#if !HAVE_GETTID
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
static inline pid_t missing_gettid(void) {
|
2020-08-18 09:22:20 +02:00
|
|
|
# if defined __NR_gettid && __NR_gettid >= 0
|
2018-02-21 17:27:34 +01:00
|
|
|
return (pid_t) syscall(__NR_gettid);
|
2020-08-18 09:22:20 +02:00
|
|
|
# else
|
|
|
|
|
# error "__NR_gettid not defined"
|
|
|
|
|
# endif
|
2016-03-17 13:26:13 -04:00
|
|
|
}
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
|
|
|
|
|
# define gettid missing_gettid
|
2016-03-17 13:26:13 -04:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* ======================================================================= */
|
|
|
|
|
|
2020-08-18 09:22:20 +02:00
|
|
|
#if !HAVE_NAME_TO_HANDLE_AT
|
2016-03-17 13:26:13 -04:00
|
|
|
struct file_handle {
|
|
|
|
|
unsigned int handle_bytes;
|
|
|
|
|
int handle_type;
|
|
|
|
|
unsigned char f_handle[0];
|
|
|
|
|
};
|
|
|
|
|
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
static inline int missing_name_to_handle_at(int fd, const char *name, struct file_handle *handle, int *mnt_id, int flags) {
|
2016-03-17 13:26:13 -04:00
|
|
|
# ifdef __NR_name_to_handle_at
|
|
|
|
|
return syscall(__NR_name_to_handle_at, fd, name, handle, mnt_id, flags);
|
|
|
|
|
# else
|
|
|
|
|
errno = ENOSYS;
|
|
|
|
|
return -1;
|
|
|
|
|
# endif
|
|
|
|
|
}
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
|
|
|
|
|
# define name_to_handle_at missing_name_to_handle_at
|
2016-03-17 13:26:13 -04:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* ======================================================================= */
|
|
|
|
|
|
2020-08-18 09:22:20 +02:00
|
|
|
#if !HAVE_SETNS
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
static inline int missing_setns(int fd, int nstype) {
|
2016-03-17 13:26:13 -04:00
|
|
|
# ifdef __NR_setns
|
|
|
|
|
return syscall(__NR_setns, fd, nstype);
|
|
|
|
|
# else
|
|
|
|
|
errno = ENOSYS;
|
|
|
|
|
return -1;
|
|
|
|
|
# endif
|
|
|
|
|
}
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
|
|
|
|
|
# define setns missing_setns
|
2016-03-17 13:26:13 -04:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* ======================================================================= */
|
|
|
|
|
|
|
|
|
|
static inline pid_t raw_getpid(void) {
|
|
|
|
|
#if defined(__alpha__)
|
|
|
|
|
return (pid_t) syscall(__NR_getxpid);
|
|
|
|
|
#else
|
|
|
|
|
return (pid_t) syscall(__NR_getpid);
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* ======================================================================= */
|
|
|
|
|
|
2020-08-18 09:22:20 +02:00
|
|
|
#if !HAVE_RENAMEAT2
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
static inline int missing_renameat2(int oldfd, const char *oldname, int newfd, const char *newname, unsigned flags) {
|
2016-03-17 13:26:13 -04:00
|
|
|
# ifdef __NR_renameat2
|
|
|
|
|
return syscall(__NR_renameat2, oldfd, oldname, newfd, newname, flags);
|
|
|
|
|
# else
|
|
|
|
|
errno = ENOSYS;
|
|
|
|
|
return -1;
|
|
|
|
|
# endif
|
|
|
|
|
}
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
|
|
|
|
|
# define renameat2 missing_renameat2
|
2016-03-17 13:26:13 -04:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* ======================================================================= */
|
|
|
|
|
|
2017-10-03 10:32:34 +02:00
|
|
|
#if !HAVE_KCMP
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
static inline int missing_kcmp(pid_t pid1, pid_t pid2, int type, unsigned long idx1, unsigned long idx2) {
|
2019-12-06 14:28:13 -05:00
|
|
|
# if defined __NR_kcmp && __NR_kcmp >= 0
|
2016-03-17 13:26:13 -04:00
|
|
|
return syscall(__NR_kcmp, pid1, pid2, type, idx1, idx2);
|
|
|
|
|
# else
|
|
|
|
|
errno = ENOSYS;
|
|
|
|
|
return -1;
|
|
|
|
|
# endif
|
|
|
|
|
}
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
|
|
|
|
|
# define kcmp missing_kcmp
|
2016-03-17 13:26:13 -04:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* ======================================================================= */
|
|
|
|
|
|
2017-10-03 10:32:34 +02:00
|
|
|
#if !HAVE_KEYCTL
|
2018-12-06 06:32:41 +01:00
|
|
|
static inline long missing_keyctl(int cmd, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5) {
|
2019-12-06 14:28:13 -05:00
|
|
|
# if defined __NR_keyctl && __NR_keyctl >= 0
|
2016-03-17 13:26:13 -04:00
|
|
|
return syscall(__NR_keyctl, cmd, arg2, arg3, arg4, arg5);
|
|
|
|
|
# else
|
|
|
|
|
errno = ENOSYS;
|
|
|
|
|
return -1;
|
|
|
|
|
# endif
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
|
|
|
|
|
# define keyctl missing_keyctl
|
2016-03-17 13:26:13 -04:00
|
|
|
}
|
|
|
|
|
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
static inline key_serial_t missing_add_key(const char *type, const char *description, const void *payload, size_t plen, key_serial_t ringid) {
|
2019-12-06 14:28:13 -05:00
|
|
|
# if defined __NR_add_key && __NR_add_key >= 0
|
2016-03-17 13:26:13 -04:00
|
|
|
return syscall(__NR_add_key, type, description, payload, plen, ringid);
|
|
|
|
|
# else
|
|
|
|
|
errno = ENOSYS;
|
|
|
|
|
return -1;
|
|
|
|
|
# endif
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
|
|
|
|
|
# define add_key missing_add_key
|
2016-03-17 13:26:13 -04:00
|
|
|
}
|
|
|
|
|
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
static inline key_serial_t missing_request_key(const char *type, const char *description, const char * callout_info, key_serial_t destringid) {
|
2019-12-06 14:28:13 -05:00
|
|
|
# if defined __NR_request_key && __NR_request_key >= 0
|
2016-03-17 13:26:13 -04:00
|
|
|
return syscall(__NR_request_key, type, description, callout_info, destringid);
|
|
|
|
|
# else
|
|
|
|
|
errno = ENOSYS;
|
|
|
|
|
return -1;
|
|
|
|
|
# endif
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
|
|
|
|
|
# define request_key missing_request_key
|
2016-03-17 13:26:13 -04:00
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* ======================================================================= */
|
|
|
|
|
|
2020-08-18 09:22:20 +02:00
|
|
|
#if !HAVE_COPY_FILE_RANGE
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
static inline ssize_t missing_copy_file_range(int fd_in, loff_t *off_in,
|
|
|
|
|
int fd_out, loff_t *off_out,
|
|
|
|
|
size_t len,
|
|
|
|
|
unsigned int flags) {
|
2016-03-17 13:26:13 -04:00
|
|
|
# ifdef __NR_copy_file_range
|
|
|
|
|
return syscall(__NR_copy_file_range, fd_in, off_in, fd_out, off_out, len, flags);
|
|
|
|
|
# else
|
|
|
|
|
errno = ENOSYS;
|
|
|
|
|
return -1;
|
|
|
|
|
# endif
|
|
|
|
|
}
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
|
|
|
|
|
# define copy_file_range missing_copy_file_range
|
2016-03-17 13:26:13 -04:00
|
|
|
#endif
|
2016-10-18 17:57:10 +02:00
|
|
|
|
2017-11-13 09:27:53 +01:00
|
|
|
/* ======================================================================= */
|
|
|
|
|
|
2020-08-18 09:22:20 +02:00
|
|
|
#if !HAVE_BPF
|
2016-10-18 17:57:10 +02:00
|
|
|
union bpf_attr;
|
|
|
|
|
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
static inline int missing_bpf(int cmd, union bpf_attr *attr, size_t size) {
|
2016-10-18 17:57:10 +02:00
|
|
|
#ifdef __NR_bpf
|
|
|
|
|
return (int) syscall(__NR_bpf, cmd, attr, size);
|
|
|
|
|
#else
|
|
|
|
|
errno = ENOSYS;
|
|
|
|
|
return -1;
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
# define bpf missing_bpf
|
2016-10-18 17:57:10 +02:00
|
|
|
#endif
|
2017-11-13 09:27:53 +01:00
|
|
|
|
|
|
|
|
/* ======================================================================= */
|
|
|
|
|
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
#if !HAVE_STATX
|
2020-08-18 09:22:20 +02:00
|
|
|
struct statx;
|
|
|
|
|
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
static inline ssize_t missing_statx(int dfd, const char *filename, unsigned flags, unsigned int mask, struct statx *buffer) {
|
2018-02-20 12:48:33 +01:00
|
|
|
# ifdef __NR_statx
|
|
|
|
|
return syscall(__NR_statx, dfd, filename, flags, mask, buffer);
|
|
|
|
|
# else
|
|
|
|
|
errno = ENOSYS;
|
|
|
|
|
return -1;
|
|
|
|
|
# endif
|
|
|
|
|
}
|
2020-08-18 09:22:20 +02:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* This typedef is supposed to be always defined. */
|
|
|
|
|
typedef struct statx struct_statx;
|
missing_syscall: when adding syscall replacements, use different names (#8229)
In meson.build we check that functions are available using:
meson.get_compiler('c').has_function('foo')
which checks the following:
- if __stub_foo or __stub___foo are defined, return false
- if foo is declared (a pointer to the function can be taken), return true
- otherwise check for __builtin_memfd_create
_stub is documented by glibc as
It defines a symbol '__stub_FUNCTION' for each function
in the C library which is a stub, meaning it will fail
every time called, usually setting errno to ENOSYS.
So if __stub is defined, we know we don't want to use the glibc version, but
this doesn't tell us if the name itself is defined or not. If it _is_ defined,
and we define our replacement as an inline static function, we get an error:
In file included from ../src/basic/missing.h:1358:0,
from ../src/basic/util.h:47,
from ../src/basic/calendarspec.h:29,
from ../src/basic/calendarspec.c:34:
../src/basic/missing_syscall.h:65:19: error: static declaration of 'memfd_create' follows non-static declaration
static inline int memfd_create(const char *name, unsigned int flags) {
^~~~~~~~~~~~
.../usr/include/bits/mman-shared.h:46:5: note: previous declaration of 'memfd_create' was here
int memfd_create (const char *__name, unsigned int __flags) __THROW;
^~~~~~~~~~~~
To avoid this problem, call our inline functions different than glibc,
and use a #define to map the official name to our replacement.
Fixes #8099.
v2:
- use "missing_" as the prefix instead of "_"
v3:
- rebase and update for statx()
Unfortunately "statx" is also present in "struct statx", so the define
causes issues. Work around this by using a typedef.
I checked that systemd compiles with current glibc
(glibc-devel-2.26-24.fc27.x86_64) if HAVE_MEMFD_CREATE, HAVE_GETTID,
HAVE_PIVOT_ROOT, HAVE_SETNS, HAVE_RENAMEAT2, HAVE_KCMP, HAVE_KEYCTL,
HAVE_COPY_FILE_RANGE, HAVE_BPF, HAVE_STATX are forced to 0.
Setting HAVE_NAME_TO_HANDLE_AT to 0 causes an issue, but it's not because of
the define, but because of struct file_handle.
2018-02-21 14:04:50 +01:00
|
|
|
|
2020-08-18 09:22:20 +02:00
|
|
|
#if !HAVE_STATX
|
2020-08-05 23:28:21 +02:00
|
|
|
# define statx(dfd, filename, flags, mask, buffer) missing_statx(dfd, filename, flags, mask, buffer)
|
2018-02-20 12:48:33 +01:00
|
|
|
#endif
|
2019-03-12 18:58:26 +01:00
|
|
|
|
2020-08-18 09:22:20 +02:00
|
|
|
/* ======================================================================= */
|
2019-03-12 18:58:26 +01:00
|
|
|
|
2020-08-18 09:22:20 +02:00
|
|
|
#if !HAVE_SET_MEMPOLICY
|
2019-03-12 18:58:26 +01:00
|
|
|
enum {
|
|
|
|
|
MPOL_DEFAULT,
|
|
|
|
|
MPOL_PREFERRED,
|
|
|
|
|
MPOL_BIND,
|
|
|
|
|
MPOL_INTERLEAVE,
|
|
|
|
|
MPOL_LOCAL,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static inline long missing_set_mempolicy(int mode, const unsigned long *nodemask,
|
|
|
|
|
unsigned long maxnode) {
|
|
|
|
|
long i;
|
2019-12-06 14:28:13 -05:00
|
|
|
# if defined __NR_set_mempolicy && __NR_set_mempolicy >= 0
|
2019-03-12 18:58:26 +01:00
|
|
|
i = syscall(__NR_set_mempolicy, mode, nodemask, maxnode);
|
|
|
|
|
# else
|
|
|
|
|
errno = ENOSYS;
|
|
|
|
|
i = -1;
|
|
|
|
|
# endif
|
|
|
|
|
return i;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# define set_mempolicy missing_set_mempolicy
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if !HAVE_GET_MEMPOLICY
|
|
|
|
|
static inline long missing_get_mempolicy(int *mode, unsigned long *nodemask,
|
|
|
|
|
unsigned long maxnode, void *addr,
|
|
|
|
|
unsigned long flags) {
|
|
|
|
|
long i;
|
2020-08-15 18:54:18 +02:00
|
|
|
# if defined __NR_get_mempolicy && __NR_get_mempolicy >= 0
|
2019-03-12 18:58:26 +01:00
|
|
|
i = syscall(__NR_get_mempolicy, mode, nodemask, maxnode, addr, flags);
|
|
|
|
|
# else
|
|
|
|
|
errno = ENOSYS;
|
|
|
|
|
i = -1;
|
|
|
|
|
# endif
|
|
|
|
|
return i;
|
|
|
|
|
}
|
|
|
|
|
|
2020-08-16 16:19:29 +02:00
|
|
|
# define get_mempolicy missing_get_mempolicy
|
2019-03-12 18:58:26 +01:00
|
|
|
#endif
|
2019-10-25 16:06:06 +02:00
|
|
|
|
2020-08-18 09:22:20 +02:00
|
|
|
/* ======================================================================= */
|
|
|
|
|
|
|
|
|
|
#if !HAVE_PIDFD_SEND_SIGNAL
|
2020-08-16 16:19:29 +02:00
|
|
|
static inline int missing_pidfd_send_signal(int fd, int sig, siginfo_t *info, unsigned flags) {
|
2020-10-08 10:27:30 +02:00
|
|
|
# ifdef __NR_pidfd_send_signal
|
2019-10-25 16:06:06 +02:00
|
|
|
return syscall(__NR_pidfd_send_signal, fd, sig, info, flags);
|
2020-08-15 19:01:23 +02:00
|
|
|
# else
|
2019-10-25 16:06:06 +02:00
|
|
|
errno = ENOSYS;
|
|
|
|
|
return -1;
|
2020-08-15 19:01:23 +02:00
|
|
|
# endif
|
|
|
|
|
}
|
2020-08-16 16:19:29 +02:00
|
|
|
|
|
|
|
|
# define pidfd_send_signal missing_pidfd_send_signal
|
2019-10-25 16:06:06 +02:00
|
|
|
#endif
|
2020-08-15 19:01:23 +02:00
|
|
|
|
2020-08-18 09:22:20 +02:00
|
|
|
#if !HAVE_PIDFD_OPEN
|
2020-08-16 16:19:29 +02:00
|
|
|
static inline int missing_pidfd_open(pid_t pid, unsigned flags) {
|
2020-08-15 19:01:23 +02:00
|
|
|
# ifdef __NR_pidfd_open
|
|
|
|
|
return syscall(__NR_pidfd_open, pid, flags);
|
|
|
|
|
# else
|
|
|
|
|
errno = ENOSYS;
|
|
|
|
|
return -1;
|
|
|
|
|
# endif
|
2019-10-25 16:06:06 +02:00
|
|
|
}
|
2020-08-16 16:19:29 +02:00
|
|
|
|
|
|
|
|
# define pidfd_open missing_pidfd_open
|
2019-10-25 16:06:06 +02:00
|
|
|
#endif
|
2019-10-30 16:29:42 +01:00
|
|
|
|
2020-08-18 09:22:20 +02:00
|
|
|
/* ======================================================================= */
|
|
|
|
|
|
2019-10-30 16:29:42 +01:00
|
|
|
#if !HAVE_RT_SIGQUEUEINFO
|
2020-08-16 16:19:29 +02:00
|
|
|
static inline int missing_rt_sigqueueinfo(pid_t tgid, int sig, siginfo_t *info) {
|
2020-08-18 09:22:20 +02:00
|
|
|
# if defined __NR_rt_sigqueueinfo && __NR_rt_sigqueueinfo >= 0
|
2019-10-30 16:29:42 +01:00
|
|
|
return syscall(__NR_rt_sigqueueinfo, tgid, sig, info);
|
2020-08-18 09:22:20 +02:00
|
|
|
# else
|
|
|
|
|
# error "__NR_rt_sigqueueinfo not defined"
|
|
|
|
|
# endif
|
2019-10-30 16:29:42 +01:00
|
|
|
}
|
2020-08-16 16:19:29 +02:00
|
|
|
|
|
|
|
|
# define rt_sigqueueinfo missing_rt_sigqueueinfo
|
2019-10-30 16:29:42 +01:00
|
|
|
#endif
|
2020-10-13 17:53:25 +02:00
|
|
|
|
shared/exec-util: use our own execveat() wrapper instead of fexecve()
For scripts, when we call fexecve(), on new kernels glibc calls execveat(),
which fails with ENOENT, and then we fall back to execve() which succeeds:
[pid 63039] execveat(3, "", ["/home/zbyszek/src/systemd/test/test-path-util/script.sh", "--version"], 0x7ffefa3633f0 /* 0 vars */, AT_EMPTY_PATH) = -1 ENOENT (No such file or directory)
[pid 63039] execve("/home/zbyszek/src/systemd/test/test-path-util/script.sh", ["/home/zbyszek/src/systemd/test/test-path-util/script.sh", "--version"], 0x7ffefa3633f0 /* 0 vars */) = 0
But on older kernels glibc (some versions?) implement a fallback which falls
into the same trap with bash $0:
[pid 13534] execve("/proc/self/fd/3", ["/home/test/systemd/test/test-path-util/script.sh", "--version"], 0x7fff84995870 /* 0 vars */) = 0
We don't want that, so let's call execveat() ourselves. Then we can do the
execve() fallback as we want.
2020-09-23 16:23:30 +02:00
|
|
|
/* ======================================================================= */
|
2022-11-16 15:03:11 +01:00
|
|
|
|
|
|
|
|
#if !HAVE_RT_TGSIGQUEUEINFO
|
|
|
|
|
static inline int missing_rt_tgsigqueueinfo(pid_t tgid, pid_t tid, int sig, siginfo_t *info) {
|
|
|
|
|
# if defined __NR_rt_tgsigqueueinfo && __NR_rt_tgsigqueueinfo >= 0
|
|
|
|
|
return syscall(__NR_rt_tgsigqueueinfo, tgid, tid, sig, info);
|
|
|
|
|
# else
|
|
|
|
|
# error "__NR_rt_tgsigqueueinfo not defined"
|
|
|
|
|
# endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# define rt_tgsigqueueinfo missing_rt_tgsigqueueinfo
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* ======================================================================= */
|
2020-12-07 13:32:04 +09:00
|
|
|
|
shared/exec-util: use our own execveat() wrapper instead of fexecve()
For scripts, when we call fexecve(), on new kernels glibc calls execveat(),
which fails with ENOENT, and then we fall back to execve() which succeeds:
[pid 63039] execveat(3, "", ["/home/zbyszek/src/systemd/test/test-path-util/script.sh", "--version"], 0x7ffefa3633f0 /* 0 vars */, AT_EMPTY_PATH) = -1 ENOENT (No such file or directory)
[pid 63039] execve("/home/zbyszek/src/systemd/test/test-path-util/script.sh", ["/home/zbyszek/src/systemd/test/test-path-util/script.sh", "--version"], 0x7ffefa3633f0 /* 0 vars */) = 0
But on older kernels glibc (some versions?) implement a fallback which falls
into the same trap with bash $0:
[pid 13534] execve("/proc/self/fd/3", ["/home/test/systemd/test/test-path-util/script.sh", "--version"], 0x7fff84995870 /* 0 vars */) = 0
We don't want that, so let's call execveat() ourselves. Then we can do the
execve() fallback as we want.
2020-09-23 16:23:30 +02:00
|
|
|
#if !HAVE_EXECVEAT
|
|
|
|
|
static inline int missing_execveat(int dirfd, const char *pathname,
|
|
|
|
|
char *const argv[], char *const envp[],
|
|
|
|
|
int flags) {
|
|
|
|
|
# if defined __NR_execveat && __NR_execveat >= 0
|
|
|
|
|
return syscall(__NR_execveat, dirfd, pathname, argv, envp, flags);
|
|
|
|
|
# else
|
|
|
|
|
errno = ENOSYS;
|
|
|
|
|
return -1;
|
|
|
|
|
# endif
|
|
|
|
|
}
|
2020-12-07 13:32:04 +09:00
|
|
|
|
shared/exec-util: use our own execveat() wrapper instead of fexecve()
For scripts, when we call fexecve(), on new kernels glibc calls execveat(),
which fails with ENOENT, and then we fall back to execve() which succeeds:
[pid 63039] execveat(3, "", ["/home/zbyszek/src/systemd/test/test-path-util/script.sh", "--version"], 0x7ffefa3633f0 /* 0 vars */, AT_EMPTY_PATH) = -1 ENOENT (No such file or directory)
[pid 63039] execve("/home/zbyszek/src/systemd/test/test-path-util/script.sh", ["/home/zbyszek/src/systemd/test/test-path-util/script.sh", "--version"], 0x7ffefa3633f0 /* 0 vars */) = 0
But on older kernels glibc (some versions?) implement a fallback which falls
into the same trap with bash $0:
[pid 13534] execve("/proc/self/fd/3", ["/home/test/systemd/test/test-path-util/script.sh", "--version"], 0x7fff84995870 /* 0 vars */) = 0
We don't want that, so let's call execveat() ourselves. Then we can do the
execve() fallback as we want.
2020-09-23 16:23:30 +02:00
|
|
|
# undef AT_EMPTY_PATH
|
|
|
|
|
# define AT_EMPTY_PATH 0x1000
|
|
|
|
|
# define execveat missing_execveat
|
|
|
|
|
#endif
|
|
|
|
|
|
2020-10-13 17:53:25 +02:00
|
|
|
/* ======================================================================= */
|
|
|
|
|
|
|
|
|
|
#if !HAVE_CLOSE_RANGE
|
|
|
|
|
static inline int missing_close_range(int first_fd, int end_fd, unsigned flags) {
|
|
|
|
|
# ifdef __NR_close_range
|
|
|
|
|
/* Kernel-side the syscall expects fds as unsigned integers (just like close() actually), while
|
|
|
|
|
* userspace exclusively uses signed integers for fds. We don't know just yet how glibc is going to
|
|
|
|
|
* wrap this syscall, but let's assume it's going to be similar to what they do for close(),
|
|
|
|
|
* i.e. make the same unsigned → signed type change from the raw kernel syscall compared to the
|
|
|
|
|
* userspace wrapper. There's only one caveat for this: unlike for close() there's the special
|
|
|
|
|
* UINT_MAX fd value for the 'end_fd' argument. Let's safely map that to -1 here. And let's refuse
|
|
|
|
|
* any other negative values. */
|
|
|
|
|
if ((first_fd < 0) || (end_fd < 0 && end_fd != -1)) {
|
|
|
|
|
errno = -EBADF;
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return syscall(__NR_close_range,
|
|
|
|
|
(unsigned) first_fd,
|
|
|
|
|
end_fd == -1 ? UINT_MAX : (unsigned) end_fd, /* Of course, the compiler should figure out that this is the identity mapping IRL */
|
|
|
|
|
flags);
|
|
|
|
|
# else
|
|
|
|
|
errno = ENOSYS;
|
|
|
|
|
return -1;
|
|
|
|
|
# endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# define close_range missing_close_range
|
|
|
|
|
#endif
|
2021-02-25 16:56:07 +01:00
|
|
|
|
|
|
|
|
/* ======================================================================= */
|
|
|
|
|
|
2021-04-27 14:16:06 +02:00
|
|
|
#if !HAVE_MOUNT_SETATTR
|
|
|
|
|
|
|
|
|
|
#if !HAVE_STRUCT_MOUNT_ATTR
|
|
|
|
|
struct mount_attr {
|
|
|
|
|
uint64_t attr_set;
|
|
|
|
|
uint64_t attr_clr;
|
|
|
|
|
uint64_t propagation;
|
|
|
|
|
uint64_t userns_fd;
|
|
|
|
|
};
|
|
|
|
|
#else
|
|
|
|
|
struct mount_attr;
|
|
|
|
|
#endif
|
|
|
|
|
|
2021-12-24 09:15:51 +09:00
|
|
|
#ifndef MOUNT_ATTR_RDONLY
|
|
|
|
|
#define MOUNT_ATTR_RDONLY 0x00000001 /* Mount read-only */
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef MOUNT_ATTR_NOSUID
|
|
|
|
|
#define MOUNT_ATTR_NOSUID 0x00000002 /* Ignore suid and sgid bits */
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef MOUNT_ATTR_NODEV
|
|
|
|
|
#define MOUNT_ATTR_NODEV 0x00000004 /* Disallow access to device special files */
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef MOUNT_ATTR_NOEXEC
|
|
|
|
|
#define MOUNT_ATTR_NOEXEC 0x00000008 /* Disallow program execution */
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef MOUNT_ATTR__ATIME
|
|
|
|
|
#define MOUNT_ATTR__ATIME 0x00000070 /* Setting on how atime should be updated */
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef MOUNT_ATTR_RELATIME
|
|
|
|
|
#define MOUNT_ATTR_RELATIME 0x00000000 /* - Update atime relative to mtime/ctime. */
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef MOUNT_ATTR_NOATIME
|
|
|
|
|
#define MOUNT_ATTR_NOATIME 0x00000010 /* - Do not update access times. */
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef MOUNT_ATTR_STRICTATIME
|
|
|
|
|
#define MOUNT_ATTR_STRICTATIME 0x00000020 /* - Always perform atime updates */
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef MOUNT_ATTR_NODIRATIME
|
|
|
|
|
#define MOUNT_ATTR_NODIRATIME 0x00000080 /* Do not update directory access times */
|
|
|
|
|
#endif
|
|
|
|
|
|
2021-04-27 14:16:06 +02:00
|
|
|
#ifndef MOUNT_ATTR_IDMAP
|
2021-12-24 09:15:51 +09:00
|
|
|
#define MOUNT_ATTR_IDMAP 0x00100000 /* Idmap mount to @userns_fd in struct mount_attr. */
|
2021-04-27 14:16:06 +02:00
|
|
|
#endif
|
|
|
|
|
|
2021-10-20 22:57:22 +02:00
|
|
|
#ifndef MOUNT_ATTR_NOSYMFOLLOW
|
2021-12-24 09:15:51 +09:00
|
|
|
#define MOUNT_ATTR_NOSYMFOLLOW 0x00200000 /* Do not follow symlinks */
|
2021-10-20 22:57:22 +02:00
|
|
|
#endif
|
|
|
|
|
|
2021-12-24 09:15:51 +09:00
|
|
|
#ifndef MOUNT_ATTR_SIZE_VER0
|
|
|
|
|
#define MOUNT_ATTR_SIZE_VER0 32 /* sizeof first published struct */
|
2021-04-27 14:16:06 +02:00
|
|
|
#endif
|
|
|
|
|
|
2021-12-24 09:15:51 +09:00
|
|
|
#ifndef AT_RECURSIVE
|
|
|
|
|
#define AT_RECURSIVE 0x8000
|
2021-10-20 22:57:22 +02:00
|
|
|
#endif
|
|
|
|
|
|
2021-04-27 14:16:06 +02:00
|
|
|
static inline int missing_mount_setattr(
|
|
|
|
|
int dfd,
|
|
|
|
|
const char *path,
|
|
|
|
|
unsigned flags,
|
|
|
|
|
struct mount_attr *attr,
|
|
|
|
|
size_t size) {
|
|
|
|
|
|
|
|
|
|
# if defined __NR_mount_setattr && __NR_mount_setattr >= 0
|
|
|
|
|
return syscall(__NR_mount_setattr, dfd, path, flags, attr, size);
|
|
|
|
|
# else
|
|
|
|
|
errno = ENOSYS;
|
|
|
|
|
return -1;
|
|
|
|
|
# endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# define mount_setattr missing_mount_setattr
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* ======================================================================= */
|
|
|
|
|
|
|
|
|
|
#if !HAVE_OPEN_TREE
|
|
|
|
|
|
|
|
|
|
#ifndef OPEN_TREE_CLONE
|
|
|
|
|
#define OPEN_TREE_CLONE 1
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef OPEN_TREE_CLOEXEC
|
|
|
|
|
#define OPEN_TREE_CLOEXEC O_CLOEXEC
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
static inline int missing_open_tree(
|
|
|
|
|
int dfd,
|
|
|
|
|
const char *filename,
|
|
|
|
|
unsigned flags) {
|
|
|
|
|
|
|
|
|
|
# if defined __NR_open_tree && __NR_open_tree >= 0
|
|
|
|
|
return syscall(__NR_open_tree, dfd, filename, flags);
|
|
|
|
|
# else
|
|
|
|
|
errno = ENOSYS;
|
|
|
|
|
return -1;
|
|
|
|
|
# endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# define open_tree missing_open_tree
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* ======================================================================= */
|
|
|
|
|
|
|
|
|
|
#if !HAVE_MOVE_MOUNT
|
|
|
|
|
|
|
|
|
|
#ifndef MOVE_MOUNT_F_EMPTY_PATH
|
|
|
|
|
#define MOVE_MOUNT_F_EMPTY_PATH 0x00000004 /* Empty from path permitted */
|
|
|
|
|
#endif
|
|
|
|
|
|
2022-01-07 22:25:23 +01:00
|
|
|
#ifndef MOVE_MOUNT_T_EMPTY_PATH
|
|
|
|
|
#define MOVE_MOUNT_T_EMPTY_PATH 0x00000040 /* Empty to path permitted */
|
|
|
|
|
#endif
|
|
|
|
|
|
2021-04-27 14:16:06 +02:00
|
|
|
static inline int missing_move_mount(
|
|
|
|
|
int from_dfd,
|
|
|
|
|
const char *from_pathname,
|
|
|
|
|
int to_dfd,
|
|
|
|
|
const char *to_pathname,
|
|
|
|
|
unsigned flags) {
|
|
|
|
|
|
|
|
|
|
# if defined __NR_move_mount && __NR_move_mount >= 0
|
|
|
|
|
return syscall(__NR_move_mount, from_dfd, from_pathname, to_dfd, to_pathname, flags);
|
|
|
|
|
# else
|
|
|
|
|
errno = ENOSYS;
|
|
|
|
|
return -1;
|
|
|
|
|
# endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# define move_mount missing_move_mount
|
|
|
|
|
#endif
|
2021-10-08 10:46:02 +02:00
|
|
|
|
|
|
|
|
/* ======================================================================= */
|
|
|
|
|
|
2022-10-27 13:14:12 +02:00
|
|
|
#if !HAVE_FSOPEN
|
|
|
|
|
|
|
|
|
|
#ifndef FSOPEN_CLOEXEC
|
|
|
|
|
#define FSOPEN_CLOEXEC 0x00000001
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
static inline int missing_fsopen(const char *fsname, unsigned flags) {
|
|
|
|
|
# if defined __NR_fsopen && __NR_fsopen >= 0
|
|
|
|
|
return syscall(__NR_fsopen, fsname, flags);
|
|
|
|
|
# else
|
|
|
|
|
errno = ENOSYS;
|
|
|
|
|
return -1;
|
|
|
|
|
# endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# define fsopen missing_fsopen
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* ======================================================================= */
|
|
|
|
|
|
|
|
|
|
#if !HAVE_FSCONFIG
|
|
|
|
|
|
2023-03-07 14:36:22 +01:00
|
|
|
#ifndef FSCONFIG_SET_FLAG
|
|
|
|
|
#define FSCONFIG_SET_FLAG 0 /* Set parameter, supplying no value */
|
|
|
|
|
#endif
|
|
|
|
|
|
2022-10-27 13:14:12 +02:00
|
|
|
#ifndef FSCONFIG_SET_STRING
|
|
|
|
|
#define FSCONFIG_SET_STRING 1 /* Set parameter, supplying a string value */
|
|
|
|
|
#endif
|
|
|
|
|
|
2023-03-07 14:36:22 +01:00
|
|
|
#ifndef FSCONFIG_SET_FD
|
|
|
|
|
#define FSCONFIG_SET_FD 5 /* Set parameter, supplying an object by fd */
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef FSCONFIG_CMD_CREATE
|
|
|
|
|
#define FSCONFIG_CMD_CREATE 6 /* Invoke superblock creation */
|
|
|
|
|
#endif
|
|
|
|
|
|
2022-10-27 13:14:12 +02:00
|
|
|
static inline int missing_fsconfig(int fd, unsigned cmd, const char *key, const void *value, int aux) {
|
|
|
|
|
# if defined __NR_fsconfig && __NR_fsconfig >= 0
|
|
|
|
|
return syscall(__NR_fsconfig, fd, cmd, key, value, aux);
|
|
|
|
|
# else
|
|
|
|
|
errno = ENOSYS;
|
|
|
|
|
return -1;
|
|
|
|
|
# endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# define fsconfig missing_fsconfig
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* ======================================================================= */
|
|
|
|
|
|
2023-03-07 14:36:03 +01:00
|
|
|
#if !HAVE_FSMOUNT
|
|
|
|
|
|
|
|
|
|
#ifndef FSMOUNT_CLOEXEC
|
|
|
|
|
#define FSMOUNT_CLOEXEC 0x00000001
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
static inline int missing_fsmount(int fd, unsigned flags, unsigned ms_flags) {
|
|
|
|
|
# if defined __NR_fsmount && __NR_fsmount >= 0
|
|
|
|
|
return syscall(__NR_fsmount, fd, flags, ms_flags);
|
|
|
|
|
# else
|
|
|
|
|
errno = ENOSYS;
|
|
|
|
|
return -1;
|
|
|
|
|
# endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# define fsmount missing_fsmount
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/* ======================================================================= */
|
|
|
|
|
|
2021-10-08 10:46:02 +02:00
|
|
|
#if !HAVE_GETDENTS64
|
|
|
|
|
|
|
|
|
|
static inline ssize_t missing_getdents64(int fd, void *buffer, size_t length) {
|
|
|
|
|
# if defined __NR_getdents64 && __NR_getdents64 >= 0
|
|
|
|
|
return syscall(__NR_getdents64, fd, buffer, length);
|
|
|
|
|
# else
|
|
|
|
|
errno = ENOSYS;
|
|
|
|
|
return -1;
|
|
|
|
|
# endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# define getdents64 missing_getdents64
|
|
|
|
|
#endif
|
2023-07-08 16:43:28 +01:00
|
|
|
|
|
|
|
|
/* ======================================================================= */
|
|
|
|
|
|
|
|
|
|
/* glibc does not provide clone() on ia64, only clone2(). Not only that, but it also doesn't provide a
|
|
|
|
|
* prototype, only the symbol in the shared library (it provides a prototype for clone(), but not the
|
|
|
|
|
* symbol in the shared library). */
|
|
|
|
|
#if defined(__ia64__)
|
|
|
|
|
int __clone2(int (*fn)(void *), void *stack_base, size_t stack_size, int flags, void *arg);
|
|
|
|
|
#define HAVE_CLONE 0
|
|
|
|
|
#else
|
|
|
|
|
/* We know that everywhere else clone() is available, so we don't bother with a meson check (that takes time
|
|
|
|
|
* at build time) and just define it. Once the kernel drops ia64 support, we can drop this too. */
|
|
|
|
|
#define HAVE_CLONE 1
|
|
|
|
|
#endif
|