Re: [PATCH] Fixed URI parsing

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 02/24/2012 07:48 PM, Martin Kletzander wrote:
> Function xmlParseURI does not remove square brackets around IPv6
> address when parsing. One of the solutions is making wrappers around
> functions working with xmlURI*. This assures that uri->server will be
> always properly assigned and it doesn't have to be changed when used
> on some new place in the code.
> For this purpose, functions virParseURI and virSaveURI were
> added. These function are wrappers around xmlParseURI and xmlSaveUri
> respectively.
> Also there is one new syntax check function to prohibit these functions
> anywhere else.
>
> File changes:
>  - src/util/viruri.h        -- declaration
>  - src/util/viruri.c        -- definition
>  - src/libvirt_private.syms -- symbol export
>  - src/Makefile.am          -- added source and header files
>  - cfg.mk                   -- added sc_prohibit_xmlURI
>  - all others               -- ID name and include fixes
> ---
> v4:
>  - fixed NULL pointer dereference
>  - fixed minor typo
>  - copyright added to header
>
> v3:
>  - wrappers moved to new files
>  - syntax check added
>  - virAsprintf used instead of nasty memory mechanics
>
> v2:
>  - added virSaveURI for building back the original string
>
>  cfg.mk                     |    8 ++++
>  src/Makefile.am            |    3 +-
>  src/datatypes.h            |    2 +-
>  src/driver.h               |    2 +-
>  src/esx/esx_driver.c       |    5 +-
>  src/esx/esx_util.c         |    2 +-
>  src/esx/esx_util.h         |    4 +-
>  src/hyperv/hyperv_util.c   |    2 +-
>  src/hyperv/hyperv_util.h   |    5 +-
>  src/libvirt.c              |   10 ++--
>  src/libvirt_private.syms   |    5 ++
>  src/libxl/libxl_driver.c   |    3 +-
>  src/lxc/lxc_driver.c       |    3 +-
>  src/openvz/openvz_driver.c |    3 +-
>  src/qemu/qemu_driver.c     |    2 +-
>  src/qemu/qemu_migration.c  |    7 ++-
>  src/remote/remote_driver.c |    9 ++--
>  src/uml/uml_driver.c       |    3 +-
>  src/util/qparams.c         |    3 +-
>  src/util/viruri.c          |   93 ++++++++++++++++++++++++++++++++++++++++++++
>  src/util/viruri.h          |   22 ++++++++++
>  src/vbox/vbox_tmpl.c       |    3 +-
>  src/vmx/vmx.c              |    6 +-
>  src/xen/xen_driver.c       |    4 +-
>  src/xen/xen_hypervisor.h   |    3 +-
>  src/xen/xend_internal.c    |    4 +-
>  src/xen/xend_internal.h    |    2 +-
>  src/xenapi/xenapi_driver.c |    2 +-
>  src/xenapi/xenapi_utils.c  |    4 +-
>  src/xenapi/xenapi_utils.h  |    4 +-
>  30 files changed, 180 insertions(+), 48 deletions(-)
>  create mode 100644 src/util/viruri.c
>  create mode 100644 src/util/viruri.h
>
> diff --git a/cfg.mk b/cfg.mk
> index dcf44bb..9759d87 100644
> --- a/cfg.mk
> +++ b/cfg.mk
> @@ -457,6 +457,12 @@ sc_prohibit_xmlGetProp:
>  	halt='use virXMLPropString, not xmlGetProp'			\
>  	  $(_sc_search_regexp)
>
> +# xml(ParseURI|SaveUri) doesn't handle IPv6 URIs well
> +sc_prohibit_xmlURI:
> +	@prohibit='\<xml(ParseURI|SaveUri) *\('				\
> +	halt='use virURI(Parse|Format), not xml(ParseURI|SaveUri)'	\
> +	  $(_sc_search_regexp)
> +
>  # ATTRIBUTE_UNUSED should only be applied in implementations, not
>  # header declarations
>  sc_avoid_attribute_unused_in_header:
> @@ -758,6 +764,8 @@ exclude_file_name_regexp--sc_prohibit_strncpy = \
>
>  exclude_file_name_regexp--sc_prohibit_xmlGetProp = ^src/util/xml\.c$$
>
> +exclude_file_name_regexp--sc_prohibit_xmlURI = ^src/util/viruri\.c$$
> +
>  exclude_file_name_regexp--sc_require_config_h = ^examples/
>
>  exclude_file_name_regexp--sc_require_config_h_first = ^examples/
> diff --git a/src/Makefile.am b/src/Makefile.am
> index d5f52a0..e2542b1 100644
> --- a/src/Makefile.am
> +++ b/src/Makefile.am
> @@ -104,7 +104,8 @@ UTIL_SOURCES =							\
>  		util/virnetlink.c util/virnetlink.h		\
>  		util/virrandom.h util/virrandom.c		\
>  		util/virsocketaddr.h util/virsocketaddr.c \
> -		util/virtime.h util/virtime.c
> +		util/virtime.h util/virtime.c \
> +		util/viruri.h util/viruri.c
>
>  EXTRA_DIST += $(srcdir)/util/virkeymaps.h $(srcdir)/util/keymaps.csv \
>  		$(srcdir)/util/virkeycode-mapgen.py
> diff --git a/src/datatypes.h b/src/datatypes.h
> index 47058ed..fc284d2 100644
> --- a/src/datatypes.h
> +++ b/src/datatypes.h
> @@ -151,7 +151,7 @@ struct _virConnect {
>       */
>      unsigned int magic;     /* specific value to check */
>      unsigned int flags;     /* a set of connection flags */
> -    xmlURIPtr uri;          /* connection URI */
> +    virURIPtr uri;          /* connection URI */
>
>      /* The underlying hypervisor driver and network driver. */
>      virDriverPtr      driver;
> diff --git a/src/driver.h b/src/driver.h
> index d27fa99..b04b254 100644
> --- a/src/driver.h
> +++ b/src/driver.h
> @@ -9,9 +9,9 @@
>  # include "config.h"
>
>  # include <unistd.h>
> -# include <libxml/uri.h>
>
>  # include "internal.h"
> +# include "viruri.h"
>  /*
>   * List of registered drivers numbers
>   */
> diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
> index f5e1cc7..b6b22f8 100644
> --- a/src/esx/esx_driver.c
> +++ b/src/esx/esx_driver.c
> @@ -44,6 +44,7 @@
>  #include "esx_vi.h"
>  #include "esx_vi_methods.h"
>  #include "esx_util.h"
> +#include "viruri.h"
>
>  #define VIR_FROM_THIS VIR_FROM_ESX
>
> @@ -3945,7 +3946,7 @@ esxDomainMigratePerform(virDomainPtr domain,
>  {
>      int result = -1;
>      esxPrivate *priv = domain->conn->privateData;
> -    xmlURIPtr parsedUri = NULL;
> +    virURIPtr parsedUri = NULL;
>      char *saveptr;
>      char *path_resourcePool;
>      char *path_hostSystem;
> @@ -3976,7 +3977,7 @@ esxDomainMigratePerform(virDomainPtr domain,
>      }
>
>      /* Parse migration URI */
> -    parsedUri = xmlParseURI(uri);
> +    parsedUri = virURIParse(uri);
>
>      if (parsedUri == NULL) {
>          virReportOOMError();
> diff --git a/src/esx/esx_util.c b/src/esx/esx_util.c
> index 2c5ac1a..7d4b908 100644
> --- a/src/esx/esx_util.c
> +++ b/src/esx/esx_util.c
> @@ -42,7 +42,7 @@
>
>
>  int
> -esxUtil_ParseUri(esxUtil_ParsedUri **parsedUri, xmlURIPtr uri)
> +esxUtil_ParseUri(esxUtil_ParsedUri **parsedUri, virURIPtr uri)
>  {
>      int result = -1;
>      struct qparam_set *queryParamSet = NULL;
> diff --git a/src/esx/esx_util.h b/src/esx/esx_util.h
> index 2bee510..a69b3f4 100644
> --- a/src/esx/esx_util.h
> +++ b/src/esx/esx_util.h
> @@ -22,9 +22,9 @@
>  #ifndef __ESX_UTIL_H__
>  # define __ESX_UTIL_H__
>
> -# include <libxml/uri.h>
>  # include <netdb.h>
>  # include "internal.h"
> +# include "viruri.h"
>
>  typedef struct _esxUtil_ParsedUri esxUtil_ParsedUri;
>
> @@ -40,7 +40,7 @@ struct _esxUtil_ParsedUri {
>      char *path;
>  };
>
> -int esxUtil_ParseUri(esxUtil_ParsedUri **parsedUri, xmlURIPtr uri);
> +int esxUtil_ParseUri(esxUtil_ParsedUri **parsedUri, virURIPtr uri);
>
>  void esxUtil_FreeParsedUri(esxUtil_ParsedUri **parsedUri);
>
> diff --git a/src/hyperv/hyperv_util.c b/src/hyperv/hyperv_util.c
> index 298cfe0..2e6a2d4 100644
> --- a/src/hyperv/hyperv_util.c
> +++ b/src/hyperv/hyperv_util.c
> @@ -37,7 +37,7 @@
>
>
>  int
> -hypervParseUri(hypervParsedUri **parsedUri, xmlURIPtr uri)
> +hypervParseUri(hypervParsedUri **parsedUri, virURIPtr uri)
>  {
>      int result = -1;
>      struct qparam_set *queryParamSet = NULL;
> diff --git a/src/hyperv/hyperv_util.h b/src/hyperv/hyperv_util.h
> index 9057f55..d9d1c84 100644
> --- a/src/hyperv/hyperv_util.h
> +++ b/src/hyperv/hyperv_util.h
> @@ -23,9 +23,8 @@
>  #ifndef __HYPERV_UTIL_H__
>  # define __HYPERV_UTIL_H__
>
> -# include <libxml/uri.h>
> -
>  # include "internal.h"
> +# include "viruri.h"
>
>  typedef struct _hypervParsedUri hypervParsedUri;
>
> @@ -33,7 +32,7 @@ struct _hypervParsedUri {
>      char *transport;
>  };
>
> -int hypervParseUri(hypervParsedUri **parsedUri, xmlURIPtr uri);
> +int hypervParseUri(hypervParsedUri **parsedUri, virURIPtr uri);
>
>  void hypervFreeParsedUri(hypervParsedUri **parsedUri);
>
> diff --git a/src/libvirt.c b/src/libvirt.c
> index 6294196..3eca512 100644
> --- a/src/libvirt.c
> +++ b/src/libvirt.c
> @@ -23,7 +23,6 @@
>
>  #include <libxml/parser.h>
>  #include <libxml/xpath.h>
> -#include <libxml/uri.h>
>  #include "getpass.h"
>
>  #ifdef HAVE_WINSOCK2_H
> @@ -44,6 +43,7 @@
>  #include "command.h"
>  #include "virnodesuspend.h"
>  #include "virrandom.h"
> +#include "viruri.h"
>
>  #ifndef WITH_DRIVER_MODULES
>  # ifdef WITH_TEST
> @@ -1127,7 +1127,7 @@ do_open (const char *name,
>              virConnectOpenResolveURIAlias(name, &alias) < 0)
>              goto failed;
>
> -        ret->uri = xmlParseURI (alias ? alias : name);
> +        ret->uri = virURIParse (alias ? alias : name);
>          if (!ret->uri) {
>              virLibConnError(VIR_ERR_INVALID_ARG,
>                              _("could not parse connection URI %s"),
> @@ -1729,7 +1729,7 @@ virConnectGetURI (virConnectPtr conn)
>          return NULL;
>      }
>
> -    name = (char *)xmlSaveUri(conn->uri);
> +    name = (char *)virURIFormat(conn->uri);
>      if (!name) {
>          virReportOOMError();
>          goto error;
> @@ -4952,7 +4952,7 @@ virDomainMigratePeer2Peer (virDomainPtr domain,
>                             const char *uri,
>                             unsigned long bandwidth)
>  {
> -    xmlURIPtr tempuri = NULL;
> +    virURIPtr tempuri = NULL;
>      VIR_DOMAIN_DEBUG(domain, "xmlin=%s, flags=%lx, dname=%s, "
>                       "dconnuri=%s, uri=%s, bandwidth=%lu",
>                       NULLSTR(xmlin), flags, NULLSTR(dname),
> @@ -4964,7 +4964,7 @@ virDomainMigratePeer2Peer (virDomainPtr domain,
>          return -1;
>      }
>
> -    tempuri = xmlParseURI(dconnuri);
> +    tempuri = virURIParse(dconnuri);
>      if (!tempuri) {
>          virLibConnError(VIR_ERR_INVALID_ARG, __FUNCTION__);
>          virDispatchError(domain->conn);
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 9e3573f..047231f 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -1430,6 +1430,11 @@ virTypedParameterArrayValidate;
>  virTypedParameterAssign;
>
>
> +# viruri.h
> +virURIFormat;
> +virURIParse;
> +
> +
>  # xml.h
>  virXMLChildElementCount;
>  virXMLParseHelper;
> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
> index 6cfc5eb..6db33c2 100644
> --- a/src/libxl/libxl_driver.c
> +++ b/src/libxl/libxl_driver.c
> @@ -44,6 +44,7 @@
>  #include "libxl_conf.h"
>  #include "xen_xm.h"
>  #include "virtypedparam.h"
> +#include "viruri.h"
>
>  #define VIR_FROM_THIS VIR_FROM_LIBXL
>
> @@ -1043,7 +1044,7 @@ libxlOpen(virConnectPtr conn,
>          if (libxl_driver == NULL)
>              return VIR_DRV_OPEN_DECLINED;
>
> -        conn->uri = xmlParseURI("xen:///");
> +        conn->uri = virURIParse("xen:///");
>          if (!conn->uri) {
>              virReportOOMError();
>              return VIR_DRV_OPEN_ERROR;
> diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
> index b6962cf7..d77afcc 100644
> --- a/src/lxc/lxc_driver.c
> +++ b/src/lxc/lxc_driver.c
> @@ -60,6 +60,7 @@
>  #include "virnodesuspend.h"
>  #include "virtime.h"
>  #include "virtypedparam.h"
> +#include "viruri.h"
>
>  #define VIR_FROM_THIS VIR_FROM_LXC
>
> @@ -139,7 +140,7 @@ static virDrvOpenStatus lxcOpen(virConnectPtr conn,
>          if (lxc_driver == NULL)
>              return VIR_DRV_OPEN_DECLINED;
>
> -        conn->uri = xmlParseURI("lxc:///");
> +        conn->uri = virURIParse("lxc:///");
>          if (!conn->uri) {
>              virReportOOMError();
>              return VIR_DRV_OPEN_ERROR;
> diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
> index 833a98d..aef1491 100644
> --- a/src/openvz/openvz_driver.c
> +++ b/src/openvz/openvz_driver.c
> @@ -56,6 +56,7 @@
>  #include "virfile.h"
>  #include "logging.h"
>  #include "command.h"
> +#include "viruri.h"
>
>  #define VIR_FROM_THIS VIR_FROM_OPENVZ
>
> @@ -1335,7 +1336,7 @@ static virDrvOpenStatus openvzOpen(virConnectPtr conn,
>          if (access("/proc/vz", W_OK) < 0)
>              return VIR_DRV_OPEN_DECLINED;
>
> -        conn->uri = xmlParseURI("openvz:///system");
> +        conn->uri = virURIParse("openvz:///system");
>          if (conn->uri == NULL) {
>              virReportOOMError();
>              return VIR_DRV_OPEN_ERROR;
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 717bdf1..c5c7afc 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -857,7 +857,7 @@ static virDrvOpenStatus qemudOpen(virConnectPtr conn,
>          if (qemu_driver == NULL)
>              return VIR_DRV_OPEN_DECLINED;
>
> -        conn->uri = xmlParseURI(qemu_driver->privileged ?
> +        conn->uri = virURIParse(qemu_driver->privileged ?
>                                  "qemu:///system" :
>                                  "qemu:///session");
>          if (!conn->uri) {
> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index f0af494..cf64981 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
> @@ -45,6 +45,7 @@
>  #include "virtime.h"
>  #include "locking/domain_lock.h"
>  #include "rpc/virnetsocket.h"
> +#include "viruri.h"
>
>
>  #define VIR_FROM_THIS VIR_FROM_QEMU
> @@ -1759,7 +1760,7 @@ static int doNativeMigrate(struct qemud_driver *driver,
>                             virConnectPtr dconn)
>  {
>      qemuDomainObjPrivatePtr priv = vm->privateData;
> -    xmlURIPtr uribits = NULL;
> +    virURIPtr uribits = NULL;
>      int ret = -1;
>      qemuMigrationSpec spec;
>
> @@ -1775,10 +1776,10 @@ static int doNativeMigrate(struct qemud_driver *driver,
>              virReportOOMError();
>              return -1;
>          }
> -        uribits = xmlParseURI(tmp);
> +        uribits = virURIParse(tmp);
>          VIR_FREE(tmp);
>      } else {
> -        uribits = xmlParseURI(uri);
> +        uribits = virURIParse(uri);
>      }
>      if (!uribits) {
>          qemuReportError(VIR_ERR_INTERNAL_ERROR,
> diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
> index 2dacb70..8fb46e1 100644
> --- a/src/remote/remote_driver.c
> +++ b/src/remote/remote_driver.c
> @@ -26,8 +26,6 @@
>  #include <unistd.h>
>  #include <assert.h>
>
> -#include <libxml/uri.h>
> -
>  #include "virnetclient.h"
>  #include "virnetclientprogram.h"
>  #include "virnetclientstream.h"
> @@ -47,6 +45,7 @@
>  #include "command.h"
>  #include "intprops.h"
>  #include "virtypedparam.h"
> +#include "viruri.h"
>
>  #define VIR_FROM_THIS VIR_FROM_REMOTE
>
> @@ -488,7 +487,7 @@ doRemoteOpen (virConnectPtr conn,
>                  /* Allow remote serve to probe */
>                  name = strdup("");
>              } else {
> -                xmlURI tmpuri = {
> +                virURI tmpuri = {
>                      .scheme = conn->uri->scheme,
>  #ifdef HAVE_XMLURI_QUERY_RAW
>                      .query_raw = qparam_get_query (vars),
> @@ -505,7 +504,7 @@ doRemoteOpen (virConnectPtr conn,
>                      transport_str[-1] = '\0';
>                  }
>
> -                name = (char *) xmlSaveUri (&tmpuri);
> +                name = (char *) virURIFormat (&tmpuri);
>
>  #ifdef HAVE_XMLURI_QUERY_RAW
>                  VIR_FREE(tmpuri.query_raw);
> @@ -719,7 +718,7 @@ doRemoteOpen (virConnectPtr conn,
>              goto failed;
>
>          VIR_DEBUG("Auto-probed URI is %s", uriret.uri);
> -        conn->uri = xmlParseURI(uriret.uri);
> +        conn->uri = virURIParse(uriret.uri);
>          VIR_FREE(uriret.uri);
>          if (!conn->uri) {
>              virReportOOMError();
> diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c
> index a4cf945..cbb2c0e 100644
> --- a/src/uml/uml_driver.c
> +++ b/src/uml/uml_driver.c
> @@ -63,6 +63,7 @@
>  #include "configmake.h"
>  #include "virnetdevtap.h"
>  #include "virnodesuspend.h"
> +#include "viruri.h"
>
>  #define VIR_FROM_THIS VIR_FROM_UML
>
> @@ -1138,7 +1139,7 @@ static virDrvOpenStatus umlOpen(virConnectPtr conn,
>          if (uml_driver == NULL)
>              return VIR_DRV_OPEN_DECLINED;
>
> -        conn->uri = xmlParseURI(uml_driver->privileged ?
> +        conn->uri = virURIParse(uml_driver->privileged ?
>                                  "uml:///system" :
>                                  "uml:///session");
>          if (!conn->uri) {
> diff --git a/src/util/qparams.c b/src/util/qparams.c
> index f6d0713..83b568e 100644
> --- a/src/util/qparams.c
> +++ b/src/util/qparams.c
> @@ -26,12 +26,11 @@
>  #include <stdlib.h>
>  #include <stdarg.h>
>
> -#include <libxml/uri.h>
> -
>  #include "virterror_internal.h"
>  #include "buf.h"
>  #include "memory.h"
>  #include "qparams.h"
> +#include "viruri.h"
>
>  #define VIR_FROM_THIS VIR_FROM_NONE
>
> diff --git a/src/util/viruri.c b/src/util/viruri.c
> new file mode 100644
> index 0000000..0cbfc5a
> --- /dev/null
> +++ b/src/util/viruri.c
> @@ -0,0 +1,93 @@
> +/*
> + * viruri.c: URI parsing wrappers for libxml2 functions
> + *
> + * Copyright (C) 2012 Red Hat, Inc.
> + *
> + * See COPYING.LIB for the License of this software
> + */
> +
> +#include <config.h>
> +
> +#include "viruri.h"
> +
> +#include "memory.h"
> +#include "util.h"
> +
> +/**
> + * virURIParse:
> + * @uri: URI to parse
> + *
> + * Wrapper for xmlParseURI
> + *
> + * Unfortunately there are few things that should be managed after
> + * parsing the URI. Fortunately there is only one thing now and its
> + * removing of square brackets around IPv6 addresses.
> + *
> + * @returns the parsed uri object with some fixes
> + */
> +xmlURIPtr
> +virURIParse(const char *uri)
> +{
> +    xmlURIPtr ret = xmlParseURI(uri);
> +
> +    /* First check: does it even make sense to jump inside */
> +    if (ret != NULL &&
> +        ret->server != NULL &&
> +        ret->server[0] == '[') {
> +        size_t length = strlen(ret->server);
> +
> +        /* We want to modify the server string only if there are
> +         * square brackets on both ends and inside there is IPv6
> +         * address. Otherwise we could make a mistake by modifying
> +         * something other than an IPv6 address. */
> +        if (ret->server[length - 1] == ']' && strchr(ret->server, ':')) {
> +            memmove(&ret->server[0], &ret->server[1], length - 2);
> +            ret->server[length - 2] = '\0';
> +        }
> +        /* Even after such modification, it is completely ok to free
> +         * the uri with xmlFreeURI() */
> +    }
> +
> +    return ret;
> +}
> +
> +/**
> + * virURIFormat:
> + * @uri: URI to format
> + *
> + * Wrapper for xmlSaveUri
> + *
> + * This function constructs back everything that @ref virURIParse
> + * changes after parsing
> + *
> + * @returns the constructed uri as a string
> + */
> +unsigned char *
> +virURIFormat(xmlURIPtr uri)
> +{
> +    char *backupserver = NULL;
> +    char *tmpserver = NULL;
> +    unsigned char *ret;
> +
> +    /* First check: does it make sense to do anything */
> +    if (uri != NULL &&
> +        uri->server != NULL &&
> +        strchr(uri->server, ':') != NULL) {
> +
> +        backupserver = uri->server;
> +        if (virAsprintf(&tmpserver, "[%s]", uri->server) < 0)
> +            return NULL;
> +
> +        uri->server = tmpserver;
> +    }
> +
> +    ret = xmlSaveUri(uri);
> +
> +    /* Put the fixed version back */
> +    if (tmpserver) {
> +        uri->server = backupserver;
> +        VIR_FREE(tmpserver);
> +    }
> +
> +    return ret;
> +}
> diff --git a/src/util/viruri.h b/src/util/viruri.h
> new file mode 100644
> index 0000000..b2b0ca8
> --- /dev/null
> +++ b/src/util/viruri.h
> @@ -0,0 +1,22 @@
> +/*
> + * viruri.h: internal definitions used for URI parsing.
> + *
> + * Copyright (C) 2012 Red Hat, Inc.
> + *
> + * See COPYING.LIB for the License of this software
> + */
> +
> +#ifndef __VIR_URI_H__
> +# define __VIR_URI_H__
> +
> +# include <libxml/uri.h>
> +
> +# include "internal.h"
> +
> +typedef xmlURI    virURI;
> +typedef xmlURIPtr virURIPtr;
> +
> +virURIPtr        virURIParse(const char *uri);
> +unsigned char *  virURIFormat(virURIPtr uri);
> +
> +#endif /* __VIR_URI_H__ */
> diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
> index b168c7d..a39b567 100644
> --- a/src/vbox/vbox_tmpl.c
> +++ b/src/vbox/vbox_tmpl.c
> @@ -56,6 +56,7 @@
>  #include "configmake.h"
>  #include "virfile.h"
>  #include "fdstream.h"
> +#include "viruri.h"
>
>  /* This one changes from version to version. */
>  #if VBOX_API_VERSION == 2002
> @@ -980,7 +981,7 @@ static virDrvOpenStatus vboxOpen(virConnectPtr conn,
>      virCheckFlags(VIR_CONNECT_RO, VIR_DRV_OPEN_ERROR);
>
>      if (conn->uri == NULL) {
> -        conn->uri = xmlParseURI(uid ? "vbox:///session" : "vbox:///system");
> +        conn->uri = virURIParse(uid ? "vbox:///session" : "vbox:///system");
>          if (conn->uri == NULL) {
>              virReportOOMError();
>              return VIR_DRV_OPEN_ERROR;
> diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c
> index 823d5df..9c83de4 100644
> --- a/src/vmx/vmx.c
> +++ b/src/vmx/vmx.c
> @@ -24,7 +24,6 @@
>  #include <config.h>
>
>  #include <c-ctype.h>
> -#include <libxml/uri.h>
>
>  #include "internal.h"
>  #include "virterror_internal.h"
> @@ -33,6 +32,7 @@
>  #include "logging.h"
>  #include "uuid.h"
>  #include "vmx.h"
> +#include "viruri.h"
>
>  /*
>
> @@ -2518,7 +2518,7 @@ virVMXParseSerial(virVMXContext *ctx, virConfPtr conf, int port,
>      char network_endPoint_name[48] = "";
>      char *network_endPoint = NULL;
>
> -    xmlURIPtr parsedUri = NULL;
> +    virURIPtr parsedUri = NULL;
>
>      if (def == NULL || *def != NULL) {
>          VMX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid argument"));
> @@ -2608,7 +2608,7 @@ virVMXParseSerial(virVMXContext *ctx, virConfPtr conf, int port,
>          (*def)->target.port = port;
>          (*def)->source.type = VIR_DOMAIN_CHR_TYPE_TCP;
>
> -        parsedUri = xmlParseURI(fileName);
> +        parsedUri = virURIParse(fileName);
>
>          if (parsedUri == NULL) {
>              virReportOOMError();
> diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
> index 635f468..19ce7da 100644
> --- a/src/xen/xen_driver.c
> +++ b/src/xen/xen_driver.c
> @@ -26,7 +26,6 @@
>  #include <sys/types.h>
>  #include <fcntl.h>
>  #include <xen/dom0_ops.h>
> -#include <libxml/uri.h>
>
>  #include "virterror_internal.h"
>  #include "logging.h"
> @@ -50,6 +49,7 @@
>  #include "uuid.h"
>  #include "fdstream.h"
>  #include "virfile.h"
> +#include "viruri.h"
>  #include "command.h"
>  #include "virnodesuspend.h"
>
> @@ -270,7 +270,7 @@ xenUnifiedOpen (virConnectPtr conn, virConnectAuthPtr auth, unsigned int flags)
>          if (!xenUnifiedProbe())
>              return VIR_DRV_OPEN_DECLINED;
>
> -        conn->uri = xmlParseURI("xen:///");
> +        conn->uri = virURIParse("xen:///");
>          if (!conn->uri) {
>              virReportOOMError();
>              return VIR_DRV_OPEN_ERROR;
> diff --git a/src/xen/xen_hypervisor.h b/src/xen/xen_hypervisor.h
> index 77c6f74..55a99f1 100644
> --- a/src/xen/xen_hypervisor.h
> +++ b/src/xen/xen_hypervisor.h
> @@ -11,11 +11,10 @@
>  #ifndef __VIR_XEN_INTERNAL_H__
>  # define __VIR_XEN_INTERNAL_H__
>
> -# include <libxml/uri.h>
> -
>  # include "internal.h"
>  # include "capabilities.h"
>  # include "driver.h"
> +# include "viruri.h"
>
>  /* See xenHypervisorInit() for details. */
>  struct xenHypervisorVersions {
> diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
> index 5c3838f..83bfac0 100644
> --- a/src/xen/xend_internal.c
> +++ b/src/xen/xend_internal.c
> @@ -27,7 +27,6 @@
>  #include <netinet/tcp.h>
>  #include <arpa/inet.h>
>  #include <netdb.h>
> -#include <libxml/uri.h>
>  #include <errno.h>
>
>  #include "virterror_internal.h"
> @@ -46,6 +45,7 @@
>  #include "memory.h"
>  #include "count-one-bits.h"
>  #include "virfile.h"
> +#include "viruri.h"
>
>  /* required for cpumap_t */
>  #include <xen/dom0_ops.h>
> @@ -3224,7 +3224,7 @@ xenDaemonDomainMigratePerform (virDomainPtr domain,
>       * "hostname", "hostname:port" or "xenmigr://hostname[:port]/".
>       */
>      if (strstr (uri, "//")) {   /* Full URI. */
> -        xmlURIPtr uriptr = xmlParseURI (uri);
> +        virURIPtr uriptr = virURIParse (uri);
>          if (!uriptr) {
>              virXendError(VIR_ERR_INVALID_ARG,
>                            "%s", _("xenDaemonDomainMigrate: invalid URI"));
> diff --git a/src/xen/xend_internal.h b/src/xen/xend_internal.h
> index eee67b5..3f0b63d 100644
> --- a/src/xen/xend_internal.h
> +++ b/src/xen/xend_internal.h
> @@ -18,13 +18,13 @@
>
>  # include <sys/types.h>
>  # include <stdint.h>
> -# include <libxml/uri.h>
>
>  # include "internal.h"
>  # include "capabilities.h"
>  # include "domain_conf.h"
>  # include "driver.h"
>  # include "buf.h"
> +# include "viruri.h"
>
>  int
>  xenDaemonOpen_unix(virConnectPtr conn, const char *path);
> diff --git a/src/xenapi/xenapi_driver.c b/src/xenapi/xenapi_driver.c
> index f877f67..94644ae 100644
> --- a/src/xenapi/xenapi_driver.c
> +++ b/src/xenapi/xenapi_driver.c
> @@ -25,7 +25,6 @@
>  #include <limits.h>
>  #include <stdint.h>
>  #include <string.h>
> -#include <libxml/uri.h>
>  #include <curl/curl.h>
>  #include <xen/api/xen_all.h>
>  #include "internal.h"
> @@ -37,6 +36,7 @@
>  #include "uuid.h"
>  #include "memory.h"
>  #include "buf.h"
> +#include "viruri.h"
>  #include "xenapi_driver.h"
>  #include "xenapi_driver_private.h"
>  #include "xenapi_utils.h"
> diff --git a/src/xenapi/xenapi_utils.c b/src/xenapi/xenapi_utils.c
> index ddc7736..943b6c0 100644
> --- a/src/xenapi/xenapi_utils.c
> +++ b/src/xenapi/xenapi_utils.c
> @@ -25,7 +25,6 @@
>  #include <stdio.h>
>  #include <string.h>
>  #include <stdint.h>
> -#include <libxml/uri.h>
>  #include <xen/api/xen_all.h>
>  #include "internal.h"
>  #include "domain_conf.h"
> @@ -37,6 +36,7 @@
>  #include "buf.h"
>  #include "logging.h"
>  #include "qparams.h"
> +#include "viruri.h"
>  #include "xenapi_driver_private.h"
>  #include "xenapi_utils.h"
>
> @@ -94,7 +94,7 @@ xenapiUtil_RequestPassword(virConnectAuthPtr auth, const char *username,
>  }
>
>  int
> -xenapiUtil_ParseQuery(virConnectPtr conn, xmlURIPtr uri, int *noVerify)
> +xenapiUtil_ParseQuery(virConnectPtr conn, virURIPtr uri, int *noVerify)
>  {
>      int result = 0;
>      int i;
> diff --git a/src/xenapi/xenapi_utils.h b/src/xenapi/xenapi_utils.h
> index 40506d5..aa1ff74 100644
> --- a/src/xenapi/xenapi_utils.h
> +++ b/src/xenapi/xenapi_utils.h
> @@ -23,9 +23,9 @@
>  # define __VIR_XENAPI_UTILS__
>
>  # include <stdint.h>
> -# include <libxml/uri.h>
>  # include <xen/api/xen_all.h>
>  # include "internal.h"
> +# include "viruri.h"
>  # include "domain_conf.h"
>
>  # define NETWORK_DEVID_SIZE  (12)
> @@ -40,7 +40,7 @@ xenapiUtil_RequestPassword(virConnectAuthPtr auth, const char *username,
>                             const char *hostname);
>
>  int
> -xenapiUtil_ParseQuery(virConnectPtr conn, xmlURIPtr uri, int *noVerify);
> +xenapiUtil_ParseQuery(virConnectPtr conn, virURIPtr uri, int *noVerify);
>
>  enum xen_on_normal_exit
>  actionShutdownLibvirt2XenapiEnum(enum virDomainLifecycleAction action);
> --
> 1.7.3.4
>
> --
> libvir-list mailing list
> libvir-list@xxxxxxxxxx
> https://www.redhat.com/mailman/listinfo/libvir-list

I don't know whether my ACK would count however I've learned a lot
(together with Martin) when helping out with this patch and cfg.mk
studies and similar ;-) I will be pretty useful for the future (if I
have time for writing libvirt patches among the patchwork work). Also,
it may be pretty nice to document those things like the cfg.mk file and
others somewhere in the HACKING file and document the scenario when it's
appropriate to put functions in here, i.e. when the syntax-check should
prohibit usage of some function (like xml* functions should be
substituted by virURI* functions in this case and so on).

Michal

-- 
Michal Novotny <minovotn@xxxxxxxxxx>, RHCE, Red Hat
Virtualization | libvirt-php bindings | php-virt-control.org

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list


[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]