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",