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

Ron Yorston rmy at tigress.co.uk
Mon Jul 27 18:51:08 UTC 2009


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




More information about the libvir-list mailing list