Rewrite config.c

This commit is contained in:
AnErrupTion 2023-06-20 12:14:15 +02:00
parent 13c9aa7c1b
commit f086faab58
22 changed files with 89 additions and 456 deletions

View File

@ -33,7 +33,6 @@ pub fn build(b: *std.Build) void {
exe.addIncludePath("dep/dragonfail/src"); exe.addIncludePath("dep/dragonfail/src");
exe.addIncludePath("dep/termbox_next/src"); exe.addIncludePath("dep/termbox_next/src");
exe.addCSourceFile("src/config.c", &c_args);
exe.addCSourceFile("src/draw.c", &c_args); exe.addCSourceFile("src/draw.c", &c_args);
exe.addCSourceFile("src/inputs.c", &c_args); exe.addCSourceFile("src/inputs.c", &c_args);
exe.addCSourceFile("src/login.c", &c_args); exe.addCSourceFile("src/login.c", &c_args);

View File

@ -1,22 +1,24 @@
[ly]
# Animation enabled/disabled # Animation enabled/disabled
#animate = false animate = false
# The active animation # The active animation
# 0 -> PSX DOOM fire (default) # 0 -> PSX DOOM fire (default)
# 1 -> CMatrix # 1 -> CMatrix
#animation = 0 animation = 0
# format string for clock in top right corner (see strftime specification) # Format string for clock in top right corner (see strftime specification)
#clock = %c clock =
# enable/disable big clock # Enable/disable big clock
#bigclock = true bigclock = false
# The character used to mask the password # The character used to mask the password
#asterisk = * asterisk = *
# Erase password input on failure # Erase password input on failure
#blank_password = false blank_password = false
# The `fg` and `bg` color settings take a digit 0-8 corresponding to: # The `fg` and `bg` color settings take a digit 0-8 corresponding to:
#define TB_DEFAULT 0x00 #define TB_DEFAULT 0x00
@ -38,103 +40,103 @@
# config) will be used by `ly` for `fg = 8`. # config) will be used by `ly` for `fg = 8`.
# Background color id # Background color id
#bg = 0 bg = 0
# Foreground color id # Foreground color id
#fg = 9 fg = 9
# Blank main box background # Blank main box background
# Setting to false will make it transparent # Setting to false will make it transparent
#blank_box = true blank_box = true
# Remove main box borders # Remove main box borders
#hide_borders = false hide_borders = false
# Main box margins # Main box margins
#margin_box_h = 2 margin_box_h = 2
#margin_box_v = 1 margin_box_v = 1
# Input boxes length # Input boxes length
#input_len = 34 input_len = 34
# Max input sizes # Max input sizes
#max_desktop_len = 100 max_desktop_len = 100
#max_login_len = 255 max_login_len = 255
#max_password_len = 255 max_password_len = 255
# Input box active by default on startup # Input box active by default on startup
#default_input = 2 default_input = 2
# Load the saved desktop and username # Load the saved desktop and username
#load = true load = true
# Save the current desktop and login as defaults # Save the current desktop and login as defaults
#save = true save = true
# File in which to save and load the default desktop and login # File in which to save and load the default desktop and login
#save_file = /etc/ly/save save_file = /etc/ly/save
# Remove F1/F2 command hints # Remove F1/F2 command hints
#hide_f1_commands = false hide_f1_commands = false
# Command executed when pressing F1 # Command executed when pressing F1
#shutdown_cmd = /sbin/shutdown -a now shutdown_cmd = /sbin/shutdown -a now
# Command executed when pressing F2 # Command executed when pressing F2
#restart_cmd = /sbin/shutdown -r now restart_cmd = /sbin/shutdown -r now
# Active language # Active language
# Available languages are found in /etc/ly/lang/ # Available languages are found in /etc/ly/lang/
#lang = en lang = en
# tty in use # TTY in use
#tty = 2 tty = 2
# Console path # Console path
#console_dev = /dev/console console_dev = /dev/console
# Default path # Default path
#path = /sbin:/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin path = /sbin:/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin
# Event timeout in milliseconds # Event timeout in milliseconds
#min_refresh_delta = 5 min_refresh_delta = 5
# Service name (set to ly to use the provided pam config file) # Service name (set to ly to use the provided pam config file)
#service_name = ly service_name = ly
# Terminal reset command (tput is faster) # Terminal reset command (tput is faster)
#term_reset_cmd = /usr/bin/tput reset term_reset_cmd = /usr/bin/tput reset
# Cookie generator # Cookie generator
#mcookie_cmd = /usr/bin/mcookie mcookie_cmd = /usr/bin/mcookie
# Wayland setup command # Wayland setup command
#wayland_cmd = /etc/ly/wsetup.sh wayland_cmd = /etc/ly/wsetup.sh
# Add wayland specifier to session names # Add wayland specifier to session names
#wayland_specifier = false wayland_specifier = false
# Wayland desktop environments # Wayland desktop environments
#waylandsessions = /usr/share/wayland-sessions waylandsessions = /usr/share/wayland-sessions
# xinitrc # xinitrc
#xinitrc = ~/.xinitrc xinitrc = ~/.xinitrc
# Xorg server command # Xorg server command
#x_cmd = /usr/bin/X x_cmd = /usr/bin/X
# Xorg setup command # Xorg setup command
#x_cmd_setup = /etc/ly/xsetup.sh x_cmd_setup = /etc/ly/xsetup.sh
# Xorg xauthority edition tool # Xorg xauthority edition tool
#xauth_cmd = /usr/bin/xauth xauth_cmd = /usr/bin/xauth
# Xorg desktop environments # Xorg desktop environments
#xsessions = /usr/share/xsessions xsessions = /usr/share/xsessions

View File

@ -1,3 +1,4 @@
[ly]
capslock = Bloq Majús capslock = Bloq Majús
err_alloc = falla d'assignació de memòria err_alloc = falla d'assignació de memòria
err_bounds = índex fora de límit err_bounds = índex fora de límit

View File

@ -1,3 +1,4 @@
[ly]
capslock = capslock capslock = capslock
err_alloc = alokace paměti selhala err_alloc = alokace paměti selhala
err_bounds = index je mimo hranice pole err_bounds = index je mimo hranice pole

View File

@ -1,3 +1,4 @@
[ly]
capslock = Feststelltaste capslock = Feststelltaste
err_alloc = Speicherzuweisung fehlgeschlagen err_alloc = Speicherzuweisung fehlgeschlagen
err_bounds = Listenindex ist außerhalb des Bereichs err_bounds = Listenindex ist außerhalb des Bereichs

View File

@ -1,3 +1,4 @@
[ly]
capslock = capslock capslock = capslock
err_alloc = failed memory allocation err_alloc = failed memory allocation
err_bounds = out-of-bounds index err_bounds = out-of-bounds index

View File

@ -1,3 +1,4 @@
[ly]
capslock = Bloq Mayús capslock = Bloq Mayús
err_alloc = asignación de memoria fallida err_alloc = asignación de memoria fallida
err_bounds = índice fuera de límites err_bounds = índice fuera de límites

View File

@ -1,4 +1,5 @@
capslock = verr.maj [ly]
capslock = verr.maj
err_alloc = échec d'allocation mémoire err_alloc = échec d'allocation mémoire
err_bounds = indice hors-limite err_bounds = indice hors-limite
err_chdir = échec de l'ouverture du répertoire home err_chdir = échec de l'ouverture du répertoire home

View File

@ -1,3 +1,4 @@
[ly]
capslock = capslock capslock = capslock
err_alloc = impossibile allocare memoria err_alloc = impossibile allocare memoria
err_bounds = indice fuori limite err_bounds = indice fuori limite

View File

@ -1,3 +1,4 @@
[ly]
capslock = capslock capslock = capslock
err_alloc = nieudana alokacja pamięci err_alloc = nieudana alokacja pamięci
err_bounds = indeks poza granicami err_bounds = indeks poza granicami

View File

@ -1,3 +1,4 @@
[ly]
capslock = capslock capslock = capslock
err_alloc = erro na atribuição de memória err_alloc = erro na atribuição de memória
err_bounds = índice fora de limites err_bounds = índice fora de limites

View File

@ -1,3 +1,4 @@
[ly]
capslock = caixa alta capslock = caixa alta
err_alloc = alocação de memória malsucedida err_alloc = alocação de memória malsucedida
err_bounds = índice fora de limites err_bounds = índice fora de limites

View File

@ -1,3 +1,4 @@
[ly]
capslock = capslock capslock = capslock

View File

@ -1,3 +1,4 @@
[ly]
capslock = capslock capslock = capslock
err_alloc = не удалось выделить память err_alloc = не удалось выделить память
err_bounds = за пределами индекса err_bounds = за пределами индекса

View File

@ -1,3 +1,4 @@
[ly]
capslock = capslock capslock = capslock
err_alloc = neuspijesna alokacija memorije err_alloc = neuspijesna alokacija memorije
err_bounds = izvan granica indeksa err_bounds = izvan granica indeksa

View File

@ -1,3 +1,4 @@
[ly]
capslock = capslock capslock = capslock
err_alloc = misslyckad minnesallokering err_alloc = misslyckad minnesallokering
err_bounds = utanför banan index err_bounds = utanför banan index

View File

@ -1,3 +1,4 @@
[ly]
capslock = capslock capslock = capslock
err_alloc = basarisiz bellek ayirma err_alloc = basarisiz bellek ayirma
err_bounds = sinirlarin disinda dizin err_bounds = sinirlarin disinda dizin

View File

@ -1,3 +1,4 @@
[ly]
capslock = capslock capslock = capslock
err_alloc = невдале виділення пам'яті err_alloc = невдале виділення пам'яті
err_bounds = поза межами індексу err_bounds = поза межами індексу

View File

@ -1,378 +0,0 @@
#include "configator.h"
#include "config.h"
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#ifndef DEBUG
#define INI_LANG "/etc/ly/lang/%s.ini"
#define INI_CONFIG "/etc/ly/config.ini"
#else
#define INI_LANG "../res/lang/%s.ini"
#define INI_CONFIG "../res/config.ini"
#endif
static void lang_handle(void* data, char** pars, const int pars_count)
{
if (*((char**)data) != NULL)
{
free (*((char**)data));
}
*((char**)data) = strdup(*pars);
}
static void config_handle_u8(void* data, char** pars, const int pars_count)
{
if (strcmp(*pars, "") == 0)
{
*((uint8_t*)data) = 0;
}
else
{
*((uint8_t*)data) = atoi(*pars);
}
}
static void config_handle_u16(void* data, char** pars, const int pars_count)
{
if (strcmp(*pars, "") == 0)
{
*((uint16_t*)data) = 0;
}
else
{
*((uint16_t*)data) = atoi(*pars);
}
}
void config_handle_str(void* data, char** pars, const int pars_count)
{
if (*((char**)data) != NULL)
{
free(*((char**)data));
}
*((char**)data) = strdup(*pars);
}
static void config_handle_char(void* data, char** pars, const int pars_count)
{
*((char*)data) = **pars;
}
static void config_handle_bool(void* data, char** pars, const int pars_count)
{
*((bool*)data) = (strcmp("true", *pars) == 0);
}
void lang_load()
{
// must be alphabetically sorted
struct configator_param map_no_section[] =
{
{"capslock", &lang.capslock, lang_handle},
{"err_alloc", &lang.err_alloc, lang_handle},
{"err_bounds", &lang.err_bounds, lang_handle},
{"err_chdir", &lang.err_chdir, lang_handle},
{"err_console_dev", &lang.err_console_dev, lang_handle},
{"err_dgn_oob", &lang.err_dgn_oob, lang_handle},
{"err_domain", &lang.err_domain, lang_handle},
{"err_hostname", &lang.err_hostname, lang_handle},
{"err_mlock", &lang.err_mlock, lang_handle},
{"err_null", &lang.err_null, lang_handle},
{"err_pam", &lang.err_pam, lang_handle},
{"err_pam_abort", &lang.err_pam_abort, lang_handle},
{"err_pam_acct_expired", &lang.err_pam_acct_expired, lang_handle},
{"err_pam_auth", &lang.err_pam_auth, lang_handle},
{"err_pam_authinfo_unavail", &lang.err_pam_authinfo_unavail, lang_handle},
{"err_pam_authok_reqd", &lang.err_pam_authok_reqd, lang_handle},
{"err_pam_buf", &lang.err_pam_buf, lang_handle},
{"err_pam_cred_err", &lang.err_pam_cred_err, lang_handle},
{"err_pam_cred_expired", &lang.err_pam_cred_expired, lang_handle},
{"err_pam_cred_insufficient", &lang.err_pam_cred_insufficient, lang_handle},
{"err_pam_cred_unavail", &lang.err_pam_cred_unavail, lang_handle},
{"err_pam_maxtries", &lang.err_pam_maxtries, lang_handle},
{"err_pam_perm_denied", &lang.err_pam_perm_denied, lang_handle},
{"err_pam_session", &lang.err_pam_session, lang_handle},
{"err_pam_sys", &lang.err_pam_sys, lang_handle},
{"err_pam_user_unknown", &lang.err_pam_user_unknown, lang_handle},
{"err_path", &lang.err_path, lang_handle},
{"err_perm_dir", &lang.err_perm_dir, lang_handle},
{"err_perm_group", &lang.err_perm_group, lang_handle},
{"err_perm_user", &lang.err_perm_user, lang_handle},
{"err_pwnam", &lang.err_pwnam, lang_handle},
{"err_user_gid", &lang.err_user_gid, lang_handle},
{"err_user_init", &lang.err_user_init, lang_handle},
{"err_user_uid", &lang.err_user_uid, lang_handle},
{"err_xsessions_dir", &lang.err_xsessions_dir, lang_handle},
{"err_xsessions_open", &lang.err_xsessions_open, lang_handle},
{"f1", &lang.f1, lang_handle},
{"f2", &lang.f2, lang_handle},
{"login", &lang.login, lang_handle},
{"logout", &lang.logout, lang_handle},
{"numlock", &lang.numlock, lang_handle},
{"password", &lang.password, lang_handle},
{"shell", &lang.shell, lang_handle},
{"wayland", &lang.wayland, lang_handle},
{"xinitrc", &lang.xinitrc, lang_handle},
};
uint16_t map_len[] = {45};
struct configator_param* map[] =
{
map_no_section,
};
uint16_t sections_len = 0;
struct configator_param* sections = NULL;
struct configator lang;
lang.map = map;
lang.map_len = map_len;
lang.sections = sections;
lang.sections_len = sections_len;
char file[256];
snprintf(file, 256, INI_LANG, config.lang);
if (access(file, F_OK) != -1)
{
configator(&lang, file);
}
}
void config_load(const char *cfg_path)
{
if (cfg_path == NULL)
{
cfg_path = INI_CONFIG;
}
// must be alphabetically sorted
struct configator_param map_no_section[] =
{
{"animate", &config.animate, config_handle_bool},
{"animation", &config.animation, config_handle_u8},
{"asterisk", &config.asterisk, config_handle_char},
{"bg", &config.bg, config_handle_u8},
{"bigclock", &config.bigclock, config_handle_bool},
{"blank_box", &config.blank_box, config_handle_bool},
{"blank_password", &config.blank_password, config_handle_bool},
{"clock", &config.clock, config_handle_str},
{"console_dev", &config.console_dev, config_handle_str},
{"default_input", &config.default_input, config_handle_u8},
{"fg", &config.fg, config_handle_u8},
{"hide_borders", &config.hide_borders, config_handle_bool},
{"hide_f1_commands", &config.hide_f1_commands, config_handle_bool},
{"input_len", &config.input_len, config_handle_u8},
{"lang", &config.lang, config_handle_str},
{"load", &config.load, config_handle_bool},
{"margin_box_h", &config.margin_box_h, config_handle_u8},
{"margin_box_v", &config.margin_box_v, config_handle_u8},
{"max_desktop_len", &config.max_desktop_len, config_handle_u8},
{"max_login_len", &config.max_login_len, config_handle_u8},
{"max_password_len", &config.max_password_len, config_handle_u8},
{"mcookie_cmd", &config.mcookie_cmd, config_handle_str},
{"min_refresh_delta", &config.min_refresh_delta, config_handle_u16},
{"path", &config.path, config_handle_str},
{"restart_cmd", &config.restart_cmd, config_handle_str},
{"save", &config.save, config_handle_bool},
{"save_file", &config.save_file, config_handle_str},
{"service_name", &config.service_name, config_handle_str},
{"shutdown_cmd", &config.shutdown_cmd, config_handle_str},
{"term_reset_cmd", &config.term_reset_cmd, config_handle_str},
{"tty", &config.tty, config_handle_u8},
{"wayland_cmd", &config.wayland_cmd, config_handle_str},
{"wayland_specifier", &config.wayland_specifier, config_handle_bool},
{"waylandsessions", &config.waylandsessions, config_handle_str},
{"x_cmd", &config.x_cmd, config_handle_str},
{"xinitrc", &config.xinitrc, config_handle_str},
{"x_cmd_setup", &config.x_cmd_setup, config_handle_str},
{"xauth_cmd", &config.xauth_cmd, config_handle_str},
{"xsessions", &config.xsessions, config_handle_str},
};
uint16_t map_len[] = {34};
struct configator_param* map[] =
{
map_no_section,
};
uint16_t sections_len = 0;
struct configator_param* sections = NULL;
struct configator config;
config.map = map;
config.map_len = map_len;
config.sections = sections;
config.sections_len = sections_len;
configator(&config, (char *) cfg_path);
}
void lang_defaults()
{
lang.capslock = strdup("capslock");
lang.err_alloc = strdup("failed memory allocation");
lang.err_bounds = strdup("out-of-bounds index");
lang.err_chdir = strdup("failed to open home folder");
lang.err_console_dev = strdup("failed to access console");
lang.err_dgn_oob = strdup("log message");
lang.err_domain = strdup("invalid domain");
lang.err_hostname = strdup("failed to get hostname");
lang.err_mlock = strdup("failed to lock password memory");
lang.err_null = strdup("null pointer");
lang.err_pam = strdup("pam transaction failed");
lang.err_pam_abort = strdup("pam transaction aborted");
lang.err_pam_acct_expired = strdup("account expired");
lang.err_pam_auth = strdup("authentication error");
lang.err_pam_authinfo_unavail = strdup("failed to get user info");
lang.err_pam_authok_reqd = strdup("token expired");
lang.err_pam_buf = strdup("memory buffer error");
lang.err_pam_cred_err = strdup("failed to set credentials");
lang.err_pam_cred_expired = strdup("credentials expired");
lang.err_pam_cred_insufficient = strdup("insufficient credentials");
lang.err_pam_cred_unavail = strdup("failed to get credentials");
lang.err_pam_maxtries = strdup("reached maximum tries limit");
lang.err_pam_perm_denied = strdup("permission denied");
lang.err_pam_session = strdup("session error");
lang.err_pam_sys = strdup("system error");
lang.err_pam_user_unknown = strdup("unknown user");
lang.err_path = strdup("failed to set path");
lang.err_perm_dir = strdup("failed to change current directory");
lang.err_perm_group = strdup("failed to downgrade group permissions");
lang.err_perm_user = strdup("failed to downgrade user permissions");
lang.err_pwnam = strdup("failed to get user info");
lang.err_user_gid = strdup("failed to set user GID");
lang.err_user_init = strdup("failed to initialize user");
lang.err_user_uid = strdup("failed to set user UID");
lang.err_xsessions_dir = strdup("failed to find sessions folder");
lang.err_xsessions_open = strdup("failed to open sessions folder");
lang.f1 = strdup("F1 shutdown");
lang.f2 = strdup("F2 reboot");
lang.login = strdup("login:");
lang.logout = strdup("logged out");
lang.numlock = strdup("numlock");
lang.password = strdup("password:");
lang.shell = strdup("shell");
lang.wayland = strdup("wayland");
lang.xinitrc = strdup("xinitrc");
}
void config_defaults()
{
config.animate = false;
config.animation = 0;
config.asterisk = '*';
config.bg = 0;
config.bigclock = false;
config.blank_box = true;
config.blank_password = false;
config.clock = NULL;
config.console_dev = strdup("/dev/console");
config.default_input = LOGIN_INPUT;
config.fg = 9;
config.hide_borders = false;
config.input_len = 34;
config.lang = strdup("en");
config.load = true;
config.margin_box_h = 2;
config.margin_box_v = 1;
config.max_desktop_len = 100;
config.max_login_len = 255;
config.max_password_len = 255;
config.mcookie_cmd = strdup("/usr/bin/mcookie");
config.min_refresh_delta = 5;
config.path = strdup("/sbin:/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin");
config.restart_cmd = strdup("/sbin/shutdown -r now");
config.save = true;
config.save_file = strdup("/etc/ly/save");
config.service_name = strdup("ly");
config.shutdown_cmd = strdup("/sbin/shutdown -a now");
config.term_reset_cmd = strdup("/usr/bin/tput reset");
config.tty = 2;
config.wayland_cmd = strdup("/etc/ly/wsetup.sh");
config.wayland_specifier = false;
config.waylandsessions = strdup("/usr/share/wayland-sessions");
config.x_cmd = strdup("/usr/bin/X");
config.xinitrc = strdup("~/.xinitrc");
config.x_cmd_setup = strdup("/etc/ly/xsetup.sh");
config.xauth_cmd = strdup("/usr/bin/xauth");
config.xsessions = strdup("/usr/share/xsessions");
}
void lang_free()
{
free(lang.capslock);
free(lang.err_alloc);
free(lang.err_bounds);
free(lang.err_chdir);
free(lang.err_console_dev);
free(lang.err_dgn_oob);
free(lang.err_domain);
free(lang.err_hostname);
free(lang.err_mlock);
free(lang.err_null);
free(lang.err_pam);
free(lang.err_pam_abort);
free(lang.err_pam_acct_expired);
free(lang.err_pam_auth);
free(lang.err_pam_authinfo_unavail);
free(lang.err_pam_authok_reqd);
free(lang.err_pam_buf);
free(lang.err_pam_cred_err);
free(lang.err_pam_cred_expired);
free(lang.err_pam_cred_insufficient);
free(lang.err_pam_cred_unavail);
free(lang.err_pam_maxtries);
free(lang.err_pam_perm_denied);
free(lang.err_pam_session);
free(lang.err_pam_sys);
free(lang.err_pam_user_unknown);
free(lang.err_path);
free(lang.err_perm_dir);
free(lang.err_perm_group);
free(lang.err_perm_user);
free(lang.err_pwnam);
free(lang.err_user_gid);
free(lang.err_user_init);
free(lang.err_user_uid);
free(lang.err_xsessions_dir);
free(lang.err_xsessions_open);
free(lang.f1);
free(lang.f2);
free(lang.login);
free(lang.logout);
free(lang.numlock);
free(lang.password);
free(lang.shell);
free(lang.wayland);
free(lang.xinitrc);
}
void config_free()
{
free(config.clock);
free(config.console_dev);
free(config.lang);
free(config.mcookie_cmd);
free(config.path);
free(config.restart_cmd);
free(config.save_file);
free(config.service_name);
free(config.shutdown_cmd);
free(config.term_reset_cmd);
free(config.wayland_cmd);
free(config.waylandsessions);
free(config.x_cmd);
free(config.xinitrc);
free(config.x_cmd_setup);
free(config.xauth_cmd);
free(config.xsessions);
}

View File

@ -105,12 +105,4 @@ struct config
extern struct lang lang; extern struct lang lang;
extern struct config config; extern struct config config;
void config_handle_str(void* data, char** pars, const int pars_count);
void lang_load();
void config_load(const char *cfg_path);
void lang_defaults();
void config_defaults();
void lang_free();
void config_free();
#endif #endif

View File

@ -1,7 +1,7 @@
const std = @import("std"); const std = @import("std");
const configuration = @import("config.zig");
pub const c = @cImport({ pub const c = @cImport({
@cInclude("configator.h");
@cInclude("dragonfail.h"); @cInclude("dragonfail.h");
@cInclude("termbox.h"); @cInclude("termbox.h");
@ -42,15 +42,11 @@ pub fn main() !void {
config = config_ptr.*; config = config_ptr.*;
lang = lang_ptr.*; lang = lang_ptr.*;
// Load configuration
c.config_defaults();
c.lang_defaults();
// Initialize error library // Initialize error library
log_init(c.dgn_init()); log_init(c.dgn_init());
// Parse command line arguments // Parse command line arguments
var config_path: []const u8 = undefined; var config_path: []const u8 = "";
var process_args = try std.process.argsAlloc(allocator); var process_args = try std.process.argsAlloc(allocator);
defer std.process.argsFree(allocator, process_args); defer std.process.argsFree(allocator, process_args);
@ -65,26 +61,32 @@ pub fn main() !void {
std.debug.print("\n", .{}); std.debug.print("\n", .{});
std.debug.print("If you want to configure Ly, please check the config file, usually located at /etc/ly/config.ini.\n", .{}); std.debug.print("If you want to configure Ly, please check the config file, usually located at /etc/ly/config.ini.\n", .{});
std.os.exit(0); std.os.exit(0);
return;
} else if (std.mem.eql(u8, first_arg, "--version") or std.mem.eql(u8, first_arg, "-v")) { } else if (std.mem.eql(u8, first_arg, "--version") or std.mem.eql(u8, first_arg, "-v")) {
std.debug.print("Ly version {s}.\n", .{LY_VERSION}); std.debug.print("Ly version {s}.\n", .{LY_VERSION});
std.os.exit(0); std.os.exit(0);
return;
} else if (std.mem.eql(u8, first_arg, "--config") or std.mem.eql(u8, first_arg, "-c")) { } else if (std.mem.eql(u8, first_arg, "--config") or std.mem.eql(u8, first_arg, "-c")) {
if (process_args.len != 3) { if (process_args.len != 3) {
std.debug.print("Invalid usage! Correct usage: 'ly --config <path>'.\n", .{}); std.debug.print("Invalid usage! Correct usage: 'ly --config <path>'.\n", .{});
std.os.exit(1); std.os.exit(1);
return;
} }
config_path = process_args[2]; config_path = process_args[2];
} else { } else {
std.debug.print("Invalid argument: '{s}'.\n", .{first_arg}); std.debug.print("Invalid argument: '{s}'.\n", .{first_arg});
std.os.exit(1); std.os.exit(1);
return;
} }
} }
// Load configuration and language
try configuration.config_load(config_path);
try configuration.lang_load();
if (c.dgn_catch() != 0) {
configuration.config_free();
configuration.lang_free();
std.os.exit(1);
}
// Initialize inputs // Initialize inputs
var desktop = try allocator.create(c.struct_desktop); var desktop = try allocator.create(c.struct_desktop);
defer allocator.destroy(desktop); defer allocator.destroy(desktop);
@ -99,16 +101,6 @@ pub fn main() !void {
c.input_text(username, config.max_login_len); c.input_text(username, config.max_login_len);
c.input_text(password, config.max_password_len); c.input_text(password, config.max_password_len);
if (c.dgn_catch() != 0) {
c.config_free();
c.lang_free();
std.os.exit(1);
return;
}
c.config_load(config_path.ptr);
c.lang_load();
c.desktop_load(desktop); c.desktop_load(desktop);
c.load(desktop, username); c.load(desktop, username);
@ -338,14 +330,14 @@ pub fn main() !void {
// Unload configuration // Unload configuration
c.draw_free(buffer); c.draw_free(buffer);
c.lang_free(); configuration.lang_free();
if (shutdown) { if (shutdown) {
var shutdown_cmd = try std.fmt.allocPrint(allocator, "{s}", .{config.shutdown_cmd}); var shutdown_cmd = try std.fmt.allocPrint(allocator, "{s}", .{config.shutdown_cmd});
// This will never be freed! But it's fine, we're shutting down the system anyway // This will never be freed! But it's fine, we're shutting down the system anyway
defer allocator.free(shutdown_cmd); defer allocator.free(shutdown_cmd);
c.config_free(); configuration.config_free();
std.process.execv(allocator, &[_][]const u8{ "/bin/sh", "-c", shutdown_cmd }) catch return; std.process.execv(allocator, &[_][]const u8{ "/bin/sh", "-c", shutdown_cmd }) catch return;
} else if (reboot) { } else if (reboot) {
@ -353,11 +345,11 @@ pub fn main() !void {
// This will never be freed! But it's fine, we're rebooting the system anyway // This will never be freed! But it's fine, we're rebooting the system anyway
defer allocator.free(restart_cmd); defer allocator.free(restart_cmd);
c.config_free(); configuration.config_free();
std.process.execv(allocator, &[_][]const u8{ "/bin/sh", "-c", restart_cmd }) catch return; std.process.execv(allocator, &[_][]const u8{ "/bin/sh", "-c", restart_cmd }) catch return;
} else { } else {
c.config_free(); configuration.config_free();
} }
} }

View File

@ -19,6 +19,16 @@
#include <linux/vt.h> #include <linux/vt.h>
#endif #endif
static void config_handle_str(void* data, char** pars, const int pars_count)
{
if (*((char**)data) != NULL)
{
free(*((char**)data));
}
*((char**)data) = strdup(*pars);
}
void desktop_crawl( void desktop_crawl(
struct desktop* target, struct desktop* target,
char* sessions, char* sessions,