[libvirt] [PATCH 2/2] virsh: Change option parsing functions to return tri-state information.

Michal Privoznik mprivozn at redhat.com
Tue Mar 8 16:29:31 UTC 2011


This is needed to detect situations when optional argument was
specified with non-integer value: '--int-opt foo'. To keep functions
uniform vshCommandOptString function was also changed, because it
returns tri-state value as well. Given result pointer is updated only
in case of success. If parsing fails, result is not updated at all.
---
 tools/virsh.c |  613 ++++++++++++++++++++++++++-------------------------------
 1 files changed, 280 insertions(+), 333 deletions(-)

diff --git a/tools/virsh.c b/tools/virsh.c
index 6ad4089..c746073 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -252,13 +252,14 @@ static const vshCmdGrp *vshCmdGrpSearch(const char *grpname);
 static int vshCmdGrpHelp(vshControl *ctl, const char *name);
 
 static vshCmdOpt *vshCommandOpt(const vshCmd *cmd, const char *name);
-static int vshCommandOptInt(const vshCmd *cmd, const char *name, int *found);
-static unsigned long vshCommandOptUL(const vshCmd *cmd, const char *name,
-                                     int *found);
-static const char *vshCommandOptString(const vshCmd *cmd, const char *name,
-                                 int *found);
-static long long vshCommandOptLongLong(const vshCmd *cmd, const char *name,
-                                       int *found);
+static int vshCommandOptInt(const vshCmd *cmd, const char *name, int *value)
+                            ATTRIBUTE_NONNULL(3);
+static int vshCommandOptUL(const vshCmd *cmd, const char *name,
+                           unsigned long *value) ATTRIBUTE_NONNULL(3);
+static int vshCommandOptString(const vshCmd *cmd, const char *name,
+                               const char **value) ATTRIBUTE_NONNULL(3);
+static int vshCommandOptLongLong(const vshCmd *cmd, const char *name,
+                                 unsigned long long *value) ATTRIBUTE_NONNULL(3);
 static int vshCommandOptBool(const vshCmd *cmd, const char *name);
 static char *vshCommandOptArgv(const vshCmd *cmd, int count);
 
@@ -589,11 +590,9 @@ static const vshCmdOptDef opts_help[] = {
 static int
 cmdHelp(vshControl *ctl, const vshCmd *cmd)
  {
-    const char *name;
-
-    name = vshCommandOptString(cmd, "command", NULL);
+    const char *name = NULL;
 
-    if (!name) {
+    if (vshCommandOptString(cmd, "command", &name) <= 0) {
         const vshCmdGrp *grp;
         const vshCmdDef *def;
 
@@ -692,7 +691,7 @@ static int
 cmdConnect(vshControl *ctl, const vshCmd *cmd)
 {
     int ro = vshCommandOptBool(cmd, "readonly");
-    const char *name;
+    const char *name = NULL;
 
     if (ctl->conn) {
         int ret;
@@ -704,8 +703,7 @@ cmdConnect(vshControl *ctl, const vshCmd *cmd)
     }
 
     VIR_FREE(ctl->name);
-    name = vshCommandOptString(cmd, "name", NULL);
-    if (!name)
+    if (vshCommandOptString(cmd, "name", &name) <= 0)
         return FALSE;
     ctl->name = vshStrdup(ctl, name);
 
@@ -773,7 +771,7 @@ cmdConsole(vshControl *ctl, const vshCmd *cmd)
 {
     virDomainPtr dom;
     int ret;
-    const char *name;
+    const char *name = NULL;
 
     if (!vshConnectionUsability(ctl, ctl->conn))
         return FALSE;
@@ -781,7 +779,7 @@ cmdConsole(vshControl *ctl, const vshCmd *cmd)
     if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
         return FALSE;
 
-    name = vshCommandOptString(cmd, "devname", NULL);
+    vshCommandOptString(cmd, "devname", &name);
 
     ret = cmdRunConsole(ctl, dom, name);
 
@@ -964,7 +962,7 @@ static int
 cmdDomblkstat (vshControl *ctl, const vshCmd *cmd)
 {
     virDomainPtr dom;
-    const char *name, *device;
+    const char *name = NULL, *device = NULL;
     struct _virDomainBlockStats stats;
 
     if (!vshConnectionUsability (ctl, ctl->conn))
@@ -973,7 +971,7 @@ cmdDomblkstat (vshControl *ctl, const vshCmd *cmd)
     if (!(dom = vshCommandOptDomain (ctl, cmd, &name)))
         return FALSE;
 
-    if (!(device = vshCommandOptString (cmd, "device", NULL))) {
+    if (vshCommandOptString (cmd, "device", &device) <= 0) {
         virDomainFree(dom);
         return FALSE;
     }
@@ -1021,7 +1019,7 @@ static int
 cmdDomIfstat (vshControl *ctl, const vshCmd *cmd)
 {
     virDomainPtr dom;
-    const char *name, *device;
+    const char *name = NULL, *device = NULL;
     struct _virDomainInterfaceStats stats;
 
     if (!vshConnectionUsability (ctl, ctl->conn))
@@ -1030,7 +1028,7 @@ cmdDomIfstat (vshControl *ctl, const vshCmd *cmd)
     if (!(dom = vshCommandOptDomain (ctl, cmd, &name)))
         return FALSE;
 
-    if (!(device = vshCommandOptString (cmd, "interface", NULL))) {
+    if (vshCommandOptString (cmd, "interface", &device) <= 0) {
         virDomainFree(dom);
         return FALSE;
     }
@@ -1144,7 +1142,7 @@ cmdDomblkinfo(vshControl *ctl, const vshCmd *cmd)
     virDomainBlockInfo info;
     virDomainPtr dom;
     int ret = TRUE;
-    const char *device;
+    const char *device = NULL;
 
     if (!vshConnectionUsability(ctl, ctl->conn))
         return FALSE;
@@ -1152,7 +1150,7 @@ cmdDomblkinfo(vshControl *ctl, const vshCmd *cmd)
     if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
         return FALSE;
 
-    if (!(device = vshCommandOptString (cmd, "device", NULL))) {
+    if (vshCommandOptString (cmd, "device", &device) <= 0) {
         virDomainFree(dom);
         return FALSE;
     }
@@ -1230,8 +1228,7 @@ static int
 cmdCreate(vshControl *ctl, const vshCmd *cmd)
 {
     virDomainPtr dom;
-    const char *from;
-    int found;
+    const char *from = NULL;
     int ret = TRUE;
     char *buffer;
 #ifndef WIN32
@@ -1242,8 +1239,7 @@ cmdCreate(vshControl *ctl, const vshCmd *cmd)
     if (!vshConnectionUsability(ctl, ctl->conn))
         return FALSE;
 
-    from = vshCommandOptString(cmd, "file", &found);
-    if (!found)
+    if (vshCommandOptString(cmd, "file", &from) <= 0)
         return FALSE;
 
     if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0)
@@ -1288,16 +1284,14 @@ static int
 cmdDefine(vshControl *ctl, const vshCmd *cmd)
 {
     virDomainPtr dom;
-    const char *from;
-    int found;
+    const char *from = NULL;
     int ret = TRUE;
     char *buffer;
 
     if (!vshConnectionUsability(ctl, ctl->conn))
         return FALSE;
 
-    from = vshCommandOptString(cmd, "file", &found);
-    if (!found)
+    if (vshCommandOptString(cmd, "file", &from) <= 0)
         return FALSE;
 
     if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0)
@@ -1336,15 +1330,13 @@ cmdUndefine(vshControl *ctl, const vshCmd *cmd)
 {
     virDomainPtr dom;
     int ret = TRUE;
-    const char *name;
-    int found;
+    const char *name = NULL;
     int id;
 
     if (!vshConnectionUsability(ctl, ctl->conn))
         return FALSE;
 
-    name = vshCommandOptString(cmd, "domain", &found);
-    if (!found)
+    if (vshCommandOptString(cmd, "domain", &name) <= 0)
         return FALSE;
 
     if (name && virStrToLong_i(name, NULL, 10, &id) == 0
@@ -1454,14 +1446,14 @@ static int
 cmdSave(vshControl *ctl, const vshCmd *cmd)
 {
     virDomainPtr dom;
-    const char *name;
-    const char *to;
+    const char *name = NULL;
+    const char *to = NULL;
     int ret = TRUE;
 
     if (!vshConnectionUsability(ctl, ctl->conn))
         return FALSE;
 
-    if (!(to = vshCommandOptString(cmd, "file", NULL)))
+    if (vshCommandOptString(cmd, "file", &to) <= 0)
         return FALSE;
 
     if (!(dom = vshCommandOptDomain(ctl, cmd, &name)))
@@ -1594,16 +1586,14 @@ static int
 cmdSchedInfoUpdate(vshControl *ctl, const vshCmd *cmd,
                    virSchedParameterPtr param)
 {
-    int found;
-    const char *data;
+    const char *data = NULL;
 
     /* Legacy 'weight' parameter */
     if (STREQ(param->field, "weight") &&
         param->type == VIR_DOMAIN_SCHED_FIELD_UINT &&
         vshCommandOptBool(cmd, "weight")) {
         int val;
-        val = vshCommandOptInt(cmd, "weight", &found);
-        if (!found) {
+        if (vshCommandOptInt(cmd, "weight", &val) <= 0) {
             vshError(ctl, "%s", _("Invalid value of weight"));
             return -1;
         } else {
@@ -1617,8 +1607,7 @@ cmdSchedInfoUpdate(vshControl *ctl, const vshCmd *cmd,
         param->type == VIR_DOMAIN_SCHED_FIELD_UINT &&
         vshCommandOptBool(cmd, "cap")) {
         int val;
-        val = vshCommandOptInt(cmd, "cap", &found);
-        if (!found) {
+        if (vshCommandOptInt(cmd, "cap", &val) <= 0) {
             vshError(ctl, "%s", _("Invalid value of cap"));
             return -1;
         } else {
@@ -1627,7 +1616,7 @@ cmdSchedInfoUpdate(vshControl *ctl, const vshCmd *cmd,
         return 1;
     }
 
-    if ((data = vshCommandOptString(cmd, "set", NULL))) {
+    if (vshCommandOptString(cmd, "set", &data) > 0) {
         char *val = strchr(data, '=');
         int match = 0;
         if (!val) {
@@ -1746,8 +1735,8 @@ cmdSchedinfo(vshControl *ctl, const vshCmd *cmd)
             /* See if we've tried to --set var=val.  If so, the fact that
                we reach this point (with update == 0) means that "var" did
                not match any of the settable parameters.  Report the error.  */
-            const char *var_value_pair = vshCommandOptString(cmd, "set", NULL);
-            if (var_value_pair) {
+            const char *var_value_pair = NULL;
+            if (vshCommandOptString(cmd, "set", &var_value_pair) > 0) {
                 vshError(ctl, _("invalid scheduler option: %s"),
                          var_value_pair);
                 goto cleanup;
@@ -1804,15 +1793,13 @@ static const vshCmdOptDef opts_restore[] = {
 static int
 cmdRestore(vshControl *ctl, const vshCmd *cmd)
 {
-    const char *from;
-    int found;
+    const char *from = NULL;
     int ret = TRUE;
 
     if (!vshConnectionUsability(ctl, ctl->conn))
         return FALSE;
 
-    from = vshCommandOptString(cmd, "file", &found);
-    if (!found)
+    if (vshCommandOptString(cmd, "file", &from) <= 0)
         return FALSE;
 
     if (virDomainRestore(ctl->conn, from) == 0) {
@@ -1845,15 +1832,15 @@ static int
 cmdDump(vshControl *ctl, const vshCmd *cmd)
 {
     virDomainPtr dom;
-    const char *name;
-    const char *to;
+    const char *name = NULL;
+    const char *to = NULL;
     int ret = TRUE;
     int flags = 0;
 
     if (!vshConnectionUsability(ctl, ctl->conn))
         return FALSE;
 
-    if (!(to = vshCommandOptString(cmd, "file", NULL)))
+    if (vshCommandOptString(cmd, "file", &to) <= 0)
         return FALSE;
 
     if (!(dom = vshCommandOptDomain(ctl, cmd, &name)))
@@ -2300,7 +2287,10 @@ cmdFreecell(vshControl *ctl, const vshCmd *cmd)
     if (!vshConnectionUsability(ctl, ctl->conn))
         return FALSE;
 
-    cell = vshCommandOptInt(cmd, "cellno", &cell_given);
+    if ( (cell_given = vshCommandOptInt(cmd, "cellno", &cell)) < 0) {
+        vshError(ctl, "%s", _("cell number has to be a number"));
+        goto cleanup;
+    }
     all_given = vshCommandOptBool(cmd, "all");
 
     if (all_given && cell_given) {
@@ -2412,10 +2402,10 @@ static const vshCmdOptDef opts_maxvcpus[] = {
 static int
 cmdMaxvcpus(vshControl *ctl, const vshCmd *cmd)
 {
-    const char *type;
+    const char *type = NULL;
     int vcpus;
 
-    type = vshCommandOptString(cmd, "type", NULL);
+    vshCommandOptString(cmd, "type", &type);
 
     if (!vshConnectionUsability(ctl, ctl->conn))
         return FALSE;
@@ -2712,9 +2702,8 @@ cmdVcpupin(vshControl *ctl, const vshCmd *cmd)
     virDomainPtr dom;
     virNodeInfo nodeinfo;
     int vcpu;
-    const char *cpulist;
+    const char *cpulist = NULL;
     int ret = TRUE;
-    int vcpufound = 0;
     unsigned char *cpumap;
     int cpumaplen;
     int i;
@@ -2726,14 +2715,13 @@ cmdVcpupin(vshControl *ctl, const vshCmd *cmd)
     if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
         return FALSE;
 
-    vcpu = vshCommandOptInt(cmd, "vcpu", &vcpufound);
-    if (!vcpufound) {
+    if (vshCommandOptInt(cmd, "vcpu", &vcpu) <= 0) {
         vshError(ctl, "%s", _("vcpupin: Invalid or missing vCPU number."));
         virDomainFree(dom);
         return FALSE;
     }
 
-    if (!(cpulist = vshCommandOptString(cmd, "cpulist", NULL))) {
+    if (vshCommandOptString(cmd, "cpulist", &cpulist) <= 0) {
         virDomainFree(dom);
         return FALSE;
     }
@@ -2862,7 +2850,7 @@ cmdSetvcpus(vshControl *ctl, const vshCmd *cmd)
     if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
         return FALSE;
 
-    count = vshCommandOptInt(cmd, "count", &count);
+    vshCommandOptInt(cmd, "count", &count);
 
     if (!flags) {
         if (virDomainSetVcpus(dom, count) != 0) {
@@ -2918,7 +2906,7 @@ cmdSetmem(vshControl *ctl, const vshCmd *cmd)
 {
     virDomainPtr dom;
     virDomainInfo info;
-    unsigned long kilobytes;
+    unsigned long kilobytes = 0;
     int ret = TRUE;
 
     if (!vshConnectionUsability(ctl, ctl->conn))
@@ -2927,7 +2915,11 @@ cmdSetmem(vshControl *ctl, const vshCmd *cmd)
     if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
         return FALSE;
 
-    kilobytes = vshCommandOptUL(cmd, "kilobytes", NULL);
+    if (vshCommandOptUL(cmd, "kilobytes", &kilobytes) < 0) {
+        vshError(ctl, "%s", _("memory size has to be a number"));
+        return FALSE;
+    }
+    
     if (kilobytes <= 0) {
         virDomainFree(dom);
         vshError(ctl, _("Invalid value of %lu for memory size"), kilobytes);
@@ -2975,7 +2967,7 @@ cmdSetmaxmem(vshControl *ctl, const vshCmd *cmd)
 {
     virDomainPtr dom;
     virDomainInfo info;
-    int kilobytes;
+    int kilobytes = 0;
     int ret = TRUE;
 
     if (!vshConnectionUsability(ctl, ctl->conn))
@@ -2984,7 +2976,11 @@ cmdSetmaxmem(vshControl *ctl, const vshCmd *cmd)
     if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
         return FALSE;
 
-    kilobytes = vshCommandOptInt(cmd, "kilobytes", &kilobytes);
+    if (vshCommandOptInt(cmd, "kilobytes", &kilobytes) < 0) {
+        vshError(ctl, "%s", _("memory sizehas to be a number"));
+        return FALSE;
+    }
+
     if (kilobytes <= 0) {
         virDomainFree(dom);
         vshError(ctl, _("Invalid value of %d for memory size"), kilobytes);
@@ -3043,7 +3039,7 @@ static int
 cmdMemtune(vshControl * ctl, const vshCmd * cmd)
 {
     virDomainPtr dom;
-    long long hard_limit, soft_limit, swap_hard_limit, min_guarantee;
+    long long hard_limit = 0, soft_limit = 0, swap_hard_limit = 0, min_guarantee = 0;
     int nparams = 0;
     unsigned int i = 0;
     virMemoryParameterPtr params = NULL, temp = NULL;
@@ -3055,23 +3051,19 @@ cmdMemtune(vshControl * ctl, const vshCmd * cmd)
     if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
         return FALSE;
 
-    hard_limit =
-        vshCommandOptLongLong(cmd, "hard-limit", NULL);
+    vshCommandOptLongLong(cmd, "hard-limit", (unsigned long long*) &hard_limit);
     if (hard_limit)
         nparams++;
 
-    soft_limit =
-        vshCommandOptLongLong(cmd, "soft-limit", NULL);
+    vshCommandOptLongLong(cmd, "soft-limit", (unsigned long long*) &soft_limit);
     if (soft_limit)
         nparams++;
 
-    swap_hard_limit =
-        vshCommandOptLongLong(cmd, "swap-hard-limit", NULL);
+    vshCommandOptLongLong(cmd, "swap-hard-limit", (unsigned long long*) &swap_hard_limit);
     if (swap_hard_limit)
         nparams++;
 
-    min_guarantee =
-        vshCommandOptLongLong(cmd, "min-guarantee", NULL);
+    vshCommandOptLongLong(cmd, "min-guarantee", (unsigned long long*) &min_guarantee);
     if (min_guarantee)
         nparams++;
 
@@ -3315,8 +3307,8 @@ static int
 cmdDomXMLFromNative(vshControl *ctl, const vshCmd *cmd)
 {
     int ret = TRUE;
-    const char *format;
-    const char *configFile;
+    const char *format = NULL;
+    const char *configFile = NULL;
     char *configData;
     char *xmlData;
     int flags = 0;
@@ -3324,8 +3316,8 @@ cmdDomXMLFromNative(vshControl *ctl, const vshCmd *cmd)
     if (!vshConnectionUsability(ctl, ctl->conn))
         return FALSE;
 
-    format = vshCommandOptString(cmd, "format", NULL);
-    configFile = vshCommandOptString(cmd, "config", NULL);
+    vshCommandOptString(cmd, "format", &format);
+    vshCommandOptString(cmd, "config", &configFile);
 
     if (virFileReadAll(configFile, 1024*1024, &configData) < 0)
         return FALSE;
@@ -3360,8 +3352,8 @@ static int
 cmdDomXMLToNative(vshControl *ctl, const vshCmd *cmd)
 {
     int ret = TRUE;
-    const char *format;
-    const char *xmlFile;
+    const char *format = NULL;
+    const char *xmlFile = NULL;
     char *configData;
     char *xmlData;
     int flags = 0;
@@ -3369,8 +3361,8 @@ cmdDomXMLToNative(vshControl *ctl, const vshCmd *cmd)
     if (!vshConnectionUsability(ctl, ctl->conn))
         return FALSE;
 
-    format = vshCommandOptString(cmd, "format", NULL);
-    xmlFile = vshCommandOptString(cmd, "xml", NULL);
+    vshCommandOptString(cmd, "format", &format);
+    vshCommandOptString(cmd, "xml", &xmlFile);
 
     if (virFileReadAll(xmlFile, 1024*1024, &xmlData) < 0)
         return FALSE;
@@ -3525,10 +3517,10 @@ doMigrate (void *opaque)
 {
     char ret = '1';
     virDomainPtr dom = NULL;
-    const char *desturi;
-    const char *migrateuri;
-    const char *dname;
-    int flags = 0, found;
+    const char *desturi = NULL;
+    const char *migrateuri = NULL;
+    const char *dname = NULL;
+    int flags = 0;
     vshCtrlData *data = opaque;
     vshControl *ctl = data->ctl;
     const vshCmd *cmd = data->cmd;
@@ -3547,13 +3539,12 @@ doMigrate (void *opaque)
     if (!(dom = vshCommandOptDomain (ctl, cmd, NULL)))
         goto out;
 
-    desturi = vshCommandOptString (cmd, "desturi", &found);
-    if (!found)
+    if (vshCommandOptString (cmd, "desturi", &desturi) <= 0)
         goto out;
 
-    migrateuri = vshCommandOptString (cmd, "migrateuri", NULL);
+    vshCommandOptString (cmd, "migrateuri", &migrateuri);
 
-    dname = vshCommandOptString (cmd, "dname", NULL);
+    vshCommandOptString (cmd, "dname", &dname);
 
     if (vshCommandOptBool (cmd, "live"))
         flags |= VIR_MIGRATE_LIVE;
@@ -3645,13 +3636,12 @@ cmdMigrate (vshControl *ctl, const vshCmd *cmd)
     int ret = -1;
     virThread workerThread;
     struct pollfd pollfd;
-    int found;
     char retchar;
     struct sigaction sig_action;
     struct sigaction old_sig_action;
     virDomainJobInfo jobinfo;
     bool verbose = false;
-    int timeout;
+    int timeout = 0;
     struct timeval start, curr;
     bool live_flag = false;
     vshCtrlData data;
@@ -3670,8 +3660,7 @@ cmdMigrate (vshControl *ctl, const vshCmd *cmd)
 
     if (vshCommandOptBool (cmd, "live"))
         live_flag = TRUE;
-    timeout = vshCommandOptInt(cmd, "timeout", &found);
-    if (found) {
+    if (vshCommandOptInt(cmd, "timeout", &timeout) > 0) {
         if (! live_flag) {
             vshError(ctl, "%s", _("migrate: Unexpected timeout for offline migration"));
             goto cleanup;
@@ -3687,8 +3676,6 @@ cmdMigrate (vshControl *ctl, const vshCmd *cmd)
             vshError(ctl, "%s", _("migrate: Timeout is too big"));
             goto cleanup;
         }
-    } else {
-        timeout = 0;
     }
 
     if (pipe(p) < 0)
@@ -3797,8 +3784,7 @@ static int
 cmdMigrateSetMaxDowntime(vshControl *ctl, const vshCmd *cmd)
 {
     virDomainPtr dom = NULL;
-    long long downtime;
-    int found;
+    long long downtime = 0;
     int ret = FALSE;
 
     if (!vshConnectionUsability(ctl, ctl->conn))
@@ -3807,8 +3793,8 @@ cmdMigrateSetMaxDowntime(vshControl *ctl, const vshCmd *cmd)
     if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
         return FALSE;
 
-    downtime = vshCommandOptLongLong(cmd, "downtime", &found);
-    if (!found || downtime < 1) {
+    vshCommandOptLongLong(cmd, "downtime", (unsigned long long*) &downtime);
+    if (downtime < 1) {
         vshError(ctl, "%s", _("migrate: Invalid downtime"));
         goto done;
     }
@@ -3890,16 +3876,14 @@ static int
 cmdNetworkCreate(vshControl *ctl, const vshCmd *cmd)
 {
     virNetworkPtr network;
-    const char *from;
-    int found;
+    const char *from = NULL;
     int ret = TRUE;
     char *buffer;
 
     if (!vshConnectionUsability(ctl, ctl->conn))
         return FALSE;
 
-    from = vshCommandOptString(cmd, "file", &found);
-    if (!found)
+    if (vshCommandOptString(cmd, "file", &from) <= 0)
         return FALSE;
 
     if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0)
@@ -3938,16 +3922,14 @@ static int
 cmdNetworkDefine(vshControl *ctl, const vshCmd *cmd)
 {
     virNetworkPtr network;
-    const char *from;
-    int found;
+    const char *from = NULL;
     int ret = TRUE;
     char *buffer;
 
     if (!vshConnectionUsability(ctl, ctl->conn))
         return FALSE;
 
-    from = vshCommandOptString(cmd, "file", &found);
-    if (!found)
+    if (vshCommandOptString(cmd, "file", &from) <= 0)
         return FALSE;
 
     if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0)
@@ -4711,16 +4693,14 @@ static int
 cmdInterfaceDefine(vshControl *ctl, const vshCmd *cmd)
 {
     virInterfacePtr iface;
-    const char *from;
-    int found;
+    const char *from = NULL;
     int ret = TRUE;
     char *buffer;
 
     if (!vshConnectionUsability(ctl, ctl->conn))
         return FALSE;
 
-    from = vshCommandOptString(cmd, "file", &found);
-    if (!found)
+    if (vshCommandOptString(cmd, "file", &from) <= 0)
         return FALSE;
 
     if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0)
@@ -4873,16 +4853,14 @@ static int
 cmdNWFilterDefine(vshControl *ctl, const vshCmd *cmd)
 {
     virNWFilterPtr nwfilter;
-    const char *from;
-    int found;
+    const char *from = NULL;
     int ret = TRUE;
     char *buffer;
 
     if (!vshConnectionUsability(ctl, ctl->conn))
         return FALSE;
 
-    from = vshCommandOptString(cmd, "file", &found);
-    if (!found)
+    if (vshCommandOptString(cmd, "file", &from) <= 0)
         return FALSE;
 
     if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0)
@@ -5214,16 +5192,14 @@ static int
 cmdPoolCreate(vshControl *ctl, const vshCmd *cmd)
 {
     virStoragePoolPtr pool;
-    const char *from;
-    int found;
+    const char *from = NULL;
     int ret = TRUE;
     char *buffer;
 
     if (!vshConnectionUsability(ctl, ctl->conn))
         return FALSE;
 
-    from = vshCommandOptString(cmd, "file", &found);
-    if (!found)
+    if (vshCommandOptString(cmd, "file", &from) <= 0)
         return FALSE;
 
     if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0)
@@ -5266,18 +5242,15 @@ static int
 cmdNodeDeviceCreate(vshControl *ctl, const vshCmd *cmd)
 {
     virNodeDevicePtr dev = NULL;
-    const char *from;
-    int found = 0;
+    const char *from = NULL;
     int ret = TRUE;
     char *buffer;
 
     if (!vshConnectionUsability(ctl, ctl->conn))
         return FALSE;
 
-    from = vshCommandOptString(cmd, "file", &found);
-    if (!found) {
+    if (vshCommandOptString(cmd, "file", &from) <= 0)
         return FALSE;
-    }
 
     if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0)
         return FALSE;
@@ -5319,17 +5292,14 @@ cmdNodeDeviceDestroy(vshControl *ctl, const vshCmd *cmd)
 {
     virNodeDevicePtr dev = NULL;
     int ret = TRUE;
-    int found = 0;
-    const char *name;
+    const char *name = NULL;
 
     if (!vshConnectionUsability(ctl, ctl->conn)) {
         return FALSE;
     }
 
-    name = vshCommandOptString(cmd, "name", &found);
-    if (!found) {
+    if (vshCommandOptString(cmd, "name", &name) <= 0) 
         return FALSE;
-    }
 
     dev = virNodeDeviceLookupByName(ctl->conn, name);
 
@@ -5363,23 +5333,21 @@ static const vshCmdOptDef opts_pool_X_as[] = {
 
 static int buildPoolXML(const vshCmd *cmd, const char **retname, char **xml) {
 
-    int found;
-    const char *name, *type, *srcHost, *srcPath, *srcDev, *srcName, *srcFormat, *target;
+    const char *name = NULL, *type = NULL, *srcHost = NULL, *srcPath = NULL,
+               *srcDev = NULL, *srcName = NULL, *srcFormat = NULL, *target = NULL;
     virBuffer buf = VIR_BUFFER_INITIALIZER;
 
-    name = vshCommandOptString(cmd, "name", &found);
-    if (!found)
+    if (vshCommandOptString(cmd, "name", &name) <= 0)
         goto cleanup;
-    type = vshCommandOptString(cmd, "type", &found);
-    if (!found)
+    if (vshCommandOptString(cmd, "type", &type) <= 0)
         goto cleanup;
 
-    srcHost = vshCommandOptString(cmd, "source-host", &found);
-    srcPath = vshCommandOptString(cmd, "source-path", &found);
-    srcDev = vshCommandOptString(cmd, "source-dev", &found);
-    srcName = vshCommandOptString(cmd, "source-name", &found);
-    srcFormat = vshCommandOptString(cmd, "source-format", &found);
-    target = vshCommandOptString(cmd, "target", &found);
+    vshCommandOptString(cmd, "source-host", &srcHost);
+    vshCommandOptString(cmd, "source-path", &srcPath);
+    vshCommandOptString(cmd, "source-dev", &srcDev);
+    vshCommandOptString(cmd, "source-name", &srcName);
+    vshCommandOptString(cmd, "source-format", &srcFormat);
+    vshCommandOptString(cmd, "target", &target);
 
     virBufferVSprintf(&buf, "<pool type='%s'>\n", type);
     virBufferVSprintf(&buf, "  <name>%s</name>\n", name);
@@ -5480,16 +5448,14 @@ static int
 cmdPoolDefine(vshControl *ctl, const vshCmd *cmd)
 {
     virStoragePoolPtr pool;
-    const char *from;
-    int found;
+    const char *from = NULL;
     int ret = TRUE;
     char *buffer;
 
     if (!vshConnectionUsability(ctl, ctl->conn))
         return FALSE;
 
-    from = vshCommandOptString(cmd, "file", &found);
-    if (!found)
+    if (vshCommandOptString(cmd, "file", &from) <= 0)
         return FALSE;
 
     if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0)
@@ -6178,29 +6144,22 @@ static const vshCmdOptDef opts_find_storage_pool_sources_as[] = {
 static int
 cmdPoolDiscoverSourcesAs(vshControl * ctl, const vshCmd * cmd ATTRIBUTE_UNUSED)
 {
-    const char *type, *host;
+    const char *type = NULL, *host = NULL;
     char *srcSpec = NULL;
     char *srcList;
-    const char *initiator;
-    int found;
+    const char *initiator = NULL;
 
-    type = vshCommandOptString(cmd, "type", &found);
-    if (!found)
+    if (vshCommandOptString(cmd, "type", &type) <= 0)
         return FALSE;
-    host = vshCommandOptString(cmd, "host", &found);
-    if (!found)
-        host = NULL;
-    initiator = vshCommandOptString(cmd, "initiator", &found);
-    if (!found)
-        initiator = NULL;
+    vshCommandOptString(cmd, "host", &host);
+    vshCommandOptString(cmd, "initiator", &initiator);
 
     if (!vshConnectionUsability(ctl, ctl->conn))
         return FALSE;
 
     if (host) {
-        const char *port = vshCommandOptString(cmd, "port", &found);
-        if (!found)
-            port = NULL;
+        const char *port = NULL;
+        vshCommandOptString(cmd, "port", &port);
         virBuffer buf = VIR_BUFFER_INITIALIZER;
         virBufferAddLit(&buf, "<source>\n");
         virBufferVSprintf(&buf, "  <host name='%s'", host);
@@ -6253,16 +6212,13 @@ static const vshCmdOptDef opts_find_storage_pool_sources[] = {
 static int
 cmdPoolDiscoverSources(vshControl * ctl, const vshCmd * cmd ATTRIBUTE_UNUSED)
 {
-    const char *type, *srcSpecFile;
+    const char *type = NULL, *srcSpecFile = NULL;
     char *srcSpec = NULL, *srcList;
-    int found;
 
-    type = vshCommandOptString(cmd, "type", &found);
-    if (!found)
+    if (vshCommandOptString(cmd, "type", &type) <= 0)
         return FALSE;
-    srcSpecFile = vshCommandOptString(cmd, "srcSpec", &found);
-    if (!found)
-        srcSpecFile = NULL;
+    
+    vshCommandOptString(cmd, "srcSpec", &srcSpecFile);
 
     if (!vshConnectionUsability(ctl, ctl->conn))
         return FALSE;
@@ -6503,10 +6459,9 @@ cmdVolCreateAs(vshControl *ctl, const vshCmd *cmd)
 {
     virStoragePoolPtr pool;
     virStorageVolPtr vol;
-    int found;
     char *xml;
-    const char *name, *capacityStr, *allocationStr, *format;
-    const char *snapshotStrVol, *snapshotStrFormat;
+    const char *name, *capacityStr = NULL, *allocationStr = NULL, *format = NULL;
+    const char *snapshotStrVol = NULL, *snapshotStrFormat = NULL;
     unsigned long long capacity, allocation = 0;
     virBuffer buf = VIR_BUFFER_INITIALIZER;
 
@@ -6517,24 +6472,21 @@ cmdVolCreateAs(vshControl *ctl, const vshCmd *cmd)
                                      VSH_BYNAME)))
         return FALSE;
 
-    name = vshCommandOptString(cmd, "name", &found);
-    if (!found)
+    if (vshCommandOptString(cmd, "name", &name) <= 0)
         goto cleanup;
 
-    capacityStr = vshCommandOptString(cmd, "capacity", &found);
-    if (!found)
+    if (vshCommandOptString(cmd, "capacity", &capacityStr) <= 0)
         goto cleanup;
     if (cmdVolSize(capacityStr, &capacity) < 0)
         vshError(ctl, _("Malformed size %s"), capacityStr);
 
-    allocationStr = vshCommandOptString(cmd, "allocation", &found);
-    if (allocationStr &&
-        cmdVolSize(allocationStr, &allocation) < 0)
+    if ((vshCommandOptString(cmd, "allocation", &allocationStr) > 0) &&
+        (cmdVolSize(allocationStr, &allocation) < 0))
         vshError(ctl, _("Malformed size %s"), allocationStr);
 
-    format = vshCommandOptString(cmd, "format", &found);
-    snapshotStrVol = vshCommandOptString(cmd, "backing-vol", &found);
-    snapshotStrFormat = vshCommandOptString(cmd, "backing-vol-format", &found);
+    vshCommandOptString(cmd, "format", &format);
+    vshCommandOptString(cmd, "backing-vol", &snapshotStrVol);
+    vshCommandOptString(cmd, "backing-vol-format", &snapshotStrFormat);
 
     virBufferAddLit(&buf, "<volume>\n");
     virBufferVSprintf(&buf, "  <name>%s</name>\n", name);
@@ -6725,8 +6677,7 @@ cmdVolCreate(vshControl *ctl, const vshCmd *cmd)
 {
     virStoragePoolPtr pool;
     virStorageVolPtr vol;
-    const char *from;
-    int found;
+    const char *from = NULL;
     int ret = TRUE;
     char *buffer;
 
@@ -6737,8 +6688,7 @@ cmdVolCreate(vshControl *ctl, const vshCmd *cmd)
                                            VSH_BYNAME)))
         return FALSE;
 
-    from = vshCommandOptString(cmd, "file", &found);
-    if (!found) {
+    if (vshCommandOptString(cmd, "file", &from) <= 0) {
         virStoragePoolFree(pool);
         return FALSE;
     }
@@ -6786,8 +6736,7 @@ cmdVolCreateFrom(vshControl *ctl, const vshCmd *cmd)
 {
     virStoragePoolPtr pool = NULL;
     virStorageVolPtr newvol = NULL, inputvol = NULL;
-    const char *from;
-    int found;
+    const char *from = NULL;
     int ret = FALSE;
     char *buffer = NULL;
 
@@ -6797,8 +6746,7 @@ cmdVolCreateFrom(vshControl *ctl, const vshCmd *cmd)
     if (!(pool = vshCommandOptPoolBy(ctl, cmd, "pool", NULL, VSH_BYNAME)))
         goto cleanup;
 
-    from = vshCommandOptString(cmd, "file", &found);
-    if (!found) {
+    if (vshCommandOptString(cmd, "file", &from) <= 0) {
         goto cleanup;
     }
 
@@ -6885,10 +6833,9 @@ cmdVolClone(vshControl *ctl, const vshCmd *cmd)
 {
     virStoragePoolPtr origpool = NULL;
     virStorageVolPtr origvol = NULL, newvol = NULL;
-    const char *name;
+    const char *name = NULL;
     char *origxml = NULL;
     xmlChar *newxml = NULL;
-    int found;
     int ret = FALSE;
 
     if (!vshConnectionUsability(ctl, ctl->conn))
@@ -6903,8 +6850,7 @@ cmdVolClone(vshControl *ctl, const vshCmd *cmd)
         goto cleanup;
     }
 
-    name = vshCommandOptString(cmd, "newname", &found);
-    if (!found)
+    if (vshCommandOptString(cmd, "newname", &name) <= 0)
         goto cleanup;
 
     origxml = virStorageVolGetXMLDesc(origvol, 0);
@@ -7572,7 +7518,7 @@ static const vshCmdOptDef opts_secret_define[] = {
 static int
 cmdSecretDefine(vshControl *ctl, const vshCmd *cmd)
 {
-    const char *from;
+    const char *from = NULL;
     char *buffer;
     virSecretPtr res;
     char uuid[VIR_UUID_STRING_BUFLEN];
@@ -7580,8 +7526,7 @@ cmdSecretDefine(vshControl *ctl, const vshCmd *cmd)
     if (!vshConnectionUsability(ctl, ctl->conn))
         return FALSE;
 
-    from = vshCommandOptString(cmd, "file", NULL);
-    if (!from)
+    if (vshCommandOptString(cmd, "file", &from) <= 0)
         return FALSE;
 
     if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0)
@@ -7664,9 +7609,9 @@ cmdSecretSetValue(vshControl *ctl, const vshCmd *cmd)
 {
     virSecretPtr secret;
     size_t value_size;
-    const char *base64;
+    const char *base64 = NULL;
     char *value;
-    int found, res, ret = FALSE;
+    int res, ret = FALSE;
 
     if (!vshConnectionUsability(ctl, ctl->conn))
         return FALSE;
@@ -7675,8 +7620,7 @@ cmdSecretSetValue(vshControl *ctl, const vshCmd *cmd)
     if (secret == NULL)
         return FALSE;
 
-    base64 = vshCommandOptString(cmd, "base64", &found);
-    if (!base64)
+    if (vshCommandOptString(cmd, "base64", &base64) <= 0)
         goto cleanup;
 
     if (!base64_decode_alloc(base64, strlen(base64), &value, &value_size)) {
@@ -8041,16 +7985,15 @@ cmdNodeListDevicesPrint(vshControl *ctl,
 static int
 cmdNodeListDevices (vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED)
 {
-    const char *cap;
+    const char *cap = NULL;
     char **devices;
-    int found, num_devices, i;
+    int num_devices, i;
     int tree = vshCommandOptBool(cmd, "tree");
 
     if (!vshConnectionUsability(ctl, ctl->conn))
         return FALSE;
 
-    cap = vshCommandOptString(cmd, "cap", &found);
-    if (!found)
+    if (vshCommandOptString(cmd, "cap", &cap) <= 0)
         cap = NULL;
 
     num_devices = virNodeNumOfDevices(ctl->conn, cap, 0);
@@ -8129,13 +8072,13 @@ static const vshCmdOptDef opts_node_device_dumpxml[] = {
 static int
 cmdNodeDeviceDumpXML (vshControl *ctl, const vshCmd *cmd)
 {
-    const char *name;
+    const char *name = NULL;
     virNodeDevicePtr device;
     char *xml;
 
     if (!vshConnectionUsability(ctl, ctl->conn))
         return FALSE;
-    if (!(name = vshCommandOptString(cmd, "device", NULL)))
+    if (vshCommandOptString(cmd, "device", &name) <= 0)
         return FALSE;
     if (!(device = virNodeDeviceLookupByName(ctl->conn, name))) {
         vshError(ctl, "%s '%s'", _("Could not find matching device"), name);
@@ -8172,13 +8115,13 @@ static const vshCmdOptDef opts_node_device_dettach[] = {
 static int
 cmdNodeDeviceDettach (vshControl *ctl, const vshCmd *cmd)
 {
-    const char *name;
+    const char *name = NULL;
     virNodeDevicePtr device;
     int ret = TRUE;
 
     if (!vshConnectionUsability(ctl, ctl->conn))
         return FALSE;
-    if (!(name = vshCommandOptString(cmd, "device", NULL)))
+    if (vshCommandOptString(cmd, "device", &name) <= 0)
         return FALSE;
     if (!(device = virNodeDeviceLookupByName(ctl->conn, name))) {
         vshError(ctl, "%s '%s'", _("Could not find matching device"), name);
@@ -8213,13 +8156,13 @@ static const vshCmdOptDef opts_node_device_reattach[] = {
 static int
 cmdNodeDeviceReAttach (vshControl *ctl, const vshCmd *cmd)
 {
-    const char *name;
+    const char *name = NULL;
     virNodeDevicePtr device;
     int ret = TRUE;
 
     if (!vshConnectionUsability(ctl, ctl->conn))
         return FALSE;
-    if (!(name = vshCommandOptString(cmd, "device", NULL)))
+    if (vshCommandOptString(cmd, "device", &name) <= 0)
         return FALSE;
     if (!(device = virNodeDeviceLookupByName(ctl->conn, name))) {
         vshError(ctl, "%s '%s'", _("Could not find matching device"), name);
@@ -8254,13 +8197,13 @@ static const vshCmdOptDef opts_node_device_reset[] = {
 static int
 cmdNodeDeviceReset (vshControl *ctl, const vshCmd *cmd)
 {
-    const char *name;
+    const char *name = NULL;
     virNodeDevicePtr device;
     int ret = TRUE;
 
     if (!vshConnectionUsability(ctl, ctl->conn))
         return FALSE;
-    if (!(name = vshCommandOptString(cmd, "device", NULL)))
+    if (vshCommandOptString(cmd, "device", &name) <= 0)
         return FALSE;
     if (!(device = virNodeDeviceLookupByName(ctl->conn, name))) {
         vshError(ctl, "%s '%s'", _("Could not find matching device"), name);
@@ -8521,10 +8464,9 @@ static int
 cmdAttachDevice(vshControl *ctl, const vshCmd *cmd)
 {
     virDomainPtr dom;
-    const char *from;
+    const char *from = NULL;
     char *buffer;
     int ret = TRUE;
-    int found;
     unsigned int flags;
 
     if (!vshConnectionUsability(ctl, ctl->conn))
@@ -8533,8 +8475,7 @@ cmdAttachDevice(vshControl *ctl, const vshCmd *cmd)
     if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
         return FALSE;
 
-    from = vshCommandOptString(cmd, "file", &found);
-    if (!found) {
+    if (vshCommandOptString(cmd, "file", &from) <= 0) {
         virDomainFree(dom);
         return FALSE;
     }
@@ -8588,10 +8529,9 @@ static int
 cmdDetachDevice(vshControl *ctl, const vshCmd *cmd)
 {
     virDomainPtr dom;
-    const char *from;
+    const char *from = NULL;
     char *buffer;
     int ret = TRUE;
-    int found;
     unsigned int flags;
 
     if (!vshConnectionUsability(ctl, ctl->conn))
@@ -8600,8 +8540,7 @@ cmdDetachDevice(vshControl *ctl, const vshCmd *cmd)
     if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
         return FALSE;
 
-    from = vshCommandOptString(cmd, "file", &found);
-    if (!found) {
+    if (vshCommandOptString(cmd, "file", &from) <= 0) {
         virDomainFree(dom);
         return FALSE;
     }
@@ -8656,10 +8595,9 @@ static int
 cmdUpdateDevice(vshControl *ctl, const vshCmd *cmd)
 {
     virDomainPtr dom;
-    const char *from;
+    const char *from = NULL;
     char *buffer;
     int ret = TRUE;
-    int found;
     unsigned int flags;
 
     if (!vshConnectionUsability(ctl, ctl->conn))
@@ -8668,8 +8606,7 @@ cmdUpdateDevice(vshControl *ctl, const vshCmd *cmd)
     if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
         return FALSE;
 
-    from = vshCommandOptString(cmd, "file", &found);
-    if (!found) {
+    if (vshCommandOptString(cmd, "file", &from) <= 0) {
         virDomainFree(dom);
         return FALSE;
     }
@@ -8732,7 +8669,8 @@ static int
 cmdAttachInterface(vshControl *ctl, const vshCmd *cmd)
 {
     virDomainPtr dom = NULL;
-    const char *mac, *target, *script, *type, *source, *model;
+    const char *mac = NULL, *target = NULL, *script = NULL,
+                *type = NULL, *source = NULL, *model = NULL;
     int typ, ret = FALSE;
     unsigned int flags;
     virBuffer buf = VIR_BUFFER_INITIALIZER;
@@ -8744,14 +8682,14 @@ cmdAttachInterface(vshControl *ctl, const vshCmd *cmd)
     if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
         goto cleanup;
 
-    if (!(type = vshCommandOptString(cmd, "type", NULL)))
+    if (vshCommandOptString(cmd, "type", &type) <= 0)
         goto cleanup;
 
-    source = vshCommandOptString(cmd, "source", NULL);
-    target = vshCommandOptString(cmd, "target", NULL);
-    mac = vshCommandOptString(cmd, "mac", NULL);
-    script = vshCommandOptString(cmd, "script", NULL);
-    model = vshCommandOptString(cmd, "model", NULL);
+    vshCommandOptString(cmd, "source", &source);
+    vshCommandOptString(cmd, "target", &target);
+    vshCommandOptString(cmd, "mac", &mac);
+    vshCommandOptString(cmd, "script", &script);
+    vshCommandOptString(cmd, "model", &model);
 
     /* check interface type */
     if (STREQ(type, "network")) {
@@ -8842,7 +8780,7 @@ cmdDetachInterface(vshControl *ctl, const vshCmd *cmd)
     xmlXPathContextPtr ctxt = NULL;
     xmlNodePtr cur = NULL;
     xmlBufferPtr xml_buf = NULL;
-    const char *mac =NULL, *type;
+    const char *mac =NULL, *type = NULL;
     char *doc;
     char buf[64];
     int i = 0, diff_mac, ret = FALSE;
@@ -8854,10 +8792,10 @@ cmdDetachInterface(vshControl *ctl, const vshCmd *cmd)
     if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
         goto cleanup;
 
-    if (!(type = vshCommandOptString(cmd, "type", NULL)))
+    if (vshCommandOptString(cmd, "type", &type) <= 0)
         goto cleanup;
 
-    mac = vshCommandOptString(cmd, "mac", NULL);
+    vshCommandOptString(cmd, "mac", &mac);
 
     doc = virDomainGetXMLDesc(dom, 0);
     if (!doc)
@@ -8982,10 +8920,11 @@ static int
 cmdAttachDisk(vshControl *ctl, const vshCmd *cmd)
 {
     virDomainPtr dom = NULL;
-    const char *source, *target, *driver, *subdriver, *type, *mode;
+    const char *source = NULL, *target = NULL, *driver = NULL,
+                *subdriver = NULL, *type = NULL, *mode = NULL;
     int isFile = 0, ret = FALSE;
     unsigned int flags;
-    const char *stype;
+    const char *stype = NULL;
     virBuffer buf = VIR_BUFFER_INITIALIZER;
     char *xml;
 
@@ -8995,17 +8934,17 @@ cmdAttachDisk(vshControl *ctl, const vshCmd *cmd)
     if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
         goto cleanup;
 
-    if (!(source = vshCommandOptString(cmd, "source", NULL)))
+    if (vshCommandOptString(cmd, "source", &source) <= 0)
         goto cleanup;
 
-    if (!(target = vshCommandOptString(cmd, "target", NULL)))
+    if (vshCommandOptString(cmd, "target", &target) <= 0)
         goto cleanup;
 
-    driver = vshCommandOptString(cmd, "driver", NULL);
-    subdriver = vshCommandOptString(cmd, "subdriver", NULL);
-    type = vshCommandOptString(cmd, "type", NULL);
-    mode = vshCommandOptString(cmd, "mode", NULL);
-    stype = vshCommandOptString(cmd, "sourcetype", NULL);
+    vshCommandOptString(cmd, "driver", &driver);
+    vshCommandOptString(cmd, "subdriver", &subdriver);
+    vshCommandOptString(cmd, "type", &type);
+    vshCommandOptString(cmd, "mode", &mode);
+    vshCommandOptString(cmd, "sourcetype", &stype);
 
     if (!stype) {
         if (driver && (STREQ(driver, "file") || STREQ(driver, "tap")))
@@ -9110,7 +9049,7 @@ cmdDetachDisk(vshControl *ctl, const vshCmd *cmd)
     xmlNodePtr cur = NULL;
     xmlBufferPtr xml_buf = NULL;
     virDomainPtr dom = NULL;
-    const char *target;
+    const char *target = NULL;
     char *doc;
     int i = 0, diff_tgt, ret = FALSE;
     unsigned int flags;
@@ -9121,7 +9060,7 @@ cmdDetachDisk(vshControl *ctl, const vshCmd *cmd)
     if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
         goto cleanup;
 
-    if (!(target = vshCommandOptString(cmd, "target", NULL)))
+    if (vshCommandOptString(cmd, "target", &target) <= 0)
         goto cleanup;
 
     doc = virDomainGetXMLDesc(dom, 0);
@@ -9228,8 +9167,7 @@ static const vshCmdOptDef opts_cpu_compare[] = {
 static int
 cmdCPUCompare(vshControl *ctl, const vshCmd *cmd)
 {
-    const char *from;
-    int found;
+    const char *from = NULL;
     int ret = TRUE;
     char *buffer;
     int result;
@@ -9237,8 +9175,7 @@ cmdCPUCompare(vshControl *ctl, const vshCmd *cmd)
     if (!vshConnectionUsability(ctl, ctl->conn))
         return FALSE;
 
-    from = vshCommandOptString(cmd, "file", &found);
-    if (!found)
+    if (vshCommandOptString(cmd, "file", &from) <= 0)
         return FALSE;
 
     if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0)
@@ -9292,8 +9229,7 @@ static const vshCmdOptDef opts_cpu_baseline[] = {
 static int
 cmdCPUBaseline(vshControl *ctl, const vshCmd *cmd)
 {
-    const char *from;
-    int found;
+    const char *from = NULL;
     int ret = TRUE;
     char *buffer;
     char *result = NULL;
@@ -9310,8 +9246,7 @@ cmdCPUBaseline(vshControl *ctl, const vshCmd *cmd)
     if (!vshConnectionUsability(ctl, ctl->conn))
         return FALSE;
 
-    from = vshCommandOptString(cmd, "file", &found);
-    if (!found)
+    if (vshCommandOptString(cmd, "file", &from) <= 0)
         return FALSE;
 
     if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0)
@@ -9523,9 +9458,8 @@ static const vshCmdOptDef opts_cd[] = {
 static int
 cmdCd(vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED)
 {
-    const char *dir;
+    const char *dir = NULL;
     char *dir_malloced = NULL;
-    int found;
     int ret = TRUE;
 
     if (!ctl->imode) {
@@ -9533,8 +9467,7 @@ cmdCd(vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED)
         return FALSE;
     }
 
-    dir = vshCommandOptString(cmd, "dir", &found);
-    if (!found) {
+    if (vshCommandOptString(cmd, "dir", &dir) <= 0) {
         uid_t uid = geteuid();
         dir = dir_malloced = virGetUserDirectory(uid);
     }
@@ -9836,7 +9769,7 @@ cmdSnapshotCreate(vshControl *ctl, const vshCmd *cmd)
 {
     virDomainPtr dom = NULL;
     int ret = FALSE;
-    const char *from;
+    const char *from = NULL;
     char *buffer = NULL;
     virDomainSnapshotPtr snapshot = NULL;
     xmlDocPtr xml = NULL;
@@ -9851,8 +9784,7 @@ cmdSnapshotCreate(vshControl *ctl, const vshCmd *cmd)
     if (dom == NULL)
         goto cleanup;
 
-    from = vshCommandOptString(cmd, "xmlfile", NULL);
-    if (from == NULL)
+    if (vshCommandOptString(cmd, "xmlfile", &from) <= 0)
         buffer = vshStrdup(ctl, "<domainsnapshot/>");
     else {
         if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0) {
@@ -10109,7 +10041,7 @@ cmdSnapshotDumpXML(vshControl *ctl, const vshCmd *cmd)
 {
     virDomainPtr dom = NULL;
     int ret = FALSE;
-    const char *name;
+    const char *name = NULL;
     virDomainSnapshotPtr snapshot = NULL;
     char *xml = NULL;
 
@@ -10120,8 +10052,7 @@ cmdSnapshotDumpXML(vshControl *ctl, const vshCmd *cmd)
     if (dom == NULL)
         goto cleanup;
 
-    name = vshCommandOptString(cmd, "snapshotname", NULL);
-    if (name == NULL)
+    if (vshCommandOptString(cmd, "snapshotname", &name) <= 0)
         goto cleanup;
 
     snapshot = virDomainSnapshotLookupByName(dom, name, 0);
@@ -10166,7 +10097,7 @@ cmdDomainSnapshotRevert(vshControl *ctl, const vshCmd *cmd)
 {
     virDomainPtr dom = NULL;
     int ret = FALSE;
-    const char *name;
+    const char *name = NULL;
     virDomainSnapshotPtr snapshot = NULL;
 
     if (!vshConnectionUsability(ctl, ctl->conn))
@@ -10176,8 +10107,7 @@ cmdDomainSnapshotRevert(vshControl *ctl, const vshCmd *cmd)
     if (dom == NULL)
         goto cleanup;
 
-    name = vshCommandOptString(cmd, "snapshotname", NULL);
-    if (name == NULL)
+    if (vshCommandOptString(cmd, "snapshotname", &name) <= 0) 
         goto cleanup;
 
     snapshot = virDomainSnapshotLookupByName(dom, name, 0);
@@ -10219,7 +10149,7 @@ cmdSnapshotDelete(vshControl *ctl, const vshCmd *cmd)
 {
     virDomainPtr dom = NULL;
     int ret = FALSE;
-    const char *name;
+    const char *name = NULL;
     virDomainSnapshotPtr snapshot = NULL;
     unsigned int flags = 0;
 
@@ -10230,8 +10160,7 @@ cmdSnapshotDelete(vshControl *ctl, const vshCmd *cmd)
     if (dom == NULL)
         goto cleanup;
 
-    name = vshCommandOptString(cmd, "snapshotname", NULL);
-    if (name == NULL)
+    if (vshCommandOptString(cmd, "snapshotname", &name) <= 0)
         goto cleanup;
 
     if (vshCommandOptBool(cmd, "children"))
@@ -10276,7 +10205,7 @@ cmdQemuMonitorCommand(vshControl *ctl, const vshCmd *cmd)
 {
     virDomainPtr dom = NULL;
     int ret = FALSE;
-    const char *monitor_cmd;
+    const char *monitor_cmd = NULL;
     char *result = NULL;
     unsigned int flags = 0;
 
@@ -10287,8 +10216,7 @@ cmdQemuMonitorCommand(vshControl *ctl, const vshCmd *cmd)
     if (dom == NULL)
         goto cleanup;
 
-    monitor_cmd = vshCommandOptString(cmd, "cmd", NULL);
-    if (monitor_cmd == NULL) {
+    if (vshCommandOptString(cmd, "cmd", &monitor_cmd) <= 0) {
         vshError(ctl, "%s", _("missing monitor command"));
         goto cleanup;
     }
@@ -10804,83 +10732,104 @@ vshCommandOpt(const vshCmd *cmd, const char *name)
 }
 
 /*
- * Returns option as INT
+ * @cmd command reference
+ * @name option name
+ * @value result
+ *
+ * Convert option to int
+ * Return value:
+ * >0 if option found and valid (@value updated)
+ * 0 in case option not found (@value untouched)
+ * <0 in all other cases (@value untouched)
  */
 static int
-vshCommandOptInt(const vshCmd *cmd, const char *name, int *found)
+vshCommandOptInt(const vshCmd *cmd, const char *name, int *value)
 {
     vshCmdOpt *arg = vshCommandOpt(cmd, name);
-    int res = 0, num_found = FALSE;
+    int ret = 0, num;
     char *end_p = NULL;
 
     if ((arg != NULL) && (arg->data != NULL)) {
-        res = strtol(arg->data, &end_p, 10);
-        if ((arg->data == end_p) || (*end_p!= 0))
-            num_found = FALSE;
-        else
-            num_found = TRUE;
+        num = strtol(arg->data, &end_p, 10);
+        ret = -1;
+        if ((arg->data != end_p) && (*end_p == 0) && value) {
+            *value = num;
+            ret = 1;
+        }
     }
-    if (found)
-        *found = num_found;
-    return res;
+    return ret;
 }
 
-static unsigned long
-vshCommandOptUL(const vshCmd *cmd, const char *name, int *found)
+/*
+ * Convert option to unsigned long
+ * See vshCommandOptInt()
+ */
+static int
+vshCommandOptUL(const vshCmd *cmd, const char *name, unsigned long *value)
 {
     vshCmdOpt *arg = vshCommandOpt(cmd, name);
-    unsigned long res = 0;
-    int num_found = FALSE;
+    int ret = 0;
+    unsigned long num;
     char *end_p = NULL;
 
     if ((arg != NULL) && (arg->data != NULL)) {
-        res = strtoul(arg->data, &end_p, 10);
-        if ((arg->data == end_p) || (*end_p!= 0))
-            num_found = FALSE;
-        else
-            num_found = TRUE;
+        num = strtoul(arg->data, &end_p, 10);
+        ret = -1;
+        if ((arg->data != end_p) && (*end_p == 0) && value) {
+            *value = num;
+            ret = 1;
+        }
     }
-    if (found)
-        *found = num_found;
-    return res;
+    return ret;
 }
 
 /*
  * Returns option as STRING
+ * See vshCommandOptInt()
  */
-static const char *
-vshCommandOptString(const vshCmd *cmd, const char *name, int *found)
+static int
+vshCommandOptString(const vshCmd *cmd, const char *name, const char **value)
 {
     vshCmdOpt *arg = vshCommandOpt(cmd, name);
+    int ret = 0;
+
+    if (arg && arg->data) {
+        ret = -1;
+        if (*arg->data) {
+            if (value) {
+                *value = arg->data;
+                ret = 1;
+            }
+        } else if (arg->def && ((arg->def->flag) & VSH_OFLAG_REQ)) {
+                vshError(NULL, _("Missing required option '%s'"), name);
+        }
+    }
 
-    if (found)
-        *found = arg ? TRUE : FALSE;
-
-    if (arg && arg->data && *arg->data)
-        return arg->data;
-
-    if (arg && arg->def && ((arg->def->flag) & VSH_OFLAG_REQ))
-        vshError(NULL, _("Missing required option '%s'"), name);
-
-    return NULL;
+    return ret;
 }
 
 /*
  * Returns option as long long
+ * See vshCommandOptInt()
  */
-static long long
-vshCommandOptLongLong(const vshCmd *cmd, const char *name, int *found)
+static int
+vshCommandOptLongLong(const vshCmd *cmd, const char *name,
+                      unsigned long long *value)
 {
     vshCmdOpt *arg = vshCommandOpt(cmd, name);
-    int num_found = FALSE;
-    long long res = 0;
+    int ret = 0;
+    long long num;
     char *end_p = NULL;
 
-    if ((arg != NULL) && (arg->data != NULL))
-        num_found = !virStrToLong_ll(arg->data, &end_p, 10, &res);
-    if (found)
-        *found = num_found;
-    return res;
+    if ((arg != NULL) && (arg->data != NULL)) {
+        num = strtoll(arg->data, &end_p, 10);
+        ret = -1;
+        if ((arg->data != end_p) && (*end_p == 0) && value) {
+            *value = num;
+            ret = 1;
+        }
+    }
+    return ret;
 }
 
 /*
@@ -10941,13 +10890,13 @@ vshCommandOptDomainBy(vshControl *ctl, const vshCmd *cmd,
                       const char **name, int flag)
 {
     virDomainPtr dom = NULL;
-    const char *n;
+    const char *n = NULL;
     int id;
     const char *optname = "domain";
     if (!cmd_has_option (ctl, cmd, optname))
         return NULL;
 
-    if (!(n = vshCommandOptString(cmd, optname, NULL)))
+    if (vshCommandOptString(cmd, optname, &n) <= 0)
         return NULL;
 
     vshDebug(ctl, 5, "%s: found option <%s>: %s\n",
@@ -10988,12 +10937,12 @@ vshCommandOptNetworkBy(vshControl *ctl, const vshCmd *cmd,
                        const char **name, int flag)
 {
     virNetworkPtr network = NULL;
-    const char *n;
+    const char *n = NULL;
     const char *optname = "network";
     if (!cmd_has_option (ctl, cmd, optname))
         return NULL;
 
-    if (!(n = vshCommandOptString(cmd, optname, NULL)))
+    if (vshCommandOptString(cmd, optname, &n) <= 0)
         return NULL;
 
     vshDebug(ctl, 5, "%s: found option <%s>: %s\n",
@@ -11027,12 +10976,12 @@ vshCommandOptNWFilterBy(vshControl *ctl, const vshCmd *cmd,
                         const char **name, int flag)
 {
     virNWFilterPtr nwfilter = NULL;
-    const char *n;
+    const char *n = NULL;
     const char *optname = "nwfilter";
     if (!cmd_has_option (ctl, cmd, optname))
         return NULL;
 
-    if (!(n = vshCommandOptString(cmd, optname, NULL)))
+    if (vshCommandOptString(cmd, optname, &n) <= 0)
         return NULL;
 
     vshDebug(ctl, 5, "%s: found option <%s>: %s\n",
@@ -11065,12 +11014,12 @@ vshCommandOptInterfaceBy(vshControl *ctl, const vshCmd *cmd,
                          const char **name, int flag)
 {
     virInterfacePtr iface = NULL;
-    const char *n;
+    const char *n = NULL;
     const char *optname = "interface";
     if (!cmd_has_option (ctl, cmd, optname))
         return NULL;
 
-    if (!(n = vshCommandOptString(cmd, optname, NULL)))
+    if (vshCommandOptString(cmd, optname, &n) <= 0)
         return NULL;
 
     vshDebug(ctl, 5, "%s: found option <%s>: %s\n",
@@ -11103,9 +11052,9 @@ vshCommandOptPoolBy(vshControl *ctl, const vshCmd *cmd, const char *optname,
                     const char **name, int flag)
 {
     virStoragePoolPtr pool = NULL;
-    const char *n;
+    const char *n = NULL;
 
-    if (!(n = vshCommandOptString(cmd, optname, NULL)))
+    if (vshCommandOptString(cmd, optname, &n) <= 0)
         return NULL;
 
     vshDebug(ctl, 5, "%s: found option <%s>: %s\n",
@@ -11141,13 +11090,12 @@ vshCommandOptVolBy(vshControl *ctl, const vshCmd *cmd,
 {
     virStorageVolPtr vol = NULL;
     virStoragePoolPtr pool = NULL;
-    const char *n, *p;
-    int found;
+    const char *n = NULL, *p = NULL;
 
-    if (!(n = vshCommandOptString(cmd, optname, NULL)))
+    if (vshCommandOptString(cmd, optname, &n) <= 0)
         return NULL;
 
-    if (!(p = vshCommandOptString(cmd, pooloptname, &found)) && found)
+    if (vshCommandOptString(cmd, pooloptname, &p) < 0)
         return NULL;
 
     if (p)
@@ -11191,14 +11139,13 @@ static virSecretPtr
 vshCommandOptSecret(vshControl *ctl, const vshCmd *cmd, const char **name)
 {
     virSecretPtr secret = NULL;
-    const char *n;
+    const char *n = NULL;
     const char *optname = "secret";
 
     if (!cmd_has_option (ctl, cmd, optname))
         return NULL;
 
-    n = vshCommandOptString(cmd, optname, NULL);
-    if (n == NULL)
+    if (vshCommandOptString(cmd, optname, &n) <= 0)
         return NULL;
 
     vshDebug(ctl, 5, "%s: found option <%s>: %s\n", cmd->def->name, optname, n);
-- 
1.7.4




More information about the libvir-list mailing list