Use virStrToLong_uip instead of virStrToLong_ui to reject negative
numbers in the helper. None of the callers expects the wraparound
"feature" for negative numbers.
Also add a function that allows wrapping of negative numbers as it might
be used in the future and be explicit about the new semantics in the
function docs.
---
tools/virsh.c | 48 ++++++++++++++++++++++++++++++++++++++----------
tools/virsh.h | 3 +++
2 files changed, 41 insertions(+), 10 deletions(-)
diff --git a/tools/virsh.c b/tools/virsh.c
index 15f3025..cbab6b0 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -1494,6 +1494,28 @@ vshCommandOptInt(const vshCmd *cmd, const char *name, int *value)
return 1;
}
+static int
+vshCommandOptUIntInternal(const vshCmd *cmd,
+ const char *name,
+ unsigned int *value,
+ bool wrap)
+{
+ vshCmdOpt *arg;
+ int ret;
+
+ if ((ret = vshCommandOpt(cmd, name, &arg, true)) <= 0)
+ return ret;
+
+ if (wrap) {
+ if (virStrToLong_ui(arg->data, NULL, 10, value) < 0)
+ return -1;
+ } else {
+ if (virStrToLong_uip(arg->data, NULL, 10, value) < 0)
+ return -1;
+ }
+
+ return 1;
+}
/**
* vshCommandOptUInt:
@@ -1501,22 +1523,28 @@ vshCommandOptInt(const vshCmd *cmd, const char *name, int *value)
* @name option name
* @value result
*
- * Convert option to unsigned int
+ * Convert option to unsigned int, reject negative numbers
* See vshCommandOptInt()
*/
int
vshCommandOptUInt(const vshCmd *cmd, const char *name, unsigned int *value)
{
- vshCmdOpt *arg;
- int ret;
-
- ret = vshCommandOpt(cmd, name, &arg, true);
- if (ret <= 0)
- return ret;
+ return vshCommandOptUIntInternal(cmd, name, value, false);
+}
- if (virStrToLong_ui(arg->data, NULL, 10, value) < 0)
- return -1;
- return 1;
+/**
+ * vshCommandOptUIntWrap:
+ * @cmd command reference
+ * @name option name
+ * @value result
+ *
+ * Convert option to unsigned int, wraps negative numbers to positive
+ * See vshCommandOptInt()
+ */
+int
+vshCommandOptUIntWrap(const vshCmd *cmd, const char *name, unsigned int *value)
+{
+ return vshCommandOptUIntInternal(cmd, name, value, true);
}
diff --git a/tools/virsh.h b/tools/virsh.h
index 1ffc003..9afbbb5 100644
--- a/tools/virsh.h
+++ b/tools/virsh.h
@@ -285,6 +285,9 @@ int vshCommandOptInt(const vshCmd *cmd, const char *name, int *value)
int vshCommandOptUInt(const vshCmd *cmd, const char *name,
unsigned int *value)
ATTRIBUTE_NONNULL(3) ATTRIBUTE_RETURN_CHECK;
+int vshCommandOptUIntWrap(const vshCmd *cmd, const char *name,
+ unsigned int *value)
+ ATTRIBUTE_NONNULL(3) ATTRIBUTE_RETURN_CHECK;
int vshCommandOptUL(const vshCmd *cmd, const char *name,
unsigned long *value)
ATTRIBUTE_NONNULL(3) ATTRIBUTE_RETURN_CHECK;
--
1.9.3