cosmopolitan/libc/calls/struct/metastat.internal.h
Justine Tunney fa20edc44d
Reduce header complexity
- Remove most __ASSEMBLER__ __LINKER__ ifdefs
- Rename libc/intrin/bits.h to libc/serialize.h
- Block pthread cancelation in fchmodat() polyfill
- Remove `clang-format off` statements in third_party
2023-11-28 14:39:42 -08:00

117 lines
2.8 KiB
C

#ifndef COSMOPOLITAN_LIBC_CALLS_STRUCT_METASTAT_H_
#define COSMOPOLITAN_LIBC_CALLS_STRUCT_METASTAT_H_
#include "libc/calls/struct/stat.h"
#include "libc/calls/struct/timespec.h"
COSMOPOLITAN_C_START_
#define METASTAT(x, field) \
(IsLinux() || IsMetal() ? x.linux.field \
: IsXnu() ? x.xnu.field \
: IsFreebsd() ? x.freebsd.field \
: IsOpenbsd() ? x.openbsd.field \
: IsNetbsd() ? x.netbsd.field \
: 0)
struct stat_linux {
uint64_t st_dev;
uint64_t st_ino;
#ifdef __x86_64__
uint64_t st_nlink;
uint32_t st_mode;
uint32_t st_uid;
uint32_t st_gid;
uint32_t __pad0;
uint64_t st_rdev;
int64_t st_size;
int64_t st_blksize;
int64_t st_blocks;
struct timespec st_atim;
struct timespec st_mtim;
struct timespec st_ctim;
int64_t __unused[3];
#elif defined(__aarch64__)
uint32_t st_mode;
uint32_t st_nlink;
uint32_t st_uid;
uint32_t st_gid;
uint64_t st_rdev;
uint64_t __pad1;
int64_t st_size;
int32_t st_blksize;
int32_t __pad2;
int64_t st_blocks;
struct timespec st_atim;
struct timespec st_mtim;
struct timespec st_ctim;
uint32_t __unused4;
uint32_t __unused5;
#endif
};
struct stat_xnu {
int32_t st_dev;
uint16_t st_mode, st_nlink;
uint64_t st_ino;
uint32_t st_uid, st_gid;
int32_t st_rdev;
struct timespec st_atim, st_mtim, st_ctim, st_birthtim;
int64_t st_size, st_blocks;
int32_t st_blksize;
uint32_t st_flags, st_gen;
int32_t st_lspare;
int64_t st_qspare[2];
};
struct stat_freebsd {
uint64_t st_dev, st_ino, st_nlink;
uint16_t st_mode;
int16_t st_padding0;
uint32_t st_uid, st_gid;
int32_t st_padding1;
uint64_t st_rdev;
struct timespec st_atim, st_mtim, st_ctim, st_birthtim;
int64_t st_size, st_blocks;
int32_t st_blksize;
uint32_t st_flags;
uint64_t st_gen;
unsigned long st_spare[10];
};
struct stat_openbsd {
uint32_t st_mode;
int32_t st_dev;
uint64_t st_ino;
uint32_t st_nlink, st_uid, st_gid;
int32_t st_rdev;
struct timespec st_atim, st_mtim, st_ctim;
int64_t st_size, st_blocks;
int32_t st_blksize;
uint32_t st_flags, st_gen;
struct timespec st_birthtim;
};
struct stat_netbsd {
uint64_t st_dev;
uint32_t st_mode;
uint64_t st_ino;
uint32_t st_nlink, st_uid, st_gid;
uint64_t st_rdev;
struct timespec st_atim, st_mtim, st_ctim, st_birthtim;
int64_t st_size, st_blocks;
int32_t st_blksize;
uint32_t st_flags, st_gen, st_spare[2];
};
union metastat {
struct stat cosmo;
struct stat_linux linux;
struct stat_xnu xnu;
struct stat_freebsd freebsd;
struct stat_openbsd openbsd;
struct stat_netbsd netbsd;
};
void __stat2cosmo(struct stat *restrict, const union metastat *);
COSMOPOLITAN_C_END_
#endif /* COSMOPOLITAN_LIBC_CALLS_STRUCT_METASTAT_H_ */