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 */ > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list