Chris' recent patch removed use of the virStringList for the LVM discovery, but it was still used in the NFS discovery code. I figured we might as well make NFS discovery use virStoragePoolSourceList() too. This require a few changes: - Include pool type in virStoragePoolSourceList so XML formatter knows what type of source information is available - Factor out code to format a single virStoragePoolSourcePtr object into a virStoragePoolSourceFormat method - Make virStoragePoolDefFormat & virStoragePoolListFormat both call this common method - Make LVM discovery code set the pool type in source list - Switch NFS discovery to use virStoragePoolSourceList This also has benfit of giving proper indentation in the XML # ./virsh find-storage-pool-sources-as logical <sources> <source> <device path='/dev/sda2'/> <name>HostVG</name> <format type='lvm2'/> </source> </sources> # ./virsh find-storage-pool-sources-as --host aubergine.redhat.com netfs <sources> <source> <host name='aubergine.redhat.com'/> <dir path='/mnt/export'/> <format type='nfs'/> </source> <source> <host name='aubergine.redhat.com'/> <dir path='/home'/> <format type='nfs'/> </source> </sources> 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 :| -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list