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