:: commit babc5269ebc3111aa343691cfe12c1baee977f74

mintsuki <mintsuki@protonmail.com> — 2020-03-30 19:24

parents: 84ac96435e

Make config more encapsulated

diff --git a/src/lib/config.c b/src/lib/config.c
index 5aebb806..03afc117 100644
--- a/src/lib/config.c
+++ b/src/lib/config.c
@@ -1,25 +1,51 @@
 #include <stddef.h>
 #include <lib/config.h>
 #include <lib/libc.h>
+#include <lib/blib.h>
+#include <fs/echfs.h>
 
 #define SEPARATOR '\n'
+#define CONFIG_NAME "qloader2.cfg"
+#define MAX_CONFIG_SIZE 4096
 
-char *config_get_value(char *buf, size_t limit, const char *config, const char *key) {
-    if (!limit || !buf)
+static char *config_addr;
+
+int init_config(int drive, int part) {
+    struct echfs_file_handle f;
+
+    if (echfs_open(&f, drive, part, CONFIG_NAME)) {
+        return -1;
+    }
+
+    if (f.dir_entry.size >= 4096) {
+        print("Config file is too big!\n");
+        for (;;);
+    }
+
+    config_addr = balloc(MAX_CONFIG_SIZE);
+    memset(config_addr, 0, MAX_CONFIG_SIZE);
+
+    echfs_read(&f, config_addr, 0, f.dir_entry.size);
+
+    return 0;
+}
+
+char *config_get_value(char *buf, size_t limit, const char *key) {
+    if (!limit || !buf || !key)
         return NULL;
 
     size_t key_len = strlen(key);
 
-    for (size_t i = 0; config[i]; i++) {
-        if (!strncmp(&config[i], key, key_len) && config[i + key_len] == '=') {
-            if (i && config[i - 1] != SEPARATOR)
+    for (size_t i = 0; config_addr[i]; i++) {
+        if (!strncmp(&config_addr[i], key, key_len) && config_addr[i + key_len] == '=') {
+            if (i && config_addr[i - 1] != SEPARATOR)
                 continue;
             i += key_len + 1;
             size_t j;
-            for (j = 0; config[i + j] != SEPARATOR && config[i + j]; j++) {
+            for (j = 0; config_addr[i + j] != SEPARATOR && config_addr[i + j]; j++) {
                 if (j == limit - 1)
                     break;
-                buf[j] = config[i + j];
+                buf[j] = config_addr[i + j];
             }
             buf[j] = 0;
             return buf;
diff --git a/src/lib/config.h b/src/lib/config.h
index 0f486a2f..a6b68579 100644
--- a/src/lib/config.h
+++ b/src/lib/config.h
@@ -3,6 +3,7 @@
 
 #include <stddef.h>
 
-char *config_get_value(char *buf, size_t limit, const char *config, const char *key);
+int init_config(int drive, int part);
+char *config_get_value(char *buf, size_t limit, const char *key);
 
 #endif
diff --git a/src/main.c b/src/main.c
index 4070e140..825f815d 100644
--- a/src/main.c
+++ b/src/main.c
@@ -16,8 +16,6 @@ asm (
 #include <lib/elf.h>
 #include <protos/stivale.h>
 
-#define CONFIG_NAME "qloader2.cfg"
-
 extern symbol bss_begin;
 extern symbol bss_end;
 
@@ -38,7 +36,6 @@ void main(int boot_drive) {
     print("qLoader 2\n\n");
     print("=> Boot drive: %x\n", boot_drive);
 
-    void *config_addr = balloc(4096);
 
     // Enumerate partitions.
     struct mbr_part parts[4];
@@ -50,8 +47,7 @@ void main(int boot_drive) {
         } else {
             print("   Found!\n");
             if (!config_loaded) {
-                if (!echfs_open(&f, boot_drive, i, CONFIG_NAME)) {
-                    echfs_read(&f, config_addr, 0, f.dir_entry.size);
+                if (!init_config(boot_drive, i)) {
                     config_loaded = 1;
                     print("   Config file found and loaded!\n");
                 }
@@ -64,22 +60,22 @@ void main(int boot_drive) {
 
     if (config_loaded) {
         char buf[32];
-        if (!config_get_value(buf, 32, config_addr, "KERNEL_DRIVE")) {
+        if (!config_get_value(buf, 32, "KERNEL_DRIVE")) {
             print("KERNEL_DRIVE not specified, using boot drive (%x)", boot_drive);
             drive = boot_drive;
         } else {
             drive = (int)strtoui(buf);
         }
-        if (!config_get_value(buf, 64, config_addr, "TIMEOUT")) {
+        if (!config_get_value(buf, 64, "TIMEOUT")) {
             timeout = 5;
         } else {
             timeout = (int)strtoui(buf);
         }
-        config_get_value(buf, 32, config_addr, "KERNEL_PARTITION");
+        config_get_value(buf, 32, "KERNEL_PARTITION");
         part = (int)strtoui(buf);
-        config_get_value(path, 128, config_addr, "KERNEL_PATH");
-        config_get_value(cmdline, 128, config_addr, "KERNEL_CMDLINE");
-        config_get_value(proto, 64, config_addr, "KERNEL_PROTO");
+        config_get_value(path, 128, "KERNEL_PATH");
+        config_get_value(cmdline, 128, "KERNEL_CMDLINE");
+        config_get_value(proto, 64, "KERNEL_PROTO");
     } else {
         print("   !! NO CONFIG FILE FOUND ON BOOT DRIVE !!");
         for (;;);
tab: 248 wrap: offon