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