提交 dcbfd572 编写于 作者: D Doug Goldstein 提交者: Peter Krempa

virsh: Use virXPath wrappers for vncdisplay cmd

Update the vncdisplay command to use the virXPath wrappers as well as
check if the domain is up rather than using the port set to -1 to mean
the domain is not up.
Signed-off-by: NDoug Goldstein <cardoe@cardoe.com>
上级 acbd4965
...@@ -13844,12 +13844,12 @@ static bool ...@@ -13844,12 +13844,12 @@ static bool
cmdVNCDisplay(vshControl *ctl, const vshCmd *cmd) cmdVNCDisplay(vshControl *ctl, const vshCmd *cmd)
{ {
xmlDocPtr xml = NULL; xmlDocPtr xml = NULL;
xmlXPathObjectPtr obj = NULL;
xmlXPathContextPtr ctxt = NULL; xmlXPathContextPtr ctxt = NULL;
virDomainPtr dom; virDomainPtr dom;
bool ret = false; bool ret = false;
int port = 0; int port = 0;
char *doc; char *doc = NULL;
char *listen_addr = NULL;
if (!vshConnectionUsability(ctl, ctl->conn)) if (!vshConnectionUsability(ctl, ctl->conn))
return false; return false;
...@@ -13857,38 +13857,37 @@ cmdVNCDisplay(vshControl *ctl, const vshCmd *cmd) ...@@ -13857,38 +13857,37 @@ cmdVNCDisplay(vshControl *ctl, const vshCmd *cmd)
if (!(dom = vshCommandOptDomain(ctl, cmd, NULL))) if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
return false; return false;
doc = virDomainGetXMLDesc(dom, 0); /* Check if the domain is active and don't rely on -1 for this */
if (!doc) if (!virDomainIsActive(dom)) {
vshError(ctl, _("Domain is not running"));
goto cleanup; goto cleanup;
}
xml = virXMLParseStringCtxt(doc, _("(domain_definition)"), &ctxt); if (!(doc = virDomainGetXMLDesc(dom, 0)))
VIR_FREE(doc);
if (!xml)
goto cleanup; goto cleanup;
obj = xmlXPathEval(BAD_CAST "string(/domain/devices/graphics[@type='vnc']/@port)", ctxt); if (!(xml = virXMLParseStringCtxt(doc, _("(domain_definition)"), &ctxt)))
if (obj == NULL || obj->type != XPATH_STRING ||
obj->stringval == NULL || obj->stringval[0] == 0) {
goto cleanup; goto cleanup;
}
if (virStrToLong_i((const char *)obj->stringval, NULL, 10, &port) || port < 0) /* Get the VNC port */
if (virXPathInt("string(/domain/devices/graphics[@type='vnc']/@port)",
ctxt, &port)) {
vshError(ctl, _("Failed to get VNC port. Is this domain using VNC?"));
goto cleanup; goto cleanup;
xmlXPathFreeObject(obj); }
obj = xmlXPathEval(BAD_CAST "string(/domain/devices/graphics[@type='vnc']/@listen)", ctxt); listen_addr = virXPathString("string(/domain/devices/graphics"
if (obj == NULL || obj->type != XPATH_STRING || "[@type='vnc']/@listen)", ctxt);
obj->stringval == NULL || obj->stringval[0] == 0 || if (listen_addr == NULL || STREQ(listen_addr, "0.0.0.0"))
STREQ((const char*)obj->stringval, "0.0.0.0")) {
vshPrint(ctl, ":%d\n", port-5900); vshPrint(ctl, ":%d\n", port-5900);
} else { else
vshPrint(ctl, "%s:%d\n", (const char *)obj->stringval, port-5900); vshPrint(ctl, "%s:%d\n", listen_addr, port-5900);
}
xmlXPathFreeObject(obj);
obj = NULL;
ret = true; ret = true;
cleanup: cleanup:
xmlXPathFreeObject(obj); VIR_FREE(doc);
VIR_FREE(listen_addr);
xmlXPathFreeContext(ctxt); xmlXPathFreeContext(ctxt);
xmlFreeDoc(xml); xmlFreeDoc(xml);
virDomainFree(dom); virDomainFree(dom);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册