[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[tyndur-devel] [PATCH] servmgr: $ROOT-Variable in cmd erlauben



+ servmgr: $ROOT in Befehlszeilen durch das Rootverzeichnis ersetzen
* root-cdrom: $ROOT benutzen statt hartkodiertem Pfad. Dadurch reicht
  es, in GRUB den Modulparameter zu aendern, wenn man mal nicht von
  Secondary Master booten will
---
 build/root-cdrom/config/servmgr/mount/cmd |    2 +-
 src/modules/servmgr/config.c              |   48 +++++++++++++++++++++++++++++
 2 files changed, 49 insertions(+), 1 deletions(-)

diff --git a/build/root-cdrom/config/servmgr/mount/cmd b/build/root-cdrom/config/servmgr/mount/cmd
index 34807da..0c9cb8a 100644
--- a/build/root-cdrom/config/servmgr/mount/cmd
+++ b/build/root-cdrom/config/servmgr/mount/cmd
@@ -1 +1 @@
-/modules/file mount file:/ ata:/atapi10|iso9660:/
+/modules/file mount file:/ $ROOT
diff --git a/src/modules/servmgr/config.c b/src/modules/servmgr/config.c
index dedd260..0ca4f73 100644
--- a/src/modules/servmgr/config.c
+++ b/src/modules/servmgr/config.c
@@ -48,6 +48,52 @@ static list_t* config_list;
 char* full_config_path;
 
 /**
+ * Alle Vorkommen von einer Zeichenkette in einem gegebenen Puffer ersetzen.
+ *
+ * Der alte Puffer muss per malloc alloziert worden sein und wird freigegeben.
+ * Dafuer wird ein neuer Puffer mit der neuen Stringlaenge alloziert.
+ */
+static void buffer_replace(char** buf, const char* search, const char* replace)
+{
+    size_t len, i, j;
+    size_t search_len = strlen(search);
+    size_t replace_len = strlen(replace);
+    char* old = *buf;
+    char* new;
+    int found = 0;
+
+    for (i = 0; i < strlen(old); i++) {
+        if (!strncmp(old + i, search, search_len)) {
+            len += replace_len;
+            i += search_len - 1;
+            found = 1;
+        } else {
+            len++;
+        }
+    }
+
+    if (!found) {
+        return;
+    }
+
+    new = malloc(len + 1);
+    new[len] = '\0';
+    for (i = 0, j = 0; i < strlen(old); i++) {
+        if (!strncmp(old + i, search, search_len)) {
+            memcpy(new + j, replace, replace_len);
+            j += replace_len;
+            i += search_len - 1;
+        } else {
+            new[j] = old[i];
+            j++;
+        }
+    }
+
+    free(old);
+    *buf = new;
+}
+
+/**
  * Dateiinhalt auslesen und den Angegebenen Pointer auf einen Buffer mit dem
  * Inhalt setzen. Wenn die Datei nicht geoeffnet werden konnte, wird er auf
  * NULL gesetzt.
@@ -76,6 +122,8 @@ static void config_read_file(const char* path, char** ptr)
         *ptr = strdup(buffer);
         assert(*ptr != NULL);
 
+        buffer_replace(ptr, "$ROOT", root_dir);
+
         fclose(f);
     }
 }
-- 
1.6.0.2