diff --git a/glnx-missing-syscall.h b/glnx-missing-syscall.h index c32a3f73..80e7b025 100644 --- a/glnx-missing-syscall.h +++ b/glnx-missing-syscall.h @@ -33,6 +33,7 @@ #include "libglnx-config.h" #include +#include #if !HAVE_DECL_RENAMEAT2 # ifndef __NR_renameat2 @@ -236,3 +237,150 @@ inline_close_range (unsigned int low, #define close_range(low, high, flags) inline_close_range(low, high, flags) #define HAVE_CLOSE_RANGE #endif + +#ifndef __IGNORE_statx +# if defined(__aarch64__) +# define systemd_NR_statx 291 +# elif defined(__alpha__) +# define systemd_NR_statx 522 +# elif defined(__arc__) || defined(__tilegx__) +# define systemd_NR_statx 291 +# elif defined(__arm__) +# define systemd_NR_statx 397 +# elif defined(__i386__) +# define systemd_NR_statx 383 +# elif defined(__ia64__) +# define systemd_NR_statx 1350 +# elif defined(__loongarch_lp64) +# define systemd_NR_statx 291 +# elif defined(__m68k__) +# define systemd_NR_statx 379 +# elif defined(_MIPS_SIM) +# if _MIPS_SIM == _MIPS_SIM_ABI32 +# define systemd_NR_statx 4366 +# elif _MIPS_SIM == _MIPS_SIM_NABI32 +# define systemd_NR_statx 6330 +# elif _MIPS_SIM == _MIPS_SIM_ABI64 +# define systemd_NR_statx 5326 +# else +# error "Unknown MIPS ABI" +# endif +# elif defined(__hppa__) +# define systemd_NR_statx 349 +# elif defined(__powerpc__) +# define systemd_NR_statx 383 +# elif defined(__riscv) +# if __riscv_xlen == 32 +# define systemd_NR_statx 291 +# elif __riscv_xlen == 64 +# define systemd_NR_statx 291 +# else +# error "Unknown RISC-V ABI" +# endif +# elif defined(__s390__) +# define systemd_NR_statx 379 +# elif defined(__sparc__) +# define systemd_NR_statx 360 +# elif defined(__x86_64__) +# if defined(__ILP32__) +# define systemd_NR_statx (332 | /* __X32_SYSCALL_BIT */ 0x40000000) +# else +# define systemd_NR_statx 332 +# endif +# elif !defined(missing_arch_template) +# warning "statx() syscall number is unknown for your architecture" +# endif + +/* may be an (invalid) negative number due to libseccomp, see PR 13319 */ +# if defined __NR_statx && __NR_statx >= 0 +# if defined systemd_NR_statx +G_STATIC_ASSERT (__NR_statx == systemd_NR_statx); +# endif +# else +# if defined __NR_statx +# undef __NR_statx +# endif +# if defined systemd_NR_statx && systemd_NR_statx >= 0 +# define __NR_statx systemd_NR_statx +# endif +# endif +#endif + +#if !defined(HAVE_GLNX_STATX) && defined(__NR_statx) +#define GLNX_STATX_TYPE 0x00000001U /* Want/got stx_mode & S_IFMT */ +#define GLNX_STATX_MODE 0x00000002U /* Want/got stx_mode & ~S_IFMT */ +#define GLNX_STATX_NLINK 0x00000004U /* Want/got stx_nlink */ +#define GLNX_STATX_UID 0x00000008U /* Want/got stx_uid */ +#define GLNX_STATX_GID 0x00000010U /* Want/got stx_gid */ +#define GLNX_STATX_ATIME 0x00000020U /* Want/got stx_atime */ +#define GLNX_STATX_MTIME 0x00000040U /* Want/got stx_mtime */ +#define GLNX_STATX_CTIME 0x00000080U /* Want/got stx_ctime */ +#define GLNX_STATX_INO 0x00000100U /* Want/got stx_ino */ +#define GLNX_STATX_SIZE 0x00000200U /* Want/got stx_size */ +#define GLNX_STATX_BLOCKS 0x00000400U /* Want/got stx_blocks */ +#define GLNX_STATX_BASIC_STATS 0x000007ffU /* The stuff in the normal stat struct */ +#define GLNX_STATX_BTIME 0x00000800U /* Want/got stx_btime */ +#define GLNX_STATX_MNT_ID 0x00001000U /* Got stx_mnt_id */ +#define GLNX_STATX_DIOALIGN 0x00002000U /* Want/got direct I/O alignment info */ +#define GLNX_STATX_MNT_ID_UNIQUE 0x00004000U /* Want/got extended stx_mount_id */ +#define GLNX_STATX_SUBVOL 0x00008000U /* Want/got stx_subvol */ +#define GLNX_STATX_WRITE_ATOMIC 0x00010000U /* Want/got atomic_write_* fields */ +#define GLNX_STATX_DIO_READ_ALIGN 0x00020000U /* Want/got dio read alignment info */ +#define GLNX_STATX__RESERVED 0x80000000U /* Reserved for future struct statx expansion */ + +struct glnx_statx_timestamp +{ + int64_t tv_sec; + uint32_t tv_nsec; + int32_t __reserved; +}; + +struct glnx_statx +{ + uint32_t stx_mask; + uint32_t stx_blksize; + uint64_t stx_attributes; + uint32_t stx_nlink; + uint32_t stx_uid; + uint32_t stx_gid; + uint16_t stx_mode; + uint16_t __spare0[1]; + uint64_t stx_ino; + uint64_t stx_size; + uint64_t stx_blocks; + uint64_t stx_attributes_mask; + struct glnx_statx_timestamp stx_atime; + struct glnx_statx_timestamp stx_btime; + struct glnx_statx_timestamp stx_ctime; + struct glnx_statx_timestamp stx_mtime; + uint32_t stx_rdev_major; + uint32_t stx_rdev_minor; + uint32_t stx_dev_major; + uint32_t stx_dev_minor; + uint64_t stx_mnt_id; + uint32_t stx_dio_mem_align; + uint32_t stx_dio_offset_align; + uint64_t stx_subvol; + uint32_t stx_atomic_write_unit_min; + uint32_t stx_atomic_write_unit_max; + uint32_t stx_atomic_write_segments_max; + uint32_t stx_dio_read_offset_align; + uint32_t stx_atomic_write_unit_max_opt; + uint32_t __spare2[1]; + uint64_t __spare3[8]; +}; + +static inline int +glnx_statx_syscall (int dfd, + const char *filename, + unsigned flags, + unsigned int mask, + struct glnx_statx *buf) +{ + memset (buf, 0xbf, sizeof (*buf)); + return syscall (__NR_statx, dfd, filename, flags, mask, buf); + return 0; +} + +#define HAVE_GLNX_STATX +#endif