mirror of https://github.com/fairyglade/ly
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
2.8 KiB
Zig
109 lines
2.8 KiB
Zig
const std = @import("std");
|
|
const builtin = @import("builtin");
|
|
const Allocator = std.mem.Allocator;
|
|
|
|
pub const termbox = @cImport({
|
|
@cInclude("termbox.h");
|
|
});
|
|
|
|
pub const pam = @cImport({
|
|
@cInclude("security/pam_appl.h");
|
|
});
|
|
|
|
pub const utmp = @cImport({
|
|
@cInclude("utmp.h");
|
|
});
|
|
|
|
pub const xcb = @cImport({
|
|
@cInclude("xcb/xcb.h");
|
|
});
|
|
|
|
pub const c_size = u64;
|
|
pub const c_uid = u32;
|
|
pub const c_gid = u32;
|
|
pub const c_time = c_long;
|
|
pub const tm = extern struct {
|
|
tm_sec: c_int,
|
|
tm_min: c_int,
|
|
tm_hour: c_int,
|
|
tm_mday: c_int,
|
|
tm_mon: c_int,
|
|
tm_year: c_int,
|
|
tm_wday: c_int,
|
|
tm_yday: c_int,
|
|
tm_isdst: c_int,
|
|
};
|
|
pub const passwd = extern struct {
|
|
pw_name: [*:0]u8,
|
|
pw_passwd: [*:0]u8,
|
|
|
|
pw_uid: c_uid,
|
|
pw_gid: c_gid,
|
|
pw_gecos: [*:0]u8,
|
|
pw_dir: [*:0]u8,
|
|
pw_shell: [*:0]u8,
|
|
};
|
|
|
|
pub const VT_ACTIVATE: c_int = 0x5606;
|
|
pub const VT_WAITACTIVE: c_int = 0x5607;
|
|
|
|
pub const KDGETLED: c_int = 0x4B31;
|
|
pub const KDGKBLED: c_int = 0x4B64;
|
|
|
|
pub const LED_NUM: c_int = 0x02;
|
|
pub const LED_CAP: c_int = 0x04;
|
|
|
|
pub const K_NUMLOCK: c_int = 0x02;
|
|
pub const K_CAPSLOCK: c_int = 0x04;
|
|
|
|
pub extern "c" fn localtime(timer: *const c_time) *tm;
|
|
pub extern "c" fn strftime(str: [*:0]u8, maxsize: c_size, format: [*:0]const u8, timeptr: *const tm) c_size;
|
|
pub extern "c" fn setenv(name: [*:0]const u8, value: [*:0]const u8, overwrite: c_int) c_int;
|
|
pub extern "c" fn putenv(name: [*:0]u8) c_int;
|
|
pub extern "c" fn getuid() c_uid;
|
|
pub extern "c" fn getpwnam(name: [*:0]const u8) ?*passwd;
|
|
pub extern "c" fn endpwent() void;
|
|
pub extern "c" fn setusershell() void;
|
|
pub extern "c" fn getusershell() [*:0]u8;
|
|
pub extern "c" fn endusershell() void;
|
|
pub extern "c" fn initgroups(user: [*:0]const u8, group: c_gid) c_int;
|
|
|
|
pub fn timeAsString(buf: [:0]u8, format: [:0]const u8) ![]u8 {
|
|
const timer = std.time.timestamp();
|
|
const tm_info = localtime(&timer);
|
|
|
|
const len = strftime(buf, buf.len, format, tm_info);
|
|
if (len < 0) return error.CannotGetFormattedTime;
|
|
|
|
return buf[0..len];
|
|
}
|
|
|
|
pub fn getLockState(console_dev: [:0]const u8) !struct {
|
|
numlock: bool,
|
|
capslock: bool,
|
|
} {
|
|
const fd = std.c.open(console_dev, .{ .ACCMODE = .RDONLY });
|
|
if (fd < 0) return error.CannotOpenConsoleDev;
|
|
defer _ = std.c.close(fd);
|
|
|
|
var numlock = false;
|
|
var capslock = false;
|
|
|
|
if (builtin.os.tag.isBSD()) {
|
|
var led: c_int = undefined;
|
|
_ = std.c.ioctl(fd, KDGETLED, &led);
|
|
numlock = (led & LED_NUM) != 0;
|
|
capslock = (led & LED_CAP) != 0;
|
|
} else {
|
|
var led: c_char = undefined;
|
|
_ = std.c.ioctl(fd, KDGKBLED, &led);
|
|
numlock = (led & K_NUMLOCK) != 0;
|
|
capslock = (led & K_CAPSLOCK) != 0;
|
|
}
|
|
|
|
return .{
|
|
.numlock = numlock,
|
|
.capslock = capslock,
|
|
};
|
|
}
|