[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [PATCH 05/21] Introduce VIR_TYPED_PARAMS_DEBUG macro for dumping typed params



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


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]