[PATCH v3 19/25] virTypedParamsValidate: Allow typed params to be both _UINT and _ULLONG

Peter Krempa pkrempa at redhat.com
Wed Apr 19 12:04:36 UTC 2023


For certain typed parameters we want to extend the supproted range by
switching to VIR_TYPED_PARAM_ULLONG. To preserve compatibility we've
added APIs such as 'virTypedParamsGetUnsigned' and
'virTypedParamListAddUnsigned' which automatically select the bigger
type if necessary.

This patch adds a new internal macro VIR_TYPED_PARAM_UNSIGNED which
is used with virTypedParamsValidate to allow both types and adjusts the
code to handle it properly.

Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---
 src/util/virtypedparam.c | 19 ++++++++++++++-----
 src/util/virtypedparam.h |  9 +++++++++
 2 files changed, 23 insertions(+), 5 deletions(-)

diff --git a/src/util/virtypedparam.c b/src/util/virtypedparam.c
index c71d4415a1..c3bc1237c1 100644
--- a/src/util/virtypedparam.c
+++ b/src/util/virtypedparam.c
@@ -63,7 +63,6 @@ virTypedParamsValidate(virTypedParameterPtr params, int nparams, ...)
     size_t j;
     const char *name;
     const char *last_name = NULL;
-    int type;
     size_t nkeys = 0;
     size_t nkeysalloc = 0;
     g_autofree virTypedParameterPtr sorted = NULL;
@@ -79,7 +78,7 @@ virTypedParamsValidate(virTypedParameterPtr params, int nparams, ...)

     name = va_arg(ap, const char *);
     while (name) {
-        type = va_arg(ap, int);
+        int type = va_arg(ap, int);
         VIR_RESIZE_N(keys, nkeysalloc, nkeys, 1);

         if (virStrcpyStatic(keys[nkeys].field, name) < 0) {
@@ -105,6 +104,9 @@ virTypedParamsValidate(virTypedParameterPtr params, int nparams, ...)
         if (STRNEQ(sorted[i].field, keys[j].field)) {
             j++;
         } else {
+            const char *expecttype = virTypedParameterTypeToString(keys[j].type);
+            int type = sorted[i].type;
+
             if (STREQ_NULLABLE(last_name, sorted[i].field) &&
                 !(keys[j].value.i & VIR_TYPED_PARAM_MULTIPLE)) {
                 virReportError(VIR_ERR_INVALID_ARG,
@@ -112,7 +114,15 @@ virTypedParamsValidate(virTypedParameterPtr params, int nparams, ...)
                                sorted[i].field);
                 return -1;
             }
-            if (sorted[i].type != keys[j].type) {
+
+            if (keys[j].type == VIR_TYPED_PARAM_UNSIGNED &&
+                (type == VIR_TYPED_PARAM_UINT ||
+                 type == VIR_TYPED_PARAM_ULLONG)) {
+                type = VIR_TYPED_PARAM_UNSIGNED;
+                expecttype = "uint, ullong";
+            }
+
+            if (type != keys[j].type) {
                 const char *badtype;

                 badtype = virTypedParameterTypeToString(sorted[i].type);
@@ -120,8 +130,7 @@ virTypedParamsValidate(virTypedParameterPtr params, int nparams, ...)
                     badtype = virTypedParameterTypeToString(0);
                 virReportError(VIR_ERR_INVALID_ARG,
                                _("invalid type '%1$s' for parameter '%2$s', expected '%3$s'"),
-                               badtype, sorted[i].field,
-                               virTypedParameterTypeToString(keys[j].type));
+                               badtype, sorted[i].field, expecttype);
                 return -1;
             }
             last_name = sorted[i].field;
diff --git a/src/util/virtypedparam.h b/src/util/virtypedparam.h
index c2f58e994c..7454ef3ce0 100644
--- a/src/util/virtypedparam.h
+++ b/src/util/virtypedparam.h
@@ -24,6 +24,15 @@
 #include "internal.h"
 #include "virenum.h"

+
+/**
+ * VIR_TYPED_PARAM_UNSIGNED:
+ *
+ * Special typed parameter type only used with virTypedParamsValidate to
+ * indicate that both VIR_TYPED_PARAM_UINT and VIR_TYPED_PARAM_ULLONG types
+ * are acceptable for given value.
+ */
+#define VIR_TYPED_PARAM_UNSIGNED (VIR_TYPED_PARAM_LAST + 1)
 /**
  * VIR_TYPED_PARAM_MULTIPLE:
  *
-- 
2.39.2



More information about the libvir-list mailing list