From d03f199595dc0b0a8f3726e13cc284d62e789202 Mon Sep 17 00:00:00 2001 From: Michal Privoznik Date: Tue, 8 Mar 2011 17:29:31 +0100 Subject: [PATCH] virsh: Change option parsing functions to return tri-state information 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 | 644 ++++++++++++++++++++++++-------------------------- 1 file changed, 309 insertions(+), 335 deletions(-) diff --git a/tools/virsh.c b/tools/virsh.c index f7e14747c0..14c6d6b0b0 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -252,13 +252,17 @@ 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) ATTRIBUTE_RETURN_CHECK; +static int vshCommandOptUL(const vshCmd *cmd, const char *name, + unsigned long *value) + ATTRIBUTE_NONNULL(3) ATTRIBUTE_RETURN_CHECK; +static int vshCommandOptString(const vshCmd *cmd, const char *name, + const char **value) + ATTRIBUTE_NONNULL(3) ATTRIBUTE_RETURN_CHECK; +static int vshCommandOptLongLong(const vshCmd *cmd, const char *name, + long long *value) + ATTRIBUTE_NONNULL(3) ATTRIBUTE_RETURN_CHECK; static int vshCommandOptBool(const vshCmd *cmd, const char *name); static char *vshCommandOptArgv(const vshCmd *cmd, int count); @@ -589,11 +593,9 @@ static const vshCmdOptDef opts_help[] = { static int cmdHelp(vshControl *ctl, const vshCmd *cmd) { - const char *name; + const char *name = NULL; - name = vshCommandOptString(cmd, "command", NULL); - - if (!name) { + if (vshCommandOptString(cmd, "command", &name) <= 0) { const vshCmdGrp *grp; const vshCmdDef *def; @@ -692,7 +694,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 +706,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 +774,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 +782,8 @@ cmdConsole(vshControl *ctl, const vshCmd *cmd) if (!(dom = vshCommandOptDomain(ctl, cmd, NULL))) return FALSE; - name = vshCommandOptString(cmd, "devname", NULL); + if (vshCommandOptString(cmd, "devname", &name) < 0) + return FALSE; ret = cmdRunConsole(ctl, dom, name); @@ -964,7 +966,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 +975,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 +1023,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 +1032,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 +1146,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 +1154,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 +1232,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 +1243,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 +1288,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 +1334,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 +1450,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 +1590,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 +1611,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 +1620,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 +1739,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 +1797,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 +1836,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))) @@ -2284,7 +2275,7 @@ cmdFreecell(vshControl *ctl, const vshCmd *cmd) { int func_ret = FALSE; int ret; - int cell, cell_given; + int cell = -1, cell_given; unsigned long long memory; xmlNodePtr *nodes = NULL; unsigned long nodes_cnt; @@ -2300,7 +2291,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 +2406,11 @@ 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); + if (vshCommandOptString(cmd, "type", &type) < 0) + return FALSE; if (!vshConnectionUsability(ctl, ctl->conn)) return FALSE; @@ -2712,9 +2707,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 +2720,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 +2855,8 @@ cmdSetvcpus(vshControl *ctl, const vshCmd *cmd) if (!(dom = vshCommandOptDomain(ctl, cmd, NULL))) return FALSE; - count = vshCommandOptInt(cmd, "count", &count); + if (vshCommandOptInt(cmd, "count", &count) < 0) + return FALSE; if (!flags) { if (virDomainSetVcpus(dom, count) != 0) { @@ -2918,7 +2912,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 +2921,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 +2973,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 +2982,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 size has to be a number")); + return FALSE; + } + if (kilobytes <= 0) { virDomainFree(dom); vshError(ctl, _("Invalid value of %d for memory size"), kilobytes); @@ -3043,7 +3045,8 @@ 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; + long long min_guarantee = 0; int nparams = 0; unsigned int i = 0; virMemoryParameterPtr params = NULL, temp = NULL; @@ -3055,23 +3058,24 @@ cmdMemtune(vshControl * ctl, const vshCmd * cmd) if (!(dom = vshCommandOptDomain(ctl, cmd, NULL))) return FALSE; - hard_limit = - vshCommandOptLongLong(cmd, "hard-limit", NULL); + if (vshCommandOptLongLong(cmd, "hard-limit", &hard_limit) < 0 || + vshCommandOptLongLong(cmd, "soft-limit", &soft_limit) < 0 || + vshCommandOptLongLong(cmd, "swap-hard-limit", &swap_hard_limit) < 0 || + vshCommandOptLongLong(cmd, "min-guarantee", &min_guarantee) < 0) { + vshError(ctl, "%s", + _("Unable to parse integer parameter")); + goto cleanup; + } + if (hard_limit) nparams++; - soft_limit = - vshCommandOptLongLong(cmd, "soft-limit", NULL); if (soft_limit) nparams++; - swap_hard_limit = - vshCommandOptLongLong(cmd, "swap-hard-limit", NULL); if (swap_hard_limit) nparams++; - min_guarantee = - vshCommandOptLongLong(cmd, "min-guarantee", NULL); if (min_guarantee) nparams++; @@ -3315,8 +3319,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 +3328,9 @@ cmdDomXMLFromNative(vshControl *ctl, const vshCmd *cmd) if (!vshConnectionUsability(ctl, ctl->conn)) return FALSE; - format = vshCommandOptString(cmd, "format", NULL); - configFile = vshCommandOptString(cmd, "config", NULL); + if (vshCommandOptString(cmd, "format", &format) < 0 || + vshCommandOptString(cmd, "config", &configFile) < 0) + return FALSE; if (virFileReadAll(configFile, 1024*1024, &configData) < 0) return FALSE; @@ -3360,8 +3365,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 +3374,9 @@ cmdDomXMLToNative(vshControl *ctl, const vshCmd *cmd) if (!vshConnectionUsability(ctl, ctl->conn)) return FALSE; - format = vshCommandOptString(cmd, "format", NULL); - xmlFile = vshCommandOptString(cmd, "xml", NULL); + if (vshCommandOptString(cmd, "format", &format) < 0 + || vshCommandOptString(cmd, "xml", &xmlFile) < 0) + return FALSE; if (virFileReadAll(xmlFile, 1024*1024, &xmlData) < 0) return FALSE; @@ -3525,10 +3531,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,14 +3553,11 @@ doMigrate (void *opaque) if (!(dom = vshCommandOptDomain (ctl, cmd, NULL))) goto out; - desturi = vshCommandOptString (cmd, "desturi", &found); - if (!found) + if (vshCommandOptString(cmd, "desturi", &desturi) <= 0 || + vshCommandOptString(cmd, "migrateuri", &migrateuri) < 0 || + vshCommandOptString(cmd, "dname", &dname) < 0) goto out; - migrateuri = vshCommandOptString (cmd, "migrateuri", NULL); - - dname = vshCommandOptString (cmd, "dname", NULL); - if (vshCommandOptBool (cmd, "live")) flags |= VIR_MIGRATE_LIVE; if (vshCommandOptBool (cmd, "p2p")) @@ -3645,13 +3648,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 +3672,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 +3688,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 +3796,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 +3805,8 @@ cmdMigrateSetMaxDowntime(vshControl *ctl, const vshCmd *cmd) if (!(dom = vshCommandOptDomain(ctl, cmd, NULL))) return FALSE; - downtime = vshCommandOptLongLong(cmd, "downtime", &found); - if (!found || downtime < 1) { + if (vshCommandOptLongLong(cmd, "downtime", &downtime) < 0 || + downtime < 1) { vshError(ctl, "%s", _("migrate: Invalid downtime")); goto done; } @@ -3890,16 +3888,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 +3934,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 +4705,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 +4865,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 +5204,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 +5254,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 +5304,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 +5345,22 @@ 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); + if (vshCommandOptString(cmd, "source-host", &srcHost) < 0 || + vshCommandOptString(cmd, "source-path", &srcPath) < 0 || + vshCommandOptString(cmd, "source-dev", &srcDev) < 0 || + vshCommandOptString(cmd, "source-name", &srcName) < 0 || + vshCommandOptString(cmd, "source-format", &srcFormat) < 0 || + vshCommandOptString(cmd, "target", &target) < 0) + goto cleanup; virBufferVSprintf(&buf, "\n", type); virBufferVSprintf(&buf, " %s\n", name); @@ -5480,16 +5461,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,30 +6157,28 @@ 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 || + vshCommandOptString(cmd, "host", &host) < 0 || + vshCommandOptString(cmd, "initiator", &initiator) < 0) return FALSE; - host = vshCommandOptString(cmd, "host", &found); - if (!found) - host = NULL; - initiator = vshCommandOptString(cmd, "initiator", &found); - if (!found) - initiator = NULL; if (!vshConnectionUsability(ctl, ctl->conn)) return FALSE; if (host) { - const char *port = vshCommandOptString(cmd, "port", &found); - if (!found) - port = NULL; + const char *port = NULL; virBuffer buf = VIR_BUFFER_INITIALIZER; + + if (vshCommandOptString(cmd, "port", &port) < 0) { + vshError(ctl, "%s", _("missing argument")); + virBufferFreeAndReset(&buf); + return FALSE; + } virBufferAddLit(&buf, "\n"); virBufferVSprintf(&buf, " conn)) return FALSE; @@ -6503,10 +6478,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 +6491,25 @@ 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); + if (vshCommandOptString(cmd, "format", &format) < 0 || + vshCommandOptString(cmd, "backing-vol", &snapshotStrVol) < 0 || + vshCommandOptString(cmd, "backing-vol-format", + &snapshotStrFormat) < 0) { + vshError(ctl, "%s", _("missing argument")); + } + virBufferAddLit(&buf, "\n"); virBufferVSprintf(&buf, " %s\n", name); @@ -6725,8 +6700,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 +6711,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 +6759,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 +6769,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 +6856,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 +6873,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 +7541,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 +7549,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 +7632,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 +7643,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 +8008,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 +8095,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 +8138,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 +8179,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 +8220,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 +8487,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 +8498,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 +8552,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 +8563,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 +8618,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 +8629,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 +8692,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 +8705,15 @@ 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); + if (vshCommandOptString(cmd, "source", &source) < 0 || + vshCommandOptString(cmd, "target", &target) < 0 || + vshCommandOptString(cmd, "mac", &mac) < 0 || + vshCommandOptString(cmd, "script", &script) < 0 || + vshCommandOptString(cmd, "model", &model) < 0) + goto cleanup; /* check interface type */ if (STREQ(type, "network")) { @@ -8842,7 +8804,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 +8816,11 @@ 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); + if (vshCommandOptString(cmd, "mac", &mac) < 0) + goto cleanup; doc = virDomainGetXMLDesc(dom, 0); if (!doc) @@ -8982,10 +8945,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 +8959,19 @@ 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); + if (vshCommandOptString(cmd, "driver", &driver) < 0 || + vshCommandOptString(cmd, "subdriver", &subdriver) < 0 || + vshCommandOptString(cmd, "type", &type) < 0 || + vshCommandOptString(cmd, "mode", &mode) < 0 || + vshCommandOptString(cmd, "sourcetype", &stype) < 0) { + goto cleanup; + } if (!stype) { if (driver && (STREQ(driver, "file") || STREQ(driver, "tap"))) @@ -9110,7 +9076,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 +9087,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 +9194,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 +9202,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 +9256,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 +9273,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 +9485,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 +9494,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); } @@ -9835,7 +9795,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; @@ -9850,8 +9810,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, ""); else { if (virFileReadAll(from, VIRSH_MAX_XML_FILE, &buffer) < 0) { @@ -10108,7 +10067,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; @@ -10119,8 +10078,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); @@ -10165,7 +10123,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)) @@ -10175,8 +10133,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); @@ -10218,7 +10175,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; @@ -10229,8 +10186,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")) @@ -10275,7 +10231,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; @@ -10286,8 +10242,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; } @@ -10803,83 +10758,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 = 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 = 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 (found) - *found = arg ? TRUE : FALSE; + 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 (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, + 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 = num; + ret = 1; + } + } + return ret; } /* @@ -10940,13 +10916,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", @@ -10987,12 +10963,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", @@ -11026,12 +11002,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", @@ -11064,12 +11040,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", @@ -11102,9 +11078,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", @@ -11140,13 +11116,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) @@ -11190,14 +11165,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);