提交 d61fff3f 编写于 作者: C Cole Robinson

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).
上级 9bcb1744
......@@ -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;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册