162306a36Sopenharmony_ci/* SPDX-License-Identifier: LGPL-2.1 OR MIT */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Syscall definitions for NOLIBC (those in man(2)) 462306a36Sopenharmony_ci * Copyright (C) 2017-2021 Willy Tarreau <w@1wt.eu> 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#ifndef _NOLIBC_SYS_H 862306a36Sopenharmony_ci#define _NOLIBC_SYS_H 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <stdarg.h> 1162306a36Sopenharmony_ci#include "std.h" 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci/* system includes */ 1462306a36Sopenharmony_ci#include <asm/unistd.h> 1562306a36Sopenharmony_ci#include <asm/signal.h> /* for SIGCHLD */ 1662306a36Sopenharmony_ci#include <asm/ioctls.h> 1762306a36Sopenharmony_ci#include <asm/mman.h> 1862306a36Sopenharmony_ci#include <linux/fs.h> 1962306a36Sopenharmony_ci#include <linux/loop.h> 2062306a36Sopenharmony_ci#include <linux/time.h> 2162306a36Sopenharmony_ci#include <linux/auxvec.h> 2262306a36Sopenharmony_ci#include <linux/fcntl.h> /* for O_* and AT_* */ 2362306a36Sopenharmony_ci#include <linux/stat.h> /* for statx() */ 2462306a36Sopenharmony_ci#include <linux/prctl.h> 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#include "arch.h" 2762306a36Sopenharmony_ci#include "errno.h" 2862306a36Sopenharmony_ci#include "types.h" 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci/* Syscall return helper: takes the syscall value in argument and checks for an 3262306a36Sopenharmony_ci * error in it. This may only be used with signed returns (int or long), but 3362306a36Sopenharmony_ci * not with pointers. An error is any value < 0. When an error is encountered, 3462306a36Sopenharmony_ci * -ret is set into errno and -1 is returned. Otherwise the returned value is 3562306a36Sopenharmony_ci * passed as-is with its type preserved. 3662306a36Sopenharmony_ci */ 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci#define __sysret(arg) \ 3962306a36Sopenharmony_ci({ \ 4062306a36Sopenharmony_ci __typeof__(arg) __sysret_arg = (arg); \ 4162306a36Sopenharmony_ci (__sysret_arg < 0) /* error ? */ \ 4262306a36Sopenharmony_ci ? (({ SET_ERRNO(-__sysret_arg); }), -1) /* ret -1 with errno = -arg */ \ 4362306a36Sopenharmony_ci : __sysret_arg; /* return original value */ \ 4462306a36Sopenharmony_ci}) 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci/* Functions in this file only describe syscalls. They're declared static so 4862306a36Sopenharmony_ci * that the compiler usually decides to inline them while still being allowed 4962306a36Sopenharmony_ci * to pass a pointer to one of their instances. Each syscall exists in two 5062306a36Sopenharmony_ci * versions: 5162306a36Sopenharmony_ci * - the "internal" ones, which matches the raw syscall interface at the 5262306a36Sopenharmony_ci * kernel level, which may sometimes slightly differ from the documented 5362306a36Sopenharmony_ci * libc-level ones. For example most of them return either a valid value 5462306a36Sopenharmony_ci * or -errno. All of these are prefixed with "sys_". They may be called 5562306a36Sopenharmony_ci * by non-portable applications if desired. 5662306a36Sopenharmony_ci * 5762306a36Sopenharmony_ci * - the "exported" ones, whose interface must closely match the one 5862306a36Sopenharmony_ci * documented in man(2), that applications are supposed to expect. These 5962306a36Sopenharmony_ci * ones rely on the internal ones, and set errno. 6062306a36Sopenharmony_ci * 6162306a36Sopenharmony_ci * Each syscall will be defined with the two functions, sorted in alphabetical 6262306a36Sopenharmony_ci * order applied to the exported names. 6362306a36Sopenharmony_ci * 6462306a36Sopenharmony_ci * In case of doubt about the relevance of a function here, only those which 6562306a36Sopenharmony_ci * set errno should be defined here. Wrappers like those appearing in man(3) 6662306a36Sopenharmony_ci * should not be placed here. 6762306a36Sopenharmony_ci */ 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci/* 7162306a36Sopenharmony_ci * int brk(void *addr); 7262306a36Sopenharmony_ci * void *sbrk(intptr_t inc) 7362306a36Sopenharmony_ci */ 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_cistatic __attribute__((unused)) 7662306a36Sopenharmony_civoid *sys_brk(void *addr) 7762306a36Sopenharmony_ci{ 7862306a36Sopenharmony_ci return (void *)my_syscall1(__NR_brk, addr); 7962306a36Sopenharmony_ci} 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_cistatic __attribute__((unused)) 8262306a36Sopenharmony_ciint brk(void *addr) 8362306a36Sopenharmony_ci{ 8462306a36Sopenharmony_ci void *ret = sys_brk(addr); 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci if (!ret) { 8762306a36Sopenharmony_ci SET_ERRNO(ENOMEM); 8862306a36Sopenharmony_ci return -1; 8962306a36Sopenharmony_ci } 9062306a36Sopenharmony_ci return 0; 9162306a36Sopenharmony_ci} 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_cistatic __attribute__((unused)) 9462306a36Sopenharmony_civoid *sbrk(intptr_t inc) 9562306a36Sopenharmony_ci{ 9662306a36Sopenharmony_ci /* first call to find current end */ 9762306a36Sopenharmony_ci void *ret = sys_brk(0); 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci if (ret && sys_brk(ret + inc) == ret + inc) 10062306a36Sopenharmony_ci return ret + inc; 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci SET_ERRNO(ENOMEM); 10362306a36Sopenharmony_ci return (void *)-1; 10462306a36Sopenharmony_ci} 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci/* 10862306a36Sopenharmony_ci * int chdir(const char *path); 10962306a36Sopenharmony_ci */ 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_cistatic __attribute__((unused)) 11262306a36Sopenharmony_ciint sys_chdir(const char *path) 11362306a36Sopenharmony_ci{ 11462306a36Sopenharmony_ci return my_syscall1(__NR_chdir, path); 11562306a36Sopenharmony_ci} 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_cistatic __attribute__((unused)) 11862306a36Sopenharmony_ciint chdir(const char *path) 11962306a36Sopenharmony_ci{ 12062306a36Sopenharmony_ci return __sysret(sys_chdir(path)); 12162306a36Sopenharmony_ci} 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci/* 12562306a36Sopenharmony_ci * int chmod(const char *path, mode_t mode); 12662306a36Sopenharmony_ci */ 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_cistatic __attribute__((unused)) 12962306a36Sopenharmony_ciint sys_chmod(const char *path, mode_t mode) 13062306a36Sopenharmony_ci{ 13162306a36Sopenharmony_ci#ifdef __NR_fchmodat 13262306a36Sopenharmony_ci return my_syscall4(__NR_fchmodat, AT_FDCWD, path, mode, 0); 13362306a36Sopenharmony_ci#elif defined(__NR_chmod) 13462306a36Sopenharmony_ci return my_syscall2(__NR_chmod, path, mode); 13562306a36Sopenharmony_ci#else 13662306a36Sopenharmony_ci return -ENOSYS; 13762306a36Sopenharmony_ci#endif 13862306a36Sopenharmony_ci} 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_cistatic __attribute__((unused)) 14162306a36Sopenharmony_ciint chmod(const char *path, mode_t mode) 14262306a36Sopenharmony_ci{ 14362306a36Sopenharmony_ci return __sysret(sys_chmod(path, mode)); 14462306a36Sopenharmony_ci} 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci/* 14862306a36Sopenharmony_ci * int chown(const char *path, uid_t owner, gid_t group); 14962306a36Sopenharmony_ci */ 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_cistatic __attribute__((unused)) 15262306a36Sopenharmony_ciint sys_chown(const char *path, uid_t owner, gid_t group) 15362306a36Sopenharmony_ci{ 15462306a36Sopenharmony_ci#ifdef __NR_fchownat 15562306a36Sopenharmony_ci return my_syscall5(__NR_fchownat, AT_FDCWD, path, owner, group, 0); 15662306a36Sopenharmony_ci#elif defined(__NR_chown) 15762306a36Sopenharmony_ci return my_syscall3(__NR_chown, path, owner, group); 15862306a36Sopenharmony_ci#else 15962306a36Sopenharmony_ci return -ENOSYS; 16062306a36Sopenharmony_ci#endif 16162306a36Sopenharmony_ci} 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_cistatic __attribute__((unused)) 16462306a36Sopenharmony_ciint chown(const char *path, uid_t owner, gid_t group) 16562306a36Sopenharmony_ci{ 16662306a36Sopenharmony_ci return __sysret(sys_chown(path, owner, group)); 16762306a36Sopenharmony_ci} 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci/* 17162306a36Sopenharmony_ci * int chroot(const char *path); 17262306a36Sopenharmony_ci */ 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_cistatic __attribute__((unused)) 17562306a36Sopenharmony_ciint sys_chroot(const char *path) 17662306a36Sopenharmony_ci{ 17762306a36Sopenharmony_ci return my_syscall1(__NR_chroot, path); 17862306a36Sopenharmony_ci} 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_cistatic __attribute__((unused)) 18162306a36Sopenharmony_ciint chroot(const char *path) 18262306a36Sopenharmony_ci{ 18362306a36Sopenharmony_ci return __sysret(sys_chroot(path)); 18462306a36Sopenharmony_ci} 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci/* 18862306a36Sopenharmony_ci * int close(int fd); 18962306a36Sopenharmony_ci */ 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_cistatic __attribute__((unused)) 19262306a36Sopenharmony_ciint sys_close(int fd) 19362306a36Sopenharmony_ci{ 19462306a36Sopenharmony_ci return my_syscall1(__NR_close, fd); 19562306a36Sopenharmony_ci} 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_cistatic __attribute__((unused)) 19862306a36Sopenharmony_ciint close(int fd) 19962306a36Sopenharmony_ci{ 20062306a36Sopenharmony_ci return __sysret(sys_close(fd)); 20162306a36Sopenharmony_ci} 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci/* 20562306a36Sopenharmony_ci * int dup(int fd); 20662306a36Sopenharmony_ci */ 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_cistatic __attribute__((unused)) 20962306a36Sopenharmony_ciint sys_dup(int fd) 21062306a36Sopenharmony_ci{ 21162306a36Sopenharmony_ci return my_syscall1(__NR_dup, fd); 21262306a36Sopenharmony_ci} 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_cistatic __attribute__((unused)) 21562306a36Sopenharmony_ciint dup(int fd) 21662306a36Sopenharmony_ci{ 21762306a36Sopenharmony_ci return __sysret(sys_dup(fd)); 21862306a36Sopenharmony_ci} 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci/* 22262306a36Sopenharmony_ci * int dup2(int old, int new); 22362306a36Sopenharmony_ci */ 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_cistatic __attribute__((unused)) 22662306a36Sopenharmony_ciint sys_dup2(int old, int new) 22762306a36Sopenharmony_ci{ 22862306a36Sopenharmony_ci#ifdef __NR_dup3 22962306a36Sopenharmony_ci return my_syscall3(__NR_dup3, old, new, 0); 23062306a36Sopenharmony_ci#elif defined(__NR_dup2) 23162306a36Sopenharmony_ci return my_syscall2(__NR_dup2, old, new); 23262306a36Sopenharmony_ci#else 23362306a36Sopenharmony_ci return -ENOSYS; 23462306a36Sopenharmony_ci#endif 23562306a36Sopenharmony_ci} 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_cistatic __attribute__((unused)) 23862306a36Sopenharmony_ciint dup2(int old, int new) 23962306a36Sopenharmony_ci{ 24062306a36Sopenharmony_ci return __sysret(sys_dup2(old, new)); 24162306a36Sopenharmony_ci} 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_ci/* 24562306a36Sopenharmony_ci * int dup3(int old, int new, int flags); 24662306a36Sopenharmony_ci */ 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci#ifdef __NR_dup3 24962306a36Sopenharmony_cistatic __attribute__((unused)) 25062306a36Sopenharmony_ciint sys_dup3(int old, int new, int flags) 25162306a36Sopenharmony_ci{ 25262306a36Sopenharmony_ci return my_syscall3(__NR_dup3, old, new, flags); 25362306a36Sopenharmony_ci} 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_cistatic __attribute__((unused)) 25662306a36Sopenharmony_ciint dup3(int old, int new, int flags) 25762306a36Sopenharmony_ci{ 25862306a36Sopenharmony_ci return __sysret(sys_dup3(old, new, flags)); 25962306a36Sopenharmony_ci} 26062306a36Sopenharmony_ci#endif 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_ci/* 26462306a36Sopenharmony_ci * int execve(const char *filename, char *const argv[], char *const envp[]); 26562306a36Sopenharmony_ci */ 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_cistatic __attribute__((unused)) 26862306a36Sopenharmony_ciint sys_execve(const char *filename, char *const argv[], char *const envp[]) 26962306a36Sopenharmony_ci{ 27062306a36Sopenharmony_ci return my_syscall3(__NR_execve, filename, argv, envp); 27162306a36Sopenharmony_ci} 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_cistatic __attribute__((unused)) 27462306a36Sopenharmony_ciint execve(const char *filename, char *const argv[], char *const envp[]) 27562306a36Sopenharmony_ci{ 27662306a36Sopenharmony_ci return __sysret(sys_execve(filename, argv, envp)); 27762306a36Sopenharmony_ci} 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_ci/* 28162306a36Sopenharmony_ci * void exit(int status); 28262306a36Sopenharmony_ci */ 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_cistatic __attribute__((noreturn,unused)) 28562306a36Sopenharmony_civoid sys_exit(int status) 28662306a36Sopenharmony_ci{ 28762306a36Sopenharmony_ci my_syscall1(__NR_exit, status & 255); 28862306a36Sopenharmony_ci while(1); /* shut the "noreturn" warnings. */ 28962306a36Sopenharmony_ci} 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_cistatic __attribute__((noreturn,unused)) 29262306a36Sopenharmony_civoid exit(int status) 29362306a36Sopenharmony_ci{ 29462306a36Sopenharmony_ci sys_exit(status); 29562306a36Sopenharmony_ci} 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_ci/* 29962306a36Sopenharmony_ci * pid_t fork(void); 30062306a36Sopenharmony_ci */ 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci#ifndef sys_fork 30362306a36Sopenharmony_cistatic __attribute__((unused)) 30462306a36Sopenharmony_cipid_t sys_fork(void) 30562306a36Sopenharmony_ci{ 30662306a36Sopenharmony_ci#ifdef __NR_clone 30762306a36Sopenharmony_ci /* note: some archs only have clone() and not fork(). Different archs 30862306a36Sopenharmony_ci * have a different API, but most archs have the flags on first arg and 30962306a36Sopenharmony_ci * will not use the rest with no other flag. 31062306a36Sopenharmony_ci */ 31162306a36Sopenharmony_ci return my_syscall5(__NR_clone, SIGCHLD, 0, 0, 0, 0); 31262306a36Sopenharmony_ci#elif defined(__NR_fork) 31362306a36Sopenharmony_ci return my_syscall0(__NR_fork); 31462306a36Sopenharmony_ci#else 31562306a36Sopenharmony_ci return -ENOSYS; 31662306a36Sopenharmony_ci#endif 31762306a36Sopenharmony_ci} 31862306a36Sopenharmony_ci#endif 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_cistatic __attribute__((unused)) 32162306a36Sopenharmony_cipid_t fork(void) 32262306a36Sopenharmony_ci{ 32362306a36Sopenharmony_ci return __sysret(sys_fork()); 32462306a36Sopenharmony_ci} 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_ci/* 32862306a36Sopenharmony_ci * int fsync(int fd); 32962306a36Sopenharmony_ci */ 33062306a36Sopenharmony_ci 33162306a36Sopenharmony_cistatic __attribute__((unused)) 33262306a36Sopenharmony_ciint sys_fsync(int fd) 33362306a36Sopenharmony_ci{ 33462306a36Sopenharmony_ci return my_syscall1(__NR_fsync, fd); 33562306a36Sopenharmony_ci} 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_cistatic __attribute__((unused)) 33862306a36Sopenharmony_ciint fsync(int fd) 33962306a36Sopenharmony_ci{ 34062306a36Sopenharmony_ci return __sysret(sys_fsync(fd)); 34162306a36Sopenharmony_ci} 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci/* 34562306a36Sopenharmony_ci * int getdents64(int fd, struct linux_dirent64 *dirp, int count); 34662306a36Sopenharmony_ci */ 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_cistatic __attribute__((unused)) 34962306a36Sopenharmony_ciint sys_getdents64(int fd, struct linux_dirent64 *dirp, int count) 35062306a36Sopenharmony_ci{ 35162306a36Sopenharmony_ci return my_syscall3(__NR_getdents64, fd, dirp, count); 35262306a36Sopenharmony_ci} 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_cistatic __attribute__((unused)) 35562306a36Sopenharmony_ciint getdents64(int fd, struct linux_dirent64 *dirp, int count) 35662306a36Sopenharmony_ci{ 35762306a36Sopenharmony_ci return __sysret(sys_getdents64(fd, dirp, count)); 35862306a36Sopenharmony_ci} 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_ci/* 36262306a36Sopenharmony_ci * uid_t geteuid(void); 36362306a36Sopenharmony_ci */ 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_cistatic __attribute__((unused)) 36662306a36Sopenharmony_ciuid_t sys_geteuid(void) 36762306a36Sopenharmony_ci{ 36862306a36Sopenharmony_ci#ifdef __NR_geteuid32 36962306a36Sopenharmony_ci return my_syscall0(__NR_geteuid32); 37062306a36Sopenharmony_ci#else 37162306a36Sopenharmony_ci return my_syscall0(__NR_geteuid); 37262306a36Sopenharmony_ci#endif 37362306a36Sopenharmony_ci} 37462306a36Sopenharmony_ci 37562306a36Sopenharmony_cistatic __attribute__((unused)) 37662306a36Sopenharmony_ciuid_t geteuid(void) 37762306a36Sopenharmony_ci{ 37862306a36Sopenharmony_ci return sys_geteuid(); 37962306a36Sopenharmony_ci} 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_ci/* 38362306a36Sopenharmony_ci * pid_t getpgid(pid_t pid); 38462306a36Sopenharmony_ci */ 38562306a36Sopenharmony_ci 38662306a36Sopenharmony_cistatic __attribute__((unused)) 38762306a36Sopenharmony_cipid_t sys_getpgid(pid_t pid) 38862306a36Sopenharmony_ci{ 38962306a36Sopenharmony_ci return my_syscall1(__NR_getpgid, pid); 39062306a36Sopenharmony_ci} 39162306a36Sopenharmony_ci 39262306a36Sopenharmony_cistatic __attribute__((unused)) 39362306a36Sopenharmony_cipid_t getpgid(pid_t pid) 39462306a36Sopenharmony_ci{ 39562306a36Sopenharmony_ci return __sysret(sys_getpgid(pid)); 39662306a36Sopenharmony_ci} 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_ci/* 40062306a36Sopenharmony_ci * pid_t getpgrp(void); 40162306a36Sopenharmony_ci */ 40262306a36Sopenharmony_ci 40362306a36Sopenharmony_cistatic __attribute__((unused)) 40462306a36Sopenharmony_cipid_t sys_getpgrp(void) 40562306a36Sopenharmony_ci{ 40662306a36Sopenharmony_ci return sys_getpgid(0); 40762306a36Sopenharmony_ci} 40862306a36Sopenharmony_ci 40962306a36Sopenharmony_cistatic __attribute__((unused)) 41062306a36Sopenharmony_cipid_t getpgrp(void) 41162306a36Sopenharmony_ci{ 41262306a36Sopenharmony_ci return sys_getpgrp(); 41362306a36Sopenharmony_ci} 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_ci 41662306a36Sopenharmony_ci/* 41762306a36Sopenharmony_ci * pid_t getpid(void); 41862306a36Sopenharmony_ci */ 41962306a36Sopenharmony_ci 42062306a36Sopenharmony_cistatic __attribute__((unused)) 42162306a36Sopenharmony_cipid_t sys_getpid(void) 42262306a36Sopenharmony_ci{ 42362306a36Sopenharmony_ci return my_syscall0(__NR_getpid); 42462306a36Sopenharmony_ci} 42562306a36Sopenharmony_ci 42662306a36Sopenharmony_cistatic __attribute__((unused)) 42762306a36Sopenharmony_cipid_t getpid(void) 42862306a36Sopenharmony_ci{ 42962306a36Sopenharmony_ci return sys_getpid(); 43062306a36Sopenharmony_ci} 43162306a36Sopenharmony_ci 43262306a36Sopenharmony_ci 43362306a36Sopenharmony_ci/* 43462306a36Sopenharmony_ci * pid_t getppid(void); 43562306a36Sopenharmony_ci */ 43662306a36Sopenharmony_ci 43762306a36Sopenharmony_cistatic __attribute__((unused)) 43862306a36Sopenharmony_cipid_t sys_getppid(void) 43962306a36Sopenharmony_ci{ 44062306a36Sopenharmony_ci return my_syscall0(__NR_getppid); 44162306a36Sopenharmony_ci} 44262306a36Sopenharmony_ci 44362306a36Sopenharmony_cistatic __attribute__((unused)) 44462306a36Sopenharmony_cipid_t getppid(void) 44562306a36Sopenharmony_ci{ 44662306a36Sopenharmony_ci return sys_getppid(); 44762306a36Sopenharmony_ci} 44862306a36Sopenharmony_ci 44962306a36Sopenharmony_ci 45062306a36Sopenharmony_ci/* 45162306a36Sopenharmony_ci * pid_t gettid(void); 45262306a36Sopenharmony_ci */ 45362306a36Sopenharmony_ci 45462306a36Sopenharmony_cistatic __attribute__((unused)) 45562306a36Sopenharmony_cipid_t sys_gettid(void) 45662306a36Sopenharmony_ci{ 45762306a36Sopenharmony_ci return my_syscall0(__NR_gettid); 45862306a36Sopenharmony_ci} 45962306a36Sopenharmony_ci 46062306a36Sopenharmony_cistatic __attribute__((unused)) 46162306a36Sopenharmony_cipid_t gettid(void) 46262306a36Sopenharmony_ci{ 46362306a36Sopenharmony_ci return sys_gettid(); 46462306a36Sopenharmony_ci} 46562306a36Sopenharmony_ci 46662306a36Sopenharmony_cistatic unsigned long getauxval(unsigned long key); 46762306a36Sopenharmony_ci 46862306a36Sopenharmony_ci/* 46962306a36Sopenharmony_ci * int getpagesize(void); 47062306a36Sopenharmony_ci */ 47162306a36Sopenharmony_ci 47262306a36Sopenharmony_cistatic __attribute__((unused)) 47362306a36Sopenharmony_ciint getpagesize(void) 47462306a36Sopenharmony_ci{ 47562306a36Sopenharmony_ci return __sysret((int)getauxval(AT_PAGESZ) ?: -ENOENT); 47662306a36Sopenharmony_ci} 47762306a36Sopenharmony_ci 47862306a36Sopenharmony_ci 47962306a36Sopenharmony_ci/* 48062306a36Sopenharmony_ci * int gettimeofday(struct timeval *tv, struct timezone *tz); 48162306a36Sopenharmony_ci */ 48262306a36Sopenharmony_ci 48362306a36Sopenharmony_cistatic __attribute__((unused)) 48462306a36Sopenharmony_ciint sys_gettimeofday(struct timeval *tv, struct timezone *tz) 48562306a36Sopenharmony_ci{ 48662306a36Sopenharmony_ci#ifdef __NR_gettimeofday 48762306a36Sopenharmony_ci return my_syscall2(__NR_gettimeofday, tv, tz); 48862306a36Sopenharmony_ci#else 48962306a36Sopenharmony_ci return -ENOSYS; 49062306a36Sopenharmony_ci#endif 49162306a36Sopenharmony_ci} 49262306a36Sopenharmony_ci 49362306a36Sopenharmony_cistatic __attribute__((unused)) 49462306a36Sopenharmony_ciint gettimeofday(struct timeval *tv, struct timezone *tz) 49562306a36Sopenharmony_ci{ 49662306a36Sopenharmony_ci return __sysret(sys_gettimeofday(tv, tz)); 49762306a36Sopenharmony_ci} 49862306a36Sopenharmony_ci 49962306a36Sopenharmony_ci 50062306a36Sopenharmony_ci/* 50162306a36Sopenharmony_ci * uid_t getuid(void); 50262306a36Sopenharmony_ci */ 50362306a36Sopenharmony_ci 50462306a36Sopenharmony_cistatic __attribute__((unused)) 50562306a36Sopenharmony_ciuid_t sys_getuid(void) 50662306a36Sopenharmony_ci{ 50762306a36Sopenharmony_ci#ifdef __NR_getuid32 50862306a36Sopenharmony_ci return my_syscall0(__NR_getuid32); 50962306a36Sopenharmony_ci#else 51062306a36Sopenharmony_ci return my_syscall0(__NR_getuid); 51162306a36Sopenharmony_ci#endif 51262306a36Sopenharmony_ci} 51362306a36Sopenharmony_ci 51462306a36Sopenharmony_cistatic __attribute__((unused)) 51562306a36Sopenharmony_ciuid_t getuid(void) 51662306a36Sopenharmony_ci{ 51762306a36Sopenharmony_ci return sys_getuid(); 51862306a36Sopenharmony_ci} 51962306a36Sopenharmony_ci 52062306a36Sopenharmony_ci 52162306a36Sopenharmony_ci/* 52262306a36Sopenharmony_ci * int ioctl(int fd, unsigned long req, void *value); 52362306a36Sopenharmony_ci */ 52462306a36Sopenharmony_ci 52562306a36Sopenharmony_cistatic __attribute__((unused)) 52662306a36Sopenharmony_ciint sys_ioctl(int fd, unsigned long req, void *value) 52762306a36Sopenharmony_ci{ 52862306a36Sopenharmony_ci return my_syscall3(__NR_ioctl, fd, req, value); 52962306a36Sopenharmony_ci} 53062306a36Sopenharmony_ci 53162306a36Sopenharmony_cistatic __attribute__((unused)) 53262306a36Sopenharmony_ciint ioctl(int fd, unsigned long req, void *value) 53362306a36Sopenharmony_ci{ 53462306a36Sopenharmony_ci return __sysret(sys_ioctl(fd, req, value)); 53562306a36Sopenharmony_ci} 53662306a36Sopenharmony_ci 53762306a36Sopenharmony_ci/* 53862306a36Sopenharmony_ci * int kill(pid_t pid, int signal); 53962306a36Sopenharmony_ci */ 54062306a36Sopenharmony_ci 54162306a36Sopenharmony_cistatic __attribute__((unused)) 54262306a36Sopenharmony_ciint sys_kill(pid_t pid, int signal) 54362306a36Sopenharmony_ci{ 54462306a36Sopenharmony_ci return my_syscall2(__NR_kill, pid, signal); 54562306a36Sopenharmony_ci} 54662306a36Sopenharmony_ci 54762306a36Sopenharmony_cistatic __attribute__((unused)) 54862306a36Sopenharmony_ciint kill(pid_t pid, int signal) 54962306a36Sopenharmony_ci{ 55062306a36Sopenharmony_ci return __sysret(sys_kill(pid, signal)); 55162306a36Sopenharmony_ci} 55262306a36Sopenharmony_ci 55362306a36Sopenharmony_ci 55462306a36Sopenharmony_ci/* 55562306a36Sopenharmony_ci * int link(const char *old, const char *new); 55662306a36Sopenharmony_ci */ 55762306a36Sopenharmony_ci 55862306a36Sopenharmony_cistatic __attribute__((unused)) 55962306a36Sopenharmony_ciint sys_link(const char *old, const char *new) 56062306a36Sopenharmony_ci{ 56162306a36Sopenharmony_ci#ifdef __NR_linkat 56262306a36Sopenharmony_ci return my_syscall5(__NR_linkat, AT_FDCWD, old, AT_FDCWD, new, 0); 56362306a36Sopenharmony_ci#elif defined(__NR_link) 56462306a36Sopenharmony_ci return my_syscall2(__NR_link, old, new); 56562306a36Sopenharmony_ci#else 56662306a36Sopenharmony_ci return -ENOSYS; 56762306a36Sopenharmony_ci#endif 56862306a36Sopenharmony_ci} 56962306a36Sopenharmony_ci 57062306a36Sopenharmony_cistatic __attribute__((unused)) 57162306a36Sopenharmony_ciint link(const char *old, const char *new) 57262306a36Sopenharmony_ci{ 57362306a36Sopenharmony_ci return __sysret(sys_link(old, new)); 57462306a36Sopenharmony_ci} 57562306a36Sopenharmony_ci 57662306a36Sopenharmony_ci 57762306a36Sopenharmony_ci/* 57862306a36Sopenharmony_ci * off_t lseek(int fd, off_t offset, int whence); 57962306a36Sopenharmony_ci */ 58062306a36Sopenharmony_ci 58162306a36Sopenharmony_cistatic __attribute__((unused)) 58262306a36Sopenharmony_cioff_t sys_lseek(int fd, off_t offset, int whence) 58362306a36Sopenharmony_ci{ 58462306a36Sopenharmony_ci#ifdef __NR_lseek 58562306a36Sopenharmony_ci return my_syscall3(__NR_lseek, fd, offset, whence); 58662306a36Sopenharmony_ci#else 58762306a36Sopenharmony_ci return -ENOSYS; 58862306a36Sopenharmony_ci#endif 58962306a36Sopenharmony_ci} 59062306a36Sopenharmony_ci 59162306a36Sopenharmony_cistatic __attribute__((unused)) 59262306a36Sopenharmony_cioff_t lseek(int fd, off_t offset, int whence) 59362306a36Sopenharmony_ci{ 59462306a36Sopenharmony_ci return __sysret(sys_lseek(fd, offset, whence)); 59562306a36Sopenharmony_ci} 59662306a36Sopenharmony_ci 59762306a36Sopenharmony_ci 59862306a36Sopenharmony_ci/* 59962306a36Sopenharmony_ci * int mkdir(const char *path, mode_t mode); 60062306a36Sopenharmony_ci */ 60162306a36Sopenharmony_ci 60262306a36Sopenharmony_cistatic __attribute__((unused)) 60362306a36Sopenharmony_ciint sys_mkdir(const char *path, mode_t mode) 60462306a36Sopenharmony_ci{ 60562306a36Sopenharmony_ci#ifdef __NR_mkdirat 60662306a36Sopenharmony_ci return my_syscall3(__NR_mkdirat, AT_FDCWD, path, mode); 60762306a36Sopenharmony_ci#elif defined(__NR_mkdir) 60862306a36Sopenharmony_ci return my_syscall2(__NR_mkdir, path, mode); 60962306a36Sopenharmony_ci#else 61062306a36Sopenharmony_ci return -ENOSYS; 61162306a36Sopenharmony_ci#endif 61262306a36Sopenharmony_ci} 61362306a36Sopenharmony_ci 61462306a36Sopenharmony_cistatic __attribute__((unused)) 61562306a36Sopenharmony_ciint mkdir(const char *path, mode_t mode) 61662306a36Sopenharmony_ci{ 61762306a36Sopenharmony_ci return __sysret(sys_mkdir(path, mode)); 61862306a36Sopenharmony_ci} 61962306a36Sopenharmony_ci 62062306a36Sopenharmony_ci/* 62162306a36Sopenharmony_ci * int rmdir(const char *path); 62262306a36Sopenharmony_ci */ 62362306a36Sopenharmony_ci 62462306a36Sopenharmony_cistatic __attribute__((unused)) 62562306a36Sopenharmony_ciint sys_rmdir(const char *path) 62662306a36Sopenharmony_ci{ 62762306a36Sopenharmony_ci#ifdef __NR_rmdir 62862306a36Sopenharmony_ci return my_syscall1(__NR_rmdir, path); 62962306a36Sopenharmony_ci#elif defined(__NR_unlinkat) 63062306a36Sopenharmony_ci return my_syscall3(__NR_unlinkat, AT_FDCWD, path, AT_REMOVEDIR); 63162306a36Sopenharmony_ci#else 63262306a36Sopenharmony_ci return -ENOSYS; 63362306a36Sopenharmony_ci#endif 63462306a36Sopenharmony_ci} 63562306a36Sopenharmony_ci 63662306a36Sopenharmony_cistatic __attribute__((unused)) 63762306a36Sopenharmony_ciint rmdir(const char *path) 63862306a36Sopenharmony_ci{ 63962306a36Sopenharmony_ci return __sysret(sys_rmdir(path)); 64062306a36Sopenharmony_ci} 64162306a36Sopenharmony_ci 64262306a36Sopenharmony_ci 64362306a36Sopenharmony_ci/* 64462306a36Sopenharmony_ci * int mknod(const char *path, mode_t mode, dev_t dev); 64562306a36Sopenharmony_ci */ 64662306a36Sopenharmony_ci 64762306a36Sopenharmony_cistatic __attribute__((unused)) 64862306a36Sopenharmony_cilong sys_mknod(const char *path, mode_t mode, dev_t dev) 64962306a36Sopenharmony_ci{ 65062306a36Sopenharmony_ci#ifdef __NR_mknodat 65162306a36Sopenharmony_ci return my_syscall4(__NR_mknodat, AT_FDCWD, path, mode, dev); 65262306a36Sopenharmony_ci#elif defined(__NR_mknod) 65362306a36Sopenharmony_ci return my_syscall3(__NR_mknod, path, mode, dev); 65462306a36Sopenharmony_ci#else 65562306a36Sopenharmony_ci return -ENOSYS; 65662306a36Sopenharmony_ci#endif 65762306a36Sopenharmony_ci} 65862306a36Sopenharmony_ci 65962306a36Sopenharmony_cistatic __attribute__((unused)) 66062306a36Sopenharmony_ciint mknod(const char *path, mode_t mode, dev_t dev) 66162306a36Sopenharmony_ci{ 66262306a36Sopenharmony_ci return __sysret(sys_mknod(path, mode, dev)); 66362306a36Sopenharmony_ci} 66462306a36Sopenharmony_ci 66562306a36Sopenharmony_ci#ifndef sys_mmap 66662306a36Sopenharmony_cistatic __attribute__((unused)) 66762306a36Sopenharmony_civoid *sys_mmap(void *addr, size_t length, int prot, int flags, int fd, 66862306a36Sopenharmony_ci off_t offset) 66962306a36Sopenharmony_ci{ 67062306a36Sopenharmony_ci int n; 67162306a36Sopenharmony_ci 67262306a36Sopenharmony_ci#if defined(__NR_mmap2) 67362306a36Sopenharmony_ci n = __NR_mmap2; 67462306a36Sopenharmony_ci offset >>= 12; 67562306a36Sopenharmony_ci#else 67662306a36Sopenharmony_ci n = __NR_mmap; 67762306a36Sopenharmony_ci#endif 67862306a36Sopenharmony_ci 67962306a36Sopenharmony_ci return (void *)my_syscall6(n, addr, length, prot, flags, fd, offset); 68062306a36Sopenharmony_ci} 68162306a36Sopenharmony_ci#endif 68262306a36Sopenharmony_ci 68362306a36Sopenharmony_ci/* Note that on Linux, MAP_FAILED is -1 so we can use the generic __sysret() 68462306a36Sopenharmony_ci * which returns -1 upon error and still satisfy user land that checks for 68562306a36Sopenharmony_ci * MAP_FAILED. 68662306a36Sopenharmony_ci */ 68762306a36Sopenharmony_ci 68862306a36Sopenharmony_cistatic __attribute__((unused)) 68962306a36Sopenharmony_civoid *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset) 69062306a36Sopenharmony_ci{ 69162306a36Sopenharmony_ci void *ret = sys_mmap(addr, length, prot, flags, fd, offset); 69262306a36Sopenharmony_ci 69362306a36Sopenharmony_ci if ((unsigned long)ret >= -4095UL) { 69462306a36Sopenharmony_ci SET_ERRNO(-(long)ret); 69562306a36Sopenharmony_ci ret = MAP_FAILED; 69662306a36Sopenharmony_ci } 69762306a36Sopenharmony_ci return ret; 69862306a36Sopenharmony_ci} 69962306a36Sopenharmony_ci 70062306a36Sopenharmony_cistatic __attribute__((unused)) 70162306a36Sopenharmony_ciint sys_munmap(void *addr, size_t length) 70262306a36Sopenharmony_ci{ 70362306a36Sopenharmony_ci return my_syscall2(__NR_munmap, addr, length); 70462306a36Sopenharmony_ci} 70562306a36Sopenharmony_ci 70662306a36Sopenharmony_cistatic __attribute__((unused)) 70762306a36Sopenharmony_ciint munmap(void *addr, size_t length) 70862306a36Sopenharmony_ci{ 70962306a36Sopenharmony_ci return __sysret(sys_munmap(addr, length)); 71062306a36Sopenharmony_ci} 71162306a36Sopenharmony_ci 71262306a36Sopenharmony_ci/* 71362306a36Sopenharmony_ci * int mount(const char *source, const char *target, 71462306a36Sopenharmony_ci * const char *fstype, unsigned long flags, 71562306a36Sopenharmony_ci * const void *data); 71662306a36Sopenharmony_ci */ 71762306a36Sopenharmony_cistatic __attribute__((unused)) 71862306a36Sopenharmony_ciint sys_mount(const char *src, const char *tgt, const char *fst, 71962306a36Sopenharmony_ci unsigned long flags, const void *data) 72062306a36Sopenharmony_ci{ 72162306a36Sopenharmony_ci return my_syscall5(__NR_mount, src, tgt, fst, flags, data); 72262306a36Sopenharmony_ci} 72362306a36Sopenharmony_ci 72462306a36Sopenharmony_cistatic __attribute__((unused)) 72562306a36Sopenharmony_ciint mount(const char *src, const char *tgt, 72662306a36Sopenharmony_ci const char *fst, unsigned long flags, 72762306a36Sopenharmony_ci const void *data) 72862306a36Sopenharmony_ci{ 72962306a36Sopenharmony_ci return __sysret(sys_mount(src, tgt, fst, flags, data)); 73062306a36Sopenharmony_ci} 73162306a36Sopenharmony_ci 73262306a36Sopenharmony_ci 73362306a36Sopenharmony_ci/* 73462306a36Sopenharmony_ci * int open(const char *path, int flags[, mode_t mode]); 73562306a36Sopenharmony_ci */ 73662306a36Sopenharmony_ci 73762306a36Sopenharmony_cistatic __attribute__((unused)) 73862306a36Sopenharmony_ciint sys_open(const char *path, int flags, mode_t mode) 73962306a36Sopenharmony_ci{ 74062306a36Sopenharmony_ci#ifdef __NR_openat 74162306a36Sopenharmony_ci return my_syscall4(__NR_openat, AT_FDCWD, path, flags, mode); 74262306a36Sopenharmony_ci#elif defined(__NR_open) 74362306a36Sopenharmony_ci return my_syscall3(__NR_open, path, flags, mode); 74462306a36Sopenharmony_ci#else 74562306a36Sopenharmony_ci return -ENOSYS; 74662306a36Sopenharmony_ci#endif 74762306a36Sopenharmony_ci} 74862306a36Sopenharmony_ci 74962306a36Sopenharmony_cistatic __attribute__((unused)) 75062306a36Sopenharmony_ciint open(const char *path, int flags, ...) 75162306a36Sopenharmony_ci{ 75262306a36Sopenharmony_ci mode_t mode = 0; 75362306a36Sopenharmony_ci 75462306a36Sopenharmony_ci if (flags & O_CREAT) { 75562306a36Sopenharmony_ci va_list args; 75662306a36Sopenharmony_ci 75762306a36Sopenharmony_ci va_start(args, flags); 75862306a36Sopenharmony_ci mode = va_arg(args, int); 75962306a36Sopenharmony_ci va_end(args); 76062306a36Sopenharmony_ci } 76162306a36Sopenharmony_ci 76262306a36Sopenharmony_ci return __sysret(sys_open(path, flags, mode)); 76362306a36Sopenharmony_ci} 76462306a36Sopenharmony_ci 76562306a36Sopenharmony_ci 76662306a36Sopenharmony_ci/* 76762306a36Sopenharmony_ci * int pipe2(int pipefd[2], int flags); 76862306a36Sopenharmony_ci * int pipe(int pipefd[2]); 76962306a36Sopenharmony_ci */ 77062306a36Sopenharmony_ci 77162306a36Sopenharmony_cistatic __attribute__((unused)) 77262306a36Sopenharmony_ciint sys_pipe2(int pipefd[2], int flags) 77362306a36Sopenharmony_ci{ 77462306a36Sopenharmony_ci return my_syscall2(__NR_pipe2, pipefd, flags); 77562306a36Sopenharmony_ci} 77662306a36Sopenharmony_ci 77762306a36Sopenharmony_cistatic __attribute__((unused)) 77862306a36Sopenharmony_ciint pipe2(int pipefd[2], int flags) 77962306a36Sopenharmony_ci{ 78062306a36Sopenharmony_ci return __sysret(sys_pipe2(pipefd, flags)); 78162306a36Sopenharmony_ci} 78262306a36Sopenharmony_ci 78362306a36Sopenharmony_cistatic __attribute__((unused)) 78462306a36Sopenharmony_ciint pipe(int pipefd[2]) 78562306a36Sopenharmony_ci{ 78662306a36Sopenharmony_ci return pipe2(pipefd, 0); 78762306a36Sopenharmony_ci} 78862306a36Sopenharmony_ci 78962306a36Sopenharmony_ci 79062306a36Sopenharmony_ci/* 79162306a36Sopenharmony_ci * int prctl(int option, unsigned long arg2, unsigned long arg3, 79262306a36Sopenharmony_ci * unsigned long arg4, unsigned long arg5); 79362306a36Sopenharmony_ci */ 79462306a36Sopenharmony_ci 79562306a36Sopenharmony_cistatic __attribute__((unused)) 79662306a36Sopenharmony_ciint sys_prctl(int option, unsigned long arg2, unsigned long arg3, 79762306a36Sopenharmony_ci unsigned long arg4, unsigned long arg5) 79862306a36Sopenharmony_ci{ 79962306a36Sopenharmony_ci return my_syscall5(__NR_prctl, option, arg2, arg3, arg4, arg5); 80062306a36Sopenharmony_ci} 80162306a36Sopenharmony_ci 80262306a36Sopenharmony_cistatic __attribute__((unused)) 80362306a36Sopenharmony_ciint prctl(int option, unsigned long arg2, unsigned long arg3, 80462306a36Sopenharmony_ci unsigned long arg4, unsigned long arg5) 80562306a36Sopenharmony_ci{ 80662306a36Sopenharmony_ci return __sysret(sys_prctl(option, arg2, arg3, arg4, arg5)); 80762306a36Sopenharmony_ci} 80862306a36Sopenharmony_ci 80962306a36Sopenharmony_ci 81062306a36Sopenharmony_ci/* 81162306a36Sopenharmony_ci * int pivot_root(const char *new, const char *old); 81262306a36Sopenharmony_ci */ 81362306a36Sopenharmony_ci 81462306a36Sopenharmony_cistatic __attribute__((unused)) 81562306a36Sopenharmony_ciint sys_pivot_root(const char *new, const char *old) 81662306a36Sopenharmony_ci{ 81762306a36Sopenharmony_ci return my_syscall2(__NR_pivot_root, new, old); 81862306a36Sopenharmony_ci} 81962306a36Sopenharmony_ci 82062306a36Sopenharmony_cistatic __attribute__((unused)) 82162306a36Sopenharmony_ciint pivot_root(const char *new, const char *old) 82262306a36Sopenharmony_ci{ 82362306a36Sopenharmony_ci return __sysret(sys_pivot_root(new, old)); 82462306a36Sopenharmony_ci} 82562306a36Sopenharmony_ci 82662306a36Sopenharmony_ci 82762306a36Sopenharmony_ci/* 82862306a36Sopenharmony_ci * int poll(struct pollfd *fds, int nfds, int timeout); 82962306a36Sopenharmony_ci */ 83062306a36Sopenharmony_ci 83162306a36Sopenharmony_cistatic __attribute__((unused)) 83262306a36Sopenharmony_ciint sys_poll(struct pollfd *fds, int nfds, int timeout) 83362306a36Sopenharmony_ci{ 83462306a36Sopenharmony_ci#if defined(__NR_ppoll) 83562306a36Sopenharmony_ci struct timespec t; 83662306a36Sopenharmony_ci 83762306a36Sopenharmony_ci if (timeout >= 0) { 83862306a36Sopenharmony_ci t.tv_sec = timeout / 1000; 83962306a36Sopenharmony_ci t.tv_nsec = (timeout % 1000) * 1000000; 84062306a36Sopenharmony_ci } 84162306a36Sopenharmony_ci return my_syscall5(__NR_ppoll, fds, nfds, (timeout >= 0) ? &t : NULL, NULL, 0); 84262306a36Sopenharmony_ci#elif defined(__NR_poll) 84362306a36Sopenharmony_ci return my_syscall3(__NR_poll, fds, nfds, timeout); 84462306a36Sopenharmony_ci#else 84562306a36Sopenharmony_ci return -ENOSYS; 84662306a36Sopenharmony_ci#endif 84762306a36Sopenharmony_ci} 84862306a36Sopenharmony_ci 84962306a36Sopenharmony_cistatic __attribute__((unused)) 85062306a36Sopenharmony_ciint poll(struct pollfd *fds, int nfds, int timeout) 85162306a36Sopenharmony_ci{ 85262306a36Sopenharmony_ci return __sysret(sys_poll(fds, nfds, timeout)); 85362306a36Sopenharmony_ci} 85462306a36Sopenharmony_ci 85562306a36Sopenharmony_ci 85662306a36Sopenharmony_ci/* 85762306a36Sopenharmony_ci * ssize_t read(int fd, void *buf, size_t count); 85862306a36Sopenharmony_ci */ 85962306a36Sopenharmony_ci 86062306a36Sopenharmony_cistatic __attribute__((unused)) 86162306a36Sopenharmony_cissize_t sys_read(int fd, void *buf, size_t count) 86262306a36Sopenharmony_ci{ 86362306a36Sopenharmony_ci return my_syscall3(__NR_read, fd, buf, count); 86462306a36Sopenharmony_ci} 86562306a36Sopenharmony_ci 86662306a36Sopenharmony_cistatic __attribute__((unused)) 86762306a36Sopenharmony_cissize_t read(int fd, void *buf, size_t count) 86862306a36Sopenharmony_ci{ 86962306a36Sopenharmony_ci return __sysret(sys_read(fd, buf, count)); 87062306a36Sopenharmony_ci} 87162306a36Sopenharmony_ci 87262306a36Sopenharmony_ci 87362306a36Sopenharmony_ci/* 87462306a36Sopenharmony_ci * int reboot(int cmd); 87562306a36Sopenharmony_ci * <cmd> is among LINUX_REBOOT_CMD_* 87662306a36Sopenharmony_ci */ 87762306a36Sopenharmony_ci 87862306a36Sopenharmony_cistatic __attribute__((unused)) 87962306a36Sopenharmony_cissize_t sys_reboot(int magic1, int magic2, int cmd, void *arg) 88062306a36Sopenharmony_ci{ 88162306a36Sopenharmony_ci return my_syscall4(__NR_reboot, magic1, magic2, cmd, arg); 88262306a36Sopenharmony_ci} 88362306a36Sopenharmony_ci 88462306a36Sopenharmony_cistatic __attribute__((unused)) 88562306a36Sopenharmony_ciint reboot(int cmd) 88662306a36Sopenharmony_ci{ 88762306a36Sopenharmony_ci return __sysret(sys_reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, cmd, 0)); 88862306a36Sopenharmony_ci} 88962306a36Sopenharmony_ci 89062306a36Sopenharmony_ci 89162306a36Sopenharmony_ci/* 89262306a36Sopenharmony_ci * int sched_yield(void); 89362306a36Sopenharmony_ci */ 89462306a36Sopenharmony_ci 89562306a36Sopenharmony_cistatic __attribute__((unused)) 89662306a36Sopenharmony_ciint sys_sched_yield(void) 89762306a36Sopenharmony_ci{ 89862306a36Sopenharmony_ci return my_syscall0(__NR_sched_yield); 89962306a36Sopenharmony_ci} 90062306a36Sopenharmony_ci 90162306a36Sopenharmony_cistatic __attribute__((unused)) 90262306a36Sopenharmony_ciint sched_yield(void) 90362306a36Sopenharmony_ci{ 90462306a36Sopenharmony_ci return __sysret(sys_sched_yield()); 90562306a36Sopenharmony_ci} 90662306a36Sopenharmony_ci 90762306a36Sopenharmony_ci 90862306a36Sopenharmony_ci/* 90962306a36Sopenharmony_ci * int select(int nfds, fd_set *read_fds, fd_set *write_fds, 91062306a36Sopenharmony_ci * fd_set *except_fds, struct timeval *timeout); 91162306a36Sopenharmony_ci */ 91262306a36Sopenharmony_ci 91362306a36Sopenharmony_cistatic __attribute__((unused)) 91462306a36Sopenharmony_ciint sys_select(int nfds, fd_set *rfds, fd_set *wfds, fd_set *efds, struct timeval *timeout) 91562306a36Sopenharmony_ci{ 91662306a36Sopenharmony_ci#if defined(__ARCH_WANT_SYS_OLD_SELECT) && !defined(__NR__newselect) 91762306a36Sopenharmony_ci struct sel_arg_struct { 91862306a36Sopenharmony_ci unsigned long n; 91962306a36Sopenharmony_ci fd_set *r, *w, *e; 92062306a36Sopenharmony_ci struct timeval *t; 92162306a36Sopenharmony_ci } arg = { .n = nfds, .r = rfds, .w = wfds, .e = efds, .t = timeout }; 92262306a36Sopenharmony_ci return my_syscall1(__NR_select, &arg); 92362306a36Sopenharmony_ci#elif defined(__ARCH_WANT_SYS_PSELECT6) && defined(__NR_pselect6) 92462306a36Sopenharmony_ci struct timespec t; 92562306a36Sopenharmony_ci 92662306a36Sopenharmony_ci if (timeout) { 92762306a36Sopenharmony_ci t.tv_sec = timeout->tv_sec; 92862306a36Sopenharmony_ci t.tv_nsec = timeout->tv_usec * 1000; 92962306a36Sopenharmony_ci } 93062306a36Sopenharmony_ci return my_syscall6(__NR_pselect6, nfds, rfds, wfds, efds, timeout ? &t : NULL, NULL); 93162306a36Sopenharmony_ci#elif defined(__NR__newselect) || defined(__NR_select) 93262306a36Sopenharmony_ci#ifndef __NR__newselect 93362306a36Sopenharmony_ci#define __NR__newselect __NR_select 93462306a36Sopenharmony_ci#endif 93562306a36Sopenharmony_ci return my_syscall5(__NR__newselect, nfds, rfds, wfds, efds, timeout); 93662306a36Sopenharmony_ci#else 93762306a36Sopenharmony_ci return -ENOSYS; 93862306a36Sopenharmony_ci#endif 93962306a36Sopenharmony_ci} 94062306a36Sopenharmony_ci 94162306a36Sopenharmony_cistatic __attribute__((unused)) 94262306a36Sopenharmony_ciint select(int nfds, fd_set *rfds, fd_set *wfds, fd_set *efds, struct timeval *timeout) 94362306a36Sopenharmony_ci{ 94462306a36Sopenharmony_ci return __sysret(sys_select(nfds, rfds, wfds, efds, timeout)); 94562306a36Sopenharmony_ci} 94662306a36Sopenharmony_ci 94762306a36Sopenharmony_ci 94862306a36Sopenharmony_ci/* 94962306a36Sopenharmony_ci * int setpgid(pid_t pid, pid_t pgid); 95062306a36Sopenharmony_ci */ 95162306a36Sopenharmony_ci 95262306a36Sopenharmony_cistatic __attribute__((unused)) 95362306a36Sopenharmony_ciint sys_setpgid(pid_t pid, pid_t pgid) 95462306a36Sopenharmony_ci{ 95562306a36Sopenharmony_ci return my_syscall2(__NR_setpgid, pid, pgid); 95662306a36Sopenharmony_ci} 95762306a36Sopenharmony_ci 95862306a36Sopenharmony_cistatic __attribute__((unused)) 95962306a36Sopenharmony_ciint setpgid(pid_t pid, pid_t pgid) 96062306a36Sopenharmony_ci{ 96162306a36Sopenharmony_ci return __sysret(sys_setpgid(pid, pgid)); 96262306a36Sopenharmony_ci} 96362306a36Sopenharmony_ci 96462306a36Sopenharmony_ci 96562306a36Sopenharmony_ci/* 96662306a36Sopenharmony_ci * pid_t setsid(void); 96762306a36Sopenharmony_ci */ 96862306a36Sopenharmony_ci 96962306a36Sopenharmony_cistatic __attribute__((unused)) 97062306a36Sopenharmony_cipid_t sys_setsid(void) 97162306a36Sopenharmony_ci{ 97262306a36Sopenharmony_ci return my_syscall0(__NR_setsid); 97362306a36Sopenharmony_ci} 97462306a36Sopenharmony_ci 97562306a36Sopenharmony_cistatic __attribute__((unused)) 97662306a36Sopenharmony_cipid_t setsid(void) 97762306a36Sopenharmony_ci{ 97862306a36Sopenharmony_ci return __sysret(sys_setsid()); 97962306a36Sopenharmony_ci} 98062306a36Sopenharmony_ci 98162306a36Sopenharmony_ci/* 98262306a36Sopenharmony_ci * int statx(int fd, const char *path, int flags, unsigned int mask, struct statx *buf); 98362306a36Sopenharmony_ci * int stat(const char *path, struct stat *buf); 98462306a36Sopenharmony_ci */ 98562306a36Sopenharmony_ci 98662306a36Sopenharmony_cistatic __attribute__((unused)) 98762306a36Sopenharmony_ciint sys_statx(int fd, const char *path, int flags, unsigned int mask, struct statx *buf) 98862306a36Sopenharmony_ci{ 98962306a36Sopenharmony_ci#ifdef __NR_statx 99062306a36Sopenharmony_ci return my_syscall5(__NR_statx, fd, path, flags, mask, buf); 99162306a36Sopenharmony_ci#else 99262306a36Sopenharmony_ci return -ENOSYS; 99362306a36Sopenharmony_ci#endif 99462306a36Sopenharmony_ci} 99562306a36Sopenharmony_ci 99662306a36Sopenharmony_cistatic __attribute__((unused)) 99762306a36Sopenharmony_ciint statx(int fd, const char *path, int flags, unsigned int mask, struct statx *buf) 99862306a36Sopenharmony_ci{ 99962306a36Sopenharmony_ci return __sysret(sys_statx(fd, path, flags, mask, buf)); 100062306a36Sopenharmony_ci} 100162306a36Sopenharmony_ci 100262306a36Sopenharmony_ci 100362306a36Sopenharmony_cistatic __attribute__((unused)) 100462306a36Sopenharmony_ciint stat(const char *path, struct stat *buf) 100562306a36Sopenharmony_ci{ 100662306a36Sopenharmony_ci struct statx statx; 100762306a36Sopenharmony_ci long ret; 100862306a36Sopenharmony_ci 100962306a36Sopenharmony_ci ret = __sysret(sys_statx(AT_FDCWD, path, AT_NO_AUTOMOUNT, STATX_BASIC_STATS, &statx)); 101062306a36Sopenharmony_ci if (ret == -1) 101162306a36Sopenharmony_ci return ret; 101262306a36Sopenharmony_ci 101362306a36Sopenharmony_ci buf->st_dev = ((statx.stx_dev_minor & 0xff) 101462306a36Sopenharmony_ci | (statx.stx_dev_major << 8) 101562306a36Sopenharmony_ci | ((statx.stx_dev_minor & ~0xff) << 12)); 101662306a36Sopenharmony_ci buf->st_ino = statx.stx_ino; 101762306a36Sopenharmony_ci buf->st_mode = statx.stx_mode; 101862306a36Sopenharmony_ci buf->st_nlink = statx.stx_nlink; 101962306a36Sopenharmony_ci buf->st_uid = statx.stx_uid; 102062306a36Sopenharmony_ci buf->st_gid = statx.stx_gid; 102162306a36Sopenharmony_ci buf->st_rdev = ((statx.stx_rdev_minor & 0xff) 102262306a36Sopenharmony_ci | (statx.stx_rdev_major << 8) 102362306a36Sopenharmony_ci | ((statx.stx_rdev_minor & ~0xff) << 12)); 102462306a36Sopenharmony_ci buf->st_size = statx.stx_size; 102562306a36Sopenharmony_ci buf->st_blksize = statx.stx_blksize; 102662306a36Sopenharmony_ci buf->st_blocks = statx.stx_blocks; 102762306a36Sopenharmony_ci buf->st_atim.tv_sec = statx.stx_atime.tv_sec; 102862306a36Sopenharmony_ci buf->st_atim.tv_nsec = statx.stx_atime.tv_nsec; 102962306a36Sopenharmony_ci buf->st_mtim.tv_sec = statx.stx_mtime.tv_sec; 103062306a36Sopenharmony_ci buf->st_mtim.tv_nsec = statx.stx_mtime.tv_nsec; 103162306a36Sopenharmony_ci buf->st_ctim.tv_sec = statx.stx_ctime.tv_sec; 103262306a36Sopenharmony_ci buf->st_ctim.tv_nsec = statx.stx_ctime.tv_nsec; 103362306a36Sopenharmony_ci 103462306a36Sopenharmony_ci return 0; 103562306a36Sopenharmony_ci} 103662306a36Sopenharmony_ci 103762306a36Sopenharmony_ci 103862306a36Sopenharmony_ci/* 103962306a36Sopenharmony_ci * int symlink(const char *old, const char *new); 104062306a36Sopenharmony_ci */ 104162306a36Sopenharmony_ci 104262306a36Sopenharmony_cistatic __attribute__((unused)) 104362306a36Sopenharmony_ciint sys_symlink(const char *old, const char *new) 104462306a36Sopenharmony_ci{ 104562306a36Sopenharmony_ci#ifdef __NR_symlinkat 104662306a36Sopenharmony_ci return my_syscall3(__NR_symlinkat, old, AT_FDCWD, new); 104762306a36Sopenharmony_ci#elif defined(__NR_symlink) 104862306a36Sopenharmony_ci return my_syscall2(__NR_symlink, old, new); 104962306a36Sopenharmony_ci#else 105062306a36Sopenharmony_ci return -ENOSYS; 105162306a36Sopenharmony_ci#endif 105262306a36Sopenharmony_ci} 105362306a36Sopenharmony_ci 105462306a36Sopenharmony_cistatic __attribute__((unused)) 105562306a36Sopenharmony_ciint symlink(const char *old, const char *new) 105662306a36Sopenharmony_ci{ 105762306a36Sopenharmony_ci return __sysret(sys_symlink(old, new)); 105862306a36Sopenharmony_ci} 105962306a36Sopenharmony_ci 106062306a36Sopenharmony_ci 106162306a36Sopenharmony_ci/* 106262306a36Sopenharmony_ci * mode_t umask(mode_t mode); 106362306a36Sopenharmony_ci */ 106462306a36Sopenharmony_ci 106562306a36Sopenharmony_cistatic __attribute__((unused)) 106662306a36Sopenharmony_cimode_t sys_umask(mode_t mode) 106762306a36Sopenharmony_ci{ 106862306a36Sopenharmony_ci return my_syscall1(__NR_umask, mode); 106962306a36Sopenharmony_ci} 107062306a36Sopenharmony_ci 107162306a36Sopenharmony_cistatic __attribute__((unused)) 107262306a36Sopenharmony_cimode_t umask(mode_t mode) 107362306a36Sopenharmony_ci{ 107462306a36Sopenharmony_ci return sys_umask(mode); 107562306a36Sopenharmony_ci} 107662306a36Sopenharmony_ci 107762306a36Sopenharmony_ci 107862306a36Sopenharmony_ci/* 107962306a36Sopenharmony_ci * int umount2(const char *path, int flags); 108062306a36Sopenharmony_ci */ 108162306a36Sopenharmony_ci 108262306a36Sopenharmony_cistatic __attribute__((unused)) 108362306a36Sopenharmony_ciint sys_umount2(const char *path, int flags) 108462306a36Sopenharmony_ci{ 108562306a36Sopenharmony_ci return my_syscall2(__NR_umount2, path, flags); 108662306a36Sopenharmony_ci} 108762306a36Sopenharmony_ci 108862306a36Sopenharmony_cistatic __attribute__((unused)) 108962306a36Sopenharmony_ciint umount2(const char *path, int flags) 109062306a36Sopenharmony_ci{ 109162306a36Sopenharmony_ci return __sysret(sys_umount2(path, flags)); 109262306a36Sopenharmony_ci} 109362306a36Sopenharmony_ci 109462306a36Sopenharmony_ci 109562306a36Sopenharmony_ci/* 109662306a36Sopenharmony_ci * int unlink(const char *path); 109762306a36Sopenharmony_ci */ 109862306a36Sopenharmony_ci 109962306a36Sopenharmony_cistatic __attribute__((unused)) 110062306a36Sopenharmony_ciint sys_unlink(const char *path) 110162306a36Sopenharmony_ci{ 110262306a36Sopenharmony_ci#ifdef __NR_unlinkat 110362306a36Sopenharmony_ci return my_syscall3(__NR_unlinkat, AT_FDCWD, path, 0); 110462306a36Sopenharmony_ci#elif defined(__NR_unlink) 110562306a36Sopenharmony_ci return my_syscall1(__NR_unlink, path); 110662306a36Sopenharmony_ci#else 110762306a36Sopenharmony_ci return -ENOSYS; 110862306a36Sopenharmony_ci#endif 110962306a36Sopenharmony_ci} 111062306a36Sopenharmony_ci 111162306a36Sopenharmony_cistatic __attribute__((unused)) 111262306a36Sopenharmony_ciint unlink(const char *path) 111362306a36Sopenharmony_ci{ 111462306a36Sopenharmony_ci return __sysret(sys_unlink(path)); 111562306a36Sopenharmony_ci} 111662306a36Sopenharmony_ci 111762306a36Sopenharmony_ci 111862306a36Sopenharmony_ci/* 111962306a36Sopenharmony_ci * pid_t wait(int *status); 112062306a36Sopenharmony_ci * pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage); 112162306a36Sopenharmony_ci * pid_t waitpid(pid_t pid, int *status, int options); 112262306a36Sopenharmony_ci */ 112362306a36Sopenharmony_ci 112462306a36Sopenharmony_cistatic __attribute__((unused)) 112562306a36Sopenharmony_cipid_t sys_wait4(pid_t pid, int *status, int options, struct rusage *rusage) 112662306a36Sopenharmony_ci{ 112762306a36Sopenharmony_ci#ifdef __NR_wait4 112862306a36Sopenharmony_ci return my_syscall4(__NR_wait4, pid, status, options, rusage); 112962306a36Sopenharmony_ci#else 113062306a36Sopenharmony_ci return -ENOSYS; 113162306a36Sopenharmony_ci#endif 113262306a36Sopenharmony_ci} 113362306a36Sopenharmony_ci 113462306a36Sopenharmony_cistatic __attribute__((unused)) 113562306a36Sopenharmony_cipid_t wait(int *status) 113662306a36Sopenharmony_ci{ 113762306a36Sopenharmony_ci return __sysret(sys_wait4(-1, status, 0, NULL)); 113862306a36Sopenharmony_ci} 113962306a36Sopenharmony_ci 114062306a36Sopenharmony_cistatic __attribute__((unused)) 114162306a36Sopenharmony_cipid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage) 114262306a36Sopenharmony_ci{ 114362306a36Sopenharmony_ci return __sysret(sys_wait4(pid, status, options, rusage)); 114462306a36Sopenharmony_ci} 114562306a36Sopenharmony_ci 114662306a36Sopenharmony_ci 114762306a36Sopenharmony_cistatic __attribute__((unused)) 114862306a36Sopenharmony_cipid_t waitpid(pid_t pid, int *status, int options) 114962306a36Sopenharmony_ci{ 115062306a36Sopenharmony_ci return __sysret(sys_wait4(pid, status, options, NULL)); 115162306a36Sopenharmony_ci} 115262306a36Sopenharmony_ci 115362306a36Sopenharmony_ci 115462306a36Sopenharmony_ci/* 115562306a36Sopenharmony_ci * ssize_t write(int fd, const void *buf, size_t count); 115662306a36Sopenharmony_ci */ 115762306a36Sopenharmony_ci 115862306a36Sopenharmony_cistatic __attribute__((unused)) 115962306a36Sopenharmony_cissize_t sys_write(int fd, const void *buf, size_t count) 116062306a36Sopenharmony_ci{ 116162306a36Sopenharmony_ci return my_syscall3(__NR_write, fd, buf, count); 116262306a36Sopenharmony_ci} 116362306a36Sopenharmony_ci 116462306a36Sopenharmony_cistatic __attribute__((unused)) 116562306a36Sopenharmony_cissize_t write(int fd, const void *buf, size_t count) 116662306a36Sopenharmony_ci{ 116762306a36Sopenharmony_ci return __sysret(sys_write(fd, buf, count)); 116862306a36Sopenharmony_ci} 116962306a36Sopenharmony_ci 117062306a36Sopenharmony_ci 117162306a36Sopenharmony_ci/* 117262306a36Sopenharmony_ci * int memfd_create(const char *name, unsigned int flags); 117362306a36Sopenharmony_ci */ 117462306a36Sopenharmony_ci 117562306a36Sopenharmony_cistatic __attribute__((unused)) 117662306a36Sopenharmony_ciint sys_memfd_create(const char *name, unsigned int flags) 117762306a36Sopenharmony_ci{ 117862306a36Sopenharmony_ci return my_syscall2(__NR_memfd_create, name, flags); 117962306a36Sopenharmony_ci} 118062306a36Sopenharmony_ci 118162306a36Sopenharmony_cistatic __attribute__((unused)) 118262306a36Sopenharmony_ciint memfd_create(const char *name, unsigned int flags) 118362306a36Sopenharmony_ci{ 118462306a36Sopenharmony_ci return __sysret(sys_memfd_create(name, flags)); 118562306a36Sopenharmony_ci} 118662306a36Sopenharmony_ci 118762306a36Sopenharmony_ci/* make sure to include all global symbols */ 118862306a36Sopenharmony_ci#include "nolibc.h" 118962306a36Sopenharmony_ci 119062306a36Sopenharmony_ci#endif /* _NOLIBC_SYS_H */ 1191