|
32 | 32 | */ |
33 | 33 |
|
34 | 34 | #include "libglnx-config.h" |
| 35 | +#include <glib.h> |
35 | 36 |
|
36 | 37 | #if !HAVE_DECL_RENAMEAT2 |
37 | 38 | # ifndef __NR_renameat2 |
@@ -155,3 +156,83 @@ static inline ssize_t missing_copy_file_range(int fd_in, loff_t *off_in, |
155 | 156 |
|
156 | 157 | # define copy_file_range missing_copy_file_range |
157 | 158 | #endif |
| 159 | + |
| 160 | +#ifndef __IGNORE_close_range |
| 161 | +# if defined(__aarch64__) |
| 162 | +# define systemd_NR_close_range 436 |
| 163 | +# elif defined(__alpha__) |
| 164 | +# define systemd_NR_close_range 546 |
| 165 | +# elif defined(__arc__) || defined(__tilegx__) |
| 166 | +# define systemd_NR_close_range 436 |
| 167 | +# elif defined(__arm__) |
| 168 | +# define systemd_NR_close_range 436 |
| 169 | +# elif defined(__i386__) |
| 170 | +# define systemd_NR_close_range 436 |
| 171 | +# elif defined(__ia64__) |
| 172 | +# define systemd_NR_close_range 1460 |
| 173 | +# elif defined(__loongarch_lp64) |
| 174 | +# define systemd_NR_close_range 436 |
| 175 | +# elif defined(__m68k__) |
| 176 | +# define systemd_NR_close_range 436 |
| 177 | +# elif defined(_MIPS_SIM) |
| 178 | +# if _MIPS_SIM == _MIPS_SIM_ABI32 |
| 179 | +# define systemd_NR_close_range 4436 |
| 180 | +# elif _MIPS_SIM == _MIPS_SIM_NABI32 |
| 181 | +# define systemd_NR_close_range 6436 |
| 182 | +# elif _MIPS_SIM == _MIPS_SIM_ABI64 |
| 183 | +# define systemd_NR_close_range 5436 |
| 184 | +# else |
| 185 | +# error "Unknown MIPS ABI" |
| 186 | +# endif |
| 187 | +# elif defined(__hppa__) |
| 188 | +# define systemd_NR_close_range 436 |
| 189 | +# elif defined(__powerpc__) |
| 190 | +# define systemd_NR_close_range 436 |
| 191 | +# elif defined(__riscv) |
| 192 | +# if __riscv_xlen == 32 |
| 193 | +# define systemd_NR_close_range 436 |
| 194 | +# elif __riscv_xlen == 64 |
| 195 | +# define systemd_NR_close_range 436 |
| 196 | +# else |
| 197 | +# error "Unknown RISC-V ABI" |
| 198 | +# endif |
| 199 | +# elif defined(__s390__) |
| 200 | +# define systemd_NR_close_range 436 |
| 201 | +# elif defined(__sparc__) |
| 202 | +# define systemd_NR_close_range 436 |
| 203 | +# elif defined(__x86_64__) |
| 204 | +# if defined(__ILP32__) |
| 205 | +# define systemd_NR_close_range (436 | /* __X32_SYSCALL_BIT */ 0x40000000) |
| 206 | +# else |
| 207 | +# define systemd_NR_close_range 436 |
| 208 | +# endif |
| 209 | +# elif !defined(missing_arch_template) |
| 210 | +# warning "close_range() syscall number is unknown for your architecture" |
| 211 | +# endif |
| 212 | + |
| 213 | +/* may be an (invalid) negative number due to libseccomp, see PR 13319 */ |
| 214 | +# if defined __NR_close_range && __NR_close_range >= 0 |
| 215 | +# if defined systemd_NR_close_range |
| 216 | +G_STATIC_ASSERT(__NR_close_range == systemd_NR_close_range); |
| 217 | +# endif |
| 218 | +# else |
| 219 | +# if defined __NR_close_range |
| 220 | +# undef __NR_close_range |
| 221 | +# endif |
| 222 | +# if defined systemd_NR_close_range && systemd_NR_close_range >= 0 |
| 223 | +# define __NR_close_range systemd_NR_close_range |
| 224 | +# endif |
| 225 | +# endif |
| 226 | +#endif |
| 227 | + |
| 228 | +#if !defined(HAVE_CLOSE_RANGE) && defined(__NR_close_range) |
| 229 | +static inline int |
| 230 | +inline_close_range (unsigned int low, |
| 231 | + unsigned int high, |
| 232 | + int flags) |
| 233 | +{ |
| 234 | + return syscall (__NR_close_range, low, high, flags); |
| 235 | +} |
| 236 | +#define close_range(low, high, flags) inline_close_range(low, high, flags) |
| 237 | +#define HAVE_CLOSE_RANGE |
| 238 | +#endif |
0 commit comments