summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2021-04-09 14:29:20 +0200
committerThomas Haller <thaller@redhat.com>2021-04-12 16:46:00 +0200
commit9a2c47fc34a6fe4ae95b80e27bf05d4d148f3e0e (patch)
treee893303eb9b2ac875c6afb013616e50dc3187424
parent6107a94085f3e99bdb31c4b684721f131cdd274a (diff)
downloadNetworkManager-9a2c47fc34a6fe4ae95b80e27bf05d4d148f3e0e.tar.gz
glib-aux: add int64/uint64 types to NMValueType
-rw-r--r--src/libnm-glib-aux/nm-json-aux.h54
-rw-r--r--src/libnm-glib-aux/nm-value-type.h34
2 files changed, 86 insertions, 2 deletions
diff --git a/src/libnm-glib-aux/nm-json-aux.h b/src/libnm-glib-aux/nm-json-aux.h
index 99759a8d27..1a4b539524 100644
--- a/src/libnm-glib-aux/nm-json-aux.h
+++ b/src/libnm-glib-aux/nm-json-aux.h
@@ -33,6 +33,12 @@ nm_json_gstr_append_int64(GString *gstr, gint64 v)
g_string_append_printf(gstr, "%" G_GINT64_FORMAT, v);
}
+static inline void
+nm_json_gstr_append_uint64(GString *gstr, guint64 v)
+{
+ g_string_append_printf(gstr, "%" G_GUINT64_FORMAT, v);
+}
+
void nm_json_gstr_append_obj_name(GString *gstr, const char *key, char start_container);
/*****************************************************************************/
@@ -240,6 +246,44 @@ nm_jansson_json_as_int(const NMJsonVt *vt, const nm_json_t *elem, int *out_val)
}
static inline int
+nm_jansson_json_as_int64(const NMJsonVt *vt, const nm_json_t *elem, gint64 *out_val)
+{
+ nm_json_int_t v;
+
+ if (!elem)
+ return 0;
+
+ if (!nm_json_is_integer(elem))
+ return -EINVAL;
+
+ v = vt->nm_json_integer_value(elem);
+ if (v < G_MININT64 || v > G_MAXINT64)
+ return -ERANGE;
+
+ NM_SET_OUT(out_val, v);
+ return 1;
+}
+
+static inline int
+nm_jansson_json_as_uint64(const NMJsonVt *vt, const nm_json_t *elem, guint64 *out_val)
+{
+ nm_json_int_t v;
+
+ if (!elem)
+ return 0;
+
+ if (!nm_json_is_integer(elem))
+ return -EINVAL;
+
+ v = vt->nm_json_integer_value(elem);
+ if (v < 0 || v > G_MAXUINT64)
+ return -ERANGE;
+
+ NM_SET_OUT(out_val, v);
+ return 1;
+}
+
+static inline int
nm_jansson_json_as_string(const NMJsonVt *vt, const nm_json_t *elem, const char **out_val)
{
if (!elem)
@@ -272,6 +316,12 @@ nm_value_type_to_json(NMValueType value_type, GString *gstr, gconstpointer p_fie
case NM_VALUE_TYPE_INT:
nm_json_gstr_append_int64(gstr, *((const int *) p_field));
return;
+ case NM_VALUE_TYPE_INT64:
+ nm_json_gstr_append_int64(gstr, *((const gint64 *) p_field));
+ return;
+ case NM_VALUE_TYPE_UINT64:
+ nm_json_gstr_append_uint64(gstr, *((const guint64 *) p_field));
+ return;
case NM_VALUE_TYPE_STRING:
nm_json_gstr_append_string(gstr, *((const char *const *) p_field));
return;
@@ -294,6 +344,10 @@ nm_value_type_from_json(const NMJsonVt * vt,
return (nm_jansson_json_as_int32(vt, elem, out_val) > 0);
case NM_VALUE_TYPE_INT:
return (nm_jansson_json_as_int(vt, elem, out_val) > 0);
+ case NM_VALUE_TYPE_INT64:
+ return (nm_jansson_json_as_int64(vt, elem, out_val) > 0);
+ case NM_VALUE_TYPE_UINT64:
+ return (nm_jansson_json_as_uint64(vt, elem, out_val) > 0);
/* warning: this overwrites/leaks the previous value. You better have *out_val
* point to uninitialized memory or NULL. */
diff --git a/src/libnm-glib-aux/nm-value-type.h b/src/libnm-glib-aux/nm-value-type.h
index f9edebdb6c..f1cce4800b 100644
--- a/src/libnm-glib-aux/nm-value-type.h
+++ b/src/libnm-glib-aux/nm-value-type.h
@@ -6,12 +6,14 @@
#ifndef __NM_VALUE_TYPE_H__
#define __NM_VALUE_TYPE_H__
-typedef enum {
+typedef enum _nm_packed {
NM_VALUE_TYPE_UNSPEC = 1,
NM_VALUE_TYPE_BOOL = 2,
NM_VALUE_TYPE_INT32 = 3,
NM_VALUE_TYPE_INT = 4,
- NM_VALUE_TYPE_STRING = 5,
+ NM_VALUE_TYPE_INT64 = 5,
+ NM_VALUE_TYPE_UINT64 = 6,
+ NM_VALUE_TYPE_STRING = 7,
} NMValueType;
/*****************************************************************************/
@@ -21,6 +23,8 @@ typedef enum {
typedef union {
bool v_bool;
gint32 v_int32;
+ gint64 v_int64;
+ guint64 v_uint64;
int v_int;
const char *v_string;
@@ -78,6 +82,12 @@ nm_value_type_cmp(NMValueType value_type, gconstpointer p_a, gconstpointer p_b)
case NM_VALUE_TYPE_INT:
NM_CMP_DIRECT(*((const int *) p_a), *((const int *) p_b));
return 0;
+ case NM_VALUE_TYPE_INT64:
+ NM_CMP_DIRECT(*((const gint64 *) p_a), *((const gint64 *) p_b));
+ return 0;
+ case NM_VALUE_TYPE_UINT64:
+ NM_CMP_DIRECT(*((const guint64 *) p_a), *((const guint64 *) p_b));
+ return 0;
case NM_VALUE_TYPE_STRING:
return nm_strcmp0(*((const char *const *) p_a), *((const char *const *) p_b));
case NM_VALUE_TYPE_UNSPEC:
@@ -106,6 +116,12 @@ nm_value_type_copy(NMValueType value_type, gpointer dst, gconstpointer src)
case NM_VALUE_TYPE_INT:
(*((int *) dst) = *((const int *) src));
return;
+ case NM_VALUE_TYPE_INT64:
+ (*((gint64 *) dst) = *((const gint64 *) src));
+ return;
+ case NM_VALUE_TYPE_UINT64:
+ (*((guint64 *) dst) = *((const guint64 *) src));
+ return;
case NM_VALUE_TYPE_STRING:
/* self assignment safe! */
if (*((char **) dst) != *((const char *const *) src)) {
@@ -132,6 +148,12 @@ nm_value_type_get_from_variant(NMValueType value_type,
case NM_VALUE_TYPE_INT32:
*((gint32 *) dst) = g_variant_get_int32(variant);
return;
+ case NM_VALUE_TYPE_INT64:
+ *((gint64 *) dst) = g_variant_get_int64(variant);
+ return;
+ case NM_VALUE_TYPE_UINT64:
+ *((guint64 *) dst) = g_variant_get_uint64(variant);
+ return;
case NM_VALUE_TYPE_STRING:
if (clone) {
g_free(*((char **) dst));
@@ -163,6 +185,10 @@ nm_value_type_to_variant(NMValueType value_type, gconstpointer src)
return g_variant_new_boolean(*((const bool *) src));
case NM_VALUE_TYPE_INT32:
return g_variant_new_int32(*((const gint32 *) src));
+ case NM_VALUE_TYPE_INT64:
+ return g_variant_new_int64(*((const gint64 *) src));
+ case NM_VALUE_TYPE_UINT64:
+ return g_variant_new_uint64(*((const guint64 *) src));
case NM_VALUE_TYPE_STRING:
v_string = *((const char *const *) src);
return v_string ? g_variant_new_string(v_string) : NULL;
@@ -187,6 +213,10 @@ nm_value_type_get_variant_type(NMValueType value_type)
return G_VARIANT_TYPE_BOOLEAN;
case NM_VALUE_TYPE_INT32:
return G_VARIANT_TYPE_INT32;
+ case NM_VALUE_TYPE_INT64:
+ return G_VARIANT_TYPE_INT64;
+ case NM_VALUE_TYPE_UINT64:
+ return G_VARIANT_TYPE_UINT64;
case NM_VALUE_TYPE_STRING:
return G_VARIANT_TYPE_STRING;