To follow the new semantics of the vshCommandOptToU* functions convert
this one to reject negative numbers too. To allow using -1 for "maximum"
semantics for the two bandwidth functions that use this helper introduce
vshCommandOptULWrap. Although currently the migrate-setspeed function
for the qemu driver will reject -1 as maximum.
---
tools/virsh-domain.c | 4 ++--
tools/virsh.c | 46 +++++++++++++++++++++++++++++++++++++---------
tools/virsh.h | 3 +++
3 files changed, 42 insertions(+), 11 deletions(-)
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index 84a6706..d76865b 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -1457,7 +1457,7 @@ blockJobImpl(vshControl *ctl, const vshCmd *cmd,
if (vshCommandOptStringReq(ctl, cmd, "path", &path) < 0)
goto cleanup;
- if (vshCommandOptUL(cmd, "bandwidth", &bandwidth) < 0) {
+ if (vshCommandOptULWrap(cmd, "bandwidth", &bandwidth) < 0) {
vshError(ctl, "%s", _("bandwidth must be a number"));
goto cleanup;
}
@@ -9223,7 +9223,7 @@ cmdMigrateSetMaxSpeed(vshControl *ctl, const vshCmd *cmd)
if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
return false;
- if (vshCommandOptUL(cmd, "bandwidth", &bandwidth) < 0) {
+ if (vshCommandOptULWrap(cmd, "bandwidth", &bandwidth) < 0) {
vshError(ctl, "%s", _("migrate: Invalid bandwidth"));
goto done;
}
diff --git a/tools/virsh.c b/tools/virsh.c
index cbab6b0..77a4f99 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -1547,6 +1547,28 @@ vshCommandOptUIntWrap(const vshCmd *cmd, const char *name, unsigned
int *value)
return vshCommandOptUIntInternal(cmd, name, value, true);
}
+static int
+vshCommandOptULInternal(const vshCmd *cmd,
+ const char *name,
+ unsigned long *value,
+ bool wrap)
+{
+ vshCmdOpt *arg;
+ int ret;
+
+ if ((ret = vshCommandOpt(cmd, name, &arg, true)) <= 0)
+ return ret;
+
+ if (wrap) {
+ if (virStrToLong_ul(arg->data, NULL, 10, value) < 0)
+ return -1;
+ } else {
+ if (virStrToLong_ulp(arg->data, NULL, 10, value) < 0)
+ return -1;
+ }
+
+ return 1;
+}
/*
* vshCommandOptUL:
@@ -1560,16 +1582,22 @@ vshCommandOptUIntWrap(const vshCmd *cmd, const char *name,
unsigned int *value)
int
vshCommandOptUL(const vshCmd *cmd, const char *name, unsigned long *value)
{
- vshCmdOpt *arg;
- int ret;
-
- ret = vshCommandOpt(cmd, name, &arg, true);
- if (ret <= 0)
- return ret;
+ return vshCommandOptULInternal(cmd, name, value, false);
+}
- if (virStrToLong_ul(arg->data, NULL, 10, value) < 0)
- return -1;
- return 1;
+/**
+ * vshCommandOptULWrap:
+ * @cmd command reference
+ * @name option name
+ * @value result
+ *
+ * Convert option to unsigned long, wraps negative numbers to positive
+ * See vshCommandOptInt()
+ */
+int
+vshCommandOptULWrap(const vshCmd *cmd, const char *name, unsigned long *value)
+{
+ return vshCommandOptULInternal(cmd, name, value, true);
}
/**
diff --git a/tools/virsh.h b/tools/virsh.h
index 9afbbb5..4f5c336 100644
--- a/tools/virsh.h
+++ b/tools/virsh.h
@@ -291,6 +291,9 @@ int vshCommandOptUIntWrap(const vshCmd *cmd, const char *name,
int vshCommandOptUL(const vshCmd *cmd, const char *name,
unsigned long *value)
ATTRIBUTE_NONNULL(3) ATTRIBUTE_RETURN_CHECK;
+int vshCommandOptULWrap(const vshCmd *cmd, const char *name,
+ unsigned long *value)
+ ATTRIBUTE_NONNULL(3) ATTRIBUTE_RETURN_CHECK;
int vshCommandOptString(const vshCmd *cmd, const char *name,
const char **value)
ATTRIBUTE_NONNULL(3) ATTRIBUTE_RETURN_CHECK;
--
1.9.3