From 0e2d73051a721a1b077fb41b97ea562082c95c4f Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Wed, 4 Jun 2014 11:08:08 +0200 Subject: [PATCH] virsh: Reject negative numbers in vshCommandOptUL 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 d2bd4f2ef0..2c24ec2bb9 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; } @@ -9229,7 +9229,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 bc9d20de99..0114771787 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; + return vshCommandOptULInternal(cmd, name, value, false); +} - ret = vshCommandOpt(cmd, name, &arg, true); - if (ret <= 0) - return ret; - - 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 9afbbb52ce..4f5c336b4a 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;