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 -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list