[libvirt] [PATCH v2 02/12] domain_conf: parse listen attribute while parsing listen elements
Marc-André Lureau
marcandre.lureau at gmail.com
Wed May 11 18:12:59 UTC 2016
Hi
On Wed, May 11, 2016 at 5:08 PM, Pavel Hrdina <phrdina at redhat.com> wrote:
> Move the compatibility code out of virDomainGraphicsListensParseXML()
> into virDomainGraphicsListenDefParseXML(). This also fixes a small
> inconsistency between the code and error message itself.
>
> Before this patch we would search first listen element that is
> type='address' to validate listen and address attributes. After this
> patch we always take the first listen element regardless of the type.
>
> This shouldn't break anything since all drivers supports only one
> listen.
>
> Signed-off-by: Pavel Hrdina <phrdina at redhat.com>
> ---
> src/conf/domain_conf.c | 85 ++++++++++++++++++++++++++++++--------------------
> 1 file changed, 51 insertions(+), 34 deletions(-)
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index df2258a..45d2789 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -10640,18 +10640,36 @@ virDomainGraphicsAuthDefParseXML(xmlNodePtr node,
> return 0;
> }
>
> +
> +/**
> + * virDomainGraphicsListenDefParseXML:
> + * @def: listen def pointer to be filled
> + * @node: xml node of <listen/> element
> + * @parent: xml node of <graphics/> element
> + * @flags: bit-wise or of VIR_DOMAIN_DEF_PARSE_*
> + *
> + * Parses current <listen/> element from @node to @def. For backward
> + * compatibility the @parent element should contain node of <graphics/> element
> + * for the first <listen/> element in order to validate attributes from both
> + * elements.
> + */
> static int
> virDomainGraphicsListenDefParseXML(virDomainGraphicsListenDefPtr def,
> xmlNodePtr node,
> + xmlNodePtr parent,
> unsigned int flags)
> {
> int ret = -1;
> - char *type = virXMLPropString(node, "type");
> - char *address = virXMLPropString(node, "address");
> - char *network = virXMLPropString(node, "network");
> + char *type = virXMLPropString(node, "type");
> + char *address = virXMLPropString(node, "address");
> + char *network = virXMLPropString(node, "network");
code-style change only
> char *fromConfig = virXMLPropString(node, "fromConfig");
> + char *addressCompat = NULL;
> int tmp, typeVal;
>
> + if (parent)
> + addressCompat = virXMLPropString(parent, "listen");
> +
> if (!type) {
> virReportError(VIR_ERR_XML_ERROR, "%s",
> _("graphics listen type must be specified"));
> @@ -10665,9 +10683,21 @@ virDomainGraphicsListenDefParseXML(virDomainGraphicsListenDefPtr def,
> }
> def->type = typeVal;
>
> - /* address is recognized if either type='address', or if
> - * type='network' and we're looking at live XML (i.e. *not*
> - * inactive). It is otherwise ignored. */
> + if (def->type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS) {
> + if (address && addressCompat && STRNEQ(address, addressCompat)) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("graphics 'listen' attribute '%s' must match "
> + "'address' attribute of first listen element "
> + "(found '%s')"), addressCompat, address);
> + goto error;
> + }
> +
> + if (!address) {
> + address = addressCompat;
> + addressCompat = NULL;
> + }
> + }
> +
> if (address && address[0] &&
> (def->type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS ||
> (def->type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NETWORK &&
> @@ -10707,6 +10737,7 @@ virDomainGraphicsListenDefParseXML(virDomainGraphicsListenDefPtr def,
> VIR_FREE(address);
> VIR_FREE(network);
> VIR_FREE(fromConfig);
> + VIR_FREE(addressCompat);
> return ret;
> }
>
> @@ -10719,8 +10750,7 @@ virDomainGraphicsListensParseXML(virDomainGraphicsDefPtr def,
> {
> xmlNodePtr *listenNodes = NULL;
> xmlNodePtr save = ctxt->node;
> - virDomainGraphicsListenDefPtr address = NULL;
> - char *listenAddr = NULL;
> + virDomainGraphicsListenDef newListen = {0};
> char *socketPath = NULL;
> int nListens;
> int ret = -1;
> @@ -10747,44 +10777,31 @@ virDomainGraphicsListensParseXML(virDomainGraphicsDefPtr def,
> for (i = 0; i < nListens; i++) {
> if (virDomainGraphicsListenDefParseXML(&def->listens[i],
> listenNodes[i],
> + i == 0 ? node : NULL,
> flags) < 0)
> goto error;
>
> - if (!address &&
> - def->listens[i].type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS)
> - address = &def->listens[i];
> -
> def->nListens++;
> }
> VIR_FREE(listenNodes);
> - }
> -
> - /* listen attribute of <graphics> is also supported by these,
> - * but must match the 'address' attribute of the first listen
> - * that is type='address' (if present) */
> - listenAddr = virXMLPropString(node, "listen");
> - if (STREQ_NULLABLE(listenAddr, ""))
> - VIR_FREE(listenAddr);
> + } else {
> + /* If no <listen/> element was found in XML for backward compatibility
> + * we should try to parse 'listen' attribute from <graphics/> element. */
> + newListen.type = VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS;
> + newListen.address = virXMLPropString(node, "listen");
> + if (STREQ_NULLABLE(newListen.address, ""))
> + VIR_FREE(newListen.address);
>
> - if (address && listenAddr &&
> - STRNEQ_NULLABLE(address->address, listenAddr)) {
> - virReportError(VIR_ERR_XML_ERROR,
> - _("graphics listen attribute %s must match address "
> - "attribute of first listen element (found %s)"),
> - listenAddr, address->address);
> - goto error;
> + if (newListen.address &&
> + VIR_APPEND_ELEMENT(def->listens, def->nListens, newListen) < 0)
> + goto error;
> }
>
> - /* There were no <listen> elements, so we can just
> - * directly set listenAddr as listens[0]->address */
> - if (listenAddr && def->nListens == 0 &&
> - virDomainGraphicsListenAppendAddress(def, listenAddr) < 0)
> - goto error;
> -
> ret = 0;
> error:
> + if (ret < 0)
> + virDomainGraphicsListenDefClear(&newListen);
> VIR_FREE(listenNodes);
> - VIR_FREE(listenAddr);
> VIR_FREE(socketPath);
> ctxt->node = save;
> return ret;
> --
> 2.8.2
>
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
Reviewed-by: Marc-André Lureau <marcandre.lureau at redhat.com>
--
Marc-André Lureau
More information about the libvir-list
mailing list