tonarchy

tonarchy

https://git.tonybtw.com/tonarchy.git git://git.tonybtw.com/tonarchy.git

Fixed wifi, nvme drives, squashfs errors.

Commit
4d6a15562fb5e7761ead7de3403df2a7008f7e2b
Parent
6d1eb5a
Author
tonybanters <tonybanters@gmail.com>
Date
2026-01-26 17:18:59

Diff

diff --git a/src/tonarchy.c b/src/tonarchy.c
index 16b5fb2..3cb68d1 100644
--- a/src/tonarchy.c
+++ b/src/tonarchy.c
@@ -10,7 +10,7 @@ enum Install_Option {
     OXIDIZED = 1
 };
 
-static const char *XFCE_PACKAGES = "base base-devel linux linux-firmware linux-headers networkmanager git vim neovim curl wget htop btop man-db man-pages openssh sudo xorg-server xorg-xinit xorg-xrandr xorg-xset xfce4 xfce4-goodies xfce4-session xfce4-whiskermenu-plugin thunar thunar-archive-plugin file-roller firefox alacritty vlc evince eog fastfetch rofi ripgrep fd ttf-iosevka-nerd ttf-jetbrains-mono-nerd";
+static const char *XFCE_PACKAGES = "base base-devel linux linux-firmware linux-headers networkmanager git vim neovim curl wget htop btop man-db man-pages openssh sudo xorg-server xorg-xinit xorg-xrandr xorg-xset xfce4 xfce4-goodies xfce4-session xfce4-whiskermenu-plugin thunar thunar-archive-plugin file-roller firefox alacritty vlc evince eog fastfetch rofi ripgrep fd ttf-iosevka-nerd ttf-jetbrains-mono-nerd pavucontrol";
 
 static const char *OXWM_PACKAGES = "base base-devel linux linux-firmware linux-headers networkmanager git vim neovim curl wget htop btop man-db man-pages openssh sudo xorg-server xorg-xinit xorg-xsetroot xorg-xrandr xorg-xset libx11 libxft freetype2 fontconfig pkg-config lua firefox alacritty vlc evince eog cargo ttf-iosevka-nerd ttf-jetbrains-mono-nerd picom xclip xwallpaper maim rofi pulseaudio pulseaudio-alsa pavucontrol alsa-utils fastfetch ripgrep fd pcmanfm lxappearance papirus-icon-theme gnome-themes-extra";
 
@@ -367,6 +367,133 @@ void show_message(const char *message) {
     sleep(2);
 }
 
+static int check_internet_connection(void) {
+    int result = system("ping -c 1 -W 2 1.1.1.1 > /dev/null 2>&1");
+    return result == 0;
+}
+
+static int list_wifi_networks(char networks[][256], char ssids[][128], int max_networks) {
+    FILE *fp = popen("nmcli -t -f SSID,SIGNAL,SECURITY device wifi list | head -20", "r");
+    if (!fp) {
+        return 0;
+    }
+
+    int count = 0;
+    char line[512];
+    while (count < max_networks && fgets(line, sizeof(line), fp) != NULL) {
+        line[strcspn(line, "\n")] = '\0';
+
+        char ssid[128], signal[32], security[64];
+        char *token = strtok(line, ":");
+        if (token) strncpy(ssid, token, sizeof(ssid) - 1);
+        token = strtok(NULL, ":");
+        if (token) strncpy(signal, token, sizeof(signal) - 1);
+        token = strtok(NULL, ":");
+        if (token) strncpy(security, token, sizeof(security) - 1);
+
+        if (strlen(ssid) > 0 && strcmp(ssid, "--") != 0) {
+            strncpy(ssids[count], ssid, 127);
+            snprintf(networks[count], 255, "%s (%s%%) [%s]", ssid, signal,
+                     strlen(security) > 0 ? security : "Open");
+            count++;
+        }
+    }
+    pclose(fp);
+    return count;
+}
+
+static int connect_to_wifi(const char *ssid) {
+    int rows, cols;
+    get_terminal_size(&rows, &cols);
+
+    clear_screen();
+    draw_logo(cols);
+
+    int logo_start = (cols - 70) / 2;
+    printf("\033[%d;%dH\033[37mConnecting to: %s\033[0m", 10, logo_start, ssid);
+    printf("\033[%d;%dH\033[37mEnter password (leave empty if open): \033[0m", 12, logo_start);
+    fflush(stdout);
+
+    char password[256] = "";
+    struct termios old_term;
+    tcgetattr(STDIN_FILENO, &old_term);
+    struct termios new_term = old_term;
+    new_term.c_lflag &= ~ECHO;
+    new_term.c_lflag |= ICANON;
+    tcsetattr(STDIN_FILENO, TCSAFLUSH, &new_term);
+
+    if (fgets(password, sizeof(password), stdin) != NULL) {
+        password[strcspn(password, "\n")] = '\0';
+    }
+
+    tcsetattr(STDIN_FILENO, TCSAFLUSH, &old_term);
+
+    clear_screen();
+    draw_logo(cols);
+    printf("\033[%d;%dH\033[37mConnecting...\033[0m", 10, logo_start);
+    fflush(stdout);
+
+    char cmd[512];
+    if (strlen(password) > 0) {
+        snprintf(cmd, sizeof(cmd), "nmcli device wifi connect '%s' password '%s' > /dev/null 2>&1", ssid, password);
+    } else {
+        snprintf(cmd, sizeof(cmd), "nmcli device wifi connect '%s' > /dev/null 2>&1", ssid);
+    }
+
+    int result = system(cmd);
+    sleep(2);
+
+    if (result == 0 && check_internet_connection()) {
+        show_message("Connected successfully!");
+        return 1;
+    } else {
+        show_message("Connection failed. Please try again.");
+        return 0;
+    }
+}
+
+static int setup_wifi_if_needed(void) {
+    if (check_internet_connection()) {
+        return 1;
+    }
+
+    int rows, cols;
+    get_terminal_size(&rows, &cols);
+
+    clear_screen();
+    draw_logo(cols);
+
+    int logo_start = (cols - 70) / 2;
+    printf("\033[%d;%dH\033[37mNo internet connection detected.\033[0m", 10, logo_start);
+    printf("\033[%d;%dH\033[37mScanning for WiFi networks...\033[0m", 11, logo_start);
+    fflush(stdout);
+
+    system("nmcli radio wifi on > /dev/null 2>&1");
+    sleep(1);
+
+    char networks[32][256];
+    char ssids[32][128];
+    int network_count = list_wifi_networks(networks, ssids, 32);
+
+    if (network_count == 0) {
+        show_message("No WiFi networks found. Please check your connection.");
+        return 0;
+    }
+
+    const char *network_ptrs[32];
+    for (int i = 0; i < network_count; i++) {
+        network_ptrs[i] = networks[i];
+    }
+
+    int selected = select_from_menu(network_ptrs, network_count);
+    if (selected < 0) {
+        show_message("WiFi setup cancelled. Installation requires internet.");
+        return 0;
+    }
+
+    return connect_to_wifi(ssids[selected]);
+}
+
 static void draw_form(
         const char *username,
         const char *password,
@@ -649,10 +776,18 @@ static int get_form_input(
     return 1;
 }
 
+static void get_partition_name(const char *disk, int partition_num, char *output, size_t output_size) {
+    if (strstr(disk, "nvme") != NULL || strstr(disk, "mmcblk") != NULL) {
+        snprintf(output, output_size, "%sp%d", disk, partition_num);
+    } else {
+        snprintf(output, output_size, "%s%d", disk, partition_num);
+    }
+}
+
 static int select_disk(char *disk_name) {
     clear_screen();
 
-    FILE *fp = popen("lsblk -d -n -o NAME,SIZE,MODEL | awk '{printf \"%s (%s) %s\\n\", $1, $2, substr($0, index($0,$3))}'", "r");
+    FILE *fp = popen("lsblk -d -n -o NAME,SIZE,MODEL,TYPE | grep -E '(disk|nvme)' | grep -v -E '(loop|rom|airoot)' | awk '{printf \"%s (%s) %s\\n\", $1, $2, substr($0, index($0,$3))}'", "r");
     if (fp == NULL) {
         show_message("Failed to list disks");
         return 0;
@@ -721,9 +856,14 @@ static int select_disk(char *disk_name) {
 
 static int partition_disk(const char *disk) {
     char cmd[1024];
+    char part1[128], part2[128], part3[128];
     int rows, cols;
     get_terminal_size(&rows, &cols);
 
+    get_partition_name(disk, 1, part1, sizeof(part1));
+    get_partition_name(disk, 2, part2, sizeof(part2));
+    get_partition_name(disk, 3, part3, sizeof(part3));
+
     clear_screen();
     draw_logo(cols);
 
@@ -782,41 +922,41 @@ static int partition_disk(const char *disk) {
     fflush(stdout);
 
     if (uefi) {
-        snprintf(cmd, sizeof(cmd), "mkfs.fat -F32 /dev/%s1 2>> /tmp/tonarchy-install.log", disk);
+        snprintf(cmd, sizeof(cmd), "mkfs.fat -F32 /dev/%s 2>> /tmp/tonarchy-install.log", part1);
         if (system(cmd) != 0) {
-            LOG_ERROR("Failed to format EFI partition: /dev/%s1", disk);
+            LOG_ERROR("Failed to format EFI partition: /dev/%s", part1);
             show_message("Failed to format EFI partition");
             return 0;
         }
         LOG_INFO("Formatted EFI partition");
 
-        snprintf(cmd, sizeof(cmd), "mkswap /dev/%s2 2>> /tmp/tonarchy-install.log", disk);
+        snprintf(cmd, sizeof(cmd), "mkswap /dev/%s 2>> /tmp/tonarchy-install.log", part2);
         if (system(cmd) != 0) {
-            LOG_ERROR("Failed to format swap: /dev/%s2", disk);
+            LOG_ERROR("Failed to format swap: /dev/%s", part2);
             show_message("Failed to format swap partition");
             return 0;
         }
         LOG_INFO("Formatted swap partition");
 
-        snprintf(cmd, sizeof(cmd), "mkfs.ext4 -F /dev/%s3 2>> /tmp/tonarchy-install.log", disk);
+        snprintf(cmd, sizeof(cmd), "mkfs.ext4 -F /dev/%s 2>> /tmp/tonarchy-install.log", part3);
         if (system(cmd) != 0) {
-            LOG_ERROR("Failed to format root: /dev/%s3", disk);
+            LOG_ERROR("Failed to format root: /dev/%s", part3);
             show_message("Failed to format root partition");
             return 0;
         }
         LOG_INFO("Formatted root partition");
     } else {
-        snprintf(cmd, sizeof(cmd), "mkswap /dev/%s1 2>> /tmp/tonarchy-install.log", disk);
+        snprintf(cmd, sizeof(cmd), "mkswap /dev/%s 2>> /tmp/tonarchy-install.log", part1);
         if (system(cmd) != 0) {
-            LOG_ERROR("Failed to format swap: /dev/%s1", disk);
+            LOG_ERROR("Failed to format swap: /dev/%s", part1);
             show_message("Failed to format swap partition");
             return 0;
         }
         LOG_INFO("Formatted swap partition");
 
-        snprintf(cmd, sizeof(cmd), "mkfs.ext4 -F /dev/%s2 2>> /tmp/tonarchy-install.log", disk);
+        snprintf(cmd, sizeof(cmd), "mkfs.ext4 -F /dev/%s 2>> /tmp/tonarchy-install.log", part2);
         if (system(cmd) != 0) {
-            LOG_ERROR("Failed to format root: /dev/%s2", disk);
+            LOG_ERROR("Failed to format root: /dev/%s", part2);
             show_message("Failed to format root partition");
             return 0;
         }
@@ -827,9 +967,9 @@ static int partition_disk(const char *disk) {
     fflush(stdout);
 
     if (uefi) {
-        snprintf(cmd, sizeof(cmd), "mount /dev/%s3 /mnt 2>> /tmp/tonarchy-install.log", disk);
+        snprintf(cmd, sizeof(cmd), "mount /dev/%s /mnt 2>> /tmp/tonarchy-install.log", part3);
         if (system(cmd) != 0) {
-            LOG_ERROR("Failed to mount root: /dev/%s3", disk);
+            LOG_ERROR("Failed to mount root: /dev/%s", part3);
             show_message("Failed to mount root partition");
             return 0;
         }
@@ -838,32 +978,32 @@ static int partition_disk(const char *disk) {
         snprintf(cmd, sizeof(cmd), "mkdir -p /mnt/boot 2>> /tmp/tonarchy-install.log");
         system(cmd);
 
-        snprintf(cmd, sizeof(cmd), "mount /dev/%s1 /mnt/boot 2>> /tmp/tonarchy-install.log", disk);
+        snprintf(cmd, sizeof(cmd), "mount /dev/%s /mnt/boot 2>> /tmp/tonarchy-install.log", part1);
         if (system(cmd) != 0) {
-            LOG_ERROR("Failed to mount EFI: /dev/%s1", disk);
+            LOG_ERROR("Failed to mount EFI: /dev/%s", part1);
             show_message("Failed to mount EFI partition");
             return 0;
         }
         LOG_INFO("Mounted EFI partition");
 
-        snprintf(cmd, sizeof(cmd), "swapon /dev/%s2 2>> /tmp/tonarchy-install.log", disk);
+        snprintf(cmd, sizeof(cmd), "swapon /dev/%s 2>> /tmp/tonarchy-install.log", part2);
         if (system(cmd) != 0) {
-            LOG_ERROR("Failed to enable swap: /dev/%s2", disk);
+            LOG_ERROR("Failed to enable swap: /dev/%s", part2);
             show_message("Failed to enable swap");
             return 0;
         }
     } else {
-        snprintf(cmd, sizeof(cmd), "mount /dev/%s2 /mnt 2>> /tmp/tonarchy-install.log", disk);
+        snprintf(cmd, sizeof(cmd), "mount /dev/%s /mnt 2>> /tmp/tonarchy-install.log", part2);
         if (system(cmd) != 0) {
-            LOG_ERROR("Failed to mount root: /dev/%s2", disk);
+            LOG_ERROR("Failed to mount root: /dev/%s", part2);
             show_message("Failed to mount root partition");
             return 0;
         }
         LOG_INFO("Mounted root partition");
 
-        snprintf(cmd, sizeof(cmd), "swapon /dev/%s1 2>> /tmp/tonarchy-install.log", disk);
+        snprintf(cmd, sizeof(cmd), "swapon /dev/%s 2>> /tmp/tonarchy-install.log", part1);
         if (system(cmd) != 0) {
-            LOG_ERROR("Failed to enable swap: /dev/%s1", disk);
+            LOG_ERROR("Failed to enable swap: /dev/%s", part1);
             show_message("Failed to enable swap");
             return 0;
         }
@@ -1026,17 +1166,20 @@ static int configure_system_impl(
 
 static int get_root_uuid(const char *disk, char *uuid_out, size_t uuid_size) {
     char cmd[512];
-    snprintf(cmd, sizeof(cmd), "blkid -s UUID -o value /dev/%s3", disk);
+    char part3[128];
+
+    get_partition_name(disk, 3, part3, sizeof(part3));
+    snprintf(cmd, sizeof(cmd), "blkid -s UUID -o value /dev/%s", part3);
 
     FILE *fp = popen(cmd, "r");
     if (!fp) {
-        LOG_ERROR("Failed to get UUID for /dev/%s3", disk);
+        LOG_ERROR("Failed to get UUID for /dev/%s", part3);
         return 0;
     }
 
     if (fgets(uuid_out, uuid_size, fp) == NULL) {
         pclose(fp);
-        LOG_ERROR("Failed to read UUID for /dev/%s3", disk);
+        LOG_ERROR("Failed to read UUID for /dev/%s", part3);
         return 0;
     }
 
@@ -1044,7 +1187,7 @@ static int get_root_uuid(const char *disk, char *uuid_out, size_t uuid_size) {
     pclose(fp);
 
     if (strlen(uuid_out) == 0) {
-        LOG_ERROR("Empty UUID for /dev/%s3", disk);
+        LOG_ERROR("Empty UUID for /dev/%s", part3);
         return 0;
     }
 
@@ -1393,6 +1536,11 @@ int main(void) {
     logger_init("/tmp/tonarchy-install.log");
     LOG_INFO("Tonarchy installer started");
 
+    if (!setup_wifi_if_needed()) {
+        logger_close();
+        return 1;
+    }
+
     char username[256] = "";
     char password[256] = "";
     char confirmed_password[256] = "";
@@ -1450,18 +1598,21 @@ int main(void) {
     draw_logo(cols);
 
     int logo_start = (cols - 70) / 2;
-    printf("\033[%d;%dH\033[1;32mInstallation complete!\033[0m", 10, logo_start);
-    printf("\033[%d;%dH\033[37mPress Enter to reboot...\033[0m", 12, logo_start);
+    printf("\033[%d;%dH\033[1;32mInstallation complete!\033[0m\n", 10, logo_start);
+    printf("\033[%d;%dH\033[37mPress Enter or Q to quit. Then, manually reboot.\033[0m\n", 12, logo_start);
     fflush(stdout);
 
-    enable_raw_mode();
     char c;
-    read(STDIN_FILENO, &c, 1);
+    enable_raw_mode();
+    while (read(STDIN_FILENO, &c, 1) == 1) {
+        if (c == '\r' || c == '\n' || c == 'q' || c == 'Q') {
+            break;
+        }
+    }
     disable_raw_mode();
-    system("eject -m /dev/sr0 2>/dev/null");
-    system("reboot");
 
-    LOG_INFO("Tonarchy installer finished");
+    LOG_INFO("Tonarchy installer finished - exiting cleanly");
     logger_close();
+
     return 0;
 }