diff options
author | Thomas Haller <thaller@redhat.com> | 2018-01-09 10:33:59 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2020-07-09 11:47:05 +0200 |
commit | 185dca22bc5186a00e0bec13be0c3a74f8eeceb3 (patch) | |
tree | d8081ba7768b686ca91b6c686ea87256a401c6fa | |
parent | a9e3987e7cf189d81540e0db675c79bee1c6ca0f (diff) | |
download | NetworkManager-185dca22bc5186a00e0bec13be0c3a74f8eeceb3.tar.gz |
libnm: don't redefine symbols in jansson.h header
Redefining symbols before including <jansson.h> is confusing.
Instead, only use our symbols and access libjansson via NMJsonVt.
-rw-r--r-- | libnm-core/nm-json.c | 94 | ||||
-rw-r--r-- | libnm-core/nm-json.h | 74 | ||||
-rw-r--r-- | libnm-core/nm-team-utils.c | 45 |
3 files changed, 84 insertions, 129 deletions
diff --git a/libnm-core/nm-json.c b/libnm-core/nm-json.c index f20027a0bd..d6dbc0238b 100644 --- a/libnm-core/nm-json.c +++ b/libnm-core/nm-json.c @@ -41,36 +41,36 @@ _nm_json_vt_internal_load (void) #define TRY_BIND_SYMBOL(symbol) \ G_STMT_START { \ - void *_sym = dlsym (handle, "json" #symbol); \ + typeof (symbol) (*_sym) = dlsym (handle, #symbol); \ \ if (!_sym) \ goto fail_symbol; \ - v->vt.nm_json ## symbol = _sym; \ + v->vt.nm_ ## symbol = _sym; \ } G_STMT_END - TRY_BIND_SYMBOL (_array); - TRY_BIND_SYMBOL (_array_append_new); - TRY_BIND_SYMBOL (_array_get); - TRY_BIND_SYMBOL (_array_size); - TRY_BIND_SYMBOL (_delete); - TRY_BIND_SYMBOL (_dumps); - TRY_BIND_SYMBOL (_false); - TRY_BIND_SYMBOL (_integer); - TRY_BIND_SYMBOL (_integer_value); - TRY_BIND_SYMBOL (_loads); - TRY_BIND_SYMBOL (_object); - TRY_BIND_SYMBOL (_object_del); - TRY_BIND_SYMBOL (_object_get); - TRY_BIND_SYMBOL (_object_iter); - TRY_BIND_SYMBOL (_object_iter_key); - TRY_BIND_SYMBOL (_object_iter_next); - TRY_BIND_SYMBOL (_object_iter_value); - TRY_BIND_SYMBOL (_object_key_to_iter); - TRY_BIND_SYMBOL (_object_set_new); - TRY_BIND_SYMBOL (_object_size); - TRY_BIND_SYMBOL (_string); - TRY_BIND_SYMBOL (_string_value); - TRY_BIND_SYMBOL (_true); + TRY_BIND_SYMBOL (json_array); + TRY_BIND_SYMBOL (json_array_append_new); + TRY_BIND_SYMBOL (json_array_get); + TRY_BIND_SYMBOL (json_array_size); + TRY_BIND_SYMBOL (json_delete); + TRY_BIND_SYMBOL (json_dumps); + TRY_BIND_SYMBOL (json_false); + TRY_BIND_SYMBOL (json_integer); + TRY_BIND_SYMBOL (json_integer_value); + TRY_BIND_SYMBOL (json_loads); + TRY_BIND_SYMBOL (json_object); + TRY_BIND_SYMBOL (json_object_del); + TRY_BIND_SYMBOL (json_object_get); + TRY_BIND_SYMBOL (json_object_iter); + TRY_BIND_SYMBOL (json_object_iter_key); + TRY_BIND_SYMBOL (json_object_iter_next); + TRY_BIND_SYMBOL (json_object_iter_value); + TRY_BIND_SYMBOL (json_object_key_to_iter); + TRY_BIND_SYMBOL (json_object_set_new); + TRY_BIND_SYMBOL (json_object_size); + TRY_BIND_SYMBOL (json_string); + TRY_BIND_SYMBOL (json_string_value); + TRY_BIND_SYMBOL (json_true); v->vt.loaded = TRUE; v->dl_handle = handle; @@ -132,47 +132,3 @@ nmtst_json_vt_reset (gboolean loaded) return v->vt.loaded ? &v->vt : NULL; } - -#define DEF_FCN(name, rval, args_t, args_v) \ -rval name args_t \ -{ \ - const NMJsonVt *vt = nm_json_vt (); \ - \ - nm_assert (vt && vt->loaded && vt->name); \ - nm_assert (vt->name != name); \ - return (vt->name) args_v; \ -} - -#define DEF_VOI(name, args_t, args_v) \ -void name args_t \ -{ \ - const NMJsonVt *vt = nm_json_vt (); \ - \ - nm_assert (vt && vt->loaded && vt->name); \ - nm_assert (vt->name != name); \ - (vt->name) args_v; \ -} - -DEF_FCN (nm_json_array, json_t *, (void), ()); -DEF_FCN (nm_json_array_append_new, int, (json_t *json, json_t *value), (json, value)); -DEF_FCN (nm_json_array_get, json_t *, (const json_t *json, size_t index), (json, index)); -DEF_FCN (nm_json_array_size, size_t, (const json_t *json), (json)); -DEF_VOI (nm_json_delete, (json_t *json), (json)); -DEF_FCN (nm_json_dumps, char *, (const json_t *json, size_t flags), (json, flags)); -DEF_FCN (nm_json_false, json_t *, (void), ()); -DEF_FCN (nm_json_integer, json_t *, (json_int_t value), (value)); -DEF_FCN (nm_json_integer_value, json_int_t, (const json_t *json), (json)); -DEF_FCN (nm_json_loads, json_t *, (const char *string, size_t flags, json_error_t *error), (string, flags, error)); -DEF_FCN (nm_json_object, json_t *, (void), ()); -DEF_FCN (nm_json_object_del, int, (json_t *json, const char *key), (json, key)); -DEF_FCN (nm_json_object_get, json_t *, (const json_t *json, const char *key), (json, key)); -DEF_FCN (nm_json_object_iter, void *, (json_t *json), (json)); -DEF_FCN (nm_json_object_iter_key, const char *, (void *iter), (iter)); -DEF_FCN (nm_json_object_iter_next, void *, (json_t *json, void *iter), (json, iter)); -DEF_FCN (nm_json_object_iter_value, json_t *, (void *iter), (iter)); -DEF_FCN (nm_json_object_key_to_iter, void *, (const char *key), (key)); -DEF_FCN (nm_json_object_set_new, int, (json_t *json, const char *key, json_t *value), (json, key, value)); -DEF_FCN (nm_json_object_size, size_t, (const json_t *json), (json)); -DEF_FCN (nm_json_string, json_t *, (const char *value), (value)); -DEF_FCN (nm_json_string_value, const char *, (const json_t *json), (json)); -DEF_FCN (nm_json_true, json_t *, (void), ()); diff --git a/libnm-core/nm-json.h b/libnm-core/nm-json.h index e1b4786eba..a585d521c4 100644 --- a/libnm-core/nm-json.h +++ b/libnm-core/nm-json.h @@ -6,30 +6,6 @@ #ifndef __NM_JSON_H__ #define __NM_JSON_H__ -#define json_array nm_json_array -#define json_array_append_new nm_json_array_append_new -#define json_array_get nm_json_array_get -#define json_array_size nm_json_array_size -#define json_delete nm_json_delete -#define json_dumps nm_json_dumps -#define json_false nm_json_false -#define json_integer nm_json_integer -#define json_integer_value nm_json_integer_value -#define json_loads nm_json_loads -#define json_object nm_json_object -#define json_object_del nm_json_object_del -#define json_object_get nm_json_object_get -#define json_object_iter nm_json_object_iter -#define json_object_iter_key nm_json_object_iter_key -#define json_object_iter_next nm_json_object_iter_next -#define json_object_iter_value nm_json_object_iter_value -#define json_object_key_to_iter nm_json_object_key_to_iter -#define json_object_set_new nm_json_object_set_new -#define json_object_size nm_json_object_size -#define json_string nm_json_string -#define json_string_value nm_json_string_value -#define json_true nm_json_true - /*****************************************************************************/ #if WITH_JANSSON @@ -118,6 +94,17 @@ nm_json_decref (const NMJsonVt *vt, json_t *json) vt->nm_json_delete (json); } +static inline void +_nm_auto_decref_json (json_t **p_json) +{ + if ( *p_json + && (*p_json)->refcount != (size_t) -1 + && --(*p_json)->refcount == 0) + nm_json_vt ()->nm_json_delete (*p_json); +} + +#define nm_auto_decref_json nm_auto(_nm_auto_decref_json) + /*****************************************************************************/ /* the following are implemented as pure macros in jansson.h. @@ -131,9 +118,11 @@ nm_json_decref (const NMJsonVt *vt, json_t *json) #define nm_json_is_array(json) json_is_array (json) #define nm_json_is_true(json) json_is_true (json) #define nm_json_boolean_value(json) json_boolean_value (json) -#define nm_json_array_foreach(a, b, c) json_array_foreach (a, b, c) -#define nm_json_object_foreach(a, b, c) json_object_foreach (a, b, c) -#define nm_json_object_foreach_safe(a, b, c, d) json_object_foreach_safe (a, b, c, d) + +#define nm_json_object_foreach(vt, object, key, value) \ + for(key = vt->nm_json_object_iter_key (vt->nm_json_object_iter (object)); \ + key && (value = vt->nm_json_object_iter_value (vt->nm_json_object_key_to_iter (key))); \ + key = vt->nm_json_object_iter_key (vt->nm_json_object_iter_next (object, vt->nm_json_object_key_to_iter (key)))) /*****************************************************************************/ @@ -152,9 +141,6 @@ nm_json_decref (const NMJsonVt *vt, json_t *json) n = json_object_iter_next(object, json_object_key_to_iter(key))) #endif -NM_AUTO_DEFINE_FCN0 (json_t *, _nm_auto_decref_json, json_decref) -#define nm_auto_decref_json nm_auto(_nm_auto_decref_json) - /*****************************************************************************/ static inline int @@ -172,7 +158,8 @@ nm_jansson_json_as_bool (const json_t *elem, } static inline int -nm_jansson_json_as_int32 (const json_t *elem, +nm_jansson_json_as_int32 (const NMJsonVt *vt, + const json_t *elem, gint32 *out_val) { json_int_t v; @@ -180,10 +167,10 @@ nm_jansson_json_as_int32 (const json_t *elem, if (!elem) return 0; - if (!json_is_integer (elem)) + if (!nm_json_is_integer (elem)) return -EINVAL; - v = json_integer_value (elem); + v = vt->nm_json_integer_value (elem); if ( v < (gint64) G_MININT32 || v > (gint64) G_MAXINT32) return -ERANGE; @@ -193,7 +180,8 @@ nm_jansson_json_as_int32 (const json_t *elem, } static inline int -nm_jansson_json_as_int (const json_t *elem, +nm_jansson_json_as_int (const NMJsonVt *vt, + const json_t *elem, int *out_val) { json_int_t v; @@ -201,10 +189,10 @@ nm_jansson_json_as_int (const json_t *elem, if (!elem) return 0; - if (!json_is_integer (elem)) + if (!nm_json_is_integer (elem)) return -EINVAL; - v = json_integer_value (elem); + v = vt->nm_json_integer_value (elem); if ( v < (gint64) G_MININT || v > (gint64) G_MAXINT) return -ERANGE; @@ -214,7 +202,8 @@ nm_jansson_json_as_int (const json_t *elem, } static inline int -nm_jansson_json_as_string (const json_t *elem, +nm_jansson_json_as_string (const NMJsonVt *vt, + const json_t *elem, const char **out_val) { if (!elem) @@ -223,7 +212,7 @@ nm_jansson_json_as_string (const json_t *elem, if (!json_is_string (elem)) return -EINVAL; - NM_SET_OUT (out_val, json_string_value (elem)); + NM_SET_OUT (out_val, vt->nm_json_string_value (elem)); return 1; } @@ -234,18 +223,19 @@ nm_jansson_json_as_string (const json_t *elem, #include "nm-glib-aux/nm-value-type.h" static inline gboolean -nm_value_type_from_json (NMValueType value_type, +nm_value_type_from_json (const NMJsonVt *vt, + NMValueType value_type, const json_t *elem, gpointer out_val) { switch (value_type) { case NM_VALUE_TYPE_BOOL: return (nm_jansson_json_as_bool (elem, out_val) > 0); - case NM_VALUE_TYPE_INT32: return (nm_jansson_json_as_int32 (elem, out_val) > 0); - case NM_VALUE_TYPE_INT: return (nm_jansson_json_as_int (elem, out_val) > 0); + case NM_VALUE_TYPE_INT32: 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); /* warning: this overwrites/leaks the previous value. You better have *out_val * point to uninitialized memory or NULL. */ - case NM_VALUE_TYPE_STRING: return (nm_jansson_json_as_string (elem, out_val) > 0); + case NM_VALUE_TYPE_STRING: return (nm_jansson_json_as_string (vt, elem, out_val) > 0); case NM_VALUE_TYPE_UNSPEC: break; diff --git a/libnm-core/nm-team-utils.c b/libnm-core/nm-team-utils.c index f08d50d26a..43dacaaf71 100644 --- a/libnm-core/nm-team-utils.c +++ b/libnm-core/nm-team-utils.c @@ -1118,7 +1118,8 @@ _link_watcher_to_json (const NMTeamLinkWatcher *link_watcher, #if WITH_JSON_VALIDATION static NMTeamLinkWatcher * -_link_watcher_from_json (const json_t *root_js_obj, +_link_watcher_from_json (const NMJsonVt *vt, + const json_t *root_js_obj, gboolean *out_unrecognized_content) { NMValueTypUnioMaybe args[G_N_ELEMENTS (link_watcher_attr_datas)] = { }; @@ -1130,7 +1131,7 @@ _link_watcher_from_json (const json_t *root_js_obj, if (!nm_json_is_object (root_js_obj)) goto fail; - nm_json_object_foreach ((json_t *) root_js_obj, j_key, j_val) { + nm_json_object_foreach (vt, (json_t *) root_js_obj, j_key, j_val) { const LinkWatcherAttrData *attr_data = NULL; NMValueTypUnioMaybe *parse_result; @@ -1154,7 +1155,7 @@ _link_watcher_from_json (const json_t *root_js_obj, if (parse_result->has) *out_unrecognized_content = TRUE; - if (!nm_value_type_from_json (attr_data->value_type, j_val, &parse_result->val)) + if (!nm_value_type_from_json (vt, attr_data->value_type, j_val, &parse_result->val)) *out_unrecognized_content = TRUE; else parse_result->has = TRUE; @@ -1686,7 +1687,8 @@ _attr_data_find_by_json_key (gboolean is_port, } static void -_js_parse_locate_keys (NMTeamSetting *self, +_js_parse_locate_keys (const NMJsonVt *vt, + NMTeamSetting *self, json_t *root_js_obj, json_t *found_keys[static _NM_TEAM_ATTRIBUTE_NUM], gboolean *out_unrecognized_content) @@ -1720,11 +1722,11 @@ _js_parse_locate_keys (NMTeamSetting *self, _handled; \ }) - nm_json_object_foreach (root_js_obj, cur_key1, cur_val1) { + nm_json_object_foreach (vt, root_js_obj, cur_key1, cur_val1) { if (!_handle (self, cur_key1, cur_val1, keys, 1, found_keys, out_unrecognized_content)) { - nm_json_object_foreach (cur_val1, cur_key2, cur_val2) { + nm_json_object_foreach (vt, cur_val1, cur_key2, cur_val2) { if (!_handle (self, cur_key2, cur_val2, keys, 2, found_keys, out_unrecognized_content)) { - nm_json_object_foreach (cur_val2, cur_key3, cur_val3) { + nm_json_object_foreach (vt, cur_val2, cur_key3, cur_val3) { if (!_handle (self, cur_key3, cur_val3, keys, 3, found_keys, out_unrecognized_content)) *out_unrecognized_content = TRUE; } @@ -1737,7 +1739,8 @@ _js_parse_locate_keys (NMTeamSetting *self, } static void -_js_parse_unpack (gboolean is_port, +_js_parse_unpack (const NMJsonVt *vt, + gboolean is_port, json_t *found_keys[static _NM_TEAM_ATTRIBUTE_NUM], bool out_has_lst[static _NM_TEAM_ATTRIBUTE_NUM], NMValueTypUnion out_val_lst[static _NM_TEAM_ATTRIBUTE_NUM], @@ -1764,7 +1767,7 @@ _js_parse_unpack (gboolean is_port, p_out_val = &out_val_lst[attr_data->team_attr]; if (attr_data->value_type != NM_VALUE_TYPE_UNSPEC) - valid = nm_value_type_from_json (attr_data->value_type, arg_js_obj, p_out_val); + valid = nm_value_type_from_json (vt, attr_data->value_type, arg_js_obj, p_out_val); else if (attr_data->team_attr == NM_TEAM_ATTRIBUTE_LINK_WATCHERS) { GPtrArray *link_watchers = NULL; NMTeamLinkWatcher *link_watcher; @@ -1773,16 +1776,18 @@ _js_parse_unpack (gboolean is_port, if (nm_json_is_array (arg_js_obj)) { gsize i, len; - len = nm_json_array_size (arg_js_obj); + len = vt->nm_json_array_size (arg_js_obj); link_watchers = g_ptr_array_new_full (len, (GDestroyNotify) nm_team_link_watcher_unref); for (i = 0; i < len; i++) { - link_watcher = _link_watcher_from_json (nm_json_array_get (arg_js_obj, i), + link_watcher = _link_watcher_from_json (vt, + vt->nm_json_array_get (arg_js_obj, i), out_unrecognized_content); if (link_watcher) g_ptr_array_add (link_watchers, link_watcher); } } else { - link_watcher = _link_watcher_from_json (arg_js_obj, + link_watcher = _link_watcher_from_json (vt, + arg_js_obj, out_unrecognized_content); if (link_watcher) { link_watchers = g_ptr_array_new_full (1, (GDestroyNotify) nm_team_link_watcher_unref); @@ -1802,13 +1807,14 @@ _js_parse_unpack (gboolean is_port, if (nm_json_is_array (arg_js_obj)) { gsize i, len; - len = nm_json_array_size (arg_js_obj); + len = vt->nm_json_array_size (arg_js_obj); if (len > 0) { strv = g_ptr_array_sized_new (len); for (i = 0; i < len; i++) { const char *v_string; - if ( nm_jansson_json_as_string (nm_json_array_get (arg_js_obj, i), + if ( nm_jansson_json_as_string (vt, + vt->nm_json_array_get (arg_js_obj, i), &v_string) <= 0 || !v_string || v_string[0] == '\0') { @@ -1869,9 +1875,10 @@ nm_team_setting_config_set (NMTeamSetting *self, const char *js_str) #if WITH_JSON_VALIDATION { nm_auto_decref_json json_t *root_js_obj = NULL; + const NMJsonVt *vt; - if (nm_json_vt ()) - root_js_obj = nm_json_loads (js_str, 0, NULL); + if ((vt = nm_json_vt ())) + root_js_obj = vt->nm_json_loads (js_str, 0, NULL); if ( !root_js_obj || !nm_json_is_object (root_js_obj)) @@ -1884,12 +1891,14 @@ nm_team_setting_config_set (NMTeamSetting *self, const char *js_str) gs_unref_ptrarray GPtrArray *ptr_array_master_runner_tx_hash_free = NULL; gs_unref_ptrarray GPtrArray *ptr_array_link_watchers_free = NULL; - _js_parse_locate_keys (self, + _js_parse_locate_keys (vt, + self, root_js_obj, found_keys, &unrecognized_content); - _js_parse_unpack (self->d.is_port, + _js_parse_unpack (vt, + self->d.is_port, found_keys, has_lst, val_lst, |