1 /***
2 This file is part of eudev, forked from systemd.
3
4 Copyright 2010 Lennart Poettering
5
6 systemd is free software; you can redistribute it and/or modify it
7 under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation; either version 2.1 of the License, or
9 (at your option) any later version.
10
11 systemd is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public License
17 along with systemd; If not, see <http://www.gnu.org/licenses/>.
18 ***/
19
20 #pragma once
21
22 /* Missing glibc definitions to access certain kernel APIs */
23
24 #include <sys/resource.h>
25 #include <sys/syscall.h>
26 #include <fcntl.h>
27 #include <stdlib.h>
28 #include <unistd.h>
29 #include <linux/oom.h>
30
31 #include "macro.h"
32 #include "config.h"
33 #include "hm-missing.h"
34
35 #ifdef ARCH_MIPS
36 #include <asm/sgidefs.h>
37 #endif
38
39 #ifndef RLIMIT_RTTIME
40 #define RLIMIT_RTTIME 15
41 #endif
42
43 /* If RLIMIT_RTTIME is not defined, then we cannot use RLIMIT_NLIMITS as is */
44 #define _RLIMIT_MAX (RLIMIT_RTTIME+1 > RLIMIT_NLIMITS ? RLIMIT_RTTIME+1 : RLIMIT_NLIMITS)
45
46 #ifndef __NR_getrandom
47 # if defined __x86_64__
48 # define __NR_getrandom 318
49 # elif defined(__i386__)
50 # define __NR_getrandom 355
51 # elif defined(__arm__)
52 # define __NR_getrandom 384
53 # elif defined(__aarch64__)
54 # define __NR_getrandom 278
55 # elif defined(__ia64__)
56 # define __NR_getrandom 1339
57 # elif defined(__m68k__)
58 # define __NR_getrandom 352
59 # elif defined(__s390x__)
60 # define __NR_getrandom 349
61 # else
62 # warning "__NR_getrandom unknown for your architecture"
63 # define __NR_getrandom 0xffffffff
64 # endif
65 #endif
66
67 #if !HAVE_DECL_GETRANDOM
getrandom(void * buffer,size_t count,unsigned flags)68 static inline int getrandom(void *buffer, size_t count, unsigned flags) {
69 return syscall(__NR_getrandom, buffer, count, flags);
70 }
71 #endif
72
73 #ifndef GRND_NONBLOCK
74 #define GRND_NONBLOCK 0x0001
75 #endif
76
77 #ifndef GRND_RANDOM
78 #define GRND_RANDOM 0x0002
79 #endif
80
81 #ifndef BTRFS_IOCTL_MAGIC
82 #define BTRFS_IOCTL_MAGIC 0x94
83 #endif
84
85 #ifndef BTRFS_PATH_NAME_MAX
86 #define BTRFS_PATH_NAME_MAX 4087
87 #endif
88
89 #ifndef HAVE_LINUX_BTRFS_H
90 struct btrfs_ioctl_vol_args {
91 int64_t fd;
92 char name[BTRFS_PATH_NAME_MAX + 1];
93 };
94 #endif
95
96 #ifndef BTRFS_IOC_DEVICES_READY
97 #define BTRFS_IOC_DEVICES_READY _IOR(BTRFS_IOCTL_MAGIC, 39, \
98 struct btrfs_ioctl_vol_args)
99 #endif
100
101 #ifndef MS_MOVE
102 #define MS_MOVE 8192
103 #endif
104
105 #ifndef MS_PRIVATE
106 #define MS_PRIVATE (1 << 18)
107 #endif
108
109 #if !HAVE_DECL_GETTID
gettid(void)110 static inline pid_t gettid(void) {
111 return (pid_t) syscall(SYS_gettid);
112 }
113 #endif
114
115 #ifndef MS_REC
116 #define MS_REC 16384
117 #endif
118
119 #ifndef MAX_HANDLE_SZ
120 #define MAX_HANDLE_SZ 128
121 #endif
122
123 #ifdef __MUSL__
124 #define HAVE_DECL_NAME_TO_HANDLE_AT 1
125 #endif
126
127 #ifndef __NR_name_to_handle_at
128 # if defined(__x86_64__)
129 # define __NR_name_to_handle_at 303
130 # elif defined(__i386__)
131 # define __NR_name_to_handle_at 341
132 # elif defined(__arm__)
133 # define __NR_name_to_handle_at 370
134 # elif defined(__powerpc__)
135 # define __NR_name_to_handle_at 345
136 # else
137 # error "__NR_name_to_handle_at is not defined"
138 # endif
139 #endif
140
141 #if !HAVE_DECL_NAME_TO_HANDLE_AT
142 struct file_handle {
143 unsigned int handle_bytes;
144 int handle_type;
145 unsigned char f_handle[0];
146 };
147
name_to_handle_at(int fd,const char * name,struct file_handle * handle,int * mnt_id,int flags)148 static inline int name_to_handle_at(int fd, const char *name, struct file_handle *handle, int *mnt_id, int flags) {
149 return syscall(__NR_name_to_handle_at, fd, name, handle, mnt_id, flags);
150 }
151 #endif
152
153 #ifndef INPUT_PROP_POINTING_STICK
154 #define INPUT_PROP_POINTING_STICK 0x05
155 #endif
156
157 #ifndef INPUT_PROP_ACCELEROMETER
158 #define INPUT_PROP_ACCELEROMETER 0x06
159 #endif
160
161 #ifndef O_PATH
162 #define O_PATH 010000000
163 #endif
164
165 #ifndef AT_EMPTY_PATH
166 #define AT_EMPTY_PATH 0x1000
167 #endif
168
169 #if !HAVE_DECL_STRNDUPA
170 #define strndupa(s, n) \
171 ({ \
172 const char *__old = (s); \
173 size_t __len = strnlen(__old, (n)); \
174 char *__new = (char *)alloca(__len + 1); \
175 __new[__len] = '\0'; \
176 (char *)memcpy(__new, __old, __len); \
177 })
178 #endif
179
180 #ifndef BTN_TRIGGER_HAPPY
181 #define BTN_TRIGGER_HAPPY 0x2c0
182 #endif
183
184 #ifndef INPUT_PROP_MAX
185 #define INPUT_PROP_MAX 0x1f
186 #endif
187
188 #ifndef KEY_ALS_TOGGLE
189 #define KEY_ALS_TOGGLE 0x7a
190 #endif
191
192 #ifndef BTN_DPAD_UP
193 #define BTN_DPAD_UP 0x220
194 #define BTN_DPAD_RIGHT 0x223
195 #endif
196