When experimenting with libvirt and UML I found it necessary to add
support for additional kernel command line arguments.
Ron
diff -up libvirt-0.6.5/src/uml_conf.c.uml-cmdline libvirt-0.6.5/src/uml_conf.c
--- libvirt-0.6.5/src/uml_conf.c.uml-cmdline 2009-07-10 16:28:51.000000000 +0100
+++ libvirt-0.6.5/src/uml_conf.c 2009-07-27 19:39:59.000000000 +0100
@@ -326,6 +326,31 @@ umlBuildCommandLineChr(virConnectPtr con
}
/*
+ * Null-terminate the current argument and return a pointer to the next.
+ * This should follow the same rules as the Linux kernel: arguments are
+ * separated by spaces; arguments can be quoted with double quotes; double
+ * quotes can't be escaped.
+ */
+static char *umlNextArg(char *args)
+{
+ int in_quote = 0;
+
+ for (; *args; args++) {
+ if (*args == ' ' && !in_quote) {
+ *args++ = '\0';
+ break;
+ }
+ if (*args == '"')
+ in_quote = !in_quote;
+ }
+
+ while (*args == ' ')
+ args++;
+
+ return args;
+}
+
+/*
* Constructs a argv suitable for launching uml with config defined
* for a given virtual machine.
*/
@@ -342,6 +367,7 @@ int umlBuildCommandLine(virConnectPtr co
const char **qargv = NULL;
int qenvc = 0, qenva = 0;
const char **qenv = NULL;
+ char *cmdline = NULL;
uname(&ut);
@@ -474,6 +500,22 @@ int umlBuildCommandLine(virConnectPtr co
ADD_ARG(ret);
}
+ if (vm->def->os.cmdline) {
+ char *args, *next_arg;
+ if ((cmdline = strdup(vm->def->os.cmdline)) == NULL)
+ goto no_memory;
+
+ args = cmdline;
+ while (*args == ' ')
+ args++;
+
+ while (*args) {
+ next_arg = umlNextArg(args);
+ ADD_ARG_LIT(args);
+ args = next_arg;
+ }
+ }
+
ADD_ARG(NULL);
ADD_ENV(NULL);
@@ -495,6 +537,7 @@ int umlBuildCommandLine(virConnectPtr co
VIR_FREE((qenv)[i]);
VIR_FREE(qenv);
}
+ VIR_FREE(cmdline);
return -1;
#undef ADD_ARG