]> xenbits.xensource.com Git - libvirt.git/commitdiff
virsh: Reject negative numbers in vshCommandOptUL
authorPeter Krempa <pkrempa@redhat.com>
Wed, 4 Jun 2014 09:08:08 +0000 (11:08 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 12 Jun 2014 12:06:20 +0000 (14:06 +0200)
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
tools/virsh.c
tools/virsh.h

index d2bd4f2ef0697b05595830bc9ea2b86485e1376d..2c24ec2bb91a4ecaeb0dc144abe5e83fa616a932 100644 (file)
@@ -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;
     }
index bc9d20de996411c7cec2ead8aea0e3c8832db6e1..011477178714ea55aa861e8b8831d948b8ae368b 100644 (file)
@@ -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;
-
-    ret = vshCommandOpt(cmd, name, &arg, true);
-    if (ret <= 0)
-        return ret;
+    return vshCommandOptULInternal(cmd, name, value, false);
+}
 
-    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);
 }
 
 /**
index 9afbbb52ce2bb5150b20ed78143b2ef6806605f6..4f5c336b4ad494c97c1a753e97a55f9a45a457c8 100644 (file)
@@ -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;