diff options
Diffstat (limited to 'tools/include/nolibc/sys.h')
| -rw-r--r-- | tools/include/nolibc/sys.h | 100 | 
1 files changed, 99 insertions, 1 deletions
diff --git a/tools/include/nolibc/sys.h b/tools/include/nolibc/sys.h index b5f8cd35c03b..5d624dc63a42 100644 --- a/tools/include/nolibc/sys.h +++ b/tools/include/nolibc/sys.h @@ -11,7 +11,6 @@  #include "std.h"  /* system includes */ -#include <asm/fcntl.h>   // for O_*  #include <asm/unistd.h>  #include <asm/signal.h>  // for SIGCHLD  #include <asm/ioctls.h> @@ -20,6 +19,8 @@  #include <linux/loop.h>  #include <linux/time.h>  #include <linux/auxvec.h> +#include <linux/fcntl.h> // for O_* and AT_* +#include <linux/stat.h>  // for statx()  #include "arch.h"  #include "errno.h" @@ -411,6 +412,27 @@ int getdents64(int fd, struct linux_dirent64 *dirp, int count)  /* + * uid_t geteuid(void); + */ + +static __attribute__((unused)) +uid_t sys_geteuid(void) +{ +#ifdef __NR_geteuid32 +	return my_syscall0(__NR_geteuid32); +#else +	return my_syscall0(__NR_geteuid); +#endif +} + +static __attribute__((unused)) +uid_t geteuid(void) +{ +	return sys_geteuid(); +} + + +/*   * pid_t getpgid(pid_t pid);   */ @@ -545,6 +567,27 @@ int gettimeofday(struct timeval *tv, struct timezone *tz)  /* + * uid_t getuid(void); + */ + +static __attribute__((unused)) +uid_t sys_getuid(void) +{ +#ifdef __NR_getuid32 +	return my_syscall0(__NR_getuid32); +#else +	return my_syscall0(__NR_getuid); +#endif +} + +static __attribute__((unused)) +uid_t getuid(void) +{ +	return sys_getuid(); +} + + +/*   * int ioctl(int fd, unsigned long req, void *value);   */ @@ -1048,12 +1091,66 @@ pid_t setsid(void)  	return ret;  } +#if defined(__NR_statx) +/* + * int statx(int fd, const char *path, int flags, unsigned int mask, struct statx *buf); + */ + +static __attribute__((unused)) +int sys_statx(int fd, const char *path, int flags, unsigned int mask, struct statx *buf) +{ +	return my_syscall5(__NR_statx, fd, path, flags, mask, buf); +} + +static __attribute__((unused)) +int statx(int fd, const char *path, int flags, unsigned int mask, struct statx *buf) +{ +	int ret = sys_statx(fd, path, flags, mask, buf); + +	if (ret < 0) { +		SET_ERRNO(-ret); +		ret = -1; +	} +	return ret; +} +#endif  /*   * int stat(const char *path, struct stat *buf);   * Warning: the struct stat's layout is arch-dependent.   */ +#if defined(__NR_statx) && !defined(__NR_newfstatat) && !defined(__NR_stat) +/* + * Maybe we can just use statx() when available for all architectures? + */ +static __attribute__((unused)) +int sys_stat(const char *path, struct stat *buf) +{ +	struct statx statx; +	long ret; + +	ret = sys_statx(AT_FDCWD, path, AT_NO_AUTOMOUNT, STATX_BASIC_STATS, &statx); +	buf->st_dev     = ((statx.stx_dev_minor & 0xff) +			  | (statx.stx_dev_major << 8) +			  | ((statx.stx_dev_minor & ~0xff) << 12)); +	buf->st_ino     = statx.stx_ino; +	buf->st_mode    = statx.stx_mode; +	buf->st_nlink   = statx.stx_nlink; +	buf->st_uid     = statx.stx_uid; +	buf->st_gid     = statx.stx_gid; +	buf->st_rdev    = ((statx.stx_rdev_minor & 0xff) +			  | (statx.stx_rdev_major << 8) +			  | ((statx.stx_rdev_minor & ~0xff) << 12)); +	buf->st_size    = statx.stx_size; +	buf->st_blksize = statx.stx_blksize; +	buf->st_blocks  = statx.stx_blocks; +	buf->st_atime   = statx.stx_atime.tv_sec; +	buf->st_mtime   = statx.stx_mtime.tv_sec; +	buf->st_ctime   = statx.stx_ctime.tv_sec; +	return ret; +} +#else  static __attribute__((unused))  int sys_stat(const char *path, struct stat *buf)  { @@ -1083,6 +1180,7 @@ int sys_stat(const char *path, struct stat *buf)  	buf->st_ctime   = stat.st_ctime;  	return ret;  } +#endif  static __attribute__((unused))  int stat(const char *path, struct stat *buf)  |