1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
6 This file is part of systemd.
8 Copyright 2010 Lennart Poettering
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.
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.
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/>.
24 /* Missing glibc definitions to access certain kernel APIs */
26 #include <sys/resource.h>
27 #include <sys/syscall.h>
32 #include <linux/oom.h>
33 #include <linux/input.h>
34 #include <linux/if_link.h>
35 #include <linux/loop.h>
44 #include <asm/sgidefs.h>
48 #define RLIMIT_RTTIME 15
51 /* If RLIMIT_RTTIME is not defined, then we cannot use RLIMIT_NLIMITS as is */
52 #define _RLIMIT_MAX (RLIMIT_RTTIME+1 > RLIMIT_NLIMITS ? RLIMIT_RTTIME+1 : RLIMIT_NLIMITS)
54 #ifndef F_LINUX_SPECIFIC_BASE
55 #define F_LINUX_SPECIFIC_BASE 1024
59 #define F_SETPIPE_SZ (F_LINUX_SPECIFIC_BASE + 7)
63 #define F_GETPIPE_SZ (F_LINUX_SPECIFIC_BASE + 8)
67 #define IP_FREEBIND 15
70 #ifndef OOM_SCORE_ADJ_MIN
71 #define OOM_SCORE_ADJ_MIN (-1000)
74 #ifndef OOM_SCORE_ADJ_MAX
75 #define OOM_SCORE_ADJ_MAX 1000
78 #ifndef AUDIT_SERVICE_START
79 #define AUDIT_SERVICE_START 1130 /* Service (daemon) start */
82 #ifndef AUDIT_SERVICE_STOP
83 #define AUDIT_SERVICE_STOP 1131 /* Service (daemon) stop */
87 #define TIOCVHANGUP 0x5437
90 #ifndef IP_TRANSPARENT
91 #define IP_TRANSPARENT 19
95 #define IFLA_CARRIER 33
96 #ifndef IFLA_NUM_RX_QUEUES
97 #define IFLA_NUM_RX_QUEUES 32
98 #ifndef IFLA_NUM_TX_QUEUES
99 #define IFLA_NUM_TX_QUEUES 31
100 #ifndef IFLA_PROMISCUITY
101 #define IFLA_PROMISCUITY 30
107 #if !HAVE_DECL_PIVOT_ROOT
108 static inline int pivot_root(const char *new_root, const char *put_old) {
109 return syscall(SYS_pivot_root, new_root, put_old);
114 # ifndef __NR_fanotify_init
115 # define __NR_fanotify_init 300
117 # ifndef __NR_fanotify_mark
118 # define __NR_fanotify_mark 301
120 #elif defined _MIPS_SIM
121 # if _MIPS_SIM == _MIPS_SIM_ABI32
122 # ifndef __NR_fanotify_init
123 # define __NR_fanotify_init 4336
125 # ifndef __NR_fanotify_mark
126 # define __NR_fanotify_mark 4337
128 # elif _MIPS_SIM == _MIPS_SIM_NABI32
129 # ifndef __NR_fanotify_init
130 # define __NR_fanotify_init 6300
132 # ifndef __NR_fanotify_mark
133 # define __NR_fanotify_mark 6301
135 # elif _MIPS_SIM == _MIPS_SIM_ABI64
136 # ifndef __NR_fanotify_init
137 # define __NR_fanotify_init 5295
139 # ifndef __NR_fanotify_mark
140 # define __NR_fanotify_mark 5296
144 # ifndef __NR_fanotify_init
145 # define __NR_fanotify_init 338
147 # ifndef __NR_fanotify_mark
148 # define __NR_fanotify_mark 339
152 #ifndef HAVE_FANOTIFY_INIT
153 static inline int fanotify_init(unsigned int flags, unsigned int event_f_flags) {
154 return syscall(__NR_fanotify_init, flags, event_f_flags);
158 #ifndef HAVE_FANOTIFY_MARK
159 static inline int fanotify_mark(int fanotify_fd, unsigned int flags, uint64_t mask,
160 int dfd, const char *pathname) {
161 #if defined _MIPS_SIM && _MIPS_SIM == _MIPS_SIM_ABI32 || defined __powerpc__ && !defined __powerpc64__ \
162 || defined __arm__ && !defined __aarch64__
169 return syscall(__NR_fanotify_mark, fanotify_fd, flags,
170 _mask._32[0], _mask._32[1], dfd, pathname);
172 return syscall(__NR_fanotify_mark, fanotify_fd, flags, mask, dfd, pathname);
177 #ifndef BTRFS_IOCTL_MAGIC
178 #define BTRFS_IOCTL_MAGIC 0x94
181 #ifndef BTRFS_PATH_NAME_MAX
182 #define BTRFS_PATH_NAME_MAX 4087
185 #ifndef BTRFS_DEVICE_PATH_NAME_MAX
186 #define BTRFS_DEVICE_PATH_NAME_MAX 1024
189 #ifndef BTRFS_FSID_SIZE
190 #define BTRFS_FSID_SIZE 16
193 #ifndef BTRFS_UUID_SIZE
194 #define BTRFS_UUID_SIZE 16
197 #ifndef HAVE_LINUX_BTRFS_H
198 struct btrfs_ioctl_vol_args {
200 char name[BTRFS_PATH_NAME_MAX + 1];
203 struct btrfs_ioctl_dev_info_args {
204 uint64_t devid; /* in/out */
205 uint8_t uuid[BTRFS_UUID_SIZE]; /* in/out */
206 uint64_t bytes_used; /* out */
207 uint64_t total_bytes; /* out */
208 uint64_t unused[379]; /* pad to 4k */
209 char path[BTRFS_DEVICE_PATH_NAME_MAX]; /* out */
212 struct btrfs_ioctl_fs_info_args {
213 uint64_t max_id; /* out */
214 uint64_t num_devices; /* out */
215 uint8_t fsid[BTRFS_FSID_SIZE]; /* out */
216 uint64_t reserved[124]; /* pad to 1k */
220 #ifndef BTRFS_IOC_DEFRAG
221 #define BTRFS_IOC_DEFRAG _IOW(BTRFS_IOCTL_MAGIC, 2, struct btrfs_ioctl_vol_args)
224 #ifndef BTRFS_IOC_DEV_INFO
225 #define BTRFS_IOC_DEV_INFO _IOWR(BTRFS_IOCTL_MAGIC, 30, \
226 struct btrfs_ioctl_dev_info_args)
229 #ifndef BTRFS_IOC_FS_INFO
230 #define BTRFS_IOC_FS_INFO _IOR(BTRFS_IOCTL_MAGIC, 31, \
231 struct btrfs_ioctl_fs_info_args)
234 #ifndef BTRFS_SUPER_MAGIC
235 #define BTRFS_SUPER_MAGIC 0x9123683E
243 #define MS_PRIVATE (1 << 18)
246 #if !HAVE_DECL_GETTID
247 static inline pid_t gettid(void) {
248 return (pid_t) syscall(SYS_gettid);
253 #define SCM_SECURITY 0x03
256 #ifndef MS_STRICTATIME
257 #define MS_STRICTATIME (1<<24)
265 #define MS_SHARED (1<<20)
268 #ifndef PR_SET_NO_NEW_PRIVS
269 #define PR_SET_NO_NEW_PRIVS 38
272 #ifndef PR_SET_CHILD_SUBREAPER
273 #define PR_SET_CHILD_SUBREAPER 36
276 #ifndef MAX_HANDLE_SZ
277 #define MAX_HANDLE_SZ 128
280 #ifndef __NR_name_to_handle_at
281 # if defined(__x86_64__)
282 # define __NR_name_to_handle_at 303
283 # elif defined(__i386__)
284 # define __NR_name_to_handle_at 341
285 # elif defined(__arm__)
286 # define __NR_name_to_handle_at 370
287 # elif defined(__powerpc__)
288 # define __NR_name_to_handle_at 345
290 # error "__NR_name_to_handle_at is not defined"
294 #if !HAVE_DECL_NAME_TO_HANDLE_AT
296 unsigned int handle_bytes;
298 unsigned char f_handle[0];
301 static inline int name_to_handle_at(int fd, const char *name, struct file_handle *handle, int *mnt_id, int flags) {
302 return syscall(__NR_name_to_handle_at, fd, name, handle, mnt_id, flags);
306 #ifndef HAVE_SECURE_GETENV
307 # ifdef HAVE___SECURE_GETENV
308 # define secure_getenv __secure_getenv
310 # error "neither secure_getenv nor __secure_getenv are available"
314 #ifndef CIFS_MAGIC_NUMBER
315 # define CIFS_MAGIC_NUMBER 0xFF534D42
318 #ifndef TFD_TIMER_CANCEL_ON_SET
319 # define TFD_TIMER_CANCEL_ON_SET (1 << 1)
323 # define SO_REUSEPORT 15
327 # define EVIOCREVOKE _IOW('E', 0x91, int)
330 #ifndef DRM_IOCTL_SET_MASTER
331 # define DRM_IOCTL_SET_MASTER _IO('d', 0x1e)
334 #ifndef DRM_IOCTL_DROP_MASTER
335 # define DRM_IOCTL_DROP_MASTER _IO('d', 0x1f)
338 #if defined(__i386__) || defined(__x86_64__)
340 /* The precise definition of __O_TMPFILE is arch specific, so let's
341 * just define this on x86 where we know the value. */
344 #define __O_TMPFILE 020000000
347 /* a horrid kludge trying to make sure that this will fail on old kernels */
349 #define O_TMPFILE (__O_TMPFILE | O_DIRECTORY)
355 # if defined(__x86_64__)
356 # define __NR_setns 308
357 # elif defined(__i386__)
358 # define __NR_setns 346
360 # error "__NR_setns is not defined"
365 static inline int setns(int fd, int nstype) {
366 return syscall(__NR_setns, fd, nstype);
370 #if !HAVE_DECL_LO_FLAGS_PARTSCAN
371 #define LO_FLAGS_PARTSCAN 8
374 #ifndef LOOP_CTL_REMOVE
375 #define LOOP_CTL_REMOVE 0x4C81
378 #ifndef LOOP_CTL_GET_FREE
379 #define LOOP_CTL_GET_FREE 0x4C82