
I went to ping this but noticed that I had sent it to "jimfehlig" (i.e. no domain), so no wonder there was no reply! To: line fixed here, let me know if you would prefer a resend. Ian. On Wed, 2015-12-16 at 12:09 +0000, Ian Campbell wrote:
... and consolidate the cmdline/extra/root parsing to facilitate doing so.
The logic is the same as xl's parse_cmdline from the current xen.git master branch (e6f0e099d2c17de47fd86e817b1998db903cab61), except I was unable to figure out how/where to route the warning about ignoring root+extra if cmdline was specified.
Signed-off-by: Ian Campbell <ian.campbell@citrix.com> --- src/xenconfig/xen_xl.c | 62 ++++++++++++++++++++++++++++++------------ -------- 1 file changed, 37 insertions(+), 25 deletions(-)
diff --git a/src/xenconfig/xen_xl.c b/src/xenconfig/xen_xl.c index 91cdff6..ba8b938 100644 --- a/src/xenconfig/xen_xl.c +++ b/src/xenconfig/xen_xl.c @@ -58,11 +58,45 @@ extern int xlu_disk_parse(XLU_Config *cfg, libxl_device_disk *disk); #endif +static int xenParseCmdline(virConfPtr conf, char **r_cmdline) +{ + char *cmdline = NULL; + const char *root = NULL, *extra = NULL, *buf = NULL; + + if (xenConfigGetString(conf, "cmdline", &buf, NULL) < 0) + return -1; + + if (xenConfigGetString(conf, "root", &root, NULL) < 0) + return -1; + + if (xenConfigGetString(conf, "extra", &extra, NULL) < 0) + return -1; + + if (buf) { + if (VIR_STRDUP(cmdline, buf) < 0) + return -1; + /* root or extra are ignored in this case. */ + } else { + if (root && extra) { + if (virAsprintf(&cmdline, "root=%s %s", root, extra) < 0) + return -1; + } else if (root) { + if (virAsprintf(&cmdline, "root=%s", root) < 0) + return -1; + } else if (extra) { + if (VIR_STRDUP(cmdline, extra) < 0) + return -1; + } + } + + *r_cmdline = cmdline; + return 0; +} + static int xenParseXLOS(virConfPtr conf, virDomainDefPtr def, virCapsPtr caps) { size_t i; - const char *extra, *root; if (def->os.type == VIR_DOMAIN_OSTYPE_HVM) { const char *boot; @@ -84,19 +118,8 @@ xenParseXLOS(virConfPtr conf, virDomainDefPtr def, virCapsPtr caps) if (xenConfigCopyStringOpt(conf, "ramdisk", &def->os.initrd) < 0) return -1; - if (xenConfigGetString(conf, "extra", &extra, NULL) < 0) - return -1; - - if (xenConfigGetString(conf, "root", &root, NULL) < 0) + if (xenParseCmdline(conf, &def->os.cmdline) < 0) return -1; - - if (root) { - if (virAsprintf(&def->os.cmdline, "root=%s %s", root, extra) < 0) - return -1; - } else { - if (VIR_STRDUP(def->os.cmdline, extra) < 0) - return -1; - } #endif if (xenConfigGetString(conf, "boot", &boot, "c") < 0) @@ -132,19 +155,8 @@ xenParseXLOS(virConfPtr conf, virDomainDefPtr def, virCapsPtr caps) if (xenConfigCopyStringOpt(conf, "ramdisk", &def->os.initrd) < 0) return -1; - if (xenConfigGetString(conf, "extra", &extra, NULL) < 0) - return -1; - - if (xenConfigGetString(conf, "root", &root, NULL) < 0) + if (xenParseCmdline(conf, &def->os.cmdline) < 0) return -1; - - if (root) { - if (virAsprintf(&def->os.cmdline, "root=%s %s", root, extra) < 0) - return -1; - } else { - if (VIR_STRDUP(def->os.cmdline, extra) < 0) - return -1; - } } return 0;