aboutsummaryrefslogtreecommitdiffstats
path: root/extras/mini-os/main.c
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2008-03-18 11:27:05 +0000
committerKeir Fraser <keir.fraser@citrix.com>2008-03-18 11:27:05 +0000
commit37a1d36134c14c297416204b6cc13888483e2eea (patch)
treea9ee51f83233ae638f1a42cd5aaa565da5ae4df7 /extras/mini-os/main.c
parentb1c30105ce1e648b15bbb3b95bdcd152e8b5d1c0 (diff)
downloadxen-37a1d36134c14c297416204b6cc13888483e2eea.tar.gz
xen-37a1d36134c14c297416204b6cc13888483e2eea.tar.bz2
xen-37a1d36134c14c297416204b6cc13888483e2eea.zip
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 <samuel.thibault@eu.citrix.com>
Diffstat (limited to 'extras/mini-os/main.c')
-rw-r--r--extras/mini-os/main.c74
1 files changed, 40 insertions, 34 deletions
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++)