提交 3b90c3c4 编写于 作者: R Roland Schulz 提交者: Martin Kletzander

Add virshAllocpagesPagesizeCompleter

Returns list of host page sizes from capabilities XML.
Signed-off-by: NRoland Schulz <schullzroll@gmail.com>
上级 47a1ca6e
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include "virsh-pool.h" #include "virsh-pool.h"
#include "virsh-util.h" #include "virsh-util.h"
#include "internal.h" #include "internal.h"
#include "virutil.h"
#include "viralloc.h" #include "viralloc.h"
#include "virstring.h" #include "virstring.h"
#include "virxml.h" #include "virxml.h"
...@@ -570,3 +571,73 @@ virshSnapshotNameCompleter(vshControl *ctl, ...@@ -570,3 +571,73 @@ virshSnapshotNameCompleter(vshControl *ctl,
virshDomainFree(dom); virshDomainFree(dom);
return NULL; return NULL;
} }
char **
virshAllocpagesPagesizeCompleter(vshControl *ctl,
const vshCmd *cmd ATTRIBUTE_UNUSED,
unsigned int flags)
{
unsigned long long byteval = 0;
xmlXPathContextPtr ctxt = NULL;
virshControlPtr priv = ctl->privData;
unsigned int npages = 0;
xmlNodePtr *pages = NULL;
double size = 0;
size_t i = 0;
const char *suffix = NULL;
char *pagesize = NULL;
char *cap_xml = NULL;
char **ret = NULL;
char *unit = NULL;
virCheckFlags(0, NULL);
if (!priv->conn || virConnectIsAlive(priv->conn) <= 0)
goto error;
if (!(cap_xml = virConnectGetCapabilities(priv->conn)))
goto error;
if (!(virXMLParseStringCtxt(cap_xml, _("capabilities"), &ctxt)))
goto error;
npages = virXPathNodeSet("/capabilities/host/cpu/pages", ctxt, &pages);
if (npages <= 0)
goto error;
if (VIR_ALLOC_N(ret, npages + 1) < 0)
goto error;
for (i = 0; i < npages; i++) {
VIR_FREE(pagesize);
VIR_FREE(unit);
pagesize = virXMLPropString(pages[i], "size");
unit = virXMLPropString(pages[i], "unit");
if (virStrToLong_ull(pagesize, NULL, 10, &byteval) < 0)
goto error;
if (virScaleInteger(&byteval, unit, 1024, UINT_MAX) < 0)
goto error;
size = vshPrettyCapacity(byteval, &suffix);
if (virAsprintf(&ret[i], "%.0f%s", size, suffix) < 0)
goto error;
}
cleanup:
xmlXPathFreeContext(ctxt);
for (i = 0; i < npages; i++)
VIR_FREE(pages[i]);
VIR_FREE(pages);
VIR_FREE(cap_xml);
VIR_FREE(pagesize);
VIR_FREE(unit);
return ret;
error:
if (ret) {
for (i = 0; i < npages; i++)
VIR_FREE(ret[i]);
}
VIR_FREE(ret);
goto cleanup;
}
...@@ -74,4 +74,8 @@ char ** virshSnapshotNameCompleter(vshControl *ctl, ...@@ -74,4 +74,8 @@ char ** virshSnapshotNameCompleter(vshControl *ctl,
const vshCmd *cmd, const vshCmd *cmd,
unsigned int flags); unsigned int flags);
char ** virshAllocpagesPagesizeCompleter(vshControl *ctl,
const vshCmd *cmd,
unsigned int flags);
#endif #endif
...@@ -472,6 +472,7 @@ static const vshCmdOptDef opts_allocpages[] = { ...@@ -472,6 +472,7 @@ static const vshCmdOptDef opts_allocpages[] = {
{.name = "pagesize", {.name = "pagesize",
.type = VSH_OT_INT, .type = VSH_OT_INT,
.flags = VSH_OFLAG_REQ, .flags = VSH_OFLAG_REQ,
.completer = virshAllocpagesPagesizeCompleter,
.help = N_("page size (in kibibytes)") .help = N_("page size (in kibibytes)")
}, },
{.name = "pagecount", {.name = "pagecount",
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册