From: Kiarie Kahurani <davidkiarie4(a)gmail.com>
introduce function
xenParseXMCharDev(virConfPtr conf,.........);
which parses Char devices config instead
signed-off-by: David Kiarie<davidkiarie4(a)gmail.com>
---
src/xenxs/xen_xm.c | 174 ++++++++++++++++++++++++++++-------------------------
1 file changed, 93 insertions(+), 81 deletions(-)
diff --git a/src/xenxs/xen_xm.c b/src/xenxs/xen_xm.c
index 228e0a2..628cef6 100644
--- a/src/xenxs/xen_xm.c
+++ b/src/xenxs/xen_xm.c
@@ -843,6 +843,97 @@ xenParseXMVfb(virConfPtr conf, virDomainDefPtr def,
return -1;
}
+
+static int
+xenParseXMCharDev(virConfPtr conf, virDomainDefPtr def)
+{
+ const char *str;
+ virConfValuePtr value = NULL;
+ virDomainChrDefPtr chr = NULL;
+
+ if (STREQ(def->os.type, "hvm")) {
+ if (xenXMConfigGetString(conf, "parallel", &str, NULL) < 0)
+ goto cleanup;
+ if (str && STRNEQ(str, "none") &&
+ !(chr = xenParseSxprChar(str, NULL)))
+ goto cleanup;
+ if (chr) {
+ if (VIR_ALLOC_N(def->parallels, 1) < 0) {
+ goto cleanup;
+ }
+
+ chr->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL;
+ chr->target.port = 0;
+ def->parallels[0] = chr;
+ def->nparallels++;
+ chr = NULL;
+ }
+
+ /* Try to get the list of values to support multiple serial ports */
+ value = virConfGetValue(conf, "serial");
+ if (value && value->type == VIR_CONF_LIST) {
+ int portnum = -1;
+
+ value = value->list;
+ while (value) {
+ char *port = NULL;
+
+ if ((value->type != VIR_CONF_STRING) || (value->str == NULL))
+ goto cleanup;
+ port = value->str;
+ portnum++;
+ if (STREQ(port, "none")) {
+ value = value->next;
+ continue;
+ }
+
+ if (!(chr = xenParseSxprChar(port, NULL)))
+ goto cleanup;
+ chr->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL;
+ chr->target.port = portnum;
+ if (VIR_APPEND_ELEMENT(def->serials, def->nserials, chr) < 0) {
+ goto cleanup;
+ }
+
+ value = value->next;
+ }
+ } else {
+ /* If domain is not using multiple serial ports we parse data old way */
+ if (xenXMConfigGetString(conf, "serial", &str, NULL) < 0)
+ goto cleanup;
+ if (str && STRNEQ(str, "none") &&
+ !(chr = xenParseSxprChar(str, NULL)))
+ goto cleanup;
+ if (chr) {
+ if (VIR_ALLOC_N(def->serials, 1) < 0) {
+ virDomainChrDefFree(chr);
+ goto cleanup;
+ }
+ chr->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL;
+ chr->target.port = 0;
+ def->serials[0] = chr;
+ def->nserials++;
+ }
+ }
+ } else {
+ if (VIR_ALLOC_N(def->consoles, 1) < 0)
+ goto cleanup;
+ def->nconsoles = 1;
+ if (!(def->consoles[0] = xenParseSxprChar("pty", NULL)))
+ goto cleanup;
+ def->consoles[0]->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE;
+ def->consoles[0]->target.port = 0;
+ def->consoles[0]->targetType = VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_XEN;
+ }
+
+ return 0;
+
+ cleanup:
+ virDomainChrDefFree(chr);
+ return -1;
+}
+
+
/*
* Turn a config record into a lump of XML describing the
* domain, suitable for later feeding for virDomainCreateXML
@@ -1145,87 +1236,8 @@ xenParseXM(virConfPtr conf, int xendConfigVersion,
if (xenParseXMVfb(conf, def, xendConfigVersion) < 0)
goto cleanup;
- if (hvm) {
- virDomainChrDefPtr chr = NULL;
-
- if (xenXMConfigGetString(conf, "parallel", &str, NULL) < 0)
- goto cleanup;
- if (str && STRNEQ(str, "none") &&
- !(chr = xenParseSxprChar(str, NULL)))
- goto cleanup;
-
- if (chr) {
- if (VIR_ALLOC_N(def->parallels, 1) < 0) {
- virDomainChrDefFree(chr);
- goto cleanup;
- }
- chr->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL;
- chr->target.port = 0;
- def->parallels[0] = chr;
- def->nparallels++;
- chr = NULL;
- }
-
- /* Try to get the list of values to support multiple serial ports */
- list = virConfGetValue(conf, "serial");
- if (list && list->type == VIR_CONF_LIST) {
- int portnum = -1;
-
- list = list->list;
- while (list) {
- char *port = NULL;
-
- if ((list->type != VIR_CONF_STRING) || (list->str == NULL))
- goto cleanup;
-
- port = list->str;
- portnum++;
- if (STREQ(port, "none")) {
- list = list->next;
- continue;
- }
-
- if (!(chr = xenParseSxprChar(port, NULL)))
- goto cleanup;
-
- chr->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL;
- chr->target.port = portnum;
-
- if (VIR_APPEND_ELEMENT(def->serials, def->nserials, chr) < 0) {
- virDomainChrDefFree(chr);
- goto cleanup;
- }
-
- list = list->next;
- }
- } else {
- /* If domain is not using multiple serial ports we parse data old way */
- if (xenXMConfigGetString(conf, "serial", &str, NULL) < 0)
- goto cleanup;
- if (str && STRNEQ(str, "none") &&
- !(chr = xenParseSxprChar(str, NULL)))
- goto cleanup;
- if (chr) {
- if (VIR_ALLOC_N(def->serials, 1) < 0) {
- virDomainChrDefFree(chr);
- goto cleanup;
- }
- chr->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL;
- chr->target.port = 0;
- def->serials[0] = chr;
- def->nserials++;
- }
- }
- } else {
- if (VIR_ALLOC_N(def->consoles, 1) < 0)
- goto cleanup;
- def->nconsoles = 1;
- if (!(def->consoles[0] = xenParseSxprChar("pty", NULL)))
- goto cleanup;
- def->consoles[0]->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE;
- def->consoles[0]->target.port = 0;
- def->consoles[0]->targetType = VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_XEN;
- }
+ if (xenParseXMCharDev(conf, def) < 0)
+ goto cleanup;
if (hvm) {
if (xenXMConfigGetString(conf, "soundhw", &str, NULL) < 0)
--
1.8.4.5