]> xenbits.xensource.com Git - libvirt.git/commitdiff
Use a libvirt custom struct for virURIPtr
authorDaniel P. Berrange <berrange@redhat.com>
Tue, 20 Mar 2012 13:33:41 +0000 (13:33 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Fri, 23 Mar 2012 12:59:22 +0000 (12:59 +0000)
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.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
src/esx/esx_util.c
src/hyperv/hyperv_util.c
src/libvirt.c
src/remote/remote_driver.c
src/util/viruri.c
src/util/viruri.h

index 7d4b9080e8245261bb2599e503e462b7a4902c09..67b07b730c8cb268ce60f5f98c2f57724b130cc5 100644 (file)
@@ -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;
index 2e6a2d4726b6471919c99f83e353913b9caaaaac..63c761b969029a8116abd7c3f14feb2e39c0023c 100644 (file)
@@ -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;
index 7aee13ec78cf48b65805eb877b54a7a59c6f39c6..586729d81ffdf5dc64d9d463efcaf97c46571b7d 100644 (file)
@@ -1172,15 +1172,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));
 
index c6c5809fccc0bb61ae91cc447b66341a7c245f20..9de966f8f2b37f739012a0cb2aed4d4f671f5eee 100644 (file)
@@ -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)
index bbd8742cb3d50c25757eacfed47ee362da0aaa4f..c5ff3291b9c199effdc236d4d9df8ecdcbd3a8f0 100644 (file)
 virURIPtr
 virURIParse(const char *uri)
 {
-    virURIPtr ret = xmlParseURI(uri);
+    xmlURIPtr xmluri;
+    virURIPtr ret = NULL;
 
-    if (!ret) {
+    xmluri = xmlParseURI(uri);
+
+    if (!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);
 
     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);
 }
index 5773ddadbb9a1bc1583890d6f151f9c3a3e740ec..dd270dea56f91748774d16c5b4c372a57b8adc82 100644 (file)
 
 # 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);