[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