[libvirt] [PATCH 05/14] Use a libvirt custom struct for virURIPtr

Osier Yang jyang at redhat.com
Thu Mar 22 04:33:06 UTC 2012


On 2012年03月21日 01:33, Daniel P. Berrange wrote:
> From: "Daniel P. Berrange"<berrange at redhat.com>
>
> Instead of just typedef'ing the xmlURIPtr struct for virURIPtr,
> use a custom libvirt struct. This allows us to fix various
> problems with libxml2. This initially just fixes the query vs
> query_raw handling problems.
> ---
>   src/esx/esx_util.c         |    4 --
>   src/hyperv/hyperv_util.c   |    4 --
>   src/libvirt.c              |    5 +--
>   src/remote/remote_driver.c |   16 +--------
>   src/util/viruri.c          |   79 +++++++++++++++++++++++++++++++++++--------
>   src/util/viruri.h          |   14 +++++++-
>   6 files changed, 78 insertions(+), 44 deletions(-)
>
> diff --git a/src/esx/esx_util.c b/src/esx/esx_util.c
> index 7d4b908..67b07b7 100644
> --- a/src/esx/esx_util.c
> +++ b/src/esx/esx_util.c
> @@ -62,11 +62,7 @@ esxUtil_ParseUri(esxUtil_ParsedUri **parsedUri, virURIPtr uri)
>           return -1;
>       }
>
> -#ifdef HAVE_XMLURI_QUERY_RAW
> -    queryParamSet = qparam_query_parse(uri->query_raw);
> -#else
>       queryParamSet = qparam_query_parse(uri->query);
> -#endif
>
>       if (queryParamSet == NULL) {
>           goto cleanup;
> diff --git a/src/hyperv/hyperv_util.c b/src/hyperv/hyperv_util.c
> index 2e6a2d4..63c761b 100644
> --- a/src/hyperv/hyperv_util.c
> +++ b/src/hyperv/hyperv_util.c
> @@ -54,11 +54,7 @@ hypervParseUri(hypervParsedUri **parsedUri, virURIPtr uri)
>           return -1;
>       }
>
> -#ifdef HAVE_XMLURI_QUERY_RAW
> -    queryParamSet = qparam_query_parse(uri->query_raw);
> -#else
>       queryParamSet = qparam_query_parse(uri->query);
> -#endif
>
>       if (queryParamSet == NULL) {
>           goto cleanup;
> diff --git a/src/libvirt.c b/src/libvirt.c
> index f7590e0..fb7885f 100644
> --- a/src/libvirt.c
> +++ b/src/libvirt.c
> @@ -1173,15 +1173,12 @@ do_open (const char *name,
>
>           VIR_DEBUG("name \"%s\" to URI components:\n"
>                     "  scheme %s\n"
> -                  "  opaque %s\n"
> -                  "  authority %s\n"
>                     "  server %s\n"
>                     "  user %s\n"
>                     "  port %d\n"
>                     "  path %s\n",
>                     alias ? alias : name,
> -                  NULLSTR(ret->uri->scheme), NULLSTR(ret->uri->opaque),
> -                  NULLSTR(ret->uri->authority), NULLSTR(ret->uri->server),
> +                  NULLSTR(ret->uri->scheme), NULLSTR(ret->uri->server),
>                     NULLSTR(ret->uri->user), ret->uri->port,
>                     NULLSTR(ret->uri->path));
>
> diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
> index c6c5809..9de966f 100644
> --- a/src/remote/remote_driver.c
> +++ b/src/remote/remote_driver.c
> @@ -417,15 +417,9 @@ doRemoteOpen (virConnectPtr conn,
>        */
>       struct qparam *var;
>       int i;
> -    char *query;
>
>       if (conn->uri) {
> -#ifdef HAVE_XMLURI_QUERY_RAW
> -        query = conn->uri->query_raw;
> -#else
> -        query = conn->uri->query;
> -#endif
> -        vars = qparam_query_parse (query);
> +        vars = qparam_query_parse (conn->uri->query);
>           if (vars == NULL) goto failed;
>
>           for (i = 0; i<  vars->n; i++) {
> @@ -490,11 +484,7 @@ doRemoteOpen (virConnectPtr conn,
>               } else {
>                   virURI tmpuri = {
>                       .scheme = conn->uri->scheme,
> -#ifdef HAVE_XMLURI_QUERY_RAW
> -                    .query_raw = qparam_get_query (vars),
> -#else
>                       .query = qparam_get_query (vars),
> -#endif
>                       .path = conn->uri->path,
>                       .fragment = conn->uri->fragment,
>                   };
> @@ -507,11 +497,7 @@ doRemoteOpen (virConnectPtr conn,
>
>                   name = virURIFormat(&tmpuri);
>
> -#ifdef HAVE_XMLURI_QUERY_RAW
> -                VIR_FREE(tmpuri.query_raw);
> -#else
>                   VIR_FREE(tmpuri.query);
> -#endif
>
>                   /* Restore transport scheme */
>                   if (transport_str)
> diff --git a/src/util/viruri.c b/src/util/viruri.c
> index bbd8742..d8618d1 100644
> --- a/src/util/viruri.c
> +++ b/src/util/viruri.c
> @@ -36,15 +36,45 @@
>   virURIPtr
>   virURIParse(const char *uri)
>   {
> -    virURIPtr ret = xmlParseURI(uri);
> +    xmlURIPtr xmluri;
> +    virURIPtr ret = NULL;
>
> -    if (!ret) {
> +    xmluri = xmlParseURI(uri);
> +
> +    if (!uri) {

s/uri/xmluri/

>           /* libxml2 does not tell us what failed. Grr :-( */
>           virURIReportError(VIR_ERR_INTERNAL_ERROR,
>                             "Unable to parse URI %s", uri);
>           return NULL;
>       }
>
> +    if (VIR_ALLOC(ret)<  0)
> +        goto no_memory;
> +
> +    if (xmluri->scheme&&
> +        !(ret->scheme = strdup(xmluri->scheme)))
> +        goto no_memory;
> +    if (xmluri->server&&
> +        !(ret->server = strdup(xmluri->server)))
> +        goto no_memory;
> +    ret->port = xmluri->port;
> +    if (xmluri->path&&
> +        !(ret->path = strdup(xmluri->path)))
> +        goto no_memory;
> +#ifdef HAVE_XMLURI_QUERY_RAW
> +    if (xmluri->query_raw&&
> +        !(ret->query = strdup(xmluri->query_raw)))
> +        goto no_memory;
> +#else
> +    if (xmluri->query&&
> +        !(ret->query = strdup(xmluri->query)))
> +        goto no_memory;
> +#endif
> +    if (xmluri->fragment&&
> +        !(ret->fragment = strdup(xmluri->fragment)))
> +        goto no_memory;
> +
> +
>       /* First check: does it even make sense to jump inside */
>       if (ret->server != NULL&&
>           ret->server[0] == '[') {
> @@ -62,7 +92,15 @@ virURIParse(const char *uri)
>            * the uri with xmlFreeURI() */
>       }
>
> +    xmlFreeURI(xmluri);
> +
>       return ret;
> +
> +no_memory:
> +    virReportOOMError();
> +    xmlFreeURI(xmluri);
> +    virURIFree(ret);
> +    return NULL;
>   }
>
>   /**
> @@ -79,33 +117,37 @@ virURIParse(const char *uri)
>   char *
>   virURIFormat(virURIPtr uri)
>   {
> -    char *backupserver = NULL;
> +    xmlURI xmluri;
>       char *tmpserver = NULL;
>       char *ret;
>
> +    memset(&xmluri, 0, sizeof(xmluri));
> +
> +    xmluri.scheme = uri->scheme;
> +    xmluri.server = uri->server;
> +    xmluri.port = uri->port;
> +    xmluri.path = uri->path;
> +    xmluri.query = uri->query;
> +    xmluri.fragment = uri->fragment;
> +
>       /* First check: does it make sense to do anything */
> -    if (uri->server != NULL&&
> -        strchr(uri->server, ':') != NULL) {
> +    if (xmluri.server != NULL&&
> +        strchr(xmluri.server, ':') != NULL) {
>
> -        backupserver = uri->server;
> -        if (virAsprintf(&tmpserver, "[%s]", uri->server)<  0)
> +        if (virAsprintf(&tmpserver, "[%s]", xmluri.server)<  0)
>               return NULL;
>
> -        uri->server = tmpserver;
> +        xmluri.server = tmpserver;
>       }
>
> -    ret = (char *) xmlSaveUri(uri);
> +    ret = (char *)xmlSaveUri(&xmluri);
>       if (!ret) {
>           virReportOOMError();
>           goto cleanup;
>       }
>
>   cleanup:
> -    /* Put the fixed version back */
> -    if (tmpserver) {
> -        uri->server = backupserver;
> -        VIR_FREE(tmpserver);
> -    }
> +    VIR_FREE(tmpserver);

No use of "cleanup" yet.

>
>       return ret;
>   }
> @@ -119,5 +161,12 @@ cleanup:
>    */
>   void virURIFree(virURIPtr uri)
>   {
> -    xmlFreeURI(uri);
> +    if (!uri)
> +        return;
> +
> +    VIR_FREE(uri->scheme);
> +    VIR_FREE(uri->server);
> +    VIR_FREE(uri->path);
> +    VIR_FREE(uri->query);
> +    VIR_FREE(uri);
>   }
> diff --git a/src/util/viruri.h b/src/util/viruri.h
> index 5773dda..dd270de 100644
> --- a/src/util/viruri.h
> +++ b/src/util/viruri.h
> @@ -13,8 +13,18 @@
>
>   # include "internal.h"
>
> -typedef xmlURI    virURI;
> -typedef xmlURIPtr virURIPtr;
> +typedef struct _virURI virURI;
> +typedef virURI *virURIPtr;
> +
> +struct _virURI {
> +    char *scheme;       /* the URI scheme */
> +    char *server;       /* the server part */
> +    char *user;         /* the user part */
> +    int port;           /* the port number */
> +    char *path;         /* the path string */
> +    char *query;        /* the query string */
> +    char *fragment;     /* the fragment string */
> +};
>
>   virURIPtr virURIParse(const char *uri)
>       ATTRIBUTE_NONNULL(1);

ACK with s/uri/xmluri/




More information about the libvir-list mailing list