mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-02-06 05:50:28 +01:00
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.
This commit is contained in:
parent
a9e3987e7c
commit
185dca22bc
3 changed files with 84 additions and 129 deletions
|
|
@ -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), ());
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue