Compare commits

..

7 commits

Author SHA1 Message Date
AnErrupTion
3dcd883c10
termbox2: Remove Zig 0.16.0 workaround
Signed-off-by: AnErrupTion <anerruption@disroot.org>
2026-07-12 12:21:27 +02:00
AnErrupTion
e01fc945a2
Simplify tarball script
Signed-off-by: AnErrupTion <anerruption@disroot.org>
2026-07-12 12:19:44 +02:00
AnErrupTion
79bb0cacf1
Remove C compilation hacks
Signed-off-by: AnErrupTion <anerruption@disroot.org>
2026-07-12 12:17:51 +02:00
AnErrupTion
bcc2cdfcdc
Fix installation
Signed-off-by: AnErrupTion <anerruption@disroot.org>
2026-07-12 12:10:47 +02:00
AnErrupTion
f89e79c7f8
Fix compilation
Signed-off-by: AnErrupTion <anerruption@disroot.org>
2026-07-12 12:06:43 +02:00
AnErrupTion
13544be6a8
Merge branch 'master' of codeberg.org:fairyglade/ly into zig-0.17
Signed-off-by: AnErrupTion <anerruption@disroot.org>
2026-07-12 11:37:14 +02:00
AnErrupTion
8799dcbdf9
Update to Zig 0.17.0
Doesn't compile :(

Signed-off-by: AnErrupTion <anerruption@disroot.org>
2026-07-09 11:41:54 +02:00
12 changed files with 49 additions and 70 deletions

View file

@ -130,7 +130,7 @@ pub fn build(b: *std.Build) !void {
const run_cmd = b.addRunArtifact(exe); const run_cmd = b.addRunArtifact(exe);
run_cmd.step.dependOn(b.getInstallStep()); run_cmd.step.dependOn(b.getInstallStep());
if (b.args) |args| run_cmd.addArgs(args); run_cmd.addPassthruArgs();
const run_step = b.step("run", "Run the app"); const run_step = b.step("run", "Run the app");
run_step.dependOn(&run_cmd.step); run_step.dependOn(&run_cmd.step);
@ -195,7 +195,7 @@ fn getVersionStr(b: *std.Build, name: []const u8, version: std.SemanticVersion)
const git_describe_raw = b.runAllowFail(&[_][]const u8{ const git_describe_raw = b.runAllowFail(&[_][]const u8{
"git", "git",
"-C", "-C",
b.build_root.path orelse ".", try b.root.toString(b.allocator),
"describe", "describe",
"--match", "--match",
"*.*.*", "*.*.*",

View file

@ -2,18 +2,18 @@
.name = .ly, .name = .ly,
.version = "1.5.0", .version = "1.5.0",
.fingerprint = 0xa148ffcc5dc2cb59, .fingerprint = 0xa148ffcc5dc2cb59,
.minimum_zig_version = "0.16.0", .minimum_zig_version = "0.17.0",
.dependencies = .{ .dependencies = .{
.ly_ui = .{ .ly_ui = .{
.path = "ly-ui", .path = "ly-ui",
}, },
.clap = .{ .clap = .{
.url = "git+https://github.com/Hejsil/zig-clap#fc1e5cc3f6d9d3001112385ee6256d694e959d2f", .url = "git+https://github.com/Hejsil/zig-clap?ref=master#e91d66b1abba2024cd2e816426f14d233d3dad9a",
.hash = "clap-0.11.0-oBajB7foAQC3Iyn4IVCkUdYaOVVng5IZkSncySTjNig1", .hash = "clap-0.12.0-oBajB2LpAQD1BQpAukHcuwhIUoHWYNy2DzU6lDW2v2N8",
}, },
.zlua = .{ .zlua = .{
.url = "git+https://github.com/natecraddock/ziglua?ref=zig-0.16#8f271c82baa5fc43aa02a72f6da020c2025d9436", .url = "git+https://github.com/AnErrupTion/ziglua?ref=zig-0.17#4cca15ac75967115830708ca28d1d3dcde729f04",
.hash = "zlua-0.1.0-hGRpC2aABQD4D9PBVH3wAW8k32-I4969MRQ0CpOwoley", .hash = "zlua-0.1.0-hGRpC-aUBQCrVgFkeX-mNintLyM1i9_4FJU4mGSw0DgC",
}, },
}, },
.paths = .{ .paths = .{

View file

@ -1,2 +1,2 @@
#!/bin/sh #!/bin/sh
tar --zstd -cvf vendor.tar.zst zig-pkg ly-ui/zig-pkg ly-core/zig-pkg tar --zstd -cvf vendor.tar.zst zig-pkg

View file

@ -384,7 +384,7 @@ fn installText(
destination_directory: std.Io.Dir, destination_directory: std.Io.Dir,
destination_directory_path: []const u8, destination_directory_path: []const u8,
destination_file: []const u8, destination_file: []const u8,
options: std.Io.File.CreateFlags, options: std.Io.Dir.CreateFileOptions,
) !void { ) !void {
var file = try destination_directory.createFile(io, destination_file, options); var file = try destination_directory.createFile(io, destination_file, options);
defer file.close(io); defer file.close(io);

View file

@ -2,15 +2,15 @@
.name = .ly_core, .name = .ly_core,
.version = "1.1.0", .version = "1.1.0",
.fingerprint = 0xddda7afda795472, .fingerprint = 0xddda7afda795472,
.minimum_zig_version = "0.16.0", .minimum_zig_version = "0.17.0",
.dependencies = .{ .dependencies = .{
.zigini = .{ .zigini = .{
.url = "git+https://github.com/AshAmetrine/zigini?ref=master#a665d081dda42664a96da2840ea09c5ccf9d0692", .url = "git+https://github.com/AnErrupTion/zigini?ref=zig-0.17.0#29b30ec37efccb022a57e7acda83d63fa5832dd8",
.hash = "zigini-0.5.0-BSkB7e9WAACfyCBABNZiWL3gFMw18GKn3qBcPs8L1Ec1", .hash = "zigini-0.6.0-BSkB7UtYAAB6b6HEm3Pjj5WIy-uiuBYsNTNCUENVwL1t",
}, },
.translate_c = .{ .translate_c = .{
.url = "git+https://codeberg.org/ziglang/translate-c?ref=zig-0.16.x#6fe0ffc4549f15c5f2d9432c2b4460ba90ff85ac", .url = "git+https://codeberg.org/ziglang/translate-c?ref=master#2d71d6e68dd9e9ee1da2a248a1dcb5aeba683dec",
.hash = "translate_c-1.0.0-Q_BUWo_5BgD4flHdUhA31zOz0XvZk9k7lQv1ouzyNXj2", .hash = "translate_c-0.0.0-Q_BUWtI4BwDTFS7O6WTn-3qixa_s81nw_C0FHbf2aLqj",
}, },
}, },
.paths = .{ .paths = .{

View file

@ -54,7 +54,7 @@ pub fn info(self: *LogFile, io: std.Io, category: []const u8, comptime message:
} else { } else {
var buffer: [1024]u8 = undefined; var buffer: [1024]u8 = undefined;
const slice = try std.fmt.bufPrint(&buffer, message, args); const slice = try std.fmt.bufPrint(&buffer, message, args);
const msg = try std.fmt.bufPrintZ(buffer[slice.len..], "[info/{s}] {s}", .{ category, slice }); const msg = try std.fmt.bufPrintSentinel(buffer[slice.len..], "[info/{s}] {s}", .{ category, slice }, 0);
std.posix.system.syslog(std.posix.LOG.INFO, msg.ptr); std.posix.system.syslog(std.posix.LOG.INFO, msg.ptr);
} }
@ -72,7 +72,7 @@ pub fn err(self: *LogFile, io: std.Io, category: []const u8, comptime message: [
} else { } else {
var buffer: [1024]u8 = undefined; var buffer: [1024]u8 = undefined;
const slice = try std.fmt.bufPrint(&buffer, message, args); const slice = try std.fmt.bufPrint(&buffer, message, args);
const msg = try std.fmt.bufPrintZ(buffer[slice.len..], "[info/{s}] {s}", .{ category, slice }); const msg = try std.fmt.bufPrintSentinel(buffer[slice.len..], "[info/{s}] {s}", .{ category, slice }, 0);
std.posix.system.syslog(std.posix.LOG.ERR, msg.ptr); std.posix.system.syslog(std.posix.LOG.ERR, msg.ptr);
} }

View file

@ -1,7 +1,7 @@
const std = @import("std"); const std = @import("std");
const ErrInt = std.meta.Int(.unsigned, @bitSizeOf(anyerror)); const ErrInt = @Int(.unsigned, @bitSizeOf(anyerror));
const PaddingInt = std.meta.Int(.unsigned, 8 - (@bitSizeOf(ErrInt) + @bitSizeOf(bool)) % 8); const PaddingInt = @Int(.unsigned, 8 - (@bitSizeOf(ErrInt) + @bitSizeOf(bool)) % 8);
const ErrorHandler = packed struct { const ErrorHandler = packed struct {
has_error: bool = false, has_error: bool = false,

View file

@ -355,7 +355,7 @@ pub fn setNumlock(val: bool) !void {
} }
pub fn setUserContext(allocator: std.mem.Allocator, entry: UsernameEntry) !void { pub fn setUserContext(allocator: std.mem.Allocator, entry: UsernameEntry) !void {
const username_z = try allocator.dupeZ(u8, entry.username.?); const username_z = try allocator.dupeSentinel(u8, entry.username.?, 0);
defer allocator.free(username_z); defer allocator.free(username_z);
return platform_struct.setUserContextImpl(username_z.ptr, entry); return platform_struct.setUserContextImpl(username_z.ptr, entry);
@ -371,10 +371,10 @@ pub fn setUserShell(entry: *UsernameEntry) void {
} }
pub fn setEnvironmentVariable(allocator: std.mem.Allocator, name: []const u8, value: []const u8, replace: bool) !void { pub fn setEnvironmentVariable(allocator: std.mem.Allocator, name: []const u8, value: []const u8, replace: bool) !void {
const name_z = try allocator.dupeZ(u8, name); const name_z = try allocator.dupeSentinel(u8, name, 0);
defer allocator.free(name_z); defer allocator.free(name_z);
const value_z = try allocator.dupeZ(u8, value); const value_z = try allocator.dupeSentinel(u8, value, 0);
defer allocator.free(value_z); defer allocator.free(value_z);
const status = stdlib.setenv(name_z.ptr, value_z.ptr, @intFromBool(replace)); const status = stdlib.setenv(name_z.ptr, value_z.ptr, @intFromBool(replace));

View file

@ -38,18 +38,7 @@ pub fn build(b: *std.Build) void {
.optimize = optimize, .optimize = optimize,
}); });
termbox2.defineCMacro("TB_IMPL", null); termbox2.defineCMacro("TB_IMPL", null);
// TODO 0.16.0: Workaround until Aro gets better...
// https://codeberg.org/ziglang/translate-c/issues/319
termbox2.defineCMacro("_XOPEN_SOURCE", "700");
termbox2.defineCMacro("TB_OPT_ATTR_W", "32"); // Enable 24-bit color support + styling (32-bit) termbox2.defineCMacro("TB_OPT_ATTR_W", "32"); // Enable 24-bit color support + styling (32-bit)
// TODO 0.16.0: Including <fcntl.h> with -OReleaseSafe causes
// __attribute__(__error__()) to be called. Below
// is the workaround.
termbox2.defineCMacro("_FORTIFY_SOURCE", "0");
// TODO 0.16.0: Needed for now
if (target.result.os.tag == .freebsd) {
termbox2.defineCMacro("__BSD_VISIBLE", "1");
}
mod.addImport("termbox2", termbox2.mod); mod.addImport("termbox2", termbox2.mod);
const mod_tests = b.addTest(.{ const mod_tests = b.addTest(.{

View file

@ -2,18 +2,18 @@
.name = .ly_ui, .name = .ly_ui,
.version = "1.1.0", .version = "1.1.0",
.fingerprint = 0x8d11bf85a74ec803, .fingerprint = 0x8d11bf85a74ec803,
.minimum_zig_version = "0.16.0", .minimum_zig_version = "0.17.0",
.dependencies = .{ .dependencies = .{
.ly_core = .{ .ly_core = .{
.path = "../ly-core", .path = "../ly-core",
}, },
.termbox2 = .{ .termbox2 = .{
.url = "git+https://github.com/AnErrupTion/termbox2?ref=master#c7f241e8888ce243e1748b05c26a42fcfaaad936", .url = "git+https://github.com/AnErrupTion/termbox2?ref=master#496730697c662893eec43192f48ff616c2539da6",
.hash = "N-V-__8AAAUXBQD6Fwpi9m0MBqWXFFaqW5l1lVrJC2Ynj7a-", .hash = "N-V-__8AAOEWBQDt5tNdIzIFY6n8DdZsCP-6MyLoNS20wgpA",
}, },
.translate_c = .{ .translate_c = .{
.url = "git+https://codeberg.org/ziglang/translate-c?ref=zig-0.16.x#6fe0ffc4549f15c5f2d9432c2b4460ba90ff85ac", .url = "git+https://codeberg.org/ziglang/translate-c?ref=master#2d71d6e68dd9e9ee1da2a248a1dcb5aeba683dec",
.hash = "translate_c-1.0.0-Q_BUWo_5BgD4flHdUhA31zOz0XvZk9k7lQv1ouzyNXj2", .hash = "translate_c-0.0.0-Q_BUWtI4BwDTFS7O6WTn-3qixa_s81nw_C0FHbf2aLqj",
}, },
}, },
.paths = .{ .paths = .{

View file

@ -41,7 +41,7 @@ pub fn authenticate(allocator: std.mem.Allocator, io: std.Io, log_file: *LogFile
const tty_str = try std.fmt.bufPrint(&tty_buffer, "{d}", .{options.tty}); const tty_str = try std.fmt.bufPrint(&tty_buffer, "{d}", .{options.tty});
var pam_tty_buffer: [6]u8 = undefined; var pam_tty_buffer: [6]u8 = undefined;
const pam_tty_str = try std.fmt.bufPrintZ(&pam_tty_buffer, "tty{d}", .{options.tty}); const pam_tty_str = try std.fmt.bufPrintSentinel(&pam_tty_buffer, "tty{d}", .{options.tty}, 0);
// Set the XDG environment variables // Set the XDG environment variables
try log_file.info(io, "auth/env", "setting xdg environment variables", .{}); try log_file.info(io, "auth/env", "setting xdg environment variables", .{});
@ -49,10 +49,10 @@ pub fn authenticate(allocator: std.mem.Allocator, io: std.Io, log_file: *LogFile
// Open the PAM session // Open the PAM session
try log_file.info(io, "auth/pam", "encoding credentials", .{}); try log_file.info(io, "auth/pam", "encoding credentials", .{});
const login_z = try allocator.dupeZ(u8, login); const login_z = try allocator.dupeSentinel(u8, login, 0);
defer allocator.free(login_z); defer allocator.free(login_z);
const password_z = try allocator.dupeZ(u8, password); const password_z = try allocator.dupeSentinel(u8, password, 0);
defer allocator.free(password_z); defer allocator.free(password_z);
var credentials = [_:null]?[*:0]const u8{ login_z, password_z }; var credentials = [_:null]?[*:0]const u8{ login_z, password_z };
@ -199,7 +199,7 @@ fn startSession(
} }
} }
const home_z = try allocator.dupeZ(u8, user_entry.home.?); const home_z = try allocator.dupeSentinel(u8, user_entry.home.?, 0);
defer allocator.free(home_z); defer allocator.free(home_z);
// Change to the user's home directory // Change to the user's home directory
@ -294,7 +294,7 @@ fn loginConv(
switch (messages[i].?.msg_style) { switch (messages[i].?.msg_style) {
interop.pam.PAM_PROMPT_ECHO_ON => { interop.pam.PAM_PROMPT_ECHO_ON => {
const data: [*][*:0]u8 = @ptrCast(@alignCast(appdata_ptr)); const data: [*][*:0]u8 = @ptrCast(@alignCast(appdata_ptr));
username = allocator.dupeZ(u8, std.mem.span(data[0])) catch { username = allocator.dupeSentinel(u8, std.mem.span(data[0]), 0) catch {
status = interop.pam.PAM_BUF_ERR; status = interop.pam.PAM_BUF_ERR;
break :set_credentials; break :set_credentials;
}; };
@ -302,7 +302,7 @@ fn loginConv(
}, },
interop.pam.PAM_PROMPT_ECHO_OFF => { interop.pam.PAM_PROMPT_ECHO_OFF => {
const data: [*][*:0]u8 = @ptrCast(@alignCast(appdata_ptr)); const data: [*][*:0]u8 = @ptrCast(@alignCast(appdata_ptr));
password = allocator.dupeZ(u8, std.mem.span(data[1])) catch { password = allocator.dupeSentinel(u8, std.mem.span(data[1]), 0) catch {
status = interop.pam.PAM_BUF_ERR; status = interop.pam.PAM_BUF_ERR;
break :set_credentials; break :set_credentials;
}; };
@ -332,7 +332,7 @@ fn getFreeDisplay() !u8 {
var buf: [15]u8 = undefined; var buf: [15]u8 = undefined;
var i: u8 = 0; var i: u8 = 0;
while (i < 200) : (i += 1) { while (i < 200) : (i += 1) {
const xlock = try std.fmt.bufPrintZ(&buf, "/tmp/.X{d}-lock", .{i}); const xlock = try std.fmt.bufPrintSentinel(&buf, "/tmp/.X{d}-lock", .{i}, 0);
if (interop.isError(std.posix.system.access(xlock.ptr, std.posix.F_OK))) break; if (interop.isError(std.posix.system.access(xlock.ptr, std.posix.F_OK))) break;
} }
return i; return i;
@ -433,7 +433,7 @@ fn xauth(log_file: *LogFile, allocator: std.mem.Allocator, io: std.Io, display_n
try log_file.reinit(io); try log_file.reinit(io);
var cmd_buffer: [1024]u8 = undefined; var cmd_buffer: [1024]u8 = undefined;
const cmd_str = std.fmt.bufPrintZ(&cmd_buffer, "{s} add {s} . {s}", .{ options.xauth_cmd, display_name, magic_cookie }) catch std.process.exit(1); const cmd_str = std.fmt.bufPrintSentinel(&cmd_buffer, "{s} add {s} . {s}", .{ options.xauth_cmd, display_name, magic_cookie }, 0) catch std.process.exit(1);
try log_file.info(io, "auth/x11", "executing: {s} -c {s}", .{ shell, cmd_str }); try log_file.info(io, "auth/x11", "executing: {s} -c {s}", .{ shell, cmd_str });
const args = [_:null]?[*:0]const u8{ shell, "-c", cmd_str }; const args = [_:null]?[*:0]const u8{ shell, "-c", cmd_str };
@ -469,7 +469,7 @@ fn executeX11Cmd(log_file: *LogFile, allocator: std.mem.Allocator, io: std.Io, s
const display_name = try std.fmt.bufPrint(&buf, ":{d}", .{display_num}); const display_name = try std.fmt.bufPrint(&buf, ":{d}", .{display_num});
try log_file.info(io, "auth/x11", "got free display: {d}", .{display_num}); try log_file.info(io, "auth/x11", "got free display: {d}", .{display_num});
const shell_z = try allocator.dupeZ(u8, shell); const shell_z = try allocator.dupeSentinel(u8, shell, 0);
defer allocator.free(shell_z); defer allocator.free(shell_z);
try log_file.info(io, "auth/x11", "creating xauth file", .{}); try log_file.info(io, "auth/x11", "creating xauth file", .{});
@ -479,7 +479,7 @@ fn executeX11Cmd(log_file: *LogFile, allocator: std.mem.Allocator, io: std.Io, s
const pid = std.posix.system.fork(); const pid = std.posix.system.fork();
if (pid == 0) { if (pid == 0) {
var cmd_buffer: [1024]u8 = undefined; var cmd_buffer: [1024]u8 = undefined;
const cmd_str = std.fmt.bufPrintZ(&cmd_buffer, "{s} {s} {s} -auth {s}", .{ options.x_cmd, display_name, vt, xauthority }) catch std.process.exit(1); const cmd_str = std.fmt.bufPrintSentinel(&cmd_buffer, "{s} {s} {s} -auth {s}", .{ options.x_cmd, display_name, vt, xauthority }, 0) catch std.process.exit(1);
try log_file.info(io, "auth/x11", "executing: {s} -c {s} -auth {s}", .{ shell, cmd_str, xauthority }); try log_file.info(io, "auth/x11", "executing: {s} -c {s} -auth {s}", .{ shell, cmd_str, xauthority });
const args = [_:null]?[*:0]const u8{ shell_z, "-c", cmd_str }; const args = [_:null]?[*:0]const u8{ shell_z, "-c", cmd_str };
@ -508,7 +508,7 @@ fn executeX11Cmd(log_file: *LogFile, allocator: std.mem.Allocator, io: std.Io, s
xorg_pid = std.posix.system.fork(); xorg_pid = std.posix.system.fork();
if (xorg_pid == 0) { if (xorg_pid == 0) {
var cmd_buffer: [1024]u8 = undefined; var cmd_buffer: [1024]u8 = undefined;
const cmd_str = std.fmt.bufPrintZ(&cmd_buffer, "{s} {s} {s} {s}", .{ if (options.use_kmscon_vt) "kmscon-launch-gui" else "", options.setup_cmd, options.login_cmd orelse "", desktop_cmd }) catch std.process.exit(1); const cmd_str = std.fmt.bufPrintSentinel(&cmd_buffer, "{s} {s} {s} {s}", .{ if (options.use_kmscon_vt) "kmscon-launch-gui" else "", options.setup_cmd, options.login_cmd orelse "", desktop_cmd }, 0) catch std.process.exit(1);
try log_file.info(io, "auth/x11", "executing: {s} -c {s}", .{ shell, cmd_str }); try log_file.info(io, "auth/x11", "executing: {s} -c {s}", .{ shell, cmd_str });
const args = [_:null]?[*:0]const u8{ shell_z, "-c", cmd_str }; const args = [_:null]?[*:0]const u8{ shell_z, "-c", cmd_str };
@ -559,11 +559,11 @@ fn executeCmd(global_log_file: *LogFile, allocator: std.mem.Allocator, io: std.I
} }
defer if (maybe_log_file) |log_file| log_file.close(io); defer if (maybe_log_file) |log_file| log_file.close(io);
const shell_z = try allocator.dupeZ(u8, shell); const shell_z = try allocator.dupeSentinel(u8, shell, 0);
defer allocator.free(shell_z); defer allocator.free(shell_z);
var cmd_buffer: [1024]u8 = undefined; var cmd_buffer: [1024]u8 = undefined;
const cmd_str = try std.fmt.bufPrintZ(&cmd_buffer, "{s} {s} {s} {s}", .{ if (!is_terminal and options.use_kmscon_vt) "kmscon-launch-gui" else "", options.setup_cmd, options.login_cmd orelse "", exec_cmd orelse shell }); const cmd_str = try std.fmt.bufPrintSentinel(&cmd_buffer, "{s} {s} {s} {s}", .{ if (!is_terminal and options.use_kmscon_vt) "kmscon-launch-gui" else "", options.setup_cmd, options.login_cmd orelse "", exec_cmd orelse shell }, 0);
try global_log_file.info(io, "auth/sys", "executing: {s} -c {s}", .{ shell, cmd_str }); try global_log_file.info(io, "auth/sys", "executing: {s} -c {s}", .{ shell, cmd_str });
const args = [_:null]?[*:0]const u8{ shell_z, "-c", cmd_str }; const args = [_:null]?[*:0]const u8{ shell_z, "-c", cmd_str };
@ -574,15 +574,7 @@ fn executeCmd(global_log_file: *LogFile, allocator: std.mem.Allocator, io: std.I
fn redirectStandardStreams(global_log_file: *LogFile, io: std.Io, session_log: []const u8, create: bool) !std.Io.File { fn redirectStandardStreams(global_log_file: *LogFile, io: std.Io, session_log: []const u8, create: bool) !std.Io.File {
create_session_log_dir: { create_session_log_dir: {
const session_log_dir = std.Io.Dir.path.dirname(session_log) orelse break :create_session_log_dir; const session_log_dir = std.Io.Dir.path.dirname(session_log) orelse break :create_session_log_dir;
std.Io.Dir.cwd().createDirPath(io, session_log_dir) catch |err| {
var buffer = std.mem.zeroes([std.Io.Dir.max_path_bytes]u8);
const len = std.Io.Dir.cwd().realPathFile(io, session_log_dir, &buffer) catch |err| {
try global_log_file.err(io, "auth/sys", "failed to resolve path for session log file directory: {s}", .{@errorName(err)});
return err;
};
const resolved_path = buffer[0..len];
std.Io.Dir.cwd().createDirPath(io, resolved_path) catch |err| {
try global_log_file.err(io, "auth/sys", "failed to create session log file directory: {s}", .{@errorName(err)}); try global_log_file.err(io, "auth/sys", "failed to create session log file directory: {s}", .{@errorName(err)});
return err; return err;
}; };
@ -612,7 +604,7 @@ fn addUtmpEntry(io: std.Io, entry: *Utmp, username: []const u8, pid: c_int) !voi
// Get the TTY name (i.e. without the /dev/ prefix) // Get the TTY name (i.e. without the /dev/ prefix)
var ttyname_buf: [@sizeOf(@TypeOf(entry.ut_line))]u8 = undefined; var ttyname_buf: [@sizeOf(@TypeOf(entry.ut_line))]u8 = undefined;
_ = try std.fmt.bufPrintZ(&ttyname_buf, "{s}", .{tty_path["/dev/".len..]}); _ = try std.fmt.bufPrintSentinel(&ttyname_buf, "{s}", .{tty_path["/dev/".len..]}, 0);
entry.ut_line = ttyname_buf; entry.ut_line = ttyname_buf;
// Get the TTY ID (i.e. without the tty prefix) and truncate it to the size // Get the TTY ID (i.e. without the tty prefix) and truncate it to the size
@ -620,7 +612,7 @@ fn addUtmpEntry(io: std.Io, entry: *Utmp, username: []const u8, pid: c_int) !voi
entry.ut_id = ttyname_buf["tty".len..(@sizeOf(@TypeOf(entry.ut_id)) + "tty".len)].*; entry.ut_id = ttyname_buf["tty".len..(@sizeOf(@TypeOf(entry.ut_id)) + "tty".len)].*;
var username_buf: [@sizeOf(@TypeOf(entry.ut_user))]u8 = undefined; var username_buf: [@sizeOf(@TypeOf(entry.ut_user))]u8 = undefined;
_ = try std.fmt.bufPrintZ(&username_buf, "{s}", .{username}); _ = try std.fmt.bufPrintSentinel(&username_buf, "{s}", .{username}, 0);
entry.ut_user = username_buf; entry.ut_user = username_buf;

View file

@ -149,11 +149,8 @@ pub fn main(init: std.process.Init) !void {
} }
} }
var gpa: std.heap.DebugAllocator(.{ var gpa = std.heap.DebugAllocator(.{}).init;
.never_unmap = builtin.mode == .Debug, defer _ = gpa.deinit();
.retain_metadata = builtin.mode == .Debug,
}) = .init;
defer if (gpa.deinit() == .leak) std.log.err("attention please, memory has been leaked!", .{});
state.allocator = gpa.allocator(); state.allocator = gpa.allocator();
@ -306,7 +303,7 @@ pub fn main(init: std.process.Init) !void {
const username_line = reader.takeDelimiterInclusive('\n') catch break :read_save_file; const username_line = reader.takeDelimiterInclusive('\n') catch break :read_save_file;
if (std.mem.containsAtLeastScalar2(u8, username_line, '-', 1)) read_username: { if (std.mem.containsAtLeastScalar(u8, username_line, '-', 1)) read_username: {
var iterator = std.mem.splitScalar(u8, username_line[0..(username_line.len - 1)], '-'); var iterator = std.mem.splitScalar(u8, username_line[0..(username_line.len - 1)], '-');
if (iterator.next() == null) break :read_username; // Would be index if (iterator.next() == null) break :read_username; // Would be index
@ -1205,8 +1202,8 @@ pub fn main(init: std.process.Init) !void {
var iter = custom.binds.iterator(); var iter = custom.binds.iterator();
while (iter.next()) |i| { while (iter.next()) |i| {
var concat = try std.mem.concat(state.allocator, u8, &[_][]const u8{ i.key_ptr.*, " ", i.value_ptr.name }); var concat = try std.mem.concat(state.allocator, u8, &[_][]const u8{ i.key_ptr.*, " ", i.value_ptr.name });
inline for (@typeInfo(Lang).@"struct".fields) |lang_key| { inline for (@typeInfo(Lang).@"struct".field_names) |lang_key| {
const new = try std.mem.replaceOwned(u8, state.allocator, concat, "$" ++ lang_key.name, @field(state.lang, lang_key.name)); const new = try std.mem.replaceOwned(u8, state.allocator, concat, "$" ++ lang_key, @field(state.lang, lang_key));
state.allocator.free(concat); state.allocator.free(concat);
concat = new; concat = new;
} }
@ -1888,7 +1885,7 @@ fn updateBigClock(self: *BigLabel, ptr: *anyopaque) !void {
const time = try interop.getTimeOfDay(); const time = try interop.getTimeOfDay();
const animate_time = @divTrunc(time.microseconds, 500_000); const animate_time = @divTrunc(time.microseconds, 500_000);
const separator = if (state.animate and animate_time != 0) " " else ":"; const separator = if (state.animate and animate_time != 0) " " else ":";
const format = try std.fmt.bufPrintZ( const format = try std.fmt.bufPrintSentinel(
&state.bigclock_format_buf, &state.bigclock_format_buf,
"{s}{s}{s}{s}{s}{s}", "{s}{s}{s}{s}{s}{s}",
.{ .{
@ -1899,6 +1896,7 @@ fn updateBigClock(self: *BigLabel, ptr: *anyopaque) !void {
if (state.config.bigclock_seconds) "%S" else "", if (state.config.bigclock_seconds) "%S" else "",
if (state.config.bigclock_12hr) "%P" else "", if (state.config.bigclock_12hr) "%P" else "",
}, },
0,
); );
const clock_str = interop.timeAsString(state.io, &state.bigclock_buf, format); const clock_str = interop.timeAsString(state.io, &state.bigclock_buf, format);