diff options
author | Thomas Haller <thaller@redhat.com> | 2021-04-09 14:29:20 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2021-04-12 16:46:00 +0200 |
commit | 9a2c47fc34a6fe4ae95b80e27bf05d4d148f3e0e (patch) | |
tree | e893303eb9b2ac875c6afb013616e50dc3187424 | |
parent | 6107a94085f3e99bdb31c4b684721f131cdd274a (diff) | |
download | NetworkManager-9a2c47fc34a6fe4ae95b80e27bf05d4d148f3e0e.tar.gz |
glib-aux: add int64/uint64 types to NMValueType
-rw-r--r-- | src/libnm-glib-aux/nm-json-aux.h | 54 | ||||
-rw-r--r-- | src/libnm-glib-aux/nm-value-type.h | 34 |
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; |