From f086faab5868d3832fc95640f183cc21d63103f3 Mon Sep 17 00:00:00 2001 From: AnErrupTion Date: Tue, 20 Jun 2023 12:14:15 +0200 Subject: [PATCH] Rewrite config.c --- build.zig | 1 - res/config.ini | 88 +++++------ res/lang/cat.ini | 1 + res/lang/cs.ini | 1 + res/lang/de.ini | 1 + res/lang/en.ini | 1 + res/lang/es.ini | 1 + res/lang/fr.ini | 3 +- res/lang/it.ini | 1 + res/lang/pl.ini | 1 + res/lang/pt.ini | 1 + res/lang/pt_BR.ini | 1 + res/lang/ro.ini | 1 + res/lang/ru.ini | 1 + res/lang/sr.ini | 1 + res/lang/sv.ini | 1 + res/lang/tr.ini | 1 + res/lang/uk.ini | 1 + src/config.c | 378 --------------------------------------------- src/config.h | 8 - src/main.zig | 40 ++--- src/utils.c | 12 +- 22 files changed, 89 insertions(+), 456 deletions(-) delete mode 100644 src/config.c diff --git a/build.zig b/build.zig index b8979bc..1ed4e1f 100644 --- a/build.zig +++ b/build.zig @@ -33,7 +33,6 @@ pub fn build(b: *std.Build) void { exe.addIncludePath("dep/dragonfail/src"); exe.addIncludePath("dep/termbox_next/src"); - exe.addCSourceFile("src/config.c", &c_args); exe.addCSourceFile("src/draw.c", &c_args); exe.addCSourceFile("src/inputs.c", &c_args); exe.addCSourceFile("src/login.c", &c_args); diff --git a/res/config.ini b/res/config.ini index e454e10..554cb5e 100644 --- a/res/config.ini +++ b/res/config.ini @@ -1,24 +1,26 @@ +[ly] + # Animation enabled/disabled -#animate = false +animate = false # The active animation # 0 -> PSX DOOM fire (default) # 1 -> CMatrix -#animation = 0 +animation = 0 -# format string for clock in top right corner (see strftime specification) -#clock = %c +# Format string for clock in top right corner (see strftime specification) +clock = -# enable/disable big clock -#bigclock = true +# Enable/disable big clock +bigclock = false # The character used to mask the password -#asterisk = * +asterisk = * # 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_BLACK 0x01 #define TB_RED 0x02 @@ -38,103 +40,103 @@ # config) will be used by `ly` for `fg = 8`. # Background color id -#bg = 0 +bg = 0 # Foreground color id -#fg = 9 +fg = 9 # Blank main box background # Setting to false will make it transparent -#blank_box = true +blank_box = true # Remove main box borders -#hide_borders = false +hide_borders = false # Main box margins -#margin_box_h = 2 -#margin_box_v = 1 +margin_box_h = 2 +margin_box_v = 1 # Input boxes length -#input_len = 34 +input_len = 34 # Max input sizes -#max_desktop_len = 100 -#max_login_len = 255 -#max_password_len = 255 +max_desktop_len = 100 +max_login_len = 255 +max_password_len = 255 # Input box active by default on startup -#default_input = 2 +default_input = 2 # Load the saved desktop and username -#load = true +load = true # Save the current desktop and login as defaults -#save = true +save = true # 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 -#hide_f1_commands = false +hide_f1_commands = false # Command executed when pressing F1 -#shutdown_cmd = /sbin/shutdown -a now +shutdown_cmd = /sbin/shutdown -a now # Command executed when pressing F2 -#restart_cmd = /sbin/shutdown -r now +restart_cmd = /sbin/shutdown -r now # Active language # Available languages are found in /etc/ly/lang/ -#lang = en +lang = en -# tty in use -#tty = 2 +# TTY in use +tty = 2 # Console path -#console_dev = /dev/console +console_dev = /dev/console # 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 -#min_refresh_delta = 5 +min_refresh_delta = 5 # Service name (set to ly to use the provided pam config file) -#service_name = ly +service_name = ly # Terminal reset command (tput is faster) -#term_reset_cmd = /usr/bin/tput reset +term_reset_cmd = /usr/bin/tput reset # Cookie generator -#mcookie_cmd = /usr/bin/mcookie +mcookie_cmd = /usr/bin/mcookie # Wayland setup command -#wayland_cmd = /etc/ly/wsetup.sh +wayland_cmd = /etc/ly/wsetup.sh # Add wayland specifier to session names -#wayland_specifier = false +wayland_specifier = false # Wayland desktop environments -#waylandsessions = /usr/share/wayland-sessions +waylandsessions = /usr/share/wayland-sessions # xinitrc -#xinitrc = ~/.xinitrc +xinitrc = ~/.xinitrc # Xorg server command -#x_cmd = /usr/bin/X +x_cmd = /usr/bin/X # Xorg setup command -#x_cmd_setup = /etc/ly/xsetup.sh +x_cmd_setup = /etc/ly/xsetup.sh # Xorg xauthority edition tool -#xauth_cmd = /usr/bin/xauth +xauth_cmd = /usr/bin/xauth # Xorg desktop environments -#xsessions = /usr/share/xsessions +xsessions = /usr/share/xsessions diff --git a/res/lang/cat.ini b/res/lang/cat.ini index 431625c..6389310 100755 --- a/res/lang/cat.ini +++ b/res/lang/cat.ini @@ -1,3 +1,4 @@ +[ly] capslock = Bloq Majús err_alloc = falla d'assignació de memòria err_bounds = índex fora de límit diff --git a/res/lang/cs.ini b/res/lang/cs.ini index 88fa6cf..8c89f2e 100644 --- a/res/lang/cs.ini +++ b/res/lang/cs.ini @@ -1,3 +1,4 @@ +[ly] capslock = capslock err_alloc = alokace paměti selhala err_bounds = index je mimo hranice pole diff --git a/res/lang/de.ini b/res/lang/de.ini index 9a6749d..6977ccd 100644 --- a/res/lang/de.ini +++ b/res/lang/de.ini @@ -1,3 +1,4 @@ +[ly] capslock = Feststelltaste err_alloc = Speicherzuweisung fehlgeschlagen err_bounds = Listenindex ist außerhalb des Bereichs diff --git a/res/lang/en.ini b/res/lang/en.ini index ecdc9ca..eb497a8 100644 --- a/res/lang/en.ini +++ b/res/lang/en.ini @@ -1,3 +1,4 @@ +[ly] capslock = capslock err_alloc = failed memory allocation err_bounds = out-of-bounds index diff --git a/res/lang/es.ini b/res/lang/es.ini index a8331a0..899e014 100644 --- a/res/lang/es.ini +++ b/res/lang/es.ini @@ -1,3 +1,4 @@ +[ly] capslock = Bloq Mayús err_alloc = asignación de memoria fallida err_bounds = índice fuera de límites diff --git a/res/lang/fr.ini b/res/lang/fr.ini index b832b6d..3e1a304 100644 --- a/res/lang/fr.ini +++ b/res/lang/fr.ini @@ -1,4 +1,5 @@ -capslock = verr.maj +[ly] +capslock = verr.maj err_alloc = échec d'allocation mémoire err_bounds = indice hors-limite err_chdir = échec de l'ouverture du répertoire home diff --git a/res/lang/it.ini b/res/lang/it.ini index 637bd64..3d82fdd 100644 --- a/res/lang/it.ini +++ b/res/lang/it.ini @@ -1,3 +1,4 @@ +[ly] capslock = capslock err_alloc = impossibile allocare memoria err_bounds = indice fuori limite diff --git a/res/lang/pl.ini b/res/lang/pl.ini index 1804669..6b8022f 100644 --- a/res/lang/pl.ini +++ b/res/lang/pl.ini @@ -1,3 +1,4 @@ +[ly] capslock = capslock err_alloc = nieudana alokacja pamięci err_bounds = indeks poza granicami diff --git a/res/lang/pt.ini b/res/lang/pt.ini index 756fd0f..555d399 100644 --- a/res/lang/pt.ini +++ b/res/lang/pt.ini @@ -1,3 +1,4 @@ +[ly] capslock = capslock err_alloc = erro na atribuição de memória err_bounds = índice fora de limites diff --git a/res/lang/pt_BR.ini b/res/lang/pt_BR.ini index 0213046..cd70c89 100644 --- a/res/lang/pt_BR.ini +++ b/res/lang/pt_BR.ini @@ -1,3 +1,4 @@ +[ly] capslock = caixa alta err_alloc = alocação de memória malsucedida err_bounds = índice fora de limites diff --git a/res/lang/ro.ini b/res/lang/ro.ini index 578f924..7e7f18c 100644 --- a/res/lang/ro.ini +++ b/res/lang/ro.ini @@ -1,3 +1,4 @@ +[ly] capslock = capslock diff --git a/res/lang/ru.ini b/res/lang/ru.ini index df8e307..ae915da 100644 --- a/res/lang/ru.ini +++ b/res/lang/ru.ini @@ -1,3 +1,4 @@ +[ly] capslock = capslock err_alloc = не удалось выделить память err_bounds = за пределами индекса diff --git a/res/lang/sr.ini b/res/lang/sr.ini index 04bd679..1f3618c 100644 --- a/res/lang/sr.ini +++ b/res/lang/sr.ini @@ -1,3 +1,4 @@ +[ly] capslock = capslock err_alloc = neuspijesna alokacija memorije err_bounds = izvan granica indeksa diff --git a/res/lang/sv.ini b/res/lang/sv.ini index 66f9618..c9128a1 100644 --- a/res/lang/sv.ini +++ b/res/lang/sv.ini @@ -1,3 +1,4 @@ +[ly] capslock = capslock err_alloc = misslyckad minnesallokering err_bounds = utanför banan index diff --git a/res/lang/tr.ini b/res/lang/tr.ini index bc7e179..f912d96 100644 --- a/res/lang/tr.ini +++ b/res/lang/tr.ini @@ -1,3 +1,4 @@ +[ly] capslock = capslock err_alloc = basarisiz bellek ayirma err_bounds = sinirlarin disinda dizin diff --git a/res/lang/uk.ini b/res/lang/uk.ini index 3a2d703..3d5240a 100644 --- a/res/lang/uk.ini +++ b/res/lang/uk.ini @@ -1,3 +1,4 @@ +[ly] capslock = capslock err_alloc = невдале виділення пам'яті err_bounds = поза межами індексу diff --git a/src/config.c b/src/config.c deleted file mode 100644 index 506c794..0000000 --- a/src/config.c +++ /dev/null @@ -1,378 +0,0 @@ -#include "configator.h" - -#include "config.h" - -#include -#include -#include -#include -#include -#include -#include - -#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); -} diff --git a/src/config.h b/src/config.h index 914cf05..d932ac2 100644 --- a/src/config.h +++ b/src/config.h @@ -105,12 +105,4 @@ struct config extern struct lang lang; 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 diff --git a/src/main.zig b/src/main.zig index b210ef5..f147596 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1,7 +1,7 @@ const std = @import("std"); +const configuration = @import("config.zig"); pub const c = @cImport({ - @cInclude("configator.h"); @cInclude("dragonfail.h"); @cInclude("termbox.h"); @@ -42,15 +42,11 @@ pub fn main() !void { config = config_ptr.*; lang = lang_ptr.*; - // Load configuration - c.config_defaults(); - c.lang_defaults(); - // Initialize error library log_init(c.dgn_init()); // Parse command line arguments - var config_path: []const u8 = undefined; + var config_path: []const u8 = ""; var process_args = try std.process.argsAlloc(allocator); defer std.process.argsFree(allocator, process_args); @@ -65,26 +61,32 @@ pub fn main() !void { 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.os.exit(0); - return; } 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.os.exit(0); - return; } else if (std.mem.eql(u8, first_arg, "--config") or std.mem.eql(u8, first_arg, "-c")) { if (process_args.len != 3) { std.debug.print("Invalid usage! Correct usage: 'ly --config '.\n", .{}); std.os.exit(1); - return; } config_path = process_args[2]; } else { std.debug.print("Invalid argument: '{s}'.\n", .{first_arg}); 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 var desktop = try allocator.create(c.struct_desktop); defer allocator.destroy(desktop); @@ -99,16 +101,6 @@ pub fn main() !void { c.input_text(username, config.max_login_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.load(desktop, username); @@ -338,14 +330,14 @@ pub fn main() !void { // Unload configuration c.draw_free(buffer); - c.lang_free(); + configuration.lang_free(); if (shutdown) { 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 defer allocator.free(shutdown_cmd); - c.config_free(); + configuration.config_free(); std.process.execv(allocator, &[_][]const u8{ "/bin/sh", "-c", shutdown_cmd }) catch return; } 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 defer allocator.free(restart_cmd); - c.config_free(); + configuration.config_free(); std.process.execv(allocator, &[_][]const u8{ "/bin/sh", "-c", restart_cmd }) catch return; } else { - c.config_free(); + configuration.config_free(); } } diff --git a/src/utils.c b/src/utils.c index b7bfabc..bc55e4a 100644 --- a/src/utils.c +++ b/src/utils.c @@ -19,6 +19,16 @@ #include #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( struct desktop* target, char* sessions, @@ -273,4 +283,4 @@ void load(struct desktop* desktop, struct text* login) fclose(fp); free(line); -} +} \ No newline at end of file