chiark / gitweb /
basic/random-util: do not fall back to /dev/urandom if getrandom() returns short
[elogind.git] / src / basic / missing_syscall.h
1 #pragma once
2
3 /***
4   This file is part of systemd.
5
6   Copyright 2010 Lennart Poettering
7   Copyright 2016 Zbigniew JÄ™drzejewski-Szmek
8
9   systemd is free software; you can redistribute it and/or modify it
10   under the terms of the GNU Lesser General Public License as published by
11   the Free Software Foundation; either version 2.1 of the License, or
12   (at your option) any later version.
13
14   systemd is distributed in the hope that it will be useful, but
15   WITHOUT ANY WARRANTY; without even the implied warranty of
16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17   Lesser General Public License for more details.
18
19   You should have received a copy of the GNU Lesser General Public License
20   along with systemd; If not, see <http://www.gnu.org/licenses/>.
21 ***/
22
23 /* Missing glibc definitions to access certain kernel APIs */
24
25 #if 0 /// UNNEEDED by elogind
26 #if !HAVE_DECL_PIVOT_ROOT
27 static inline int pivot_root(const char *new_root, const char *put_old) {
28         return syscall(SYS_pivot_root, new_root, put_old);
29 }
30 #endif
31 #endif // 0
32
33 /* ======================================================================= */
34
35 #if !HAVE_DECL_MEMFD_CREATE
36 #  ifndef __NR_memfd_create
37 #    if defined __x86_64__
38 #      define __NR_memfd_create 319
39 #    elif defined __arm__
40 #      define __NR_memfd_create 385
41 #    elif defined __aarch64__
42 #      define __NR_memfd_create 279
43 #    elif defined __s390__
44 #      define __NR_memfd_create 350
45 #    elif defined _MIPS_SIM
46 #      if _MIPS_SIM == _MIPS_SIM_ABI32
47 #        define __NR_memfd_create 4354
48 #      endif
49 #      if _MIPS_SIM == _MIPS_SIM_NABI32
50 #        define __NR_memfd_create 6318
51 #      endif
52 #      if _MIPS_SIM == _MIPS_SIM_ABI64
53 #        define __NR_memfd_create 5314
54 #      endif
55 #    elif defined __i386__
56 #      define __NR_memfd_create 356
57 #    elif defined __arc__
58 #      define __NR_memfd_create 279
59 #    else
60 #      warning "__NR_memfd_create unknown for your architecture"
61 #    endif
62 #  endif
63
64 static inline int memfd_create(const char *name, unsigned int flags) {
65 #  ifdef __NR_memfd_create
66         return syscall(__NR_memfd_create, name, flags);
67 #  else
68         errno = ENOSYS;
69         return -1;
70 #  endif
71 }
72 #endif
73
74 /* ======================================================================= */
75
76 #if !HAVE_DECL_GETRANDOM
77 #  ifndef __NR_getrandom
78 #    if defined __x86_64__
79 #      define __NR_getrandom 318
80 #    elif defined(__i386__)
81 #      define __NR_getrandom 355
82 #    elif defined(__arm__)
83 #      define __NR_getrandom 384
84 #   elif defined(__aarch64__)
85 #      define __NR_getrandom 278
86 #    elif defined(__ia64__)
87 #      define __NR_getrandom 1339
88 #    elif defined(__m68k__)
89 #      define __NR_getrandom 352
90 #    elif defined(__s390x__)
91 #      define __NR_getrandom 349
92 #    elif defined(__powerpc__)
93 #      define __NR_getrandom 359
94 #    elif defined _MIPS_SIM
95 #      if _MIPS_SIM == _MIPS_SIM_ABI32
96 #        define __NR_getrandom 4353
97 #      endif
98 #      if _MIPS_SIM == _MIPS_SIM_NABI32
99 #        define __NR_getrandom 6317
100 #      endif
101 #      if _MIPS_SIM == _MIPS_SIM_ABI64
102 #        define __NR_getrandom 5313
103 #      endif
104 #    elif defined(__arc__)
105 #      define __NR_getrandom 278
106 #    else
107 #      warning "__NR_getrandom unknown for your architecture"
108 #    endif
109 #  endif
110
111 static inline int getrandom(void *buffer, size_t count, unsigned flags) {
112 #  ifdef __NR_getrandom
113         return syscall(__NR_getrandom, buffer, count, flags);
114 #  else
115         errno = ENOSYS;
116         return -1;
117 #  endif
118 }
119 #endif
120
121 /* ======================================================================= */
122
123 #if !HAVE_DECL_GETTID
124 static inline pid_t gettid(void) {
125         return (pid_t) syscall(SYS_gettid);
126 }
127 #endif
128
129 /* ======================================================================= */
130
131 #if !HAVE_DECL_NAME_TO_HANDLE_AT
132 #  ifndef __NR_name_to_handle_at
133 #    if defined(__x86_64__)
134 #      define __NR_name_to_handle_at 303
135 #    elif defined(__i386__)
136 #      define __NR_name_to_handle_at 341
137 #    elif defined(__arm__)
138 #      define __NR_name_to_handle_at 370
139 #    elif defined(__powerpc__)
140 #      define __NR_name_to_handle_at 345
141 #    elif defined(__arc__)
142 #      define __NR_name_to_handle_at 264
143 #    else
144 #      error "__NR_name_to_handle_at is not defined"
145 #    endif
146 #  endif
147
148 struct file_handle {
149         unsigned int handle_bytes;
150         int handle_type;
151         unsigned char f_handle[0];
152 };
153
154 static inline int name_to_handle_at(int fd, const char *name, struct file_handle *handle, int *mnt_id, int flags) {
155 #  ifdef __NR_name_to_handle_at
156         return syscall(__NR_name_to_handle_at, fd, name, handle, mnt_id, flags);
157 #  else
158         errno = ENOSYS;
159         return -1;
160 #  endif
161 }
162 #endif
163
164 /* ======================================================================= */
165
166 #if !HAVE_DECL_SETNS
167 #  ifndef __NR_setns
168 #    if defined(__x86_64__)
169 #      define __NR_setns 308
170 #    elif defined(__i386__)
171 #      define __NR_setns 346
172 #    elif defined(__arc__)
173 #      define __NR_setns 268
174 #    else
175 #      error "__NR_setns is not defined"
176 #    endif
177 #  endif
178
179 static inline int setns(int fd, int nstype) {
180 #  ifdef __NR_setns
181         return syscall(__NR_setns, fd, nstype);
182 #  else
183         errno = ENOSYS;
184         return -1;
185 #  endif
186 }
187 #endif
188
189 /* ======================================================================= */
190
191 #if 0 /// UNNEEDED by elogind
192 static inline pid_t raw_getpid(void) {
193 #if defined(__alpha__)
194         return (pid_t) syscall(__NR_getxpid);
195 #else
196         return (pid_t) syscall(__NR_getpid);
197 #endif
198 }
199 #endif // 0
200
201 /* ======================================================================= */
202
203 #if !HAVE_DECL_RENAMEAT2
204 #  ifndef __NR_renameat2
205 #    if defined __x86_64__
206 #      define __NR_renameat2 316
207 #    elif defined __arm__
208 #      define __NR_renameat2 382
209 #    elif defined __aarch64__
210 #      define __NR_renameat2 276
211 #    elif defined _MIPS_SIM
212 #      if _MIPS_SIM == _MIPS_SIM_ABI32
213 #        define __NR_renameat2 4351
214 #      endif
215 #      if _MIPS_SIM == _MIPS_SIM_NABI32
216 #        define __NR_renameat2 6315
217 #      endif
218 #      if _MIPS_SIM == _MIPS_SIM_ABI64
219 #        define __NR_renameat2 5311
220 #      endif
221 #    elif defined __i386__
222 #      define __NR_renameat2 353
223 #    elif defined __arc__
224 #      define __NR_renameat2 276
225 #    else
226 #      warning "__NR_renameat2 unknown for your architecture"
227 #    endif
228 #  endif
229
230 static inline int renameat2(int oldfd, const char *oldname, int newfd, const char *newname, unsigned flags) {
231 #  ifdef __NR_renameat2
232         return syscall(__NR_renameat2, oldfd, oldname, newfd, newname, flags);
233 #  else
234         errno = ENOSYS;
235         return -1;
236 #  endif
237 }
238 #endif
239
240 /* ======================================================================= */
241
242 #if !HAVE_DECL_KCMP
243 static inline int kcmp(pid_t pid1, pid_t pid2, int type, unsigned long idx1, unsigned long idx2) {
244 #  ifdef __NR_kcmp
245         return syscall(__NR_kcmp, pid1, pid2, type, idx1, idx2);
246 #  else
247         errno = ENOSYS;
248         return -1;
249 #  endif
250 }
251 #endif
252
253 /* ======================================================================= */
254
255 #if !HAVE_DECL_KEYCTL
256 static inline long keyctl(int cmd, unsigned long arg2, unsigned long arg3, unsigned long arg4,unsigned long arg5) {
257 #  ifdef __NR_keyctl
258         return syscall(__NR_keyctl, cmd, arg2, arg3, arg4, arg5);
259 #  else
260         errno = ENOSYS;
261         return -1;
262 #  endif
263 }
264
265 static inline key_serial_t add_key(const char *type, const char *description, const void *payload, size_t plen, key_serial_t ringid) {
266 #  ifdef __NR_add_key
267         return syscall(__NR_add_key, type, description, payload, plen, ringid);
268 #  else
269         errno = ENOSYS;
270         return -1;
271 #  endif
272 }
273
274 static inline key_serial_t request_key(const char *type, const char *description, const char * callout_info, key_serial_t destringid) {
275 #  ifdef __NR_request_key
276         return syscall(__NR_request_key, type, description, callout_info, destringid);
277 #  else
278         errno = ENOSYS;
279         return -1;
280 #  endif
281 }
282 #endif
283
284 /* ======================================================================= */
285
286 #if !HAVE_DECL_COPY_FILE_RANGE
287 #  ifndef __NR_copy_file_range
288 #    if defined(__x86_64__)
289 #      define __NR_copy_file_range 326
290 #    elif defined(__i386__)
291 #      define __NR_copy_file_range 377
292 #    elif defined __s390__
293 #      define __NR_copy_file_range 375
294 #    elif defined __arm__
295 #      define __NR_copy_file_range 391
296 #    elif defined __aarch64__
297 #      define __NR_copy_file_range 285
298 #    elif defined __powerpc__
299 #      define __NR_copy_file_range 379
300 #    elif defined __arc__
301 #      define __NR_copy_file_range 285
302 #    else
303 #      warning "__NR_copy_file_range not defined for your architecture"
304 #    endif
305 #  endif
306
307 static inline ssize_t copy_file_range(int fd_in, loff_t *off_in,
308                                       int fd_out, loff_t *off_out,
309                                       size_t len,
310                                       unsigned int flags) {
311 #  ifdef __NR_copy_file_range
312         return syscall(__NR_copy_file_range, fd_in, off_in, fd_out, off_out, len, flags);
313 #  else
314         errno = ENOSYS;
315         return -1;
316 #  endif
317 }
318 #endif