mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-08-27 19:11:16 +00:00
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).
This commit is contained in:
parent
9bcb174473
commit
d61fff3f4b
@ -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 <source> 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,
|
||||
|
@ -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,
|
||||
|
@ -380,6 +380,7 @@ virStoragePoolObjListFree;
|
||||
virStoragePoolObjRemove;
|
||||
virStoragePoolObjSaveDef;
|
||||
virStoragePoolSourceFree;
|
||||
virStoragePoolDefParseSourceString;
|
||||
virStoragePoolSourceListNewSource;
|
||||
virStoragePoolSourceListFormat;
|
||||
virStorageVolDefFindByKey;
|
||||
|
@ -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 <source> 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 <host> in <source> 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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user