[libvirt] [PATCH] Kernel command line support for UML

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

On Mon, Jul 27, 2009 at 07:51:08PM +0100, Ron Yorston wrote:
When experimenting with libvirt and UML I found it necessary to add support for additional kernel command line arguments.
ACK, this looks reasonable. Daniel
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
-- Libvir-list mailing list Libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
-- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|

On Mon, Jul 27, 2009 at 07:51:08PM +0100, Ron Yorston wrote:
When experimenting with libvirt and UML I found it necessary to add support for additional kernel command line arguments.
Okay, makes sense and code looks fine, applied and commited, thanks ! Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/
participants (3)
-
Daniel P. Berrange
-
Daniel Veillard
-
Ron Yorston