From: Peter Krempa <pkrempa@redhat.com> Create 'virTypedParamValidateType' which will use the same logic encapsulated in a function. Use the error message wording from 'virTypedParamsValidate' as it contains less fluff. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/util/virtypedparam-public.c | 54 +++++++++++++++++++++------------ src/util/virtypedparam.c | 27 +++++++++++++++++ src/util/virtypedparam.h | 4 +++ 3 files changed, 66 insertions(+), 19 deletions(-) diff --git a/src/util/virtypedparam-public.c b/src/util/virtypedparam-public.c index 3486623a9c..8a953ed20f 100644 --- a/src/util/virtypedparam-public.c +++ b/src/util/virtypedparam-public.c @@ -147,18 +147,6 @@ virTypedParamsGet(virTypedParameterPtr params, } -#define VIR_TYPED_PARAM_CHECK_TYPE(check_type) \ - do { if (param->type != check_type) { \ - virReportError(VIR_ERR_INVALID_ARG, \ - _("Invalid type '%1$s' requested for parameter '%2$s', actual type is '%3$s'"), \ - virTypedParameterTypeToString(check_type), \ - name, \ - virTypedParameterTypeToString(param->type)); \ - virDispatchError(NULL); \ - return -1; \ - } } while (0) - - /** * virTypedParamsGetInt: * @params: array of typed parameters @@ -189,7 +177,11 @@ virTypedParamsGetInt(virTypedParameterPtr params, if (!(param = virTypedParamsGet(params, nparams, name))) return 0; - VIR_TYPED_PARAM_CHECK_TYPE(VIR_TYPED_PARAM_INT); + if (virTypedParamValidateType(param, VIR_TYPED_PARAM_INT) < 0) { + virDispatchError(NULL); + return -1; + } + if (value) *value = param->value.i; @@ -227,7 +219,11 @@ virTypedParamsGetUInt(virTypedParameterPtr params, if (!(param = virTypedParamsGet(params, nparams, name))) return 0; - VIR_TYPED_PARAM_CHECK_TYPE(VIR_TYPED_PARAM_UINT); + if (virTypedParamValidateType(param, VIR_TYPED_PARAM_UINT) < 0) { + virDispatchError(NULL); + return -1; + } + if (value) *value = param->value.ui; @@ -265,7 +261,11 @@ virTypedParamsGetLLong(virTypedParameterPtr params, if (!(param = virTypedParamsGet(params, nparams, name))) return 0; - VIR_TYPED_PARAM_CHECK_TYPE(VIR_TYPED_PARAM_LLONG); + if (virTypedParamValidateType(param, VIR_TYPED_PARAM_LLONG) < 0) { + virDispatchError(NULL); + return -1; + } + if (value) *value = param->value.l; @@ -303,7 +303,11 @@ virTypedParamsGetULLong(virTypedParameterPtr params, if (!(param = virTypedParamsGet(params, nparams, name))) return 0; - VIR_TYPED_PARAM_CHECK_TYPE(VIR_TYPED_PARAM_ULLONG); + if (virTypedParamValidateType(param, VIR_TYPED_PARAM_ULLONG) < 0) { + virDispatchError(NULL); + return -1; + } + if (value) *value = param->value.ul; @@ -341,7 +345,11 @@ virTypedParamsGetDouble(virTypedParameterPtr params, if (!(param = virTypedParamsGet(params, nparams, name))) return 0; - VIR_TYPED_PARAM_CHECK_TYPE(VIR_TYPED_PARAM_DOUBLE); + if (virTypedParamValidateType(param, VIR_TYPED_PARAM_DOUBLE) < 0) { + virDispatchError(NULL); + return -1; + } + if (value) *value = param->value.d; @@ -379,7 +387,11 @@ virTypedParamsGetBoolean(virTypedParameterPtr params, if (!(param = virTypedParamsGet(params, nparams, name))) return 0; - VIR_TYPED_PARAM_CHECK_TYPE(VIR_TYPED_PARAM_BOOLEAN); + if (virTypedParamValidateType(param, VIR_TYPED_PARAM_BOOLEAN) < 0) { + virDispatchError(NULL); + return -1; + } + if (value) *value = !!param->value.b; @@ -419,7 +431,11 @@ virTypedParamsGetString(virTypedParameterPtr params, if (!(param = virTypedParamsGet(params, nparams, name))) return 0; - VIR_TYPED_PARAM_CHECK_TYPE(VIR_TYPED_PARAM_STRING); + if (virTypedParamValidateType(param, VIR_TYPED_PARAM_STRING) < 0) { + virDispatchError(NULL); + return -1; + } + if (value) *value = param->value.s; diff --git a/src/util/virtypedparam.c b/src/util/virtypedparam.c index f25530a735..0b40c14f90 100644 --- a/src/util/virtypedparam.c +++ b/src/util/virtypedparam.c @@ -42,6 +42,33 @@ VIR_ENUM_IMPL(virTypedParameter, "string", ); + +/** + * virTypedParamValidateType: + * @param: typed parameter to validate + * @expected_type: type to look for + * + * Validates that @param is a parameter of @expected type. + * + * Returns 0 on success; -1 on error and reports an error. + */ +int +virTypedParamValidateType(virTypedParameterPtr param, + unsigned int expected_type) +{ + if (param->type != expected_type) { + virReportError(VIR_ERR_INVALID_ARG, + _("invalid type '%1$s' for parameter '%2$s', expected '%3$s'"), + virTypedParameterTypeToString(expected_type), + param->field, + virTypedParameterTypeToString(param->type)); + return -1; + } + + return 0; +} + + static int virTypedParamsSortName(const void *left, const void *right, diff --git a/src/util/virtypedparam.h b/src/util/virtypedparam.h index 774744244a..c1fc28c612 100644 --- a/src/util/virtypedparam.h +++ b/src/util/virtypedparam.h @@ -63,6 +63,10 @@ struct _virTypedParameterRemote { virTypedParameterRemoteValue value; }; +int +virTypedParamValidateType(virTypedParameterPtr param, + unsigned int expected_type) + G_GNUC_WARN_UNUSED_RESULT; int virTypedParamsValidate(virTypedParameterPtr params, -- 2.54.0