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@xxxxxxxxxxxxx>
diff -r 73ec21ad5dc7 extras/mini-os/main.c
--- a/extras/mini-os/main.c Tue Mar 11 16:01:04 2008 +0000
+++ b/extras/mini-os/main.c Tue Mar 11 17:35:14 2008 +0000
@@ -42,6 +42,9 @@ static void call_main(void *p)
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++)
diff -r 73ec21ad5dc7 tools/python/xen/xend/image.py
--- a/tools/python/xen/xend/image.py Tue Mar 11 16:01:04 2008 +0000
+++ b/tools/python/xen/xend/image.py Tue Mar 11 17:35:14 2008 +0000
@@ -90,6 +90,7 @@ class ImageHandler:
("image/kernel", self.kernel),
("image/cmdline", self.cmdline),
("image/ramdisk", self.ramdisk))
+ self.vm.permissionsVm("image/cmdline", { 'dom': self.vm.getDomid(),
'read': True } )
self.device_model = vmConfig['platform'].get('device_model')
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|