
On Thu, Jul 12, 2018 at 10:15:22 +0200, Simon Kobyda wrote:
After you go through command mentioned above, completer finds what state the device is currently in, and suggests an opposite state. --- tools/virsh-completer.c | 73 ++++++++++++++++++++++++++++++++++++++++- tools/virsh-completer.h | 4 +++ tools/virsh-domain.c | 1 + 3 files changed, 77 insertions(+), 1 deletion(-)
Looks like your date/time is wrong.
diff --git a/tools/virsh-completer.c b/tools/virsh-completer.c index 2327e08340..e32fd82211 100644 --- a/tools/virsh-completer.c +++ b/tools/virsh-completer.c @@ -32,6 +32,7 @@ #include "internal.h" #include "virutil.h" #include "viralloc.h" +#include "virmacaddr.h" #include "virstring.h" #include "virxml.h"
@@ -750,7 +751,6 @@ virshDomainEventNameCompleter(vshControl *ctl ATTRIBUTE_UNUSED, return NULL; }
-
We tend to keep two lines between functions.
char ** virshPoolEventNameCompleter(vshControl *ctl ATTRIBUTE_UNUSED, const vshCmd *cmd ATTRIBUTE_UNUSED, @@ -776,6 +776,77 @@ virshPoolEventNameCompleter(vshControl *ctl ATTRIBUTE_UNUSED, return NULL; }
+char ** +virshDomainInterfaceStateCompleter(vshControl *ctl ATTRIBUTE_UNUSED, + const vshCmd *cmd ATTRIBUTE_UNUSED, + unsigned int flags) +{ + virshControlPtr priv = ctl->privData; + const char *iface = NULL; + char **ret = NULL; + xmlDocPtr xml = NULL; + virMacAddr macaddr; + char *state = NULL; + char *xpath = NULL; + char macstr[18] = ""; + xmlXPathContextPtr ctxt = NULL; + xmlNodePtr *interfaces = NULL; + int ninterfaces; + + virCheckFlags(0, NULL); + + if (!priv->conn || virConnectIsAlive(priv->conn) <= 0) + return NULL; + + if (vshCommandOptStringReq(ctl, cmd, "interface", &iface) < 0) + goto cleanup; + + if (virshDomainGetXML(ctl, cmd, flags, &xml, &ctxt) < 0) + goto cleanup; + + /* normalize the mac addr */ + if (virMacAddrParse(iface, &macaddr) == 0) + virMacAddrFormat(&macaddr, macstr); + + if (virAsprintf(&xpath, "/domain/devices/interface[(mac/@address = '%s') or " + " (target/@dev = '%s')]", + macstr, iface) < 0) + goto cleanup; + + if ((ninterfaces = virXPathNodeSet(xpath, ctxt, &interfaces)) < 0) + goto cleanup; + + if (ninterfaces != 1) + goto cleanup; + + ctxt->node = interfaces[0]; + + if (VIR_ALLOC_N(ret, 2) < 0) + goto error; + + if ((state = virXPathString("string(./link/@state)", ctxt)) && + STREQ(state, "down")) { + if (VIR_STRDUP(ret[0], "up") < 0) + goto error; + } else { + if (VIR_STRDUP(ret[0], "down") < 0) + goto error; + } + + cleanup: + VIR_FREE(state); + VIR_FREE(interfaces); + VIR_FREE(xpath); + xmlXPathFreeContext(ctxt); + xmlFreeDoc(xml); + return ret; + + error: + virStringListFree(ret); + ret = NULL; + goto cleanup; +}
This is an awful lot of code for a not very useful feature. I'd just complete both up and down and don't really care what the current state is.