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

Author: Daniel-Constantin Mierla <[email protected]>
Committer: Daniel-Constantin Mierla <[email protected]>
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
+}


_______________________________________________
Kamailio (SER) - Development Mailing List
[email protected]
https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to