From 37a1d36134c14c297416204b6cc13888483e2eea Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Tue, 18 Mar 2008 11:27:05 +0000 Subject: stubdom: add support for reading the command line from the config file, and merge the dmargs with it in the case of qemu. Signed-off-by: Samuel Thibault --- extras/mini-os/main.c | 74 ++++++++++++++++++++++++++++----------------------- 1 file changed, 40 insertions(+), 34 deletions(-) (limited to 'extras/mini-os/main.c') diff --git a/extras/mini-os/main.c b/extras/mini-os/main.c index 345f7e9487..a8b68ac902 100644 --- a/extras/mini-os/main.c +++ b/extras/mini-os/main.c @@ -42,6 +42,9 @@ void _fini(void) static void call_main(void *p) { char *args, /**path,*/ *msg, *c; +#ifdef CONFIG_QEMU + char *domargs; +#endif int argc; char **argv; char *envp[] = { NULL }; @@ -63,14 +66,12 @@ static void call_main(void *p) } /* Fetch argc, argv from XenStore */ - char domid_s[10]; int domid; domid = xenbus_read_integer("target"); if (domid == -1) { printk("Couldn't read target\n"); do_exit(); } - snprintf(domid_s, sizeof(domid_s), "%d", domid); snprintf(path, sizeof(path), "/local/domain/%d/vm", domid); msg = xenbus_read(XBT_NIL, path, &vm); @@ -78,59 +79,64 @@ static void call_main(void *p) printk("Couldn't read vm path\n"); do_exit(); } - printk("vm is at %s\n", vm); -#else + printk("dom vm is at %s\n", vm); + + snprintf(path, sizeof(path), "%s/image/dmargs", vm); + free(vm); + msg = xenbus_read(XBT_NIL, path, &domargs); + + if (msg) { + printk("Couldn't get stubdom args: %s\n", msg); + domargs = strdup(""); + } +#endif + msg = xenbus_read(XBT_NIL, "vm", &vm); if (msg) { printk("Couldn't read vm path\n"); do_exit(); } -#endif - snprintf(path, sizeof(path), "%s/image/dmargs", vm); + printk("my vm is at %s\n", vm); + snprintf(path, sizeof(path), "%s/image/cmdline", vm); free(vm); msg = xenbus_read(XBT_NIL, path, &args); if (msg) { - printk("Couldn't get stubdom args: %s\n", msg); + printk("Couldn't get my args: %s\n", msg); args = strdup(""); } argc = 1; + +#define PARSE_ARGS(ARGS,START,END) \ + c = ARGS; \ + while (*c) { \ + if (*c != ' ') { \ + START; \ + while (*c && *c != ' ') \ + c++; \ + } else { \ + END; \ + while (*c == ' ') \ + c++; \ + } \ + } + + PARSE_ARGS(args, argc++, ); #ifdef CONFIG_QEMU - argc += 2; + PARSE_ARGS(domargs, argc++, ); #endif - c = args; - while (*c) { - if (*c != ' ') { - argc++; - while (*c && *c != ' ') - c++; - } else { - while (*c == ' ') - c++; - } - } + argv = alloca((argc + 1) * sizeof(char *)); argv[0] = "main"; argc = 1; + + PARSE_ARGS(args, argv[argc++] = c, *c++ = 0) #ifdef CONFIG_QEMU - argv[1] = "-d"; - argv[2] = domid_s; - argc += 2; + PARSE_ARGS(domargs, argv[argc++] = c, *c++ = 0) #endif - c = args; - while (*c) { - if (*c != ' ') { - argv[argc++] = c; - while (*c && *c != ' ') - c++; - } else { - *c++ = 0; - while (*c == ' ') - c++; - } - } + argv[argc] = NULL; for (i = 0; i < argc; i++) -- cgit v1.2.3