From cbb1dd0a9be352243e1742ecaa190da7edac097a Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 4 Nov 2008 21:54:21 +0000 Subject: [PATCH] Remove use of virStringList in favour of strongly typed APIs --- ChangeLog | 14 ++++ src/internal.h | 12 --- src/libvirt.c | 40 --------- src/storage_backend_fs.c | 46 +++++----- src/storage_backend_logical.c | 3 + src/storage_conf.c | 152 ++++++++++++++++++++-------------- src/storage_conf.h | 1 + 7 files changed, 135 insertions(+), 133 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2731bd5ce0..d41cf33358 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +Tue Nov 4 21:50:31 UTC 2008 Daniel P. Berrange + + Remove use of virStringList + * src/internal.h, src/libvirt.c: Remove virStringList code + * src/storage_backend_fs.c: Replace use of virStringList + with virStoragePoolSourceList + * src/storage_backend_logical.c: Set format to LVM2 and + source type to LOGICAL + * src/storage_conf.c: Refactor pool source XML formating + into virStoragePoolSourceFormat and make both users call + the common code + * src/storage_conf.h: Include pool source type in + virStoragePoolSourceList struct + Tue Nov 4 14:58:31 CET 2008 Jim Meyering don't print an uninitialized integer in a diagnostic diff --git a/src/internal.h b/src/internal.h index 7ea15860ba..5682a2df07 100644 --- a/src/internal.h +++ b/src/internal.h @@ -371,18 +371,6 @@ int __virDomainMigratePrepare (virConnectPtr dconn, char **cookie, int *cookiele 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 --git a/src/libvirt.c b/src/libvirt.c index 9365032c11..ea9d901d7e 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -5305,46 +5305,6 @@ virStorageVolGetPath(virStorageVolPtr vol) - -/* 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 --git a/src/storage_backend_fs.c b/src/storage_backend_fs.c index 2ea9f93bdb..65ec5297ae 100644 --- a/src/storage_backend_fs.c +++ b/src/storage_backend_fs.c @@ -295,7 +295,7 @@ static int virStorageBackendProbeFile(virConnectPtr conn, #if WITH_STORAGE_FS struct _virNetfsDiscoverState { const char *host; - virStringList *list; + virStoragePoolSourceList list; }; typedef struct _virNetfsDiscoverState virNetfsDiscoverState; @@ -307,8 +307,8 @@ virStorageBackendFileSystemNetFindPoolSourcesFunc(virConnectPtr conn ATTRIBUTE_U void *data) { virNetfsDiscoverState *state = data; - virStringList *newItem; const char *name, *path; + virStoragePoolSource *src; path = groups[0]; @@ -325,24 +325,17 @@ virStorageBackendFileSystemNetFindPoolSourcesFunc(virConnectPtr conn ATTRIBUTE_U 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, - "", - 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 @@ virStorageBackendFileSystemNetFindPoolSources(virConnectPtr conn, }; 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 @@ virStorageBackendFileSystemNetFindPoolSources(virConnectPtr conn, &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 --git a/src/storage_backend_logical.c b/src/storage_backend_logical.c index a3fcf139bd..589a3a418f 100644 --- a/src/storage_backend_logical.c +++ b/src/storage_backend_logical.c @@ -295,6 +295,7 @@ virStorageBackendLogicalFindPoolSourcesFunc(virConnectPtr conn, 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 @@ virStorageBackendLogicalFindPoolSources(virConnectPtr conn, 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 --git a/src/storage_conf.c b/src/storage_conf.c index 5b95695d9d..033d678df7 100644 --- a/src/storage_conf.c +++ b/src/storage_conf.c @@ -472,6 +472,68 @@ virStoragePoolDefParse(virConnectPtr conn, return NULL; } +static int +virStoragePoolSourceFormat(virConnectPtr conn, + virBufferPtr buf, + virStorageBackendPoolOptionsPtr options, + virStoragePoolSourcePtr src) +{ + int i, j; + + virBufferAddLit(buf," \n"); + if ((options->flags & VIR_STORAGE_BACKEND_POOL_SOURCE_HOST) && + src->host.name) + virBufferVSprintf(buf," \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," \n", + src->devices[i].path); + for (j = 0 ; j < src->devices[i].nfreeExtent ; j++) { + virBufferVSprintf(buf, " \n", + src->devices[i].freeExtents[j].start, + src->devices[i].freeExtents[j].end); + } + virBufferAddLit(buf," \n"); + } + else + virBufferVSprintf(buf, " \n", + src->devices[i].path); + } + } + if ((options->flags & VIR_STORAGE_BACKEND_POOL_SOURCE_DIR) && + src->dir) + virBufferVSprintf(buf," \n", src->dir); + if ((options->flags & VIR_STORAGE_BACKEND_POOL_SOURCE_ADAPTER) && + src->adapter) + virBufferVSprintf(buf," \n", src->adapter); + if ((options->flags & VIR_STORAGE_BACKEND_POOL_SOURCE_NAME) && + src->name) + virBufferVSprintf(buf," %s\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," \n", format); + } + + + if (src->authType == VIR_STORAGE_POOL_AUTH_CHAP) + virBufferVSprintf(buf," \n", + src->auth.chap.login, + src->auth.chap.passwd); + virBufferAddLit(buf," \n"); + + return 0; +} + char * virStoragePoolDefFormat(virConnectPtr conn, @@ -480,7 +542,6 @@ virStoragePoolDefFormat(virConnectPtr conn, 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 @@ virStoragePoolDefFormat(virConnectPtr conn, virBufferVSprintf(&buf," %llu\n", def->available); - virBufferAddLit(&buf," \n"); - if ((options->flags & VIR_STORAGE_BACKEND_POOL_SOURCE_HOST) && - def->source.host.name) - virBufferVSprintf(&buf," \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," \n", - def->source.devices[i].path); - for (j = 0 ; j < def->source.devices[i].nfreeExtent ; j++) { - virBufferVSprintf(&buf, " \n", - def->source.devices[i].freeExtents[j].start, - def->source.devices[i].freeExtents[j].end); - } - virBufferAddLit(&buf," \n"); - } - else - virBufferVSprintf(&buf, " \n", - def->source.devices[i].path); - } - } - if ((options->flags & VIR_STORAGE_BACKEND_POOL_SOURCE_DIR) && - def->source.dir) - virBufferVSprintf(&buf," \n", def->source.dir); - if ((options->flags & VIR_STORAGE_BACKEND_POOL_SOURCE_ADAPTER) && - def->source.adapter) - virBufferVSprintf(&buf," \n", def->source.adapter); - if ((options->flags & VIR_STORAGE_BACKEND_POOL_SOURCE_NAME) && - def->source.name) - virBufferVSprintf(&buf," %s\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," \n", format); - } - - - if (def->source.authType == VIR_STORAGE_POOL_AUTH_CHAP) - virBufferVSprintf(&buf," \n", - def->source.auth.chap.login, - def->source.auth.chap.passwd); - virBufferAddLit(&buf," \n"); + if (virStoragePoolSourceFormat(conn, &buf, options, &def->source) < 0) + goto cleanup; virBufferAddLit(&buf," \n"); @@ -1271,22 +1284,41 @@ virStoragePoolObjDeleteDef(virConnectPtr conn, 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, ""); + options = virStorageBackendPoolOptionsForType(def->type); + if (options == NULL) + return NULL; - for (i = 0; i < def->nsources; i++) { - virBufferVSprintf(&buf, "%s", def->sources[i].name); - for (j = 0; j < def->sources[i].ndevice; j++) - virBufferVSprintf(&buf, "", def->sources[i].devices[j].path); - virBufferAddLit(&buf, ""); + type = virStorageBackendToString(def->type); + if (!type) { + virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR, + "%s", _("unexpected pool type")); + goto cleanup; } - virBufferAddLit(&buf, ""); + virBufferAddLit(&buf, "\n"); + + for (i = 0; i < def->nsources; i++) { + virStoragePoolSourceFormat(conn, &buf, options, &def->sources[i]); + } + + virBufferAddLit(&buf, "\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 --git a/src/storage_conf.h b/src/storage_conf.h index ef5e5d9b97..7eb04ad454 100644 --- a/src/storage_conf.h +++ b/src/storage_conf.h @@ -252,6 +252,7 @@ struct _virStorageDriverState { typedef struct _virStoragePoolSourceList virStoragePoolSourceList; typedef virStoragePoolSourceList *virStoragePoolSourceListPtr; struct _virStoragePoolSourceList { + int type; unsigned int nsources; virStoragePoolSourcePtr sources; };