]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/shared/missing.h
build-sys: Add setns() functions if not in the C library.
[thirdparty/systemd.git] / src / shared / missing.h
CommitLineData
03467c88 1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
15ae422b 2
c2f1db8f 3#pragma once
b9f880f4 4
15ae422b
LP
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
5430f7f2
LP
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
15ae422b
LP
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
5430f7f2 18 Lesser General Public License for more details.
15ae422b 19
5430f7f2 20 You should have received a copy of the GNU Lesser General Public License
15ae422b
LP
21 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22***/
23
b9f880f4
LP
24/* Missing glibc definitions to access certain kernel APIs */
25
26#include <sys/resource.h>
15ae422b 27#include <sys/syscall.h>
16c42ce1 28#include <fcntl.h>
4db17f29 29#include <stdlib.h>
82c121a4 30#include <unistd.h>
3b794314 31#include <errno.h>
dd6c17b1 32#include <linux/oom.h>
118ecf32 33#include <linux/input.h>
d5eff740 34#include <linux/if_link.h>
dd6c17b1
LP
35
36#ifdef HAVE_AUDIT
37#include <libaudit.h>
38#endif
b9f880f4 39
ad780f19
LP
40#include "macro.h"
41
d59d0a2b 42#ifdef ARCH_MIPS
43#include <asm/sgidefs.h>
44#endif
45
b9f880f4
LP
46#ifndef RLIMIT_RTTIME
47#define RLIMIT_RTTIME 15
48#endif
49
4fd5948e
LP
50#ifndef F_LINUX_SPECIFIC_BASE
51#define F_LINUX_SPECIFIC_BASE 1024
52#endif
53
54#ifndef F_SETPIPE_SZ
55#define F_SETPIPE_SZ (F_LINUX_SPECIFIC_BASE + 7)
56#endif
57
58#ifndef F_GETPIPE_SZ
59#define F_GETPIPE_SZ (F_LINUX_SPECIFIC_BASE + 8)
60#endif
61
16c42ce1
KS
62#ifndef IP_FREEBIND
63#define IP_FREEBIND 15
64#endif
65
dd6c17b1
LP
66#ifndef OOM_SCORE_ADJ_MIN
67#define OOM_SCORE_ADJ_MIN (-1000)
68#endif
69
70#ifndef OOM_SCORE_ADJ_MAX
71#define OOM_SCORE_ADJ_MAX 1000
72#endif
15ae422b 73
4927fcae 74#ifndef AUDIT_SERVICE_START
dd6c17b1 75#define AUDIT_SERVICE_START 1130 /* Service (daemon) start */
4927fcae
LP
76#endif
77
78#ifndef AUDIT_SERVICE_STOP
dd6c17b1 79#define AUDIT_SERVICE_STOP 1131 /* Service (daemon) stop */
4927fcae
LP
80#endif
81
6ea832a2
LP
82#ifndef TIOCVHANGUP
83#define TIOCVHANGUP 0x5437
84#endif
85
b90865ba
KS
86#ifndef IP_TRANSPARENT
87#define IP_TRANSPARENT 19
88#endif
89
d5eff740
TG
90#ifndef IFLA_CARRIER
91 #define IFLA_CARRIER 33
92 #ifndef IFLA_NUM_RX_QUEUES
93 #define IFLA_NUM_RX_QUEUES 32
94 #ifndef IFLA_NUM_TX_QUEUES
95 #define IFLA_NUM_TX_QUEUES 31
96 #ifndef IFLA_PROMISCUITY
97 #define IFLA_PROMISCUITY 30
98 #endif
99 #endif
100 #endif
101#endif
102
a8348796 103#if !HAVE_DECL_PIVOT_ROOT
dd6c17b1
LP
104static inline int pivot_root(const char *new_root, const char *put_old) {
105 return syscall(SYS_pivot_root, new_root, put_old);
106}
a8348796 107#endif
dd6c17b1 108
22be093f 109#ifdef __x86_64__
d59d0a2b 110# ifndef __NR_fanotify_init
111# define __NR_fanotify_init 300
112# endif
113# ifndef __NR_fanotify_mark
114# define __NR_fanotify_mark 301
115# endif
116#elif defined _MIPS_SIM
117# if _MIPS_SIM == _MIPS_SIM_ABI32
118# ifndef __NR_fanotify_init
119# define __NR_fanotify_init 4336
120# endif
121# ifndef __NR_fanotify_mark
122# define __NR_fanotify_mark 4337
123# endif
124# elif _MIPS_SIM == _MIPS_SIM_NABI32
125# ifndef __NR_fanotify_init
126# define __NR_fanotify_init 6300
127# endif
128# ifndef __NR_fanotify_mark
129# define __NR_fanotify_mark 6301
130# endif
131# elif _MIPS_SIM == _MIPS_SIM_ABI64
132# ifndef __NR_fanotify_init
133# define __NR_fanotify_init 5295
134# endif
135# ifndef __NR_fanotify_mark
136# define __NR_fanotify_mark 5296
137# endif
138# endif
22be093f 139#else
d59d0a2b 140# ifndef __NR_fanotify_init
141# define __NR_fanotify_init 338
142# endif
143# ifndef __NR_fanotify_mark
144# define __NR_fanotify_mark 339
145# endif
22be093f
LP
146#endif
147
a8348796 148#ifndef HAVE_FANOTIFY_INIT
22be093f 149static inline int fanotify_init(unsigned int flags, unsigned int event_f_flags) {
05115020 150 return syscall(__NR_fanotify_init, flags, event_f_flags);
22be093f 151}
a8348796 152#endif
22be093f 153
a8348796 154#ifndef HAVE_FANOTIFY_MARK
05115020 155static inline int fanotify_mark(int fanotify_fd, unsigned int flags, uint64_t mask,
22be093f 156 int dfd, const char *pathname) {
28f30cf2 157#if defined _MIPS_SIM && _MIPS_SIM == _MIPS_SIM_ABI32 || defined __powerpc__ && !defined __powerpc64__ \
e9c1ea9d 158 || defined __arm__ && !defined __aarch64__
373c23b2 159 union {
160 uint64_t _64;
161 uint32_t _32[2];
162 } _mask;
163 _mask._64 = mask;
164
165 return syscall(__NR_fanotify_mark, fanotify_fd, flags,
166 _mask._32[0], _mask._32[1], dfd, pathname);
167#else
05115020 168 return syscall(__NR_fanotify_mark, fanotify_fd, flags, mask, dfd, pathname);
373c23b2 169#endif
22be093f 170}
a8348796 171#endif
22be093f 172
4b357e15
MM
173#ifndef BTRFS_IOCTL_MAGIC
174#define BTRFS_IOCTL_MAGIC 0x94
175#endif
176
177#ifndef BTRFS_PATH_NAME_MAX
178#define BTRFS_PATH_NAME_MAX 4087
179#endif
180
181#ifndef BTRFS_DEVICE_PATH_NAME_MAX
182#define BTRFS_DEVICE_PATH_NAME_MAX 1024
183#endif
184
185#ifndef BTRFS_FSID_SIZE
186#define BTRFS_FSID_SIZE 16
187#endif
188
189#ifndef BTRFS_UUID_SIZE
190#define BTRFS_UUID_SIZE 16
191#endif
192
193#ifndef HAVE_LINUX_BTRFS_H
194struct btrfs_ioctl_vol_args {
195 int64_t fd;
196 char name[BTRFS_PATH_NAME_MAX + 1];
197};
198
199struct btrfs_ioctl_dev_info_args {
200 uint64_t devid; /* in/out */
201 uint8_t uuid[BTRFS_UUID_SIZE]; /* in/out */
202 uint64_t bytes_used; /* out */
203 uint64_t total_bytes; /* out */
204 uint64_t unused[379]; /* pad to 4k */
205 char path[BTRFS_DEVICE_PATH_NAME_MAX]; /* out */
206};
207
208struct btrfs_ioctl_fs_info_args {
209 uint64_t max_id; /* out */
210 uint64_t num_devices; /* out */
211 uint8_t fsid[BTRFS_FSID_SIZE]; /* out */
212 uint64_t reserved[124]; /* pad to 1k */
213};
214#endif
215
216#ifndef BTRFS_IOC_DEFRAG
217#define BTRFS_IOC_DEFRAG _IOW(BTRFS_IOCTL_MAGIC, 2, struct btrfs_ioctl_vol_args)
218#endif
219
220#ifndef BTRFS_IOC_DEV_INFO
221#define BTRFS_IOC_DEV_INFO _IOWR(BTRFS_IOCTL_MAGIC, 30, \
222 struct btrfs_ioctl_dev_info_args)
223#endif
224
225#ifndef BTRFS_IOC_FS_INFO
226#define BTRFS_IOC_FS_INFO _IOR(BTRFS_IOCTL_MAGIC, 31, \
227 struct btrfs_ioctl_fs_info_args)
228#endif
229
746f8906
LP
230#ifndef BTRFS_SUPER_MAGIC
231#define BTRFS_SUPER_MAGIC 0x9123683E
232#endif
233
94d82985
LP
234#ifndef MS_MOVE
235#define MS_MOVE 8192
236#endif
237
7cb1094a
HH
238#ifndef MS_PRIVATE
239#define MS_PRIVATE (1 << 18)
240#endif
241
a8348796 242#if !HAVE_DECL_GETTID
4d14be09
LP
243static inline pid_t gettid(void) {
244 return (pid_t) syscall(SYS_gettid);
245}
a8348796 246#endif
4d14be09 247
54ecda32
LP
248#ifndef SCM_SECURITY
249#define SCM_SECURITY 0x03
250#endif
251
48ac500b
LP
252#ifndef MS_STRICTATIME
253#define MS_STRICTATIME (1<<24)
254#endif
255
a9621528
AM
256#ifndef MS_REC
257#define MS_REC 16384
258#endif
259
260#ifndef MS_SHARED
261#define MS_SHARED (1<<20)
262#endif
263
8351ceae
LP
264#ifndef PR_SET_NO_NEW_PRIVS
265#define PR_SET_NO_NEW_PRIVS 38
266#endif
d4447f4d
AK
267
268#ifndef PR_SET_CHILD_SUBREAPER
269#define PR_SET_CHILD_SUBREAPER 36
270#endif
a8348796
LP
271
272#ifndef MAX_HANDLE_SZ
273#define MAX_HANDLE_SZ 128
274#endif
275
f527b6b8 276#if defined __x86_64__
848af055
ED
277# ifndef __NR_name_to_handle_at
278# define __NR_name_to_handle_at 303
a8348796 279# endif
f527b6b8 280#elif defined __i386__
848af055
ED
281# ifndef __NR_name_to_handle_at
282# define __NR_name_to_handle_at 341
a8348796 283# endif
f527b6b8
MO
284#elif defined __arm__
285# ifndef __NR_name_to_handle_at
286# define __NR_name_to_handle_at 370
287# endif
288#elif defined __powerpc__
289# ifndef __NR_name_to_handle_at
290# define __NR_name_to_handle_at 345
291# endif
292#else
293# ifndef __NR_name_to_handle_at
294# error __NR_name_to_handle_at is not defined
295# endif
a8348796
LP
296#endif
297
9388e99e 298#if !HAVE_DECL_NAME_TO_HANDLE_AT
a8348796
LP
299struct file_handle {
300 unsigned int handle_bytes;
301 int handle_type;
302 unsigned char f_handle[0];
303};
304
305static inline int name_to_handle_at(int fd, const char *name, struct file_handle *handle, int *mnt_id, int flags) {
306 return syscall(__NR_name_to_handle_at, fd, name, handle, mnt_id, flags);
307}
308#endif
4db17f29
ZJS
309
310#ifndef HAVE_SECURE_GETENV
311# ifdef HAVE___SECURE_GETENV
312# define secure_getenv __secure_getenv
313# else
314# error neither secure_getenv nor __secure_getenv are available
315# endif
316#endif
85210bff
LP
317
318#ifndef CIFS_MAGIC_NUMBER
65b3903f 319# define CIFS_MAGIC_NUMBER 0xFF534D42
85210bff 320#endif
8742514c
LP
321
322#ifndef TFD_TIMER_CANCEL_ON_SET
65b3903f 323# define TFD_TIMER_CANCEL_ON_SET (1 << 1)
8742514c 324#endif
f7db7a69
SL
325
326#ifndef SO_REUSEPORT
65b3903f 327# define SO_REUSEPORT 15
f7db7a69 328#endif
118ecf32
DH
329
330#ifndef EVIOCREVOKE
65b3903f 331# define EVIOCREVOKE _IOW('E', 0x91, int)
118ecf32
DH
332#endif
333
334#ifndef DRM_IOCTL_SET_MASTER
65b3903f 335# define DRM_IOCTL_SET_MASTER _IO('d', 0x1e)
118ecf32
DH
336#endif
337
338#ifndef DRM_IOCTL_DROP_MASTER
65b3903f
ZJS
339# define DRM_IOCTL_DROP_MASTER _IO('d', 0x1f)
340#endif
341
c09918f9
LP
342#if defined(__i386__) || defined(__x86_64__)
343
344/* The precise definition of __O_TMPFILE is arch specific, so let's
345 * just define this on x86 where we know the value. */
346
347#ifndef __O_TMPFILE
348#define __O_TMPFILE 020000000
349#endif
350
351/* a horrid kludge trying to make sure that this will fail on old kernels */
352#ifndef O_TMPFILE
353#define O_TMPFILE (__O_TMPFILE | O_DIRECTORY)
354#endif
355
356#endif
3b794314
HS
357
358#ifndef __NR_setns
359# if defined(__x86_64__)
360# define __NR_setns 308
361# elif defined(__i386__)
362# define __NR_setns 346
363# else
364# error "__NR_setns is not defined"
365# endif
366#endif
367
368#if !HAVE_DECL_SETNS
369static inline int setns(int fd, int nstype) {
370 return syscall(__NR_setns, fd, nstype);
371}
372#endif