Line data Source code
1 : /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2 :
3 : #pragma once
4 :
5 : /***
6 : This file is part of systemd.
7 :
8 : Copyright 2010 Lennart Poettering
9 :
10 : systemd is free software; you can redistribute it and/or modify it
11 : under the terms of the GNU Lesser General Public License as published by
12 : the Free Software Foundation; either version 2.1 of the License, or
13 : (at your option) any later version.
14 :
15 : systemd is distributed in the hope that it will be useful, but
16 : WITHOUT ANY WARRANTY; without even the implied warranty of
17 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 : Lesser General Public License for more details.
19 :
20 : You should have received a copy of the GNU Lesser General Public License
21 : along with systemd; If not, see <http://www.gnu.org/licenses/>.
22 : ***/
23 :
24 : /* Missing glibc definitions to access certain kernel APIs */
25 :
26 : #include <sys/resource.h>
27 : #include <sys/syscall.h>
28 : #include <fcntl.h>
29 : #include <stdlib.h>
30 : #include <unistd.h>
31 : #include <errno.h>
32 : #include <linux/oom.h>
33 : #include <linux/input.h>
34 : #include <linux/if_link.h>
35 : #include <linux/loop.h>
36 : #include <linux/audit.h>
37 : #include <linux/capability.h>
38 : #include <linux/neighbour.h>
39 :
40 : #ifdef HAVE_AUDIT
41 : #include <libaudit.h>
42 : #endif
43 :
44 : #ifdef ARCH_MIPS
45 : #include <asm/sgidefs.h>
46 : #endif
47 :
48 : #ifdef HAVE_LINUX_BTRFS_H
49 : #include <linux/btrfs.h>
50 : #endif
51 :
52 : #include "macro.h"
53 :
54 : #ifndef RLIMIT_RTTIME
55 : #define RLIMIT_RTTIME 15
56 : #endif
57 :
58 : /* If RLIMIT_RTTIME is not defined, then we cannot use RLIMIT_NLIMITS as is */
59 : #define _RLIMIT_MAX (RLIMIT_RTTIME+1 > RLIMIT_NLIMITS ? RLIMIT_RTTIME+1 : RLIMIT_NLIMITS)
60 :
61 : #ifndef F_LINUX_SPECIFIC_BASE
62 : #define F_LINUX_SPECIFIC_BASE 1024
63 : #endif
64 :
65 : #ifndef F_SETPIPE_SZ
66 : #define F_SETPIPE_SZ (F_LINUX_SPECIFIC_BASE + 7)
67 : #endif
68 :
69 : #ifndef F_GETPIPE_SZ
70 : #define F_GETPIPE_SZ (F_LINUX_SPECIFIC_BASE + 8)
71 : #endif
72 :
73 : #ifndef F_ADD_SEALS
74 : #define F_ADD_SEALS (F_LINUX_SPECIFIC_BASE + 9)
75 : #define F_GET_SEALS (F_LINUX_SPECIFIC_BASE + 10)
76 :
77 : #define F_SEAL_SEAL 0x0001 /* prevent further seals from being set */
78 : #define F_SEAL_SHRINK 0x0002 /* prevent file from shrinking */
79 : #define F_SEAL_GROW 0x0004 /* prevent file from growing */
80 : #define F_SEAL_WRITE 0x0008 /* prevent writes */
81 : #endif
82 :
83 : #ifndef F_OFD_GETLK
84 : #define F_OFD_GETLK 36
85 : #define F_OFD_SETLK 37
86 : #define F_OFD_SETLKW 38
87 : #endif
88 :
89 : #ifndef MFD_ALLOW_SEALING
90 : #define MFD_ALLOW_SEALING 0x0002U
91 : #endif
92 :
93 : #ifndef MFD_CLOEXEC
94 : #define MFD_CLOEXEC 0x0001U
95 : #endif
96 :
97 : #ifndef IP_FREEBIND
98 : #define IP_FREEBIND 15
99 : #endif
100 :
101 : #ifndef OOM_SCORE_ADJ_MIN
102 : #define OOM_SCORE_ADJ_MIN (-1000)
103 : #endif
104 :
105 : #ifndef OOM_SCORE_ADJ_MAX
106 : #define OOM_SCORE_ADJ_MAX 1000
107 : #endif
108 :
109 : #ifndef AUDIT_SERVICE_START
110 : #define AUDIT_SERVICE_START 1130 /* Service (daemon) start */
111 : #endif
112 :
113 : #ifndef AUDIT_SERVICE_STOP
114 : #define AUDIT_SERVICE_STOP 1131 /* Service (daemon) stop */
115 : #endif
116 :
117 : #ifndef TIOCVHANGUP
118 : #define TIOCVHANGUP 0x5437
119 : #endif
120 :
121 : #ifndef IP_TRANSPARENT
122 : #define IP_TRANSPARENT 19
123 : #endif
124 :
125 : #ifndef SOL_NETLINK
126 : #define SOL_NETLINK 270
127 : #endif
128 :
129 : #if !HAVE_DECL_PIVOT_ROOT
130 : static inline int pivot_root(const char *new_root, const char *put_old) {
131 : return syscall(SYS_pivot_root, new_root, put_old);
132 : }
133 : #endif
134 :
135 : #ifndef __NR_memfd_create
136 : # if defined __x86_64__
137 : # define __NR_memfd_create 319
138 : # elif defined __arm__
139 : # define __NR_memfd_create 385
140 : # elif defined __aarch64__
141 : # define __NR_memfd_create 279
142 : # elif defined _MIPS_SIM
143 : # if _MIPS_SIM == _MIPS_SIM_ABI32
144 : # define __NR_memfd_create 4354
145 : # endif
146 : # if _MIPS_SIM == _MIPS_SIM_NABI32
147 : # define __NR_memfd_create 6318
148 : # endif
149 : # if _MIPS_SIM == _MIPS_SIM_ABI64
150 : # define __NR_memfd_create 5314
151 : # endif
152 : # elif defined __i386__
153 : # define __NR_memfd_create 356
154 : # else
155 : # warning "__NR_memfd_create unknown for your architecture"
156 : # define __NR_memfd_create 0xffffffff
157 : # endif
158 : #endif
159 :
160 : #ifndef HAVE_MEMFD_CREATE
161 50 : static inline int memfd_create(const char *name, unsigned int flags) {
162 50 : return syscall(__NR_memfd_create, name, flags);
163 : }
164 : #endif
165 :
166 : #ifndef __NR_getrandom
167 : # if defined __x86_64__
168 : # define __NR_getrandom 318
169 : # elif defined(__i386__)
170 : # define __NR_getrandom 355
171 : # elif defined(__arm__)
172 : # define __NR_getrandom 384
173 : # elif defined(__aarch64__)
174 : # define __NR_getrandom 278
175 : # elif defined(__ia64__)
176 : # define __NR_getrandom 1339
177 : # elif defined(__m68k__)
178 : # define __NR_getrandom 352
179 : # elif defined(__s390x__)
180 : # define __NR_getrandom 349
181 : # elif defined(__powerpc__)
182 : # define __NR_getrandom 359
183 : # elif defined _MIPS_SIM
184 : # if _MIPS_SIM == _MIPS_SIM_ABI32
185 : # define __NR_getrandom 4353
186 : # endif
187 : # if _MIPS_SIM == _MIPS_SIM_NABI32
188 : # define __NR_getrandom 6317
189 : # endif
190 : # if _MIPS_SIM == _MIPS_SIM_ABI64
191 : # define __NR_getrandom 5313
192 : # endif
193 : # else
194 : # warning "__NR_getrandom unknown for your architecture"
195 : # define __NR_getrandom 0xffffffff
196 : # endif
197 : #endif
198 :
199 : #if !HAVE_DECL_GETRANDOM
200 1038 : static inline int getrandom(void *buffer, size_t count, unsigned flags) {
201 1038 : return syscall(__NR_getrandom, buffer, count, flags);
202 : }
203 : #endif
204 :
205 : #ifndef GRND_NONBLOCK
206 : #define GRND_NONBLOCK 0x0001
207 : #endif
208 :
209 : #ifndef GRND_RANDOM
210 : #define GRND_RANDOM 0x0002
211 : #endif
212 :
213 : #ifndef BTRFS_IOCTL_MAGIC
214 : #define BTRFS_IOCTL_MAGIC 0x94
215 : #endif
216 :
217 : #ifndef BTRFS_PATH_NAME_MAX
218 : #define BTRFS_PATH_NAME_MAX 4087
219 : #endif
220 :
221 : #ifndef BTRFS_DEVICE_PATH_NAME_MAX
222 : #define BTRFS_DEVICE_PATH_NAME_MAX 1024
223 : #endif
224 :
225 : #ifndef BTRFS_FSID_SIZE
226 : #define BTRFS_FSID_SIZE 16
227 : #endif
228 :
229 : #ifndef BTRFS_UUID_SIZE
230 : #define BTRFS_UUID_SIZE 16
231 : #endif
232 :
233 : #ifndef BTRFS_SUBVOL_RDONLY
234 : #define BTRFS_SUBVOL_RDONLY (1ULL << 1)
235 : #endif
236 :
237 : #ifndef BTRFS_SUBVOL_NAME_MAX
238 : #define BTRFS_SUBVOL_NAME_MAX 4039
239 : #endif
240 :
241 : #ifndef BTRFS_INO_LOOKUP_PATH_MAX
242 : #define BTRFS_INO_LOOKUP_PATH_MAX 4080
243 : #endif
244 :
245 : #ifndef BTRFS_SEARCH_ARGS_BUFSIZE
246 : #define BTRFS_SEARCH_ARGS_BUFSIZE (4096 - sizeof(struct btrfs_ioctl_search_key))
247 : #endif
248 :
249 : #ifndef HAVE_LINUX_BTRFS_H
250 : struct btrfs_ioctl_vol_args {
251 : int64_t fd;
252 : char name[BTRFS_PATH_NAME_MAX + 1];
253 : };
254 :
255 : struct btrfs_qgroup_limit {
256 : __u64 flags;
257 : __u64 max_rfer;
258 : __u64 max_excl;
259 : __u64 rsv_rfer;
260 : __u64 rsv_excl;
261 : };
262 :
263 : struct btrfs_qgroup_inherit {
264 : __u64 flags;
265 : __u64 num_qgroups;
266 : __u64 num_ref_copies;
267 : __u64 num_excl_copies;
268 : struct btrfs_qgroup_limit lim;
269 : __u64 qgroups[0];
270 : };
271 :
272 : struct btrfs_ioctl_qgroup_limit_args {
273 : __u64 qgroupid;
274 : struct btrfs_qgroup_limit lim;
275 : };
276 :
277 : struct btrfs_ioctl_vol_args_v2 {
278 : __s64 fd;
279 : __u64 transid;
280 : __u64 flags;
281 : union {
282 : struct {
283 : __u64 size;
284 : struct btrfs_qgroup_inherit *qgroup_inherit;
285 : };
286 : __u64 unused[4];
287 : };
288 : char name[BTRFS_SUBVOL_NAME_MAX + 1];
289 : };
290 :
291 : struct btrfs_ioctl_dev_info_args {
292 : uint64_t devid; /* in/out */
293 : uint8_t uuid[BTRFS_UUID_SIZE]; /* in/out */
294 : uint64_t bytes_used; /* out */
295 : uint64_t total_bytes; /* out */
296 : uint64_t unused[379]; /* pad to 4k */
297 : char path[BTRFS_DEVICE_PATH_NAME_MAX]; /* out */
298 : };
299 :
300 : struct btrfs_ioctl_fs_info_args {
301 : uint64_t max_id; /* out */
302 : uint64_t num_devices; /* out */
303 : uint8_t fsid[BTRFS_FSID_SIZE]; /* out */
304 : uint64_t reserved[124]; /* pad to 1k */
305 : };
306 :
307 : struct btrfs_ioctl_ino_lookup_args {
308 : __u64 treeid;
309 : __u64 objectid;
310 : char name[BTRFS_INO_LOOKUP_PATH_MAX];
311 : };
312 :
313 : struct btrfs_ioctl_search_key {
314 : /* which root are we searching. 0 is the tree of tree roots */
315 : __u64 tree_id;
316 :
317 : /* keys returned will be >= min and <= max */
318 : __u64 min_objectid;
319 : __u64 max_objectid;
320 :
321 : /* keys returned will be >= min and <= max */
322 : __u64 min_offset;
323 : __u64 max_offset;
324 :
325 : /* max and min transids to search for */
326 : __u64 min_transid;
327 : __u64 max_transid;
328 :
329 : /* keys returned will be >= min and <= max */
330 : __u32 min_type;
331 : __u32 max_type;
332 :
333 : /*
334 : * how many items did userland ask for, and how many are we
335 : * returning
336 : */
337 : __u32 nr_items;
338 :
339 : /* align to 64 bits */
340 : __u32 unused;
341 :
342 : /* some extra for later */
343 : __u64 unused1;
344 : __u64 unused2;
345 : __u64 unused3;
346 : __u64 unused4;
347 : };
348 :
349 : struct btrfs_ioctl_search_header {
350 : __u64 transid;
351 : __u64 objectid;
352 : __u64 offset;
353 : __u32 type;
354 : __u32 len;
355 : };
356 :
357 :
358 : struct btrfs_ioctl_search_args {
359 : struct btrfs_ioctl_search_key key;
360 : char buf[BTRFS_SEARCH_ARGS_BUFSIZE];
361 : };
362 :
363 : struct btrfs_ioctl_clone_range_args {
364 : __s64 src_fd;
365 : __u64 src_offset, src_length;
366 : __u64 dest_offset;
367 : };
368 :
369 : #define BTRFS_QUOTA_CTL_ENABLE 1
370 : #define BTRFS_QUOTA_CTL_DISABLE 2
371 : #define BTRFS_QUOTA_CTL_RESCAN__NOTUSED 3
372 : struct btrfs_ioctl_quota_ctl_args {
373 : __u64 cmd;
374 : __u64 status;
375 : };
376 : #endif
377 :
378 : #ifndef BTRFS_IOC_DEFRAG
379 : #define BTRFS_IOC_DEFRAG _IOW(BTRFS_IOCTL_MAGIC, 2, \
380 : struct btrfs_ioctl_vol_args)
381 : #endif
382 :
383 : #ifndef BTRFS_IOC_RESIZE
384 : #define BTRFS_IOC_RESIZE _IOW(BTRFS_IOCTL_MAGIC, 3, \
385 : struct btrfs_ioctl_vol_args)
386 : #endif
387 :
388 : #ifndef BTRFS_IOC_CLONE
389 : #define BTRFS_IOC_CLONE _IOW(BTRFS_IOCTL_MAGIC, 9, int)
390 : #endif
391 :
392 : #ifndef BTRFS_IOC_CLONE_RANGE
393 : #define BTRFS_IOC_CLONE_RANGE _IOW(BTRFS_IOCTL_MAGIC, 13, \
394 : struct btrfs_ioctl_clone_range_args)
395 : #endif
396 :
397 : #ifndef BTRFS_IOC_SUBVOL_CREATE
398 : #define BTRFS_IOC_SUBVOL_CREATE _IOW(BTRFS_IOCTL_MAGIC, 14, \
399 : struct btrfs_ioctl_vol_args)
400 : #endif
401 :
402 : #ifndef BTRFS_IOC_SNAP_DESTROY
403 : #define BTRFS_IOC_SNAP_DESTROY _IOW(BTRFS_IOCTL_MAGIC, 15, \
404 : struct btrfs_ioctl_vol_args)
405 : #endif
406 :
407 : #ifndef BTRFS_IOC_TREE_SEARCH
408 : #define BTRFS_IOC_TREE_SEARCH _IOWR(BTRFS_IOCTL_MAGIC, 17, \
409 : struct btrfs_ioctl_search_args)
410 : #endif
411 :
412 : #ifndef BTRFS_IOC_INO_LOOKUP
413 : #define BTRFS_IOC_INO_LOOKUP _IOWR(BTRFS_IOCTL_MAGIC, 18, \
414 : struct btrfs_ioctl_ino_lookup_args)
415 : #endif
416 :
417 : #ifndef BTRFS_IOC_SNAP_CREATE_V2
418 : #define BTRFS_IOC_SNAP_CREATE_V2 _IOW(BTRFS_IOCTL_MAGIC, 23, \
419 : struct btrfs_ioctl_vol_args_v2)
420 : #endif
421 :
422 : #ifndef BTRFS_IOC_SUBVOL_GETFLAGS
423 : #define BTRFS_IOC_SUBVOL_GETFLAGS _IOR(BTRFS_IOCTL_MAGIC, 25, __u64)
424 : #endif
425 :
426 : #ifndef BTRFS_IOC_SUBVOL_SETFLAGS
427 : #define BTRFS_IOC_SUBVOL_SETFLAGS _IOW(BTRFS_IOCTL_MAGIC, 26, __u64)
428 : #endif
429 :
430 : #ifndef BTRFS_IOC_DEV_INFO
431 : #define BTRFS_IOC_DEV_INFO _IOWR(BTRFS_IOCTL_MAGIC, 30, \
432 : struct btrfs_ioctl_dev_info_args)
433 : #endif
434 :
435 : #ifndef BTRFS_IOC_FS_INFO
436 : #define BTRFS_IOC_FS_INFO _IOR(BTRFS_IOCTL_MAGIC, 31, \
437 : struct btrfs_ioctl_fs_info_args)
438 : #endif
439 :
440 : #ifndef BTRFS_IOC_DEVICES_READY
441 : #define BTRFS_IOC_DEVICES_READY _IOR(BTRFS_IOCTL_MAGIC, 39, \
442 : struct btrfs_ioctl_vol_args)
443 : #endif
444 :
445 : #ifndef BTRFS_IOC_QUOTA_CTL
446 : #define BTRFS_IOC_QUOTA_CTL _IOWR(BTRFS_IOCTL_MAGIC, 40, \
447 : struct btrfs_ioctl_quota_ctl_args)
448 : #endif
449 :
450 : #ifndef BTRFS_IOC_QGROUP_LIMIT
451 : #define BTRFS_IOC_QGROUP_LIMIT _IOR(BTRFS_IOCTL_MAGIC, 43, \
452 : struct btrfs_ioctl_qgroup_limit_args)
453 : #endif
454 :
455 : #ifndef BTRFS_FIRST_FREE_OBJECTID
456 : #define BTRFS_FIRST_FREE_OBJECTID 256
457 : #endif
458 :
459 : #ifndef BTRFS_LAST_FREE_OBJECTID
460 : #define BTRFS_LAST_FREE_OBJECTID -256ULL
461 : #endif
462 :
463 : #ifndef BTRFS_ROOT_TREE_OBJECTID
464 : #define BTRFS_ROOT_TREE_OBJECTID 1
465 : #endif
466 :
467 : #ifndef BTRFS_QUOTA_TREE_OBJECTID
468 : #define BTRFS_QUOTA_TREE_OBJECTID 8ULL
469 : #endif
470 :
471 : #ifndef BTRFS_ROOT_ITEM_KEY
472 : #define BTRFS_ROOT_ITEM_KEY 132
473 : #endif
474 :
475 : #ifndef BTRFS_QGROUP_STATUS_KEY
476 : #define BTRFS_QGROUP_STATUS_KEY 240
477 : #endif
478 :
479 : #ifndef BTRFS_QGROUP_INFO_KEY
480 : #define BTRFS_QGROUP_INFO_KEY 242
481 : #endif
482 :
483 : #ifndef BTRFS_QGROUP_LIMIT_KEY
484 : #define BTRFS_QGROUP_LIMIT_KEY 244
485 : #endif
486 :
487 : #ifndef BTRFS_ROOT_BACKREF_KEY
488 : #define BTRFS_ROOT_BACKREF_KEY 144
489 : #endif
490 :
491 : #ifndef BTRFS_SUPER_MAGIC
492 : #define BTRFS_SUPER_MAGIC 0x9123683E
493 : #endif
494 :
495 : #ifndef MS_MOVE
496 : #define MS_MOVE 8192
497 : #endif
498 :
499 : #ifndef MS_PRIVATE
500 : #define MS_PRIVATE (1 << 18)
501 : #endif
502 :
503 : #if !HAVE_DECL_GETTID
504 1072 : static inline pid_t gettid(void) {
505 1072 : return (pid_t) syscall(SYS_gettid);
506 : }
507 : #endif
508 :
509 : #ifndef SCM_SECURITY
510 : #define SCM_SECURITY 0x03
511 : #endif
512 :
513 : #ifndef MS_STRICTATIME
514 : #define MS_STRICTATIME (1<<24)
515 : #endif
516 :
517 : #ifndef MS_REC
518 : #define MS_REC 16384
519 : #endif
520 :
521 : #ifndef MS_SHARED
522 : #define MS_SHARED (1<<20)
523 : #endif
524 :
525 : #ifndef PR_SET_NO_NEW_PRIVS
526 : #define PR_SET_NO_NEW_PRIVS 38
527 : #endif
528 :
529 : #ifndef PR_SET_CHILD_SUBREAPER
530 : #define PR_SET_CHILD_SUBREAPER 36
531 : #endif
532 :
533 : #ifndef MAX_HANDLE_SZ
534 : #define MAX_HANDLE_SZ 128
535 : #endif
536 :
537 : #ifndef __NR_name_to_handle_at
538 : # if defined(__x86_64__)
539 : # define __NR_name_to_handle_at 303
540 : # elif defined(__i386__)
541 : # define __NR_name_to_handle_at 341
542 : # elif defined(__arm__)
543 : # define __NR_name_to_handle_at 370
544 : # elif defined(__powerpc__)
545 : # define __NR_name_to_handle_at 345
546 : # else
547 : # error "__NR_name_to_handle_at is not defined"
548 : # endif
549 : #endif
550 :
551 : #if !HAVE_DECL_NAME_TO_HANDLE_AT
552 : struct file_handle {
553 : unsigned int handle_bytes;
554 : int handle_type;
555 : unsigned char f_handle[0];
556 : };
557 :
558 : static inline int name_to_handle_at(int fd, const char *name, struct file_handle *handle, int *mnt_id, int flags) {
559 : return syscall(__NR_name_to_handle_at, fd, name, handle, mnt_id, flags);
560 : }
561 : #endif
562 :
563 : #ifndef HAVE_SECURE_GETENV
564 : # ifdef HAVE___SECURE_GETENV
565 : # define secure_getenv __secure_getenv
566 : # else
567 : # error "neither secure_getenv nor __secure_getenv are available"
568 : # endif
569 : #endif
570 :
571 : #ifndef CIFS_MAGIC_NUMBER
572 : # define CIFS_MAGIC_NUMBER 0xFF534D42
573 : #endif
574 :
575 : #ifndef TFD_TIMER_CANCEL_ON_SET
576 : # define TFD_TIMER_CANCEL_ON_SET (1 << 1)
577 : #endif
578 :
579 : #ifndef SO_REUSEPORT
580 : # define SO_REUSEPORT 15
581 : #endif
582 :
583 : #ifndef EVIOCREVOKE
584 : # define EVIOCREVOKE _IOW('E', 0x91, int)
585 : #endif
586 :
587 : #ifndef DRM_IOCTL_SET_MASTER
588 : # define DRM_IOCTL_SET_MASTER _IO('d', 0x1e)
589 : #endif
590 :
591 : #ifndef DRM_IOCTL_DROP_MASTER
592 : # define DRM_IOCTL_DROP_MASTER _IO('d', 0x1f)
593 : #endif
594 :
595 : #if defined(__i386__) || defined(__x86_64__)
596 :
597 : /* The precise definition of __O_TMPFILE is arch specific, so let's
598 : * just define this on x86 where we know the value. */
599 :
600 : #ifndef __O_TMPFILE
601 : #define __O_TMPFILE 020000000
602 : #endif
603 :
604 : /* a horrid kludge trying to make sure that this will fail on old kernels */
605 : #ifndef O_TMPFILE
606 : #define O_TMPFILE (__O_TMPFILE | O_DIRECTORY)
607 : #endif
608 :
609 : #endif
610 :
611 : #ifndef __NR_setns
612 : # if defined(__x86_64__)
613 : # define __NR_setns 308
614 : # elif defined(__i386__)
615 : # define __NR_setns 346
616 : # else
617 : # error "__NR_setns is not defined"
618 : # endif
619 : #endif
620 :
621 : #if !HAVE_DECL_SETNS
622 : static inline int setns(int fd, int nstype) {
623 : return syscall(__NR_setns, fd, nstype);
624 : }
625 : #endif
626 :
627 : #if !HAVE_DECL_LO_FLAGS_PARTSCAN
628 : #define LO_FLAGS_PARTSCAN 8
629 : #endif
630 :
631 : #ifndef LOOP_CTL_REMOVE
632 : #define LOOP_CTL_REMOVE 0x4C81
633 : #endif
634 :
635 : #ifndef LOOP_CTL_GET_FREE
636 : #define LOOP_CTL_GET_FREE 0x4C82
637 : #endif
638 :
639 : #if !HAVE_DECL_IFLA_INET6_ADDR_GEN_MODE
640 : #define IFLA_INET6_UNSPEC 0
641 : #define IFLA_INET6_FLAGS 1
642 : #define IFLA_INET6_CONF 2
643 : #define IFLA_INET6_STATS 3
644 : #define IFLA_INET6_MCAST 4
645 : #define IFLA_INET6_CACHEINFO 5
646 : #define IFLA_INET6_ICMP6STATS 6
647 : #define IFLA_INET6_TOKEN 7
648 : #define IFLA_INET6_ADDR_GEN_MODE 8
649 : #define __IFLA_INET6_MAX 9
650 :
651 : #define IFLA_INET6_MAX (__IFLA_INET6_MAX - 1)
652 :
653 : #define IN6_ADDR_GEN_MODE_EUI64 0
654 : #define IN6_ADDR_GEN_MODE_NONE 1
655 : #endif
656 :
657 : #if !HAVE_DECL_IFLA_MACVLAN_FLAGS
658 : #define IFLA_MACVLAN_UNSPEC 0
659 : #define IFLA_MACVLAN_MODE 1
660 : #define IFLA_MACVLAN_FLAGS 2
661 : #define __IFLA_MACVLAN_MAX 3
662 :
663 : #define IFLA_MACVLAN_MAX (__IFLA_MACVLAN_MAX - 1)
664 : #endif
665 :
666 : #if !HAVE_DECL_IFLA_IPVLAN_MODE
667 : #define IFLA_IPVLAN_UNSPEC 0
668 : #define IFLA_IPVLAN_MODE 1
669 : #define __IFLA_IPVLAN_MAX 2
670 :
671 : #define IFLA_IPVLAN_MAX (__IFLA_IPVLAN_MAX - 1)
672 :
673 : #define IPVLAN_MODE_L2 0
674 : #define IPVLAN_MODE_L3 1
675 : #define IPVLAN_MAX 2
676 : #endif
677 :
678 : #if !HAVE_DECL_IFLA_VTI_REMOTE
679 : #define IFLA_VTI_UNSPEC 0
680 : #define IFLA_VTI_LINK 1
681 : #define IFLA_VTI_IKEY 2
682 : #define IFLA_VTI_OKEY 3
683 : #define IFLA_VTI_LOCAL 4
684 : #define IFLA_VTI_REMOTE 5
685 : #define __IFLA_VTI_MAX 6
686 :
687 : #define IFLA_VTI_MAX (__IFLA_VTI_MAX - 1)
688 : #endif
689 :
690 : #if !HAVE_DECL_IFLA_PHYS_PORT_ID
691 : #undef IFLA_PROMISCUITY
692 : #define IFLA_PROMISCUITY 30
693 : #define IFLA_NUM_TX_QUEUES 31
694 : #define IFLA_NUM_RX_QUEUES 32
695 : #define IFLA_CARRIER 33
696 : #define IFLA_PHYS_PORT_ID 34
697 : #define __IFLA_MAX 35
698 :
699 : #define IFLA_MAX (__IFLA_MAX - 1)
700 : #endif
701 :
702 : #if !HAVE_DECL_IFLA_BOND_AD_INFO
703 : #define IFLA_BOND_UNSPEC 0
704 : #define IFLA_BOND_MODE 1
705 : #define IFLA_BOND_ACTIVE_SLAVE 2
706 : #define IFLA_BOND_MIIMON 3
707 : #define IFLA_BOND_UPDELAY 4
708 : #define IFLA_BOND_DOWNDELAY 5
709 : #define IFLA_BOND_USE_CARRIER 6
710 : #define IFLA_BOND_ARP_INTERVAL 7
711 : #define IFLA_BOND_ARP_IP_TARGET 8
712 : #define IFLA_BOND_ARP_VALIDATE 9
713 : #define IFLA_BOND_ARP_ALL_TARGETS 10
714 : #define IFLA_BOND_PRIMARY 11
715 : #define IFLA_BOND_PRIMARY_RESELECT 12
716 : #define IFLA_BOND_FAIL_OVER_MAC 13
717 : #define IFLA_BOND_XMIT_HASH_POLICY 14
718 : #define IFLA_BOND_RESEND_IGMP 15
719 : #define IFLA_BOND_NUM_PEER_NOTIF 16
720 : #define IFLA_BOND_ALL_SLAVES_ACTIVE 17
721 : #define IFLA_BOND_MIN_LINKS 18
722 : #define IFLA_BOND_LP_INTERVAL 19
723 : #define IFLA_BOND_PACKETS_PER_SLAVE 20
724 : #define IFLA_BOND_AD_LACP_RATE 21
725 : #define IFLA_BOND_AD_SELECT 22
726 : #define IFLA_BOND_AD_INFO 23
727 : #define __IFLA_BOND_MAX 24
728 :
729 : #define IFLA_BOND_MAX (__IFLA_BOND_MAX - 1)
730 : #endif
731 :
732 : #if !HAVE_DECL_IFLA_VLAN_PROTOCOL
733 : #define IFLA_VLAN_UNSPEC 0
734 : #define IFLA_VLAN_ID 1
735 : #define IFLA_VLAN_FLAGS 2
736 : #define IFLA_VLAN_EGRESS_QOS 3
737 : #define IFLA_VLAN_INGRESS_QOS 4
738 : #define IFLA_VLAN_PROTOCOL 5
739 : #define __IFLA_VLAN_MAX 6
740 :
741 : #define IFLA_VLAN_MAX (__IFLA_VLAN_MAX - 1)
742 : #endif
743 :
744 : #if !HAVE_DECL_IFLA_VXLAN_REMCSUM_NOPARTIAL
745 : #define IFLA_VXLAN_UNSPEC 0
746 : #define IFLA_VXLAN_ID 1
747 : #define IFLA_VXLAN_GROUP 2
748 : #define IFLA_VXLAN_LINK 3
749 : #define IFLA_VXLAN_LOCAL 4
750 : #define IFLA_VXLAN_TTL 5
751 : #define IFLA_VXLAN_TOS 6
752 : #define IFLA_VXLAN_LEARNING 7
753 : #define IFLA_VXLAN_AGEING 8
754 : #define IFLA_VXLAN_LIMIT 9
755 : #define IFLA_VXLAN_PORT_RANGE 10
756 : #define IFLA_VXLAN_PROXY 11
757 : #define IFLA_VXLAN_RSC 12
758 : #define IFLA_VXLAN_L2MISS 13
759 : #define IFLA_VXLAN_L3MISS 14
760 : #define IFLA_VXLAN_PORT 15
761 : #define IFLA_VXLAN_GROUP6 16
762 : #define IFLA_VXLAN_LOCAL6 17
763 : #define IFLA_VXLAN_UDP_CSUM 18
764 : #define IFLA_VXLAN_UDP_ZERO_CSUM6_TX 19
765 : #define IFLA_VXLAN_UDP_ZERO_CSUM6_RX 20
766 : #define IFLA_VXLAN_REMCSUM_TX 21
767 : #define IFLA_VXLAN_REMCSUM_RX 22
768 : #define IFLA_VXLAN_GBP 23
769 : #define IFLA_VXLAN_REMCSUM_NOPARTIAL 24
770 : #define __IFLA_VXLAN_MAX 25
771 :
772 : #define IFLA_VXLAN_MAX (__IFLA_VXLAN_MAX - 1)
773 : #endif
774 :
775 : #if !HAVE_DECL_IFLA_IPTUN_ENCAP_DPORT
776 : #define IFLA_IPTUN_UNSPEC 0
777 : #define IFLA_IPTUN_LINK 1
778 : #define IFLA_IPTUN_LOCAL 2
779 : #define IFLA_IPTUN_REMOTE 3
780 : #define IFLA_IPTUN_TTL 4
781 : #define IFLA_IPTUN_TOS 5
782 : #define IFLA_IPTUN_ENCAP_LIMIT 6
783 : #define IFLA_IPTUN_FLOWINFO 7
784 : #define IFLA_IPTUN_FLAGS 8
785 : #define IFLA_IPTUN_PROTO 9
786 : #define IFLA_IPTUN_PMTUDISC 10
787 : #define IFLA_IPTUN_6RD_PREFIX 11
788 : #define IFLA_IPTUN_6RD_RELAY_PREFIX 12
789 : #define IFLA_IPTUN_6RD_PREFIXLEN 13
790 : #define IFLA_IPTUN_6RD_RELAY_PREFIXLEN 14
791 : #define IFLA_IPTUN_ENCAP_TYPE 15
792 : #define IFLA_IPTUN_ENCAP_FLAGS 16
793 : #define IFLA_IPTUN_ENCAP_SPORT 17
794 : #define IFLA_IPTUN_ENCAP_DPORT 18
795 :
796 : #define __IFLA_IPTUN_MAX 19
797 :
798 : #define IFLA_IPTUN_MAX (__IFLA_IPTUN_MAX - 1)
799 : #endif
800 :
801 : #if !HAVE_DECL_IFLA_GRE_ENCAP_DPORT
802 : #define IFLA_GRE_UNSPEC 0
803 : #define IFLA_GRE_LINK 1
804 : #define IFLA_GRE_IFLAGS 2
805 : #define IFLA_GRE_OFLAGS 3
806 : #define IFLA_GRE_IKEY 4
807 : #define IFLA_GRE_OKEY 5
808 : #define IFLA_GRE_LOCAL 6
809 : #define IFLA_GRE_REMOTE 7
810 : #define IFLA_GRE_TTL 8
811 : #define IFLA_GRE_TOS 9
812 : #define IFLA_GRE_PMTUDISC 10
813 : #define IFLA_GRE_ENCAP_LIMIT 11
814 : #define IFLA_GRE_FLOWINFO 12
815 : #define IFLA_GRE_FLAGS 13
816 : #define IFLA_GRE_ENCAP_TYPE 14
817 : #define IFLA_GRE_ENCAP_FLAGS 15
818 : #define IFLA_GRE_ENCAP_SPORT 16
819 : #define IFLA_GRE_ENCAP_DPORT 17
820 :
821 : #define __IFLA_GRE_MAX 18
822 :
823 : #define IFLA_GRE_MAX (__IFLA_GRE_MAX - 1)
824 : #endif
825 :
826 : #if !HAVE_DECL_IFLA_BRIDGE_VLAN_INFO
827 : #define IFLA_BRIDGE_FLAGS 0
828 : #define IFLA_BRIDGE_MODE 1
829 : #define IFLA_BRIDGE_VLAN_INFO 2
830 : #define __IFLA_BRIDGE_MAX 3
831 :
832 : #define IFLA_BRIDGE_MAX (__IFLA_BRIDGE_MAX - 1)
833 : #endif
834 :
835 : #if !HAVE_DECL_IFLA_BRPORT_LEARNING_SYNC
836 : #define IFLA_BRPORT_UNSPEC 0
837 : #define IFLA_BRPORT_STATE 1
838 : #define IFLA_BRPORT_PRIORITY 2
839 : #define IFLA_BRPORT_COST 3
840 : #define IFLA_BRPORT_MODE 4
841 : #define IFLA_BRPORT_GUARD 5
842 : #define IFLA_BRPORT_PROTECT 6
843 : #define IFLA_BRPORT_FAST_LEAVE 7
844 : #define IFLA_BRPORT_LEARNING 8
845 : #define IFLA_BRPORT_UNICAST_FLOOD 9
846 : #define IFLA_BRPORT_PROXYARP 10
847 : #define IFLA_BRPORT_LEARNING_SYNC 11
848 : #define __IFLA_BRPORT_MAX 12
849 :
850 : #define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1)
851 : #endif
852 :
853 : #if !HAVE_DECL_NDA_IFINDEX
854 : #define NDA_UNSPEC 0
855 : #define NDA_DST 1
856 : #define NDA_LLADDR 2
857 : #define NDA_CACHEINFO 3
858 : #define NDA_PROBES 4
859 : #define NDA_VLAN 5
860 : #define NDA_PORT 6
861 : #define NDA_VNI 7
862 : #define NDA_IFINDEX 8
863 : #define __NDA_MAX 9
864 :
865 : #define NDA_MAX (__NDA_MAX - 1)
866 : #endif
867 :
868 : #ifndef IPV6_UNICAST_IF
869 : #define IPV6_UNICAST_IF 76
870 : #endif
871 :
872 : #ifndef IFF_MULTI_QUEUE
873 : #define IFF_MULTI_QUEUE 0x100
874 : #endif
875 :
876 : #ifndef IFF_LOWER_UP
877 : #define IFF_LOWER_UP 0x10000
878 : #endif
879 :
880 : #ifndef IFF_DORMANT
881 : #define IFF_DORMANT 0x20000
882 : #endif
883 :
884 : #ifndef BOND_XMIT_POLICY_ENCAP23
885 : #define BOND_XMIT_POLICY_ENCAP23 3
886 : #endif
887 :
888 : #ifndef BOND_XMIT_POLICY_ENCAP34
889 : #define BOND_XMIT_POLICY_ENCAP34 4
890 : #endif
891 :
892 : #ifndef NET_ADDR_RANDOM
893 : # define NET_ADDR_RANDOM 1
894 : #endif
895 :
896 : #ifndef NET_NAME_UNKNOWN
897 : # define NET_NAME_UNKNOWN 0
898 : #endif
899 :
900 : #ifndef NET_NAME_ENUM
901 : # define NET_NAME_ENUM 1
902 : #endif
903 :
904 : #ifndef NET_NAME_PREDICTABLE
905 : # define NET_NAME_PREDICTABLE 2
906 : #endif
907 :
908 : #ifndef NET_NAME_USER
909 : # define NET_NAME_USER 3
910 : #endif
911 :
912 : #ifndef NET_NAME_RENAMED
913 : # define NET_NAME_RENAMED 4
914 : #endif
915 :
916 : #ifndef BPF_XOR
917 : # define BPF_XOR 0xa0
918 : #endif
919 :
920 : /* Note that LOOPBACK_IFINDEX is currently not exported by the
921 : * kernel/glibc, but hardcoded internally by the kernel. However, as
922 : * it is exported to userspace indirectly via rtnetlink and the
923 : * ioctls, and made use of widely we define it here too, in a way that
924 : * is compatible with the kernel's internal definition. */
925 : #ifndef LOOPBACK_IFINDEX
926 : #define LOOPBACK_IFINDEX 1
927 : #endif
928 :
929 : #if !HAVE_DECL_IFA_FLAGS
930 : #define IFA_FLAGS 8
931 : #endif
932 :
933 : #ifndef IFA_F_NOPREFIXROUTE
934 : #define IFA_F_NOPREFIXROUTE 0x200
935 : #endif
936 :
937 : #ifndef MAX_AUDIT_MESSAGE_LENGTH
938 : #define MAX_AUDIT_MESSAGE_LENGTH 8970
939 : #endif
940 :
941 : #ifndef AUDIT_NLGRP_MAX
942 : #define AUDIT_NLGRP_READLOG 1
943 : #endif
944 :
945 : #ifndef CAP_MAC_OVERRIDE
946 : #define CAP_MAC_OVERRIDE 32
947 : #endif
948 :
949 : #ifndef CAP_MAC_ADMIN
950 : #define CAP_MAC_ADMIN 33
951 : #endif
952 :
953 : #ifndef CAP_SYSLOG
954 : #define CAP_SYSLOG 34
955 : #endif
956 :
957 : #ifndef CAP_WAKE_ALARM
958 : #define CAP_WAKE_ALARM 35
959 : #endif
960 :
961 : #ifndef CAP_BLOCK_SUSPEND
962 : #define CAP_BLOCK_SUSPEND 36
963 : #endif
964 :
965 : #ifndef CAP_AUDIT_READ
966 : #define CAP_AUDIT_READ 37
967 : #endif
968 :
969 1 : static inline int raw_clone(unsigned long flags, void *child_stack) {
970 : #if defined(__s390__) || defined(__CRIS__)
971 : /* On s390 and cris the order of the first and second arguments
972 : * of the raw clone() system call is reversed. */
973 : return (int) syscall(__NR_clone, child_stack, flags);
974 : #else
975 1 : return (int) syscall(__NR_clone, flags, child_stack);
976 : #endif
977 : }
978 :
979 2 : static inline pid_t raw_getpid(void) {
980 2 : return (pid_t) syscall(__NR_getpid);
981 : }
982 :
983 : #if !HAVE_DECL_RENAMEAT2
984 :
985 : #ifndef __NR_renameat2
986 : # if defined __x86_64__
987 : # define __NR_renameat2 316
988 : # elif defined __arm__
989 : # define __NR_renameat2 382
990 : # elif defined _MIPS_SIM
991 : # if _MIPS_SIM == _MIPS_SIM_ABI32
992 : # define __NR_renameat2 4351
993 : # endif
994 : # if _MIPS_SIM == _MIPS_SIM_NABI32
995 : # define __NR_renameat2 6315
996 : # endif
997 : # if _MIPS_SIM == _MIPS_SIM_ABI64
998 : # define __NR_renameat2 5311
999 : # endif
1000 : # elif defined __i386__
1001 : # define __NR_renameat2 353
1002 : # else
1003 : # warning "__NR_renameat2 unknown for your architecture"
1004 : # define __NR_renameat2 0xffffffff
1005 : # endif
1006 : #endif
1007 :
1008 0 : static inline int renameat2(int oldfd, const char *oldname, int newfd, const char *newname, unsigned flags) {
1009 0 : return syscall(__NR_renameat2, oldfd, oldname, newfd, newname, flags);
1010 : }
1011 : #endif
1012 :
1013 : #ifndef RENAME_NOREPLACE
1014 : #define RENAME_NOREPLACE (1 << 0)
1015 : #endif
1016 :
1017 : #if !HAVE_DECL_KCMP
1018 16 : static inline int kcmp(pid_t pid1, pid_t pid2, int type, unsigned long idx1, unsigned long idx2) {
1019 16 : return syscall(__NR_kcmp, pid1, pid2, type, idx1, idx2);
1020 : }
1021 : #endif
1022 :
1023 : #ifndef KCMP_FILE
1024 : #define KCMP_FILE 0
1025 : #endif
1026 :
1027 : #ifndef INPUT_PROP_POINTING_STICK
1028 : #define INPUT_PROP_POINTING_STICK 0x05
1029 : #endif
1030 :
1031 : #ifndef INPUT_PROP_ACCELEROMETER
1032 : #define INPUT_PROP_ACCELEROMETER 0x06
1033 : #endif
|