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

Re: [libvirt] PATCH: 1/11: Remove use of virStringList



This patch updates the storage drivers to make full use of virStorageSourceList
and thus removes the now uneeded virStringList code. No change since last time,
just re-diffed for new CVS.

 internal.h                |   12 ---
 libvirt.c                 |   40 ------------
 storage_backend_fs.c      |   46 +++++++-------
 storage_backend_logical.c |    3 
 storage_conf.c            |  150 +++++++++++++++++++++++++++-------------------
 storage_conf.h            |    1 
 6 files changed, 120 insertions(+), 132 deletions(-)

Daniel

diff -r 32908ef883dc src/internal.h
--- a/src/internal.h	Wed Oct 29 11:26:37 2008 +0000
+++ b/src/internal.h	Wed Oct 29 11:29:16 2008 +0000
@@ -371,18 +371,6 @@
 int __virDomainMigratePerform (virDomainPtr domain, const char *cookie, int cookielen, const char *uri, unsigned long flags, const char *dname, unsigned long bandwidth);
 virDomainPtr __virDomainMigrateFinish (virConnectPtr dconn, const char *dname, const char *cookie, int cookielen, const char *uri, unsigned long flags);
 
-typedef struct _virStringList virStringList;
-
-struct _virStringList {
-    char *val;
-    int len;
-    struct _virStringList *next;
-};
-
-char *__virStringListJoin(const virStringList *list, const char *pre,
-                        const char *post, const char *sep);
-void __virStringListFree(virStringList *list);
-
 /**
  * Domain Event Notification
  */
diff -r 32908ef883dc src/libvirt.c
--- a/src/libvirt.c	Wed Oct 29 11:26:37 2008 +0000
+++ b/src/libvirt.c	Wed Oct 29 11:29:16 2008 +0000
@@ -5305,46 +5305,6 @@
 
 
 
-
-/* Not for public use.  Combines the elements of a virStringList
- * into a single string.
- */
-char *__virStringListJoin(const virStringList *list, const char *pre,
-                        const char *post, const char *sep)
-{
-    size_t pre_len = strlen(pre);
-    size_t sep_len = strlen(sep);
-    size_t len = pre_len + strlen(post);
-    const virStringList *p;
-    char *retval;
-
-    for (p = list; p; p = p->next)
-        len += p->len + sep_len;
-    if (VIR_ALLOC_N(retval, len+1) < 0)
-        return NULL;
-    strcpy(retval, pre);
-    len = pre_len;
-    for (p = list; p; p = p->next) {
-        strcpy(retval + len, p->val);
-        len += p->len;
-        strcpy(retval + len, sep);
-        len += sep_len;
-    }
-    strcpy(retval + len, post);
-
-    return retval;
-}
-
-
-void __virStringListFree(virStringList *list)
-{
-    while (list) {
-        virStringList *p = list->next;
-        VIR_FREE(list);
-        list = p;
-    }
-}
-
 /*
  * Domain Event Notification
  */
diff -r 32908ef883dc src/storage_backend_fs.c
--- a/src/storage_backend_fs.c	Wed Oct 29 11:26:37 2008 +0000
+++ b/src/storage_backend_fs.c	Wed Oct 29 11:29:16 2008 +0000
@@ -295,7 +295,7 @@
 #if WITH_STORAGE_FS
 struct _virNetfsDiscoverState {
     const char *host;
-    virStringList *list;
+    virStoragePoolSourceList list;
 };
 
 typedef struct _virNetfsDiscoverState virNetfsDiscoverState;
@@ -307,8 +307,8 @@
                                                   void *data)
 {
     virNetfsDiscoverState *state = data;
-    virStringList *newItem;
     const char *name, *path;
+    virStoragePoolSource *src;
 
     path = groups[0];
 
@@ -325,24 +325,17 @@
         return -1;
     }
 
-    /* Append new XML desc to list */
-
-    if (VIR_ALLOC(newItem) != 0) {
-        virStorageReportError(conn, VIR_ERR_NO_MEMORY, "%s", _("new xml desc"));
+    if (VIR_REALLOC_N(state->list.sources, state->list.nsources+1) < 0) {
+        virStorageReportError(conn, VIR_ERR_NO_MEMORY, NULL);
         return -1;
     }
+    memset(state->list.sources + state->list.nsources, 0, sizeof(*state->list.sources));
 
-    if (asprintf(&newItem->val,
-                 "<source><host name='%s'/><dir path='%s'/></source>",
-                 state->host, path) <= 0) {
-        virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR, "%s", _("asprintf failed"));
-        VIR_FREE(newItem);
+    src = state->list.sources + state->list.nsources++;
+    if (!(src->host.name = strdup(state->host)) ||
+        !(src->dir = strdup(path)))
         return -1;
-    }
-
-    newItem->len = strlen(newItem->val);
-    newItem->next = state->list;
-    state->list = newItem;
+    src->format = VIR_STORAGE_POOL_NETFS_NFS;
 
     return 0;
 }
@@ -368,10 +361,18 @@
     };
     xmlDocPtr doc = NULL;
     xmlXPathContextPtr xpath_ctxt = NULL;
-    virNetfsDiscoverState state = { .host = NULL, .list = NULL };
+    virNetfsDiscoverState state = {
+        .host = NULL,
+        .list = {
+            .type = VIR_STORAGE_POOL_NETFS,
+            .nsources = 0,
+            .sources = NULL
+        }
+    };
     const char *prog[] = { SHOWMOUNT, "--no-headers", "--exports", NULL, NULL };
     int exitstatus;
     char *retval = NULL;
+    unsigned int i;
 
     doc = xmlReadDoc((const xmlChar *)srcSpec, "srcSpec.xml", NULL,
                      XML_PARSE_NOENT | XML_PARSE_NONET |
@@ -400,18 +401,21 @@
                                       &state, &exitstatus) < 0)
         goto cleanup;
 
-    retval = __virStringListJoin(state.list, SOURCES_START_TAG,
-                                 SOURCES_END_TAG, "\n");
+    retval = virStoragePoolSourceListFormat(conn, &state.list);
     if (retval == NULL) {
         virStorageReportError(conn, VIR_ERR_NO_MEMORY, "%s", _("retval"));
         goto cleanup;
     }
 
  cleanup:
+    for (i = 0; i < state.list.nsources; i++)
+        virStoragePoolSourceFree(&state.list.sources[i]);
+
+    VIR_FREE(state.list.sources);
+    VIR_FREE(state.host);
+
     xmlFreeDoc(doc);
     xmlXPathFreeContext(xpath_ctxt);
-    VIR_FREE(state.host);
-    __virStringListFree(state.list);
 
     return retval;
 }
diff -r 32908ef883dc src/storage_backend_logical.c
--- a/src/storage_backend_logical.c	Wed Oct 29 11:26:37 2008 +0000
+++ b/src/storage_backend_logical.c	Wed Oct 29 11:29:16 2008 +0000
@@ -295,6 +295,7 @@
 
     dev = &thisSource->devices[thisSource->ndevice];
     thisSource->ndevice++;
+    thisSource->format = VIR_STORAGE_POOL_LOGICAL_LVM2;
 
     memset(dev, 0, sizeof(*dev));
     dev->path = pvname;
@@ -331,6 +332,8 @@
     int i;
 
     memset(&sourceList, 0, sizeof(sourceList));
+    sourceList.type = VIR_STORAGE_POOL_LOGICAL;
+
     if (virStorageBackendRunProgRegex(conn, NULL, prog, 1, regexes, vars,
                                       virStorageBackendLogicalFindPoolSourcesFunc,
                                       &sourceList, &exitstatus) < 0)
diff -r 32908ef883dc src/storage_conf.c
--- a/src/storage_conf.c	Wed Oct 29 11:26:37 2008 +0000
+++ b/src/storage_conf.c	Wed Oct 29 11:29:16 2008 +0000
@@ -472,6 +472,68 @@
     return NULL;
 }
 
+static int
+virStoragePoolSourceFormat(virConnectPtr conn,
+                           virBufferPtr buf,
+                           virStorageBackendPoolOptionsPtr options,
+                           virStoragePoolSourcePtr src)
+{
+    int i, j;
+
+    virBufferAddLit(buf,"  <source>\n");
+    if ((options->flags & VIR_STORAGE_BACKEND_POOL_SOURCE_HOST) &&
+        src->host.name)
+        virBufferVSprintf(buf,"    <host name='%s'/>\n", src->host.name);
+
+    if ((options->flags & VIR_STORAGE_BACKEND_POOL_SOURCE_DEVICE) &&
+        src->ndevice) {
+        for (i = 0 ; i < src->ndevice ; i++) {
+            if (src->devices[i].nfreeExtent) {
+                virBufferVSprintf(buf,"    <device path='%s'>\n",
+                                  src->devices[i].path);
+                for (j = 0 ; j < src->devices[i].nfreeExtent ; j++) {
+                    virBufferVSprintf(buf, "    <freeExtent start='%llu' end='%llu'/>\n",
+                                      src->devices[i].freeExtents[j].start,
+                                      src->devices[i].freeExtents[j].end);
+                }
+                virBufferAddLit(buf,"    </device>\n");
+            }
+            else
+                virBufferVSprintf(buf, "    <device path='%s'/>\n",
+                                  src->devices[i].path);
+        }
+    }
+    if ((options->flags & VIR_STORAGE_BACKEND_POOL_SOURCE_DIR) &&
+        src->dir)
+        virBufferVSprintf(buf,"    <dir path='%s'/>\n", src->dir);
+    if ((options->flags & VIR_STORAGE_BACKEND_POOL_SOURCE_ADAPTER) &&
+        src->adapter)
+        virBufferVSprintf(buf,"    <adapter name='%s'/>\n", src->adapter);
+    if ((options->flags & VIR_STORAGE_BACKEND_POOL_SOURCE_NAME) &&
+        src->name)
+        virBufferVSprintf(buf,"    <name>%s</name>\n", src->name);
+
+    if (options->formatToString) {
+        const char *format = (options->formatToString)(src->format);
+        if (!format) {
+            virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
+                                  _("unknown pool format number %d"),
+                                  src->format);
+            return -1;
+        }
+        virBufferVSprintf(buf,"    <format type='%s'/>\n", format);
+    }
+
+
+    if (src->authType == VIR_STORAGE_POOL_AUTH_CHAP)
+        virBufferVSprintf(buf,"    <auth type='chap' login='%s' passwd='%s'>\n",
+                          src->auth.chap.login,
+                          src->auth.chap.passwd);
+    virBufferAddLit(buf,"  </source>\n");
+
+    return 0;
+}
+
 
 char *
 virStoragePoolDefFormat(virConnectPtr conn,
@@ -480,7 +542,6 @@
     virBuffer buf = VIR_BUFFER_INITIALIZER;
     const char *type;
     char uuid[VIR_UUID_STRING_BUFLEN];
-    int i, j;
 
     options = virStorageBackendPoolOptionsForType(def->type);
     if (options == NULL)
@@ -505,56 +566,8 @@
     virBufferVSprintf(&buf,"  <available>%llu</available>\n",
                       def->available);
 
-    virBufferAddLit(&buf,"  <source>\n");
-    if ((options->flags & VIR_STORAGE_BACKEND_POOL_SOURCE_HOST) &&
-        def->source.host.name)
-        virBufferVSprintf(&buf,"    <host name='%s'/>\n", def->source.host.name);
-
-    if ((options->flags & VIR_STORAGE_BACKEND_POOL_SOURCE_DEVICE) &&
-        def->source.ndevice) {
-        for (i = 0 ; i < def->source.ndevice ; i++) {
-            if (def->source.devices[i].nfreeExtent) {
-                virBufferVSprintf(&buf,"    <device path='%s'>\n",
-                                  def->source.devices[i].path);
-                for (j = 0 ; j < def->source.devices[i].nfreeExtent ; j++) {
-                    virBufferVSprintf(&buf, "    <freeExtent start='%llu' end='%llu'/>\n",
-                                      def->source.devices[i].freeExtents[j].start,
-                                      def->source.devices[i].freeExtents[j].end);
-                }
-                virBufferAddLit(&buf,"    </device>\n");
-            }
-            else
-                virBufferVSprintf(&buf, "    <device path='%s'/>\n",
-                                  def->source.devices[i].path);
-        }
-    }
-    if ((options->flags & VIR_STORAGE_BACKEND_POOL_SOURCE_DIR) &&
-        def->source.dir)
-        virBufferVSprintf(&buf,"    <dir path='%s'/>\n", def->source.dir);
-    if ((options->flags & VIR_STORAGE_BACKEND_POOL_SOURCE_ADAPTER) &&
-        def->source.adapter)
-        virBufferVSprintf(&buf,"    <adapter name='%s'/>\n", def->source.adapter);
-    if ((options->flags & VIR_STORAGE_BACKEND_POOL_SOURCE_NAME) &&
-        def->source.name)
-        virBufferVSprintf(&buf,"    <name>%s</name>\n", def->source.name);
-
-    if (options->formatToString) {
-        const char *format = (options->formatToString)(def->source.format);
-        if (!format) {
-            virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
-                                  _("unknown pool format number %d"),
-                                  def->source.format);
-            goto cleanup;
-        }
-        virBufferVSprintf(&buf,"    <format type='%s'/>\n", format);
-    }
-
-
-    if (def->source.authType == VIR_STORAGE_POOL_AUTH_CHAP)
-        virBufferVSprintf(&buf,"    <auth type='chap' login='%s' passwd='%s'>\n",
-                          def->source.auth.chap.login,
-                          def->source.auth.chap.passwd);
-    virBufferAddLit(&buf,"  </source>\n");
+    if (virStoragePoolSourceFormat(conn, &buf, options, &def->source) < 0)
+        goto cleanup;
 
     virBufferAddLit(&buf,"  <target>\n");
 
@@ -1271,22 +1284,41 @@
     return 0;
 }
 
-char *virStoragePoolSourceListFormat(virConnectPtr conn ATTRIBUTE_UNUSED,
+char *virStoragePoolSourceListFormat(virConnectPtr conn,
                                      virStoragePoolSourceListPtr def)
 {
-    int i, j;
+    virStorageBackendPoolOptionsPtr options;
     virBuffer buf = VIR_BUFFER_INITIALIZER;
+    const char *type;
+    int i;
 
-    virBufferAddLit(&buf, "<sources>");
+    options = virStorageBackendPoolOptionsForType(def->type);
+    if (options == NULL)
+        return NULL;
+
+    type = virStorageBackendToString(def->type);
+    if (!type) {
+        virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR,
+                              "%s", _("unexpected pool type"));
+        goto cleanup;
+    }
+
+    virBufferAddLit(&buf, "<sources>\n");
 
     for (i = 0; i < def->nsources; i++) {
-        virBufferVSprintf(&buf, "<source><name>%s</name>", def->sources[i].name);
-        for (j = 0; j < def->sources[i].ndevice; j++)
-            virBufferVSprintf(&buf, "<device path='%s'/>", def->sources[i].devices[j].path);
-        virBufferAddLit(&buf, "</source>");
+        virStoragePoolSourceFormat(conn, &buf, options, &def->sources[i]);
     }
 
-    virBufferAddLit(&buf, "</sources>");
+    virBufferAddLit(&buf, "</sources>\n");
+
+    if (virBufferError(&buf))
+        goto no_memory;
 
     return virBufferContentAndReset(&buf);
+
+ no_memory:
+    virStorageReportError(conn, VIR_ERR_NO_MEMORY, NULL);
+ cleanup:
+    free(virBufferContentAndReset(&buf));
+    return NULL;
 }
diff -r 32908ef883dc src/storage_conf.h
--- a/src/storage_conf.h	Wed Oct 29 11:26:37 2008 +0000
+++ b/src/storage_conf.h	Wed Oct 29 11:29:16 2008 +0000
@@ -252,6 +252,7 @@
 typedef struct _virStoragePoolSourceList virStoragePoolSourceList;
 typedef virStoragePoolSourceList *virStoragePoolSourceListPtr;
 struct _virStoragePoolSourceList {
+    int type;
     unsigned int nsources;
     virStoragePoolSourcePtr sources;
 };

-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|


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