4 This file is part of systemd.
6 Copyright 2010 Lennart Poettering
7 Copyright 2016 Zbigniew Jędrzejewski-Szmek
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.
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.
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/>.
23 /* Missing glibc definitions to access certain kernel APIs */
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);
33 /* ======================================================================= */
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
49 # if _MIPS_SIM == _MIPS_SIM_NABI32
50 # define __NR_memfd_create 6318
52 # if _MIPS_SIM == _MIPS_SIM_ABI64
53 # define __NR_memfd_create 5314
55 # elif defined __i386__
56 # define __NR_memfd_create 356
58 # warning "__NR_memfd_create unknown for your architecture"
62 static inline int memfd_create(const char *name, unsigned int flags) {
63 # ifdef __NR_memfd_create
64 return syscall(__NR_memfd_create, name, flags);
72 /* ======================================================================= */
74 #if !HAVE_DECL_GETRANDOM
75 # ifndef __NR_getrandom
76 # if defined __x86_64__
77 # define __NR_getrandom 318
78 # elif defined(__i386__)
79 # define __NR_getrandom 355
80 # elif defined(__arm__)
81 # define __NR_getrandom 384
82 # elif defined(__aarch64__)
83 # define __NR_getrandom 278
84 # elif defined(__ia64__)
85 # define __NR_getrandom 1339
86 # elif defined(__m68k__)
87 # define __NR_getrandom 352
88 # elif defined(__s390x__)
89 # define __NR_getrandom 349
90 # elif defined(__powerpc__)
91 # define __NR_getrandom 359
92 # elif defined _MIPS_SIM
93 # if _MIPS_SIM == _MIPS_SIM_ABI32
94 # define __NR_getrandom 4353
96 # if _MIPS_SIM == _MIPS_SIM_NABI32
97 # define __NR_getrandom 6317
99 # if _MIPS_SIM == _MIPS_SIM_ABI64
100 # define __NR_getrandom 5313
103 # warning "__NR_getrandom unknown for your architecture"
107 static inline int getrandom(void *buffer, size_t count, unsigned flags) {
108 # ifdef __NR_getrandom
109 return syscall(__NR_getrandom, buffer, count, flags);
117 /* ======================================================================= */
119 #if !HAVE_DECL_GETTID
120 static inline pid_t gettid(void) {
121 return (pid_t) syscall(SYS_gettid);
125 /* ======================================================================= */
127 #if !HAVE_DECL_NAME_TO_HANDLE_AT
128 # ifndef __NR_name_to_handle_at
129 # if defined(__x86_64__)
130 # define __NR_name_to_handle_at 303
131 # elif defined(__i386__)
132 # define __NR_name_to_handle_at 341
133 # elif defined(__arm__)
134 # define __NR_name_to_handle_at 370
135 # elif defined(__powerpc__)
136 # define __NR_name_to_handle_at 345
138 # error "__NR_name_to_handle_at is not defined"
143 unsigned int handle_bytes;
145 unsigned char f_handle[0];
148 static inline int name_to_handle_at(int fd, const char *name, struct file_handle *handle, int *mnt_id, int flags) {
149 # ifdef __NR_name_to_handle_at
150 return syscall(__NR_name_to_handle_at, fd, name, handle, mnt_id, flags);
158 /* ======================================================================= */
162 # if defined(__x86_64__)
163 # define __NR_setns 308
164 # elif defined(__i386__)
165 # define __NR_setns 346
167 # error "__NR_setns is not defined"
171 static inline int setns(int fd, int nstype) {
173 return syscall(__NR_setns, fd, nstype);
181 /* ======================================================================= */
183 #if 0 /// UNNEEDED by elogind
184 static inline pid_t raw_getpid(void) {
185 #if defined(__alpha__)
186 return (pid_t) syscall(__NR_getxpid);
188 return (pid_t) syscall(__NR_getpid);
192 /* ======================================================================= */
194 #if !HAVE_DECL_RENAMEAT2
195 # ifndef __NR_renameat2
196 # if defined __x86_64__
197 # define __NR_renameat2 316
198 # elif defined __arm__
199 # define __NR_renameat2 382
200 # elif defined _MIPS_SIM
201 # if _MIPS_SIM == _MIPS_SIM_ABI32
202 # define __NR_renameat2 4351
204 # if _MIPS_SIM == _MIPS_SIM_NABI32
205 # define __NR_renameat2 6315
207 # if _MIPS_SIM == _MIPS_SIM_ABI64
208 # define __NR_renameat2 5311
210 # elif defined __i386__
211 # define __NR_renameat2 353
213 # warning "__NR_renameat2 unknown for your architecture"
217 static inline int renameat2(int oldfd, const char *oldname, int newfd, const char *newname, unsigned flags) {
218 # ifdef __NR_renameat2
219 return syscall(__NR_renameat2, oldfd, oldname, newfd, newname, flags);
227 /* ======================================================================= */
230 static inline int kcmp(pid_t pid1, pid_t pid2, int type, unsigned long idx1, unsigned long idx2) {
232 return syscall(__NR_kcmp, pid1, pid2, type, idx1, idx2);
240 /* ======================================================================= */
242 #if !HAVE_DECL_KEYCTL
243 static inline long keyctl(int cmd, unsigned long arg2, unsigned long arg3, unsigned long arg4,unsigned long arg5) {
245 return syscall(__NR_keyctl, cmd, arg2, arg3, arg4, arg5);
252 static inline key_serial_t add_key(const char *type, const char *description, const void *payload, size_t plen, key_serial_t ringid) {
254 return syscall(__NR_add_key, type, description, payload, plen, ringid);
261 static inline key_serial_t request_key(const char *type, const char *description, const char * callout_info, key_serial_t destringid) {
262 # ifdef __NR_request_key
263 return syscall(__NR_request_key, type, description, callout_info, destringid);
272 /* ======================================================================= */
274 #if !HAVE_DECL_COPY_FILE_RANGE
275 # ifndef __NR_copy_file_range
276 # if defined(__x86_64__)
277 # define __NR_copy_file_range 326
278 # elif defined(__i386__)
279 # define __NR_copy_file_range 377
280 # elif defined __s390__
281 # define __NR_copy_file_range 375
282 # elif defined __arm__
283 # define __NR_copy_file_range 391
284 # elif defined __aarch64__
285 # define __NR_copy_file_range 285
286 # elif defined __powerpc__
287 # define __NR_copy_file_range 379
289 # warning "__NR_copy_file_range not defined for your architecture"
293 static inline ssize_t copy_file_range(int fd_in, loff_t *off_in,
294 int fd_out, loff_t *off_out,
296 unsigned int flags) {
297 # ifdef __NR_copy_file_range
298 return syscall(__NR_copy_file_range, fd_in, off_in, fd_out, off_out, len, flags);