commit 90649cbc7763a01477457be256089df8f3143394
parent 9f122c571dcc6aaf0348918103fd66380cb3d7c4
Author: brookjeynes <me@brookjeynes.dev>
Date: Wed, 28 Jan 2026 14:05:28 +1000
feat: retrieve uptime from syscall instead of file read
Diffstat:
1 file changed, 11 insertions(+), 22 deletions(-)
diff --git a/src/stats.zig b/src/stats.zig
@@ -91,7 +91,6 @@ pub fn getMemory(alloc: std.mem.Allocator, options: struct { mb: bool }) ![]cons
const suffix = if (options.mb) "MB" else "MiB";
const mem_total = lbl: {
-
const line = try file_reader.interface.takeDelimiter('\n') orelse return error.MemAvailableIsNotSpecified;
var line_it = std.mem.splitScalar(u8, line, ':');
_ = line_it.next(); // Skip "MemTotal:"
@@ -133,30 +132,20 @@ pub fn getMemory(alloc: std.mem.Allocator, options: struct { mb: bool }) ![]cons
}
}
-pub fn getUptime() !struct { days: usize, minutes: usize, hours: usize } {
+pub fn getUptime() !struct { days: isize, minutes: isize, hours: isize } {
switch (builtin.os.tag) {
.linux, .openbsd => {
- const file = try std.fs.openFileAbsolute(
- "/proc/uptime",
- .{ .mode = .read_only },
- );
- defer file.close();
-
- var uptime_buf: [1024]u8 = undefined;
- const bytes = try file.readAll(&uptime_buf);
- const uptime_str = uptime_buf[0..bytes];
-
- var uptime_it = std.mem.splitScalar(u8, uptime_str, ' ');
- const uptime: usize = @intFromFloat(
- try std.fmt.parseFloat(
- f32,
- uptime_it.next() orelse return error.UptimeIsNull,
- ),
- );
+ var info: std.os.linux.Sysinfo = undefined;
+ const result: usize = std.os.linux.sysinfo(&info);
+ if (std.os.linux.E.init(result) != .SUCCESS) {
+ return error.UnknownUptime;
+ }
+ std.debug.print("{any}", .{info});
+ const uptime = info.uptime;
- const uptime_days = uptime / 86400;
- const uptime_hours = (uptime % 86400) / 3600;
- const uptime_minutes = (uptime % 3600) / 60;
+ const uptime_days = @divTrunc(uptime, 86400);
+ const uptime_hours = @divTrunc(@rem(uptime, 86400), 3600);
+ const uptime_minutes = @divTrunc(@rem(uptime, 3600), 60);
return .{
.days = uptime_days,