tools/nolibc: remove the old sys_stat support
The statx manpage [1] shows that it has been supported from Linux 4.11 and glibc 2.28, the Linux support can be checked for all of the architectures with this command: $ git grep -r statx v4.11 arch/ include/uapi/asm-generic/unistd.h \ | grep -E "aarch64|arm|mips|s390|x86|:include/uapi" Besides riscv and loongarch, all of the nolibc supported architectures have added sys_statx from Linux v4.11. riscv is mainlined to v4.15, loongarch is mainlined to v5.19, both of them use the generic unistd.h, so, they have added sys_statx from their first mainline versions. The current oldest stable branch is v4.14, only reserving sys_statx still preserves compatibility with all of the supported stable branches, So, let's remove the old arch related and dependent sys_stat support completely. This is friendly to the future new architecture porting. [1]: https://man7.org/linux/man-pages/man2/statx.2.html Signed-off-by: Zhangjin Wu <falcon@tinylab.org> Signed-off-by: Willy Tarreau <w@1wt.eu>
This commit is contained in:
parent
bff60150f7
commit
af93807eae
|
@ -9,34 +9,6 @@
|
|||
|
||||
#include "compiler.h"
|
||||
|
||||
/* The struct returned by the newfstatat() syscall. Differs slightly from the
|
||||
* x86_64's stat one by field ordering, so be careful.
|
||||
*/
|
||||
struct sys_stat_struct {
|
||||
unsigned long st_dev;
|
||||
unsigned long st_ino;
|
||||
unsigned int st_mode;
|
||||
unsigned int st_nlink;
|
||||
unsigned int st_uid;
|
||||
unsigned int st_gid;
|
||||
|
||||
unsigned long st_rdev;
|
||||
unsigned long __pad1;
|
||||
long st_size;
|
||||
int st_blksize;
|
||||
int __pad2;
|
||||
|
||||
long st_blocks;
|
||||
long st_atime;
|
||||
unsigned long st_atime_nsec;
|
||||
long st_mtime;
|
||||
|
||||
unsigned long st_mtime_nsec;
|
||||
long st_ctime;
|
||||
unsigned long st_ctime_nsec;
|
||||
unsigned int __unused[2];
|
||||
};
|
||||
|
||||
/* Syscalls for AARCH64 :
|
||||
* - registers are 64-bit
|
||||
* - stack is 16-byte aligned
|
||||
|
|
|
@ -9,43 +9,6 @@
|
|||
|
||||
#include "compiler.h"
|
||||
|
||||
/* The struct returned by the stat() syscall, 32-bit only, the syscall returns
|
||||
* exactly 56 bytes (stops before the unused array). In big endian, the format
|
||||
* differs as devices are returned as short only.
|
||||
*/
|
||||
struct sys_stat_struct {
|
||||
#if defined(__ARMEB__)
|
||||
unsigned short st_dev;
|
||||
unsigned short __pad1;
|
||||
#else
|
||||
unsigned long st_dev;
|
||||
#endif
|
||||
unsigned long st_ino;
|
||||
unsigned short st_mode;
|
||||
unsigned short st_nlink;
|
||||
unsigned short st_uid;
|
||||
unsigned short st_gid;
|
||||
|
||||
#if defined(__ARMEB__)
|
||||
unsigned short st_rdev;
|
||||
unsigned short __pad2;
|
||||
#else
|
||||
unsigned long st_rdev;
|
||||
#endif
|
||||
unsigned long st_size;
|
||||
unsigned long st_blksize;
|
||||
unsigned long st_blocks;
|
||||
|
||||
unsigned long st_atime;
|
||||
unsigned long st_atime_nsec;
|
||||
unsigned long st_mtime;
|
||||
unsigned long st_mtime_nsec;
|
||||
|
||||
unsigned long st_ctime;
|
||||
unsigned long st_ctime_nsec;
|
||||
unsigned long __unused[2];
|
||||
};
|
||||
|
||||
/* Syscalls for ARM in ARM or Thumb modes :
|
||||
* - registers are 32-bit
|
||||
* - stack is 8-byte aligned
|
||||
|
|
|
@ -9,32 +9,6 @@
|
|||
|
||||
#include "compiler.h"
|
||||
|
||||
/* The struct returned by the stat() syscall, 32-bit only, the syscall returns
|
||||
* exactly 56 bytes (stops before the unused array).
|
||||
*/
|
||||
struct sys_stat_struct {
|
||||
unsigned long st_dev;
|
||||
unsigned long st_ino;
|
||||
unsigned short st_mode;
|
||||
unsigned short st_nlink;
|
||||
unsigned short st_uid;
|
||||
unsigned short st_gid;
|
||||
|
||||
unsigned long st_rdev;
|
||||
unsigned long st_size;
|
||||
unsigned long st_blksize;
|
||||
unsigned long st_blocks;
|
||||
|
||||
unsigned long st_atime;
|
||||
unsigned long st_atime_nsec;
|
||||
unsigned long st_mtime;
|
||||
unsigned long st_mtime_nsec;
|
||||
|
||||
unsigned long st_ctime;
|
||||
unsigned long st_ctime_nsec;
|
||||
unsigned long __unused[2];
|
||||
};
|
||||
|
||||
/* Syscalls for i386 :
|
||||
* - mostly similar to x86_64
|
||||
* - registers are 32-bit
|
||||
|
|
|
@ -9,34 +9,6 @@
|
|||
|
||||
#include "compiler.h"
|
||||
|
||||
/* The struct returned by the stat() syscall. 88 bytes are returned by the
|
||||
* syscall.
|
||||
*/
|
||||
struct sys_stat_struct {
|
||||
unsigned int st_dev;
|
||||
long st_pad1[3];
|
||||
unsigned long st_ino;
|
||||
unsigned int st_mode;
|
||||
unsigned int st_nlink;
|
||||
unsigned int st_uid;
|
||||
unsigned int st_gid;
|
||||
unsigned int st_rdev;
|
||||
long st_pad2[2];
|
||||
long st_size;
|
||||
long st_pad3;
|
||||
|
||||
long st_atime;
|
||||
long st_atime_nsec;
|
||||
long st_mtime;
|
||||
long st_mtime_nsec;
|
||||
|
||||
long st_ctime;
|
||||
long st_ctime_nsec;
|
||||
long st_blksize;
|
||||
long st_blocks;
|
||||
long st_pad4[14];
|
||||
};
|
||||
|
||||
/* Syscalls for MIPS ABI O32 :
|
||||
* - WARNING! there's always a delayed slot!
|
||||
* - WARNING again, the syntax is different, registers take a '$' and numbers
|
||||
|
|
|
@ -9,29 +9,6 @@
|
|||
|
||||
#include "compiler.h"
|
||||
|
||||
struct sys_stat_struct {
|
||||
unsigned long st_dev; /* Device. */
|
||||
unsigned long st_ino; /* File serial number. */
|
||||
unsigned int st_mode; /* File mode. */
|
||||
unsigned int st_nlink; /* Link count. */
|
||||
unsigned int st_uid; /* User ID of the file's owner. */
|
||||
unsigned int st_gid; /* Group ID of the file's group. */
|
||||
unsigned long st_rdev; /* Device number, if device. */
|
||||
unsigned long __pad1;
|
||||
long st_size; /* Size of file, in bytes. */
|
||||
int st_blksize; /* Optimal block size for I/O. */
|
||||
int __pad2;
|
||||
long st_blocks; /* Number 512-byte blocks allocated. */
|
||||
long st_atime; /* Time of last access. */
|
||||
unsigned long st_atime_nsec;
|
||||
long st_mtime; /* Time of last modification. */
|
||||
unsigned long st_mtime_nsec;
|
||||
long st_ctime; /* Time of last status change. */
|
||||
unsigned long st_ctime_nsec;
|
||||
unsigned int __unused4;
|
||||
unsigned int __unused5;
|
||||
};
|
||||
|
||||
#if __riscv_xlen == 64
|
||||
#define PTRLOG "3"
|
||||
#define SZREG "8"
|
||||
|
|
|
@ -10,31 +10,6 @@
|
|||
|
||||
#include "compiler.h"
|
||||
|
||||
/* The struct returned by the stat() syscall, equivalent to stat64(). The
|
||||
* syscall returns 116 bytes and stops in the middle of __unused.
|
||||
*/
|
||||
|
||||
struct sys_stat_struct {
|
||||
unsigned long st_dev;
|
||||
unsigned long st_ino;
|
||||
unsigned long st_nlink;
|
||||
unsigned int st_mode;
|
||||
unsigned int st_uid;
|
||||
unsigned int st_gid;
|
||||
unsigned int __pad1;
|
||||
unsigned long st_rdev;
|
||||
unsigned long st_size;
|
||||
unsigned long st_atime;
|
||||
unsigned long st_atime_nsec;
|
||||
unsigned long st_mtime;
|
||||
unsigned long st_mtime_nsec;
|
||||
unsigned long st_ctime;
|
||||
unsigned long st_ctime_nsec;
|
||||
unsigned long st_blksize;
|
||||
long st_blocks;
|
||||
unsigned long __unused[3];
|
||||
};
|
||||
|
||||
/* Syscalls for s390:
|
||||
* - registers are 64-bit
|
||||
* - syscall number is passed in r1
|
||||
|
|
|
@ -9,33 +9,6 @@
|
|||
|
||||
#include "compiler.h"
|
||||
|
||||
/* The struct returned by the stat() syscall, equivalent to stat64(). The
|
||||
* syscall returns 116 bytes and stops in the middle of __unused.
|
||||
*/
|
||||
struct sys_stat_struct {
|
||||
unsigned long st_dev;
|
||||
unsigned long st_ino;
|
||||
unsigned long st_nlink;
|
||||
unsigned int st_mode;
|
||||
unsigned int st_uid;
|
||||
|
||||
unsigned int st_gid;
|
||||
unsigned int __pad0;
|
||||
unsigned long st_rdev;
|
||||
long st_size;
|
||||
long st_blksize;
|
||||
|
||||
long st_blocks;
|
||||
unsigned long st_atime;
|
||||
unsigned long st_atime_nsec;
|
||||
unsigned long st_mtime;
|
||||
|
||||
unsigned long st_mtime_nsec;
|
||||
unsigned long st_ctime;
|
||||
unsigned long st_ctime_nsec;
|
||||
long __unused[3];
|
||||
};
|
||||
|
||||
/* Syscalls for x86_64 :
|
||||
* - registers are 64-bit
|
||||
* - syscall number is passed in rax
|
||||
|
|
|
@ -943,15 +943,19 @@ pid_t setsid(void)
|
|||
return __sysret(sys_setsid());
|
||||
}
|
||||
|
||||
#if defined(__NR_statx)
|
||||
/*
|
||||
* int statx(int fd, const char *path, int flags, unsigned int mask, struct statx *buf);
|
||||
* int stat(const char *path, struct stat *buf);
|
||||
*/
|
||||
|
||||
static __attribute__((unused))
|
||||
int sys_statx(int fd, const char *path, int flags, unsigned int mask, struct statx *buf)
|
||||
{
|
||||
#ifdef __NR_statx
|
||||
return my_syscall5(__NR_statx, fd, path, flags, mask, buf);
|
||||
#else
|
||||
return -ENOSYS;
|
||||
#endif
|
||||
}
|
||||
|
||||
static __attribute__((unused))
|
||||
|
@ -959,24 +963,18 @@ int statx(int fd, const char *path, int flags, unsigned int mask, struct statx *
|
|||
{
|
||||
return __sysret(sys_statx(fd, path, flags, mask, buf));
|
||||
}
|
||||
#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)
|
||||
int 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);
|
||||
ret = __sysret(sys_statx(AT_FDCWD, path, AT_NO_AUTOMOUNT, STATX_BASIC_STATS, &statx));
|
||||
if (ret == -1)
|
||||
return ret;
|
||||
|
||||
buf->st_dev = ((statx.stx_dev_minor & 0xff)
|
||||
| (statx.stx_dev_major << 8)
|
||||
| ((statx.stx_dev_minor & ~0xff) << 12));
|
||||
|
@ -997,47 +995,8 @@ int sys_stat(const char *path, struct stat *buf)
|
|||
buf->st_mtim.tv_nsec = statx.stx_mtime.tv_nsec;
|
||||
buf->st_ctim.tv_sec = statx.stx_ctime.tv_sec;
|
||||
buf->st_ctim.tv_nsec = statx.stx_ctime.tv_nsec;
|
||||
return ret;
|
||||
}
|
||||
#else
|
||||
static __attribute__((unused))
|
||||
int sys_stat(const char *path, struct stat *buf)
|
||||
{
|
||||
struct sys_stat_struct stat;
|
||||
long ret;
|
||||
|
||||
#ifdef __NR_newfstatat
|
||||
/* only solution for arm64 */
|
||||
ret = my_syscall4(__NR_newfstatat, AT_FDCWD, path, &stat, 0);
|
||||
#elif defined(__NR_stat)
|
||||
ret = my_syscall2(__NR_stat, path, &stat);
|
||||
#else
|
||||
return -ENOSYS;
|
||||
#endif
|
||||
buf->st_dev = stat.st_dev;
|
||||
buf->st_ino = stat.st_ino;
|
||||
buf->st_mode = stat.st_mode;
|
||||
buf->st_nlink = stat.st_nlink;
|
||||
buf->st_uid = stat.st_uid;
|
||||
buf->st_gid = stat.st_gid;
|
||||
buf->st_rdev = stat.st_rdev;
|
||||
buf->st_size = stat.st_size;
|
||||
buf->st_blksize = stat.st_blksize;
|
||||
buf->st_blocks = stat.st_blocks;
|
||||
buf->st_atim.tv_sec = stat.st_atime;
|
||||
buf->st_atim.tv_nsec = stat.st_atime_nsec;
|
||||
buf->st_mtim.tv_sec = stat.st_mtime;
|
||||
buf->st_mtim.tv_nsec = stat.st_mtime_nsec;
|
||||
buf->st_ctim.tv_sec = stat.st_ctime;
|
||||
buf->st_ctim.tv_nsec = stat.st_ctime_nsec;
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
static __attribute__((unused))
|
||||
int stat(const char *path, struct stat *buf)
|
||||
{
|
||||
return __sysret(sys_stat(path, buf));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -15,8 +15,8 @@
|
|||
|
||||
|
||||
/* Only the generic macros and types may be defined here. The arch-specific
|
||||
* ones such as the O_RDONLY and related macros used by fcntl() and open(), or
|
||||
* the layout of sys_stat_struct must not be defined here.
|
||||
* ones such as the O_RDONLY and related macros used by fcntl() and open()
|
||||
* must not be defined here.
|
||||
*/
|
||||
|
||||
/* stat flags (WARNING, octal here). We need to check for an existing
|
||||
|
|
Loading…
Reference in New Issue