Signed-off-by: Shi Lei <shi_lei(a)massclouds.com>
---
src/conf/domain_conf.c | 140 ++++++---------------------------------
src/conf/domain_conf.h | 21 +++---
src/qemu/qemu_command.c | 2 +
src/qemu/qemu_driver.c | 2 +
src/qemu/qemu_hotplug.c | 1 +
src/qemu/qemu_process.c | 4 ++
src/qemu/qemu_validate.c | 1 +
src/vmx/vmx.c | 1 +
8 files changed, 42 insertions(+), 130 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 60bea6f..61dc7b3 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -843,6 +843,7 @@ VIR_ENUM_IMPL(virDomainInputModel,
VIR_ENUM_IMPL(virDomainGraphics,
VIR_DOMAIN_GRAPHICS_TYPE_LAST,
+ "none",
"sdl",
"vnc",
"rdp",
@@ -1824,6 +1825,7 @@ void virDomainGraphicsDefFree(virDomainGraphicsDefPtr def)
VIR_FREE(def->data.egl_headless.rendernode);
break;
+ case VIR_DOMAIN_GRAPHICS_TYPE_NONE:
case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
break;
}
@@ -14185,47 +14187,6 @@ virDomainGraphicsListenDefParseXMLHook(xmlNodePtr node
G_GNUC_UNUSED,
}
-static int
-virDomainGraphicsListensParseXML(virDomainGraphicsDefPtr def,
- xmlNodePtr node,
- xmlXPathContextPtr ctxt,
- unsigned int flags)
-{
- int nListens;
- int ret = -1;
- g_autofree xmlNodePtr *listenNodes = NULL;
- VIR_XPATH_NODE_AUTORESTORE(ctxt);
-
- ctxt->node = node;
-
- /* parse the <listen> subelements for graphics types that support it */
- nListens = virXPathNodeSet("./listen", ctxt, &listenNodes);
- if (nListens < 0)
- goto cleanup;
-
- if (nListens > 0) {
- size_t i;
-
- if (VIR_ALLOC_N(def->listens, nListens) < 0)
- goto cleanup;
-
- for (i = 0; i < nListens; i++) {
- virDomainGraphicsListenDefPtr listen = &def->listens[i];
- if (virDomainGraphicsListenDefParseXML(listenNodes[i],
- listen, NULL,
- def, &flags) < 0)
- goto cleanup;
-
- def->nListens++;
- }
- }
-
- ret = 0;
- cleanup:
- return ret;
-}
-
-
int
virDomainGraphicsVNCDefParseXMLHook(xmlNodePtr node G_GNUC_UNUSED,
virDomainGraphicsVNCDefPtr def,
@@ -14368,7 +14329,7 @@ virDomainNetDefNew(virDomainXMLOptionPtr xmlopt)
}
-static int
+int
virDomainGraphicsDefParseXMLHook(xmlNodePtr node,
virDomainGraphicsDefPtr def,
const char *instname G_GNUC_UNUSED,
@@ -14464,78 +14425,6 @@ virDomainGraphicsDefParseXMLHook(xmlNodePtr node,
}
-/* Parse the XML definition for a graphics device */
-static virDomainGraphicsDefPtr
-virDomainGraphicsDefParseXML(virDomainXMLOptionPtr xmlopt,
- xmlNodePtr node,
- xmlXPathContextPtr ctxt,
- unsigned int flags)
-{
- virDomainGraphicsDefPtr def;
- int typeVal;
- g_autofree char *type = NULL;
-
- if (!(def = virDomainGraphicsDefNew(xmlopt)))
- return NULL;
-
- type = virXMLPropString(node, "type");
- if (!type) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- "%s", _("missing graphics device type"));
- goto error;
- }
-
- if ((typeVal = virDomainGraphicsTypeFromString(type)) < 0) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
- _("unknown graphics device type '%s'"), type);
- goto error;
- }
- def->type = typeVal;
-
- if (virDomainGraphicsListensParseXML(def, node, ctxt, flags) < 0)
- goto error;
-
- switch (def->type) {
- case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
- if (virDomainGraphicsVNCDefParseXML(node, &def->data.vnc, NULL, def,
&flags) < 0)
- goto error;
- break;
- case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
- if (virDomainGraphicsSDLDefParseXML(node, &def->data.sdl, NULL, def, NULL)
< 0)
- goto error;
- break;
- case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
- if (virDomainGraphicsRDPDefParseXML(node, &def->data.rdp, NULL, def,
&flags) < 0)
- goto error;
- break;
- case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
- if (virDomainGraphicsDesktopDefParseXML(node, &def->data.desktop, NULL,
def, NULL) < 0)
- goto error;
- break;
- case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
- if (virDomainGraphicsSpiceDefParseXML(node, &def->data.spice, NULL, def,
&flags) < 0)
- goto error;
- break;
- case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
- if (virDomainGraphicsEGLHeadlessDefParseXML(node, &def->data.egl_headless,
NULL, def, NULL) < 0)
- goto error;
- break;
- case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
- break;
- }
-
- if (virDomainGraphicsDefParseXMLHook(node, def, NULL, NULL, &flags) < 0)
- goto error;
-
- return def;
-
- error:
- virDomainGraphicsDefFree(def);
- def = NULL;
- return NULL;
-}
-
-
static virDomainSoundCodecDefPtr
virDomainSoundCodecDefParseXML(xmlNodePtr node)
{
@@ -16714,9 +16603,14 @@ virDomainDeviceDefParse(const char *xmlStr,
return NULL;
break;
case VIR_DOMAIN_DEVICE_GRAPHICS:
- if (!(dev->data.graphics = virDomainGraphicsDefParseXML(xmlopt, node,
- ctxt, flags)))
+ if (!(dev->data.graphics = virDomainGraphicsDefNew(xmlopt)))
return NULL;
+ if (virDomainGraphicsDefParseXML(node, dev->data.graphics, NULL,
+ dev, &flags) < 0) {
+ virDomainGraphicsDefFree(dev->data.graphics);
+ dev->data.graphics = NULL;
+ return NULL;
+ }
break;
case VIR_DOMAIN_DEVICE_HUB:
if (!(dev->data.hub = virDomainHubDefParseXML(xmlopt, node, flags)))
@@ -21572,13 +21466,16 @@ virDomainDefParseXML(xmlDocPtr xml,
if (n && VIR_ALLOC_N(def->graphics, n) < 0)
goto error;
for (i = 0; i < n; i++) {
- virDomainGraphicsDefPtr graphics = virDomainGraphicsDefParseXML(xmlopt,
- nodes[i],
- ctxt,
- flags);
+ virDomainGraphicsDefPtr graphics = virDomainGraphicsDefNew(xmlopt);
if (!graphics)
goto error;
+ if (virDomainGraphicsDefParseXML(nodes[i], graphics, NULL,
+ def, &flags) < 0) {
+ virDomainGraphicsDefFree(graphics);
+ goto error;
+ }
+
def->graphics[def->ngraphics++] = graphics;
}
VIR_FREE(nodes);
@@ -27934,6 +27831,7 @@ virDomainGraphicsDefFormat(virBufferPtr buf,
return -1;
break;
+ case VIR_DOMAIN_GRAPHICS_TYPE_NONE:
case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
break;
}
@@ -32343,6 +32241,7 @@ virDomainGraphicsDefHasOpenGL(const virDomainDef *def)
case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
return true;
+ case VIR_DOMAIN_GRAPHICS_TYPE_NONE:
case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
break;
}
@@ -32381,6 +32280,7 @@ virDomainGraphicsGetRenderNode(const virDomainGraphicsDef
*graphics)
case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
+ case VIR_DOMAIN_GRAPHICS_TYPE_NONE:
case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
break;
}
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index d78cdbb..b6d69fa 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1545,6 +1545,7 @@ struct _virDomainVideoDef {
/* graphics console modes */
typedef enum {
+ VIR_DOMAIN_GRAPHICS_TYPE_NONE = 0,
VIR_DOMAIN_GRAPHICS_TYPE_SDL,
VIR_DOMAIN_GRAPHICS_TYPE_VNC,
VIR_DOMAIN_GRAPHICS_TYPE_RDP,
@@ -1750,7 +1751,7 @@ struct _virDomainGraphicsEGLHeadlessDef { /* genparse,
genformat:separate */
char *rendernode; /* xmlattr:gl/rendernode */
};
-struct _virDomainGraphicsDef {
+struct _virDomainGraphicsDef { /* genparse:concisehook */
virObjectPtr privateData;
/* Port value discipline:
@@ -1758,20 +1759,20 @@ struct _virDomainGraphicsDef {
* Value 0 means port wasn't specified in XML at all.
* Positive value is actual port number given in XML.
*/
- virDomainGraphicsType type;
+ virDomainGraphicsType type; /* xmlattr */
union {
- virDomainGraphicsSDLDef sdl;
- virDomainGraphicsVNCDef vnc;
- virDomainGraphicsRDPDef rdp;
- virDomainGraphicsDesktopDef desktop;
- virDomainGraphicsSpiceDef spice;
- virDomainGraphicsEGLHeadlessDef egl_headless;
- } data;
+ virDomainGraphicsSDLDef sdl; /* xmlgroup */
+ virDomainGraphicsVNCDef vnc; /* xmlgroup */
+ virDomainGraphicsRDPDef rdp; /* xmlgroup */
+ virDomainGraphicsDesktopDef desktop; /* xmlgroup */
+ virDomainGraphicsSpiceDef spice; /* xmlgroup */
+ virDomainGraphicsEGLHeadlessDef egl_headless; /* xmlgroup */
+ } data; /* xmlswitch:type */
/* nListens, listens, and *port are only useful if type is vnc,
* rdp, or spice. They've been extracted from the union only to
* simplify parsing code.*/
size_t nListens;
- virDomainGraphicsListenDefPtr listens;
+ virDomainGraphicsListenDefPtr listens; /* xmlelem, array:nListens */
};
typedef enum {
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index f60f1e8..272be28 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -7938,6 +7938,7 @@ qemuBuildGraphicsCommandLine(virQEMUDriverConfigPtr cfg,
case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
return -1;
+ case VIR_DOMAIN_GRAPHICS_TYPE_NONE:
case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
default:
virReportEnumRangeError(virDomainGraphicsType, graphics->type);
@@ -9772,6 +9773,7 @@ qemuBuildCommandLineValidate(virQEMUDriverPtr driver,
break;
case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
+ case VIR_DOMAIN_GRAPHICS_TYPE_NONE:
case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
break;
}
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 0d06812..922b9bb 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -15681,6 +15681,7 @@ qemuDomainOpenGraphics(virDomainPtr dom,
_("Can only open VNC or SPICE graphics backends, not
%s"),
virDomainGraphicsTypeToString(vm->def->graphics[idx]->type));
goto endjob;
+ case VIR_DOMAIN_GRAPHICS_TYPE_NONE:
case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
default:
virReportEnumRangeError(virDomainGraphicsType,
@@ -15750,6 +15751,7 @@ qemuDomainOpenGraphicsFD(virDomainPtr dom,
_("Can only open VNC or SPICE graphics backends, not
%s"),
virDomainGraphicsTypeToString(vm->def->graphics[idx]->type));
goto cleanup;
+ case VIR_DOMAIN_GRAPHICS_TYPE_NONE:
case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
default:
virReportEnumRangeError(virDomainGraphicsType,
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 0588745..d008035 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -4191,6 +4191,7 @@ qemuDomainChangeGraphics(virQEMUDriverPtr driver,
virReportError(VIR_ERR_INTERNAL_ERROR,
_("unable to change config on '%s' graphics
type"), type);
break;
+ case VIR_DOMAIN_GRAPHICS_TYPE_NONE:
case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
default:
virReportEnumRangeError(virDomainGraphicsType, dev->type);
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index db1b47e..c20988f 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -4687,6 +4687,7 @@ qemuProcessGraphicsReservePorts(virDomainGraphicsDefPtr graphics,
case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
+ case VIR_DOMAIN_GRAPHICS_TYPE_NONE:
case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
break;
}
@@ -4726,6 +4727,7 @@ qemuProcessGraphicsAllocatePorts(virQEMUDriverPtr driver,
case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
+ case VIR_DOMAIN_GRAPHICS_TYPE_NONE:
case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
break;
}
@@ -4882,6 +4884,7 @@ qemuProcessGraphicsSetupListen(virQEMUDriverPtr driver,
case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
+ case VIR_DOMAIN_GRAPHICS_TYPE_NONE:
case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
break;
}
@@ -5188,6 +5191,7 @@ qemuProcessStartValidateGraphics(virDomainObjPtr vm)
case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
+ case VIR_DOMAIN_GRAPHICS_TYPE_NONE:
case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
break;
}
diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
index 167cdc2..1d7a492 100644
--- a/src/qemu/qemu_validate.c
+++ b/src/qemu/qemu_validate.c
@@ -3416,6 +3416,7 @@ qemuValidateDomainDeviceDefGraphics(const virDomainGraphicsDef
*graphics,
_("unsupported graphics type '%s'"),
virDomainGraphicsTypeToString(graphics->type));
return -1;
+ case VIR_DOMAIN_GRAPHICS_TYPE_NONE:
case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
default:
return -1;
diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c
index 4b1b04c..cfc88aa 100644
--- a/src/vmx/vmx.c
+++ b/src/vmx/vmx.c
@@ -3314,6 +3314,7 @@ virVMXFormatConfig(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt,
virDomainDe
virDomainGraphicsTypeToString(def->graphics[i]->type));
goto cleanup;
+ case VIR_DOMAIN_GRAPHICS_TYPE_NONE:
case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
default:
virReportEnumRangeError(virDomainGraphicsType,
def->graphics[i]->type);
--
2.25.1