Blob Blame History Raw
From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82@fedoraproject.org>
Date: Tue, 12 Dec 2017 15:31:53 +0100
Subject: [PATCH] modules/json: Properly detect json-c version and adaptions
 for v0.13


diff --git a/modules/json/Makefile b/modules/json/Makefile
index 5c514655b..479bec701 100644
--- a/modules/json/Makefile
+++ b/modules/json/Makefile
@@ -2,7 +2,7 @@
 #
 # Memcached implementation for memcache API.
 #
-# 
+#
 # WARNING: do not run this directly, it should be run by the master Makefile
 
 include ../../Makefile.defs
@@ -23,8 +23,23 @@ ifeq ($(JSON_BUILDER),)
 	DEFS += -I$(LOCALBASE)/include -I$(SYSBASE)/include
 	LIBS += -L$(LOCALBASE)/lib -ljson
 else
-	JSON_LIB_VER = $(shell $(JSON_BUILDER) --modversion | sed  "s/\.\([0-9]\)\./.0\1./g" | sed  "s/\.\([0-9]\)\$$/.0\1/g" | tr -d "." | sed -e "s/^0*//" )
-	DEFS += $(shell $(JSON_BUILDER) --cflags) -DJSON_LIB_VERSION=$(JSON_LIB_VER)
+	JSON_PKG_VER = $(shell $(JSON_BUILDER) --modversion)
+	JSON_PKG_MAJOR = $(shell \
+		ver_tmp=`echo '$(JSON_PKG_VER)' | cut -f1 -d.`; \
+		if [ -z "$$ver_tmp" ]; then ver_tmp=0; fi; \
+		echo "$$ver_tmp";)
+	JSON_PKG_MINOR = $(shell \
+		ver_tmp=`echo '$(JSON_PKG_VER)' | cut -f2 -d.`; \
+		if [ -z "$$ver_tmp" ]; then ver_tmp=0; fi; \
+		echo "$$ver_tmp";)
+	JSON_PKG_MICRO = $(shell \
+		ver_tmp=`echo '$(JSON_PKG_VER)' | cut -f3 -d.`; \
+		if [ -z "$$ver_tmp" ]; then ver_tmp=0; fi; \
+		echo "$$ver_tmp";)
+	DEFS += $(shell $(JSON_BUILDER) --cflags) \
+		-DJSON_PKG_MAJOR=$(JSON_PKG_MAJOR) \
+		-DJSON_PKG_MINOR=$(JSON_PKG_MINOR) \
+		-DJSON_PKG_MICRO=$(JSON_PKG_MICRO)
 	LIBS += $(shell $(JSON_BUILDER) --libs)
 endif
 
diff --git a/modules/json/array_del.c b/modules/json/array_del.c
index b23f6d3b3..9be6e2f84 100644
--- a/modules/json/array_del.c
+++ b/modules/json/array_del.c
@@ -22,27 +22,34 @@
  * History:
  * ---------
  *  2009-09-04  first version (andreidragus)
+ *  2017-12-12  use opensips_json_c_helper.h (besser82)
  */
 
-#include <json.h>
-#include <json_object_private.h>
+#include "opensips_json_c_helper.h"
 
-void array_list_del_idx( struct array_list * arr, int idx)
+#if JSON_C_VERSION_NUM < JSON_C_VER_013
+void array_list_del_idx(struct array_list * arr, int idx)
 {
 	int i;
 
-	if( idx >= arr->length)
+	if(idx >= arr->length)
 		return;
 
 
 	arr->free_fn(arr->array[idx]);
 	arr->length--;
 
-	for( i=idx; i<arr->length; i++ )
+	for(i=idx; i<arr->length; i++)
 		arr->array[i]  = arr->array[i+1];
 };
+#endif
 
 void json_object_array_del(struct json_object* obj, int idx)
 {
+#if JSON_C_VERSION_NUM >= JSON_C_VER_013
+	struct array_list * arr = json_object_get_array(obj);
+	array_list_del_idx(arr, idx, arr->length);
+#else
 	array_list_del_idx(obj->o.c_array, idx);
+#endif
 };
diff --git a/modules/json/json.c b/modules/json/json.c
index ee3671e87..b5e21c3dd 100644
--- a/modules/json/json.c
+++ b/modules/json/json.c
@@ -22,6 +22,7 @@
  * History:
  * ---------
  *  2009-09-04  first version (andreidragus)
+ *  2017-12-12  use opensips_json_c_helper.h (besser82)
  */
 
 
@@ -43,14 +44,9 @@
 #include "../../mi/mi.h"
 #include "../tm/tm_load.h"
 #include "../rr/api.h"
+#include "opensips_json_c_helper.h"
 
 
-#include <json.h>
-#include <json_object_private.h>
-
-
-#define JSON_BUFF_SIZE 4096
-
 enum
 {
 	TAG_KEY = 1,
@@ -93,7 +89,7 @@ typedef struct _json_name
 }json_name;
 
 pv_json_t * all;
-char buff[JSON_BUFF_SIZE];
+char buff[JSON_FILE_BUF_SIZE];
 
 static int mod_init(void);
 static int child_init(int );
@@ -297,19 +293,16 @@ json_t * get_object(pv_json_t * var, pv_param_t* pvp ,  json_tag ** tag,
 				!json_object_is_type( cur_obj, json_type_object ) )
 				goto error;
 
-#if JSON_LIB_VERSION < 10
+#if JSON_C_VERSION_NUM >= JSON_C_VER_010
+			if (!json_object_object_get_ex( cur_obj,buff, &cur_obj ) &&
+				tag == NULL)
+				goto error;
+#else
 			cur_obj = json_object_object_get( cur_obj, buff );
 
 			if( cur_obj == NULL && tag == NULL)
 				goto error;
-#else
-			if (!json_object_object_get_ex( cur_obj,buff, &cur_obj ) &&
-				tag == NULL)
-				goto error;
 #endif
-
-
-
 		}
 
 		if( cur_tag->type & TAG_IDX )
@@ -417,7 +410,7 @@ int pv_get_json (struct sip_msg* msg,  pv_param_t* pvp, pv_value_t* val)
 	{
 		val->flags = PV_VAL_STR;
 		val->rs.s = (char*)json_object_get_string( obj );
-#if JSON_LIB_VERSION >= 10
+#if JSON_C_VERSION_NUM >= JSON_C_VER_010
 		val->rs.len = json_object_get_string_len( obj );
 #else
 		val->rs.len = strlen(val->rs.s);
@@ -589,7 +582,7 @@ int pv_set_json (struct sip_msg* msg,  pv_param_t* pvp, int flag ,
 		if (obj == NULL)
 		{
 			LM_ERR("Error parsing json: %s\n",
-#if JSON_LIB_VERSION >= 10
+#if JSON_C_VERSION_NUM >= JSON_C_VER_010
 				json_tokener_error_desc(parse_status)
 #else
 				json_tokener_errors[(unsigned long)obj]
diff --git a/modules/json/opensips_json_c_helper.h b/modules/json/opensips_json_c_helper.h
new file mode 100644
index 000000000..71c5c2189
--- /dev/null
+++ b/modules/json/opensips_json_c_helper.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2017 Björn Esser <besser82@fedoraproject.org>
+ *
+ * This file is part of opensips, a free SIP server.
+ *
+ * opensips is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * opensips is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ *
+ * History:
+ * ---------
+ *  2017-12-12 first version (besser82)
+ */
+
+#ifndef OPENSIPS_JSON_C_HELPER_H
+#define OPENSIPS_JSON_C_HELPER_H
+
+// If those are not defined, we assume to build against json-c v0.9.
+// Starting with v0.11 there is json_c_version.h, which we prefer
+// anyways, so there are no regressions in this case.  Everything
+// conditionalized for v0.10 or later doesn't produce any fallout,
+// when we are asuming v0.9 and building against v0.10.
+#ifndef JSON_PKG_MAJOR
+#define JSON_PKG_MAJOR	0
+#endif
+#ifndef JSON_PKG_MINOR
+#define JSON_PKG_MINOR	9
+#endif
+#ifndef JSON_PKG_MICRO
+#define JSON_PKG_MICRO	0
+#endif
+
+// json.h automatically includes json_c_version.h, if available.
+#include <json.h>
+
+// We prefer JSON_C_VERSION_NUM defined in json_c_version.h.  If it is
+// not defined, we construct it the same way from our JSON_PKG_* defines.
+#ifndef JSON_C_VERSION_NUM
+#define JSON_C_VERSION_NUM (JSON_PKG_MAJOR << 16) | \
+			   (JSON_PKG_MINOR << 8)  | \
+			    JSON_PKG_MICRO
+#endif
+
+// Macros for checking specific versions.
+#define JSON_C_VER_010 (10 << 8)
+#define JSON_C_VER_013 (13 << 8)
+
+// json_object_private.h is gone and not needed anymore in json-c v0.13+.
+#if JSON_C_VERSION_NUM < JSON_C_VER_013
+#include <json_object_private.h>
+#endif
+
+// Newer versions of json-c define this in their headers, so we prefer
+// their definition in that case.
+#ifndef JSON_FILE_BUF_SIZE
+#define JSON_FILE_BUF_SIZE 4096
+#endif
+
+#endif // OPENSIPS_JSON_C_HELPER_H