[sr-dev] git:master:3ce5c42c: jansson: added jansson_pv_get(...)

Daniel-Constantin Mierla miconda at gmail.com
Thu Nov 17 13:45:10 CET 2022


Module: kamailio
Branch: master
Commit: 3ce5c42c53dcf6f3f1da952d3b523876c7381913
URL: https://github.com/kamailio/kamailio/commit/3ce5c42c53dcf6f3f1da952d3b523876c7381913

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date: 2022-11-17T13:38:05+01:00

jansson: added jansson_pv_get(...)

- similar to jansson_geet(), but the input has to be a single variable
  name, not a dynamic string

---

Modified: src/modules/jansson/jansson_funcs.c
Modified: src/modules/jansson/jansson_funcs.h
Modified: src/modules/jansson/jansson_mod.c

---

Diff:  https://github.com/kamailio/kamailio/commit/3ce5c42c53dcf6f3f1da952d3b523876c7381913.diff
Patch: https://github.com/kamailio/kamailio/commit/3ce5c42c53dcf6f3f1da952d3b523876c7381913.patch

---

diff --git a/src/modules/jansson/jansson_funcs.c b/src/modules/jansson/jansson_funcs.c
index 857b6871f0c..0ff937ee7be 100644
--- a/src/modules/jansson/jansson_funcs.c
+++ b/src/modules/jansson/jansson_funcs.c
@@ -92,6 +92,29 @@ int janssonmod_get(struct sip_msg* msg, char* path_in, char* src_in, char* dst)
 	return janssonmod_get_helper(msg, &path_s, &src_s, (pv_spec_t *)dst);
 }
 
+int janssonmod_pv_get(struct sip_msg* msg, char* path_in, char* src_in, char* dst)
+{
+	str path_s;
+	pv_value_t val;
+	int ret;
+
+	if((pv_get_spec_value(msg, (pv_spec_t*)src_in, &val) < 0)
+			|| ((val.flags & PV_VAL_STR) == 0)) {
+		ERR("cannot get json string value\n");
+		return -1;
+	}
+	if (fixup_get_svalue(msg, (gparam_p)path_in, &path_s) != 0) {
+		ERR("cannot get path string value\n");
+		return -1;
+	}
+
+	ret = janssonmod_get_helper(msg, &path_s, &val.rs, (pv_spec_t*)dst);
+
+	pv_value_destroy(&val);
+
+	return ret;
+}
+
 #define STR_EQ_STATIC(a,b) ((a.len == sizeof(b)-1) && (strncmp(a.s, b, sizeof(b)-1)==0))
 
 int janssonmod_set(unsigned int append, struct sip_msg* msg, char* type_in,
diff --git a/src/modules/jansson/jansson_funcs.h b/src/modules/jansson/jansson_funcs.h
index aeaf0791b90..ce8e9d5b4a1 100644
--- a/src/modules/jansson/jansson_funcs.h
+++ b/src/modules/jansson/jansson_funcs.h
@@ -27,6 +27,8 @@
 
 int janssonmod_get(struct sip_msg* msg, char* path_in, char* json_in,
 		char* result);
+int janssonmod_pv_get(struct sip_msg* msg, char* path_in, char* json_in,
+		char* result);
 int janssonmod_set(unsigned int append, struct sip_msg* msg, char* type_in,
 		char* path_in, char* value_in, char* result);
 int janssonmod_array_size(struct sip_msg* msg, char* json_in,
diff --git a/src/modules/jansson/jansson_mod.c b/src/modules/jansson/jansson_mod.c
index 6a2fe6ead66..46cfda2fec4 100644
--- a/src/modules/jansson/jansson_mod.c
+++ b/src/modules/jansson/jansson_mod.c
@@ -36,6 +36,8 @@ MODULE_VERSION
 static int mod_init(void);
 static int fixup_get_params(void** param, int param_no);
 static int fixup_get_params_free(void** param, int param_no);
+static int fixup_pv_get_params(void** param, int param_no);
+static int fixup_pv_get_params_free(void** param, int param_no);
 static int fixup_set_params(void** param, int param_no);
 static int fixup_set_params_free(void** param, int param_no);
 static int fixup_xencode(void** param, int param_no);
@@ -60,6 +62,8 @@ int janssonmod_get_field(struct sip_msg* msg, char* jansson_in, char* path_in,
 static cmd_export_t cmds[]={
 	{"jansson_get", (cmd_function)janssonmod_get, 3,
 		fixup_get_params, fixup_get_params_free, ANY_ROUTE},
+	{"jansson_pv_get", (cmd_function)janssonmod_pv_get, 3,
+		fixup_pv_get_params, fixup_pv_get_params_free, ANY_ROUTE},
 	{"jansson_array_size", (cmd_function)janssonmod_array_size, 3,
 		fixup_get_params, fixup_get_params_free, ANY_ROUTE},
 	{"jansson_set", (cmd_function)janssonmod_set_replace, 4,
@@ -121,6 +125,34 @@ static int fixup_get_params_free(void** param, int param_no)
 	return -1;
 }
 
+static int fixup_pv_get_params(void** param, int param_no)
+{
+	if (param_no == 1) {
+		return fixup_spve_null(param, 1);
+	}
+
+	if (param_no == 2 || param_no == 3) {
+		return fixup_pvar_null(param, 1);
+	}
+
+	ERR("invalid parameter number <%d>\n", param_no);
+	return -1;
+}
+
+static int fixup_pv_get_params_free(void** param, int param_no)
+{
+	if (param_no == 1) {
+		return fixup_free_spve_null(param, 1);
+	}
+
+	if (param_no == 2 || param_no == 3) {
+		return fixup_free_pvar_null(param, 1);
+	}
+
+	ERR("invalid parameter number <%d>\n", param_no);
+	return -1;
+}
+
 static int fixup_set_params(void** param, int param_no)
 {
 	if(param_no <= 3) {
@@ -232,4 +264,4 @@ int mod_register(char *path, int *dlflags, void *p1, void *p2)
 {
 	sr_kemi_modules_add(sr_kemi_jansson_exports);
 	return 0;
-}
\ No newline at end of file
+}




More information about the sr-dev mailing list