On 07/12/2018 04:07 PM, Simon Kobyda wrote:
After you go through command mentioned above, completer
finds what state the device is currently in, and suggests
an opposite state.
Signed-off-by: Simon Kobyda <skobyda(a)redhat.com>
---
Changes in V2:
- Added "Signed-off-by"
- Changed format of commit message to make it more
readable
tools/virsh-completer.c | 73 ++++++++++++++++++++++++++++++++++++++++-
tools/virsh-completer.h | 4 +++
tools/virsh-domain.c | 1 +
3 files changed, 77 insertions(+), 1 deletion(-)
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;
}
-
This is a spurious change and has nothing to do with the feature you're
proposing.
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)
Misaligned function arguments. Also, I'm not quite sure why you marked
@ctl as unused when it's being used at the very next line. Same goes for
@cmd.
+{
+ 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] = "";
What's wrong with VIR_MAC_STRING_BUFLEN?
+ 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;
+}
+
Fixed all the small nits I've found, ACKed and pushed.
Michal