virsh: Add helper to request string arguments with error reporting

This patch adds a helper function with similar semantics to
vshCommandOptString that requests a string argument, but does some error
reporting without the need to do it in the functions themselves.

The error reporting also provides information about the parameter whose
retrieval failed.
This commit is contained in:
Peter Krempa 2013-01-14 14:38:38 +01:00
parent d1de0c3d1a
commit 41b5e8451b
2 changed files with 56 additions and 0 deletions

View File

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

View File

@ -275,6 +275,10 @@ int vshCommandOptUL(const vshCmd *cmd, const char *name,
int vshCommandOptString(const vshCmd *cmd, const char *name, int vshCommandOptString(const vshCmd *cmd, const char *name,
const char **value) const char **value)
ATTRIBUTE_NONNULL(3) ATTRIBUTE_RETURN_CHECK; ATTRIBUTE_NONNULL(3) ATTRIBUTE_RETURN_CHECK;
int vshCommandOptStringReq(vshControl *ctl, const vshCmd *cmd,
const char *name, const char **value)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3)
ATTRIBUTE_NONNULL(4) ATTRIBUTE_RETURN_CHECK;
int vshCommandOptLongLong(const vshCmd *cmd, const char *name, int vshCommandOptLongLong(const vshCmd *cmd, const char *name,
long long *value) long long *value)
ATTRIBUTE_NONNULL(3) ATTRIBUTE_RETURN_CHECK; ATTRIBUTE_NONNULL(3) ATTRIBUTE_RETURN_CHECK;