On 22.05.2015 10:59, Andrea Bolognani wrote:
---
tests/vcpupin | 4 +-
tools/virsh-domain-monitor.c | 9 +--
tools/virsh-domain.c | 134 +++++++------------------------------------
tools/virsh-host.c | 57 +++---------------
tools/virsh-interface.c | 6 +-
tools/virsh-network.c | 6 +-
tools/virsh-volume.c | 24 ++------
tools/virsh.c | 111 +++++++++++++++++++++--------------
8 files changed, 104 insertions(+), 247 deletions(-)
Nice cleanup.
diff --git a/tools/virsh.c b/tools/virsh.c
index 9f44793..db9354c 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -1517,23 +1517,27 @@ vshCommandOpt(const vshCmd *cmd,
* <0 in all other cases (@value untouched)
*/
Does it makes sense to note in comments that this function (and others that you're
fixing) is reporting an error?
int
-vshCommandOptInt(vshControl *ctl ATTRIBUTE_UNUSED, const vshCmd *cmd,
+vshCommandOptInt(vshControl *ctl, const vshCmd *cmd,
const char *name, int *value)
{
vshCmdOpt *arg;
int ret;
- ret = vshCommandOpt(cmd, name, &arg, true);
- if (ret <= 0)
+ if ((ret = vshCommandOpt(cmd, name, &arg, true)) <= 0)
return ret;
- if (virStrToLong_i(arg->data, NULL, 10, value) < 0)
- return -1;
- return 1;
+ if ((ret = virStrToLong_i(arg->data, NULL, 10, value)) < 0)
+ vshError(ctl,
+ _("Numeric value '%s' for <%s> option is malformed
or out of range"),
+ arg->data, name);
+ else
+ ret = 1;
+
+ return ret;
}
While reworking this, you've missed vshCommandOptTimeoutToMs() which in case of
something like following '--timeout blah' will report error twice: from both
OptInt() and OptTimeoutToMs():
error: Numeric value 'blah' for <timeout> option is malformed or out of
range
error: invalid timeout
I think this should be squashed in:
@@ -1906,11 +1907,13 @@ vshCommandOptTimeoutToMs(vshControl *ctl, const vshCmd *cmd,
{
int rv = vshCommandOptInt(ctl, cmd, "timeout", timeout);
- if (rv < 0 || (rv > 0 && *timeout < 1)) {
- vshError(ctl, "%s", _("invalid timeout"));
+ if (rv < 0)
return -1;
- }
if (rv > 0) {
+ if (*timeout < 1) {
+ vshError(ctl, "%s", _("invalid timeout"));
+ return -1;
+ }
/* Ensure that we can multiply by 1000 without overflowing. */
if (*timeout > INT_MAX / 1000) {
vshError(ctl, "%s", _("timeout is too big"));
static int
-vshCommandOptULongLongInternal(vshControl *ctl ATTRIBUTE_UNUSED, const vshCmd *cmd,
+vshCommandOptULongLongInternal(vshControl *ctl, const vshCmd *cmd,
const char *name, unsigned long long *value,
bool wrap)
{
@@ -1754,15 +1767,18 @@ vshCommandOptULongLongInternal(vshControl *ctl ATTRIBUTE_UNUSED,
const vshCmd *c
if ((ret = vshCommandOpt(cmd, name, &arg, true)) <= 0)
return ret;
- if (wrap) {
- if (virStrToLong_ull(arg->data, NULL, 10, value) < 0)
- return -1;
- } else {
- if (virStrToLong_ullp(arg->data, NULL, 10, value) < 0)
- return -1;
- }
+ if (wrap)
+ ret = virStrToLong_ull(arg->data, NULL, 10, value);
+ else
+ ret = virStrToLong_ullp(arg->data, NULL, 10, value);
+ if (ret < 0)
+ vshError(ctl,
+ _("Numeric value '%s' for <%s> option is malformed
or out of range"),
+ arg->data, name);
+ else
+ ret = 1;
- return 1;
+ return ret;
}
You've missed one ocurrance of vshCommandOptULongLong in cmdAllocpages().
/**
@@ -1812,7 +1828,7 @@ vshCommandOptULongLongWrap(vshControl *ctl, const vshCmd *cmd,
* See vshCommandOptInt()
*/
int
-vshCommandOptScaledInt(vshControl *ctl ATTRIBUTE_UNUSED, const vshCmd *cmd,
+vshCommandOptScaledInt(vshControl *ctl, const vshCmd *cmd,
const char *name, unsigned long long *value,
int scale, unsigned long long max)
{
@@ -1825,9 +1841,16 @@ vshCommandOptScaledInt(vshControl *ctl ATTRIBUTE_UNUSED, const
vshCmd *cmd,
if (virStrToLong_ull(arg->data, &end, 10, value) < 0 ||
virScaleInteger(value, end, scale, max) < 0)
- return -1;
+ {
+ vshError(ctl,
+ _("Numeric value '%s' for <%s> option is malformed
or out of range"),
+ arg->data, name);
+ ret = -1;
+ } else {
+ ret = 1;
+ }
- return 1;
+ return ret;
}
Interestingly vshCommandOptString() is missing. So far, the only way for the function to
fail is if one uses --option "" and VSH_OFLAG_EMPTY_OK is not specified. So if
we come up with good error message for that case, we are okay to drop all the other error
messages.
Otherwise looking good.
Michal