xref: /openbmc/linux/tools/include/nolibc/sys.h (revision 556fb713)
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 
10a7604ba1SWilly Tarreau #include <stdarg.h>
11bd8c8fbbSWilly Tarreau #include "std.h"
12bd8c8fbbSWilly Tarreau 
13bd8c8fbbSWilly Tarreau /* system includes */
14bd8c8fbbSWilly Tarreau #include <asm/unistd.h>
15fddc8f81SThomas Weißschuh #include <asm/signal.h>  /* for SIGCHLD */
16bd8c8fbbSWilly Tarreau #include <asm/ioctls.h>
17544fa1a2SAmmar Faizi #include <asm/mman.h>
18bd8c8fbbSWilly Tarreau #include <linux/fs.h>
19bd8c8fbbSWilly Tarreau #include <linux/loop.h>
20bd8c8fbbSWilly Tarreau #include <linux/time.h>
217efd762eSAmmar Faizi #include <linux/auxvec.h>
22fddc8f81SThomas Weißschuh #include <linux/fcntl.h> /* for O_* and AT_* */
23fddc8f81SThomas Weißschuh #include <linux/stat.h>  /* for statx() */
24208aa9d9SThomas Weißschuh #include <linux/prctl.h>
25bd8c8fbbSWilly Tarreau 
26bd8c8fbbSWilly Tarreau #include "arch.h"
2745a794bfSWilly Tarreau #include "errno.h"
28bd8c8fbbSWilly Tarreau #include "types.h"
29bd8c8fbbSWilly Tarreau 
306591be4aSZhangjin Wu 
31*556fb713SWilly Tarreau /* Syscall return helper: takes the syscall value in argument and checks for an
32*556fb713SWilly Tarreau  * error in it. This may only be used with signed returns (int or long), but
33*556fb713SWilly Tarreau  * not with pointers. An error is any value < 0. When an error is encountered,
34*556fb713SWilly Tarreau  * -ret is set into errno and -1 is returned. Otherwise the returned value is
35*556fb713SWilly Tarreau  * passed as-is with its type preserved.
366591be4aSZhangjin Wu  */
376591be4aSZhangjin Wu 
38*556fb713SWilly Tarreau #define __sysret(arg)							\
39*556fb713SWilly Tarreau ({									\
40*556fb713SWilly Tarreau 	__typeof__(arg) __sysret_arg = (arg);				\
41*556fb713SWilly Tarreau 	(__sysret_arg < 0)                              /* error ? */	\
42*556fb713SWilly Tarreau 		? (({ SET_ERRNO(-__sysret_arg); }), -1) /* ret -1 with errno = -arg */ \
43*556fb713SWilly Tarreau 		: __sysret_arg;                         /* return original value */ \
44*556fb713SWilly Tarreau })
45*556fb713SWilly Tarreau 
46bd8c8fbbSWilly Tarreau 
47bd8c8fbbSWilly Tarreau /* Functions in this file only describe syscalls. They're declared static so
48bd8c8fbbSWilly Tarreau  * that the compiler usually decides to inline them while still being allowed
49bd8c8fbbSWilly Tarreau  * to pass a pointer to one of their instances. Each syscall exists in two
50bd8c8fbbSWilly Tarreau  * versions:
51bd8c8fbbSWilly Tarreau  *   - the "internal" ones, which matches the raw syscall interface at the
52bd8c8fbbSWilly Tarreau  *     kernel level, which may sometimes slightly differ from the documented
53bd8c8fbbSWilly Tarreau  *     libc-level ones. For example most of them return either a valid value
54bd8c8fbbSWilly Tarreau  *     or -errno. All of these are prefixed with "sys_". They may be called
55bd8c8fbbSWilly Tarreau  *     by non-portable applications if desired.
56bd8c8fbbSWilly Tarreau  *
57bd8c8fbbSWilly Tarreau  *   - the "exported" ones, whose interface must closely match the one
58bd8c8fbbSWilly Tarreau  *     documented in man(2), that applications are supposed to expect. These
59bd8c8fbbSWilly Tarreau  *     ones rely on the internal ones, and set errno.
60bd8c8fbbSWilly Tarreau  *
61bd8c8fbbSWilly Tarreau  * Each syscall will be defined with the two functions, sorted in alphabetical
62bd8c8fbbSWilly Tarreau  * order applied to the exported names.
63bd8c8fbbSWilly Tarreau  *
64bd8c8fbbSWilly Tarreau  * In case of doubt about the relevance of a function here, only those which
65bd8c8fbbSWilly Tarreau  * set errno should be defined here. Wrappers like those appearing in man(3)
66bd8c8fbbSWilly Tarreau  * should not be placed here.
67bd8c8fbbSWilly Tarreau  */
68bd8c8fbbSWilly Tarreau 
69bd8c8fbbSWilly Tarreau 
70bd8c8fbbSWilly Tarreau /*
71bd8c8fbbSWilly Tarreau  * int brk(void *addr);
72bd8c8fbbSWilly Tarreau  * void *sbrk(intptr_t inc)
73bd8c8fbbSWilly Tarreau  */
74bd8c8fbbSWilly Tarreau 
75bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_brk(void * addr)76bd8c8fbbSWilly Tarreau void *sys_brk(void *addr)
77bd8c8fbbSWilly Tarreau {
78bd8c8fbbSWilly Tarreau 	return (void *)my_syscall1(__NR_brk, addr);
79bd8c8fbbSWilly Tarreau }
80bd8c8fbbSWilly Tarreau 
81bd8c8fbbSWilly Tarreau static __attribute__((unused))
brk(void * addr)82bd8c8fbbSWilly Tarreau int brk(void *addr)
83bd8c8fbbSWilly Tarreau {
84fb01ff63SWilly Tarreau 	void *ret = sys_brk(addr);
85fb01ff63SWilly Tarreau 
86fb01ff63SWilly Tarreau 	if (!ret) {
87fb01ff63SWilly Tarreau 		SET_ERRNO(ENOMEM);
88fb01ff63SWilly Tarreau 		return -1;
89fb01ff63SWilly Tarreau 	}
90fb01ff63SWilly Tarreau 	return 0;
91bd8c8fbbSWilly Tarreau }
92bd8c8fbbSWilly Tarreau 
93bd8c8fbbSWilly Tarreau static __attribute__((unused))
sbrk(intptr_t inc)94bd8c8fbbSWilly Tarreau void *sbrk(intptr_t inc)
95bd8c8fbbSWilly Tarreau {
96bd8c8fbbSWilly Tarreau 	/* first call to find current end */
974201cfceSZhangjin Wu 	void *ret = sys_brk(0);
984201cfceSZhangjin Wu 
994201cfceSZhangjin Wu 	if (ret && sys_brk(ret + inc) == ret + inc)
100bd8c8fbbSWilly Tarreau 		return ret + inc;
101bd8c8fbbSWilly Tarreau 
102fb01ff63SWilly Tarreau 	SET_ERRNO(ENOMEM);
103fb01ff63SWilly Tarreau 	return (void *)-1;
104bd8c8fbbSWilly Tarreau }
105bd8c8fbbSWilly Tarreau 
106bd8c8fbbSWilly Tarreau 
107bd8c8fbbSWilly Tarreau /*
108bd8c8fbbSWilly Tarreau  * int chdir(const char *path);
109bd8c8fbbSWilly Tarreau  */
110bd8c8fbbSWilly Tarreau 
111bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_chdir(const char * path)112bd8c8fbbSWilly Tarreau int sys_chdir(const char *path)
113bd8c8fbbSWilly Tarreau {
114bd8c8fbbSWilly Tarreau 	return my_syscall1(__NR_chdir, path);
115bd8c8fbbSWilly Tarreau }
116bd8c8fbbSWilly Tarreau 
117bd8c8fbbSWilly Tarreau static __attribute__((unused))
chdir(const char * path)118bd8c8fbbSWilly Tarreau int chdir(const char *path)
119bd8c8fbbSWilly Tarreau {
120d27447bcSZhangjin Wu 	return __sysret(sys_chdir(path));
121bd8c8fbbSWilly Tarreau }
122bd8c8fbbSWilly Tarreau 
123bd8c8fbbSWilly Tarreau 
124bd8c8fbbSWilly Tarreau /*
125bd8c8fbbSWilly Tarreau  * int chmod(const char *path, mode_t mode);
126bd8c8fbbSWilly Tarreau  */
127bd8c8fbbSWilly Tarreau 
128bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_chmod(const char * path,mode_t mode)129bd8c8fbbSWilly Tarreau int sys_chmod(const char *path, mode_t mode)
130bd8c8fbbSWilly Tarreau {
131bd8c8fbbSWilly Tarreau #ifdef __NR_fchmodat
132bd8c8fbbSWilly Tarreau 	return my_syscall4(__NR_fchmodat, AT_FDCWD, path, mode, 0);
133bd8c8fbbSWilly Tarreau #elif defined(__NR_chmod)
134bd8c8fbbSWilly Tarreau 	return my_syscall2(__NR_chmod, path, mode);
135bd8c8fbbSWilly Tarreau #else
136ca50df30SZhangjin Wu 	return -ENOSYS;
137bd8c8fbbSWilly Tarreau #endif
138bd8c8fbbSWilly Tarreau }
139bd8c8fbbSWilly Tarreau 
140bd8c8fbbSWilly Tarreau static __attribute__((unused))
chmod(const char * path,mode_t mode)141bd8c8fbbSWilly Tarreau int chmod(const char *path, mode_t mode)
142bd8c8fbbSWilly Tarreau {
143d27447bcSZhangjin Wu 	return __sysret(sys_chmod(path, mode));
144bd8c8fbbSWilly Tarreau }
145bd8c8fbbSWilly Tarreau 
146bd8c8fbbSWilly Tarreau 
147bd8c8fbbSWilly Tarreau /*
148bd8c8fbbSWilly Tarreau  * int chown(const char *path, uid_t owner, gid_t group);
149bd8c8fbbSWilly Tarreau  */
150bd8c8fbbSWilly Tarreau 
151bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_chown(const char * path,uid_t owner,gid_t group)152bd8c8fbbSWilly Tarreau int sys_chown(const char *path, uid_t owner, gid_t group)
153bd8c8fbbSWilly Tarreau {
154bd8c8fbbSWilly Tarreau #ifdef __NR_fchownat
155bd8c8fbbSWilly Tarreau 	return my_syscall5(__NR_fchownat, AT_FDCWD, path, owner, group, 0);
156bd8c8fbbSWilly Tarreau #elif defined(__NR_chown)
157bd8c8fbbSWilly Tarreau 	return my_syscall3(__NR_chown, path, owner, group);
158bd8c8fbbSWilly Tarreau #else
159ca50df30SZhangjin Wu 	return -ENOSYS;
160bd8c8fbbSWilly Tarreau #endif
161bd8c8fbbSWilly Tarreau }
162bd8c8fbbSWilly Tarreau 
163bd8c8fbbSWilly Tarreau static __attribute__((unused))
chown(const char * path,uid_t owner,gid_t group)164bd8c8fbbSWilly Tarreau int chown(const char *path, uid_t owner, gid_t group)
165bd8c8fbbSWilly Tarreau {
166d27447bcSZhangjin Wu 	return __sysret(sys_chown(path, owner, group));
167bd8c8fbbSWilly Tarreau }
168bd8c8fbbSWilly Tarreau 
169bd8c8fbbSWilly Tarreau 
170bd8c8fbbSWilly Tarreau /*
171bd8c8fbbSWilly Tarreau  * int chroot(const char *path);
172bd8c8fbbSWilly Tarreau  */
173bd8c8fbbSWilly Tarreau 
174bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_chroot(const char * path)175bd8c8fbbSWilly Tarreau int sys_chroot(const char *path)
176bd8c8fbbSWilly Tarreau {
177bd8c8fbbSWilly Tarreau 	return my_syscall1(__NR_chroot, path);
178bd8c8fbbSWilly Tarreau }
179bd8c8fbbSWilly Tarreau 
180bd8c8fbbSWilly Tarreau static __attribute__((unused))
chroot(const char * path)181bd8c8fbbSWilly Tarreau int chroot(const char *path)
182bd8c8fbbSWilly Tarreau {
183d27447bcSZhangjin Wu 	return __sysret(sys_chroot(path));
184bd8c8fbbSWilly Tarreau }
185bd8c8fbbSWilly Tarreau 
186bd8c8fbbSWilly Tarreau 
187bd8c8fbbSWilly Tarreau /*
188bd8c8fbbSWilly Tarreau  * int close(int fd);
189bd8c8fbbSWilly Tarreau  */
190bd8c8fbbSWilly Tarreau 
191bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_close(int fd)192bd8c8fbbSWilly Tarreau int sys_close(int fd)
193bd8c8fbbSWilly Tarreau {
194bd8c8fbbSWilly Tarreau 	return my_syscall1(__NR_close, fd);
195bd8c8fbbSWilly Tarreau }
196bd8c8fbbSWilly Tarreau 
197bd8c8fbbSWilly Tarreau static __attribute__((unused))
close(int fd)198bd8c8fbbSWilly Tarreau int close(int fd)
199bd8c8fbbSWilly Tarreau {
200d27447bcSZhangjin Wu 	return __sysret(sys_close(fd));
201bd8c8fbbSWilly Tarreau }
202bd8c8fbbSWilly Tarreau 
203bd8c8fbbSWilly Tarreau 
204bd8c8fbbSWilly Tarreau /*
205bd8c8fbbSWilly Tarreau  * int dup(int fd);
206bd8c8fbbSWilly Tarreau  */
207bd8c8fbbSWilly Tarreau 
208bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_dup(int fd)209bd8c8fbbSWilly Tarreau int sys_dup(int fd)
210bd8c8fbbSWilly Tarreau {
211bd8c8fbbSWilly Tarreau 	return my_syscall1(__NR_dup, fd);
212bd8c8fbbSWilly Tarreau }
213bd8c8fbbSWilly Tarreau 
214bd8c8fbbSWilly Tarreau static __attribute__((unused))
dup(int fd)215bd8c8fbbSWilly Tarreau int dup(int fd)
216bd8c8fbbSWilly Tarreau {
217d27447bcSZhangjin Wu 	return __sysret(sys_dup(fd));
218bd8c8fbbSWilly Tarreau }
219bd8c8fbbSWilly Tarreau 
220bd8c8fbbSWilly Tarreau 
221bd8c8fbbSWilly Tarreau /*
222bd8c8fbbSWilly Tarreau  * int dup2(int old, int new);
223bd8c8fbbSWilly Tarreau  */
224bd8c8fbbSWilly Tarreau 
225bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_dup2(int old,int new)226bd8c8fbbSWilly Tarreau int sys_dup2(int old, int new)
227bd8c8fbbSWilly Tarreau {
228bd8c8fbbSWilly Tarreau #ifdef __NR_dup3
229bd8c8fbbSWilly Tarreau 	return my_syscall3(__NR_dup3, old, new, 0);
230bd8c8fbbSWilly Tarreau #elif defined(__NR_dup2)
231bd8c8fbbSWilly Tarreau 	return my_syscall2(__NR_dup2, old, new);
232bd8c8fbbSWilly Tarreau #else
233ca50df30SZhangjin Wu 	return -ENOSYS;
234bd8c8fbbSWilly Tarreau #endif
235bd8c8fbbSWilly Tarreau }
236bd8c8fbbSWilly Tarreau 
237bd8c8fbbSWilly Tarreau static __attribute__((unused))
dup2(int old,int new)238bd8c8fbbSWilly Tarreau int dup2(int old, int new)
239bd8c8fbbSWilly Tarreau {
240d27447bcSZhangjin Wu 	return __sysret(sys_dup2(old, new));
241bd8c8fbbSWilly Tarreau }
242bd8c8fbbSWilly Tarreau 
243bd8c8fbbSWilly Tarreau 
244bd8c8fbbSWilly Tarreau /*
245bd8c8fbbSWilly Tarreau  * int dup3(int old, int new, int flags);
246bd8c8fbbSWilly Tarreau  */
247bd8c8fbbSWilly Tarreau 
248bd8c8fbbSWilly Tarreau #ifdef __NR_dup3
249bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_dup3(int old,int new,int flags)250bd8c8fbbSWilly Tarreau int sys_dup3(int old, int new, int flags)
251bd8c8fbbSWilly Tarreau {
252bd8c8fbbSWilly Tarreau 	return my_syscall3(__NR_dup3, old, new, flags);
253bd8c8fbbSWilly Tarreau }
254bd8c8fbbSWilly Tarreau 
255bd8c8fbbSWilly Tarreau static __attribute__((unused))
dup3(int old,int new,int flags)256bd8c8fbbSWilly Tarreau int dup3(int old, int new, int flags)
257bd8c8fbbSWilly Tarreau {
258d27447bcSZhangjin Wu 	return __sysret(sys_dup3(old, new, flags));
259bd8c8fbbSWilly Tarreau }
260bd8c8fbbSWilly Tarreau #endif
261bd8c8fbbSWilly Tarreau 
262bd8c8fbbSWilly Tarreau 
263bd8c8fbbSWilly Tarreau /*
264bd8c8fbbSWilly Tarreau  * int execve(const char *filename, char *const argv[], char *const envp[]);
265bd8c8fbbSWilly Tarreau  */
266bd8c8fbbSWilly Tarreau 
267bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_execve(const char * filename,char * const argv[],char * const envp[])268bd8c8fbbSWilly Tarreau int sys_execve(const char *filename, char *const argv[], char *const envp[])
269bd8c8fbbSWilly Tarreau {
270bd8c8fbbSWilly Tarreau 	return my_syscall3(__NR_execve, filename, argv, envp);
271bd8c8fbbSWilly Tarreau }
272bd8c8fbbSWilly Tarreau 
273bd8c8fbbSWilly Tarreau static __attribute__((unused))
execve(const char * filename,char * const argv[],char * const envp[])274bd8c8fbbSWilly Tarreau int execve(const char *filename, char *const argv[], char *const envp[])
275bd8c8fbbSWilly Tarreau {
276d27447bcSZhangjin Wu 	return __sysret(sys_execve(filename, argv, envp));
277bd8c8fbbSWilly Tarreau }
278bd8c8fbbSWilly Tarreau 
279bd8c8fbbSWilly Tarreau 
280bd8c8fbbSWilly Tarreau /*
281bd8c8fbbSWilly Tarreau  * void exit(int status);
282bd8c8fbbSWilly Tarreau  */
283bd8c8fbbSWilly Tarreau 
284bd8c8fbbSWilly Tarreau static __attribute__((noreturn,unused))
sys_exit(int status)285bd8c8fbbSWilly Tarreau void sys_exit(int status)
286bd8c8fbbSWilly Tarreau {
287bd8c8fbbSWilly Tarreau 	my_syscall1(__NR_exit, status & 255);
288fddc8f81SThomas Weißschuh 	while(1); /* shut the "noreturn" warnings. */
289bd8c8fbbSWilly Tarreau }
290bd8c8fbbSWilly Tarreau 
291bd8c8fbbSWilly Tarreau static __attribute__((noreturn,unused))
exit(int status)292bd8c8fbbSWilly Tarreau void exit(int status)
293bd8c8fbbSWilly Tarreau {
294bd8c8fbbSWilly Tarreau 	sys_exit(status);
295bd8c8fbbSWilly Tarreau }
296bd8c8fbbSWilly Tarreau 
297bd8c8fbbSWilly Tarreau 
298bd8c8fbbSWilly Tarreau /*
299bd8c8fbbSWilly Tarreau  * pid_t fork(void);
300bd8c8fbbSWilly Tarreau  */
301bd8c8fbbSWilly Tarreau 
302404fa87cSThomas Weißschuh #ifndef sys_fork
303bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_fork(void)304bd8c8fbbSWilly Tarreau pid_t sys_fork(void)
305bd8c8fbbSWilly Tarreau {
306bd8c8fbbSWilly Tarreau #ifdef __NR_clone
307bd8c8fbbSWilly Tarreau 	/* note: some archs only have clone() and not fork(). Different archs
308bd8c8fbbSWilly Tarreau 	 * have a different API, but most archs have the flags on first arg and
309bd8c8fbbSWilly Tarreau 	 * will not use the rest with no other flag.
310bd8c8fbbSWilly Tarreau 	 */
311bd8c8fbbSWilly Tarreau 	return my_syscall5(__NR_clone, SIGCHLD, 0, 0, 0, 0);
312bd8c8fbbSWilly Tarreau #elif defined(__NR_fork)
313bd8c8fbbSWilly Tarreau 	return my_syscall0(__NR_fork);
314bd8c8fbbSWilly Tarreau #else
315ca50df30SZhangjin Wu 	return -ENOSYS;
316bd8c8fbbSWilly Tarreau #endif
317bd8c8fbbSWilly Tarreau }
318404fa87cSThomas Weißschuh #endif
319bd8c8fbbSWilly Tarreau 
320bd8c8fbbSWilly Tarreau static __attribute__((unused))
fork(void)321bd8c8fbbSWilly Tarreau pid_t fork(void)
322bd8c8fbbSWilly Tarreau {
323d27447bcSZhangjin Wu 	return __sysret(sys_fork());
324bd8c8fbbSWilly Tarreau }
325bd8c8fbbSWilly Tarreau 
326bd8c8fbbSWilly Tarreau 
327bd8c8fbbSWilly Tarreau /*
328bd8c8fbbSWilly Tarreau  * int fsync(int fd);
329bd8c8fbbSWilly Tarreau  */
330bd8c8fbbSWilly Tarreau 
331bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_fsync(int fd)332bd8c8fbbSWilly Tarreau int sys_fsync(int fd)
333bd8c8fbbSWilly Tarreau {
334bd8c8fbbSWilly Tarreau 	return my_syscall1(__NR_fsync, fd);
335bd8c8fbbSWilly Tarreau }
336bd8c8fbbSWilly Tarreau 
337bd8c8fbbSWilly Tarreau static __attribute__((unused))
fsync(int fd)338bd8c8fbbSWilly Tarreau int fsync(int fd)
339bd8c8fbbSWilly Tarreau {
340d27447bcSZhangjin Wu 	return __sysret(sys_fsync(fd));
341bd8c8fbbSWilly Tarreau }
342bd8c8fbbSWilly Tarreau 
343bd8c8fbbSWilly Tarreau 
344bd8c8fbbSWilly Tarreau /*
345bd8c8fbbSWilly Tarreau  * int getdents64(int fd, struct linux_dirent64 *dirp, int count);
346bd8c8fbbSWilly Tarreau  */
347bd8c8fbbSWilly Tarreau 
348bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_getdents64(int fd,struct linux_dirent64 * dirp,int count)349bd8c8fbbSWilly Tarreau int sys_getdents64(int fd, struct linux_dirent64 *dirp, int count)
350bd8c8fbbSWilly Tarreau {
351bd8c8fbbSWilly Tarreau 	return my_syscall3(__NR_getdents64, fd, dirp, count);
352bd8c8fbbSWilly Tarreau }
353bd8c8fbbSWilly Tarreau 
354bd8c8fbbSWilly Tarreau static __attribute__((unused))
getdents64(int fd,struct linux_dirent64 * dirp,int count)355bd8c8fbbSWilly Tarreau int getdents64(int fd, struct linux_dirent64 *dirp, int count)
356bd8c8fbbSWilly Tarreau {
357d27447bcSZhangjin Wu 	return __sysret(sys_getdents64(fd, dirp, count));
358bd8c8fbbSWilly Tarreau }
359bd8c8fbbSWilly Tarreau 
360bd8c8fbbSWilly Tarreau 
361bd8c8fbbSWilly Tarreau /*
362919d0532SWilly Tarreau  * uid_t geteuid(void);
363919d0532SWilly Tarreau  */
364919d0532SWilly Tarreau 
365919d0532SWilly Tarreau static __attribute__((unused))
sys_geteuid(void)366919d0532SWilly Tarreau uid_t sys_geteuid(void)
367919d0532SWilly Tarreau {
368919d0532SWilly Tarreau #ifdef __NR_geteuid32
369919d0532SWilly Tarreau 	return my_syscall0(__NR_geteuid32);
370919d0532SWilly Tarreau #else
371919d0532SWilly Tarreau 	return my_syscall0(__NR_geteuid);
372919d0532SWilly Tarreau #endif
373919d0532SWilly Tarreau }
374919d0532SWilly Tarreau 
375919d0532SWilly Tarreau static __attribute__((unused))
geteuid(void)376919d0532SWilly Tarreau uid_t geteuid(void)
377919d0532SWilly Tarreau {
378919d0532SWilly Tarreau 	return sys_geteuid();
379919d0532SWilly Tarreau }
380919d0532SWilly Tarreau 
381919d0532SWilly Tarreau 
382919d0532SWilly Tarreau /*
383bd8c8fbbSWilly Tarreau  * pid_t getpgid(pid_t pid);
384bd8c8fbbSWilly Tarreau  */
385bd8c8fbbSWilly Tarreau 
386bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_getpgid(pid_t pid)387bd8c8fbbSWilly Tarreau pid_t sys_getpgid(pid_t pid)
388bd8c8fbbSWilly Tarreau {
389bd8c8fbbSWilly Tarreau 	return my_syscall1(__NR_getpgid, pid);
390bd8c8fbbSWilly Tarreau }
391bd8c8fbbSWilly Tarreau 
392bd8c8fbbSWilly Tarreau static __attribute__((unused))
getpgid(pid_t pid)393bd8c8fbbSWilly Tarreau pid_t getpgid(pid_t pid)
394bd8c8fbbSWilly Tarreau {
395d27447bcSZhangjin Wu 	return __sysret(sys_getpgid(pid));
396bd8c8fbbSWilly Tarreau }
397bd8c8fbbSWilly Tarreau 
398bd8c8fbbSWilly Tarreau 
399bd8c8fbbSWilly Tarreau /*
400bd8c8fbbSWilly Tarreau  * pid_t getpgrp(void);
401bd8c8fbbSWilly Tarreau  */
402bd8c8fbbSWilly Tarreau 
403bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_getpgrp(void)404bd8c8fbbSWilly Tarreau pid_t sys_getpgrp(void)
405bd8c8fbbSWilly Tarreau {
406bd8c8fbbSWilly Tarreau 	return sys_getpgid(0);
407bd8c8fbbSWilly Tarreau }
408bd8c8fbbSWilly Tarreau 
409bd8c8fbbSWilly Tarreau static __attribute__((unused))
getpgrp(void)410bd8c8fbbSWilly Tarreau pid_t getpgrp(void)
411bd8c8fbbSWilly Tarreau {
412830acd08SWilly Tarreau 	return sys_getpgrp();
413bd8c8fbbSWilly Tarreau }
414bd8c8fbbSWilly Tarreau 
415bd8c8fbbSWilly Tarreau 
416bd8c8fbbSWilly Tarreau /*
417bd8c8fbbSWilly Tarreau  * pid_t getpid(void);
418bd8c8fbbSWilly Tarreau  */
419bd8c8fbbSWilly Tarreau 
420bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_getpid(void)421bd8c8fbbSWilly Tarreau pid_t sys_getpid(void)
422bd8c8fbbSWilly Tarreau {
423bd8c8fbbSWilly Tarreau 	return my_syscall0(__NR_getpid);
424bd8c8fbbSWilly Tarreau }
425bd8c8fbbSWilly Tarreau 
426bd8c8fbbSWilly Tarreau static __attribute__((unused))
getpid(void)427bd8c8fbbSWilly Tarreau pid_t getpid(void)
428bd8c8fbbSWilly Tarreau {
429830acd08SWilly Tarreau 	return sys_getpid();
430bd8c8fbbSWilly Tarreau }
431bd8c8fbbSWilly Tarreau 
432bd8c8fbbSWilly Tarreau 
433bd8c8fbbSWilly Tarreau /*
43454abe359SWilly Tarreau  * pid_t getppid(void);
43554abe359SWilly Tarreau  */
43654abe359SWilly Tarreau 
43754abe359SWilly Tarreau static __attribute__((unused))
sys_getppid(void)43854abe359SWilly Tarreau pid_t sys_getppid(void)
43954abe359SWilly Tarreau {
44054abe359SWilly Tarreau 	return my_syscall0(__NR_getppid);
44154abe359SWilly Tarreau }
44254abe359SWilly Tarreau 
44354abe359SWilly Tarreau static __attribute__((unused))
getppid(void)44454abe359SWilly Tarreau pid_t getppid(void)
44554abe359SWilly Tarreau {
44654abe359SWilly Tarreau 	return sys_getppid();
44754abe359SWilly Tarreau }
44854abe359SWilly Tarreau 
44954abe359SWilly Tarreau 
45054abe359SWilly Tarreau /*
451bd8c8fbbSWilly Tarreau  * pid_t gettid(void);
452bd8c8fbbSWilly Tarreau  */
453bd8c8fbbSWilly Tarreau 
454bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_gettid(void)455bd8c8fbbSWilly Tarreau pid_t sys_gettid(void)
456bd8c8fbbSWilly Tarreau {
457bd8c8fbbSWilly Tarreau 	return my_syscall0(__NR_gettid);
458bd8c8fbbSWilly Tarreau }
459bd8c8fbbSWilly Tarreau 
460bd8c8fbbSWilly Tarreau static __attribute__((unused))
gettid(void)461bd8c8fbbSWilly Tarreau pid_t gettid(void)
462bd8c8fbbSWilly Tarreau {
463830acd08SWilly Tarreau 	return sys_gettid();
464bd8c8fbbSWilly Tarreau }
465bd8c8fbbSWilly Tarreau 
4667efd762eSAmmar Faizi static unsigned long getauxval(unsigned long key);
4677efd762eSAmmar Faizi 
4687efd762eSAmmar Faizi /*
46964077502SThomas Weißschuh  * int getpagesize(void);
4707efd762eSAmmar Faizi  */
4717efd762eSAmmar Faizi 
4727efd762eSAmmar Faizi static __attribute__((unused))
getpagesize(void)47364077502SThomas Weißschuh int getpagesize(void)
4747efd762eSAmmar Faizi {
47504694658SThomas Weißschuh 	return __sysret((int)getauxval(AT_PAGESZ) ?: -ENOENT);
4767efd762eSAmmar Faizi }
4777efd762eSAmmar Faizi 
478bd8c8fbbSWilly Tarreau 
479bd8c8fbbSWilly Tarreau /*
480bd8c8fbbSWilly Tarreau  * int gettimeofday(struct timeval *tv, struct timezone *tz);
481bd8c8fbbSWilly Tarreau  */
482bd8c8fbbSWilly Tarreau 
483bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_gettimeofday(struct timeval * tv,struct timezone * tz)484bd8c8fbbSWilly Tarreau int sys_gettimeofday(struct timeval *tv, struct timezone *tz)
485bd8c8fbbSWilly Tarreau {
4862f98aca8SZhangjin Wu #ifdef __NR_gettimeofday
487bd8c8fbbSWilly Tarreau 	return my_syscall2(__NR_gettimeofday, tv, tz);
4882f98aca8SZhangjin Wu #else
4892f98aca8SZhangjin Wu 	return -ENOSYS;
4902f98aca8SZhangjin Wu #endif
491bd8c8fbbSWilly Tarreau }
492bd8c8fbbSWilly Tarreau 
493bd8c8fbbSWilly Tarreau static __attribute__((unused))
gettimeofday(struct timeval * tv,struct timezone * tz)494bd8c8fbbSWilly Tarreau int gettimeofday(struct timeval *tv, struct timezone *tz)
495bd8c8fbbSWilly Tarreau {
496d27447bcSZhangjin Wu 	return __sysret(sys_gettimeofday(tv, tz));
497bd8c8fbbSWilly Tarreau }
498bd8c8fbbSWilly Tarreau 
499bd8c8fbbSWilly Tarreau 
500bd8c8fbbSWilly Tarreau /*
501919d0532SWilly Tarreau  * uid_t getuid(void);
502919d0532SWilly Tarreau  */
503919d0532SWilly Tarreau 
504919d0532SWilly Tarreau static __attribute__((unused))
sys_getuid(void)505919d0532SWilly Tarreau uid_t sys_getuid(void)
506919d0532SWilly Tarreau {
507919d0532SWilly Tarreau #ifdef __NR_getuid32
508919d0532SWilly Tarreau 	return my_syscall0(__NR_getuid32);
509919d0532SWilly Tarreau #else
510919d0532SWilly Tarreau 	return my_syscall0(__NR_getuid);
511919d0532SWilly Tarreau #endif
512919d0532SWilly Tarreau }
513919d0532SWilly Tarreau 
514919d0532SWilly Tarreau static __attribute__((unused))
getuid(void)515919d0532SWilly Tarreau uid_t getuid(void)
516919d0532SWilly Tarreau {
517919d0532SWilly Tarreau 	return sys_getuid();
518919d0532SWilly Tarreau }
519919d0532SWilly Tarreau 
520919d0532SWilly Tarreau 
521919d0532SWilly Tarreau /*
522bd8c8fbbSWilly Tarreau  * int ioctl(int fd, unsigned long req, void *value);
523bd8c8fbbSWilly Tarreau  */
524bd8c8fbbSWilly Tarreau 
525bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_ioctl(int fd,unsigned long req,void * value)526bd8c8fbbSWilly Tarreau int sys_ioctl(int fd, unsigned long req, void *value)
527bd8c8fbbSWilly Tarreau {
528bd8c8fbbSWilly Tarreau 	return my_syscall3(__NR_ioctl, fd, req, value);
529bd8c8fbbSWilly Tarreau }
530bd8c8fbbSWilly Tarreau 
531bd8c8fbbSWilly Tarreau static __attribute__((unused))
ioctl(int fd,unsigned long req,void * value)532bd8c8fbbSWilly Tarreau int ioctl(int fd, unsigned long req, void *value)
533bd8c8fbbSWilly Tarreau {
534d27447bcSZhangjin Wu 	return __sysret(sys_ioctl(fd, req, value));
535bd8c8fbbSWilly Tarreau }
536bd8c8fbbSWilly Tarreau 
537bd8c8fbbSWilly Tarreau /*
538bd8c8fbbSWilly Tarreau  * int kill(pid_t pid, int signal);
539bd8c8fbbSWilly Tarreau  */
540bd8c8fbbSWilly Tarreau 
541bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_kill(pid_t pid,int signal)542bd8c8fbbSWilly Tarreau int sys_kill(pid_t pid, int signal)
543bd8c8fbbSWilly Tarreau {
544bd8c8fbbSWilly Tarreau 	return my_syscall2(__NR_kill, pid, signal);
545bd8c8fbbSWilly Tarreau }
546bd8c8fbbSWilly Tarreau 
547bd8c8fbbSWilly Tarreau static __attribute__((unused))
kill(pid_t pid,int signal)548bd8c8fbbSWilly Tarreau int kill(pid_t pid, int signal)
549bd8c8fbbSWilly Tarreau {
550d27447bcSZhangjin Wu 	return __sysret(sys_kill(pid, signal));
551bd8c8fbbSWilly Tarreau }
552bd8c8fbbSWilly Tarreau 
553bd8c8fbbSWilly Tarreau 
554bd8c8fbbSWilly Tarreau /*
555bd8c8fbbSWilly Tarreau  * int link(const char *old, const char *new);
556bd8c8fbbSWilly Tarreau  */
557bd8c8fbbSWilly Tarreau 
558bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_link(const char * old,const char * new)559bd8c8fbbSWilly Tarreau int sys_link(const char *old, const char *new)
560bd8c8fbbSWilly Tarreau {
561bd8c8fbbSWilly Tarreau #ifdef __NR_linkat
562bd8c8fbbSWilly Tarreau 	return my_syscall5(__NR_linkat, AT_FDCWD, old, AT_FDCWD, new, 0);
563bd8c8fbbSWilly Tarreau #elif defined(__NR_link)
564bd8c8fbbSWilly Tarreau 	return my_syscall2(__NR_link, old, new);
565bd8c8fbbSWilly Tarreau #else
566ca50df30SZhangjin Wu 	return -ENOSYS;
567bd8c8fbbSWilly Tarreau #endif
568bd8c8fbbSWilly Tarreau }
569bd8c8fbbSWilly Tarreau 
570bd8c8fbbSWilly Tarreau static __attribute__((unused))
link(const char * old,const char * new)571bd8c8fbbSWilly Tarreau int link(const char *old, const char *new)
572bd8c8fbbSWilly Tarreau {
573d27447bcSZhangjin Wu 	return __sysret(sys_link(old, new));
574bd8c8fbbSWilly Tarreau }
575bd8c8fbbSWilly Tarreau 
576bd8c8fbbSWilly Tarreau 
577bd8c8fbbSWilly Tarreau /*
578bd8c8fbbSWilly Tarreau  * off_t lseek(int fd, off_t offset, int whence);
579bd8c8fbbSWilly Tarreau  */
580bd8c8fbbSWilly Tarreau 
581bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_lseek(int fd,off_t offset,int whence)582bd8c8fbbSWilly Tarreau off_t sys_lseek(int fd, off_t offset, int whence)
583bd8c8fbbSWilly Tarreau {
5842f98aca8SZhangjin Wu #ifdef __NR_lseek
585bd8c8fbbSWilly Tarreau 	return my_syscall3(__NR_lseek, fd, offset, whence);
5862f98aca8SZhangjin Wu #else
5872f98aca8SZhangjin Wu 	return -ENOSYS;
5882f98aca8SZhangjin Wu #endif
589bd8c8fbbSWilly Tarreau }
590bd8c8fbbSWilly Tarreau 
591bd8c8fbbSWilly Tarreau static __attribute__((unused))
lseek(int fd,off_t offset,int whence)592bd8c8fbbSWilly Tarreau off_t lseek(int fd, off_t offset, int whence)
593bd8c8fbbSWilly Tarreau {
594d27447bcSZhangjin Wu 	return __sysret(sys_lseek(fd, offset, whence));
595bd8c8fbbSWilly Tarreau }
596bd8c8fbbSWilly Tarreau 
597bd8c8fbbSWilly Tarreau 
598bd8c8fbbSWilly Tarreau /*
599bd8c8fbbSWilly Tarreau  * int mkdir(const char *path, mode_t mode);
600bd8c8fbbSWilly Tarreau  */
601bd8c8fbbSWilly Tarreau 
602bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_mkdir(const char * path,mode_t mode)603bd8c8fbbSWilly Tarreau int sys_mkdir(const char *path, mode_t mode)
604bd8c8fbbSWilly Tarreau {
605bd8c8fbbSWilly Tarreau #ifdef __NR_mkdirat
606bd8c8fbbSWilly Tarreau 	return my_syscall3(__NR_mkdirat, AT_FDCWD, path, mode);
607bd8c8fbbSWilly Tarreau #elif defined(__NR_mkdir)
608bd8c8fbbSWilly Tarreau 	return my_syscall2(__NR_mkdir, path, mode);
609bd8c8fbbSWilly Tarreau #else
610ca50df30SZhangjin Wu 	return -ENOSYS;
611bd8c8fbbSWilly Tarreau #endif
612bd8c8fbbSWilly Tarreau }
613bd8c8fbbSWilly Tarreau 
614bd8c8fbbSWilly Tarreau static __attribute__((unused))
mkdir(const char * path,mode_t mode)615bd8c8fbbSWilly Tarreau int mkdir(const char *path, mode_t mode)
616bd8c8fbbSWilly Tarreau {
617d27447bcSZhangjin Wu 	return __sysret(sys_mkdir(path, mode));
618bd8c8fbbSWilly Tarreau }
619bd8c8fbbSWilly Tarreau 
620f4191f3dSZhangjin Wu /*
621f4191f3dSZhangjin Wu  * int rmdir(const char *path);
622f4191f3dSZhangjin Wu  */
623f4191f3dSZhangjin Wu 
624f4191f3dSZhangjin Wu static __attribute__((unused))
sys_rmdir(const char * path)625f4191f3dSZhangjin Wu int sys_rmdir(const char *path)
626f4191f3dSZhangjin Wu {
627f4191f3dSZhangjin Wu #ifdef __NR_rmdir
628f4191f3dSZhangjin Wu 	return my_syscall1(__NR_rmdir, path);
629f4191f3dSZhangjin Wu #elif defined(__NR_unlinkat)
630f4191f3dSZhangjin Wu 	return my_syscall3(__NR_unlinkat, AT_FDCWD, path, AT_REMOVEDIR);
631f4191f3dSZhangjin Wu #else
632f4191f3dSZhangjin Wu 	return -ENOSYS;
633f4191f3dSZhangjin Wu #endif
634f4191f3dSZhangjin Wu }
635f4191f3dSZhangjin Wu 
636f4191f3dSZhangjin Wu static __attribute__((unused))
rmdir(const char * path)637f4191f3dSZhangjin Wu int rmdir(const char *path)
638f4191f3dSZhangjin Wu {
639f4191f3dSZhangjin Wu 	return __sysret(sys_rmdir(path));
640f4191f3dSZhangjin Wu }
641f4191f3dSZhangjin Wu 
642bd8c8fbbSWilly Tarreau 
643bd8c8fbbSWilly Tarreau /*
644bd8c8fbbSWilly Tarreau  * int mknod(const char *path, mode_t mode, dev_t dev);
645bd8c8fbbSWilly Tarreau  */
646bd8c8fbbSWilly Tarreau 
647bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_mknod(const char * path,mode_t mode,dev_t dev)648bd8c8fbbSWilly Tarreau long sys_mknod(const char *path, mode_t mode, dev_t dev)
649bd8c8fbbSWilly Tarreau {
650bd8c8fbbSWilly Tarreau #ifdef __NR_mknodat
651bd8c8fbbSWilly Tarreau 	return my_syscall4(__NR_mknodat, AT_FDCWD, path, mode, dev);
652bd8c8fbbSWilly Tarreau #elif defined(__NR_mknod)
653bd8c8fbbSWilly Tarreau 	return my_syscall3(__NR_mknod, path, mode, dev);
654bd8c8fbbSWilly Tarreau #else
655ca50df30SZhangjin Wu 	return -ENOSYS;
656bd8c8fbbSWilly Tarreau #endif
657bd8c8fbbSWilly Tarreau }
658bd8c8fbbSWilly Tarreau 
659bd8c8fbbSWilly Tarreau static __attribute__((unused))
mknod(const char * path,mode_t mode,dev_t dev)660bd8c8fbbSWilly Tarreau int mknod(const char *path, mode_t mode, dev_t dev)
661bd8c8fbbSWilly Tarreau {
662d27447bcSZhangjin Wu 	return __sysret(sys_mknod(path, mode, dev));
663bd8c8fbbSWilly Tarreau }
664bd8c8fbbSWilly Tarreau 
66518a5a09dSSven Schnelle #ifndef sys_mmap
666544fa1a2SAmmar Faizi static __attribute__((unused))
sys_mmap(void * addr,size_t length,int prot,int flags,int fd,off_t offset)667544fa1a2SAmmar Faizi void *sys_mmap(void *addr, size_t length, int prot, int flags, int fd,
668544fa1a2SAmmar Faizi 	       off_t offset)
669544fa1a2SAmmar Faizi {
670544fa1a2SAmmar Faizi 	int n;
671544fa1a2SAmmar Faizi 
672364702f7SWilly Tarreau #if defined(__NR_mmap2)
673544fa1a2SAmmar Faizi 	n = __NR_mmap2;
674544fa1a2SAmmar Faizi 	offset >>= 12;
675544fa1a2SAmmar Faizi #else
676544fa1a2SAmmar Faizi 	n = __NR_mmap;
677544fa1a2SAmmar Faizi #endif
678544fa1a2SAmmar Faizi 
679544fa1a2SAmmar Faizi 	return (void *)my_syscall6(n, addr, length, prot, flags, fd, offset);
680544fa1a2SAmmar Faizi }
68118a5a09dSSven Schnelle #endif
682544fa1a2SAmmar Faizi 
683924e9539SZhangjin Wu /* Note that on Linux, MAP_FAILED is -1 so we can use the generic __sysret()
684924e9539SZhangjin Wu  * which returns -1 upon error and still satisfy user land that checks for
685924e9539SZhangjin Wu  * MAP_FAILED.
686924e9539SZhangjin Wu  */
687924e9539SZhangjin Wu 
688544fa1a2SAmmar Faizi static __attribute__((unused))
mmap(void * addr,size_t length,int prot,int flags,int fd,off_t offset)689544fa1a2SAmmar Faizi void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset)
690544fa1a2SAmmar Faizi {
691fb01ff63SWilly Tarreau 	void *ret = sys_mmap(addr, length, prot, flags, fd, offset);
692fb01ff63SWilly Tarreau 
693fb01ff63SWilly Tarreau 	if ((unsigned long)ret >= -4095UL) {
694fb01ff63SWilly Tarreau 		SET_ERRNO(-(long)ret);
695fb01ff63SWilly Tarreau 		ret = MAP_FAILED;
696fb01ff63SWilly Tarreau 	}
697fb01ff63SWilly Tarreau 	return ret;
698544fa1a2SAmmar Faizi }
699544fa1a2SAmmar Faizi 
700544fa1a2SAmmar Faizi static __attribute__((unused))
sys_munmap(void * addr,size_t length)701544fa1a2SAmmar Faizi int sys_munmap(void *addr, size_t length)
702544fa1a2SAmmar Faizi {
703544fa1a2SAmmar Faizi 	return my_syscall2(__NR_munmap, addr, length);
704544fa1a2SAmmar Faizi }
705544fa1a2SAmmar Faizi 
706544fa1a2SAmmar Faizi static __attribute__((unused))
munmap(void * addr,size_t length)707544fa1a2SAmmar Faizi int munmap(void *addr, size_t length)
708544fa1a2SAmmar Faizi {
709d27447bcSZhangjin Wu 	return __sysret(sys_munmap(addr, length));
710544fa1a2SAmmar Faizi }
711bd8c8fbbSWilly Tarreau 
712bd8c8fbbSWilly Tarreau /*
713bd8c8fbbSWilly Tarreau  * int mount(const char *source, const char *target,
714bd8c8fbbSWilly Tarreau  *           const char *fstype, unsigned long flags,
715bd8c8fbbSWilly Tarreau  *           const void *data);
716bd8c8fbbSWilly Tarreau  */
717bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_mount(const char * src,const char * tgt,const char * fst,unsigned long flags,const void * data)718bd8c8fbbSWilly Tarreau int sys_mount(const char *src, const char *tgt, const char *fst,
719bd8c8fbbSWilly Tarreau                      unsigned long flags, const void *data)
720bd8c8fbbSWilly Tarreau {
721bd8c8fbbSWilly Tarreau 	return my_syscall5(__NR_mount, src, tgt, fst, flags, data);
722bd8c8fbbSWilly Tarreau }
723bd8c8fbbSWilly Tarreau 
724bd8c8fbbSWilly Tarreau static __attribute__((unused))
mount(const char * src,const char * tgt,const char * fst,unsigned long flags,const void * data)725bd8c8fbbSWilly Tarreau int mount(const char *src, const char *tgt,
726bd8c8fbbSWilly Tarreau           const char *fst, unsigned long flags,
727bd8c8fbbSWilly Tarreau           const void *data)
728bd8c8fbbSWilly Tarreau {
729d27447bcSZhangjin Wu 	return __sysret(sys_mount(src, tgt, fst, flags, data));
730bd8c8fbbSWilly Tarreau }
731bd8c8fbbSWilly Tarreau 
732bd8c8fbbSWilly Tarreau 
733bd8c8fbbSWilly Tarreau /*
734a7604ba1SWilly Tarreau  * int open(const char *path, int flags[, mode_t mode]);
735bd8c8fbbSWilly Tarreau  */
736bd8c8fbbSWilly Tarreau 
737bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_open(const char * path,int flags,mode_t mode)738bd8c8fbbSWilly Tarreau int sys_open(const char *path, int flags, mode_t mode)
739bd8c8fbbSWilly Tarreau {
740bd8c8fbbSWilly Tarreau #ifdef __NR_openat
741bd8c8fbbSWilly Tarreau 	return my_syscall4(__NR_openat, AT_FDCWD, path, flags, mode);
742bd8c8fbbSWilly Tarreau #elif defined(__NR_open)
743bd8c8fbbSWilly Tarreau 	return my_syscall3(__NR_open, path, flags, mode);
744bd8c8fbbSWilly Tarreau #else
745ca50df30SZhangjin Wu 	return -ENOSYS;
746bd8c8fbbSWilly Tarreau #endif
747bd8c8fbbSWilly Tarreau }
748bd8c8fbbSWilly Tarreau 
749bd8c8fbbSWilly Tarreau static __attribute__((unused))
open(const char * path,int flags,...)750a7604ba1SWilly Tarreau int open(const char *path, int flags, ...)
751bd8c8fbbSWilly Tarreau {
752a7604ba1SWilly Tarreau 	mode_t mode = 0;
753a7604ba1SWilly Tarreau 
754a7604ba1SWilly Tarreau 	if (flags & O_CREAT) {
755a7604ba1SWilly Tarreau 		va_list args;
756a7604ba1SWilly Tarreau 
757a7604ba1SWilly Tarreau 		va_start(args, flags);
758f62ec079SZhangjin Wu 		mode = va_arg(args, int);
759a7604ba1SWilly Tarreau 		va_end(args);
760a7604ba1SWilly Tarreau 	}
761a7604ba1SWilly Tarreau 
762d27447bcSZhangjin Wu 	return __sysret(sys_open(path, flags, mode));
763bd8c8fbbSWilly Tarreau }
764bd8c8fbbSWilly Tarreau 
765bd8c8fbbSWilly Tarreau 
766bd8c8fbbSWilly Tarreau /*
7673ec38af6SYuan Tan  * int pipe2(int pipefd[2], int flags);
7683ec38af6SYuan Tan  * int pipe(int pipefd[2]);
7693ec38af6SYuan Tan  */
7703ec38af6SYuan Tan 
7713ec38af6SYuan Tan static __attribute__((unused))
sys_pipe2(int pipefd[2],int flags)7723ec38af6SYuan Tan int sys_pipe2(int pipefd[2], int flags)
7733ec38af6SYuan Tan {
7743ec38af6SYuan Tan 	return my_syscall2(__NR_pipe2, pipefd, flags);
7753ec38af6SYuan Tan }
7763ec38af6SYuan Tan 
7773ec38af6SYuan Tan static __attribute__((unused))
pipe2(int pipefd[2],int flags)7783ec38af6SYuan Tan int pipe2(int pipefd[2], int flags)
7793ec38af6SYuan Tan {
7803ec38af6SYuan Tan 	return __sysret(sys_pipe2(pipefd, flags));
7813ec38af6SYuan Tan }
7823ec38af6SYuan Tan 
7833ec38af6SYuan Tan static __attribute__((unused))
pipe(int pipefd[2])7843ec38af6SYuan Tan int pipe(int pipefd[2])
7853ec38af6SYuan Tan {
7863ec38af6SYuan Tan 	return pipe2(pipefd, 0);
7873ec38af6SYuan Tan }
7883ec38af6SYuan Tan 
7893ec38af6SYuan Tan 
7903ec38af6SYuan Tan /*
791208aa9d9SThomas Weißschuh  * int prctl(int option, unsigned long arg2, unsigned long arg3,
792208aa9d9SThomas Weißschuh  *                       unsigned long arg4, unsigned long arg5);
793208aa9d9SThomas Weißschuh  */
794208aa9d9SThomas Weißschuh 
795208aa9d9SThomas Weißschuh static __attribute__((unused))
sys_prctl(int option,unsigned long arg2,unsigned long arg3,unsigned long arg4,unsigned long arg5)796208aa9d9SThomas Weißschuh int sys_prctl(int option, unsigned long arg2, unsigned long arg3,
797208aa9d9SThomas Weißschuh 		          unsigned long arg4, unsigned long arg5)
798208aa9d9SThomas Weißschuh {
799208aa9d9SThomas Weißschuh 	return my_syscall5(__NR_prctl, option, arg2, arg3, arg4, arg5);
800208aa9d9SThomas Weißschuh }
801208aa9d9SThomas Weißschuh 
802208aa9d9SThomas Weißschuh static __attribute__((unused))
prctl(int option,unsigned long arg2,unsigned long arg3,unsigned long arg4,unsigned long arg5)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 {
806d27447bcSZhangjin Wu 	return __sysret(sys_prctl(option, arg2, arg3, arg4, arg5));
807208aa9d9SThomas Weißschuh }
808208aa9d9SThomas Weißschuh 
809208aa9d9SThomas Weißschuh 
810208aa9d9SThomas Weißschuh /*
811bd8c8fbbSWilly Tarreau  * int pivot_root(const char *new, const char *old);
812bd8c8fbbSWilly Tarreau  */
813bd8c8fbbSWilly Tarreau 
814bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_pivot_root(const char * new,const char * old)815bd8c8fbbSWilly Tarreau int sys_pivot_root(const char *new, const char *old)
816bd8c8fbbSWilly Tarreau {
817bd8c8fbbSWilly Tarreau 	return my_syscall2(__NR_pivot_root, new, old);
818bd8c8fbbSWilly Tarreau }
819bd8c8fbbSWilly Tarreau 
820bd8c8fbbSWilly Tarreau static __attribute__((unused))
pivot_root(const char * new,const char * old)821bd8c8fbbSWilly Tarreau int pivot_root(const char *new, const char *old)
822bd8c8fbbSWilly Tarreau {
823d27447bcSZhangjin Wu 	return __sysret(sys_pivot_root(new, old));
824bd8c8fbbSWilly Tarreau }
825bd8c8fbbSWilly Tarreau 
826bd8c8fbbSWilly Tarreau 
827bd8c8fbbSWilly Tarreau /*
828bd8c8fbbSWilly Tarreau  * int poll(struct pollfd *fds, int nfds, int timeout);
829bd8c8fbbSWilly Tarreau  */
830bd8c8fbbSWilly Tarreau 
831bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_poll(struct pollfd * fds,int nfds,int timeout)832bd8c8fbbSWilly Tarreau int sys_poll(struct pollfd *fds, int nfds, int timeout)
833bd8c8fbbSWilly Tarreau {
834bd8c8fbbSWilly Tarreau #if defined(__NR_ppoll)
835bd8c8fbbSWilly Tarreau 	struct timespec t;
836bd8c8fbbSWilly Tarreau 
837bd8c8fbbSWilly Tarreau 	if (timeout >= 0) {
838bd8c8fbbSWilly Tarreau 		t.tv_sec  = timeout / 1000;
839bd8c8fbbSWilly Tarreau 		t.tv_nsec = (timeout % 1000) * 1000000;
840bd8c8fbbSWilly Tarreau 	}
8410dd2fdbfSZhangjin Wu 	return my_syscall5(__NR_ppoll, fds, nfds, (timeout >= 0) ? &t : NULL, NULL, 0);
842bd8c8fbbSWilly Tarreau #elif defined(__NR_poll)
843bd8c8fbbSWilly Tarreau 	return my_syscall3(__NR_poll, fds, nfds, timeout);
844bd8c8fbbSWilly Tarreau #else
845ca50df30SZhangjin Wu 	return -ENOSYS;
846bd8c8fbbSWilly Tarreau #endif
847bd8c8fbbSWilly Tarreau }
848bd8c8fbbSWilly Tarreau 
849bd8c8fbbSWilly Tarreau static __attribute__((unused))
poll(struct pollfd * fds,int nfds,int timeout)850bd8c8fbbSWilly Tarreau int poll(struct pollfd *fds, int nfds, int timeout)
851bd8c8fbbSWilly Tarreau {
852d27447bcSZhangjin Wu 	return __sysret(sys_poll(fds, nfds, timeout));
853bd8c8fbbSWilly Tarreau }
854bd8c8fbbSWilly Tarreau 
855bd8c8fbbSWilly Tarreau 
856bd8c8fbbSWilly Tarreau /*
857bd8c8fbbSWilly Tarreau  * ssize_t read(int fd, void *buf, size_t count);
858bd8c8fbbSWilly Tarreau  */
859bd8c8fbbSWilly Tarreau 
860bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_read(int fd,void * buf,size_t count)861bd8c8fbbSWilly Tarreau ssize_t sys_read(int fd, void *buf, size_t count)
862bd8c8fbbSWilly Tarreau {
863bd8c8fbbSWilly Tarreau 	return my_syscall3(__NR_read, fd, buf, count);
864bd8c8fbbSWilly Tarreau }
865bd8c8fbbSWilly Tarreau 
866bd8c8fbbSWilly Tarreau static __attribute__((unused))
read(int fd,void * buf,size_t count)867bd8c8fbbSWilly Tarreau ssize_t read(int fd, void *buf, size_t count)
868bd8c8fbbSWilly Tarreau {
869d27447bcSZhangjin Wu 	return __sysret(sys_read(fd, buf, count));
870bd8c8fbbSWilly Tarreau }
871bd8c8fbbSWilly Tarreau 
872bd8c8fbbSWilly Tarreau 
873bd8c8fbbSWilly Tarreau /*
874bd8c8fbbSWilly Tarreau  * int reboot(int cmd);
875bd8c8fbbSWilly Tarreau  * <cmd> is among LINUX_REBOOT_CMD_*
876bd8c8fbbSWilly Tarreau  */
877bd8c8fbbSWilly Tarreau 
878bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_reboot(int magic1,int magic2,int cmd,void * arg)879bd8c8fbbSWilly Tarreau ssize_t sys_reboot(int magic1, int magic2, int cmd, void *arg)
880bd8c8fbbSWilly Tarreau {
881bd8c8fbbSWilly Tarreau 	return my_syscall4(__NR_reboot, magic1, magic2, cmd, arg);
882bd8c8fbbSWilly Tarreau }
883bd8c8fbbSWilly Tarreau 
884bd8c8fbbSWilly Tarreau static __attribute__((unused))
reboot(int cmd)885bd8c8fbbSWilly Tarreau int reboot(int cmd)
886bd8c8fbbSWilly Tarreau {
887d27447bcSZhangjin Wu 	return __sysret(sys_reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, cmd, 0));
888bd8c8fbbSWilly Tarreau }
889bd8c8fbbSWilly Tarreau 
890bd8c8fbbSWilly Tarreau 
891bd8c8fbbSWilly Tarreau /*
892bd8c8fbbSWilly Tarreau  * int sched_yield(void);
893bd8c8fbbSWilly Tarreau  */
894bd8c8fbbSWilly Tarreau 
895bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_sched_yield(void)896bd8c8fbbSWilly Tarreau int sys_sched_yield(void)
897bd8c8fbbSWilly Tarreau {
898bd8c8fbbSWilly Tarreau 	return my_syscall0(__NR_sched_yield);
899bd8c8fbbSWilly Tarreau }
900bd8c8fbbSWilly Tarreau 
901bd8c8fbbSWilly Tarreau static __attribute__((unused))
sched_yield(void)902bd8c8fbbSWilly Tarreau int sched_yield(void)
903bd8c8fbbSWilly Tarreau {
904d27447bcSZhangjin Wu 	return __sysret(sys_sched_yield());
905bd8c8fbbSWilly Tarreau }
906bd8c8fbbSWilly Tarreau 
907bd8c8fbbSWilly Tarreau 
908bd8c8fbbSWilly Tarreau /*
909bd8c8fbbSWilly Tarreau  * int select(int nfds, fd_set *read_fds, fd_set *write_fds,
910bd8c8fbbSWilly Tarreau  *            fd_set *except_fds, struct timeval *timeout);
911bd8c8fbbSWilly Tarreau  */
912bd8c8fbbSWilly Tarreau 
913bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_select(int nfds,fd_set * rfds,fd_set * wfds,fd_set * efds,struct timeval * timeout)914bd8c8fbbSWilly Tarreau int sys_select(int nfds, fd_set *rfds, fd_set *wfds, fd_set *efds, struct timeval *timeout)
915bd8c8fbbSWilly Tarreau {
916bd8c8fbbSWilly Tarreau #if defined(__ARCH_WANT_SYS_OLD_SELECT) && !defined(__NR__newselect)
917bd8c8fbbSWilly Tarreau 	struct sel_arg_struct {
918bd8c8fbbSWilly Tarreau 		unsigned long n;
919bd8c8fbbSWilly Tarreau 		fd_set *r, *w, *e;
920bd8c8fbbSWilly Tarreau 		struct timeval *t;
921bd8c8fbbSWilly Tarreau 	} arg = { .n = nfds, .r = rfds, .w = wfds, .e = efds, .t = timeout };
922bd8c8fbbSWilly Tarreau 	return my_syscall1(__NR_select, &arg);
923bd8c8fbbSWilly Tarreau #elif defined(__ARCH_WANT_SYS_PSELECT6) && defined(__NR_pselect6)
924bd8c8fbbSWilly Tarreau 	struct timespec t;
925bd8c8fbbSWilly Tarreau 
926bd8c8fbbSWilly Tarreau 	if (timeout) {
927bd8c8fbbSWilly Tarreau 		t.tv_sec  = timeout->tv_sec;
928bd8c8fbbSWilly Tarreau 		t.tv_nsec = timeout->tv_usec * 1000;
929bd8c8fbbSWilly Tarreau 	}
930bd8c8fbbSWilly Tarreau 	return my_syscall6(__NR_pselect6, nfds, rfds, wfds, efds, timeout ? &t : NULL, NULL);
931bd8c8fbbSWilly Tarreau #elif defined(__NR__newselect) || defined(__NR_select)
932bd8c8fbbSWilly Tarreau #ifndef __NR__newselect
933bd8c8fbbSWilly Tarreau #define __NR__newselect __NR_select
934bd8c8fbbSWilly Tarreau #endif
935bd8c8fbbSWilly Tarreau 	return my_syscall5(__NR__newselect, nfds, rfds, wfds, efds, timeout);
936bd8c8fbbSWilly Tarreau #else
937ca50df30SZhangjin Wu 	return -ENOSYS;
938bd8c8fbbSWilly Tarreau #endif
939bd8c8fbbSWilly Tarreau }
940bd8c8fbbSWilly Tarreau 
941bd8c8fbbSWilly Tarreau static __attribute__((unused))
select(int nfds,fd_set * rfds,fd_set * wfds,fd_set * efds,struct timeval * timeout)942bd8c8fbbSWilly Tarreau int select(int nfds, fd_set *rfds, fd_set *wfds, fd_set *efds, struct timeval *timeout)
943bd8c8fbbSWilly Tarreau {
944d27447bcSZhangjin Wu 	return __sysret(sys_select(nfds, rfds, wfds, efds, timeout));
945bd8c8fbbSWilly Tarreau }
946bd8c8fbbSWilly Tarreau 
947bd8c8fbbSWilly Tarreau 
948bd8c8fbbSWilly Tarreau /*
949bd8c8fbbSWilly Tarreau  * int setpgid(pid_t pid, pid_t pgid);
950bd8c8fbbSWilly Tarreau  */
951bd8c8fbbSWilly Tarreau 
952bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_setpgid(pid_t pid,pid_t pgid)953bd8c8fbbSWilly Tarreau int sys_setpgid(pid_t pid, pid_t pgid)
954bd8c8fbbSWilly Tarreau {
955bd8c8fbbSWilly Tarreau 	return my_syscall2(__NR_setpgid, pid, pgid);
956bd8c8fbbSWilly Tarreau }
957bd8c8fbbSWilly Tarreau 
958bd8c8fbbSWilly Tarreau static __attribute__((unused))
setpgid(pid_t pid,pid_t pgid)959bd8c8fbbSWilly Tarreau int setpgid(pid_t pid, pid_t pgid)
960bd8c8fbbSWilly Tarreau {
961d27447bcSZhangjin Wu 	return __sysret(sys_setpgid(pid, pgid));
962bd8c8fbbSWilly Tarreau }
963bd8c8fbbSWilly Tarreau 
964bd8c8fbbSWilly Tarreau 
965bd8c8fbbSWilly Tarreau /*
966bd8c8fbbSWilly Tarreau  * pid_t setsid(void);
967bd8c8fbbSWilly Tarreau  */
968bd8c8fbbSWilly Tarreau 
969bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_setsid(void)970bd8c8fbbSWilly Tarreau pid_t sys_setsid(void)
971bd8c8fbbSWilly Tarreau {
972bd8c8fbbSWilly Tarreau 	return my_syscall0(__NR_setsid);
973bd8c8fbbSWilly Tarreau }
974bd8c8fbbSWilly Tarreau 
975bd8c8fbbSWilly Tarreau static __attribute__((unused))
setsid(void)976bd8c8fbbSWilly Tarreau pid_t setsid(void)
977bd8c8fbbSWilly Tarreau {
978d27447bcSZhangjin Wu 	return __sysret(sys_setsid());
979bd8c8fbbSWilly Tarreau }
980bd8c8fbbSWilly Tarreau 
981b551cb7dSFeiyang Chen /*
982b551cb7dSFeiyang Chen  * int statx(int fd, const char *path, int flags, unsigned int mask, struct statx *buf);
983af93807eSZhangjin Wu  * int stat(const char *path, struct stat *buf);
984b551cb7dSFeiyang Chen  */
985b551cb7dSFeiyang Chen 
986b551cb7dSFeiyang Chen static __attribute__((unused))
sys_statx(int fd,const char * path,int flags,unsigned int mask,struct statx * buf)987b551cb7dSFeiyang Chen int sys_statx(int fd, const char *path, int flags, unsigned int mask, struct statx *buf)
988b551cb7dSFeiyang Chen {
989af93807eSZhangjin Wu #ifdef __NR_statx
990b551cb7dSFeiyang Chen 	return my_syscall5(__NR_statx, fd, path, flags, mask, buf);
991af93807eSZhangjin Wu #else
992af93807eSZhangjin Wu 	return -ENOSYS;
993af93807eSZhangjin Wu #endif
994b551cb7dSFeiyang Chen }
995b551cb7dSFeiyang Chen 
996b551cb7dSFeiyang Chen static __attribute__((unused))
statx(int fd,const char * path,int flags,unsigned int mask,struct statx * buf)997b551cb7dSFeiyang Chen int statx(int fd, const char *path, int flags, unsigned int mask, struct statx *buf)
998b551cb7dSFeiyang Chen {
999d27447bcSZhangjin Wu 	return __sysret(sys_statx(fd, path, flags, mask, buf));
1000b551cb7dSFeiyang Chen }
1001bd8c8fbbSWilly Tarreau 
1002bd8c8fbbSWilly Tarreau 
1003b551cb7dSFeiyang Chen static __attribute__((unused))
stat(const char * path,struct stat * buf)1004af93807eSZhangjin Wu int stat(const char *path, struct stat *buf)
1005b551cb7dSFeiyang Chen {
1006b551cb7dSFeiyang Chen 	struct statx statx;
1007b551cb7dSFeiyang Chen 	long ret;
1008b551cb7dSFeiyang Chen 
1009af93807eSZhangjin Wu 	ret = __sysret(sys_statx(AT_FDCWD, path, AT_NO_AUTOMOUNT, STATX_BASIC_STATS, &statx));
1010af93807eSZhangjin Wu 	if (ret == -1)
1011af93807eSZhangjin Wu 		return ret;
1012af93807eSZhangjin Wu 
1013b551cb7dSFeiyang Chen 	buf->st_dev          = ((statx.stx_dev_minor & 0xff)
1014b551cb7dSFeiyang Chen 			       | (statx.stx_dev_major << 8)
1015b551cb7dSFeiyang Chen 			       | ((statx.stx_dev_minor & ~0xff) << 12));
1016b551cb7dSFeiyang Chen 	buf->st_ino          = statx.stx_ino;
1017b551cb7dSFeiyang Chen 	buf->st_mode         = statx.stx_mode;
1018b551cb7dSFeiyang Chen 	buf->st_nlink        = statx.stx_nlink;
1019b551cb7dSFeiyang Chen 	buf->st_uid          = statx.stx_uid;
1020b551cb7dSFeiyang Chen 	buf->st_gid          = statx.stx_gid;
1021b551cb7dSFeiyang Chen 	buf->st_rdev         = ((statx.stx_rdev_minor & 0xff)
1022b551cb7dSFeiyang Chen 			       | (statx.stx_rdev_major << 8)
1023b551cb7dSFeiyang Chen 			       | ((statx.stx_rdev_minor & ~0xff) << 12));
1024b551cb7dSFeiyang Chen 	buf->st_size         = statx.stx_size;
1025b551cb7dSFeiyang Chen 	buf->st_blksize      = statx.stx_blksize;
1026b551cb7dSFeiyang Chen 	buf->st_blocks       = statx.stx_blocks;
102787b9fa66SThomas Weißschuh 	buf->st_atim.tv_sec  = statx.stx_atime.tv_sec;
102887b9fa66SThomas Weißschuh 	buf->st_atim.tv_nsec = statx.stx_atime.tv_nsec;
102987b9fa66SThomas Weißschuh 	buf->st_mtim.tv_sec  = statx.stx_mtime.tv_sec;
103087b9fa66SThomas Weißschuh 	buf->st_mtim.tv_nsec = statx.stx_mtime.tv_nsec;
103187b9fa66SThomas Weißschuh 	buf->st_ctim.tv_sec  = statx.stx_ctime.tv_sec;
103287b9fa66SThomas Weißschuh 	buf->st_ctim.tv_nsec = statx.stx_ctime.tv_nsec;
1033bd8c8fbbSWilly Tarreau 
1034af93807eSZhangjin Wu 	return 0;
1035bd8c8fbbSWilly Tarreau }
1036bd8c8fbbSWilly Tarreau 
1037bd8c8fbbSWilly Tarreau 
1038bd8c8fbbSWilly Tarreau /*
1039bd8c8fbbSWilly Tarreau  * int symlink(const char *old, const char *new);
1040bd8c8fbbSWilly Tarreau  */
1041bd8c8fbbSWilly Tarreau 
1042bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_symlink(const char * old,const char * new)1043bd8c8fbbSWilly Tarreau int sys_symlink(const char *old, const char *new)
1044bd8c8fbbSWilly Tarreau {
1045bd8c8fbbSWilly Tarreau #ifdef __NR_symlinkat
1046bd8c8fbbSWilly Tarreau 	return my_syscall3(__NR_symlinkat, old, AT_FDCWD, new);
1047bd8c8fbbSWilly Tarreau #elif defined(__NR_symlink)
1048bd8c8fbbSWilly Tarreau 	return my_syscall2(__NR_symlink, old, new);
1049bd8c8fbbSWilly Tarreau #else
1050ca50df30SZhangjin Wu 	return -ENOSYS;
1051bd8c8fbbSWilly Tarreau #endif
1052bd8c8fbbSWilly Tarreau }
1053bd8c8fbbSWilly Tarreau 
1054bd8c8fbbSWilly Tarreau static __attribute__((unused))
symlink(const char * old,const char * new)1055bd8c8fbbSWilly Tarreau int symlink(const char *old, const char *new)
1056bd8c8fbbSWilly Tarreau {
1057d27447bcSZhangjin Wu 	return __sysret(sys_symlink(old, new));
1058bd8c8fbbSWilly Tarreau }
1059bd8c8fbbSWilly Tarreau 
1060bd8c8fbbSWilly Tarreau 
1061bd8c8fbbSWilly Tarreau /*
1062bd8c8fbbSWilly Tarreau  * mode_t umask(mode_t mode);
1063bd8c8fbbSWilly Tarreau  */
1064bd8c8fbbSWilly Tarreau 
1065bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_umask(mode_t mode)1066bd8c8fbbSWilly Tarreau mode_t sys_umask(mode_t mode)
1067bd8c8fbbSWilly Tarreau {
1068bd8c8fbbSWilly Tarreau 	return my_syscall1(__NR_umask, mode);
1069bd8c8fbbSWilly Tarreau }
1070bd8c8fbbSWilly Tarreau 
1071bd8c8fbbSWilly Tarreau static __attribute__((unused))
umask(mode_t mode)1072bd8c8fbbSWilly Tarreau mode_t umask(mode_t mode)
1073bd8c8fbbSWilly Tarreau {
1074bd8c8fbbSWilly Tarreau 	return sys_umask(mode);
1075bd8c8fbbSWilly Tarreau }
1076bd8c8fbbSWilly Tarreau 
1077bd8c8fbbSWilly Tarreau 
1078bd8c8fbbSWilly Tarreau /*
1079bd8c8fbbSWilly Tarreau  * int umount2(const char *path, int flags);
1080bd8c8fbbSWilly Tarreau  */
1081bd8c8fbbSWilly Tarreau 
1082bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_umount2(const char * path,int flags)1083bd8c8fbbSWilly Tarreau int sys_umount2(const char *path, int flags)
1084bd8c8fbbSWilly Tarreau {
1085bd8c8fbbSWilly Tarreau 	return my_syscall2(__NR_umount2, path, flags);
1086bd8c8fbbSWilly Tarreau }
1087bd8c8fbbSWilly Tarreau 
1088bd8c8fbbSWilly Tarreau static __attribute__((unused))
umount2(const char * path,int flags)1089bd8c8fbbSWilly Tarreau int umount2(const char *path, int flags)
1090bd8c8fbbSWilly Tarreau {
1091d27447bcSZhangjin Wu 	return __sysret(sys_umount2(path, flags));
1092bd8c8fbbSWilly Tarreau }
1093bd8c8fbbSWilly Tarreau 
1094bd8c8fbbSWilly Tarreau 
1095bd8c8fbbSWilly Tarreau /*
1096bd8c8fbbSWilly Tarreau  * int unlink(const char *path);
1097bd8c8fbbSWilly Tarreau  */
1098bd8c8fbbSWilly Tarreau 
1099bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_unlink(const char * path)1100bd8c8fbbSWilly Tarreau int sys_unlink(const char *path)
1101bd8c8fbbSWilly Tarreau {
1102bd8c8fbbSWilly Tarreau #ifdef __NR_unlinkat
1103bd8c8fbbSWilly Tarreau 	return my_syscall3(__NR_unlinkat, AT_FDCWD, path, 0);
1104bd8c8fbbSWilly Tarreau #elif defined(__NR_unlink)
1105bd8c8fbbSWilly Tarreau 	return my_syscall1(__NR_unlink, path);
1106bd8c8fbbSWilly Tarreau #else
1107ca50df30SZhangjin Wu 	return -ENOSYS;
1108bd8c8fbbSWilly Tarreau #endif
1109bd8c8fbbSWilly Tarreau }
1110bd8c8fbbSWilly Tarreau 
1111bd8c8fbbSWilly Tarreau static __attribute__((unused))
unlink(const char * path)1112bd8c8fbbSWilly Tarreau int unlink(const char *path)
1113bd8c8fbbSWilly Tarreau {
1114d27447bcSZhangjin Wu 	return __sysret(sys_unlink(path));
1115bd8c8fbbSWilly Tarreau }
1116bd8c8fbbSWilly Tarreau 
1117bd8c8fbbSWilly Tarreau 
1118bd8c8fbbSWilly Tarreau /*
1119bd8c8fbbSWilly Tarreau  * pid_t wait(int *status);
1120bd8c8fbbSWilly Tarreau  * pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage);
1121bd8c8fbbSWilly Tarreau  * pid_t waitpid(pid_t pid, int *status, int options);
1122bd8c8fbbSWilly Tarreau  */
1123bd8c8fbbSWilly Tarreau 
1124bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_wait4(pid_t pid,int * status,int options,struct rusage * rusage)1125bd8c8fbbSWilly Tarreau pid_t sys_wait4(pid_t pid, int *status, int options, struct rusage *rusage)
1126bd8c8fbbSWilly Tarreau {
11272f98aca8SZhangjin Wu #ifdef __NR_wait4
1128bd8c8fbbSWilly Tarreau 	return my_syscall4(__NR_wait4, pid, status, options, rusage);
11292f98aca8SZhangjin Wu #else
11302f98aca8SZhangjin Wu 	return -ENOSYS;
11312f98aca8SZhangjin Wu #endif
1132bd8c8fbbSWilly Tarreau }
1133bd8c8fbbSWilly Tarreau 
1134bd8c8fbbSWilly Tarreau static __attribute__((unused))
wait(int * status)1135bd8c8fbbSWilly Tarreau pid_t wait(int *status)
1136bd8c8fbbSWilly Tarreau {
1137d27447bcSZhangjin Wu 	return __sysret(sys_wait4(-1, status, 0, NULL));
1138bd8c8fbbSWilly Tarreau }
1139bd8c8fbbSWilly Tarreau 
1140bd8c8fbbSWilly Tarreau static __attribute__((unused))
wait4(pid_t pid,int * status,int options,struct rusage * rusage)1141bd8c8fbbSWilly Tarreau pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage)
1142bd8c8fbbSWilly Tarreau {
1143d27447bcSZhangjin Wu 	return __sysret(sys_wait4(pid, status, options, rusage));
1144bd8c8fbbSWilly Tarreau }
1145bd8c8fbbSWilly Tarreau 
1146bd8c8fbbSWilly Tarreau 
1147bd8c8fbbSWilly Tarreau static __attribute__((unused))
waitpid(pid_t pid,int * status,int options)1148bd8c8fbbSWilly Tarreau pid_t waitpid(pid_t pid, int *status, int options)
1149bd8c8fbbSWilly Tarreau {
1150d27447bcSZhangjin Wu 	return __sysret(sys_wait4(pid, status, options, NULL));
1151bd8c8fbbSWilly Tarreau }
1152bd8c8fbbSWilly Tarreau 
1153bd8c8fbbSWilly Tarreau 
1154bd8c8fbbSWilly Tarreau /*
1155bd8c8fbbSWilly Tarreau  * ssize_t write(int fd, const void *buf, size_t count);
1156bd8c8fbbSWilly Tarreau  */
1157bd8c8fbbSWilly Tarreau 
1158bd8c8fbbSWilly Tarreau static __attribute__((unused))
sys_write(int fd,const void * buf,size_t count)1159bd8c8fbbSWilly Tarreau ssize_t sys_write(int fd, const void *buf, size_t count)
1160bd8c8fbbSWilly Tarreau {
1161bd8c8fbbSWilly Tarreau 	return my_syscall3(__NR_write, fd, buf, count);
1162bd8c8fbbSWilly Tarreau }
1163bd8c8fbbSWilly Tarreau 
1164bd8c8fbbSWilly Tarreau static __attribute__((unused))
write(int fd,const void * buf,size_t count)1165bd8c8fbbSWilly Tarreau ssize_t write(int fd, const void *buf, size_t count)
1166bd8c8fbbSWilly Tarreau {
1167d27447bcSZhangjin Wu 	return __sysret(sys_write(fd, buf, count));
1168bd8c8fbbSWilly Tarreau }
1169bd8c8fbbSWilly Tarreau 
1170e8842cf0SThomas Weißschuh 
1171e8842cf0SThomas Weißschuh /*
1172e8842cf0SThomas Weißschuh  * int memfd_create(const char *name, unsigned int flags);
1173e8842cf0SThomas Weißschuh  */
1174e8842cf0SThomas Weißschuh 
1175e8842cf0SThomas Weißschuh static __attribute__((unused))
sys_memfd_create(const char * name,unsigned int flags)1176e8842cf0SThomas Weißschuh int sys_memfd_create(const char *name, unsigned int flags)
1177e8842cf0SThomas Weißschuh {
1178e8842cf0SThomas Weißschuh 	return my_syscall2(__NR_memfd_create, name, flags);
1179e8842cf0SThomas Weißschuh }
1180e8842cf0SThomas Weißschuh 
1181e8842cf0SThomas Weißschuh static __attribute__((unused))
memfd_create(const char * name,unsigned int flags)1182e8842cf0SThomas Weißschuh int memfd_create(const char *name, unsigned int flags)
1183e8842cf0SThomas Weißschuh {
1184d27447bcSZhangjin Wu 	return __sysret(sys_memfd_create(name, flags));
1185e8842cf0SThomas Weißschuh }
1186e8842cf0SThomas Weißschuh 
118755abdd1fSWilly Tarreau /* make sure to include all global symbols */
118855abdd1fSWilly Tarreau #include "nolibc.h"
1189bd8c8fbbSWilly Tarreau 
1190bd8c8fbbSWilly Tarreau #endif /* _NOLIBC_SYS_H */
1191