From f67d21f736fdd058cc8607523a1a370ac1b2f58f Mon Sep 17 00:00:00 2001 From: GasInfinity Date: Tue, 20 Jan 2026 23:14:23 +0100 Subject: [PATCH 1/4] chore(libc/musl): remove unused `ffs` impls * forgot to remove them in the previous PR --- lib/libc/musl/src/misc/ffs.c | 7 ------- lib/libc/musl/src/misc/ffsl.c | 7 ------- lib/libc/musl/src/misc/ffsll.c | 7 ------- 3 files changed, 21 deletions(-) delete mode 100644 lib/libc/musl/src/misc/ffs.c delete mode 100644 lib/libc/musl/src/misc/ffsl.c delete mode 100644 lib/libc/musl/src/misc/ffsll.c diff --git a/lib/libc/musl/src/misc/ffs.c b/lib/libc/musl/src/misc/ffs.c deleted file mode 100644 index 673ce5a9758284c7eca182b32de3902c9b353b3f..0000000000000000000000000000000000000000 --- a/lib/libc/musl/src/misc/ffs.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include "atomic.h" - -int ffs(int i) -{ - return i ? a_ctz_l(i)+1 : 0; -} diff --git a/lib/libc/musl/src/misc/ffsl.c b/lib/libc/musl/src/misc/ffsl.c deleted file mode 100644 index 0105c66af9d18946ce9b3f8616c8baa6c7a55cde..0000000000000000000000000000000000000000 --- a/lib/libc/musl/src/misc/ffsl.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include "atomic.h" - -int ffsl(long i) -{ - return i ? a_ctz_l(i)+1 : 0; -} diff --git a/lib/libc/musl/src/misc/ffsll.c b/lib/libc/musl/src/misc/ffsll.c deleted file mode 100644 index 0c5ced826657993210a021f49d76560a03a416d6..0000000000000000000000000000000000000000 --- a/lib/libc/musl/src/misc/ffsll.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include "atomic.h" - -int ffsll(long long i) -{ - return i ? a_ctz_64(i)+1 : 0; -} -- 2.54.0 From 9d3e9054a7a154730261d5fae96631cc04bdef93 Mon Sep 17 00:00:00 2001 From: GasInfinity Date: Tue, 20 Jan 2026 23:17:04 +0100 Subject: [PATCH 2/4] feat(std.c): add `wasi` definition for `utsname` --- lib/std/c.zig | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/std/c.zig b/lib/std/c.zig index 8e9f5e8c44a064965fc8b614e44bd1187af2ae0e..1fa47a3121e26fcfcad7cfb2d34666b6c4d6a4a0 100644 --- a/lib/std/c.zig +++ b/lib/std/c.zig @@ -7069,6 +7069,14 @@ pub const user_desc = switch (native_os) { pub const utsname = switch (native_os) { .linux => linux.utsname, .emscripten => emscripten.utsname, + .wasi => extern struct { + sysname: [64:0]u8, + nodename: [64:0]u8, + release: [64:0]u8, + version: [64:0]u8, + machine: [64:0]u8, + domainname: [64:0]u8, + }, .illumos => extern struct { sysname: [256:0]u8, nodename: [256:0]u8, -- 2.54.0 From 4f652fb4e36c7f2791bb4c7fb1909a897a662c3b Mon Sep 17 00:00:00 2001 From: GasInfinity Date: Tue, 20 Jan 2026 23:18:34 +0100 Subject: [PATCH 3/4] feat(libzigc): use common implementations for `sys/utsname.h` * and remove their musl/wasi implementation --- lib/c.zig | 2 + lib/c/sys.zig | 3 ++ lib/c/sys/utsname.zig | 40 +++++++++++++++++++ lib/libc/musl/src/misc/uname.c | 7 ---- .../wasi/libc-top-half/musl/src/misc/uname.c | 32 --------------- src/libs/musl.zig | 1 - src/libs/wasi_libc.zig | 1 - 7 files changed, 45 insertions(+), 41 deletions(-) create mode 100644 lib/c/sys.zig create mode 100644 lib/c/sys/utsname.zig delete mode 100644 lib/libc/musl/src/misc/uname.c delete mode 100644 lib/libc/wasi/libc-top-half/musl/src/misc/uname.c diff --git a/lib/c.zig b/lib/c.zig index dce7ae560831c04bfd3dd9580d6c71d237166694..31176d04c3ead690d17302fcf907afc639ebeced 100644 --- a/lib/c.zig +++ b/lib/c.zig @@ -25,6 +25,8 @@ comptime { _ = @import("c/strings.zig"); _ = @import("c/wchar.zig"); + _ = @import("c/sys.zig"); + if (builtin.target.isMuslLibC() or builtin.target.isWasiLibC()) { // Files specific to musl and wasi-libc. } diff --git a/lib/c/sys.zig b/lib/c/sys.zig new file mode 100644 index 0000000000000000000000000000000000000000..d19baf1b0e963777cc9c2f96d6ed0ffb384c8943 --- /dev/null +++ b/lib/c/sys.zig @@ -0,0 +1,3 @@ +comptime { + _ = @import("sys/utsname.zig"); +} diff --git a/lib/c/sys/utsname.zig b/lib/c/sys/utsname.zig new file mode 100644 index 0000000000000000000000000000000000000000..4aab4124efd2cd544b83f49c687008289127ee21 --- /dev/null +++ b/lib/c/sys/utsname.zig @@ -0,0 +1,40 @@ +const std = @import("std"); +const common = @import("../common.zig"); +const builtin = @import("builtin"); + +comptime { + if (builtin.target.isMuslLibC()) { + @export(&unameLinux, .{ .name = "uname", .linkage = common.linkage, .visibility = common.visibility }); + } + + if (builtin.target.isWasiLibC()) { + @export(&unameWasi, .{ .name = "uname", .linkage = common.linkage, .visibility = common.visibility }); + } +} + +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; + }, + }; +} + +fn unameWasi(uts: *std.c.utsname) callconv(.c) c_int { + // note the @bitCast's for NUL termination! + uts.sysname[0..5].* = @bitCast("wasi".*); + uts.nodename[0..7].* = @bitCast("(none)".*); + uts.release[0..6].* = @bitCast("0.0.0".*); + uts.version[0..6].* = @bitCast("0.0.0".*); + uts.machine[0..7].* = @bitCast(switch (builtin.target.cpu.arch) { + .wasm32 => "wasm32", + .wasm64 => "wasm64", + else => comptime unreachable, + }.*); + uts.domainname[0..7].* = @bitCast("(none)".*); + return 0; +} diff --git a/lib/libc/musl/src/misc/uname.c b/lib/libc/musl/src/misc/uname.c deleted file mode 100644 index 55ea3420232c9999bd3bbcf5f31c5bf74946ac9e..0000000000000000000000000000000000000000 --- a/lib/libc/musl/src/misc/uname.c +++ /dev/null @@ -1,7 +0,0 @@ -#include -#include "syscall.h" - -int uname(struct utsname *uts) -{ - return syscall(SYS_uname, uts); -} diff --git a/lib/libc/wasi/libc-top-half/musl/src/misc/uname.c b/lib/libc/wasi/libc-top-half/musl/src/misc/uname.c deleted file mode 100644 index 36e816aa27117a8d0fc3796094fda5569802df6a..0000000000000000000000000000000000000000 --- a/lib/libc/wasi/libc-top-half/musl/src/misc/uname.c +++ /dev/null @@ -1,32 +0,0 @@ -#include -#ifdef __wasilibc_unmodified_upstream // Implement uname with placeholders -#include "syscall.h" -#else -#include -#endif - -int uname(struct utsname *uts) -{ -#ifdef __wasilibc_unmodified_upstream // Implement uname with placeholders - return syscall(SYS_uname, uts); -#else - // Just fill in the fields with placeholder values. - strcpy(uts->sysname, "wasi"); - strcpy(uts->nodename, "(none)"); - strcpy(uts->release, "0.0.0"); - strcpy(uts->version, "0.0.0"); -#if defined(__wasm32__) - strcpy(uts->machine, "wasm32"); -#elif defined(__wasm64__) - strcpy(uts->machine, "wasm64"); -#else - strcpy(uts->machine, "unknown"); -#endif -#ifdef _GNU_SOURCE - strcpy(uts->domainname, "(none)"); -#else - strcpy(uts->__domainname, "(none)"); -#endif - return 0; -#endif -} diff --git a/src/libs/musl.zig b/src/libs/musl.zig index 25d31accf77df2315ee644bfb94c5b550ca33701..295e5169308a3200bbeec50a709b0035b68d72ca 100644 --- a/src/libs/musl.zig +++ b/src/libs/musl.zig @@ -1156,7 +1156,6 @@ const src_files = [_][]const u8{ "musl/src/misc/setrlimit.c", "musl/src/misc/syscall.c", "musl/src/misc/syslog.c", - "musl/src/misc/uname.c", "musl/src/misc/wordexp.c", "musl/src/mman/madvise.c", "musl/src/mman/mincore.c", diff --git a/src/libs/wasi_libc.zig b/src/libs/wasi_libc.zig index db222c115f25fcefa3efa7132bbb06e00ba00225..61d0f2cd0cb2d432d130aecd4b5f2b97fef1ad81 100644 --- a/src/libs/wasi_libc.zig +++ b/src/libs/wasi_libc.zig @@ -1054,7 +1054,6 @@ const libc_top_half_src_files = [_][]const u8{ "wasi/libc-top-half/musl/src/math/sinhf.c", "wasi/libc-top-half/musl/src/misc/fmtmsg.c", "wasi/libc-top-half/musl/src/misc/nftw.c", - "wasi/libc-top-half/musl/src/misc/uname.c", "wasi/libc-top-half/musl/src/prng/random.c", "wasi/libc-top-half/musl/src/regex/glob.c", "wasi/libc-top-half/musl/src/regex/regcomp.c", -- 2.54.0 From 1ab6bf59a6722f816edce15574c2dfcaefeebd31 Mon Sep 17 00:00:00 2001 From: GasInfinity Date: Wed, 21 Jan 2026 12:02:08 +0100 Subject: [PATCH 4/4] feat(libzigc): add common linux errno syscall helper --- lib/c/common.zig | 14 ++++++++++++++ lib/c/sys/utsname.zig | 10 +--------- 2 files changed, 15 insertions(+), 9 deletions(-) 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 { -- 2.54.0