virsh: Reject negative numbers in vshCommandOptUInt

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.
This commit is contained in:
Peter Krempa 2014-05-29 13:12:26 +02:00
parent 7eb0ee175b
commit 37e663adb6
2 changed files with 41 additions and 10 deletions

View File

@ -1494,6 +1494,28 @@ vshCommandOptInt(const vshCmd *cmd, const char *name, int *value)
return 1; 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: * vshCommandOptUInt:
@ -1501,22 +1523,28 @@ vshCommandOptInt(const vshCmd *cmd, const char *name, int *value)
* @name option name * @name option name
* @value result * @value result
* *
* Convert option to unsigned int * Convert option to unsigned int, reject negative numbers
* See vshCommandOptInt() * See vshCommandOptInt()
*/ */
int int
vshCommandOptUInt(const vshCmd *cmd, const char *name, unsigned int *value) vshCommandOptUInt(const vshCmd *cmd, const char *name, unsigned int *value)
{ {
vshCmdOpt *arg; return vshCommandOptUIntInternal(cmd, name, value, false);
int ret; }
ret = vshCommandOpt(cmd, name, &arg, true); /**
if (ret <= 0) * vshCommandOptUIntWrap:
return ret; * @cmd command reference
* @name option name
if (virStrToLong_ui(arg->data, NULL, 10, value) < 0) * @value result
return -1; *
return 1; * 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);
} }

View File

@ -285,6 +285,9 @@ int vshCommandOptInt(const vshCmd *cmd, const char *name, int *value)
int vshCommandOptUInt(const vshCmd *cmd, const char *name, int vshCommandOptUInt(const vshCmd *cmd, const char *name,
unsigned int *value) unsigned int *value)
ATTRIBUTE_NONNULL(3) ATTRIBUTE_RETURN_CHECK; 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, int vshCommandOptUL(const vshCmd *cmd, const char *name,
unsigned long *value) unsigned long *value)
ATTRIBUTE_NONNULL(3) ATTRIBUTE_RETURN_CHECK; ATTRIBUTE_NONNULL(3) ATTRIBUTE_RETURN_CHECK;