All APIs that take typed parameters are only using params address in their entry point debug messages. With the new VIR_TYPED_PARAMS_DEBUG macro, all functions can easily log all individual typed parameters passed to them. --- docs/apibuild.py | 1 + src/libvirt_private.syms | 3 +++ src/util/virtypedparam.c | 41 ++++++++++++++++++++++++++++++++++++++++- src/util/virtypedparam.h | 18 ++++++++++++++++++ 4 files changed, 62 insertions(+), 1 deletion(-) diff --git a/docs/apibuild.py b/docs/apibuild.py index c816197..e0996bf 100755 --- a/docs/apibuild.py +++ b/docs/apibuild.py @@ -67,6 +67,7 @@ ignored_functions = { "virTypedParamsValidate": "internal function in virtypedparam.c", "virTypedParameterAssign": "internal function in virtypedparam.c", "virTypedParameterAssignFromStr": "internal function in virtypedparam.c", + "virTypedParameterToString": "internal function in virtypedparam.c", "virTypedParamsCheck": "internal function in virtypedparam.c", } diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 4e01073..0e0c3bc 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1899,6 +1899,9 @@ virTPMCreateCancelPath; # util/virtypedparam.h virTypedParameterAssign; virTypedParameterAssignFromStr; +virTypedParameterToString; +virTypedParameterTypeFromString; +virTypedParameterTypeToString; virTypedParamsCheck; virTypedParamsReplaceString; virTypedParamsValidate; diff --git a/src/util/virtypedparam.c b/src/util/virtypedparam.c index 760bb05..8b18a5a 100644 --- a/src/util/virtypedparam.c +++ b/src/util/virtypedparam.c @@ -31,7 +31,6 @@ #define VIR_FROM_THIS VIR_FROM_NONE -VIR_ENUM_DECL(virTypedParameter) VIR_ENUM_IMPL(virTypedParameter, VIR_TYPED_PARAM_LAST, "unknown", "int", @@ -135,6 +134,46 @@ virTypedParamsCheck(virTypedParameterPtr params, return true; } +char * +virTypedParameterToString(virTypedParameterPtr param) +{ + char *value; + int ret = -1; + + switch (param->type) { + case VIR_TYPED_PARAM_INT: + ret = virAsprintf(&value, "%d", param->value.i); + break; + case VIR_TYPED_PARAM_UINT: + ret = virAsprintf(&value, "%u", param->value.ui); + break; + case VIR_TYPED_PARAM_LLONG: + ret = virAsprintf(&value, "%lld", param->value.l); + break; + case VIR_TYPED_PARAM_ULLONG: + ret = virAsprintf(&value, "%llu", param->value.ul); + break; + case VIR_TYPED_PARAM_DOUBLE: + ret = virAsprintf(&value, "%g", param->value.d); + break; + case VIR_TYPED_PARAM_BOOLEAN: + ret = virAsprintf(&value, "%d", param->value.b); + break; + case VIR_TYPED_PARAM_STRING: + ret = VIR_STRDUP(value, param->value.s); + break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("unexpected type %d for field %s"), + param->type, param->field); + } + + if (ret < 0) + return NULL; + else + return value; +} + /* Assign name, type, and the appropriately typed arg to param; in the * case of a string, the caller is assumed to have malloc'd a string, * or can pass NULL to have this function malloc an empty string. diff --git a/src/util/virtypedparam.h b/src/util/virtypedparam.h index 6eb61c4..ca062c0 100644 --- a/src/util/virtypedparam.h +++ b/src/util/virtypedparam.h @@ -24,6 +24,7 @@ # define __VIR_TYPED_PARAM_H_ # include "internal.h" +# include "virutil.h" int virTypedParamsValidate(virTypedParameterPtr params, int nparams, /* const char *name, int type ... */ ...) @@ -49,4 +50,21 @@ int virTypedParamsReplaceString(virTypedParameterPtr *params, const char *name, const char *value); +char *virTypedParameterToString(virTypedParameterPtr param); + +VIR_ENUM_DECL(virTypedParameter) + +# define VIR_TYPED_PARAMS_DEBUG(params, nparams) \ + do { \ + int _i; \ + for (_i = 0; _i < (nparams); _i++) { \ + char *_value = virTypedParameterToString((params) + _i); \ + VIR_DEBUG("params[\"%s\"]=(%s)%s", \ + (params)[_i].field, \ + virTypedParameterTypeToString((params)[_i].type), \ + NULLSTR(_value)); \ + VIR_FREE(_value); \ + } \ + } while (0) + #endif /* __VIR_TYPED_PARAM_H */ -- 1.8.2.1 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list