Patchwork [3/4] QemuOpts: parse config from file.

login
register
mail settings
Submitter Gerd Hoffmann
Date Oct. 14, 2009, 8:39 a.m.
Message ID <1255509568-10635-4-git-send-email-kraxel@redhat.com>
Download mbox | patch
Permalink /patch/35928/
State New
Headers show

Comments

Gerd Hoffmann - Oct. 14, 2009, 8:39 a.m.
Add functions to parse QemuOpts from a git-style config file.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 qemu-config.c |   50 ++++++++++++++++++++++++++++++++++++++++++++++++++
 qemu-config.h |    1 +
 2 files changed, 51 insertions(+), 0 deletions(-)

Patch

diff --git a/qemu-config.c b/qemu-config.c
index fa236e9..1b24ec8 100644
--- a/qemu-config.c
+++ b/qemu-config.c
@@ -277,3 +277,53 @@  void qemu_config_write(FILE *fp)
         qemu_opts_foreach(data.list, config_write_opts, &data, 0);
     }
 }
+
+int qemu_config_parse(FILE *fp)
+{
+    char line[1024], group[64], id[64], arg[64], value[1024];
+    QemuOptsList *list = NULL;
+    QemuOpts *opts = NULL;
+
+    while (fgets(line, sizeof(line), fp) != NULL) {
+        if (line[0] == '\n') {
+            /* skip empty lines */
+            continue;
+        }
+        if (line[0] == '#') {
+            /* comment */
+            continue;
+        }
+        if (sscanf(line, "[%63s \"%63[^\"]\"]", group, id) == 2) {
+            /* group with id */
+            list = find_list(group);
+            if (list == NULL)
+                return -1;
+            opts = qemu_opts_create(list, id, 1);
+            continue;
+        }
+        if (sscanf(line, "[%63[^]]]", group) == 1) {
+            /* group without id */
+            list = find_list(group);
+            if (list == NULL)
+                return -1;
+            opts = qemu_opts_create(list, NULL, 0);
+            continue;
+        }
+        if (sscanf(line, " %63s = \"%1023[^\"]\"", arg, value) == 2) {
+            /* arg = value */
+            if (opts == NULL) {
+                fprintf(stderr, "no group defined\n");
+                return -1;
+            }
+            if (qemu_opt_set(opts, arg, value) != 0) {
+                fprintf(stderr, "failed to set \"%s\" for %s\n",
+                        arg, group);
+                return -1;
+            }
+            continue;
+        }
+        fprintf(stderr, "parse error: %s\n", line);
+        return -1;
+    }
+    return 0;
+}
diff --git a/qemu-config.h b/qemu-config.h
index 33fce7e..0448ab4 100644
--- a/qemu-config.h
+++ b/qemu-config.h
@@ -10,5 +10,6 @@  extern QemuOptsList qemu_rtc_opts;
 int qemu_set_option(const char *str);
 
 void qemu_config_write(FILE *fp);
+int qemu_config_parse(FILE *fp);
 
 #endif /* QEMU_CONFIG_H */