]> xenbits.xensource.com Git - libvirt.git/commitdiff
virsh: Add helper to request string arguments with error reporting
authorPeter Krempa <pkrempa@redhat.com>
Mon, 14 Jan 2013 13:38:38 +0000 (14:38 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 4 Feb 2013 13:17:39 +0000 (14:17 +0100)
This patch adds a helper function with similar semantics to
vshCommandOptString that requests a string argument, but does some error
reporting without the need to do it in the functions themselves.

The error reporting also provides information about the parameter whose
retrieval failed.

tools/virsh.c
tools/virsh.h

index 27ed51173afd1f481b2b649a29c69d54d4b9d88f..e5322f009fbccb53324413d6b9ac022eaf1fb9e0 100644 (file)
@@ -1416,6 +1416,58 @@ vshCommandOptString(const vshCmd *cmd, const char *name, const char **value)
     return 1;
 }
 
+/**
+ * vshCommandOptStringReq:
+ * @ctl virsh control structure
+ * @cmd command structure
+ * @name option name
+ * @value result (updated to NULL or the option argument)
+ *
+ * Gets a option argument as string.
+ *
+ * Returns 0 on success or when the option is not present and not
+ * required, *value is set to the option argument. On error -1 is
+ * returned and error message printed.
+ */
+int
+vshCommandOptStringReq(vshControl *ctl,
+                       const vshCmd *cmd,
+                       const char *name,
+                       const char **value)
+{
+    vshCmdOpt *arg;
+    int ret;
+    const char *error = NULL;
+
+    /* clear out the value */
+    *value = NULL;
+
+    ret = vshCommandOpt(cmd, name, &arg);
+    /* option is not required and not present */
+    if (ret == 0)
+        return 0;
+    /* this should not be propagated here, just to be sure */
+    if (ret == -1)
+        error = N_("Mandatory option not present");
+
+    if (ret == -2)
+        error = N_("Programming error: Invalid option name");
+
+    if (!arg->data)
+        error = N_("Programming error: Requested option is a boolean");
+
+    if (!*arg->data && !(arg->def->flags & VSH_OFLAG_EMPTY_OK))
+        error = N_("Option argument is empty");
+
+    if (error) {
+        vshError(ctl, _("Failed to get option '%s': %s"), name, _(error));
+        return -1;
+    }
+
+    *value = arg->data;
+    return 0;
+}
+
 /**
  * vshCommandOptLongLong:
  * @cmd command reference
index ab7161fa6157b3715a741ac5529f7ce70c3f3b98..fec9785fe708be6636d7540fe0660eb84916874e 100644 (file)
@@ -275,6 +275,10 @@ int vshCommandOptUL(const vshCmd *cmd, const char *name,
 int vshCommandOptString(const vshCmd *cmd, const char *name,
                         const char **value)
     ATTRIBUTE_NONNULL(3) ATTRIBUTE_RETURN_CHECK;
+int vshCommandOptStringReq(vshControl *ctl, const vshCmd *cmd,
+                           const char *name, const char **value)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3)
+    ATTRIBUTE_NONNULL(4) ATTRIBUTE_RETURN_CHECK;
 int vshCommandOptLongLong(const vshCmd *cmd, const char *name,
                           long long *value)
     ATTRIBUTE_NONNULL(3) ATTRIBUTE_RETURN_CHECK;