xref: /linux/tools/include/nolibc/sys.h (revision 621cde16e49b3ecf7d59a8106a20aaebfb4a59a9)
1bd8c8fbbSWilly Tarreau /* SPDX-License-Identifier: LGPL-2.1 OR MIT */
2bd8c8fbbSWilly Tarreau /*
3bd8c8fbbSWilly Tarreau  * Syscall definitions for NOLIBC (those in man(2))
4bd8c8fbbSWilly Tarreau  * Copyright (C) 2017-2021 Willy Tarreau <w@1wt.eu>
5bd8c8fbbSWilly Tarreau  */
6bd8c8fbbSWilly Tarreau 
7bd8c8fbbSWilly Tarreau #ifndef _NOLIBC_SYS_H
8bd8c8fbbSWilly Tarreau #define _NOLIBC_SYS_H
9bd8c8fbbSWilly Tarreau 
10bd8c8fbbSWilly Tarreau #include "std.h"
11bd8c8fbbSWilly Tarreau 
12bd8c8fbbSWilly Tarreau /* system includes */
13bd8c8fbbSWilly Tarreau #include <asm/unistd.h>
14fddc8f81SThomas Weißschuh #include <asm/signal.h>  /* for SIGCHLD */
15bd8c8fbbSWilly Tarreau #include <asm/ioctls.h>
16544fa1a2SAmmar Faizi #include <asm/mman.h>
17bd8c8fbbSWilly Tarreau #include <linux/fs.h>
18bd8c8fbbSWilly Tarreau #include <linux/loop.h>
19bd8c8fbbSWilly Tarreau #include <linux/time.h>
207efd762eSAmmar Faizi #include <linux/auxvec.h>
21fddc8f81SThomas Weißschuh #include <linux/fcntl.h> /* for O_* and AT_* */
22fddc8f81SThomas Weißschuh #include <linux/stat.h>  /* for statx() */
23208aa9d9SThomas Weißschuh #include <linux/prctl.h>
24a0bb5f88SThomas Weißschuh #include <linux/resource.h>
25*0adab2b6SThomas Weißschuh #include <linux/utsname.h>
26bd8c8fbbSWilly Tarreau 
27bd8c8fbbSWilly Tarreau #include "arch.h"
2845a794bfSWilly Tarreau #include "errno.h"
29b56a9492SThomas Weißschuh #include "stdarg.h"
30bd8c8fbbSWilly Tarreau #include "types.h"
31bd8c8fbbSWilly Tarreau 
326591be4aSZhangjin Wu 
33556fb713SWilly Tarreau /* Syscall return helper: takes the syscall value in argument and checks for an
34556fb713SWilly Tarreau  * error in it. This may only be used with signed returns (int or long), but
35556fb713SWilly Tarreau  * not with pointers. An error is any value < 0. When an error is encountered,
36556fb713SWilly Tarreau  * -ret is set into errno and -1 is returned. Otherwise the returned value is
37556fb713SWilly Tarreau  * passed as-is with its type preserved.
386591be4aSZhangjin Wu  */
396591be4aSZhangjin Wu 
40556fb713SWilly Tarreau #define __sysret(arg)							\
41556fb713SWilly Tarreau ({									\
42556fb713SWilly Tarreau 	__typeof__(arg) __sysret_arg = (arg);				\
43556fb713SWilly Tarreau 	(__sysret_arg < 0)                              /* error ? */	\
44556fb713SWilly Tarreau 		? (({ SET_ERRNO(-__sysret_arg); }), -1) /* ret -1 with errno = -arg */ \
45556fb713SWilly Tarreau 		: __sysret_arg;                         /* return original value */ \
46556fb713SWilly Tarreau })
47556fb713SWilly Tarreau 
48535b70c1SThomas Weißschuh /* Syscall ENOSYS helper: Avoids unused-parameter warnings and provides a
49535b70c1SThomas Weißschuh  * debugging hook.
50535b70c1SThomas Weißschuh  */
51535b70c1SThomas Weißschuh 
__nolibc_enosys(const char * syscall,...)52535b70c1SThomas Weißschuh static __inline__ int __nolibc_enosys(const char *syscall, ...)
53535b70c1SThomas Weißschuh {
54535b70c1SThomas Weißschuh 	(void)syscall;
55535b70c1SThomas Weißschuh 	return -ENOSYS;
56535b70c1SThomas Weißschuh }
57535b70c1SThomas Weißschuh 
58bd8c8fbbSWilly Tarreau 
59bd8c8fbbSWilly Tarreau /* Functions in this file only describe syscalls. They're declared static so
60bd8c8fbbSWilly Tarreau  * that the compiler usually decides to inline them while still being allowed
61bd8c8fbbSWilly Tarreau  * to pass a pointer to one of their instances. Each syscall exists in two
62bd8c8fbbSWilly Tarreau  * versions:
63bd8c8fbbSWilly Tarreau  *   - the "internal" ones, which matches the raw syscall interface at the
64bd8c8fbbSWilly Tarreau  *     kernel level, which may sometimes slightly differ from the documented
65bd8c8fbbSWilly Tarreau  *     libc-level ones. For example most of them return either a valid value
66bd8c8fbbSWilly Tarreau  *     or -errno. All of these are prefixed with "sys_". They may be called
67bd8c8fbbSWilly Tarreau  *     by non-portable applications if desired.
68bd8c8fbbSWilly Tarreau  *
69bd8c8fbbSWilly Tarreau  *   - the "exported" ones, whose interface must closely match the one
70bd8c8fbbSWilly Tarreau  *     documented in man(2), that applications are supposed to expect. These
71bd8c8fbbSWilly Tarreau  *     ones rely on the internal ones, and set errno.
72bd8c8fbbSWilly Tarreau  *
73bd8c8fbbSWilly Tarreau  * Each syscall will be defined with the two functions, sorted in alphabetical
74bd8c8fbbSWilly Tarreau  * order applied to the exported names.
75bd8c8fbbSWilly Tarreau  *
76bd8c8fbbSWilly Tarreau  * In case of doubt about the relevance of a function here, only those which
77bd8c8fbbSWilly Tarreau  * set errno should be defined here. Wrappers like those appearing in man(3)
78bd8c8fbbSWilly Tarreau  * should not be placed here.
79bd8c8fbbSWilly Tarreau  */
80bd8c8fbbSWilly Tarreau 
81bd8c8fbbSWilly Tarreau 
82bd8c8fbbSWilly Tarreau /*
83bd8c8fbbSWilly Tarreau  * int brk(void *addr);
84bd8c8fbbSWilly Tarreau  * void *sbrk(intptr_t inc)
85bd8c8fbbSWilly Tarreau  */
86bd8c8fbbSWilly Tarreau 
87bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_brk(void * addr)88bd8c8fbbSWilly Tarreau void *sys_brk(void *addr)
89bd8c8fbbSWilly Tarreau {
90bd8c8fbbSWilly Tarreau 	return (void *)my_syscall1(__NR_brk, addr);
91bd8c8fbbSWilly Tarreau }
92bd8c8fbbSWilly Tarreau 
93bd8c8fbbSWilly Tarreau static __attribute__((unused))
brk(void * addr)94bd8c8fbbSWilly Tarreau int brk(void *addr)
95bd8c8fbbSWilly Tarreau {
96fb01ff63SWilly Tarreau 	void *ret = sys_brk(addr);
97fb01ff63SWilly Tarreau 
98fb01ff63SWilly Tarreau 	if (!ret) {
99fb01ff63SWilly Tarreau 		SET_ERRNO(ENOMEM);
100fb01ff63SWilly Tarreau 		return -1;
101fb01ff63SWilly Tarreau 	}
102fb01ff63SWilly Tarreau 	return 0;
103bd8c8fbbSWilly Tarreau }
104bd8c8fbbSWilly Tarreau 
105bd8c8fbbSWilly Tarreau static __attribute__((unused))
sbrk(intptr_t inc)106bd8c8fbbSWilly Tarreau void *sbrk(intptr_t inc)
107bd8c8fbbSWilly Tarreau {
108bd8c8fbbSWilly Tarreau 	/* first call to find current end */
1094201cfceSZhangjin Wu 	void *ret = sys_brk(0);
1104201cfceSZhangjin Wu 
1114201cfceSZhangjin Wu 	if (ret && sys_brk(ret + inc) == ret + inc)
112bd8c8fbbSWilly Tarreau 		return ret + inc;
113bd8c8fbbSWilly Tarreau 
114fb01ff63SWilly Tarreau 	SET_ERRNO(ENOMEM);
115fb01ff63SWilly Tarreau 	return (void *)-1;
116bd8c8fbbSWilly Tarreau }
117bd8c8fbbSWilly Tarreau 
118bd8c8fbbSWilly Tarreau 
119bd8c8fbbSWilly Tarreau /*
120bd8c8fbbSWilly Tarreau  * int chdir(const char *path);
121bd8c8fbbSWilly Tarreau  */
122bd8c8fbbSWilly Tarreau 
123bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_chdir(const char * path)124bd8c8fbbSWilly Tarreau int sys_chdir(const char *path)
125bd8c8fbbSWilly Tarreau {
126bd8c8fbbSWilly Tarreau 	return my_syscall1(__NR_chdir, path);
127bd8c8fbbSWilly Tarreau }
128bd8c8fbbSWilly Tarreau 
129bd8c8fbbSWilly Tarreau static __attribute__((unused))
chdir(const char * path)130bd8c8fbbSWilly Tarreau int chdir(const char *path)
131bd8c8fbbSWilly Tarreau {
132d27447bcSZhangjin Wu 	return __sysret(sys_chdir(path));
133bd8c8fbbSWilly Tarreau }
134bd8c8fbbSWilly Tarreau 
135bd8c8fbbSWilly Tarreau 
136bd8c8fbbSWilly Tarreau /*
137bd8c8fbbSWilly Tarreau  * int chmod(const char *path, mode_t mode);
138bd8c8fbbSWilly Tarreau  */
139bd8c8fbbSWilly Tarreau 
140bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_chmod(const char * path,mode_t mode)141bd8c8fbbSWilly Tarreau int sys_chmod(const char *path, mode_t mode)
142bd8c8fbbSWilly Tarreau {
143bd8c8fbbSWilly Tarreau #ifdef __NR_fchmodat
144bd8c8fbbSWilly Tarreau 	return my_syscall4(__NR_fchmodat, AT_FDCWD, path, mode, 0);
145bd8c8fbbSWilly Tarreau #elif defined(__NR_chmod)
146bd8c8fbbSWilly Tarreau 	return my_syscall2(__NR_chmod, path, mode);
147bd8c8fbbSWilly Tarreau #else
148535b70c1SThomas Weißschuh 	return __nolibc_enosys(__func__, path, mode);
149bd8c8fbbSWilly Tarreau #endif
150bd8c8fbbSWilly Tarreau }
151bd8c8fbbSWilly Tarreau 
152bd8c8fbbSWilly Tarreau static __attribute__((unused))
chmod(const char * path,mode_t mode)153bd8c8fbbSWilly Tarreau int chmod(const char *path, mode_t mode)
154bd8c8fbbSWilly Tarreau {
155d27447bcSZhangjin Wu 	return __sysret(sys_chmod(path, mode));
156bd8c8fbbSWilly Tarreau }
157bd8c8fbbSWilly Tarreau 
158bd8c8fbbSWilly Tarreau 
159bd8c8fbbSWilly Tarreau /*
160bd8c8fbbSWilly Tarreau  * int chown(const char *path, uid_t owner, gid_t group);
161bd8c8fbbSWilly Tarreau  */
162bd8c8fbbSWilly Tarreau 
163bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_chown(const char * path,uid_t owner,gid_t group)164bd8c8fbbSWilly Tarreau int sys_chown(const char *path, uid_t owner, gid_t group)
165bd8c8fbbSWilly Tarreau {
166bd8c8fbbSWilly Tarreau #ifdef __NR_fchownat
167bd8c8fbbSWilly Tarreau 	return my_syscall5(__NR_fchownat, AT_FDCWD, path, owner, group, 0);
168bd8c8fbbSWilly Tarreau #elif defined(__NR_chown)
169bd8c8fbbSWilly Tarreau 	return my_syscall3(__NR_chown, path, owner, group);
170bd8c8fbbSWilly Tarreau #else
171535b70c1SThomas Weißschuh 	return __nolibc_enosys(__func__, path, owner, group);
172bd8c8fbbSWilly Tarreau #endif
173bd8c8fbbSWilly Tarreau }
174bd8c8fbbSWilly Tarreau 
175bd8c8fbbSWilly Tarreau static __attribute__((unused))
chown(const char * path,uid_t owner,gid_t group)176bd8c8fbbSWilly Tarreau int chown(const char *path, uid_t owner, gid_t group)
177bd8c8fbbSWilly Tarreau {
178d27447bcSZhangjin Wu 	return __sysret(sys_chown(path, owner, group));
179bd8c8fbbSWilly Tarreau }
180bd8c8fbbSWilly Tarreau 
181bd8c8fbbSWilly Tarreau 
182bd8c8fbbSWilly Tarreau /*
183bd8c8fbbSWilly Tarreau  * int chroot(const char *path);
184bd8c8fbbSWilly Tarreau  */
185bd8c8fbbSWilly Tarreau 
186bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_chroot(const char * path)187bd8c8fbbSWilly Tarreau int sys_chroot(const char *path)
188bd8c8fbbSWilly Tarreau {
189bd8c8fbbSWilly Tarreau 	return my_syscall1(__NR_chroot, path);
190bd8c8fbbSWilly Tarreau }
191bd8c8fbbSWilly Tarreau 
192bd8c8fbbSWilly Tarreau static __attribute__((unused))
chroot(const char * path)193bd8c8fbbSWilly Tarreau int chroot(const char *path)
194bd8c8fbbSWilly Tarreau {
195d27447bcSZhangjin Wu 	return __sysret(sys_chroot(path));
196bd8c8fbbSWilly Tarreau }
197bd8c8fbbSWilly Tarreau 
198bd8c8fbbSWilly Tarreau 
199bd8c8fbbSWilly Tarreau /*
200bd8c8fbbSWilly Tarreau  * int close(int fd);
201bd8c8fbbSWilly Tarreau  */
202bd8c8fbbSWilly Tarreau 
203bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_close(int fd)204bd8c8fbbSWilly Tarreau int sys_close(int fd)
205bd8c8fbbSWilly Tarreau {
206bd8c8fbbSWilly Tarreau 	return my_syscall1(__NR_close, fd);
207bd8c8fbbSWilly Tarreau }
208bd8c8fbbSWilly Tarreau 
209bd8c8fbbSWilly Tarreau static __attribute__((unused))
close(int fd)210bd8c8fbbSWilly Tarreau int close(int fd)
211bd8c8fbbSWilly Tarreau {
212d27447bcSZhangjin Wu 	return __sysret(sys_close(fd));
213bd8c8fbbSWilly Tarreau }
214bd8c8fbbSWilly Tarreau 
215bd8c8fbbSWilly Tarreau 
216bd8c8fbbSWilly Tarreau /*
217bd8c8fbbSWilly Tarreau  * int dup(int fd);
218bd8c8fbbSWilly Tarreau  */
219bd8c8fbbSWilly Tarreau 
220bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_dup(int fd)221bd8c8fbbSWilly Tarreau int sys_dup(int fd)
222bd8c8fbbSWilly Tarreau {
223bd8c8fbbSWilly Tarreau 	return my_syscall1(__NR_dup, fd);
224bd8c8fbbSWilly Tarreau }
225bd8c8fbbSWilly Tarreau 
226bd8c8fbbSWilly Tarreau static __attribute__((unused))
dup(int fd)227bd8c8fbbSWilly Tarreau int dup(int fd)
228bd8c8fbbSWilly Tarreau {
229d27447bcSZhangjin Wu 	return __sysret(sys_dup(fd));
230bd8c8fbbSWilly Tarreau }
231bd8c8fbbSWilly Tarreau 
232bd8c8fbbSWilly Tarreau 
233bd8c8fbbSWilly Tarreau /*
234bd8c8fbbSWilly Tarreau  * int dup2(int old, int new);
235bd8c8fbbSWilly Tarreau  */
236bd8c8fbbSWilly Tarreau 
237bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_dup2(int old,int new)238bd8c8fbbSWilly Tarreau int sys_dup2(int old, int new)
239bd8c8fbbSWilly Tarreau {
240bd8c8fbbSWilly Tarreau #ifdef __NR_dup3
241bd8c8fbbSWilly Tarreau 	return my_syscall3(__NR_dup3, old, new, 0);
242bd8c8fbbSWilly Tarreau #elif defined(__NR_dup2)
243bd8c8fbbSWilly Tarreau 	return my_syscall2(__NR_dup2, old, new);
244bd8c8fbbSWilly Tarreau #else
245535b70c1SThomas Weißschuh 	return __nolibc_enosys(__func__, old, new);
246bd8c8fbbSWilly Tarreau #endif
247bd8c8fbbSWilly Tarreau }
248bd8c8fbbSWilly Tarreau 
249bd8c8fbbSWilly Tarreau static __attribute__((unused))
dup2(int old,int new)250bd8c8fbbSWilly Tarreau int dup2(int old, int new)
251bd8c8fbbSWilly Tarreau {
252d27447bcSZhangjin Wu 	return __sysret(sys_dup2(old, new));
253bd8c8fbbSWilly Tarreau }
254bd8c8fbbSWilly Tarreau 
255bd8c8fbbSWilly Tarreau 
256bd8c8fbbSWilly Tarreau /*
257bd8c8fbbSWilly Tarreau  * int dup3(int old, int new, int flags);
258bd8c8fbbSWilly Tarreau  */
259bd8c8fbbSWilly Tarreau 
260bd8c8fbbSWilly Tarreau #ifdef __NR_dup3
261bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_dup3(int old,int new,int flags)262bd8c8fbbSWilly Tarreau int sys_dup3(int old, int new, int flags)
263bd8c8fbbSWilly Tarreau {
264bd8c8fbbSWilly Tarreau 	return my_syscall3(__NR_dup3, old, new, flags);
265bd8c8fbbSWilly Tarreau }
266bd8c8fbbSWilly Tarreau 
267bd8c8fbbSWilly Tarreau static __attribute__((unused))
dup3(int old,int new,int flags)268bd8c8fbbSWilly Tarreau int dup3(int old, int new, int flags)
269bd8c8fbbSWilly Tarreau {
270d27447bcSZhangjin Wu 	return __sysret(sys_dup3(old, new, flags));
271bd8c8fbbSWilly Tarreau }
272bd8c8fbbSWilly Tarreau #endif
273bd8c8fbbSWilly Tarreau 
274bd8c8fbbSWilly Tarreau 
275bd8c8fbbSWilly Tarreau /*
276bd8c8fbbSWilly Tarreau  * int execve(const char *filename, char *const argv[], char *const envp[]);
277bd8c8fbbSWilly Tarreau  */
278bd8c8fbbSWilly Tarreau 
279bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_execve(const char * filename,char * const argv[],char * const envp[])280bd8c8fbbSWilly Tarreau int sys_execve(const char *filename, char *const argv[], char *const envp[])
281bd8c8fbbSWilly Tarreau {
282bd8c8fbbSWilly Tarreau 	return my_syscall3(__NR_execve, filename, argv, envp);
283bd8c8fbbSWilly Tarreau }
284bd8c8fbbSWilly Tarreau 
285bd8c8fbbSWilly Tarreau static __attribute__((unused))
execve(const char * filename,char * const argv[],char * const envp[])286bd8c8fbbSWilly Tarreau int execve(const char *filename, char *const argv[], char *const envp[])
287bd8c8fbbSWilly Tarreau {
288d27447bcSZhangjin Wu 	return __sysret(sys_execve(filename, argv, envp));
289bd8c8fbbSWilly Tarreau }
290bd8c8fbbSWilly Tarreau 
291bd8c8fbbSWilly Tarreau 
292bd8c8fbbSWilly Tarreau /*
293bd8c8fbbSWilly Tarreau  * void exit(int status);
294bd8c8fbbSWilly Tarreau  */
295bd8c8fbbSWilly Tarreau 
296bd8c8fbbSWilly Tarreau static __attribute__((noreturn,unused))
sys_exit(int status)297bd8c8fbbSWilly Tarreau void sys_exit(int status)
298bd8c8fbbSWilly Tarreau {
299bd8c8fbbSWilly Tarreau 	my_syscall1(__NR_exit, status & 255);
300fddc8f81SThomas Weißschuh 	while(1); /* shut the "noreturn" warnings. */
301bd8c8fbbSWilly Tarreau }
302bd8c8fbbSWilly Tarreau 
303bd8c8fbbSWilly Tarreau static __attribute__((noreturn,unused))
exit(int status)304bd8c8fbbSWilly Tarreau void exit(int status)
305bd8c8fbbSWilly Tarreau {
306bd8c8fbbSWilly Tarreau 	sys_exit(status);
307bd8c8fbbSWilly Tarreau }
308bd8c8fbbSWilly Tarreau 
309bd8c8fbbSWilly Tarreau 
310bd8c8fbbSWilly Tarreau /*
311bd8c8fbbSWilly Tarreau  * pid_t fork(void);
312bd8c8fbbSWilly Tarreau  */
313bd8c8fbbSWilly Tarreau 
314404fa87cSThomas Weißschuh #ifndef sys_fork
315bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_fork(void)316bd8c8fbbSWilly Tarreau pid_t sys_fork(void)
317bd8c8fbbSWilly Tarreau {
318bd8c8fbbSWilly Tarreau #ifdef __NR_clone
319bd8c8fbbSWilly Tarreau 	/* note: some archs only have clone() and not fork(). Different archs
320bd8c8fbbSWilly Tarreau 	 * have a different API, but most archs have the flags on first arg and
321bd8c8fbbSWilly Tarreau 	 * will not use the rest with no other flag.
322bd8c8fbbSWilly Tarreau 	 */
323bd8c8fbbSWilly Tarreau 	return my_syscall5(__NR_clone, SIGCHLD, 0, 0, 0, 0);
324bd8c8fbbSWilly Tarreau #elif defined(__NR_fork)
325bd8c8fbbSWilly Tarreau 	return my_syscall0(__NR_fork);
326bd8c8fbbSWilly Tarreau #else
327535b70c1SThomas Weißschuh 	return __nolibc_enosys(__func__);
328bd8c8fbbSWilly Tarreau #endif
329bd8c8fbbSWilly Tarreau }
330404fa87cSThomas Weißschuh #endif
331bd8c8fbbSWilly Tarreau 
332bd8c8fbbSWilly Tarreau static __attribute__((unused))
fork(void)333bd8c8fbbSWilly Tarreau pid_t fork(void)
334bd8c8fbbSWilly Tarreau {
335d27447bcSZhangjin Wu 	return __sysret(sys_fork());
336bd8c8fbbSWilly Tarreau }
337bd8c8fbbSWilly Tarreau 
338bd8c8fbbSWilly Tarreau 
339bd8c8fbbSWilly Tarreau /*
340bd8c8fbbSWilly Tarreau  * int fsync(int fd);
341bd8c8fbbSWilly Tarreau  */
342bd8c8fbbSWilly Tarreau 
343bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_fsync(int fd)344bd8c8fbbSWilly Tarreau int sys_fsync(int fd)
345bd8c8fbbSWilly Tarreau {
346bd8c8fbbSWilly Tarreau 	return my_syscall1(__NR_fsync, fd);
347bd8c8fbbSWilly Tarreau }
348bd8c8fbbSWilly Tarreau 
349bd8c8fbbSWilly Tarreau static __attribute__((unused))
fsync(int fd)350bd8c8fbbSWilly Tarreau int fsync(int fd)
351bd8c8fbbSWilly Tarreau {
352d27447bcSZhangjin Wu 	return __sysret(sys_fsync(fd));
353bd8c8fbbSWilly Tarreau }
354bd8c8fbbSWilly Tarreau 
355bd8c8fbbSWilly Tarreau 
356bd8c8fbbSWilly Tarreau /*
357bd8c8fbbSWilly Tarreau  * int getdents64(int fd, struct linux_dirent64 *dirp, int count);
358bd8c8fbbSWilly Tarreau  */
359bd8c8fbbSWilly Tarreau 
360bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_getdents64(int fd,struct linux_dirent64 * dirp,int count)361bd8c8fbbSWilly Tarreau int sys_getdents64(int fd, struct linux_dirent64 *dirp, int count)
362bd8c8fbbSWilly Tarreau {
363bd8c8fbbSWilly Tarreau 	return my_syscall3(__NR_getdents64, fd, dirp, count);
364bd8c8fbbSWilly Tarreau }
365bd8c8fbbSWilly Tarreau 
366bd8c8fbbSWilly Tarreau static __attribute__((unused))
getdents64(int fd,struct linux_dirent64 * dirp,int count)367bd8c8fbbSWilly Tarreau int getdents64(int fd, struct linux_dirent64 *dirp, int count)
368bd8c8fbbSWilly Tarreau {
369d27447bcSZhangjin Wu 	return __sysret(sys_getdents64(fd, dirp, count));
370bd8c8fbbSWilly Tarreau }
371bd8c8fbbSWilly Tarreau 
372bd8c8fbbSWilly Tarreau 
373bd8c8fbbSWilly Tarreau /*
374919d0532SWilly Tarreau  * uid_t geteuid(void);
375919d0532SWilly Tarreau  */
376919d0532SWilly Tarreau 
377919d0532SWilly Tarreau static __attribute__((unused))
sys_geteuid(void)378919d0532SWilly Tarreau uid_t sys_geteuid(void)
379919d0532SWilly Tarreau {
380919d0532SWilly Tarreau #ifdef __NR_geteuid32
381919d0532SWilly Tarreau 	return my_syscall0(__NR_geteuid32);
382919d0532SWilly Tarreau #else
383919d0532SWilly Tarreau 	return my_syscall0(__NR_geteuid);
384919d0532SWilly Tarreau #endif
385919d0532SWilly Tarreau }
386919d0532SWilly Tarreau 
387919d0532SWilly Tarreau static __attribute__((unused))
geteuid(void)388919d0532SWilly Tarreau uid_t geteuid(void)
389919d0532SWilly Tarreau {
390919d0532SWilly Tarreau 	return sys_geteuid();
391919d0532SWilly Tarreau }
392919d0532SWilly Tarreau 
393919d0532SWilly Tarreau 
394919d0532SWilly Tarreau /*
395bd8c8fbbSWilly Tarreau  * pid_t getpgid(pid_t pid);
396bd8c8fbbSWilly Tarreau  */
397bd8c8fbbSWilly Tarreau 
398bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_getpgid(pid_t pid)399bd8c8fbbSWilly Tarreau pid_t sys_getpgid(pid_t pid)
400bd8c8fbbSWilly Tarreau {
401bd8c8fbbSWilly Tarreau 	return my_syscall1(__NR_getpgid, pid);
402bd8c8fbbSWilly Tarreau }
403bd8c8fbbSWilly Tarreau 
404bd8c8fbbSWilly Tarreau static __attribute__((unused))
getpgid(pid_t pid)405bd8c8fbbSWilly Tarreau pid_t getpgid(pid_t pid)
406bd8c8fbbSWilly Tarreau {
407d27447bcSZhangjin Wu 	return __sysret(sys_getpgid(pid));
408bd8c8fbbSWilly Tarreau }
409bd8c8fbbSWilly Tarreau 
410bd8c8fbbSWilly Tarreau 
411bd8c8fbbSWilly Tarreau /*
412bd8c8fbbSWilly Tarreau  * pid_t getpgrp(void);
413bd8c8fbbSWilly Tarreau  */
414bd8c8fbbSWilly Tarreau 
415bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_getpgrp(void)416bd8c8fbbSWilly Tarreau pid_t sys_getpgrp(void)
417bd8c8fbbSWilly Tarreau {
418bd8c8fbbSWilly Tarreau 	return sys_getpgid(0);
419bd8c8fbbSWilly Tarreau }
420bd8c8fbbSWilly Tarreau 
421bd8c8fbbSWilly Tarreau static __attribute__((unused))
getpgrp(void)422bd8c8fbbSWilly Tarreau pid_t getpgrp(void)
423bd8c8fbbSWilly Tarreau {
424830acd08SWilly Tarreau 	return sys_getpgrp();
425bd8c8fbbSWilly Tarreau }
426bd8c8fbbSWilly Tarreau 
427bd8c8fbbSWilly Tarreau 
428bd8c8fbbSWilly Tarreau /*
429bd8c8fbbSWilly Tarreau  * pid_t getpid(void);
430bd8c8fbbSWilly Tarreau  */
431bd8c8fbbSWilly Tarreau 
432bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_getpid(void)433bd8c8fbbSWilly Tarreau pid_t sys_getpid(void)
434bd8c8fbbSWilly Tarreau {
435bd8c8fbbSWilly Tarreau 	return my_syscall0(__NR_getpid);
436bd8c8fbbSWilly Tarreau }
437bd8c8fbbSWilly Tarreau 
438bd8c8fbbSWilly Tarreau static __attribute__((unused))
getpid(void)439bd8c8fbbSWilly Tarreau pid_t getpid(void)
440bd8c8fbbSWilly Tarreau {
441830acd08SWilly Tarreau 	return sys_getpid();
442bd8c8fbbSWilly Tarreau }
443bd8c8fbbSWilly Tarreau 
444bd8c8fbbSWilly Tarreau 
445bd8c8fbbSWilly Tarreau /*
44654abe359SWilly Tarreau  * pid_t getppid(void);
44754abe359SWilly Tarreau  */
44854abe359SWilly Tarreau 
44954abe359SWilly Tarreau static __attribute__((unused))
sys_getppid(void)45054abe359SWilly Tarreau pid_t sys_getppid(void)
45154abe359SWilly Tarreau {
45254abe359SWilly Tarreau 	return my_syscall0(__NR_getppid);
45354abe359SWilly Tarreau }
45454abe359SWilly Tarreau 
45554abe359SWilly Tarreau static __attribute__((unused))
getppid(void)45654abe359SWilly Tarreau pid_t getppid(void)
45754abe359SWilly Tarreau {
45854abe359SWilly Tarreau 	return sys_getppid();
45954abe359SWilly Tarreau }
46054abe359SWilly Tarreau 
46154abe359SWilly Tarreau 
46254abe359SWilly Tarreau /*
463bd8c8fbbSWilly Tarreau  * pid_t gettid(void);
464bd8c8fbbSWilly Tarreau  */
465bd8c8fbbSWilly Tarreau 
466bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_gettid(void)467bd8c8fbbSWilly Tarreau pid_t sys_gettid(void)
468bd8c8fbbSWilly Tarreau {
469bd8c8fbbSWilly Tarreau 	return my_syscall0(__NR_gettid);
470bd8c8fbbSWilly Tarreau }
471bd8c8fbbSWilly Tarreau 
472bd8c8fbbSWilly Tarreau static __attribute__((unused))
gettid(void)473bd8c8fbbSWilly Tarreau pid_t gettid(void)
474bd8c8fbbSWilly Tarreau {
475830acd08SWilly Tarreau 	return sys_gettid();
476bd8c8fbbSWilly Tarreau }
477bd8c8fbbSWilly Tarreau 
4787efd762eSAmmar Faizi static unsigned long getauxval(unsigned long key);
4797efd762eSAmmar Faizi 
4807efd762eSAmmar Faizi /*
48164077502SThomas Weißschuh  * int getpagesize(void);
4827efd762eSAmmar Faizi  */
4837efd762eSAmmar Faizi 
4847efd762eSAmmar Faizi static __attribute__((unused))
getpagesize(void)48564077502SThomas Weißschuh int getpagesize(void)
4867efd762eSAmmar Faizi {
48704694658SThomas Weißschuh 	return __sysret((int)getauxval(AT_PAGESZ) ?: -ENOENT);
4887efd762eSAmmar Faizi }
4897efd762eSAmmar Faizi 
490bd8c8fbbSWilly Tarreau 
491bd8c8fbbSWilly Tarreau /*
492bd8c8fbbSWilly Tarreau  * int gettimeofday(struct timeval *tv, struct timezone *tz);
493bd8c8fbbSWilly Tarreau  */
494bd8c8fbbSWilly Tarreau 
495bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_gettimeofday(struct timeval * tv,struct timezone * tz)496bd8c8fbbSWilly Tarreau int sys_gettimeofday(struct timeval *tv, struct timezone *tz)
497bd8c8fbbSWilly Tarreau {
4982f98aca8SZhangjin Wu #ifdef __NR_gettimeofday
499bd8c8fbbSWilly Tarreau 	return my_syscall2(__NR_gettimeofday, tv, tz);
5002f98aca8SZhangjin Wu #else
501535b70c1SThomas Weißschuh 	return __nolibc_enosys(__func__, tv, tz);
5022f98aca8SZhangjin Wu #endif
503bd8c8fbbSWilly Tarreau }
504bd8c8fbbSWilly Tarreau 
505bd8c8fbbSWilly Tarreau static __attribute__((unused))
gettimeofday(struct timeval * tv,struct timezone * tz)506bd8c8fbbSWilly Tarreau int gettimeofday(struct timeval *tv, struct timezone *tz)
507bd8c8fbbSWilly Tarreau {
508d27447bcSZhangjin Wu 	return __sysret(sys_gettimeofday(tv, tz));
509bd8c8fbbSWilly Tarreau }
510bd8c8fbbSWilly Tarreau 
511bd8c8fbbSWilly Tarreau 
512bd8c8fbbSWilly Tarreau /*
513919d0532SWilly Tarreau  * uid_t getuid(void);
514919d0532SWilly Tarreau  */
515919d0532SWilly Tarreau 
516919d0532SWilly Tarreau static __attribute__((unused))
sys_getuid(void)517919d0532SWilly Tarreau uid_t sys_getuid(void)
518919d0532SWilly Tarreau {
519919d0532SWilly Tarreau #ifdef __NR_getuid32
520919d0532SWilly Tarreau 	return my_syscall0(__NR_getuid32);
521919d0532SWilly Tarreau #else
522919d0532SWilly Tarreau 	return my_syscall0(__NR_getuid);
523919d0532SWilly Tarreau #endif
524919d0532SWilly Tarreau }
525919d0532SWilly Tarreau 
526919d0532SWilly Tarreau static __attribute__((unused))
getuid(void)527919d0532SWilly Tarreau uid_t getuid(void)
528919d0532SWilly Tarreau {
529919d0532SWilly Tarreau 	return sys_getuid();
530919d0532SWilly Tarreau }
531919d0532SWilly Tarreau 
532919d0532SWilly Tarreau 
533919d0532SWilly Tarreau /*
534bd8c8fbbSWilly Tarreau  * int ioctl(int fd, unsigned long req, void *value);
535bd8c8fbbSWilly Tarreau  */
536bd8c8fbbSWilly Tarreau 
537bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_ioctl(int fd,unsigned long req,void * value)538bd8c8fbbSWilly Tarreau int sys_ioctl(int fd, unsigned long req, void *value)
539bd8c8fbbSWilly Tarreau {
540bd8c8fbbSWilly Tarreau 	return my_syscall3(__NR_ioctl, fd, req, value);
541bd8c8fbbSWilly Tarreau }
542bd8c8fbbSWilly Tarreau 
543bd8c8fbbSWilly Tarreau static __attribute__((unused))
ioctl(int fd,unsigned long req,void * value)544bd8c8fbbSWilly Tarreau int ioctl(int fd, unsigned long req, void *value)
545bd8c8fbbSWilly Tarreau {
546d27447bcSZhangjin Wu 	return __sysret(sys_ioctl(fd, req, value));
547bd8c8fbbSWilly Tarreau }
548bd8c8fbbSWilly Tarreau 
549bd8c8fbbSWilly Tarreau /*
550bd8c8fbbSWilly Tarreau  * int kill(pid_t pid, int signal);
551bd8c8fbbSWilly Tarreau  */
552bd8c8fbbSWilly Tarreau 
553bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_kill(pid_t pid,int signal)554bd8c8fbbSWilly Tarreau int sys_kill(pid_t pid, int signal)
555bd8c8fbbSWilly Tarreau {
556bd8c8fbbSWilly Tarreau 	return my_syscall2(__NR_kill, pid, signal);
557bd8c8fbbSWilly Tarreau }
558bd8c8fbbSWilly Tarreau 
559bd8c8fbbSWilly Tarreau static __attribute__((unused))
kill(pid_t pid,int signal)560bd8c8fbbSWilly Tarreau int kill(pid_t pid, int signal)
561bd8c8fbbSWilly Tarreau {
562d27447bcSZhangjin Wu 	return __sysret(sys_kill(pid, signal));
563bd8c8fbbSWilly Tarreau }
564bd8c8fbbSWilly Tarreau 
565bd8c8fbbSWilly Tarreau 
566bd8c8fbbSWilly Tarreau /*
567bd8c8fbbSWilly Tarreau  * int link(const char *old, const char *new);
568bd8c8fbbSWilly Tarreau  */
569bd8c8fbbSWilly Tarreau 
570bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_link(const char * old,const char * new)571bd8c8fbbSWilly Tarreau int sys_link(const char *old, const char *new)
572bd8c8fbbSWilly Tarreau {
573bd8c8fbbSWilly Tarreau #ifdef __NR_linkat
574bd8c8fbbSWilly Tarreau 	return my_syscall5(__NR_linkat, AT_FDCWD, old, AT_FDCWD, new, 0);
575bd8c8fbbSWilly Tarreau #elif defined(__NR_link)
576bd8c8fbbSWilly Tarreau 	return my_syscall2(__NR_link, old, new);
577bd8c8fbbSWilly Tarreau #else
578535b70c1SThomas Weißschuh 	return __nolibc_enosys(__func__, old, new);
579bd8c8fbbSWilly Tarreau #endif
580bd8c8fbbSWilly Tarreau }
581bd8c8fbbSWilly Tarreau 
582bd8c8fbbSWilly Tarreau static __attribute__((unused))
link(const char * old,const char * new)583bd8c8fbbSWilly Tarreau int link(const char *old, const char *new)
584bd8c8fbbSWilly Tarreau {
585d27447bcSZhangjin Wu 	return __sysret(sys_link(old, new));
586bd8c8fbbSWilly Tarreau }
587bd8c8fbbSWilly Tarreau 
588bd8c8fbbSWilly Tarreau 
589bd8c8fbbSWilly Tarreau /*
590bd8c8fbbSWilly Tarreau  * off_t lseek(int fd, off_t offset, int whence);
591bd8c8fbbSWilly Tarreau  */
592bd8c8fbbSWilly Tarreau 
593bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_lseek(int fd,off_t offset,int whence)594bd8c8fbbSWilly Tarreau off_t sys_lseek(int fd, off_t offset, int whence)
595bd8c8fbbSWilly Tarreau {
5962f98aca8SZhangjin Wu #ifdef __NR_lseek
597bd8c8fbbSWilly Tarreau 	return my_syscall3(__NR_lseek, fd, offset, whence);
5982f98aca8SZhangjin Wu #else
599535b70c1SThomas Weißschuh 	return __nolibc_enosys(__func__, fd, offset, whence);
6002f98aca8SZhangjin Wu #endif
601bd8c8fbbSWilly Tarreau }
602bd8c8fbbSWilly Tarreau 
603bd8c8fbbSWilly Tarreau static __attribute__((unused))
lseek(int fd,off_t offset,int whence)604bd8c8fbbSWilly Tarreau off_t lseek(int fd, off_t offset, int whence)
605bd8c8fbbSWilly Tarreau {
606d27447bcSZhangjin Wu 	return __sysret(sys_lseek(fd, offset, whence));
607bd8c8fbbSWilly Tarreau }
608bd8c8fbbSWilly Tarreau 
609bd8c8fbbSWilly Tarreau 
610bd8c8fbbSWilly Tarreau /*
611bd8c8fbbSWilly Tarreau  * int mkdir(const char *path, mode_t mode);
612bd8c8fbbSWilly Tarreau  */
613bd8c8fbbSWilly Tarreau 
614bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_mkdir(const char * path,mode_t mode)615bd8c8fbbSWilly Tarreau int sys_mkdir(const char *path, mode_t mode)
616bd8c8fbbSWilly Tarreau {
617bd8c8fbbSWilly Tarreau #ifdef __NR_mkdirat
618bd8c8fbbSWilly Tarreau 	return my_syscall3(__NR_mkdirat, AT_FDCWD, path, mode);
619bd8c8fbbSWilly Tarreau #elif defined(__NR_mkdir)
620bd8c8fbbSWilly Tarreau 	return my_syscall2(__NR_mkdir, path, mode);
621bd8c8fbbSWilly Tarreau #else
622535b70c1SThomas Weißschuh 	return __nolibc_enosys(__func__, path, mode);
623bd8c8fbbSWilly Tarreau #endif
624bd8c8fbbSWilly Tarreau }
625bd8c8fbbSWilly Tarreau 
626bd8c8fbbSWilly Tarreau static __attribute__((unused))
mkdir(const char * path,mode_t mode)627bd8c8fbbSWilly Tarreau int mkdir(const char *path, mode_t mode)
628bd8c8fbbSWilly Tarreau {
629d27447bcSZhangjin Wu 	return __sysret(sys_mkdir(path, mode));
630bd8c8fbbSWilly Tarreau }
631bd8c8fbbSWilly Tarreau 
632f4191f3dSZhangjin Wu /*
633f4191f3dSZhangjin Wu  * int rmdir(const char *path);
634f4191f3dSZhangjin Wu  */
635f4191f3dSZhangjin Wu 
636f4191f3dSZhangjin Wu static __attribute__((unused))
sys_rmdir(const char * path)637f4191f3dSZhangjin Wu int sys_rmdir(const char *path)
638f4191f3dSZhangjin Wu {
639f4191f3dSZhangjin Wu #ifdef __NR_rmdir
640f4191f3dSZhangjin Wu 	return my_syscall1(__NR_rmdir, path);
641f4191f3dSZhangjin Wu #elif defined(__NR_unlinkat)
642f4191f3dSZhangjin Wu 	return my_syscall3(__NR_unlinkat, AT_FDCWD, path, AT_REMOVEDIR);
643f4191f3dSZhangjin Wu #else
644535b70c1SThomas Weißschuh 	return __nolibc_enosys(__func__, path);
645f4191f3dSZhangjin Wu #endif
646f4191f3dSZhangjin Wu }
647f4191f3dSZhangjin Wu 
648f4191f3dSZhangjin Wu static __attribute__((unused))
rmdir(const char * path)649f4191f3dSZhangjin Wu int rmdir(const char *path)
650f4191f3dSZhangjin Wu {
651f4191f3dSZhangjin Wu 	return __sysret(sys_rmdir(path));
652f4191f3dSZhangjin Wu }
653f4191f3dSZhangjin Wu 
654bd8c8fbbSWilly Tarreau 
655bd8c8fbbSWilly Tarreau /*
656bd8c8fbbSWilly Tarreau  * int mknod(const char *path, mode_t mode, dev_t dev);
657bd8c8fbbSWilly Tarreau  */
658bd8c8fbbSWilly Tarreau 
659bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_mknod(const char * path,mode_t mode,dev_t dev)660bd8c8fbbSWilly Tarreau long sys_mknod(const char *path, mode_t mode, dev_t dev)
661bd8c8fbbSWilly Tarreau {
662bd8c8fbbSWilly Tarreau #ifdef __NR_mknodat
663bd8c8fbbSWilly Tarreau 	return my_syscall4(__NR_mknodat, AT_FDCWD, path, mode, dev);
664bd8c8fbbSWilly Tarreau #elif defined(__NR_mknod)
665bd8c8fbbSWilly Tarreau 	return my_syscall3(__NR_mknod, path, mode, dev);
666bd8c8fbbSWilly Tarreau #else
667535b70c1SThomas Weißschuh 	return __nolibc_enosys(__func__, path, mode, dev);
668bd8c8fbbSWilly Tarreau #endif
669bd8c8fbbSWilly Tarreau }
670bd8c8fbbSWilly Tarreau 
671bd8c8fbbSWilly Tarreau static __attribute__((unused))
mknod(const char * path,mode_t mode,dev_t dev)672bd8c8fbbSWilly Tarreau int mknod(const char *path, mode_t mode, dev_t dev)
673bd8c8fbbSWilly Tarreau {
674d27447bcSZhangjin Wu 	return __sysret(sys_mknod(path, mode, dev));
675bd8c8fbbSWilly Tarreau }
676bd8c8fbbSWilly Tarreau 
67718a5a09dSSven Schnelle #ifndef sys_mmap
678544fa1a2SAmmar Faizi static __attribute__((unused))
sys_mmap(void * addr,size_t length,int prot,int flags,int fd,off_t offset)679544fa1a2SAmmar Faizi void *sys_mmap(void *addr, size_t length, int prot, int flags, int fd,
680544fa1a2SAmmar Faizi 	       off_t offset)
681544fa1a2SAmmar Faizi {
682544fa1a2SAmmar Faizi 	int n;
683544fa1a2SAmmar Faizi 
684364702f7SWilly Tarreau #if defined(__NR_mmap2)
685544fa1a2SAmmar Faizi 	n = __NR_mmap2;
686544fa1a2SAmmar Faizi 	offset >>= 12;
687544fa1a2SAmmar Faizi #else
688544fa1a2SAmmar Faizi 	n = __NR_mmap;
689544fa1a2SAmmar Faizi #endif
690544fa1a2SAmmar Faizi 
691544fa1a2SAmmar Faizi 	return (void *)my_syscall6(n, addr, length, prot, flags, fd, offset);
692544fa1a2SAmmar Faizi }
69318a5a09dSSven Schnelle #endif
694544fa1a2SAmmar Faizi 
695924e9539SZhangjin Wu /* Note that on Linux, MAP_FAILED is -1 so we can use the generic __sysret()
696924e9539SZhangjin Wu  * which returns -1 upon error and still satisfy user land that checks for
697924e9539SZhangjin Wu  * MAP_FAILED.
698924e9539SZhangjin Wu  */
699924e9539SZhangjin Wu 
700544fa1a2SAmmar Faizi static __attribute__((unused))
mmap(void * addr,size_t length,int prot,int flags,int fd,off_t offset)701544fa1a2SAmmar Faizi void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset)
702544fa1a2SAmmar Faizi {
703fb01ff63SWilly Tarreau 	void *ret = sys_mmap(addr, length, prot, flags, fd, offset);
704fb01ff63SWilly Tarreau 
705fb01ff63SWilly Tarreau 	if ((unsigned long)ret >= -4095UL) {
706fb01ff63SWilly Tarreau 		SET_ERRNO(-(long)ret);
707fb01ff63SWilly Tarreau 		ret = MAP_FAILED;
708fb01ff63SWilly Tarreau 	}
709fb01ff63SWilly Tarreau 	return ret;
710544fa1a2SAmmar Faizi }
711544fa1a2SAmmar Faizi 
712544fa1a2SAmmar Faizi static __attribute__((unused))
sys_munmap(void * addr,size_t length)713544fa1a2SAmmar Faizi int sys_munmap(void *addr, size_t length)
714544fa1a2SAmmar Faizi {
715544fa1a2SAmmar Faizi 	return my_syscall2(__NR_munmap, addr, length);
716544fa1a2SAmmar Faizi }
717544fa1a2SAmmar Faizi 
718544fa1a2SAmmar Faizi static __attribute__((unused))
munmap(void * addr,size_t length)719544fa1a2SAmmar Faizi int munmap(void *addr, size_t length)
720544fa1a2SAmmar Faizi {
721d27447bcSZhangjin Wu 	return __sysret(sys_munmap(addr, length));
722544fa1a2SAmmar Faizi }
723bd8c8fbbSWilly Tarreau 
724bd8c8fbbSWilly Tarreau /*
725bd8c8fbbSWilly Tarreau  * int mount(const char *source, const char *target,
726bd8c8fbbSWilly Tarreau  *           const char *fstype, unsigned long flags,
727bd8c8fbbSWilly Tarreau  *           const void *data);
728bd8c8fbbSWilly Tarreau  */
729bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_mount(const char * src,const char * tgt,const char * fst,unsigned long flags,const void * data)730bd8c8fbbSWilly Tarreau int sys_mount(const char *src, const char *tgt, const char *fst,
731bd8c8fbbSWilly Tarreau                      unsigned long flags, const void *data)
732bd8c8fbbSWilly Tarreau {
733bd8c8fbbSWilly Tarreau 	return my_syscall5(__NR_mount, src, tgt, fst, flags, data);
734bd8c8fbbSWilly Tarreau }
735bd8c8fbbSWilly Tarreau 
736bd8c8fbbSWilly Tarreau static __attribute__((unused))
mount(const char * src,const char * tgt,const char * fst,unsigned long flags,const void * data)737bd8c8fbbSWilly Tarreau int mount(const char *src, const char *tgt,
738bd8c8fbbSWilly Tarreau           const char *fst, unsigned long flags,
739bd8c8fbbSWilly Tarreau           const void *data)
740bd8c8fbbSWilly Tarreau {
741d27447bcSZhangjin Wu 	return __sysret(sys_mount(src, tgt, fst, flags, data));
742bd8c8fbbSWilly Tarreau }
743bd8c8fbbSWilly Tarreau 
744bd8c8fbbSWilly Tarreau 
745bd8c8fbbSWilly Tarreau /*
746a7604ba1SWilly Tarreau  * int open(const char *path, int flags[, mode_t mode]);
747bd8c8fbbSWilly Tarreau  */
748bd8c8fbbSWilly Tarreau 
749bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_open(const char * path,int flags,mode_t mode)750bd8c8fbbSWilly Tarreau int sys_open(const char *path, int flags, mode_t mode)
751bd8c8fbbSWilly Tarreau {
752bd8c8fbbSWilly Tarreau #ifdef __NR_openat
753bd8c8fbbSWilly Tarreau 	return my_syscall4(__NR_openat, AT_FDCWD, path, flags, mode);
754bd8c8fbbSWilly Tarreau #elif defined(__NR_open)
755bd8c8fbbSWilly Tarreau 	return my_syscall3(__NR_open, path, flags, mode);
756bd8c8fbbSWilly Tarreau #else
757535b70c1SThomas Weißschuh 	return __nolibc_enosys(__func__, path, flags, mode);
758bd8c8fbbSWilly Tarreau #endif
759bd8c8fbbSWilly Tarreau }
760bd8c8fbbSWilly Tarreau 
761bd8c8fbbSWilly Tarreau static __attribute__((unused))
open(const char * path,int flags,...)762a7604ba1SWilly Tarreau int open(const char *path, int flags, ...)
763bd8c8fbbSWilly Tarreau {
764a7604ba1SWilly Tarreau 	mode_t mode = 0;
765a7604ba1SWilly Tarreau 
766a7604ba1SWilly Tarreau 	if (flags & O_CREAT) {
767a7604ba1SWilly Tarreau 		va_list args;
768a7604ba1SWilly Tarreau 
769a7604ba1SWilly Tarreau 		va_start(args, flags);
770f62ec079SZhangjin Wu 		mode = va_arg(args, int);
771a7604ba1SWilly Tarreau 		va_end(args);
772a7604ba1SWilly Tarreau 	}
773a7604ba1SWilly Tarreau 
774d27447bcSZhangjin Wu 	return __sysret(sys_open(path, flags, mode));
775bd8c8fbbSWilly Tarreau }
776bd8c8fbbSWilly Tarreau 
777bd8c8fbbSWilly Tarreau 
778bd8c8fbbSWilly Tarreau /*
7793ec38af6SYuan Tan  * int pipe2(int pipefd[2], int flags);
7803ec38af6SYuan Tan  * int pipe(int pipefd[2]);
7813ec38af6SYuan Tan  */
7823ec38af6SYuan Tan 
7833ec38af6SYuan Tan static __attribute__((unused))
sys_pipe2(int pipefd[2],int flags)7843ec38af6SYuan Tan int sys_pipe2(int pipefd[2], int flags)
7853ec38af6SYuan Tan {
7863ec38af6SYuan Tan 	return my_syscall2(__NR_pipe2, pipefd, flags);
7873ec38af6SYuan Tan }
7883ec38af6SYuan Tan 
7893ec38af6SYuan Tan static __attribute__((unused))
pipe2(int pipefd[2],int flags)7903ec38af6SYuan Tan int pipe2(int pipefd[2], int flags)
7913ec38af6SYuan Tan {
7923ec38af6SYuan Tan 	return __sysret(sys_pipe2(pipefd, flags));
7933ec38af6SYuan Tan }
7943ec38af6SYuan Tan 
7953ec38af6SYuan Tan static __attribute__((unused))
pipe(int pipefd[2])7963ec38af6SYuan Tan int pipe(int pipefd[2])
7973ec38af6SYuan Tan {
7983ec38af6SYuan Tan 	return pipe2(pipefd, 0);
7993ec38af6SYuan Tan }
8003ec38af6SYuan Tan 
8013ec38af6SYuan Tan 
8023ec38af6SYuan Tan /*
803208aa9d9SThomas Weißschuh  * int prctl(int option, unsigned long arg2, unsigned long arg3,
804208aa9d9SThomas Weißschuh  *                       unsigned long arg4, unsigned long arg5);
805208aa9d9SThomas Weißschuh  */
806208aa9d9SThomas Weißschuh 
807208aa9d9SThomas Weißschuh static __attribute__((unused))
sys_prctl(int option,unsigned long arg2,unsigned long arg3,unsigned long arg4,unsigned long arg5)808208aa9d9SThomas Weißschuh int sys_prctl(int option, unsigned long arg2, unsigned long arg3,
809208aa9d9SThomas Weißschuh 		          unsigned long arg4, unsigned long arg5)
810208aa9d9SThomas Weißschuh {
811208aa9d9SThomas Weißschuh 	return my_syscall5(__NR_prctl, option, arg2, arg3, arg4, arg5);
812208aa9d9SThomas Weißschuh }
813208aa9d9SThomas Weißschuh 
814208aa9d9SThomas Weißschuh static __attribute__((unused))
prctl(int option,unsigned long arg2,unsigned long arg3,unsigned long arg4,unsigned long arg5)815208aa9d9SThomas Weißschuh int prctl(int option, unsigned long arg2, unsigned long arg3,
816208aa9d9SThomas Weißschuh 		      unsigned long arg4, unsigned long arg5)
817208aa9d9SThomas Weißschuh {
818d27447bcSZhangjin Wu 	return __sysret(sys_prctl(option, arg2, arg3, arg4, arg5));
819208aa9d9SThomas Weißschuh }
820208aa9d9SThomas Weißschuh 
821208aa9d9SThomas Weißschuh 
822208aa9d9SThomas Weißschuh /*
823bd8c8fbbSWilly Tarreau  * int pivot_root(const char *new, const char *old);
824bd8c8fbbSWilly Tarreau  */
825bd8c8fbbSWilly Tarreau 
826bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_pivot_root(const char * new,const char * old)827bd8c8fbbSWilly Tarreau int sys_pivot_root(const char *new, const char *old)
828bd8c8fbbSWilly Tarreau {
829bd8c8fbbSWilly Tarreau 	return my_syscall2(__NR_pivot_root, new, old);
830bd8c8fbbSWilly Tarreau }
831bd8c8fbbSWilly Tarreau 
832bd8c8fbbSWilly Tarreau static __attribute__((unused))
pivot_root(const char * new,const char * old)833bd8c8fbbSWilly Tarreau int pivot_root(const char *new, const char *old)
834bd8c8fbbSWilly Tarreau {
835d27447bcSZhangjin Wu 	return __sysret(sys_pivot_root(new, old));
836bd8c8fbbSWilly Tarreau }
837bd8c8fbbSWilly Tarreau 
838bd8c8fbbSWilly Tarreau 
839bd8c8fbbSWilly Tarreau /*
840bd8c8fbbSWilly Tarreau  * int poll(struct pollfd *fds, int nfds, int timeout);
841bd8c8fbbSWilly Tarreau  */
842bd8c8fbbSWilly Tarreau 
843bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_poll(struct pollfd * fds,int nfds,int timeout)844bd8c8fbbSWilly Tarreau int sys_poll(struct pollfd *fds, int nfds, int timeout)
845bd8c8fbbSWilly Tarreau {
846bd8c8fbbSWilly Tarreau #if defined(__NR_ppoll)
847bd8c8fbbSWilly Tarreau 	struct timespec t;
848bd8c8fbbSWilly Tarreau 
849bd8c8fbbSWilly Tarreau 	if (timeout >= 0) {
850bd8c8fbbSWilly Tarreau 		t.tv_sec  = timeout / 1000;
851bd8c8fbbSWilly Tarreau 		t.tv_nsec = (timeout % 1000) * 1000000;
852bd8c8fbbSWilly Tarreau 	}
8530dd2fdbfSZhangjin Wu 	return my_syscall5(__NR_ppoll, fds, nfds, (timeout >= 0) ? &t : NULL, NULL, 0);
854bd8c8fbbSWilly Tarreau #elif defined(__NR_poll)
855bd8c8fbbSWilly Tarreau 	return my_syscall3(__NR_poll, fds, nfds, timeout);
856bd8c8fbbSWilly Tarreau #else
857535b70c1SThomas Weißschuh 	return __nolibc_enosys(__func__, fds, nfds, timeout);
858bd8c8fbbSWilly Tarreau #endif
859bd8c8fbbSWilly Tarreau }
860bd8c8fbbSWilly Tarreau 
861bd8c8fbbSWilly Tarreau static __attribute__((unused))
poll(struct pollfd * fds,int nfds,int timeout)862bd8c8fbbSWilly Tarreau int poll(struct pollfd *fds, int nfds, int timeout)
863bd8c8fbbSWilly Tarreau {
864d27447bcSZhangjin Wu 	return __sysret(sys_poll(fds, nfds, timeout));
865bd8c8fbbSWilly Tarreau }
866bd8c8fbbSWilly Tarreau 
867bd8c8fbbSWilly Tarreau 
868bd8c8fbbSWilly Tarreau /*
869bd8c8fbbSWilly Tarreau  * ssize_t read(int fd, void *buf, size_t count);
870bd8c8fbbSWilly Tarreau  */
871bd8c8fbbSWilly Tarreau 
872bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_read(int fd,void * buf,size_t count)873bd8c8fbbSWilly Tarreau ssize_t sys_read(int fd, void *buf, size_t count)
874bd8c8fbbSWilly Tarreau {
875bd8c8fbbSWilly Tarreau 	return my_syscall3(__NR_read, fd, buf, count);
876bd8c8fbbSWilly Tarreau }
877bd8c8fbbSWilly Tarreau 
878bd8c8fbbSWilly Tarreau static __attribute__((unused))
read(int fd,void * buf,size_t count)879bd8c8fbbSWilly Tarreau ssize_t read(int fd, void *buf, size_t count)
880bd8c8fbbSWilly Tarreau {
881d27447bcSZhangjin Wu 	return __sysret(sys_read(fd, buf, count));
882bd8c8fbbSWilly Tarreau }
883bd8c8fbbSWilly Tarreau 
884bd8c8fbbSWilly Tarreau 
885bd8c8fbbSWilly Tarreau /*
886bd8c8fbbSWilly Tarreau  * int reboot(int cmd);
887bd8c8fbbSWilly Tarreau  * <cmd> is among LINUX_REBOOT_CMD_*
888bd8c8fbbSWilly Tarreau  */
889bd8c8fbbSWilly Tarreau 
890bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_reboot(int magic1,int magic2,int cmd,void * arg)891bd8c8fbbSWilly Tarreau ssize_t sys_reboot(int magic1, int magic2, int cmd, void *arg)
892bd8c8fbbSWilly Tarreau {
893bd8c8fbbSWilly Tarreau 	return my_syscall4(__NR_reboot, magic1, magic2, cmd, arg);
894bd8c8fbbSWilly Tarreau }
895bd8c8fbbSWilly Tarreau 
896bd8c8fbbSWilly Tarreau static __attribute__((unused))
reboot(int cmd)897bd8c8fbbSWilly Tarreau int reboot(int cmd)
898bd8c8fbbSWilly Tarreau {
899d27447bcSZhangjin Wu 	return __sysret(sys_reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, cmd, 0));
900bd8c8fbbSWilly Tarreau }
901bd8c8fbbSWilly Tarreau 
902bd8c8fbbSWilly Tarreau 
903bd8c8fbbSWilly Tarreau /*
904a0bb5f88SThomas Weißschuh  * int getrlimit(int resource, struct rlimit *rlim);
905a0bb5f88SThomas Weißschuh  * int setrlimit(int resource, const struct rlimit *rlim);
906a0bb5f88SThomas Weißschuh  */
907a0bb5f88SThomas Weißschuh 
908a0bb5f88SThomas Weißschuh static __attribute__((unused))
sys_prlimit64(pid_t pid,int resource,const struct rlimit64 * new_limit,struct rlimit64 * old_limit)909a0bb5f88SThomas Weißschuh int sys_prlimit64(pid_t pid, int resource,
910a0bb5f88SThomas Weißschuh 		  const struct rlimit64 *new_limit, struct rlimit64 *old_limit)
911a0bb5f88SThomas Weißschuh {
912a0bb5f88SThomas Weißschuh 	return my_syscall4(__NR_prlimit64, pid, resource, new_limit, old_limit);
913a0bb5f88SThomas Weißschuh }
914a0bb5f88SThomas Weißschuh 
915a0bb5f88SThomas Weißschuh static __attribute__((unused))
getrlimit(int resource,struct rlimit * rlim)916a0bb5f88SThomas Weißschuh int getrlimit(int resource, struct rlimit *rlim)
917a0bb5f88SThomas Weißschuh {
918a0bb5f88SThomas Weißschuh 	struct rlimit64 rlim64;
919a0bb5f88SThomas Weißschuh 	int ret;
920a0bb5f88SThomas Weißschuh 
921a0bb5f88SThomas Weißschuh 	ret = __sysret(sys_prlimit64(0, resource, NULL, &rlim64));
922a0bb5f88SThomas Weißschuh 	rlim->rlim_cur = rlim64.rlim_cur;
923a0bb5f88SThomas Weißschuh 	rlim->rlim_max = rlim64.rlim_max;
924a0bb5f88SThomas Weißschuh 
925a0bb5f88SThomas Weißschuh 	return ret;
926a0bb5f88SThomas Weißschuh }
927a0bb5f88SThomas Weißschuh 
928a0bb5f88SThomas Weißschuh static __attribute__((unused))
setrlimit(int resource,const struct rlimit * rlim)929a0bb5f88SThomas Weißschuh int setrlimit(int resource, const struct rlimit *rlim)
930a0bb5f88SThomas Weißschuh {
931a0bb5f88SThomas Weißschuh 	struct rlimit64 rlim64 = {
932a0bb5f88SThomas Weißschuh 		.rlim_cur = rlim->rlim_cur,
933a0bb5f88SThomas Weißschuh 		.rlim_max = rlim->rlim_max,
934a0bb5f88SThomas Weißschuh 	};
935a0bb5f88SThomas Weißschuh 
936a0bb5f88SThomas Weißschuh 	return __sysret(sys_prlimit64(0, resource, &rlim64, NULL));
937a0bb5f88SThomas Weißschuh }
938a0bb5f88SThomas Weißschuh 
939a0bb5f88SThomas Weißschuh 
940a0bb5f88SThomas Weißschuh /*
941bd8c8fbbSWilly Tarreau  * int sched_yield(void);
942bd8c8fbbSWilly Tarreau  */
943bd8c8fbbSWilly Tarreau 
944bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_sched_yield(void)945bd8c8fbbSWilly Tarreau int sys_sched_yield(void)
946bd8c8fbbSWilly Tarreau {
947bd8c8fbbSWilly Tarreau 	return my_syscall0(__NR_sched_yield);
948bd8c8fbbSWilly Tarreau }
949bd8c8fbbSWilly Tarreau 
950bd8c8fbbSWilly Tarreau static __attribute__((unused))
sched_yield(void)951bd8c8fbbSWilly Tarreau int sched_yield(void)
952bd8c8fbbSWilly Tarreau {
953d27447bcSZhangjin Wu 	return __sysret(sys_sched_yield());
954bd8c8fbbSWilly Tarreau }
955bd8c8fbbSWilly Tarreau 
956bd8c8fbbSWilly Tarreau 
957bd8c8fbbSWilly Tarreau /*
958bd8c8fbbSWilly Tarreau  * int select(int nfds, fd_set *read_fds, fd_set *write_fds,
959bd8c8fbbSWilly Tarreau  *            fd_set *except_fds, struct timeval *timeout);
960bd8c8fbbSWilly Tarreau  */
961bd8c8fbbSWilly Tarreau 
962bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_select(int nfds,fd_set * rfds,fd_set * wfds,fd_set * efds,struct timeval * timeout)963bd8c8fbbSWilly Tarreau int sys_select(int nfds, fd_set *rfds, fd_set *wfds, fd_set *efds, struct timeval *timeout)
964bd8c8fbbSWilly Tarreau {
965bd8c8fbbSWilly Tarreau #if defined(__ARCH_WANT_SYS_OLD_SELECT) && !defined(__NR__newselect)
966bd8c8fbbSWilly Tarreau 	struct sel_arg_struct {
967bd8c8fbbSWilly Tarreau 		unsigned long n;
968bd8c8fbbSWilly Tarreau 		fd_set *r, *w, *e;
969bd8c8fbbSWilly Tarreau 		struct timeval *t;
970bd8c8fbbSWilly Tarreau 	} arg = { .n = nfds, .r = rfds, .w = wfds, .e = efds, .t = timeout };
971bd8c8fbbSWilly Tarreau 	return my_syscall1(__NR_select, &arg);
972eaa8c9a8SThomas Weißschuh #elif defined(__NR__newselect)
973eaa8c9a8SThomas Weißschuh 	return my_syscall5(__NR__newselect, nfds, rfds, wfds, efds, timeout);
974eaa8c9a8SThomas Weißschuh #elif defined(__NR_select)
975eaa8c9a8SThomas Weißschuh 	return my_syscall5(__NR_select, nfds, rfds, wfds, efds, timeout);
976eaa8c9a8SThomas Weißschuh #elif defined(__NR_pselect6)
977bd8c8fbbSWilly Tarreau 	struct timespec t;
978bd8c8fbbSWilly Tarreau 
979bd8c8fbbSWilly Tarreau 	if (timeout) {
980bd8c8fbbSWilly Tarreau 		t.tv_sec  = timeout->tv_sec;
981bd8c8fbbSWilly Tarreau 		t.tv_nsec = timeout->tv_usec * 1000;
982bd8c8fbbSWilly Tarreau 	}
983bd8c8fbbSWilly Tarreau 	return my_syscall6(__NR_pselect6, nfds, rfds, wfds, efds, timeout ? &t : NULL, NULL);
984bd8c8fbbSWilly Tarreau #else
985535b70c1SThomas Weißschuh 	return __nolibc_enosys(__func__, nfds, rfds, wfds, efds, timeout);
986bd8c8fbbSWilly Tarreau #endif
987bd8c8fbbSWilly Tarreau }
988bd8c8fbbSWilly Tarreau 
989bd8c8fbbSWilly Tarreau static __attribute__((unused))
select(int nfds,fd_set * rfds,fd_set * wfds,fd_set * efds,struct timeval * timeout)990bd8c8fbbSWilly Tarreau int select(int nfds, fd_set *rfds, fd_set *wfds, fd_set *efds, struct timeval *timeout)
991bd8c8fbbSWilly Tarreau {
992d27447bcSZhangjin Wu 	return __sysret(sys_select(nfds, rfds, wfds, efds, timeout));
993bd8c8fbbSWilly Tarreau }
994bd8c8fbbSWilly Tarreau 
995bd8c8fbbSWilly Tarreau 
996bd8c8fbbSWilly Tarreau /*
997bd8c8fbbSWilly Tarreau  * int setpgid(pid_t pid, pid_t pgid);
998bd8c8fbbSWilly Tarreau  */
999bd8c8fbbSWilly Tarreau 
1000bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_setpgid(pid_t pid,pid_t pgid)1001bd8c8fbbSWilly Tarreau int sys_setpgid(pid_t pid, pid_t pgid)
1002bd8c8fbbSWilly Tarreau {
1003bd8c8fbbSWilly Tarreau 	return my_syscall2(__NR_setpgid, pid, pgid);
1004bd8c8fbbSWilly Tarreau }
1005bd8c8fbbSWilly Tarreau 
1006bd8c8fbbSWilly Tarreau static __attribute__((unused))
setpgid(pid_t pid,pid_t pgid)1007bd8c8fbbSWilly Tarreau int setpgid(pid_t pid, pid_t pgid)
1008bd8c8fbbSWilly Tarreau {
1009d27447bcSZhangjin Wu 	return __sysret(sys_setpgid(pid, pgid));
1010bd8c8fbbSWilly Tarreau }
1011bd8c8fbbSWilly Tarreau 
1012bd8c8fbbSWilly Tarreau 
1013bd8c8fbbSWilly Tarreau /*
1014bd8c8fbbSWilly Tarreau  * pid_t setsid(void);
1015bd8c8fbbSWilly Tarreau  */
1016bd8c8fbbSWilly Tarreau 
1017bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_setsid(void)1018bd8c8fbbSWilly Tarreau pid_t sys_setsid(void)
1019bd8c8fbbSWilly Tarreau {
1020bd8c8fbbSWilly Tarreau 	return my_syscall0(__NR_setsid);
1021bd8c8fbbSWilly Tarreau }
1022bd8c8fbbSWilly Tarreau 
1023bd8c8fbbSWilly Tarreau static __attribute__((unused))
setsid(void)1024bd8c8fbbSWilly Tarreau pid_t setsid(void)
1025bd8c8fbbSWilly Tarreau {
1026d27447bcSZhangjin Wu 	return __sysret(sys_setsid());
1027bd8c8fbbSWilly Tarreau }
1028bd8c8fbbSWilly Tarreau 
1029b551cb7dSFeiyang Chen /*
1030b551cb7dSFeiyang Chen  * int statx(int fd, const char *path, int flags, unsigned int mask, struct statx *buf);
1031af93807eSZhangjin Wu  * int stat(const char *path, struct stat *buf);
1032b551cb7dSFeiyang Chen  */
1033b551cb7dSFeiyang Chen 
1034b551cb7dSFeiyang Chen static __attribute__((unused))
sys_statx(int fd,const char * path,int flags,unsigned int mask,struct statx * buf)1035b551cb7dSFeiyang Chen int sys_statx(int fd, const char *path, int flags, unsigned int mask, struct statx *buf)
1036b551cb7dSFeiyang Chen {
1037af93807eSZhangjin Wu #ifdef __NR_statx
1038b551cb7dSFeiyang Chen 	return my_syscall5(__NR_statx, fd, path, flags, mask, buf);
1039af93807eSZhangjin Wu #else
1040535b70c1SThomas Weißschuh 	return __nolibc_enosys(__func__, fd, path, flags, mask, buf);
1041af93807eSZhangjin Wu #endif
1042b551cb7dSFeiyang Chen }
1043b551cb7dSFeiyang Chen 
1044b551cb7dSFeiyang Chen static __attribute__((unused))
statx(int fd,const char * path,int flags,unsigned int mask,struct statx * buf)1045b551cb7dSFeiyang Chen int statx(int fd, const char *path, int flags, unsigned int mask, struct statx *buf)
1046b551cb7dSFeiyang Chen {
1047d27447bcSZhangjin Wu 	return __sysret(sys_statx(fd, path, flags, mask, buf));
1048b551cb7dSFeiyang Chen }
1049bd8c8fbbSWilly Tarreau 
1050bd8c8fbbSWilly Tarreau 
1051b551cb7dSFeiyang Chen static __attribute__((unused))
stat(const char * path,struct stat * buf)1052af93807eSZhangjin Wu int stat(const char *path, struct stat *buf)
1053b551cb7dSFeiyang Chen {
1054b551cb7dSFeiyang Chen 	struct statx statx;
1055b551cb7dSFeiyang Chen 	long ret;
1056b551cb7dSFeiyang Chen 
1057af93807eSZhangjin Wu 	ret = __sysret(sys_statx(AT_FDCWD, path, AT_NO_AUTOMOUNT, STATX_BASIC_STATS, &statx));
1058af93807eSZhangjin Wu 	if (ret == -1)
1059af93807eSZhangjin Wu 		return ret;
1060af93807eSZhangjin Wu 
1061b551cb7dSFeiyang Chen 	buf->st_dev          = ((statx.stx_dev_minor & 0xff)
1062b551cb7dSFeiyang Chen 			       | (statx.stx_dev_major << 8)
1063b551cb7dSFeiyang Chen 			       | ((statx.stx_dev_minor & ~0xff) << 12));
1064b551cb7dSFeiyang Chen 	buf->st_ino          = statx.stx_ino;
1065b551cb7dSFeiyang Chen 	buf->st_mode         = statx.stx_mode;
1066b551cb7dSFeiyang Chen 	buf->st_nlink        = statx.stx_nlink;
1067b551cb7dSFeiyang Chen 	buf->st_uid          = statx.stx_uid;
1068b551cb7dSFeiyang Chen 	buf->st_gid          = statx.stx_gid;
1069b551cb7dSFeiyang Chen 	buf->st_rdev         = ((statx.stx_rdev_minor & 0xff)
1070b551cb7dSFeiyang Chen 			       | (statx.stx_rdev_major << 8)
1071b551cb7dSFeiyang Chen 			       | ((statx.stx_rdev_minor & ~0xff) << 12));
1072b551cb7dSFeiyang Chen 	buf->st_size         = statx.stx_size;
1073b551cb7dSFeiyang Chen 	buf->st_blksize      = statx.stx_blksize;
1074b551cb7dSFeiyang Chen 	buf->st_blocks       = statx.stx_blocks;
107587b9fa66SThomas Weißschuh 	buf->st_atim.tv_sec  = statx.stx_atime.tv_sec;
107687b9fa66SThomas Weißschuh 	buf->st_atim.tv_nsec = statx.stx_atime.tv_nsec;
107787b9fa66SThomas Weißschuh 	buf->st_mtim.tv_sec  = statx.stx_mtime.tv_sec;
107887b9fa66SThomas Weißschuh 	buf->st_mtim.tv_nsec = statx.stx_mtime.tv_nsec;
107987b9fa66SThomas Weißschuh 	buf->st_ctim.tv_sec  = statx.stx_ctime.tv_sec;
108087b9fa66SThomas Weißschuh 	buf->st_ctim.tv_nsec = statx.stx_ctime.tv_nsec;
1081bd8c8fbbSWilly Tarreau 
1082af93807eSZhangjin Wu 	return 0;
1083bd8c8fbbSWilly Tarreau }
1084bd8c8fbbSWilly Tarreau 
1085bd8c8fbbSWilly Tarreau 
1086bd8c8fbbSWilly Tarreau /*
1087bd8c8fbbSWilly Tarreau  * int symlink(const char *old, const char *new);
1088bd8c8fbbSWilly Tarreau  */
1089bd8c8fbbSWilly Tarreau 
1090bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_symlink(const char * old,const char * new)1091bd8c8fbbSWilly Tarreau int sys_symlink(const char *old, const char *new)
1092bd8c8fbbSWilly Tarreau {
1093bd8c8fbbSWilly Tarreau #ifdef __NR_symlinkat
1094bd8c8fbbSWilly Tarreau 	return my_syscall3(__NR_symlinkat, old, AT_FDCWD, new);
1095bd8c8fbbSWilly Tarreau #elif defined(__NR_symlink)
1096bd8c8fbbSWilly Tarreau 	return my_syscall2(__NR_symlink, old, new);
1097bd8c8fbbSWilly Tarreau #else
1098535b70c1SThomas Weißschuh 	return __nolibc_enosys(__func__, old, new);
1099bd8c8fbbSWilly Tarreau #endif
1100bd8c8fbbSWilly Tarreau }
1101bd8c8fbbSWilly Tarreau 
1102bd8c8fbbSWilly Tarreau static __attribute__((unused))
symlink(const char * old,const char * new)1103bd8c8fbbSWilly Tarreau int symlink(const char *old, const char *new)
1104bd8c8fbbSWilly Tarreau {
1105d27447bcSZhangjin Wu 	return __sysret(sys_symlink(old, new));
1106bd8c8fbbSWilly Tarreau }
1107bd8c8fbbSWilly Tarreau 
1108bd8c8fbbSWilly Tarreau 
1109bd8c8fbbSWilly Tarreau /*
1110bd8c8fbbSWilly Tarreau  * mode_t umask(mode_t mode);
1111bd8c8fbbSWilly Tarreau  */
1112bd8c8fbbSWilly Tarreau 
1113bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_umask(mode_t mode)1114bd8c8fbbSWilly Tarreau mode_t sys_umask(mode_t mode)
1115bd8c8fbbSWilly Tarreau {
1116bd8c8fbbSWilly Tarreau 	return my_syscall1(__NR_umask, mode);
1117bd8c8fbbSWilly Tarreau }
1118bd8c8fbbSWilly Tarreau 
1119bd8c8fbbSWilly Tarreau static __attribute__((unused))
umask(mode_t mode)1120bd8c8fbbSWilly Tarreau mode_t umask(mode_t mode)
1121bd8c8fbbSWilly Tarreau {
1122bd8c8fbbSWilly Tarreau 	return sys_umask(mode);
1123bd8c8fbbSWilly Tarreau }
1124bd8c8fbbSWilly Tarreau 
1125bd8c8fbbSWilly Tarreau 
1126bd8c8fbbSWilly Tarreau /*
1127bd8c8fbbSWilly Tarreau  * int umount2(const char *path, int flags);
1128bd8c8fbbSWilly Tarreau  */
1129bd8c8fbbSWilly Tarreau 
1130bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_umount2(const char * path,int flags)1131bd8c8fbbSWilly Tarreau int sys_umount2(const char *path, int flags)
1132bd8c8fbbSWilly Tarreau {
1133bd8c8fbbSWilly Tarreau 	return my_syscall2(__NR_umount2, path, flags);
1134bd8c8fbbSWilly Tarreau }
1135bd8c8fbbSWilly Tarreau 
1136bd8c8fbbSWilly Tarreau static __attribute__((unused))
umount2(const char * path,int flags)1137bd8c8fbbSWilly Tarreau int umount2(const char *path, int flags)
1138bd8c8fbbSWilly Tarreau {
1139d27447bcSZhangjin Wu 	return __sysret(sys_umount2(path, flags));
1140bd8c8fbbSWilly Tarreau }
1141bd8c8fbbSWilly Tarreau 
1142bd8c8fbbSWilly Tarreau 
1143bd8c8fbbSWilly Tarreau /*
1144*0adab2b6SThomas Weißschuh  * int uname(struct utsname *buf);
1145*0adab2b6SThomas Weißschuh  */
1146*0adab2b6SThomas Weißschuh 
1147*0adab2b6SThomas Weißschuh struct utsname {
1148*0adab2b6SThomas Weißschuh 	char sysname[65];
1149*0adab2b6SThomas Weißschuh 	char nodename[65];
1150*0adab2b6SThomas Weißschuh 	char release[65];
1151*0adab2b6SThomas Weißschuh 	char version[65];
1152*0adab2b6SThomas Weißschuh 	char machine[65];
1153*0adab2b6SThomas Weißschuh 	char domainname[65];
1154*0adab2b6SThomas Weißschuh };
1155*0adab2b6SThomas Weißschuh 
1156*0adab2b6SThomas Weißschuh static __attribute__((unused))
sys_uname(struct utsname * buf)1157*0adab2b6SThomas Weißschuh int sys_uname(struct utsname *buf)
1158*0adab2b6SThomas Weißschuh {
1159*0adab2b6SThomas Weißschuh 	return my_syscall1(__NR_uname, buf);
1160*0adab2b6SThomas Weißschuh }
1161*0adab2b6SThomas Weißschuh 
1162*0adab2b6SThomas Weißschuh static __attribute__((unused))
uname(struct utsname * buf)1163*0adab2b6SThomas Weißschuh int uname(struct utsname *buf)
1164*0adab2b6SThomas Weißschuh {
1165*0adab2b6SThomas Weißschuh 	return __sysret(sys_uname(buf));
1166*0adab2b6SThomas Weißschuh }
1167*0adab2b6SThomas Weißschuh 
1168*0adab2b6SThomas Weißschuh 
1169*0adab2b6SThomas Weißschuh /*
1170bd8c8fbbSWilly Tarreau  * int unlink(const char *path);
1171bd8c8fbbSWilly Tarreau  */
1172bd8c8fbbSWilly Tarreau 
1173bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_unlink(const char * path)1174bd8c8fbbSWilly Tarreau int sys_unlink(const char *path)
1175bd8c8fbbSWilly Tarreau {
1176bd8c8fbbSWilly Tarreau #ifdef __NR_unlinkat
1177bd8c8fbbSWilly Tarreau 	return my_syscall3(__NR_unlinkat, AT_FDCWD, path, 0);
1178bd8c8fbbSWilly Tarreau #elif defined(__NR_unlink)
1179bd8c8fbbSWilly Tarreau 	return my_syscall1(__NR_unlink, path);
1180bd8c8fbbSWilly Tarreau #else
1181535b70c1SThomas Weißschuh 	return __nolibc_enosys(__func__, path);
1182bd8c8fbbSWilly Tarreau #endif
1183bd8c8fbbSWilly Tarreau }
1184bd8c8fbbSWilly Tarreau 
1185bd8c8fbbSWilly Tarreau static __attribute__((unused))
unlink(const char * path)1186bd8c8fbbSWilly Tarreau int unlink(const char *path)
1187bd8c8fbbSWilly Tarreau {
1188d27447bcSZhangjin Wu 	return __sysret(sys_unlink(path));
1189bd8c8fbbSWilly Tarreau }
1190bd8c8fbbSWilly Tarreau 
1191bd8c8fbbSWilly Tarreau 
1192bd8c8fbbSWilly Tarreau /*
1193bd8c8fbbSWilly Tarreau  * pid_t wait(int *status);
1194bd8c8fbbSWilly Tarreau  * pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage);
1195bd8c8fbbSWilly Tarreau  * pid_t waitpid(pid_t pid, int *status, int options);
1196bd8c8fbbSWilly Tarreau  */
1197bd8c8fbbSWilly Tarreau 
1198bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_wait4(pid_t pid,int * status,int options,struct rusage * rusage)1199bd8c8fbbSWilly Tarreau pid_t sys_wait4(pid_t pid, int *status, int options, struct rusage *rusage)
1200bd8c8fbbSWilly Tarreau {
12012f98aca8SZhangjin Wu #ifdef __NR_wait4
1202bd8c8fbbSWilly Tarreau 	return my_syscall4(__NR_wait4, pid, status, options, rusage);
12032f98aca8SZhangjin Wu #else
1204535b70c1SThomas Weißschuh 	return __nolibc_enosys(__func__, pid, status, options, rusage);
12052f98aca8SZhangjin Wu #endif
1206bd8c8fbbSWilly Tarreau }
1207bd8c8fbbSWilly Tarreau 
1208bd8c8fbbSWilly Tarreau static __attribute__((unused))
wait(int * status)1209bd8c8fbbSWilly Tarreau pid_t wait(int *status)
1210bd8c8fbbSWilly Tarreau {
1211d27447bcSZhangjin Wu 	return __sysret(sys_wait4(-1, status, 0, NULL));
1212bd8c8fbbSWilly Tarreau }
1213bd8c8fbbSWilly Tarreau 
1214bd8c8fbbSWilly Tarreau static __attribute__((unused))
wait4(pid_t pid,int * status,int options,struct rusage * rusage)1215bd8c8fbbSWilly Tarreau pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage)
1216bd8c8fbbSWilly Tarreau {
1217d27447bcSZhangjin Wu 	return __sysret(sys_wait4(pid, status, options, rusage));
1218bd8c8fbbSWilly Tarreau }
1219bd8c8fbbSWilly Tarreau 
1220bd8c8fbbSWilly Tarreau 
1221bd8c8fbbSWilly Tarreau static __attribute__((unused))
waitpid(pid_t pid,int * status,int options)1222bd8c8fbbSWilly Tarreau pid_t waitpid(pid_t pid, int *status, int options)
1223bd8c8fbbSWilly Tarreau {
1224d27447bcSZhangjin Wu 	return __sysret(sys_wait4(pid, status, options, NULL));
1225bd8c8fbbSWilly Tarreau }
1226bd8c8fbbSWilly Tarreau 
1227bd8c8fbbSWilly Tarreau 
1228bd8c8fbbSWilly Tarreau /*
1229bd8c8fbbSWilly Tarreau  * ssize_t write(int fd, const void *buf, size_t count);
1230bd8c8fbbSWilly Tarreau  */
1231bd8c8fbbSWilly Tarreau 
1232bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_write(int fd,const void * buf,size_t count)1233bd8c8fbbSWilly Tarreau ssize_t sys_write(int fd, const void *buf, size_t count)
1234bd8c8fbbSWilly Tarreau {
1235bd8c8fbbSWilly Tarreau 	return my_syscall3(__NR_write, fd, buf, count);
1236bd8c8fbbSWilly Tarreau }
1237bd8c8fbbSWilly Tarreau 
1238bd8c8fbbSWilly Tarreau static __attribute__((unused))
write(int fd,const void * buf,size_t count)1239bd8c8fbbSWilly Tarreau ssize_t write(int fd, const void *buf, size_t count)
1240bd8c8fbbSWilly Tarreau {
1241d27447bcSZhangjin Wu 	return __sysret(sys_write(fd, buf, count));
1242bd8c8fbbSWilly Tarreau }
1243bd8c8fbbSWilly Tarreau 
1244e8842cf0SThomas Weißschuh 
1245e8842cf0SThomas Weißschuh /*
1246e8842cf0SThomas Weißschuh  * int memfd_create(const char *name, unsigned int flags);
1247e8842cf0SThomas Weißschuh  */
1248e8842cf0SThomas Weißschuh 
1249e8842cf0SThomas Weißschuh static __attribute__((unused))
sys_memfd_create(const char * name,unsigned int flags)1250e8842cf0SThomas Weißschuh int sys_memfd_create(const char *name, unsigned int flags)
1251e8842cf0SThomas Weißschuh {
1252e8842cf0SThomas Weißschuh 	return my_syscall2(__NR_memfd_create, name, flags);
1253e8842cf0SThomas Weißschuh }
1254e8842cf0SThomas Weißschuh 
1255e8842cf0SThomas Weißschuh static __attribute__((unused))
memfd_create(const char * name,unsigned int flags)1256e8842cf0SThomas Weißschuh int memfd_create(const char *name, unsigned int flags)
1257e8842cf0SThomas Weißschuh {
1258d27447bcSZhangjin Wu 	return __sysret(sys_memfd_create(name, flags));
1259e8842cf0SThomas Weißschuh }
1260e8842cf0SThomas Weißschuh 
126155abdd1fSWilly Tarreau /* make sure to include all global symbols */
126255abdd1fSWilly Tarreau #include "nolibc.h"
1263bd8c8fbbSWilly Tarreau 
1264bd8c8fbbSWilly Tarreau #endif /* _NOLIBC_SYS_H */
1265