[libvirt] [PATCH] esx: Improve error reporting for unknown VI types

Matthias Bolte matthias.bolte at googlemail.com
Sat Jul 21 20:51:08 UTC 2012


Print the actual unknown type name instead of <other> for AnyType objects.
---
 src/esx/esx_vi.c       |    2 +-
 src/esx/esx_vi_types.c |   36 +++++++++++++++++++++++++-----------
 src/esx/esx_vi_types.h |    1 +
 3 files changed, 27 insertions(+), 12 deletions(-)

diff --git a/src/esx/esx_vi.c b/src/esx/esx_vi.c
index b1b5d70..9fa37e1 100644
--- a/src/esx/esx_vi.c
+++ b/src/esx/esx_vi.c
@@ -1481,7 +1481,7 @@ esxVI_Enumeration_CastFromAnyType(const esxVI_Enumeration *enumeration,
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("Expecting type '%s' but found '%s'"),
                        esxVI_Type_ToString(enumeration->type),
-                       esxVI_Type_ToString(anyType->type));
+                       esxVI_AnyType_TypeToString(anyType));
         return -1;
     }
 
diff --git a/src/esx/esx_vi_types.c b/src/esx/esx_vi_types.c
index 9e67eff..cbc92d6 100644
--- a/src/esx/esx_vi_types.c
+++ b/src/esx/esx_vi_types.c
@@ -533,8 +533,8 @@
  * Macros to implement dynamic dispatched functions
  */
 
-#define ESX_VI__TEMPLATE__DISPATCH(_actual_type, __type, _dispatch,           \
-                                   _error_return)                             \
+#define ESX_VI__TEMPLATE__DISPATCH(_actual_type, _actual_type_name, __type,   \
+                                   _dispatch,  _error_return)                 \
     switch (_actual_type) {                                                   \
       _dispatch                                                               \
                                                                               \
@@ -543,8 +543,8 @@
                                                                               \
       default:                                                                \
         virReportError(VIR_ERR_INTERNAL_ERROR,                                \
-                       _("Call to %s for unexpected type '%s'"), __FUNCTION__,\
-                       esxVI_Type_ToString(_actual_type));                    \
+                       _("Call to %s for unexpected type '%s'"),              \
+                       __FUNCTION__, _actual_type_name);                      \
         return _error_return;                                                 \
     }
 
@@ -586,7 +586,9 @@
 
 #define ESX_VI__TEMPLATE__DYNAMIC_FREE(__type, _dispatch, _body)              \
     ESX_VI__TEMPLATE__FREE(__type,                                            \
-      ESX_VI__TEMPLATE__DISPATCH(item->_type, __type, _dispatch,              \
+      ESX_VI__TEMPLATE__DISPATCH(item->_type,                                 \
+                                 esxVI_Type_ToString(item->_type),            \
+                                 __type, _dispatch,                           \
                                  /* nothing */)                               \
       _body)
 
@@ -620,14 +622,18 @@
 
 #define ESX_VI__TEMPLATE__DYNAMIC_CAST_FROM_ANY_TYPE(__type, _dispatch)       \
     ESX_VI__TEMPLATE__CAST_FROM_ANY_TYPE_EXTRA(__type, esxVI_##__type,        \
-      ESX_VI__TEMPLATE__DISPATCH(anyType->type, __type, _dispatch, -1),       \
+      ESX_VI__TEMPLATE__DISPATCH(anyType->type,                               \
+                                 esxVI_AnyType_TypeToString(anyType),         \
+                                __type, _dispatch, -1),                       \
       /* nothing */)
 
 
 
 #define ESX_VI__TEMPLATE__DYNAMIC_SERIALIZE(__type, _dispatch, _serialize)    \
     ESX_VI__TEMPLATE__SERIALIZE_EXTRA(__type,                                 \
-      ESX_VI__TEMPLATE__DISPATCH(item->_type, __type, _dispatch, -1),         \
+      ESX_VI__TEMPLATE__DISPATCH(item->_type,                                 \
+                                 esxVI_Type_ToString(item->_type),            \
+                                 __type, _dispatch, -1),                      \
       _serialize)
 
 
@@ -683,7 +689,7 @@ esxVI_GetActualObjectType(xmlNodePtr node, esxVI_Type baseType,
 
     *actualType = esxVI_Type_FromString(type);
 
-    if (*actualType == esxVI_Type_Undefined) {
+    if (*actualType == esxVI_Type_Undefined || *actualType == esxVI_Type_Other) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("Unknown value '%s' for %s 'type' property"),
                        type, esxVI_Type_ToString(baseType));
@@ -862,6 +868,16 @@ ESX_VI__TEMPLATE__FREE(AnyType,
     VIR_FREE(item->value);
 })
 
+const char *
+esxVI_AnyType_TypeToString(esxVI_AnyType *anyType)
+{
+    if (anyType->type == esxVI_Type_Other) {
+        return anyType->other;
+    } else {
+        return esxVI_Type_ToString(anyType->type);
+    }
+}
+
 int
 esxVI_AnyType_ExpectType(esxVI_AnyType *anyType, esxVI_Type type)
 {
@@ -869,9 +885,7 @@ esxVI_AnyType_ExpectType(esxVI_AnyType *anyType, esxVI_Type type)
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("Expecting type '%s' but found '%s'"),
                        esxVI_Type_ToString(type),
-                       anyType->type != esxVI_Type_Other
-                       ? esxVI_Type_ToString(anyType->type)
-                       : anyType->other);
+                       esxVI_AnyType_TypeToString(anyType));
         return -1;
     }
 
diff --git a/src/esx/esx_vi_types.h b/src/esx/esx_vi_types.h
index 3d843bf..d412a8f 100644
--- a/src/esx/esx_vi_types.h
+++ b/src/esx/esx_vi_types.h
@@ -154,6 +154,7 @@ struct _esxVI_AnyType {
 
 int esxVI_AnyType_Alloc(esxVI_AnyType **anyType);
 void esxVI_AnyType_Free(esxVI_AnyType **anyType);
+const char *esxVI_AnyType_TypeToString(esxVI_AnyType *anyType);
 int esxVI_AnyType_ExpectType(esxVI_AnyType *anyType, esxVI_Type type);
 int esxVI_AnyType_DeepCopy(esxVI_AnyType **dest, esxVI_AnyType *src);
 int esxVI_AnyType_Deserialize(xmlNodePtr node, esxVI_AnyType **anyType);
-- 
1.7.4.1




More information about the libvir-list mailing list