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>
31 #include <linux/oom.h>
32 #include <linux/input.h>
33 #include <linux/if_link.h>
42 #include <asm/sgidefs.h>
46 #define RLIMIT_RTTIME 15
49 #ifndef F_LINUX_SPECIFIC_BASE
50 #define F_LINUX_SPECIFIC_BASE 1024
54 #define F_SETPIPE_SZ (F_LINUX_SPECIFIC_BASE + 7)
58 #define F_GETPIPE_SZ (F_LINUX_SPECIFIC_BASE + 8)
62 #define IP_FREEBIND 15
65 #ifndef OOM_SCORE_ADJ_MIN
66 #define OOM_SCORE_ADJ_MIN (-1000)
69 #ifndef OOM_SCORE_ADJ_MAX
70 #define OOM_SCORE_ADJ_MAX 1000
73 #ifndef AUDIT_SERVICE_START
74 #define AUDIT_SERVICE_START 1130 /* Service (daemon) start */
77 #ifndef AUDIT_SERVICE_STOP
78 #define AUDIT_SERVICE_STOP 1131 /* Service (daemon) stop */
82 #define TIOCVHANGUP 0x5437
85 #ifndef IP_TRANSPARENT
86 #define IP_TRANSPARENT 19
90 #define IFLA_CARRIER 33
91 #ifndef IFLA_NUM_RX_QUEUES
92 #define IFLA_NUM_RX_QUEUES 32
93 #ifndef IFLA_NUM_TX_QUEUES
94 #define IFLA_NUM_TX_QUEUES 31
95 #ifndef IFLA_PROMISCUITY
96 #define IFLA_PROMISCUITY 30
102 #if !HAVE_DECL_PIVOT_ROOT
103 static inline int pivot_root(const char *new_root, const char *put_old) {
104 return syscall(SYS_pivot_root, new_root, put_old);
109 # ifndef __NR_fanotify_init
110 # define __NR_fanotify_init 300
112 # ifndef __NR_fanotify_mark
113 # define __NR_fanotify_mark 301
115 #elif defined _MIPS_SIM
116 # if _MIPS_SIM == _MIPS_SIM_ABI32
117 # ifndef __NR_fanotify_init
118 # define __NR_fanotify_init 4336
120 # ifndef __NR_fanotify_mark
121 # define __NR_fanotify_mark 4337
123 # elif _MIPS_SIM == _MIPS_SIM_NABI32
124 # ifndef __NR_fanotify_init
125 # define __NR_fanotify_init 6300
127 # ifndef __NR_fanotify_mark
128 # define __NR_fanotify_mark 6301
130 # elif _MIPS_SIM == _MIPS_SIM_ABI64
131 # ifndef __NR_fanotify_init
132 # define __NR_fanotify_init 5295
134 # ifndef __NR_fanotify_mark
135 # define __NR_fanotify_mark 5296
139 # ifndef __NR_fanotify_init
140 # define __NR_fanotify_init 338
142 # ifndef __NR_fanotify_mark
143 # define __NR_fanotify_mark 339
147 #ifndef HAVE_FANOTIFY_INIT
148 static inline int fanotify_init(unsigned int flags, unsigned int event_f_flags) {
149 return syscall(__NR_fanotify_init, flags, event_f_flags);
153 #ifndef HAVE_FANOTIFY_MARK
154 static inline int fanotify_mark(int fanotify_fd, unsigned int flags, uint64_t mask,
155 int dfd, const char *pathname) {
156 #if defined _MIPS_SIM && _MIPS_SIM == _MIPS_SIM_ABI32 || defined __powerpc__ && !defined __powerpc64__ \
157 || defined __arm__ && !defined __aarch64__
164 return syscall(__NR_fanotify_mark, fanotify_fd, flags,
165 _mask._32[0], _mask._32[1], dfd, pathname);
167 return syscall(__NR_fanotify_mark, fanotify_fd, flags, mask, dfd, pathname);
172 #ifndef BTRFS_IOCTL_MAGIC
173 #define BTRFS_IOCTL_MAGIC 0x94
176 #ifndef BTRFS_PATH_NAME_MAX
177 #define BTRFS_PATH_NAME_MAX 4087
180 #ifndef BTRFS_DEVICE_PATH_NAME_MAX
181 #define BTRFS_DEVICE_PATH_NAME_MAX 1024
184 #ifndef BTRFS_FSID_SIZE
185 #define BTRFS_FSID_SIZE 16
188 #ifndef BTRFS_UUID_SIZE
189 #define BTRFS_UUID_SIZE 16
192 #ifndef HAVE_LINUX_BTRFS_H
193 struct btrfs_ioctl_vol_args {
195 char name[BTRFS_PATH_NAME_MAX + 1];
198 struct btrfs_ioctl_dev_info_args {
199 uint64_t devid; /* in/out */
200 uint8_t uuid[BTRFS_UUID_SIZE]; /* in/out */
201 uint64_t bytes_used; /* out */
202 uint64_t total_bytes; /* out */
203 uint64_t unused[379]; /* pad to 4k */
204 char path[BTRFS_DEVICE_PATH_NAME_MAX]; /* out */
207 struct btrfs_ioctl_fs_info_args {
208 uint64_t max_id; /* out */
209 uint64_t num_devices; /* out */
210 uint8_t fsid[BTRFS_FSID_SIZE]; /* out */
211 uint64_t reserved[124]; /* pad to 1k */
215 #ifndef BTRFS_IOC_DEFRAG
216 #define BTRFS_IOC_DEFRAG _IOW(BTRFS_IOCTL_MAGIC, 2, struct btrfs_ioctl_vol_args)
219 #ifndef BTRFS_IOC_DEV_INFO
220 #define BTRFS_IOC_DEV_INFO _IOWR(BTRFS_IOCTL_MAGIC, 30, \
221 struct btrfs_ioctl_dev_info_args)
224 #ifndef BTRFS_IOC_FS_INFO
225 #define BTRFS_IOC_FS_INFO _IOR(BTRFS_IOCTL_MAGIC, 31, \
226 struct btrfs_ioctl_fs_info_args)
229 #ifndef BTRFS_SUPER_MAGIC
230 #define BTRFS_SUPER_MAGIC 0x9123683E
238 #define MS_PRIVATE (1 << 18)
241 #if !HAVE_DECL_GETTID
242 static inline pid_t gettid(void) {
243 return (pid_t) syscall(SYS_gettid);
248 #define SCM_SECURITY 0x03
251 #ifndef MS_STRICTATIME
252 #define MS_STRICTATIME (1<<24)
260 #define MS_SHARED (1<<20)
263 #ifndef PR_SET_NO_NEW_PRIVS
264 #define PR_SET_NO_NEW_PRIVS 38
267 #ifndef PR_SET_CHILD_SUBREAPER
268 #define PR_SET_CHILD_SUBREAPER 36
271 #ifndef MAX_HANDLE_SZ
272 #define MAX_HANDLE_SZ 128
275 #if defined __x86_64__
276 # ifndef __NR_name_to_handle_at
277 # define __NR_name_to_handle_at 303
279 #elif defined __i386__
280 # ifndef __NR_name_to_handle_at
281 # define __NR_name_to_handle_at 341
283 #elif defined __arm__
284 # ifndef __NR_name_to_handle_at
285 # define __NR_name_to_handle_at 370
287 #elif defined __powerpc__
288 # ifndef __NR_name_to_handle_at
289 # define __NR_name_to_handle_at 345
292 # ifndef __NR_name_to_handle_at
293 # error __NR_name_to_handle_at is not defined
297 #if !HAVE_DECL_NAME_TO_HANDLE_AT
299 unsigned int handle_bytes;
301 unsigned char f_handle[0];
304 static inline int name_to_handle_at(int fd, const char *name, struct file_handle *handle, int *mnt_id, int flags) {
305 return syscall(__NR_name_to_handle_at, fd, name, handle, mnt_id, flags);
309 #ifndef HAVE_SECURE_GETENV
310 # ifdef HAVE___SECURE_GETENV
311 # define secure_getenv __secure_getenv
313 # error neither secure_getenv nor __secure_getenv are available
317 #ifndef CIFS_MAGIC_NUMBER
318 # define CIFS_MAGIC_NUMBER 0xFF534D42
321 #ifndef TFD_TIMER_CANCEL_ON_SET
322 # define TFD_TIMER_CANCEL_ON_SET (1 << 1)
326 # define SO_REUSEPORT 15
330 # define EVIOCREVOKE _IOW('E', 0x91, int)
333 #ifndef DRM_IOCTL_SET_MASTER
334 # define DRM_IOCTL_SET_MASTER _IO('d', 0x1e)
337 #ifndef DRM_IOCTL_DROP_MASTER
338 # define DRM_IOCTL_DROP_MASTER _IO('d', 0x1f)
341 #if defined(__i386__) || defined(__x86_64__)
343 /* The precise definition of __O_TMPFILE is arch specific, so let's
344 * just define this on x86 where we know the value. */
347 #define __O_TMPFILE 020000000
350 /* a horrid kludge trying to make sure that this will fail on old kernels */
352 #define O_TMPFILE (__O_TMPFILE | O_DIRECTORY)