Extract the code to it's own function. Signed-off-by: Pavel Hrdina <phrdina@xxxxxxxxxx> --- src/conf/domain_conf.c | 109 +++++++++++++++++++++++------------------ 1 file changed, 61 insertions(+), 48 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 47756ff0be..31b908d8fe 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -19523,12 +19523,70 @@ virDomainVcpuParse(virDomainDefPtr def, } +static int +virDomainDefParseBootInitOptions(virDomainDefPtr def, + xmlXPathContextPtr ctxt) +{ + char *name = NULL; + size_t i; + int n; + g_autofree xmlNodePtr *nodes = NULL; + + def->os.init = virXPathString("string(./os/init[1])", ctxt); + def->os.cmdline = virXPathString("string(./os/cmdline[1])", ctxt); + def->os.initdir = virXPathString("string(./os/initdir[1])", ctxt); + def->os.inituser = virXPathString("string(./os/inituser[1])", ctxt); + def->os.initgroup = virXPathString("string(./os/initgroup[1])", ctxt); + + if ((n = virXPathNodeSet("./os/initarg", ctxt, &nodes)) < 0) + return -1; + + def->os.initargv = g_new0(char *, n+1); + for (i = 0; i < n; i++) { + if (!nodes[i]->children || + !nodes[i]->children->content) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("No data supplied for <initarg> element")); + return -1; + } + def->os.initargv[i] = g_strdup((const char *)nodes[i]->children->content); + } + def->os.initargv[n] = NULL; + VIR_FREE(nodes); + + if ((n = virXPathNodeSet("./os/initenv", ctxt, &nodes)) < 0) + return -1; + + def->os.initenv = g_new0(virDomainOSEnvPtr, n+1); + for (i = 0; i < n; i++) { + if (!(name = virXMLPropString(nodes[i], "name"))) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("No name supplied for <initenv> element")); + return -1; + } + + if (!nodes[i]->children || + !nodes[i]->children->content) { + virReportError(VIR_ERR_XML_ERROR, + _("No value supplied for <initenv name='%s'> element"), + name); + return -1; + } + + def->os.initenv[i] = g_new0(virDomainOSEnv, 1); + def->os.initenv[i]->name = name; + def->os.initenv[i]->value = g_strdup((const char *)nodes[i]->children->content); + } + def->os.initenv[n] = NULL; + + return 0; +} + + static int virDomainDefParseBootOptions(virDomainDefPtr def, xmlXPathContextPtr ctxt) { - char *name = NULL; - size_t i; int n; g_autofree xmlNodePtr *nodes = NULL; g_autofree char *tmp = NULL; @@ -19543,53 +19601,8 @@ virDomainDefParseBootOptions(virDomainDefPtr def, */ if (def->os.type == VIR_DOMAIN_OSTYPE_EXE) { - def->os.init = virXPathString("string(./os/init[1])", ctxt); - def->os.cmdline = virXPathString("string(./os/cmdline[1])", ctxt); - def->os.initdir = virXPathString("string(./os/initdir[1])", ctxt); - def->os.inituser = virXPathString("string(./os/inituser[1])", ctxt); - def->os.initgroup = virXPathString("string(./os/initgroup[1])", ctxt); - - if ((n = virXPathNodeSet("./os/initarg", ctxt, &nodes)) < 0) + if (virDomainDefParseBootInitOptions(def, ctxt) < 0) return -1; - - def->os.initargv = g_new0(char *, n+1); - for (i = 0; i < n; i++) { - if (!nodes[i]->children || - !nodes[i]->children->content) { - virReportError(VIR_ERR_XML_ERROR, "%s", - _("No data supplied for <initarg> element")); - return -1; - } - def->os.initargv[i] = g_strdup((const char *)nodes[i]->children->content); - } - def->os.initargv[n] = NULL; - VIR_FREE(nodes); - - if ((n = virXPathNodeSet("./os/initenv", ctxt, &nodes)) < 0) - return -1; - - def->os.initenv = g_new0(virDomainOSEnvPtr, n+1); - for (i = 0; i < n; i++) { - if (!(name = virXMLPropString(nodes[i], "name"))) { - virReportError(VIR_ERR_XML_ERROR, "%s", - _("No name supplied for <initenv> element")); - return -1; - } - - if (!nodes[i]->children || - !nodes[i]->children->content) { - virReportError(VIR_ERR_XML_ERROR, - _("No value supplied for <initenv name='%s'> element"), - name); - return -1; - } - - def->os.initenv[i] = g_new0(virDomainOSEnv, 1); - def->os.initenv[i]->name = name; - def->os.initenv[i]->value = g_strdup((const char *)nodes[i]->children->content); - } - def->os.initenv[n] = NULL; - VIR_FREE(nodes); } if (def->os.type == VIR_DOMAIN_OSTYPE_XEN || -- 2.30.2