summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2018-01-09 10:33:59 +0100
committerThomas Haller <thaller@redhat.com>2020-07-09 11:47:05 +0200
commit185dca22bc5186a00e0bec13be0c3a74f8eeceb3 (patch)
treed8081ba7768b686ca91b6c686ea87256a401c6fa
parenta9e3987e7cf189d81540e0db675c79bee1c6ca0f (diff)
downloadNetworkManager-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.c94
-rw-r--r--libnm-core/nm-json.h74
-rw-r--r--libnm-core/nm-team-utils.c45
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,