From 0e95fa455c1012fc5d2247600b89e2d60f146ef3 Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Wed, 4 Nov 2020 15:55:36 +0100 Subject: [PATCH] std: Split kernel&libc definitions of stat struct There's no guarantee for the kernel definition to be ABI compatible with the libc one (and vice versa). There's also no guarantee of ABI compatibility between musl/glibc. Fun, isn't it? --- lib/std/c.zig | 12 +++---- lib/std/c/darwin.zig | 8 ++--- lib/std/os.zig | 5 +++ lib/std/os/bits/darwin.zig | 14 +++----- lib/std/os/bits/dragonfly.zig | 8 ++--- lib/std/os/bits/freebsd.zig | 14 +++----- lib/std/os/bits/linux/arm-eabi.zig | 18 +++++----- lib/std/os/bits/linux/arm64.zig | 18 +++++----- lib/std/os/bits/linux/i386.zig | 18 +++++----- lib/std/os/bits/linux/mips.zig | 51 ++++++++++++++++++++++++----- lib/std/os/bits/linux/powerpc64.zig | 18 +++++----- lib/std/os/bits/linux/riscv64.zig | 18 +++++----- lib/std/os/bits/linux/sparc64.zig | 51 ++++++++++++----------------- lib/std/os/bits/linux/x86_64.zig | 18 +++++----- lib/std/os/bits/netbsd.zig | 14 +++----- lib/std/os/bits/openbsd.zig | 14 +++----- lib/std/os/bits/wasi.zig | 2 +- lib/std/os/linux.zig | 8 ++--- lib/std/os/linux/sparc64.zig | 1 + lib/std/os/linux/test.zig | 2 +- 20 files changed, 153 insertions(+), 159 deletions(-) diff --git a/lib/std/c.zig b/lib/std/c.zig index 7d2d200e7e..54155a7e1a 100644 --- a/lib/std/c.zig +++ b/lib/std/c.zig @@ -128,7 +128,7 @@ pub usingnamespace switch (builtin.os.tag) { }, else => struct { pub extern "c" fn realpath(noalias file_name: [*:0]const u8, noalias resolved_name: [*]u8) ?[*:0]u8; - pub extern "c" fn fstatat(dirfd: fd_t, path: [*:0]const u8, stat_buf: *Stat, flags: u32) c_int; + pub extern "c" fn fstatat(dirfd: fd_t, path: [*:0]const u8, stat_buf: *libc_stat, flags: u32) c_int; }, }; @@ -202,26 +202,26 @@ pub usingnamespace switch (builtin.os.tag) { pub extern "c" fn sigaction(sig: c_int, noalias act: *const Sigaction, noalias oact: ?*Sigaction) c_int; pub extern "c" fn sigprocmask(how: c_int, noalias set: ?*const sigset_t, noalias oset: ?*sigset_t) c_int; pub extern "c" fn socket(domain: c_uint, sock_type: c_uint, protocol: c_uint) c_int; - pub extern "c" fn stat(noalias path: [*:0]const u8, noalias buf: *Stat) c_int; + pub extern "c" fn stat(noalias path: [*:0]const u8, noalias buf: *libc_stat) c_int; }, .windows => struct { // TODO: copied the else case and removed the socket function (because its in ws2_32) // need to verify which of these is actually supported on windows pub extern "c" fn clock_getres(clk_id: c_int, tp: *timespec) c_int; pub extern "c" fn clock_gettime(clk_id: c_int, tp: *timespec) c_int; - pub extern "c" fn fstat(fd: fd_t, buf: *Stat) c_int; + pub extern "c" fn fstat(fd: fd_t, buf: *libc_stat) c_int; pub extern "c" fn getrusage(who: c_int, usage: *rusage) c_int; pub extern "c" fn gettimeofday(noalias tv: ?*timeval, noalias tz: ?*timezone) c_int; pub extern "c" fn nanosleep(rqtp: *const timespec, rmtp: ?*timespec) c_int; pub extern "c" fn sched_yield() c_int; pub extern "c" fn sigaction(sig: c_int, noalias act: *const Sigaction, noalias oact: ?*Sigaction) c_int; pub extern "c" fn sigprocmask(how: c_int, noalias set: ?*const sigset_t, noalias oset: ?*sigset_t) c_int; - pub extern "c" fn stat(noalias path: [*:0]const u8, noalias buf: *Stat) c_int; + pub extern "c" fn stat(noalias path: [*:0]const u8, noalias buf: *libc_stat) c_int; }, else => struct { pub extern "c" fn clock_getres(clk_id: c_int, tp: *timespec) c_int; pub extern "c" fn clock_gettime(clk_id: c_int, tp: *timespec) c_int; - pub extern "c" fn fstat(fd: fd_t, buf: *Stat) c_int; + pub extern "c" fn fstat(fd: fd_t, buf: *libc_stat) c_int; pub extern "c" fn getrusage(who: c_int, usage: *rusage) c_int; pub extern "c" fn gettimeofday(noalias tv: ?*timeval, noalias tz: ?*timezone) c_int; pub extern "c" fn nanosleep(rqtp: *const timespec, rmtp: ?*timespec) c_int; @@ -229,7 +229,7 @@ pub usingnamespace switch (builtin.os.tag) { pub extern "c" fn sigaction(sig: c_int, noalias act: *const Sigaction, noalias oact: ?*Sigaction) c_int; pub extern "c" fn sigprocmask(how: c_int, noalias set: ?*const sigset_t, noalias oset: ?*sigset_t) c_int; pub extern "c" fn socket(domain: c_uint, sock_type: c_uint, protocol: c_uint) c_int; - pub extern "c" fn stat(noalias path: [*:0]const u8, noalias buf: *Stat) c_int; + pub extern "c" fn stat(noalias path: [*:0]const u8, noalias buf: *libc_stat) c_int; }, }; diff --git a/lib/std/c/darwin.zig b/lib/std/c/darwin.zig index e0acd6c746..6074a0960d 100644 --- a/lib/std/c/darwin.zig +++ b/lib/std/c/darwin.zig @@ -30,16 +30,16 @@ pub extern "c" fn @"realpath$DARWIN_EXTSN"(noalias file_name: [*:0]const u8, noa pub extern "c" fn __getdirentries64(fd: c_int, buf_ptr: [*]u8, buf_len: usize, basep: *i64) isize; -extern "c" fn fstat(fd: fd_t, buf: *Stat) c_int; +extern "c" fn fstat(fd: fd_t, buf: *libc_stat) c_int; /// On x86_64 Darwin, fstat has to be manully linked with $INODE64 suffix to force 64bit version. /// Note that this is fixed on aarch64 and no longer necessary. -extern "c" fn @"fstat$INODE64"(fd: fd_t, buf: *Stat) c_int; +extern "c" fn @"fstat$INODE64"(fd: fd_t, buf: *libc_stat) c_int; pub const _fstat = if (builtin.arch == .aarch64) fstat else @"fstat$INODE64"; -extern "c" fn fstatat(dirfd: fd_t, path: [*:0]const u8, stat_buf: *Stat, flags: u32) c_int; +extern "c" fn fstatat(dirfd: fd_t, path: [*:0]const u8, stat_buf: *libc_stat, flags: u32) c_int; /// On x86_64 Darwin, fstatat has to be manully linked with $INODE64 suffix to force 64bit version. /// Note that this is fixed on aarch64 and no longer necessary. -extern "c" fn @"fstatat$INODE64"(dirfd: fd_t, path_name: [*:0]const u8, buf: *Stat, flags: u32) c_int; +extern "c" fn @"fstatat$INODE64"(dirfd: fd_t, path_name: [*:0]const u8, buf: *libc_stat, flags: u32) c_int; pub const _fstatat = if (builtin.arch == .aarch64) fstatat else @"fstatat$INODE64"; pub extern "c" fn mach_absolute_time() u64; diff --git a/lib/std/os.zig b/lib/std/os.zig index d593f816c9..bda41ae165 100644 --- a/lib/std/os.zig +++ b/lib/std/os.zig @@ -3267,6 +3267,11 @@ pub fn waitpid(pid: pid_t, flags: u32) WaitPidResult { } } +pub const Stat = if (builtin.link_libc) + system.libc_stat +else + system.kernel_stat; + pub const FStatError = error{ SystemResources, diff --git a/lib/std/os/bits/darwin.zig b/lib/std/os/bits/darwin.zig index 3e4149decd..92849db4f6 100644 --- a/lib/std/os/bits/darwin.zig +++ b/lib/std/os/bits/darwin.zig @@ -72,13 +72,7 @@ pub const Flock = extern struct { l_whence: i16, }; -/// Renamed to Stat to not conflict with the stat function. -/// atime, mtime, and ctime have functions to return `timespec`, -/// because although this is a POSIX API, the layout and names of -/// the structs are inconsistent across operating systems, and -/// in C, macros are used to hide the differences. Here we use -/// methods to accomplish this. -pub const Stat = extern struct { +pub const libc_stat = extern struct { dev: i32, mode: u16, nlink: u16, @@ -102,21 +96,21 @@ pub const Stat = extern struct { lspare: i32, qspare: [2]i64, - pub fn atime(self: Stat) timespec { + pub fn atime(self: @This()) timespec { return timespec{ .tv_sec = self.atimesec, .tv_nsec = self.atimensec, }; } - pub fn mtime(self: Stat) timespec { + pub fn mtime(self: @This()) timespec { return timespec{ .tv_sec = self.mtimesec, .tv_nsec = self.mtimensec, }; } - pub fn ctime(self: Stat) timespec { + pub fn ctime(self: @This()) timespec { return timespec{ .tv_sec = self.ctimesec, .tv_nsec = self.ctimensec, diff --git a/lib/std/os/bits/dragonfly.zig b/lib/std/os/bits/dragonfly.zig index c79da00729..2fd9e39c7b 100644 --- a/lib/std/os/bits/dragonfly.zig +++ b/lib/std/os/bits/dragonfly.zig @@ -152,7 +152,7 @@ pub const PATH_MAX = 1024; pub const ino_t = c_ulong; -pub const Stat = extern struct { +pub const libc_stat = extern struct { ino: ino_t, nlink: c_uint, dev: c_uint, @@ -172,15 +172,15 @@ pub const Stat = extern struct { lspare: i32, qspare1: i64, qspare2: i64, - pub fn atime(self: Stat) timespec { + pub fn atime(self: @This()) timespec { return self.atim; } - pub fn mtime(self: Stat) timespec { + pub fn mtime(self: @This()) timespec { return self.mtim; } - pub fn ctime(self: Stat) timespec { + pub fn ctime(self: @This()) timespec { return self.ctim; } }; diff --git a/lib/std/os/bits/freebsd.zig b/lib/std/os/bits/freebsd.zig index fecd1be118..30de9f4d59 100644 --- a/lib/std/os/bits/freebsd.zig +++ b/lib/std/os/bits/freebsd.zig @@ -119,13 +119,7 @@ pub const msghdr_const = extern struct { pub const off_t = i64; pub const ino_t = u64; -/// Renamed to Stat to not conflict with the stat function. -/// atime, mtime, and ctime have functions to return `timespec`, -/// because although this is a POSIX API, the layout and names of -/// the structs are inconsistent across operating systems, and -/// in C, macros are used to hide the differences. Here we use -/// methods to accomplish this. -pub const Stat = extern struct { +pub const libc_stat = extern struct { dev: u64, ino: ino_t, nlink: usize, @@ -149,15 +143,15 @@ pub const Stat = extern struct { gen: u64, __spare: [10]u64, - pub fn atime(self: Stat) timespec { + pub fn atime(self: @This()) timespec { return self.atim; } - pub fn mtime(self: Stat) timespec { + pub fn mtime(self: @This()) timespec { return self.mtim; } - pub fn ctime(self: Stat) timespec { + pub fn ctime(self: @This()) timespec { return self.ctim; } }; diff --git a/lib/std/os/bits/linux/arm-eabi.zig b/lib/std/os/bits/linux/arm-eabi.zig index 36f1f4f442..5539199c73 100644 --- a/lib/std/os/bits/linux/arm-eabi.zig +++ b/lib/std/os/bits/linux/arm-eabi.zig @@ -553,13 +553,8 @@ pub const ino_t = u64; pub const dev_t = u64; pub const blkcnt_t = i64; -/// Renamed to Stat to not conflict with the stat function. -/// atime, mtime, and ctime have functions to return `timespec`, -/// because although this is a POSIX API, the layout and names of -/// the structs are inconsistent across operating systems, and -/// in C, macros are used to hide the differences. Here we use -/// methods to accomplish this. -pub const Stat = extern struct { +// The `stat` definition used by the Linux kernel. +pub const kernel_stat = extern struct { dev: dev_t, __dev_padding: u32, __ino_truncated: u32, @@ -577,19 +572,22 @@ pub const Stat = extern struct { ctim: timespec, ino: ino_t, - pub fn atime(self: Stat) timespec { + pub fn atime(self: @This()) timespec { return self.atim; } - pub fn mtime(self: Stat) timespec { + pub fn mtime(self: @This()) timespec { return self.mtim; } - pub fn ctime(self: Stat) timespec { + pub fn ctime(self: @This()) timespec { return self.ctim; } }; +// The `stat64` definition used by the libc. +pub const libc_stat = kernel_stat; + pub const timespec = extern struct { tv_sec: i32, tv_nsec: i32, diff --git a/lib/std/os/bits/linux/arm64.zig b/lib/std/os/bits/linux/arm64.zig index 6ecbcc9ae1..2f677ca537 100644 --- a/lib/std/os/bits/linux/arm64.zig +++ b/lib/std/os/bits/linux/arm64.zig @@ -424,13 +424,8 @@ pub const ino_t = usize; pub const dev_t = usize; pub const blkcnt_t = isize; -/// Renamed to Stat to not conflict with the stat function. -/// atime, mtime, and ctime have functions to return `timespec`, -/// because although this is a POSIX API, the layout and names of -/// the structs are inconsistent across operating systems, and -/// in C, macros are used to hide the differences. Here we use -/// methods to accomplish this. -pub const Stat = extern struct { +// The `stat` definition used by the Linux kernel. +pub const kernel_stat = extern struct { dev: dev_t, ino: ino_t, mode: mode_t, @@ -448,19 +443,22 @@ pub const Stat = extern struct { ctim: timespec, __unused: [2]u32, - pub fn atime(self: Stat) timespec { + pub fn atime(self: @This()) timespec { return self.atim; } - pub fn mtime(self: Stat) timespec { + pub fn mtime(self: @This()) timespec { return self.mtim; } - pub fn ctime(self: Stat) timespec { + pub fn ctime(self: @This()) timespec { return self.ctim; } }; +// The `stat64` definition used by the libc. +pub const libc_stat = kernel_stat; + pub const timespec = extern struct { tv_sec: time_t, tv_nsec: isize, diff --git a/lib/std/os/bits/linux/i386.zig b/lib/std/os/bits/linux/i386.zig index a560c14613..b8c7221e9e 100644 --- a/lib/std/os/bits/linux/i386.zig +++ b/lib/std/os/bits/linux/i386.zig @@ -546,13 +546,8 @@ pub const ino_t = u64; pub const dev_t = u64; pub const blkcnt_t = i64; -/// Renamed to Stat to not conflict with the stat function. -/// atime, mtime, and ctime have functions to return `timespec`, -/// because although this is a POSIX API, the layout and names of -/// the structs are inconsistent across operating systems, and -/// in C, macros are used to hide the differences. Here we use -/// methods to accomplish this. -pub const Stat = extern struct { +// The `stat` definition used by the Linux kernel. +pub const kernel_stat = extern struct { dev: dev_t, __dev_padding: u32, __ino_truncated: u32, @@ -570,19 +565,22 @@ pub const Stat = extern struct { ctim: timespec, ino: ino_t, - pub fn atime(self: Stat) timespec { + pub fn atime(self: @This()) timespec { return self.atim; } - pub fn mtime(self: Stat) timespec { + pub fn mtime(self: @This()) timespec { return self.mtim; } - pub fn ctime(self: Stat) timespec { + pub fn ctime(self: @This()) timespec { return self.ctim; } }; +// The `stat64` definition used by the libc. +pub const libc_stat = kernel_stat; + pub const timespec = extern struct { tv_sec: i32, tv_nsec: i32, diff --git a/lib/std/os/bits/linux/mips.zig b/lib/std/os/bits/linux/mips.zig index b5f77c9061..cfd9c7adce 100644 --- a/lib/std/os/bits/linux/mips.zig +++ b/lib/std/os/bits/linux/mips.zig @@ -536,41 +536,74 @@ pub const Flock = extern struct { pub const blksize_t = i32; pub const nlink_t = u32; -pub const time_t = isize; +pub const time_t = i32; pub const mode_t = u32; pub const off_t = i64; pub const ino_t = u64; -pub const dev_t = usize; +pub const dev_t = u64; pub const blkcnt_t = i64; -pub const Stat = extern struct { +// The `stat` definition used by the Linux kernel. +pub const kernel_stat = extern struct { dev: u32, - __pad0: [3]u32, + __pad0: [3]u32, // Reserved for st_dev expansion ino: ino_t, mode: mode_t, nlink: nlink_t, uid: uid_t, gid: gid_t, - rdev: dev_t, + rdev: u32, __pad1: [3]u32, size: off_t, atim: timespec, mtim: timespec, ctim: timespec, blksize: blksize_t, - __pad3: [1]u32, + __pad3: u32, blocks: blkcnt_t, __pad4: [14]usize, - pub fn atime(self: Stat) timespec { + pub fn atime(self: @This()) timespec { return self.atim; } - pub fn mtime(self: Stat) timespec { + pub fn mtime(self: @This()) timespec { return self.mtim; } - pub fn ctime(self: Stat) timespec { + pub fn ctime(self: @This()) timespec { + return self.ctim; + } +}; + +pub const libc_stat = extern struct { + dev: dev_t, + __pad0: [2]u32, + ino: ino_t, + mode: mode_t, + nlink: nlink_t, + uid: uid_t, + gid: gid_t, + rdev: dev_t, + __pad1: [2]u32, + size: off_t, + atim: timespec, + mtim: timespec, + ctim: timespec, + blksize: blksize_t, + __pad3: u32, + blocks: blkcnt_t, + __pad4: [14]u32, + + pub fn atime(self: @This()) timespec { + return self.atim; + } + + pub fn mtime(self: @This()) timespec { + return self.mtim; + } + + pub fn ctime(self: @This()) timespec { return self.ctim; } }; diff --git a/lib/std/os/bits/linux/powerpc64.zig b/lib/std/os/bits/linux/powerpc64.zig index 769b7e614d..89619ebe16 100644 --- a/lib/std/os/bits/linux/powerpc64.zig +++ b/lib/std/os/bits/linux/powerpc64.zig @@ -516,13 +516,8 @@ pub const ino_t = u64; pub const dev_t = u64; pub const blkcnt_t = i64; -/// Renamed to Stat to not conflict with the stat function. -/// atime, mtime, and ctime have functions to return `timespec`, -/// because although this is a POSIX API, the layout and names of -/// the structs are inconsistent across operating systems, and -/// in C, macros are used to hide the differences. Here we use -/// methods to accomplish this. -pub const Stat = extern struct { +// The `stat` definition used by the Linux kernel. +pub const kernel_stat = extern struct { dev: dev_t, ino: ino_t, nlink: nlink_t, @@ -538,19 +533,22 @@ pub const Stat = extern struct { ctim: timespec, __unused: [3]u64, - pub fn atime(self: Stat) timespec { + pub fn atime(self: @This()) timespec { return self.atim; } - pub fn mtime(self: Stat) timespec { + pub fn mtime(self: @This()) timespec { return self.mtim; } - pub fn ctime(self: Stat) timespec { + pub fn ctime(self: @This()) timespec { return self.ctim; } }; +// The `stat64` definition used by the libc. +pub const libc_stat = kernel_stat; + pub const timespec = extern struct { tv_sec: time_t, tv_nsec: isize, diff --git a/lib/std/os/bits/linux/riscv64.zig b/lib/std/os/bits/linux/riscv64.zig index c4b0f044f2..bd4b45f95f 100644 --- a/lib/std/os/bits/linux/riscv64.zig +++ b/lib/std/os/bits/linux/riscv64.zig @@ -381,13 +381,8 @@ pub const Flock = extern struct { __unused: [4]u8, }; -/// Renamed to Stat to not conflict with the stat function. -/// atime, mtime, and ctime have functions to return `timespec`, -/// because although this is a POSIX API, the layout and names of -/// the structs are inconsistent across operating systems, and -/// in C, macros are used to hide the differences. Here we use -/// methods to accomplish this. -pub const Stat = extern struct { +// The `stat` definition used by the Linux kernel. +pub const kernel_stat = extern struct { dev: dev_t, ino: ino_t, mode: mode_t, @@ -405,17 +400,20 @@ pub const Stat = extern struct { ctim: timespec, __unused: [2]u32, - pub fn atime(self: Stat) timespec { + pub fn atime(self: @This()) timespec { return self.atim; } - pub fn mtime(self: Stat) timespec { + pub fn mtime(self: @This()) timespec { return self.mtim; } - pub fn ctime(self: Stat) timespec { + pub fn ctime(self: @This()) timespec { return self.ctim; } }; +// The `stat64` definition used by the libc. +pub const libc_stat = kernel_stat; + pub const Elf_Symndx = u32; diff --git a/lib/std/os/bits/linux/sparc64.zig b/lib/std/os/bits/linux/sparc64.zig index 0f2e5b5035..1ce17b3a01 100644 --- a/lib/std/os/bits/linux/sparc64.zig +++ b/lib/std/os/bits/linux/sparc64.zig @@ -484,11 +484,7 @@ pub const off_t = i64; pub const ino_t = u64; pub const mode_t = u32; -/// atime, mtime, and ctime have functions to return `timespec`, -/// because although this is a POSIX API, the layout and names of -/// the structs are inconsistent across operating systems, and -/// in C, macros are used to hide the differences. Here we use -/// methods to accomplish this. +// The `stat64` definition used by the libc. pub const libc_stat = extern struct { dev: u64, ino: ino_t, @@ -522,45 +518,40 @@ pub const libc_stat = extern struct { } }; +// The `stat64` definition used by the kernel. pub const kernel_stat = extern struct { - dev: u32, - ino: ino_t, - mode: mode_t, - nlink: i16, + dev: u64, + ino: u64, + nlink: u64, + mode: u32, uid: u32, gid: u32, - rdev: u32, + __pad0: u32, - size: off_t, - atim: isize, - mtim: isize, - ctim: isize, + rdev: u64, + size: i64, + blksize: i64, + blocks: i64, - blksize: off_t, - blocks: off_t, + atim: timespec, + mtim: timespec, + ctim: timespec, + __unused: [3]u64, - __unused4: [2]isize, - - // Hack to make the stdlib not complain about atime - // and friends not being a method. - // TODO what should tv_nsec be filled with? - pub fn atime(self: kernel_stat) timespec { - return timespec{.tv_sec=self.atim, .tv_nsec=0}; + pub fn atime(self: @This()) timespec { + return self.atim; } - pub fn mtime(self: kernel_stat) timespec { - return timespec{.tv_sec=self.mtim, .tv_nsec=0}; + pub fn mtime(self: @This()) timespec { + return self.mtim; } - pub fn ctime(self: kernel_stat) timespec { - return timespec{.tv_sec=self.ctim, .tv_nsec=0}; + pub fn ctime(self: @This()) timespec { + return self.ctim; } }; -/// Renamed to Stat to not conflict with the stat function. -pub const Stat = if (std.builtin.link_libc) libc_stat else kernel_stat; - pub const timespec = extern struct { tv_sec: isize, tv_nsec: isize, diff --git a/lib/std/os/bits/linux/x86_64.zig b/lib/std/os/bits/linux/x86_64.zig index 0f01c40813..936c03bd34 100644 --- a/lib/std/os/bits/linux/x86_64.zig +++ b/lib/std/os/bits/linux/x86_64.zig @@ -512,13 +512,8 @@ pub const msghdr_const = extern struct { pub const off_t = i64; pub const ino_t = u64; -/// Renamed to Stat to not conflict with the stat function. -/// atime, mtime, and ctime have functions to return `timespec`, -/// because although this is a POSIX API, the layout and names of -/// the structs are inconsistent across operating systems, and -/// in C, macros are used to hide the differences. Here we use -/// methods to accomplish this. -pub const Stat = extern struct { +// The `stat` definition used by the Linux kernel. +pub const kernel_stat = extern struct { dev: u64, ino: ino_t, nlink: usize, @@ -537,19 +532,22 @@ pub const Stat = extern struct { ctim: timespec, __unused: [3]isize, - pub fn atime(self: Stat) timespec { + pub fn atime(self: @This()) timespec { return self.atim; } - pub fn mtime(self: Stat) timespec { + pub fn mtime(self: @This()) timespec { return self.mtim; } - pub fn ctime(self: Stat) timespec { + pub fn ctime(self: @This()) timespec { return self.ctim; } }; +// The `stat64` definition used by the libc. +pub const libc_stat = kernel_stat; + pub const timespec = extern struct { tv_sec: isize, tv_nsec: isize, diff --git a/lib/std/os/bits/netbsd.zig b/lib/std/os/bits/netbsd.zig index 623510faab..d5c4ebe653 100644 --- a/lib/std/os/bits/netbsd.zig +++ b/lib/std/os/bits/netbsd.zig @@ -153,13 +153,7 @@ pub const msghdr_const = extern struct { msg_flags: i32, }; -/// Renamed to Stat to not conflict with the stat function. -/// atime, mtime, and ctime have functions to return `timespec`, -/// because although this is a POSIX API, the layout and names of -/// the structs are inconsistent across operating systems, and -/// in C, macros are used to hide the differences. Here we use -/// methods to accomplish this. -pub const Stat = extern struct { +pub const libc_stat = extern struct { dev: dev_t, mode: mode_t, ino: ino_t, @@ -178,15 +172,15 @@ pub const Stat = extern struct { gen: u32, __spare: [2]u32, - pub fn atime(self: Stat) timespec { + pub fn atime(self: @This()) timespec { return self.atim; } - pub fn mtime(self: Stat) timespec { + pub fn mtime(self: @This()) timespec { return self.mtim; } - pub fn ctime(self: Stat) timespec { + pub fn ctime(self: @This()) timespec { return self.ctim; } }; diff --git a/lib/std/os/bits/openbsd.zig b/lib/std/os/bits/openbsd.zig index 8f0fae04b3..d265c68b42 100644 --- a/lib/std/os/bits/openbsd.zig +++ b/lib/std/os/bits/openbsd.zig @@ -152,13 +152,7 @@ pub const msghdr_const = extern struct { msg_flags: i32, }; -/// Renamed to Stat to not conflict with the stat function. -/// atime, mtime, and ctime have functions to return `timespec`, -/// because although this is a POSIX API, the layout and names of -/// the structs are inconsistent across operating systems, and -/// in C, macros are used to hide the differences. Here we use -/// methods to accomplish this. -pub const Stat = extern struct { +pub const libc_stat = extern struct { mode: mode_t, dev: dev_t, ino: ino_t, @@ -176,15 +170,15 @@ pub const Stat = extern struct { gen: u32, birthtim: timespec, - pub fn atime(self: Stat) timespec { + pub fn atime(self: @This()) timespec { return self.atim; } - pub fn mtime(self: Stat) timespec { + pub fn mtime(self: @This()) timespec { return self.mtim; } - pub fn ctime(self: Stat) timespec { + pub fn ctime(self: @This()) timespec { return self.ctim; } }; diff --git a/lib/std/os/bits/wasi.zig b/lib/std/os/bits/wasi.zig index f768b5522b..033f8cc877 100644 --- a/lib/std/os/bits/wasi.zig +++ b/lib/std/os/bits/wasi.zig @@ -31,7 +31,7 @@ pub const timespec = struct { } }; -pub const Stat = struct { +pub const libc_stat = struct { dev: device_t, ino: inode_t, mode: mode_t, diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index c5fbd0bcfe..9c6f7d3374 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -1047,7 +1047,7 @@ pub fn accept4(fd: i32, noalias addr: ?*sockaddr, noalias len: ?*socklen_t, flag return syscall4(.accept4, @bitCast(usize, @as(isize, fd)), @ptrToInt(addr), @ptrToInt(len), flags); } -pub fn fstat(fd: i32, stat_buf: *Stat) usize { +pub fn fstat(fd: i32, stat_buf: *kernel_stat) usize { if (@hasField(SYS, "fstat64")) { return syscall2(.fstat64, @bitCast(usize, @as(isize, fd)), @ptrToInt(stat_buf)); } else { @@ -1055,7 +1055,7 @@ pub fn fstat(fd: i32, stat_buf: *Stat) usize { } } -pub fn stat(pathname: [*:0]const u8, statbuf: *Stat) usize { +pub fn stat(pathname: [*:0]const u8, statbuf: *kernel_stat) usize { if (@hasField(SYS, "stat64")) { return syscall2(.stat64, @ptrToInt(pathname), @ptrToInt(statbuf)); } else { @@ -1063,7 +1063,7 @@ pub fn stat(pathname: [*:0]const u8, statbuf: *Stat) usize { } } -pub fn lstat(pathname: [*:0]const u8, statbuf: *Stat) usize { +pub fn lstat(pathname: [*:0]const u8, statbuf: *kernel_stat) usize { if (@hasField(SYS, "lstat64")) { return syscall2(.lstat64, @ptrToInt(pathname), @ptrToInt(statbuf)); } else { @@ -1071,7 +1071,7 @@ pub fn lstat(pathname: [*:0]const u8, statbuf: *Stat) usize { } } -pub fn fstatat(dirfd: i32, path: [*:0]const u8, stat_buf: *Stat, flags: u32) usize { +pub fn fstatat(dirfd: i32, path: [*:0]const u8, stat_buf: *kernel_stat, flags: u32) usize { if (@hasField(SYS, "fstatat64")) { return syscall4(.fstatat64, @bitCast(usize, @as(isize, dirfd)), @ptrToInt(path), @ptrToInt(stat_buf), flags); } else { diff --git a/lib/std/os/linux/sparc64.zig b/lib/std/os/linux/sparc64.zig index a5aa6c543a..eefa4d60fd 100644 --- a/lib/std/os/linux/sparc64.zig +++ b/lib/std/os/linux/sparc64.zig @@ -12,6 +12,7 @@ pub fn syscall_pipe(fd: *[2]i32) usize { \\1: \\ st %%o0, [%%g3+0] \\ st %%o1, [%%g3+4] + \\ clr %%o0 \\2: : [ret] "={o0}" (-> usize) : [number] "{g1}" (@enumToInt(SYS.pipe)), diff --git a/lib/std/os/linux/test.zig b/lib/std/os/linux/test.zig index 7599cfc395..4fb6ea8d9e 100644 --- a/lib/std/os/linux/test.zig +++ b/lib/std/os/linux/test.zig @@ -67,7 +67,7 @@ test "statx" { else => unreachable, } - var stat_buf: linux.Stat = undefined; + var stat_buf: linux.kernel_stat = undefined; switch (linux.getErrno(linux.fstatat(file.handle, "", &stat_buf, linux.AT_EMPTY_PATH))) { 0 => {}, else => unreachable,