From 10854e643a1748cfcf303423caf09e0fdc45f39a Mon Sep 17 00:00:00 2001 From: AnErrupTion Date: Sun, 30 Nov 2025 09:14:10 +0100 Subject: [PATCH 01/11] Don't crash when failing to parse arguments Signed-off-by: AnErrupTion --- res/lang/ar.ini | 5 +++-- res/lang/cat.ini | 5 +++-- res/lang/cs.ini | 5 +++-- res/lang/de.ini | 5 +++-- res/lang/en.ini | 7 ++++--- res/lang/es.ini | 5 +++-- res/lang/fr.ini | 5 +++-- res/lang/it.ini | 5 +++-- res/lang/ja_JP.ini | 5 +++-- res/lang/lv.ini | 5 +++-- res/lang/pl.ini | 5 +++-- res/lang/pt.ini | 5 +++-- res/lang/pt_BR.ini | 5 +++-- res/lang/ro.ini | 3 ++- res/lang/ru.ini | 5 +++-- res/lang/sr.ini | 5 +++-- res/lang/sv.ini | 5 +++-- res/lang/tr.ini | 5 +++-- res/lang/uk.ini | 5 +++-- res/lang/zh_CN.ini | 5 +++-- src/config/Lang.zig | 1 + src/main.zig | 42 ++++++++++++++++++++++++++++-------------- 22 files changed, 89 insertions(+), 54 deletions(-) diff --git a/res/lang/ar.ini b/res/lang/ar.ini index b70dbe0..6f48471 100644 --- a/res/lang/ar.ini +++ b/res/lang/ar.ini @@ -5,6 +5,7 @@ capslock = capslock err_alloc = فشل في تخصيص الذاكرة + err_bounds = out-of-bounds index err_brightness_change = فشل في تغيير سطوع الشاشة err_chdir = فشل في فتح مجلد المنزل @@ -15,6 +16,7 @@ err_domain = اسم نطاق غير صالح err_empty_password = لا يُسمح بكلمة مرور فارغة err_envlist = فشل في جلب قائمة المتغيرات البيئية + err_hostname = فشل في جلب اسم المضيف (Hostname) @@ -42,7 +44,6 @@ err_perm_dir = فشل في تغيير المجلد الحالي err_perm_group = فشل في تخفيض صلاحيات المجموعة (Group permissions) err_perm_user = فشل في تخفيض صلاحيات المستخدم (User permissions) err_pwnam = فشل في جلب معلومات المستخدم - err_sleep = فشل في تنفيذ أمر sleep @@ -55,6 +56,7 @@ err_xauth = فشل في تنفيذ أمر xauth err_xcb_conn = فشل في الاتصال بمكتبة XCB err_xsessions_dir = فشل في العثور على مجلد Xsessions err_xsessions_open = فشل في فتح مجلد Xsessions + insert = ادخال login = تسجيل الدخول logout = تم تسجيل خروجك @@ -67,7 +69,6 @@ restart = اعادة التشغيل shell = shell shutdown = ايقاف التشغيل sleep = وضع السكون - wayland = wayland x11 = x11 xinitrc = xinitrc diff --git a/res/lang/cat.ini b/res/lang/cat.ini index 302ddbd..f7e4343 100644 --- a/res/lang/cat.ini +++ b/res/lang/cat.ini @@ -5,6 +5,7 @@ capslock = Bloq Majús err_alloc = assignació de memòria fallida + err_bounds = índex fora de límits err_brightness_change = error en canviar la brillantor err_chdir = error en obrir la carpeta home @@ -15,6 +16,7 @@ err_domain = domini invàlid err_envlist = error en obtenir l'envlist + err_hostname = error en obtenir el nom de l'amfitrió @@ -47,7 +49,6 @@ err_pwnam = error en obtenir la informació de l'usuari - err_user_gid = error en establir el GID de l'usuari err_user_init = error en inicialitzar usuari err_user_uid = error en establir l'UID de l'usuari @@ -55,6 +56,7 @@ err_xauth = error en la comanda xauth err_xcb_conn = error en la connexió xcb err_xsessions_dir = error en trobar la carpeta de sessions err_xsessions_open = error en obrir la carpeta de sessions + insert = inserir login = iniciar sessió logout = sessió tancada @@ -67,7 +69,6 @@ restart = reiniciar shell = shell shutdown = aturar sleep = suspendre - wayland = wayland x11 = x11 xinitrc = xinitrc diff --git a/res/lang/cs.ini b/res/lang/cs.ini index 50af836..c25ace1 100644 --- a/res/lang/cs.ini +++ b/res/lang/cs.ini @@ -5,6 +5,7 @@ capslock = capslock err_alloc = alokace paměti selhala + err_bounds = index je mimo hranice pole err_chdir = nelze otevřít domovský adresář @@ -15,6 +16,7 @@ err_domain = neplatná doména + err_hostname = nelze získat název hostitele @@ -47,7 +49,6 @@ err_pwnam = nelze získat informace o uživateli - err_user_gid = nastavení GID uživatele selhalo err_user_init = inicializace uživatele selhala err_user_uid = nastavení UID uživateli selhalo @@ -56,6 +57,7 @@ err_user_uid = nastavení UID uživateli selhalo err_xsessions_dir = nepodařilo se najít složku relací err_xsessions_open = nepodařilo se otevřít složku relací + login = uživatel logout = odhlášen @@ -67,7 +69,6 @@ restart = restartovat shell = příkazový řádek shutdown = vypnout - wayland = wayland xinitrc = xinitrc diff --git a/res/lang/de.ini b/res/lang/de.ini index 68cc4a6..ac8f654 100644 --- a/res/lang/de.ini +++ b/res/lang/de.ini @@ -5,6 +5,7 @@ capslock = Feststelltaste err_alloc = Speicherzuweisung fehlgeschlagen + err_bounds = Index ausserhalb des Bereichs err_brightness_change = Helligkeitsänderung fehlgeschlagen err_chdir = Fehler beim Oeffnen des Home-Ordners @@ -15,6 +16,7 @@ err_domain = Ungueltige Domain err_empty_password = Leeres Passwort nicht zugelassen err_envlist = Fehler beim Abrufen der Umgebungs-Variablen + err_hostname = Abrufen des Hostnames fehlgeschlagen @@ -42,7 +44,6 @@ err_perm_dir = Ordnerwechsel fehlgeschlagen err_perm_group = Fehler beim Heruntersetzen der Gruppenberechtigungen err_perm_user = Fehler beim Heruntersetzen der Nutzerberechtigungen err_pwnam = Abrufen der Benutzerinformationen fehlgeschlagen - err_sleep = Sleep-Befehl fehlgeschlagen @@ -55,6 +56,7 @@ err_xauth = Xauth-Befehl fehlgeschlagen err_xcb_conn = xcb-Verbindung fehlgeschlagen err_xsessions_dir = Fehler beim Finden des Sitzungsordners err_xsessions_open = Fehler beim Oeffnen des Sitzungsordners + insert = Einfügen login = Nutzer logout = Abmelden @@ -67,7 +69,6 @@ restart = Neustarten shell = Shell shutdown = Herunterfahren sleep = Sleep - wayland = wayland x11 = X11 xinitrc = xinitrc diff --git a/res/lang/en.ini b/res/lang/en.ini index 513ee72..325e9b9 100644 --- a/res/lang/en.ini +++ b/res/lang/en.ini @@ -4,6 +4,7 @@ brightness_up = increase brightness capslock = capslock custom = custom err_alloc = failed memory allocation +err_args = unable to parse command line arguments err_autologin_session = autologin session not found err_bounds = out-of-bounds index err_brightness_change = failed to change brightness @@ -15,6 +16,7 @@ err_domain = invalid domain err_empty_password = empty password not allowed err_envlist = failed to get envlist err_get_active_tty = failed to get active tty +err_hibernate = failed to execute hibernate command err_hostname = failed to get hostname err_lock_state = failed to get lock state err_log = failed to open log file @@ -42,8 +44,7 @@ err_perm_dir = failed to change current directory err_perm_group = failed to downgrade group permissions err_perm_user = failed to downgrade user permissions err_pwnam = failed to get user info - - +err_sleep = failed to execute sleep command err_battery = failed to load battery status err_switch_tty = failed to switch tty err_tty_ctrl = tty control transfer failed @@ -55,6 +56,7 @@ err_xauth = xauth command failed err_xcb_conn = xcb connection failed err_xsessions_dir = failed to find sessions folder err_xsessions_open = failed to open sessions folder +hibernate = hibernate insert = insert login = login logout = logged out @@ -67,7 +69,6 @@ restart = reboot shell = shell shutdown = shutdown sleep = sleep - wayland = wayland x11 = x11 xinitrc = xinitrc diff --git a/res/lang/es.ini b/res/lang/es.ini index a00d866..fe720c7 100644 --- a/res/lang/es.ini +++ b/res/lang/es.ini @@ -5,6 +5,7 @@ capslock = Bloq Mayús err_alloc = asignación de memoria fallida + err_bounds = índice fuera de límites err_chdir = error al abrir la carpeta home @@ -15,6 +16,7 @@ err_domain = dominio inválido + err_hostname = error al obtener el nombre de host @@ -47,7 +49,6 @@ err_pwnam = error al obtener la información del usuario - err_user_gid = error al establecer el GID del usuario err_user_init = error al inicializar usuario err_user_uid = error al establecer el UID del usuario @@ -55,6 +56,7 @@ err_user_uid = error al establecer el UID del usuario err_xsessions_dir = error al buscar la carpeta de sesiones err_xsessions_open = error al abrir la carpeta de sesiones + insert = insertar login = usuario logout = cerrar sesión @@ -67,7 +69,6 @@ restart = reiniciar shell = shell shutdown = apagar sleep = suspender - wayland = wayland xinitrc = xinitrc diff --git a/res/lang/fr.ini b/res/lang/fr.ini index 82083c7..1ed64e4 100644 --- a/res/lang/fr.ini +++ b/res/lang/fr.ini @@ -5,6 +5,7 @@ capslock = verr.maj custom = customisé err_alloc = échec d'allocation mémoire + err_bounds = indice hors-limite err_brightness_change = échec du changement de luminosité err_chdir = échec de l'ouverture du répertoire home @@ -15,6 +16,7 @@ err_domain = domaine invalide err_empty_password = mot de passe vide non autorisé err_envlist = échec de lecture de la liste d'environnement err_get_active_tty = échec de lecture du terminal actif + err_hostname = échec de lecture du nom d'hôte err_lock_state = échec de lecture de l'état de verrouillage err_log = échec de l'ouverture du fichier de journal @@ -42,7 +44,6 @@ err_perm_dir = échec de changement de répertoire err_perm_group = échec du déclassement des permissions de groupe err_perm_user = échec du déclassement des permissions utilisateur err_pwnam = échec de lecture des infos utilisateur - err_sleep = échec de l'exécution de la commande de veille err_battery = échec de lecture de l'état de la batterie err_switch_tty = échec du changement de terminal @@ -55,6 +56,7 @@ err_xauth = échec de la commande xauth err_xcb_conn = échec de la connexion xcb err_xsessions_dir = échec de la recherche du dossier de sessions err_xsessions_open = échec de l'ouverture du dossier de sessions + insert = insertion login = identifiant logout = déconnecté @@ -67,7 +69,6 @@ restart = redémarrer shell = shell shutdown = éteindre sleep = veille - wayland = wayland x11 = x11 xinitrc = xinitrc diff --git a/res/lang/it.ini b/res/lang/it.ini index 35dcb6a..5cab01d 100644 --- a/res/lang/it.ini +++ b/res/lang/it.ini @@ -5,6 +5,7 @@ capslock = capslock err_alloc = impossibile allocare memoria + err_bounds = indice fuori limite err_chdir = impossibile aprire home directory @@ -15,6 +16,7 @@ err_domain = dominio non valido + err_hostname = impossibile ottenere hostname @@ -47,7 +49,6 @@ err_pwnam = impossibile ottenere dati utente - err_user_gid = impossibile impostare GID utente err_user_init = impossibile inizializzare utente err_user_uid = impossible impostare UID utente @@ -56,6 +57,7 @@ err_user_uid = impossible impostare UID utente err_xsessions_dir = impossibile localizzare cartella sessioni err_xsessions_open = impossibile aprire cartella sessioni + login = username logout = scollegato @@ -67,7 +69,6 @@ restart = riavvio shell = shell shutdown = arresto - wayland = wayland xinitrc = xinitrc diff --git a/res/lang/ja_JP.ini b/res/lang/ja_JP.ini index ef126d6..44fff53 100644 --- a/res/lang/ja_JP.ini +++ b/res/lang/ja_JP.ini @@ -5,6 +5,7 @@ capslock = CapsLock err_alloc = メモリ割り当て失敗 + err_bounds = 境界外インデックス err_brightness_change = 明るさの変更に失敗しました err_chdir = ホームフォルダを開けませんでした @@ -15,6 +16,7 @@ err_domain = 無効なドメイン err_empty_password = 空のパスワードは許可されていません err_envlist = 環境変数リストの取得に失敗しました + err_hostname = ホスト名の取得に失敗しました @@ -42,7 +44,6 @@ err_perm_dir = カレントディレクトリの変更に失敗しました err_perm_group = グループ権限のダウングレードに失敗しました err_perm_user = ユーザー権限のダウングレードに失敗しました err_pwnam = ユーザー情報の取得に失敗しました - err_sleep = スリープコマンドの実行に失敗しました @@ -55,6 +56,7 @@ err_xauth = xauthコマンドの実行に失敗しました err_xcb_conn = XCB接続に失敗しました err_xsessions_dir = セッションフォルダが見つかりませんでした err_xsessions_open = セッションフォルダを開けませんでした + insert = 挿入 login = ログイン logout = ログアウト済み @@ -67,7 +69,6 @@ restart = 再起動 shell = シェル shutdown = シャットダウン sleep = スリープ - wayland = Wayland x11 = X11 xinitrc = xinitrc diff --git a/res/lang/lv.ini b/res/lang/lv.ini index 40992bc..7d0947f 100644 --- a/res/lang/lv.ini +++ b/res/lang/lv.ini @@ -5,6 +5,7 @@ capslock = caps lock custom = pielāgots err_alloc = neizdevās atmiņas piešķiršana + err_bounds = indekss ārpus robežām err_brightness_change = neizdevās mainīt spilgtumu err_chdir = neizdevās atvērt mājas mapi @@ -15,6 +16,7 @@ err_domain = nederīgs domēns err_empty_password = tukša parole nav atļauta err_envlist = neizdevās iegūt vides mainīgo sarakstu err_get_active_tty = neizdevās iegūt aktīvo tty + err_hostname = neizdevās iegūt hostname err_lock_state = neizdevās iegūt bloķēšanas stāvokli err_log = neizdevās atvērt žurnāla failu @@ -42,7 +44,6 @@ err_perm_dir = neizdevās mainīt pašreizējo mapi err_perm_group = neizdevās pazemināt grupas atļaujas err_perm_user = neizdevās pazemināt lietotāja atļaujas err_pwnam = neizdevās iegūt lietotāja informāciju - err_sleep = neizdevās izpildīt miega komandu err_battery = neizdevās ielādēt akumulatora stāvokli err_switch_tty = neizdevās pārslēgt tty @@ -55,6 +56,7 @@ err_xauth = xauth komanda neizdevās err_xcb_conn = xcb savienojums neizdevās err_xsessions_dir = neizdevās atrast sesiju mapi err_xsessions_open = neizdevās atvērt sesiju mapi + insert = ievietot login = lietotājs logout = iziet @@ -67,7 +69,6 @@ restart = restartēt shell = terminālis shutdown = izslēgt sleep = snauda - wayland = wayland x11 = x11 xinitrc = xinitrc diff --git a/res/lang/pl.ini b/res/lang/pl.ini index 791b968..ad57810 100644 --- a/res/lang/pl.ini +++ b/res/lang/pl.ini @@ -4,6 +4,7 @@ brightness_up = zwiększ jasność capslock = capslock custom = własny err_alloc = nieudana alokacja pamięci + err_autologin_session = nie znaleziono sesji autologowania err_bounds = indeks poza zakresem err_brightness_change = nie udało się zmienić jasności @@ -15,6 +16,7 @@ err_domain = niepoprawna domena err_empty_password = puste hasło jest niedozwolone err_envlist = nie udało się pobrać listy zmiennych środowiskowych err_get_active_tty = nie udało się uzyskać aktywnego tty + err_hostname = nie udało się uzyskać nazwy hosta err_lock_state = nie udało się uzyskać stanu blokady err_log = nie udało się otworzyć pliku logu @@ -42,7 +44,6 @@ err_perm_dir = nie udało się zmienić obecnego katalogu err_perm_group = nie udało się obniżyć uprawnień grupy err_perm_user = nie udało się obniżyć uprawnień użytkownika err_pwnam = nie udało się uzyskać informacji o użytkowniku - err_sleep = nie udało się wykonać polecenia sleep err_battery = nie udało się sprawdzić statusu baterii err_switch_tty = nie można przełączyć tty @@ -55,6 +56,7 @@ err_xauth = polecenie xauth nie powiodło się err_xcb_conn = połączenie xcb nie powiodło się err_xsessions_dir = nie udało się znaleźć folderu sesji err_xsessions_open = nie udało się otworzyć folderu sesji + insert = wstaw login = login logout = wylogowano @@ -67,7 +69,6 @@ restart = uruchom ponownie shell = powłoka shutdown = wyłącz sleep = uśpij - wayland = wayland x11 = x11 xinitrc = xinitrc diff --git a/res/lang/pt.ini b/res/lang/pt.ini index 25d3690..2b4fe45 100644 --- a/res/lang/pt.ini +++ b/res/lang/pt.ini @@ -5,6 +5,7 @@ capslock = capslock err_alloc = erro na atribuição de memória + err_bounds = índice fora de limites err_chdir = erro ao abrir a pasta home @@ -15,6 +16,7 @@ err_domain = domínio inválido + err_hostname = erro ao obter o nome do host @@ -47,7 +49,6 @@ err_pwnam = erro ao obter informação do utilizador - err_user_gid = erro ao definir o GID do utilizador err_user_init = erro ao iniciar o utilizador err_user_uid = erro ao definir o UID do utilizador @@ -56,6 +57,7 @@ err_user_uid = erro ao definir o UID do utilizador err_xsessions_dir = erro ao localizar a pasta das sessões err_xsessions_open = erro ao abrir a pasta das sessões + login = iniciar sessão logout = terminar sessão @@ -67,7 +69,6 @@ restart = reiniciar shell = shell shutdown = encerrar - wayland = wayland xinitrc = xinitrc diff --git a/res/lang/pt_BR.ini b/res/lang/pt_BR.ini index 144e26f..0f53481 100644 --- a/res/lang/pt_BR.ini +++ b/res/lang/pt_BR.ini @@ -5,6 +5,7 @@ capslock = caixa alta err_alloc = alocação de memória malsucedida + err_bounds = índice fora de limites err_chdir = não foi possível abrir o diretório home @@ -15,6 +16,7 @@ err_domain = domínio inválido + err_hostname = não foi possível obter o nome do host @@ -47,7 +49,6 @@ err_pwnam = não foi possível obter informações do usuário - err_user_gid = não foi possível definir o GID do usuário err_user_init = não foi possível iniciar o usuário err_user_uid = não foi possível definir o UID do usuário @@ -56,6 +57,7 @@ err_user_uid = não foi possível definir o UID do usuário err_xsessions_dir = não foi possível encontrar a pasta das sessões err_xsessions_open = não foi possível abrir a pasta das sessões + login = conectar logout = desconectado @@ -67,7 +69,6 @@ restart = reiniciar shell = shell shutdown = desligar - wayland = wayland xinitrc = xinitrc diff --git a/res/lang/ro.ini b/res/lang/ro.ini index 0dd5ab7..a045ffd 100644 --- a/res/lang/ro.ini +++ b/res/lang/ro.ini @@ -20,6 +20,8 @@ capslock = capslock + + err_pam_abort = tranzacţie pam anulată @@ -67,7 +69,6 @@ restart = resetează shell = shell shutdown = opreşte sistemul - wayland = wayland xinitrc = xinitrc diff --git a/res/lang/ru.ini b/res/lang/ru.ini index 46e7d98..5af0923 100644 --- a/res/lang/ru.ini +++ b/res/lang/ru.ini @@ -4,6 +4,7 @@ brightness_up = увеличить яркость capslock = capslock custom = пользовательский err_alloc = не удалось выделить память + err_autologin_session = не найдена сессия с автологином err_bounds = за пределами индекса err_brightness_change = не удалось изменить яркость @@ -15,6 +16,7 @@ err_domain = неверный домен err_empty_password = пустой пароль не допустим err_envlist = не удалось получить список переменных среды err_get_active_tty = не удалось получить активный tty + err_hostname = не удалось получить имя хоста err_lock_state = не удалось получить состояние lock err_log = не удалось открыть файл log @@ -42,7 +44,6 @@ err_perm_dir = не удалось изменить текущий катало err_perm_group = не удалось понизить права доступа группы err_perm_user = не удалось понизить права доступа пользователя err_pwnam = не удалось получить информацию о пользователе - err_sleep = не удалось выполнить команду sleep err_battery = не удалось получить статус батареи err_switch_tty = не удалось переключить tty @@ -55,6 +56,7 @@ err_xauth = команда xauth не выполнена err_xcb_conn = ошибка подключения xcb err_xsessions_dir = не удалось найти сессионную папку err_xsessions_open = не удалось открыть сессионную папку + insert = вставка login = логин logout = вышел из системы @@ -67,7 +69,6 @@ restart = перезагрузить shell = оболочка shutdown = выключить sleep = сон - wayland = wayland x11 = x11 xinitrc = xinitrc diff --git a/res/lang/sr.ini b/res/lang/sr.ini index 236803c..b9159cc 100644 --- a/res/lang/sr.ini +++ b/res/lang/sr.ini @@ -5,6 +5,7 @@ capslock = capslock err_alloc = neuspijesna alokacija memorije + err_bounds = izvan granica indeksa err_chdir = neuspijesno otvaranje home foldera @@ -15,6 +16,7 @@ err_domain = nevazeci domen + err_hostname = neuspijesno trazenje hostname-a @@ -47,7 +49,6 @@ err_pwnam = neuspijesno skupljanje informacija o korisniku - err_user_gid = neuspijesno postavljanje korisničkog GID-a err_user_init = neuspijensa inicijalizacija korisnika err_user_uid = neuspijesno postavljanje UID-a korisnika @@ -56,6 +57,7 @@ err_user_uid = neuspijesno postavljanje UID-a korisnika err_xsessions_dir = neuspijesno pronalazenje foldera sesija err_xsessions_open = neuspijesno otvaranje foldera sesija + login = korisnik logout = izlogovan @@ -67,7 +69,6 @@ restart = ponovo pokreni shell = shell shutdown = ugasi - wayland = wayland xinitrc = xinitrc diff --git a/res/lang/sv.ini b/res/lang/sv.ini index 1b2efb6..2fb7f91 100644 --- a/res/lang/sv.ini +++ b/res/lang/sv.ini @@ -5,6 +5,7 @@ capslock = capslock err_alloc = misslyckad minnesallokering + err_bounds = utanför banan index err_chdir = misslyckades att öppna hemkatalog @@ -15,6 +16,7 @@ err_domain = okänd domän + err_hostname = misslyckades att hämta värdnamn @@ -47,7 +49,6 @@ err_pwnam = misslyckades att hämta användarinfo - err_user_gid = misslyckades att ställa in användar-GID err_user_init = misslyckades att initialisera användaren err_user_uid = misslyckades att ställa in användar-UID @@ -56,6 +57,7 @@ err_user_uid = misslyckades att ställa in användar-UID err_xsessions_dir = misslyckades att hitta sessionskatalog err_xsessions_open = misslyckades att öppna sessionskatalog + login = inloggning logout = utloggad @@ -67,7 +69,6 @@ restart = starta om shell = skal shutdown = stäng av - wayland = wayland xinitrc = xinitrc diff --git a/res/lang/tr.ini b/res/lang/tr.ini index 07ef320..a145152 100644 --- a/res/lang/tr.ini +++ b/res/lang/tr.ini @@ -5,6 +5,7 @@ capslock = capslock err_alloc = basarisiz bellek ayirma + err_bounds = sinirlarin disinda dizin err_chdir = ev klasoru acilamadi @@ -15,6 +16,7 @@ err_domain = gecersiz etki alani + err_hostname = ana bilgisayar adi alinamadi @@ -47,7 +49,6 @@ err_pwnam = kullanici bilgileri alinamadi - err_user_gid = kullanici icin GID ayarlanamadi err_user_init = kullanici oturumu baslatilamadi err_user_uid = kullanici icin UID ayarlanamadi @@ -56,6 +57,7 @@ err_user_uid = kullanici icin UID ayarlanamadi err_xsessions_dir = oturumlar klasoru bulunamadi err_xsessions_open = oturumlar klasoru acilamadi + login = kullanici logout = oturumdan cikis yapildi @@ -67,7 +69,6 @@ restart = yeniden baslat shell = shell shutdown = makineyi kapat - wayland = wayland xinitrc = xinitrc diff --git a/res/lang/uk.ini b/res/lang/uk.ini index 09320cd..0cbb714 100644 --- a/res/lang/uk.ini +++ b/res/lang/uk.ini @@ -5,6 +5,7 @@ capslock = capslock err_alloc = невдале виділення пам'яті + err_bounds = поза межами індексу err_chdir = не вдалося відкрити домашній каталог @@ -15,6 +16,7 @@ err_domain = недійсний домен + err_hostname = не вдалося отримати ім'я хосту @@ -47,7 +49,6 @@ err_pwnam = не вдалося отримати дані користувача - err_user_gid = не вдалося змінити GID користувача err_user_init = не вдалося ініціалізувати користувача err_user_uid = не вдалося змінити UID користувача @@ -56,6 +57,7 @@ err_user_uid = не вдалося змінити UID користувача err_xsessions_dir = не вдалося знайти каталог сесій err_xsessions_open = не вдалося відкрити каталог сесій + login = логін logout = вийти @@ -67,7 +69,6 @@ restart = перезавантажити shell = оболонка shutdown = вимкнути - wayland = wayland xinitrc = xinitrc diff --git a/res/lang/zh_CN.ini b/res/lang/zh_CN.ini index 9f2c0a8..7b30e9e 100644 --- a/res/lang/zh_CN.ini +++ b/res/lang/zh_CN.ini @@ -5,6 +5,7 @@ capslock = 大写锁定 err_alloc = 内存分配失败 + err_bounds = 索引越界 err_chdir = 无法打开home文件夹 @@ -15,6 +16,7 @@ err_domain = 无效的域 + err_hostname = 获取主机名失败 @@ -47,7 +49,6 @@ err_pwnam = 获取用户信息失败 - err_user_gid = 设置用户GID失败 err_user_init = 初始化用户失败 err_user_uid = 设置用户UID失败 @@ -56,6 +57,7 @@ err_user_uid = 设置用户UID失败 err_xsessions_dir = 找不到会话文件夹 err_xsessions_open = 无法打开会话文件夹 + login = 登录 logout = 注销 @@ -67,7 +69,6 @@ password = 密码 shell = shell - wayland = wayland x11 = x11 xinitrc = xinitrc diff --git a/src/config/Lang.zig b/src/config/Lang.zig index ba391b4..84c8a6f 100644 --- a/src/config/Lang.zig +++ b/src/config/Lang.zig @@ -9,6 +9,7 @@ brightness_up: []const u8 = "increase brightness", capslock: []const u8 = "capslock", custom: []const u8 = "custom", err_alloc: []const u8 = "failed memory allocation", +err_args: []const u8 = "unable to parse command line arguments", err_autologin_session: []const u8 = "autologin session not found", err_bounds: []const u8 = "out-of-bounds index", err_brightness_change: []const u8 = "failed to change brightness", diff --git a/src/main.zig b/src/main.zig index 28bbdca..d06a46d 100644 --- a/src/main.zig +++ b/src/main.zig @@ -110,12 +110,14 @@ pub fn main() !void { ); var diag = clap.Diagnostic{}; - var res = clap.parse(clap.Help, ¶ms, clap.parsers.default, .{ .diagnostic = &diag, .allocator = allocator }) catch |err| { + var arg_parse_error: anyerror = undefined; + var maybe_res = clap.parse(clap.Help, ¶ms, clap.parsers.default, .{ .diagnostic = &diag, .allocator = allocator }) catch |err| parse_error: { + arg_parse_error = err; diag.report(stderr, err) catch {}; try stderr.flush(); - return err; + break :parse_error null; }; - defer res.deinit(); + defer if (maybe_res) |*res| res.deinit(); var config: Config = undefined; var lang: Lang = undefined; @@ -128,17 +130,19 @@ pub fn main() !void { var saved_users = SavedUsers.init(); defer saved_users.deinit(allocator); - if (res.args.help != 0) { - try clap.help(stderr, clap.Help, ¶ms, .{}); + if (maybe_res) |*res| { + if (res.args.help != 0) { + try clap.help(stderr, clap.Help, ¶ms, .{}); - _ = try stderr.write("Note: if you want to configure Ly, please check the config file, which is located at " ++ build_options.config_directory ++ "/ly/config.ini.\n"); - try stderr.flush(); - std.process.exit(0); - } - if (res.args.version != 0) { - _ = try stderr.write("Ly version " ++ build_options.version ++ "\n"); - try stderr.flush(); - std.process.exit(0); + _ = try stderr.write("Note: if you want to configure Ly, please check the config file, which is located at " ++ build_options.config_directory ++ "/ly/config.ini.\n"); + try stderr.flush(); + std.process.exit(0); + } + if (res.args.version != 0) { + _ = try stderr.write("Ly version " ++ build_options.version ++ "\n"); + try stderr.flush(); + std.process.exit(0); + } } // Load configuration file @@ -161,7 +165,8 @@ pub fn main() !void { const comment_characters = "#"; - if (res.args.config) |s| { + if (maybe_res != null and maybe_res.?.args.config != null) { + const s = maybe_res.?.args.config.?; const trailing_slash = if (s[s.len - 1] != '/') "/" else ""; const config_path = try std.fmt.allocPrint(allocator, "{s}{s}config.ini", .{ s, trailing_slash }); @@ -330,6 +335,15 @@ pub fn main() !void { var info_line = InfoLine.init(allocator, &buffer); defer info_line.deinit(); + if (maybe_res == null) { + var longest = diag.name.longest(); + if (longest.kind == .positional) + longest.name = diag.arg; + + try info_line.addMessage(lang.err_args, config.error_bg, config.error_fg); + try log_writer.print("unable to parse argument '{s}{s}': {s}\n", .{ longest.kind.prefix(), longest.name, @errorName(arg_parse_error) }); + } + if (maybe_config_load_error) |err| { // We can't localize this since the config failed to load so we'd fallback to the default language anyway try info_line.addMessage("unable to parse config file", config.error_bg, config.error_fg); From 392ea6ea6382548f6bed9d2727b4b1428476d204 Mon Sep 17 00:00:00 2001 From: AnErrupTion Date: Sun, 30 Nov 2025 09:18:29 +0100 Subject: [PATCH 02/11] Update French locale Signed-off-by: AnErrupTion --- res/lang/fr.ini | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/res/lang/fr.ini b/res/lang/fr.ini index 1ed64e4..ebc6589 100644 --- a/res/lang/fr.ini +++ b/res/lang/fr.ini @@ -4,8 +4,8 @@ brightness_up = augmenter la luminosité capslock = verr.maj custom = customisé err_alloc = échec d'allocation mémoire - - +err_args = échec de l'analyse des arguments en lignes de commande +err_autologin_session = session de connexion automatique introuvable err_bounds = indice hors-limite err_brightness_change = échec du changement de luminosité err_chdir = échec de l'ouverture du répertoire home @@ -16,7 +16,7 @@ err_domain = domaine invalide err_empty_password = mot de passe vide non autorisé err_envlist = échec de lecture de la liste d'environnement err_get_active_tty = échec de lecture du terminal actif - +err_hibernate = échec de l'exécution de la commande de veille prolongée err_hostname = échec de lecture du nom d'hôte err_lock_state = échec de lecture de l'état de verrouillage err_log = échec de l'ouverture du fichier de journal @@ -56,7 +56,7 @@ err_xauth = échec de la commande xauth err_xcb_conn = échec de la connexion xcb err_xsessions_dir = échec de la recherche du dossier de sessions err_xsessions_open = échec de l'ouverture du dossier de sessions - +hibernate = veille prolongée insert = insertion login = identifiant logout = déconnecté From 8c964d9ce5e073edc27761c232b0a3fb1268d347 Mon Sep 17 00:00:00 2001 From: AnErrupTion Date: Sun, 30 Nov 2025 09:30:33 +0100 Subject: [PATCH 03/11] Don't crash when failing to crawl a session directory (closes #870) Signed-off-by: AnErrupTion --- res/lang/ar.ini | 1 + 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 | 1 + res/lang/it.ini | 1 + res/lang/ja_JP.ini | 1 + res/lang/lv.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 + res/lang/zh_CN.ini | 1 + src/config/Lang.zig | 1 + src/main.zig | 25 +++++++++++++++++++++---- 22 files changed, 42 insertions(+), 4 deletions(-) diff --git a/res/lang/ar.ini b/res/lang/ar.ini index 6f48471..f98c911 100644 --- a/res/lang/ar.ini +++ b/res/lang/ar.ini @@ -11,6 +11,7 @@ err_brightness_change = فشل في تغيير سطوع الشاشة err_chdir = فشل في فتح مجلد المنزل err_config = فشل في تفسير ملف الإعدادات + err_dgn_oob = رسالة سجل (Log) err_domain = اسم نطاق غير صالح err_empty_password = لا يُسمح بكلمة مرور فارغة diff --git a/res/lang/cat.ini b/res/lang/cat.ini index f7e4343..a0bd809 100644 --- a/res/lang/cat.ini +++ b/res/lang/cat.ini @@ -11,6 +11,7 @@ err_brightness_change = error en canviar la brillantor err_chdir = error en obrir la carpeta home + err_dgn_oob = missatge de registre err_domain = domini invàlid diff --git a/res/lang/cs.ini b/res/lang/cs.ini index c25ace1..a84757b 100644 --- a/res/lang/cs.ini +++ b/res/lang/cs.ini @@ -11,6 +11,7 @@ err_bounds = index je mimo hranice pole err_chdir = nelze otevřít domovský adresář + err_dgn_oob = zpráva protokolu err_domain = neplatná doména diff --git a/res/lang/de.ini b/res/lang/de.ini index ac8f654..4f52bea 100644 --- a/res/lang/de.ini +++ b/res/lang/de.ini @@ -11,6 +11,7 @@ err_brightness_change = Helligkeitsänderung fehlgeschlagen err_chdir = Fehler beim Oeffnen des Home-Ordners err_config = Fehler beim Verarbeiten der Konfigurationsdatei + err_dgn_oob = Diagnose-Nachricht err_domain = Ungueltige Domain err_empty_password = Leeres Passwort nicht zugelassen diff --git a/res/lang/en.ini b/res/lang/en.ini index 325e9b9..60368ac 100644 --- a/res/lang/en.ini +++ b/res/lang/en.ini @@ -11,6 +11,7 @@ err_brightness_change = failed to change brightness err_chdir = failed to open home folder err_clock_too_long = clock string too long err_config = unable to parse config file + err_dgn_oob = log message err_domain = invalid domain err_empty_password = empty password not allowed diff --git a/res/lang/es.ini b/res/lang/es.ini index fe720c7..62d0513 100644 --- a/res/lang/es.ini +++ b/res/lang/es.ini @@ -11,6 +11,7 @@ err_bounds = índice fuera de límites err_chdir = error al abrir la carpeta home + err_dgn_oob = mensaje de registro err_domain = dominio inválido diff --git a/res/lang/fr.ini b/res/lang/fr.ini index ebc6589..cc6801e 100644 --- a/res/lang/fr.ini +++ b/res/lang/fr.ini @@ -11,6 +11,7 @@ err_brightness_change = échec du changement de luminosité err_chdir = échec de l'ouverture du répertoire home err_clock_too_long = chaîne de formattage de l'horloge trop longue err_config = échec de lecture du fichier de configuration +err_crawl = échec de la navigation des répertoires de session err_dgn_oob = message err_domain = domaine invalide err_empty_password = mot de passe vide non autorisé diff --git a/res/lang/it.ini b/res/lang/it.ini index 5cab01d..bc69e7c 100644 --- a/res/lang/it.ini +++ b/res/lang/it.ini @@ -11,6 +11,7 @@ err_bounds = indice fuori limite err_chdir = impossibile aprire home directory + err_dgn_oob = messaggio log err_domain = dominio non valido diff --git a/res/lang/ja_JP.ini b/res/lang/ja_JP.ini index 44fff53..23c3f84 100644 --- a/res/lang/ja_JP.ini +++ b/res/lang/ja_JP.ini @@ -11,6 +11,7 @@ err_brightness_change = 明るさの変更に失敗しました err_chdir = ホームフォルダを開けませんでした err_config = 設定ファイルを解析できません + err_dgn_oob = ログメッセージ err_domain = 無効なドメイン err_empty_password = 空のパスワードは許可されていません diff --git a/res/lang/lv.ini b/res/lang/lv.ini index 7d0947f..fcac1aa 100644 --- a/res/lang/lv.ini +++ b/res/lang/lv.ini @@ -11,6 +11,7 @@ err_brightness_change = neizdevās mainīt spilgtumu err_chdir = neizdevās atvērt mājas mapi err_clock_too_long = pulksteņa virkne pārāk gara err_config = neizdevās parsēt konfigurācijas failu + err_dgn_oob = žurnāla ziņojums err_domain = nederīgs domēns err_empty_password = tukša parole nav atļauta diff --git a/res/lang/pl.ini b/res/lang/pl.ini index ad57810..42e2660 100644 --- a/res/lang/pl.ini +++ b/res/lang/pl.ini @@ -11,6 +11,7 @@ err_brightness_change = nie udało się zmienić jasności err_chdir = nie udało się otworzyć folderu domowego err_clock_too_long = ciąg znaków zegara jest za długi err_config = nie można przetworzyć pliku konfiguracyjnego + err_dgn_oob = wiadomość loga err_domain = niepoprawna domena err_empty_password = puste hasło jest niedozwolone diff --git a/res/lang/pt.ini b/res/lang/pt.ini index 2b4fe45..a0618c9 100644 --- a/res/lang/pt.ini +++ b/res/lang/pt.ini @@ -11,6 +11,7 @@ err_bounds = índice fora de limites err_chdir = erro ao abrir a pasta home + err_dgn_oob = mensagem de registo err_domain = domínio inválido diff --git a/res/lang/pt_BR.ini b/res/lang/pt_BR.ini index 0f53481..62eae98 100644 --- a/res/lang/pt_BR.ini +++ b/res/lang/pt_BR.ini @@ -11,6 +11,7 @@ err_bounds = índice fora de limites err_chdir = não foi possível abrir o diretório home + err_dgn_oob = mensagem de log err_domain = domínio inválido diff --git a/res/lang/ro.ini b/res/lang/ro.ini index a045ffd..aa59318 100644 --- a/res/lang/ro.ini +++ b/res/lang/ro.ini @@ -22,6 +22,7 @@ capslock = capslock + err_pam_abort = tranzacţie pam anulată diff --git a/res/lang/ru.ini b/res/lang/ru.ini index 5af0923..fd5d4ed 100644 --- a/res/lang/ru.ini +++ b/res/lang/ru.ini @@ -11,6 +11,7 @@ err_brightness_change = не удалось изменить яркость err_chdir = не удалось открыть домашнюю папку err_clock_too_long = строка часов слишком длинная err_config = не удалось разобрать файл конфигурации + err_dgn_oob = отладочное сообщение (log) err_domain = неверный домен err_empty_password = пустой пароль не допустим diff --git a/res/lang/sr.ini b/res/lang/sr.ini index b9159cc..96b0686 100644 --- a/res/lang/sr.ini +++ b/res/lang/sr.ini @@ -11,6 +11,7 @@ err_bounds = izvan granica indeksa err_chdir = neuspijesno otvaranje home foldera + err_dgn_oob = log poruka err_domain = nevazeci domen diff --git a/res/lang/sv.ini b/res/lang/sv.ini index 2fb7f91..9439a07 100644 --- a/res/lang/sv.ini +++ b/res/lang/sv.ini @@ -11,6 +11,7 @@ err_bounds = utanför banan index err_chdir = misslyckades att öppna hemkatalog + err_dgn_oob = loggmeddelande err_domain = okänd domän diff --git a/res/lang/tr.ini b/res/lang/tr.ini index a145152..d551399 100644 --- a/res/lang/tr.ini +++ b/res/lang/tr.ini @@ -11,6 +11,7 @@ err_bounds = sinirlarin disinda dizin err_chdir = ev klasoru acilamadi + err_dgn_oob = log mesaji err_domain = gecersiz etki alani diff --git a/res/lang/uk.ini b/res/lang/uk.ini index 0cbb714..531f311 100644 --- a/res/lang/uk.ini +++ b/res/lang/uk.ini @@ -11,6 +11,7 @@ err_bounds = поза межами індексу err_chdir = не вдалося відкрити домашній каталог + err_dgn_oob = повідомлення журналу (log) err_domain = недійсний домен diff --git a/res/lang/zh_CN.ini b/res/lang/zh_CN.ini index 7b30e9e..f73093b 100644 --- a/res/lang/zh_CN.ini +++ b/res/lang/zh_CN.ini @@ -11,6 +11,7 @@ err_bounds = 索引越界 err_chdir = 无法打开home文件夹 + err_dgn_oob = 日志消息 err_domain = 无效的域 diff --git a/src/config/Lang.zig b/src/config/Lang.zig index 84c8a6f..e116f39 100644 --- a/src/config/Lang.zig +++ b/src/config/Lang.zig @@ -16,6 +16,7 @@ err_brightness_change: []const u8 = "failed to change brightness", err_chdir: []const u8 = "failed to open home folder", err_clock_too_long: []const u8 = "clock string too long", err_config: []const u8 = "unable to parse config file", +err_crawl: []const u8 = "failed to crawl session directories", err_dgn_oob: []const u8 = "log message", err_domain: []const u8 = "invalid domain", err_empty_password: []const u8 = "empty password not allowed", diff --git a/src/main.zig b/src/main.zig index d06a46d..5fc3545 100644 --- a/src/main.zig +++ b/src/main.zig @@ -411,22 +411,37 @@ pub fn main() !void { try info_line.addMessage(hostname, config.bg, config.fg); } + var has_crawl_error = false; + // Crawl session directories (Wayland, X11 and custom respectively) var wayland_session_dirs = std.mem.splitScalar(u8, config.waylandsessions, ':'); while (wayland_session_dirs.next()) |dir| { - try crawl(&session, lang, dir, .wayland); + crawl(&session, lang, dir, .wayland) catch |err| { + has_crawl_error = true; + try log_writer.print("failed to crawl wayland session directory '{s}': {s}\n", .{ dir, @errorName(err) }); + }; } if (build_options.enable_x11_support) { var x_session_dirs = std.mem.splitScalar(u8, config.xsessions, ':'); while (x_session_dirs.next()) |dir| { - try crawl(&session, lang, dir, .x11); + crawl(&session, lang, dir, .x11) catch |err| { + has_crawl_error = true; + try log_writer.print("failed to crawl x11 session directory '{s}': {s}\n", .{ dir, @errorName(err) }); + }; } } var custom_session_dirs = std.mem.splitScalar(u8, config.custom_sessions, ':'); while (custom_session_dirs.next()) |dir| { - try crawl(&session, lang, dir, .custom); + crawl(&session, lang, dir, .custom) catch |err| { + has_crawl_error = true; + try log_writer.print("failed to crawl custom session directory '{s}': {s}\n", .{ dir, @errorName(err) }); + }; + } + + if (has_crawl_error) { + try info_line.addMessage(lang.err_crawl, config.error_bg, config.error_fg); } if (usernames.items.len == 0) { @@ -1181,7 +1196,9 @@ fn addOtherEnvironment(session: *Session, lang: Lang, display_server: DisplaySer } fn crawl(session: *Session, lang: Lang, path: []const u8, display_server: DisplayServer) !void { - var iterable_directory = std.fs.openDirAbsolute(path, .{ .iterate = true }) catch return; + if (!std.fs.path.isAbsolute(path)) return error.PathNotAbsolute; + + var iterable_directory = try std.fs.openDirAbsolute(path, .{ .iterate = true }); defer iterable_directory.close(); var iterator = iterable_directory.iterate(); From fe354a480967719c5decb097ce9401553369ddb0 Mon Sep 17 00:00:00 2001 From: AnErrupTion Date: Sun, 30 Nov 2025 09:47:50 +0100 Subject: [PATCH 04/11] Add fallback UID range options at compile-time Signed-off-by: AnErrupTion --- build.zig | 4 ++++ res/lang/ar.ini | 1 + res/lang/cat.ini | 1 + res/lang/cs.ini | 1 + res/lang/de.ini | 1 + res/lang/en.ini | 3 ++- res/lang/es.ini | 1 + res/lang/fr.ini | 1 + res/lang/it.ini | 1 + res/lang/ja_JP.ini | 1 + res/lang/lv.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 + res/lang/zh_CN.ini | 1 + src/config/Lang.zig | 1 + src/main.zig | 19 ++++++++++++++++--- 23 files changed, 42 insertions(+), 4 deletions(-) diff --git a/build.zig b/build.zig index bf23051..fe73229 100644 --- a/build.zig +++ b/build.zig @@ -44,6 +44,8 @@ pub fn build(b: *std.Build) !void { const enable_x11_support = b.option(bool, "enable_x11_support", "Enable X11 support (default is on)") orelse true; const default_tty = b.option(u8, "default_tty", "Set the TTY (default is 2)") orelse 2; const fallback_tty = b.option(u8, "fallback_tty", "Set the fallback TTY (default is 2). This value gets embedded into the binary") orelse 2; + const fallback_uid_min = b.option(std.posix.uid_t, "fallback_uid_min", "Set the fallback minimum UID (default is 1000). This value gets embedded into the binary") orelse 2; + const fallback_uid_max = b.option(std.posix.uid_t, "fallback_uid_max", "Set the fallback maximum UID (default is 60000). This value gets embedded into the binary") orelse 2; default_tty_str = try std.fmt.allocPrint(b.allocator, "{d}", .{default_tty}); @@ -52,6 +54,8 @@ pub fn build(b: *std.Build) !void { build_options.addOption([]const u8, "version", version_str); build_options.addOption(u8, "tty", default_tty); build_options.addOption(u8, "fallback_tty", fallback_tty); + build_options.addOption(std.posix.uid_t, "fallback_uid_min", fallback_uid_min); + build_options.addOption(std.posix.uid_t, "fallback_uid_max", fallback_uid_max); build_options.addOption(bool, "enable_x11_support", enable_x11_support); const target = b.standardTargetOptions(.{}); diff --git a/res/lang/ar.ini b/res/lang/ar.ini index f98c911..a35d449 100644 --- a/res/lang/ar.ini +++ b/res/lang/ar.ini @@ -50,6 +50,7 @@ err_sleep = فشل في تنفيذ أمر sleep err_tty_ctrl = فشل في نقل تحكم الطرفية (TTY) + err_user_gid = فشل في تعيين معرّف المجموعة (GID) للمستخدم err_user_init = فشل في تهيئة بيانات المستخدم err_user_uid = فشل في تعيين معرّف المستخدم (UID) diff --git a/res/lang/cat.ini b/res/lang/cat.ini index a0bd809..f11930e 100644 --- a/res/lang/cat.ini +++ b/res/lang/cat.ini @@ -50,6 +50,7 @@ err_pwnam = error en obtenir la informació de l'usuari + err_user_gid = error en establir el GID de l'usuari err_user_init = error en inicialitzar usuari err_user_uid = error en establir l'UID de l'usuari diff --git a/res/lang/cs.ini b/res/lang/cs.ini index a84757b..ee52e2a 100644 --- a/res/lang/cs.ini +++ b/res/lang/cs.ini @@ -50,6 +50,7 @@ err_pwnam = nelze získat informace o uživateli + err_user_gid = nastavení GID uživatele selhalo err_user_init = inicializace uživatele selhala err_user_uid = nastavení UID uživateli selhalo diff --git a/res/lang/de.ini b/res/lang/de.ini index 4f52bea..0715006 100644 --- a/res/lang/de.ini +++ b/res/lang/de.ini @@ -50,6 +50,7 @@ err_sleep = Sleep-Befehl fehlgeschlagen err_tty_ctrl = Fehler bei der TTY-Uebergabe + err_user_gid = Fehler beim Setzen der Gruppen-ID err_user_init = Nutzer-Initialisierung fehlgeschlagen err_user_uid = Setzen der Benutzer-ID fehlgeschlagen diff --git a/res/lang/en.ini b/res/lang/en.ini index 60368ac..6de93fb 100644 --- a/res/lang/en.ini +++ b/res/lang/en.ini @@ -11,7 +11,7 @@ err_brightness_change = failed to change brightness err_chdir = failed to open home folder err_clock_too_long = clock string too long err_config = unable to parse config file - +err_crawl = failed to crawl session directories err_dgn_oob = log message err_domain = invalid domain err_empty_password = empty password not allowed @@ -50,6 +50,7 @@ err_battery = failed to load battery status err_switch_tty = failed to switch tty err_tty_ctrl = tty control transfer failed err_no_users = no users found +err_uid_range = failed to dynamically get uid range err_user_gid = failed to set user GID err_user_init = failed to initialize user err_user_uid = failed to set user UID diff --git a/res/lang/es.ini b/res/lang/es.ini index 62d0513..2fbba01 100644 --- a/res/lang/es.ini +++ b/res/lang/es.ini @@ -50,6 +50,7 @@ err_pwnam = error al obtener la información del usuario + err_user_gid = error al establecer el GID del usuario err_user_init = error al inicializar usuario err_user_uid = error al establecer el UID del usuario diff --git a/res/lang/fr.ini b/res/lang/fr.ini index cc6801e..046a74d 100644 --- a/res/lang/fr.ini +++ b/res/lang/fr.ini @@ -50,6 +50,7 @@ err_battery = échec de lecture de l'état de la batterie err_switch_tty = échec du changement de terminal err_tty_ctrl = échec du transfert de contrôle du terminal err_no_users = aucun utilisateur trouvé +err_uid_range = échec de récupération dynamique de la plage d'UID err_user_gid = échec de modification du GID err_user_init = échec d'initialisation de l'utilisateur err_user_uid = échec de modification du UID diff --git a/res/lang/it.ini b/res/lang/it.ini index bc69e7c..9eac717 100644 --- a/res/lang/it.ini +++ b/res/lang/it.ini @@ -50,6 +50,7 @@ err_pwnam = impossibile ottenere dati utente + err_user_gid = impossibile impostare GID utente err_user_init = impossibile inizializzare utente err_user_uid = impossible impostare UID utente diff --git a/res/lang/ja_JP.ini b/res/lang/ja_JP.ini index 23c3f84..6cb303e 100644 --- a/res/lang/ja_JP.ini +++ b/res/lang/ja_JP.ini @@ -50,6 +50,7 @@ err_sleep = スリープコマンドの実行に失敗しました err_tty_ctrl = TTY制御の転送に失敗しました + err_user_gid = ユーザーGIDの設定に失敗しました err_user_init = ユーザーの初期化に失敗しました err_user_uid = ユーザーUIDの設定に失敗しました diff --git a/res/lang/lv.ini b/res/lang/lv.ini index fcac1aa..cfaddb5 100644 --- a/res/lang/lv.ini +++ b/res/lang/lv.ini @@ -50,6 +50,7 @@ err_battery = neizdevās ielādēt akumulatora stāvokli err_switch_tty = neizdevās pārslēgt tty err_tty_ctrl = tty vadības nodošana neizdevās err_no_users = lietotāji nav atrasti + err_user_gid = neizdevās iestatīt lietotāja GID err_user_init = neizdevās inicializēt lietotāju err_user_uid = neizdevās iestatīt lietotāja UID diff --git a/res/lang/pl.ini b/res/lang/pl.ini index 42e2660..13bbc4f 100644 --- a/res/lang/pl.ini +++ b/res/lang/pl.ini @@ -50,6 +50,7 @@ err_battery = nie udało się sprawdzić statusu baterii err_switch_tty = nie można przełączyć tty err_tty_ctrl = nie udało się przekazać kontroli tty err_no_users = nie znaleziono żadnego użytkownika + err_user_gid = nie udało się ustawić GID użytkownika err_user_init = nie udało się zainicjalizować użytkownika err_user_uid = nie udało się ustawić UID użytkownika diff --git a/res/lang/pt.ini b/res/lang/pt.ini index a0618c9..f33c363 100644 --- a/res/lang/pt.ini +++ b/res/lang/pt.ini @@ -50,6 +50,7 @@ err_pwnam = erro ao obter informação do utilizador + err_user_gid = erro ao definir o GID do utilizador err_user_init = erro ao iniciar o utilizador err_user_uid = erro ao definir o UID do utilizador diff --git a/res/lang/pt_BR.ini b/res/lang/pt_BR.ini index 62eae98..bf3c329 100644 --- a/res/lang/pt_BR.ini +++ b/res/lang/pt_BR.ini @@ -50,6 +50,7 @@ err_pwnam = não foi possível obter informações do usuário + err_user_gid = não foi possível definir o GID do usuário err_user_init = não foi possível iniciar o usuário err_user_uid = não foi possível definir o UID do usuário diff --git a/res/lang/ro.ini b/res/lang/ro.ini index aa59318..18c35b7 100644 --- a/res/lang/ro.ini +++ b/res/lang/ro.ini @@ -59,6 +59,7 @@ err_perm_user = nu s-a putut face downgrade permisiunilor de utilizator + login = utilizator logout = opreşte sesiunea diff --git a/res/lang/ru.ini b/res/lang/ru.ini index fd5d4ed..ac1c302 100644 --- a/res/lang/ru.ini +++ b/res/lang/ru.ini @@ -50,6 +50,7 @@ err_battery = не удалось получить статус батареи err_switch_tty = не удалось переключить tty err_tty_ctrl = передача управления tty не удалась err_no_users = пользователи не найдены + err_user_gid = не удалось установить GID пользователя err_user_init = не удалось инициализировать пользователя err_user_uid = не удалось установить UID пользователя diff --git a/res/lang/sr.ini b/res/lang/sr.ini index 96b0686..f49cbdf 100644 --- a/res/lang/sr.ini +++ b/res/lang/sr.ini @@ -50,6 +50,7 @@ err_pwnam = neuspijesno skupljanje informacija o korisniku + err_user_gid = neuspijesno postavljanje korisničkog GID-a err_user_init = neuspijensa inicijalizacija korisnika err_user_uid = neuspijesno postavljanje UID-a korisnika diff --git a/res/lang/sv.ini b/res/lang/sv.ini index 9439a07..ec9a372 100644 --- a/res/lang/sv.ini +++ b/res/lang/sv.ini @@ -50,6 +50,7 @@ err_pwnam = misslyckades att hämta användarinfo + err_user_gid = misslyckades att ställa in användar-GID err_user_init = misslyckades att initialisera användaren err_user_uid = misslyckades att ställa in användar-UID diff --git a/res/lang/tr.ini b/res/lang/tr.ini index d551399..c4e0b1b 100644 --- a/res/lang/tr.ini +++ b/res/lang/tr.ini @@ -50,6 +50,7 @@ err_pwnam = kullanici bilgileri alinamadi + err_user_gid = kullanici icin GID ayarlanamadi err_user_init = kullanici oturumu baslatilamadi err_user_uid = kullanici icin UID ayarlanamadi diff --git a/res/lang/uk.ini b/res/lang/uk.ini index 531f311..cddce01 100644 --- a/res/lang/uk.ini +++ b/res/lang/uk.ini @@ -50,6 +50,7 @@ err_pwnam = не вдалося отримати дані користувача + err_user_gid = не вдалося змінити GID користувача err_user_init = не вдалося ініціалізувати користувача err_user_uid = не вдалося змінити UID користувача diff --git a/res/lang/zh_CN.ini b/res/lang/zh_CN.ini index f73093b..c7d51b9 100644 --- a/res/lang/zh_CN.ini +++ b/res/lang/zh_CN.ini @@ -50,6 +50,7 @@ err_pwnam = 获取用户信息失败 + err_user_gid = 设置用户GID失败 err_user_init = 初始化用户失败 err_user_uid = 设置用户UID失败 diff --git a/src/config/Lang.zig b/src/config/Lang.zig index e116f39..55589f2 100644 --- a/src/config/Lang.zig +++ b/src/config/Lang.zig @@ -55,6 +55,7 @@ err_battery: []const u8 = "failed to load battery status", err_switch_tty: []const u8 = "failed to switch tty", err_tty_ctrl: []const u8 = "tty control transfer failed", err_no_users: []const u8 = "no users found", +err_uid_range: []const u8 = "failed to dynamically get uid range", err_user_gid: []const u8 = "failed to set user GID", err_user_init: []const u8 = "failed to initialize user", err_user_uid: []const u8 = "failed to set user UID", diff --git a/src/main.zig b/src/main.zig index 5fc3545..4b882a9 100644 --- a/src/main.zig +++ b/src/main.zig @@ -26,6 +26,7 @@ const SavedUsers = @import("config/SavedUsers.zig"); const migrator = @import("config/migrator.zig"); const SharedError = @import("SharedError.zig"); const LogFile = @import("LogFile.zig"); +const UidRange = @import("UidRange.zig"); const StringList = std.ArrayListUnmanaged([]const u8); const Ini = ini.Ini; @@ -219,7 +220,8 @@ pub fn main() !void { migrator.lateConfigFieldHandler(&config); } - var usernames = try getAllUsernames(allocator, config.login_defs_path); + var maybe_uid_range_error: ?anyerror = null; + var usernames = try getAllUsernames(allocator, config.login_defs_path, &maybe_uid_range_error); defer { for (usernames.items) |username| allocator.free(username); usernames.deinit(allocator); @@ -344,6 +346,11 @@ pub fn main() !void { try log_writer.print("unable to parse argument '{s}{s}': {s}\n", .{ longest.kind.prefix(), longest.name, @errorName(arg_parse_error) }); } + if (maybe_uid_range_error) |err| { + try info_line.addMessage(lang.err_uid_range, config.error_bg, config.error_fg); + try log_writer.print("failed to get uid range: {s}; falling back to default\n", .{@errorName(err)}); + } + if (maybe_config_load_error) |err| { // We can't localize this since the config failed to load so we'd fallback to the default language anyway try info_line.addMessage("unable to parse config file", config.error_bg, config.error_fg); @@ -1277,8 +1284,14 @@ fn findSessionByName(session: *Session, name: []const u8) ?usize { return null; } -fn getAllUsernames(allocator: std.mem.Allocator, login_defs_path: []const u8) !StringList { - const uid_range = try interop.getUserIdRange(allocator, login_defs_path); +fn getAllUsernames(allocator: std.mem.Allocator, login_defs_path: []const u8, uid_range_error: *?anyerror) !StringList { + const uid_range = interop.getUserIdRange(allocator, login_defs_path) catch |err| no_uid_range: { + uid_range_error.* = err; + break :no_uid_range UidRange{ + .uid_min = build_options.fallback_uid_min, + .uid_max = build_options.fallback_uid_max, + }; + }; var usernames: StringList = .empty; var maybe_entry = interop.getNextUsernameEntry(); From a94abf2e69413ce5952bc34d4af3a57664f16bac Mon Sep 17 00:00:00 2001 From: AnErrupTion Date: Sun, 30 Nov 2025 12:08:10 +0100 Subject: [PATCH 05/11] Improve bug report template & add PR template Signed-off-by: AnErrupTion --- .github/ISSUE_TEMPLATE/bug.yml | 2 ++ .github/pull_request_template.md | 11 +++++++++++ 2 files changed, 13 insertions(+) create mode 100644 .github/pull_request_template.md diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml index 101a459..d40aaf3 100644 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -11,6 +11,8 @@ body: options: - label: I have looked for any other duplicate issues required: true + - label: I have reproduced the issue on a fresh install of my OS & Ly with default settings, except ones I will mention + required: true - type: input id: version attributes: diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..0cc851f --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,11 @@ +## What are the changes about? + +_Replace this with a brief description of your changes_ + +## What existing issue does this resolve? + +_Replace this with a reference to an existing issue, or N/A if there is none_ + +## Pre-requisites + +- [ ] I have tested & confirmed the changes work locally From 5235ca47c5ac783c72a875220c0881487c310195 Mon Sep 17 00:00:00 2001 From: RacerBG Date: Sun, 30 Nov 2025 21:52:46 +0100 Subject: [PATCH 06/11] Add Bulgarian Translation (#872) Reviewed-on: https://codeberg.org/fairyglade/ly/pulls/872 Reviewed-by: AnErrupTion Co-authored-by: RacerBG Co-committed-by: RacerBG --- res/lang/bg.ini | 76 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 res/lang/bg.ini diff --git a/res/lang/bg.ini b/res/lang/bg.ini new file mode 100644 index 0000000..06cca36 --- /dev/null +++ b/res/lang/bg.ini @@ -0,0 +1,76 @@ +authenticating = удостоверяване... +brightness_down = намаляване на яркостта +brightness_up = увеличаване на яркостта +capslock = caps lock +custom = персонализирано +err_alloc = неуспешно заделяне на памет +err_args = неуспешен анализ на аргументите от командния ред +err_autologin_session = сесията за автоматично влизане не е намерена +err_bounds = индексът е извън границите +err_brightness_change = неуспешна промяна на яркостта +err_chdir = неуспешно отваряне на домашната папка +err_clock_too_long = низът на часовника е твърде дълъг +err_config = неуспешен анализ на конфигурационния файл +err_crawl = неуспешно обхождане на папките със сесии +err_dgn_oob = съобщение в дневника +err_domain = невалиден домейн +err_empty_password = не е позволена празна парола +err_envlist = неуспешно получаване на списъка с променливи на средата +err_get_active_tty = неуспешно откриване на активния TTY +err_hibernate = неуспешно изпълнение на командата за хибернация +err_hostname = неуспешно получаване на името на хоста +err_lock_state = неуспешно получаване на състоянието на заключване +err_log = неуспешно отваряне на файла с дневника +err_mlock = неуспешно заключване на паметта за паролата +err_null = нулев указател +err_numlock = неуспешно задаване на num lock +err_pam = неуспешна транзакция +err_pam_abort = прекратена транзакция +err_pam_acct_expired = изтекъл профил +err_pam_auth = грешка при удостоверяването +err_pam_authinfo_unavail = неуспешно получаване на информация за потребителя +err_pam_authok_reqd = изтекъл жетон +err_pam_buf = грешка в буфера на паметта +err_pam_cred_err = неуспешно задаване на удостоверения +err_pam_cred_expired = изтекли удостоверения +err_pam_cred_insufficient = недостатъчни удостоверения +err_pam_cred_unavail = неуспешно получаване на удостоверения +err_pam_maxtries = достигнат е максималният лимит на опитите +err_pam_perm_denied = достъпът е отказан +err_pam_session = грешка в сесията +err_pam_sys = системна грешка +err_pam_user_unknown = непознат потребител +err_path = неуспешно задаване на пътя +err_perm_dir = неуспешна смяна на текущата папка +err_perm_group = неуспешно понижаване на правата на групата +err_perm_user = неуспешно понижаване на правата на потребителя +err_pwnam = неуспешно получаване на информация за потребителя +err_sleep = неуспешно изпълнение на командата за заспиване +err_battery = неуспешно зареждане на състоянието на батерията +err_switch_tty = неуспешна смяна на TTY +err_tty_ctrl = неуспешно прехвърляне на контрола над TTY +err_no_users = не са намерени потребители +err_uid_range = неуспешно динамично получаване на UID обхват +err_user_gid = неуспешно задаване на потребителския GID +err_user_init = неуспешна стартиране на потребителя +err_user_uid = неуспешно задаване на потребителския UID +err_xauth = неуспешна команда xauth +err_xcb_conn = неуспешна xcb връзка +err_xsessions_dir = папката със сесии не е намерена +err_xsessions_open = неуспешно отваряне на папката със сесии +hibernate = хибернация +insert = вмъкване +login = вход +logout = излизане +no_x11_support = поддръжката на x11 е изключена при компилирането +normal = нормално +numlock = num lock +other = друго +password = парола +restart = рестартиране +shell = обвивка +shutdown = изключване +sleep = заспиване +wayland = wayland +x11 = x11 +xinitrc = xinitrc From f9a001b160eba8518aa6bbf43f175a0681bd0ce6 Mon Sep 17 00:00:00 2001 From: AnErrupTion Date: Sun, 30 Nov 2025 21:57:42 +0100 Subject: [PATCH 07/11] Update zigini dependency & use same Git URL format everywhere Signed-off-by: AnErrupTion --- build.zig.zon | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.zig.zon b/build.zig.zon index bd8e8a7..8da9e91 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -5,12 +5,12 @@ .minimum_zig_version = "0.15.0", .dependencies = .{ .clap = .{ - .url = "https://github.com/Hejsil/zig-clap/archive/refs/tags/0.11.0.tar.gz", + .url = "git+https://github.com/Hejsil/zig-clap?ref=0.11.0", .hash = "clap-0.11.0-oBajB-HnAQDPCKYzwF7rO3qDFwRcD39Q0DALlTSz5H7e", }, .zigini = .{ - .url = "https://github.com/AnErrupTion/zigini/archive/96ca1d9f1a7ec741f07ceb104dae2b3a7bdfd48a.tar.gz", - .hash = "zigini-0.3.2-BSkB7WJJAADybd5DGd9MLCp6ikGGUq9wicxsjv0HF1Qc", + .url = "git+https://github.com/AnErrupTion/zigini?ref=zig-0.15.0#9281f47702b57779e831d7618e158abb8eb4d4a2", + .hash = "zigini-0.3.3-36M0FRJJAADZVq5HPm-hYKMpFFTr0OgjbEYcK2ijKZ5n", }, .termbox2 = .{ .url = "git+https://github.com/AnErrupTion/termbox2?ref=master#290ac6b8225aacfd16851224682b851b65fcb918", From 4df2382698e21eb67da609ceecc2c9dccf69b7f4 Mon Sep 17 00:00:00 2001 From: AnErrupTion Date: Sun, 30 Nov 2025 22:19:38 +0100 Subject: [PATCH 08/11] Add possibility to disable auth_fails animation (closes #835) Signed-off-by: AnErrupTion --- res/config.ini | 5 +++-- src/main.zig | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/res/config.ini b/res/config.ini index 1757303..2e3579e 100644 --- a/res/config.ini +++ b/res/config.ini @@ -39,6 +39,7 @@ animation_timeout_sec = 0 asterisk = * # The number of failed authentications before a special animation is played... ;) +# If set to 0, the animation will never be played auth_fails = 10 # Identifier for battery whose charge to display at top left @@ -162,7 +163,7 @@ doom_middle_color = 0x00C78F17 # DOOM animation custom bottom color (high intensity flames) doom_bottom_color = 0x00FFFFFF -# Set margin to the edges of the DM (useful for curved monitors) +# Set margin to the edges of the DM (useful for curved monitors) edge_margin = 0 # Error background color id @@ -213,7 +214,7 @@ gameoflife_frame_delay = 6 gameoflife_initial_density = 0.4 # Command executed when pressing hibernate key (can be null) -hibernate_cmd = null +hibernate_cmd = null # Specifies the key used for hibernate (F1-F12) hibernate_key = F4 diff --git a/src/main.zig b/src/main.zig index 4b882a9..dffd8fe 100644 --- a/src/main.zig +++ b/src/main.zig @@ -629,7 +629,7 @@ pub fn main() !void { if (update) { // If the user entered a wrong password 10 times in a row, play a cascade animation, else update normally - if (auth_fails >= config.auth_fails) { + if (config.auth_fails > 0 and auth_fails >= config.auth_fails) { std.Thread.sleep(std.time.ns_per_ms * 10); update = buffer.cascade(); @@ -847,7 +847,7 @@ pub fn main() !void { const time = try interop.getTimeOfDay(); timeout = @intCast((60 - @rem(time.seconds, 60)) * 1000 - @divTrunc(time.microseconds, 1000) + 1); - } else if (config.clock != null or auth_fails >= config.auth_fails) { + } else if (config.clock != null or (config.auth_fails > 0 and auth_fails >= config.auth_fails)) { const time = try interop.getTimeOfDay(); timeout = @intCast(1000 - @divTrunc(time.microseconds, 1000) + 1); @@ -1110,7 +1110,7 @@ pub fn main() !void { try std.posix.tcsetattr(std.posix.STDIN_FILENO, .FLUSH, tb_termios); - if (auth_fails < config.auth_fails) { + if (config.auth_fails == 0 or auth_fails < config.auth_fails) { _ = termbox.tb_clear(); try ttyClearScreen(); From e29bda3250010b41e23726b80847003ad41d3561 Mon Sep 17 00:00:00 2001 From: AnErrupTion Date: Sun, 30 Nov 2025 23:02:23 +0100 Subject: [PATCH 09/11] Add systemd-homed UID range Signed-off-by: AnErrupTion --- src/interop.zig | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/interop.zig b/src/interop.zig index af7a571..2f8483a 100644 --- a/src/interop.zig +++ b/src/interop.zig @@ -81,6 +81,9 @@ fn PlatformStruct() type { pub const vt_activate = vt.VT_ACTIVATE; pub const vt_waitactive = vt.VT_WAITACTIVE; + const SYSTEMD_HOMED_UID_MIN = 60001; + const SYSTEMD_HOMED_UID_MAX = 60513; + pub fn setUserContextImpl(username: [*:0]const u8, entry: UsernameEntry) !void { const status = grp.initgroups(username, @intCast(entry.gid)); if (status != 0) return error.GroupInitializationFailed; @@ -179,6 +182,19 @@ fn PlatformStruct() type { } } + // This code assumes the OS has a login.defs file with UID_MIN + // and UID_MAX values defined in it, which should be the case + // for most systemd-based Linux distributions out there. + // This should be a good enough safeguard for now, as there's + // no reliable (and clean) way to check for systemd support + if (uid_range.uid_min > SYSTEMD_HOMED_UID_MIN) { + uid_range.uid_min = SYSTEMD_HOMED_UID_MIN; + } + + if (uid_range.uid_max < SYSTEMD_HOMED_UID_MAX) { + uid_range.uid_max = SYSTEMD_HOMED_UID_MAX; + } + return uid_range; } @@ -226,6 +242,9 @@ fn PlatformStruct() type { pub const vt_activate = consio.VT_ACTIVATE; pub const vt_waitactive = consio.VT_WAITACTIVE; + const FREEBSD_UID_MIN = 1000; + const FREEBSD_UID_MAX = 32000; + pub fn setUserContextImpl(username: [*:0]const u8, entry: UsernameEntry) !void { // FreeBSD has initgroups() in unistd const status = unistd.initgroups(username, @intCast(entry.gid)); @@ -244,8 +263,8 @@ fn PlatformStruct() type { return .{ // Hardcoded default values chosen from // /usr/src/usr.sbin/pw/pw_conf.c - .uid_min = 1000, - .uid_max = 32000, + .uid_min = FREEBSD_UID_MIN, + .uid_max = FREEBSD_UID_MAX, }; } }, From c2b3d794e88c96f19a12cc7b3c7a960beb355294 Mon Sep 17 00:00:00 2001 From: AnErrupTion Date: Sun, 30 Nov 2025 23:36:47 +0100 Subject: [PATCH 10/11] Fix fallback UID range + add error if UID range not found Signed-off-by: AnErrupTion --- build.zig | 4 ++-- src/interop.zig | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/build.zig b/build.zig index fe73229..12ababb 100644 --- a/build.zig +++ b/build.zig @@ -44,8 +44,8 @@ pub fn build(b: *std.Build) !void { const enable_x11_support = b.option(bool, "enable_x11_support", "Enable X11 support (default is on)") orelse true; const default_tty = b.option(u8, "default_tty", "Set the TTY (default is 2)") orelse 2; const fallback_tty = b.option(u8, "fallback_tty", "Set the fallback TTY (default is 2). This value gets embedded into the binary") orelse 2; - const fallback_uid_min = b.option(std.posix.uid_t, "fallback_uid_min", "Set the fallback minimum UID (default is 1000). This value gets embedded into the binary") orelse 2; - const fallback_uid_max = b.option(std.posix.uid_t, "fallback_uid_max", "Set the fallback maximum UID (default is 60000). This value gets embedded into the binary") orelse 2; + const fallback_uid_min = b.option(std.posix.uid_t, "fallback_uid_min", "Set the fallback minimum UID (default is 1000). This value gets embedded into the binary") orelse 1000; + const fallback_uid_max = b.option(std.posix.uid_t, "fallback_uid_max", "Set the fallback maximum UID (default is 60000). This value gets embedded into the binary") orelse 60000; default_tty_str = try std.fmt.allocPrint(b.allocator, "{d}", .{default_tty}); diff --git a/src/interop.zig b/src/interop.zig index 2f8483a..4d52f49 100644 --- a/src/interop.zig +++ b/src/interop.zig @@ -171,17 +171,22 @@ fn PlatformStruct() type { var iterator = std.mem.splitScalar(u8, login_defs_buffer, '\n'); var uid_range = UidRange{}; + var nameFound = false; while (iterator.next()) |line| { const trimmed_line = std.mem.trim(u8, line, " \n\r\t"); if (std.mem.startsWith(u8, trimmed_line, "UID_MIN")) { uid_range.uid_min = try parseValue(std.posix.uid_t, "UID_MIN", trimmed_line); + nameFound = true; } else if (std.mem.startsWith(u8, trimmed_line, "UID_MAX")) { uid_range.uid_max = try parseValue(std.posix.uid_t, "UID_MAX", trimmed_line); + nameFound = true; } } + if (!nameFound) return error.UidNameNotFound; + // This code assumes the OS has a login.defs file with UID_MIN // and UID_MAX values defined in it, which should be the case // for most systemd-based Linux distributions out there. From d82fa82a878e1b6973a508e6a2d2f042d1bf0ba2 Mon Sep 17 00:00:00 2001 From: AnErrupTion Date: Sun, 30 Nov 2025 23:50:39 +0100 Subject: [PATCH 11/11] Always add hostname last in the info line Signed-off-by: AnErrupTion --- src/main.zig | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main.zig b/src/main.zig index dffd8fe..276cb0b 100644 --- a/src/main.zig +++ b/src/main.zig @@ -405,19 +405,6 @@ pub fn main() !void { try log_writer.writeAll("x11 support disabled at compile-time\n"); } - if (config.initial_info_text) |text| { - try info_line.addMessage(text, config.bg, config.fg); - } else get_host_name: { - // Initialize information line with host name - var name_buf: [std.posix.HOST_NAME_MAX]u8 = undefined; - const hostname = std.posix.gethostname(&name_buf) catch |err| { - try info_line.addMessage(lang.err_hostname, config.error_bg, config.error_fg); - try log_writer.print("failed to get hostname: {s}\n", .{@errorName(err)}); - break :get_host_name; - }; - try info_line.addMessage(hostname, config.bg, config.fg); - } - var has_crawl_error = false; // Crawl session directories (Wayland, X11 and custom respectively) @@ -600,6 +587,19 @@ pub fn main() !void { try log_writer.print("failed to switch tty: {s}\n", .{@errorName(err)}); }; + if (config.initial_info_text) |text| { + try info_line.addMessage(text, config.bg, config.fg); + } else get_host_name: { + // Initialize information line with host name + var name_buf: [std.posix.HOST_NAME_MAX]u8 = undefined; + const hostname = std.posix.gethostname(&name_buf) catch |err| { + try info_line.addMessage(lang.err_hostname, config.error_bg, config.error_fg); + try log_writer.print("failed to get hostname: {s}\n", .{@errorName(err)}); + break :get_host_name; + }; + try info_line.addMessage(hostname, config.bg, config.fg); + } + while (run) { // If there's no input or there's an animation, a resolution change needs to be checked if (!update or animate) {