29 lines
1004 B
Zig
29 lines
1004 B
Zig
const std = @import("std");
|
|
|
|
pub fn statPath(path: []const u8) !std.os.linux.Statx {
|
|
const posix_path = try std.posix.toPosixPath(path);
|
|
return statxInner(std.os.linux.AT.FDCWD, &posix_path, 0);
|
|
}
|
|
|
|
pub fn statFile(fd: std.posix.fd_t) !std.os.linux.Statx {
|
|
return statxInner(fd, "", std.os.linux.AT.EMPTY_PATH);
|
|
}
|
|
|
|
fn statxInner(fd: std.posix.fd_t, path: [*:0]const u8, flags: u32) !std.os.linux.Statx {
|
|
var stat_buf: std.os.linux.Statx = undefined;
|
|
const rc = std.posix.system.statx(fd, path, flags, .{}, &stat_buf);
|
|
return switch (std.posix.errno(rc)) {
|
|
.SUCCESS => stat_buf,
|
|
.ACCES => error.PermissionDenied,
|
|
.LOOP => error.SymLinkLoop,
|
|
.NAMETOOLONG => error.NameTooLong,
|
|
.NOENT => error.FileNotFound,
|
|
.NOMEM => error.SystemResources,
|
|
.NOTDIR => error.NotADirectory,
|
|
.BADF => unreachable,
|
|
.FAULT => unreachable,
|
|
.INVAL => unreachable,
|
|
else => |err| std.posix.unexpectedErrno(err),
|
|
};
|
|
}
|