commit 4f652fb4e36c7f2791bb4c7fb1909a897a662c3b (tree)
parent 9d3e9054a7a154730261d5fae96631cc04bdef93
Author: GasInfinity <me@gasinfinity.dev>
Date: Tue, 20 Jan 2026 23:18:34 +0100
feat(libzigc): use common implementations for `sys/utsname.h`
* and remove their musl/wasi implementation
Diffstat:
7 files changed, 45 insertions(+), 41 deletions(-)
diff --git 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
@@ -0,0 +1,3 @@
+comptime {
+ _ = @import("sys/utsname.zig");
+}
diff --git a/lib/c/sys/utsname.zig 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
@@ -1,7 +0,0 @@
-#include <sys/utsname.h>
-#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
@@ -1,32 +0,0 @@
-#include <sys/utsname.h>
-#ifdef __wasilibc_unmodified_upstream // Implement uname with placeholders
-#include "syscall.h"
-#else
-#include <string.h>
-#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
@@ -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
@@ -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",