
On 18.06.2013 16:05, Jiri Denemark wrote:
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);
virAsprintf() doesn't report OOM error (yet) ...
+ break; + case VIR_TYPED_PARAM_STRING: + ret = VIR_STRDUP(value, param->value.s);
... while VIR_STRDUP does.
+ break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("unexpected type %d for field %s"), + param->type, param->field); + } + + if (ret < 0) + return NULL;
But I guess it doesn't matter, does it (esp. when each call is followed by virResetLastError();)
+ 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 { \
I'd rather check (params) != NULL here as it might avoid SIGSEGV in the next patch if user calls i.e. virDomainSetSchedulerParametersFlags(dom, NULL, 10, 0); But that's not a show stopper as users might pass invalid pointer anyway.
+ 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 */