From d61fff3f4b8d93ea95d5e217012cbd9e325a3304 Mon Sep 17 00:00:00 2001 From: Cole Robinson Date: Thu, 15 Oct 2009 11:58:35 -0400 Subject: [PATCH] storage: Add ParseSourceString function for use with FindPoolSources. This will simplify adding FindPoolSources support to more pool backends in the future (as well as the test driver). --- src/conf/storage_conf.c | 52 ++++++++++++++++++++++++++++++++ src/conf/storage_conf.h | 4 +++ src/libvirt_private.syms | 1 + src/storage/storage_backend_fs.c | 34 ++++++--------------- 4 files changed, 66 insertions(+), 25 deletions(-) diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c index 13056e8cac..2924a0d915 100644 --- a/src/conf/storage_conf.c +++ b/src/conf/storage_conf.c @@ -474,6 +474,58 @@ cleanup: return ret; } +virStoragePoolSourcePtr +virStoragePoolDefParseSourceString(virConnectPtr conn, + const char *srcSpec, + int pool_type) +{ + xmlDocPtr doc = NULL; + xmlNodePtr node = NULL; + xmlXPathContextPtr xpath_ctxt = NULL; + virStoragePoolSourcePtr def = NULL, ret = NULL; + + doc = xmlReadDoc((const xmlChar *)srcSpec, "srcSpec.xml", NULL, + XML_PARSE_NOENT | XML_PARSE_NONET | + XML_PARSE_NOERROR | XML_PARSE_NOWARNING); + + if (doc == NULL) { + virStorageReportError(conn, VIR_ERR_XML_ERROR, + "%s", _("bad spec")); + goto cleanup; + } + + xpath_ctxt = xmlXPathNewContext(doc); + if (xpath_ctxt == NULL) { + virReportOOMError(conn); + goto cleanup; + } + + if (VIR_ALLOC(def) < 0) { + virReportOOMError(conn); + goto cleanup; + } + + node = virXPathNode(conn, "/source", xpath_ctxt); + if (!node) { + virStorageReportError(conn, VIR_ERR_XML_ERROR, + "%s", _("root element was not source")); + goto cleanup; + } + + if (virStoragePoolDefParseSource(conn, xpath_ctxt, def, pool_type, + node) < 0) + goto cleanup; + + ret = def; + def = NULL; +cleanup: + if (def) + virStoragePoolSourceFree(def); + xmlFreeDoc(doc); + xmlXPathFreeContext(xpath_ctxt); + + return ret; +} static int virStorageDefParsePerms(virConnectPtr conn, xmlXPathContextPtr ctxt, diff --git a/src/conf/storage_conf.h b/src/conf/storage_conf.h index 652448a3bb..a79598105b 100644 --- a/src/conf/storage_conf.h +++ b/src/conf/storage_conf.h @@ -376,6 +376,10 @@ void virStoragePoolObjRemove(virStoragePoolObjListPtr pools, virStoragePoolObjPtr pool); virStoragePoolSourcePtr +virStoragePoolDefParseSourceString(virConnectPtr conn, + const char *srcSpec, + int pool_type); +virStoragePoolSourcePtr virStoragePoolSourceListNewSource(virConnectPtr conn, virStoragePoolSourceListPtr list); char *virStoragePoolSourceListFormat(virConnectPtr conn, diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 86974c3af2..9cc92f951e 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -380,6 +380,7 @@ virStoragePoolObjListFree; virStoragePoolObjRemove; virStoragePoolObjSaveDef; virStoragePoolSourceFree; +virStoragePoolDefParseSourceString; virStoragePoolSourceListNewSource; virStoragePoolSourceListFormat; virStorageVolDefFindByKey; diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c index 2b7f083452..16e4bd937d 100644 --- a/src/storage/storage_backend_fs.c +++ b/src/storage/storage_backend_fs.c @@ -199,8 +199,6 @@ virStorageBackendFileSystemNetFindPoolSources(virConnectPtr conn, int vars[] = { 1 }; - xmlDocPtr doc = NULL; - xmlXPathContextPtr xpath_ctxt = NULL; virNetfsDiscoverState state = { .host = NULL, .list = { @@ -210,31 +208,18 @@ virStorageBackendFileSystemNetFindPoolSources(virConnectPtr conn, } }; const char *prog[] = { SHOWMOUNT, "--no-headers", "--exports", NULL, NULL }; + virStoragePoolSourcePtr source = NULL; int exitstatus; char *retval = NULL; unsigned int i; - doc = xmlReadDoc((const xmlChar *)srcSpec, "srcSpec.xml", NULL, - XML_PARSE_NOENT | XML_PARSE_NONET | - XML_PARSE_NOERROR | XML_PARSE_NOWARNING); - if (doc == NULL) { - virStorageReportError(conn, VIR_ERR_XML_ERROR, "%s", _("bad spec")); + source = virStoragePoolDefParseSourceString(conn, srcSpec, + VIR_STORAGE_POOL_NETFS); + if (!source) goto cleanup; - } - xpath_ctxt = xmlXPathNewContext(doc); - if (xpath_ctxt == NULL) { - virReportOOMError(conn); - goto cleanup; - } - - state.host = virXPathString(conn, "string(/source/host/@name)", xpath_ctxt); - if (!state.host || !state.host[0]) { - virStorageReportError(conn, VIR_ERR_XML_ERROR, "%s", - _("missing in spec")); - goto cleanup; - } - prog[3] = state.host; + state.host = source->host.name; + prog[3] = source->host.name; if (virStorageBackendRunProgRegex(conn, NULL, prog, 1, regexes, vars, virStorageBackendFileSystemNetFindPoolSourcesFunc, @@ -251,11 +236,10 @@ virStorageBackendFileSystemNetFindPoolSources(virConnectPtr conn, for (i = 0; i < state.list.nsources; i++) virStoragePoolSourceFree(&state.list.sources[i]); - VIR_FREE(state.list.sources); - VIR_FREE(state.host); + if (source) + virStoragePoolSourceFree(source); - xmlFreeDoc(doc); - xmlXPathFreeContext(xpath_ctxt); + VIR_FREE(state.list.sources); return retval; }