]> xenbits.xensource.com Git - libvirt.git/commitdiff
util: add a virReportEnumRangeError for bad value reporting
authorDaniel P. Berrangé <berrange@redhat.com>
Tue, 20 Feb 2018 15:56:52 +0000 (15:56 +0000)
committerDaniel P. Berrangé <berrange@redhat.com>
Wed, 21 Feb 2018 16:42:34 +0000 (16:42 +0000)
To ensure we have standardized error messages when reporting problems
with enum values being out of a range, add virReportEnumRangeError().

   virReportEnumRangeError(virDomainState, 34);

results in a message

   "internal error: Unexpected enum value 34 for virDomainState"

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
src/util/virerror.h

index cf434f45fca9cbb6d8b764e5089491cbab5fca91..f0df8f24de628977f780cb9cb244f80b256a5967 100644 (file)
@@ -164,7 +164,16 @@ void virReportSystemErrorFull(int domcode,
 # define virReportRestrictedError(...) \
     virReportErrorHelper(VIR_FROM_THIS, VIR_ERR_OPERATION_DENIED, \
                          __FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
-
+/* The sizeof(...) comparison here is a hack to catch typos
+ * in the name of the enum by triggering a compile error, as well
+ * as detecting if you passed a typename that refers to a function
+ * or struct type, instead of an enum. It should get optimized away
+ * since sizeof() is known at compile time  */
+# define virReportEnumRangeError(typname, value) \
+    virReportErrorHelper(VIR_FROM_THIS, VIR_ERR_INTERNAL_ERROR, \
+                         __FILE__, __FUNCTION__, __LINE__, \
+                         "Unexpected enum value %d for %s", \
+                         value, sizeof((typename)1) != 0 ? #typname : #typname);
 
 void virReportOOMErrorFull(int domcode,
                            const char *filename,