Branch data Line data Source code
1 : : /* SPDX-License-Identifier: LGPL-2.1+ */
2 : : #pragma once
3 : :
4 : : /* Missing glibc definitions to access certain kernel APIs */
5 : :
6 : : #include <errno.h>
7 : : #include <fcntl.h>
8 : : #include <sys/syscall.h>
9 : : #include <sys/types.h>
10 : : #include <unistd.h>
11 : :
12 : : #ifdef ARCH_MIPS
13 : : #include <asm/sgidefs.h>
14 : : #endif
15 : :
16 : : #include "missing_keyctl.h"
17 : : #include "missing_stat.h"
18 : :
19 : : /* linux/kcmp.h */
20 : : #ifndef KCMP_FILE /* 3f4994cfc15f38a3159c6e3a4b3ab2e1481a6b02 (3.19) */
21 : : #define KCMP_FILE 0
22 : : #endif
23 : :
24 : : #if !HAVE_PIVOT_ROOT
25 : 0 : static inline int missing_pivot_root(const char *new_root, const char *put_old) {
26 : 0 : return syscall(__NR_pivot_root, new_root, put_old);
27 : : }
28 : :
29 : : # define pivot_root missing_pivot_root
30 : : #endif
31 : :
32 : : /* ======================================================================= */
33 : :
34 : : #if !HAVE_MEMFD_CREATE
35 : : /* may be (invalid) negative number due to libseccomp, see PR 13319 */
36 : : # if ! (defined __NR_memfd_create && __NR_memfd_create > 0)
37 : : # if defined __NR_memfd_create
38 : : # undef __NR_memfd_create
39 : : # endif
40 : : # if defined __x86_64__
41 : : # define __NR_memfd_create 319
42 : : # elif defined __arm__
43 : : # define __NR_memfd_create 385
44 : : # elif defined __aarch64__
45 : : # define __NR_memfd_create 279
46 : : # elif defined __s390__
47 : : # define __NR_memfd_create 350
48 : : # elif defined _MIPS_SIM
49 : : # if _MIPS_SIM == _MIPS_SIM_ABI32
50 : : # define __NR_memfd_create 4354
51 : : # endif
52 : : # if _MIPS_SIM == _MIPS_SIM_NABI32
53 : : # define __NR_memfd_create 6318
54 : : # endif
55 : : # if _MIPS_SIM == _MIPS_SIM_ABI64
56 : : # define __NR_memfd_create 5314
57 : : # endif
58 : : # elif defined __i386__
59 : : # define __NR_memfd_create 356
60 : : # elif defined __arc__
61 : : # define __NR_memfd_create 279
62 : : # else
63 : : # warning "__NR_memfd_create unknown for your architecture"
64 : : # endif
65 : : # endif
66 : :
67 : : static inline int missing_memfd_create(const char *name, unsigned int flags) {
68 : : # ifdef __NR_memfd_create
69 : : return syscall(__NR_memfd_create, name, flags);
70 : : # else
71 : : errno = ENOSYS;
72 : : return -1;
73 : : # endif
74 : : }
75 : :
76 : : # define memfd_create missing_memfd_create
77 : : #endif
78 : :
79 : : /* ======================================================================= */
80 : :
81 : : #if !HAVE_GETRANDOM
82 : : /* may be (invalid) negative number due to libseccomp, see PR 13319 */
83 : : # if ! (defined __NR_getrandom && __NR_getrandom > 0)
84 : : # if defined __NR_getrandom
85 : : # undef __NR_getrandom
86 : : # endif
87 : : # if defined __x86_64__
88 : : # define __NR_getrandom 318
89 : : # elif defined(__i386__)
90 : : # define __NR_getrandom 355
91 : : # elif defined(__arm__)
92 : : # define __NR_getrandom 384
93 : : # elif defined(__aarch64__)
94 : : # define __NR_getrandom 278
95 : : # elif defined(__ia64__)
96 : : # define __NR_getrandom 1339
97 : : # elif defined(__m68k__)
98 : : # define __NR_getrandom 352
99 : : # elif defined(__s390x__)
100 : : # define __NR_getrandom 349
101 : : # elif defined(__powerpc__)
102 : : # define __NR_getrandom 359
103 : : # elif defined _MIPS_SIM
104 : : # if _MIPS_SIM == _MIPS_SIM_ABI32
105 : : # define __NR_getrandom 4353
106 : : # endif
107 : : # if _MIPS_SIM == _MIPS_SIM_NABI32
108 : : # define __NR_getrandom 6317
109 : : # endif
110 : : # if _MIPS_SIM == _MIPS_SIM_ABI64
111 : : # define __NR_getrandom 5313
112 : : # endif
113 : : # elif defined(__arc__)
114 : : # define __NR_getrandom 278
115 : : # else
116 : : # warning "__NR_getrandom unknown for your architecture"
117 : : # endif
118 : : # endif
119 : :
120 : : static inline int missing_getrandom(void *buffer, size_t count, unsigned flags) {
121 : : # ifdef __NR_getrandom
122 : : return syscall(__NR_getrandom, buffer, count, flags);
123 : : # else
124 : : errno = ENOSYS;
125 : : return -1;
126 : : # endif
127 : : }
128 : :
129 : : # define getrandom missing_getrandom
130 : : #endif
131 : :
132 : : /* ======================================================================= */
133 : :
134 : : #if !HAVE_GETTID
135 : 847 : static inline pid_t missing_gettid(void) {
136 : 847 : return (pid_t) syscall(__NR_gettid);
137 : : }
138 : :
139 : : # define gettid missing_gettid
140 : : #endif
141 : :
142 : : /* ======================================================================= */
143 : :
144 : : #if !HAVE_NAME_TO_HANDLE_AT
145 : : /* may be (invalid) negative number due to libseccomp, see PR 13319 */
146 : : # if ! (defined __NR_name_to_handle_at && __NR_name_to_handle_at > 0)
147 : : # if defined __NR_name_to_handle_at
148 : : # undef __NR_name_to_handle_at
149 : : # endif
150 : : # if defined(__x86_64__)
151 : : # define __NR_name_to_handle_at 303
152 : : # elif defined(__i386__)
153 : : # define __NR_name_to_handle_at 341
154 : : # elif defined(__arm__)
155 : : # define __NR_name_to_handle_at 370
156 : : # elif defined(__powerpc__)
157 : : # define __NR_name_to_handle_at 345
158 : : # elif defined(__arc__)
159 : : # define __NR_name_to_handle_at 264
160 : : # else
161 : : # error "__NR_name_to_handle_at is not defined"
162 : : # endif
163 : : # endif
164 : :
165 : : struct file_handle {
166 : : unsigned int handle_bytes;
167 : : int handle_type;
168 : : unsigned char f_handle[0];
169 : : };
170 : :
171 : : static inline int missing_name_to_handle_at(int fd, const char *name, struct file_handle *handle, int *mnt_id, int flags) {
172 : : # ifdef __NR_name_to_handle_at
173 : : return syscall(__NR_name_to_handle_at, fd, name, handle, mnt_id, flags);
174 : : # else
175 : : errno = ENOSYS;
176 : : return -1;
177 : : # endif
178 : : }
179 : :
180 : : # define name_to_handle_at missing_name_to_handle_at
181 : : #endif
182 : :
183 : : /* ======================================================================= */
184 : :
185 : : #if !HAVE_SETNS
186 : : /* may be (invalid) negative number due to libseccomp, see PR 13319 */
187 : : # if ! (defined __NR_setns && __NR_setns > 0)
188 : : # if defined __NR_setns
189 : : # undef __NR_setns
190 : : # endif
191 : : # if defined(__x86_64__)
192 : : # define __NR_setns 308
193 : : # elif defined(__i386__)
194 : : # define __NR_setns 346
195 : : # elif defined(__arc__)
196 : : # define __NR_setns 268
197 : : # else
198 : : # error "__NR_setns is not defined"
199 : : # endif
200 : : # endif
201 : :
202 : : static inline int missing_setns(int fd, int nstype) {
203 : : # ifdef __NR_setns
204 : : return syscall(__NR_setns, fd, nstype);
205 : : # else
206 : : errno = ENOSYS;
207 : : return -1;
208 : : # endif
209 : : }
210 : :
211 : : # define setns missing_setns
212 : : #endif
213 : :
214 : : /* ======================================================================= */
215 : :
216 : 1842 : static inline pid_t raw_getpid(void) {
217 : : #if defined(__alpha__)
218 : : return (pid_t) syscall(__NR_getxpid);
219 : : #else
220 : 1842 : return (pid_t) syscall(__NR_getpid);
221 : : #endif
222 : : }
223 : :
224 : : /* ======================================================================= */
225 : :
226 : : #if !HAVE_RENAMEAT2
227 : : /* may be (invalid) negative number due to libseccomp, see PR 13319 */
228 : : # if ! (defined __NR_renameat2 && __NR_renameat2 > 0)
229 : : # if defined __NR_renameat2
230 : : # undef __NR_renameat2
231 : : # endif
232 : : # if defined __x86_64__
233 : : # define __NR_renameat2 316
234 : : # elif defined __arm__
235 : : # define __NR_renameat2 382
236 : : # elif defined __aarch64__
237 : : # define __NR_renameat2 276
238 : : # elif defined _MIPS_SIM
239 : : # if _MIPS_SIM == _MIPS_SIM_ABI32
240 : : # define __NR_renameat2 4351
241 : : # endif
242 : : # if _MIPS_SIM == _MIPS_SIM_NABI32
243 : : # define __NR_renameat2 6315
244 : : # endif
245 : : # if _MIPS_SIM == _MIPS_SIM_ABI64
246 : : # define __NR_renameat2 5311
247 : : # endif
248 : : # elif defined __i386__
249 : : # define __NR_renameat2 353
250 : : # elif defined __powerpc64__
251 : : # define __NR_renameat2 357
252 : : # elif defined __s390__ || defined __s390x__
253 : : # define __NR_renameat2 347
254 : : # elif defined __arc__
255 : : # define __NR_renameat2 276
256 : : # else
257 : : # warning "__NR_renameat2 unknown for your architecture"
258 : : # endif
259 : : # endif
260 : :
261 : : static inline int missing_renameat2(int oldfd, const char *oldname, int newfd, const char *newname, unsigned flags) {
262 : : # ifdef __NR_renameat2
263 : : return syscall(__NR_renameat2, oldfd, oldname, newfd, newname, flags);
264 : : # else
265 : : errno = ENOSYS;
266 : : return -1;
267 : : # endif
268 : : }
269 : :
270 : : # define renameat2 missing_renameat2
271 : : #endif
272 : :
273 : : /* ======================================================================= */
274 : :
275 : : #if !HAVE_KCMP
276 : 64 : static inline int missing_kcmp(pid_t pid1, pid_t pid2, int type, unsigned long idx1, unsigned long idx2) {
277 : : # ifdef __NR_kcmp
278 : 64 : return syscall(__NR_kcmp, pid1, pid2, type, idx1, idx2);
279 : : # else
280 : : errno = ENOSYS;
281 : : return -1;
282 : : # endif
283 : : }
284 : :
285 : : # define kcmp missing_kcmp
286 : : #endif
287 : :
288 : : /* ======================================================================= */
289 : :
290 : : #if !HAVE_KEYCTL
291 : 0 : static inline long missing_keyctl(int cmd, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5) {
292 : : # ifdef __NR_keyctl
293 : 0 : return syscall(__NR_keyctl, cmd, arg2, arg3, arg4, arg5);
294 : : # else
295 : : errno = ENOSYS;
296 : : return -1;
297 : : # endif
298 : :
299 : : # define keyctl missing_keyctl
300 : : }
301 : :
302 : 0 : static inline key_serial_t missing_add_key(const char *type, const char *description, const void *payload, size_t plen, key_serial_t ringid) {
303 : : # ifdef __NR_add_key
304 : 0 : return syscall(__NR_add_key, type, description, payload, plen, ringid);
305 : : # else
306 : : errno = ENOSYS;
307 : : return -1;
308 : : # endif
309 : :
310 : : # define add_key missing_add_key
311 : : }
312 : :
313 : 4 : static inline key_serial_t missing_request_key(const char *type, const char *description, const char * callout_info, key_serial_t destringid) {
314 : : # ifdef __NR_request_key
315 : 4 : return syscall(__NR_request_key, type, description, callout_info, destringid);
316 : : # else
317 : : errno = ENOSYS;
318 : : return -1;
319 : : # endif
320 : :
321 : : # define request_key missing_request_key
322 : : }
323 : : #endif
324 : :
325 : : /* ======================================================================= */
326 : :
327 : : #if !HAVE_COPY_FILE_RANGE
328 : : /* may be (invalid) negative number due to libseccomp, see PR 13319 */
329 : : # if ! (defined __NR_copy_file_range && __NR_copy_file_range > 0)
330 : : # if defined __NR_copy_file_range
331 : : # undef __NR_copy_file_range
332 : : # endif
333 : : # if defined(__x86_64__)
334 : : # define __NR_copy_file_range 326
335 : : # elif defined(__i386__)
336 : : # define __NR_copy_file_range 377
337 : : # elif defined __s390__
338 : : # define __NR_copy_file_range 375
339 : : # elif defined __arm__
340 : : # define __NR_copy_file_range 391
341 : : # elif defined __aarch64__
342 : : # define __NR_copy_file_range 285
343 : : # elif defined __powerpc__
344 : : # define __NR_copy_file_range 379
345 : : # elif defined __arc__
346 : : # define __NR_copy_file_range 285
347 : : # else
348 : : # warning "__NR_copy_file_range not defined for your architecture"
349 : : # endif
350 : : # endif
351 : :
352 : : static inline ssize_t missing_copy_file_range(int fd_in, loff_t *off_in,
353 : : int fd_out, loff_t *off_out,
354 : : size_t len,
355 : : unsigned int flags) {
356 : : # ifdef __NR_copy_file_range
357 : : return syscall(__NR_copy_file_range, fd_in, off_in, fd_out, off_out, len, flags);
358 : : # else
359 : : errno = ENOSYS;
360 : : return -1;
361 : : # endif
362 : : }
363 : :
364 : : # define copy_file_range missing_copy_file_range
365 : : #endif
366 : :
367 : : /* ======================================================================= */
368 : :
369 : : #if !HAVE_BPF
370 : : /* may be (invalid) negative number due to libseccomp, see PR 13319 */
371 : : # if ! (defined __NR_bpf && __NR_bpf > 0)
372 : : # if defined __NR_bpf
373 : : # undef __NR_bpf
374 : : # endif
375 : : # if defined __i386__
376 : : # define __NR_bpf 357
377 : : # elif defined __x86_64__
378 : : # define __NR_bpf 321
379 : : # elif defined __aarch64__
380 : : # define __NR_bpf 280
381 : : # elif defined __arm__
382 : : # define __NR_bpf 386
383 : : # elif defined __sparc__
384 : : # define __NR_bpf 349
385 : : # elif defined __s390__
386 : : # define __NR_bpf 351
387 : : # elif defined __tilegx__
388 : : # define __NR_bpf 280
389 : : # else
390 : : # warning "__NR_bpf not defined for your architecture"
391 : : # endif
392 : : # endif
393 : :
394 : : union bpf_attr;
395 : :
396 : 40 : static inline int missing_bpf(int cmd, union bpf_attr *attr, size_t size) {
397 : : #ifdef __NR_bpf
398 : 40 : return (int) syscall(__NR_bpf, cmd, attr, size);
399 : : #else
400 : : errno = ENOSYS;
401 : : return -1;
402 : : #endif
403 : : }
404 : :
405 : : # define bpf missing_bpf
406 : : #endif
407 : :
408 : : /* ======================================================================= */
409 : :
410 : : #ifndef __IGNORE_pkey_mprotect
411 : : /* may be (invalid) negative number due to libseccomp, see PR 13319 */
412 : : # if ! (defined __NR_pkey_mprotect && __NR_pkey_mprotect > 0)
413 : : # if defined __NR_pkey_mprotect
414 : : # undef __NR_pkey_mprotect
415 : : # endif
416 : : # if defined __i386__
417 : : # define __NR_pkey_mprotect 380
418 : : # elif defined __x86_64__
419 : : # define __NR_pkey_mprotect 329
420 : : # elif defined __arm__
421 : : # define __NR_pkey_mprotect 394
422 : : # elif defined __aarch64__
423 : : # define __NR_pkey_mprotect 394
424 : : # elif defined __powerpc__
425 : : # define __NR_pkey_mprotect 386
426 : : # elif defined __s390__
427 : : # define __NR_pkey_mprotect 384
428 : : # elif defined _MIPS_SIM
429 : : # if _MIPS_SIM == _MIPS_SIM_ABI32
430 : : # define __NR_pkey_mprotect 4363
431 : : # endif
432 : : # if _MIPS_SIM == _MIPS_SIM_NABI32
433 : : # define __NR_pkey_mprotect 6327
434 : : # endif
435 : : # if _MIPS_SIM == _MIPS_SIM_ABI64
436 : : # define __NR_pkey_mprotect 5323
437 : : # endif
438 : : # else
439 : : # warning "__NR_pkey_mprotect not defined for your architecture"
440 : : # endif
441 : : # endif
442 : : #endif
443 : :
444 : : /* ======================================================================= */
445 : :
446 : : #if !HAVE_STATX
447 : : /* may be (invalid) negative number due to libseccomp, see PR 13319 */
448 : : # if ! (defined __NR_statx && __NR_statx > 0)
449 : : # if defined __NR_statx
450 : : # undef __NR_statx
451 : : # endif
452 : : # if defined __aarch64__ || defined __arm__
453 : : # define __NR_statx 397
454 : : # elif defined __alpha__
455 : : # define __NR_statx 522
456 : : # elif defined __i386__ || defined __powerpc64__
457 : : # define __NR_statx 383
458 : : # elif defined __sparc__
459 : : # define __NR_statx 360
460 : : # elif defined __x86_64__
461 : : # define __NR_statx 332
462 : : # else
463 : : # warning "__NR_statx not defined for your architecture"
464 : : # endif
465 : : # endif
466 : :
467 : : struct statx;
468 : : #endif
469 : :
470 : : /* This typedef is supposed to be always defined. */
471 : : typedef struct statx struct_statx;
472 : :
473 : : #if !HAVE_STATX
474 : : static inline ssize_t missing_statx(int dfd, const char *filename, unsigned flags, unsigned int mask, struct statx *buffer) {
475 : : # ifdef __NR_statx
476 : : return syscall(__NR_statx, dfd, filename, flags, mask, buffer);
477 : : # else
478 : : errno = ENOSYS;
479 : : return -1;
480 : : # endif
481 : : }
482 : :
483 : : # define statx missing_statx
484 : : #endif
485 : :
486 : : #if !HAVE_SET_MEMPOLICY
487 : :
488 : : enum {
489 : : MPOL_DEFAULT,
490 : : MPOL_PREFERRED,
491 : : MPOL_BIND,
492 : : MPOL_INTERLEAVE,
493 : : MPOL_LOCAL,
494 : : };
495 : :
496 : 0 : static inline long missing_set_mempolicy(int mode, const unsigned long *nodemask,
497 : : unsigned long maxnode) {
498 : : long i;
499 : : # ifdef __NR_set_mempolicy
500 : 0 : i = syscall(__NR_set_mempolicy, mode, nodemask, maxnode);
501 : : # else
502 : : errno = ENOSYS;
503 : : i = -1;
504 : : # endif
505 : 0 : return i;
506 : : }
507 : :
508 : : # define set_mempolicy missing_set_mempolicy
509 : : #endif
510 : :
511 : : #if !HAVE_GET_MEMPOLICY
512 : 0 : static inline long missing_get_mempolicy(int *mode, unsigned long *nodemask,
513 : : unsigned long maxnode, void *addr,
514 : : unsigned long flags) {
515 : : long i;
516 : : # ifdef __NR_get_mempolicy
517 : 0 : i = syscall(__NR_get_mempolicy, mode, nodemask, maxnode, addr, flags);
518 : : # else
519 : : errno = ENOSYS;
520 : : i = -1;
521 : : # endif
522 : 0 : return i;
523 : : }
524 : :
525 : : #define get_mempolicy missing_get_mempolicy
526 : : #endif
|