Skip to content
7 changes: 7 additions & 0 deletions src/bun.js/node/node_os.zig
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ pub const Os = struct {
module.put(globalObject, JSC.ZigString.static("uptime"), JSC.NewFunction(globalObject, JSC.ZigString.static("uptime"), 0, uptime, true));
module.put(globalObject, JSC.ZigString.static("userInfo"), JSC.NewFunction(globalObject, JSC.ZigString.static("userInfo"), 0, userInfo, true));
module.put(globalObject, JSC.ZigString.static("version"), JSC.NewFunction(globalObject, JSC.ZigString.static("version"), 0, version, true));
module.put(globalObject, JSC.ZigString.static("machine"), JSC.NewFunction(globalObject, JSC.ZigString.static("machine"), 0, machine, true));

module.put(globalObject, JSC.ZigString.static("devNull"), JSC.ZigString.init(devNull).withEncoding().toValue(globalObject));
module.put(globalObject, JSC.ZigString.static("EOL"), JSC.ZigString.init(EOL).withEncoding().toValue(globalObject));
Expand Down Expand Up @@ -314,4 +315,10 @@ pub const Os = struct {
var name_buffer: [std.os.HOST_NAME_MAX]u8 = undefined;
return JSC.ZigString.init(C.getVersion(&name_buffer)).withEncoding().toValueGC(globalThis);
}

pub fn machine(globalThis: *JSC.JSGlobalObject, _: *JSC.CallFrame) callconv(.C) JSC.JSValue {
JSC.markBinding(@src());
var name_buffer: [std.os.HOST_NAME_MAX]u8 = undefined;
return JSC.ZigString.init(C.getMachine(&name_buffer)).withEncoding().toValueGC(globalThis);
}
};
2 changes: 2 additions & 0 deletions src/bun.js/os.exports.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ function bound(obj) {
uptime: obj.uptime.bind(obj),
userInfo: obj.userInfo.bind(obj),
version: obj.version.bind(obj),
machine: obj.machine.bind(obj),
devNull: obj.devNull,
EOL: obj.EOL,
constants: obj.constants,
Expand Down Expand Up @@ -45,6 +46,7 @@ export var {
uptime,
userInfo,
version,
machine,
devNull,
EOL,
constants,
Expand Down
10 changes: 10 additions & 0 deletions src/c.zig
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,16 @@ pub fn getVersion(buf: []u8) []const u8 {
}
}

pub fn getMachine(buf: []u8) []const u8 {
if (comptime Environment.isLinux) {
return linux.get_machine(buf.ptr[0..std.os.HOST_NAME_MAX]);
} else if (comptime Environment.isMac) {
return darwin.get_machine(buf);
} else {
return "unknown";
}
}

pub fn getRelease(buf: []u8) []const u8 {
if (comptime Environment.isLinux) {
return linux.get_release(buf.ptr[0..std.os.HOST_NAME_MAX]);
Expand Down
16 changes: 16 additions & 0 deletions src/darwin_c.zig
Original file line number Diff line number Diff line change
Expand Up @@ -563,6 +563,22 @@ pub fn get_version(buf: []u8) []const u8 {
return std.mem.span(std.meta.assumeSentinel(buf.ptr, 0));
}

pub fn get_machine(buf: []u8) []const u8 {
@memset(buf.ptr, 0, buf.len);

var size: usize = buf.len;

if (std.c.sysctlbyname(
"machdep.cpu.brand_string",
buf.ptr,
&size,
null,
0,
) == -1) return "unknown";

return std.mem.span(std.meta.assumeSentinel(buf.ptr, 0));
}

pub fn get_release(buf: []u8) []const u8 {
@memset(buf.ptr, 0, buf.len);

Expand Down
8 changes: 8 additions & 0 deletions src/linux_c.zig
Original file line number Diff line number Diff line change
Expand Up @@ -368,6 +368,14 @@ pub fn get_version(name_buffer: *[std.os.HOST_NAME_MAX]u8) []const u8 {
return name_buffer[0..result.len];
}

pub fn get_machine(name_buffer: *[std.os.HOST_NAME_MAX]u8) []const u8 {
const uts = std.os.uname();
const result = std.mem.sliceTo(std.meta.assumeSentinel(&uts.machine, 0), 0);
std.mem.copy(u8, name_buffer, result);

return name_buffer[0..result.len];
}

pub fn get_release(name_buffer: *[std.os.HOST_NAME_MAX]u8) []const u8 {
const uts = std.os.uname();
const result = std.mem.sliceTo(std.meta.assumeSentinel(&uts.release, 0), 0);
Expand Down
17 changes: 17 additions & 0 deletions test/bun.js/os.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,23 @@ it("networkInterfaces", () => {
}
});

it("machine", () => {
const possibleValues = [
"arm",
"aarch64",
"mips",
"mips64",
"ppc64",
"ppc64le",
"s390",
"s390x",
"i386",
"i686",
"x86_64",
];
expect(possibleValues.includes(os.machine())).toBe(true);
});

it("EOL", () => {
if (process.platform === "win32") expect(os.EOL).toBe("\\r\\n");
else expect(os.EOL).toBe("\\n");
Expand Down