diff --git a/tools/virsh.c b/tools/virsh.c index 828d585a59..bc9d20de99 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; + return vshCommandOptUIntInternal(cmd, name, value, false); +} - ret = vshCommandOpt(cmd, name, &arg, true); - if (ret <= 0) - return ret; - - 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 1ffc003e7a..9afbbb52ce 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;