diff --git a/lib/c/common.zig b/lib/c/common.zig index 4419b65cc61a920068cb5fe44bdccf8979256da7..09dc5a8c0cbf2fe18160a2310ab4d33ffbfa7545 100644 --- a/lib/c/common.zig +++ b/lib/c/common.zig @@ -13,3 +13,17 @@ pub const visibility: std.builtin.SymbolVisibility = if (linkage != .internal) .hidden else .default; + +/// Checks whether the syscall has had an error, storing it in `std.c.errno` and returning -1. +/// Otherwise returns the result. +pub fn linuxErrno(r: usize) isize { + const linux = std.os.linux; + + return switch (linux.errno(r)) { + .SUCCESS => @bitCast(r), + else => |err| blk: { + std.c._errno().* = @intFromEnum(err); + break :blk -1; + }, + }; +} diff --git a/lib/c/sys/utsname.zig b/lib/c/sys/utsname.zig index 4aab4124efd2cd544b83f49c687008289127ee21..06f849ba6df4e8aa642e1361e6f9e5d57fff7367 100644 --- a/lib/c/sys/utsname.zig +++ b/lib/c/sys/utsname.zig @@ -13,15 +13,7 @@ comptime { } fn unameLinux(uts: *std.os.linux.utsname) callconv(.c) c_int { - const linux = std.os.linux; - - return switch (linux.errno(linux.uname(uts))) { - .SUCCESS => 0, - else => |err| blk: { - std.c._errno().* = @intFromEnum(err); - break :blk -1; - }, - }; + return @intCast(common.linuxErrno(std.os.linux.uname(uts))); } fn unameWasi(uts: *std.c.utsname) callconv(.c) c_int {