From faafff585f5726ae2c27e247cb2d9e216840552b Mon Sep 17 00:00:00 2001 From: kmduk Date: Tue, 1 May 2018 14:12:18 +0100 Subject: [PATCH] app_python3: fix kemi function argument checking and add support for nsss calls (as used by xhttp_reply) --- src/modules/app_python3/apy_kemi.c | 59 ++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 19 deletions(-) mode change 100644 => 100755 src/modules/app_python3/apy_kemi.c diff --git a/src/modules/app_python3/apy_kemi.c b/src/modules/app_python3/apy_kemi.c old mode 100644 new mode 100755 index fc0368822b5..520bbda52c8 --- a/src/modules/app_python3/apy_kemi.c +++ b/src/modules/app_python3/apy_kemi.c @@ -216,7 +216,7 @@ PyObject *sr_apy_kemi_exec_func(PyObject *self, PyObject *args, int idx) } LM_DBG("param[%d] for: %.*s is int: %d\n", i, fname.len, fname.s, vps[0].n); - } else { + } else if(ket->ptypes[0]==SR_KEMIP_STR) { if(!PyArg_ParseTuple(args, "s:kemi-param-s", &vps[0].s.s)) { LM_ERR("unable to retrieve str param %d\n", 0); return sr_kemi_apy_return_false(); @@ -224,6 +224,9 @@ PyObject *sr_apy_kemi_exec_func(PyObject *self, PyObject *args, int idx) vps[0].s.len = strlen(vps[0].s.s); LM_DBG("param[%d] for: %.*s is str: %.*s\n", i, fname.len, fname.s, vps[0].s.len, vps[0].s.s); + } else { + LM_ERR("not implemented yet\n"); + return sr_kemi_apy_return_false(); } } else if(ket->ptypes[2]==SR_KEMIP_NONE) { i = 2; @@ -250,7 +253,7 @@ PyObject *sr_apy_kemi_exec_func(PyObject *self, PyObject *args, int idx) vps[0].s.len = strlen(vps[0].s.s); LM_DBG("params[%d] for: %.*s are str-int: [%.*s] [%d]\n", i, fname.len, fname.s, vps[0].s.len, vps[0].s.s, vps[1].n); - } else { + } else if(ket->ptypes[0]==SR_KEMIP_STR && ket->ptypes[1]==SR_KEMIP_STR) { if(!PyArg_ParseTuple(args, "ss:kemi-param-ss", &vps[0].s.s, &vps[1].s.s)) { LM_ERR("unable to retrieve str-str param %d\n", i); return sr_kemi_apy_return_false(); @@ -260,6 +263,9 @@ PyObject *sr_apy_kemi_exec_func(PyObject *self, PyObject *args, int idx) LM_DBG("params[%d] for: %.*s are str: [%.*s] [%.*s]\n", i, fname.len, fname.s, vps[0].s.len, vps[0].s.s, vps[1].s.len, vps[1].s.s); + } else { + LM_ERR("not implemented yet\n"); + return sr_kemi_apy_return_false(); } } else if(ket->ptypes[3]==SR_KEMIP_NONE) { @@ -338,9 +344,9 @@ PyObject *sr_apy_kemi_exec_func(PyObject *self, PyObject *args, int idx) } else if(ket->ptypes[4]==SR_KEMIP_NONE) { i = 4; if(ket->ptypes[0]==SR_KEMIP_STR - || ket->ptypes[1]==SR_KEMIP_STR - || ket->ptypes[2]==SR_KEMIP_STR - || ket->ptypes[3]==SR_KEMIP_STR) { + && ket->ptypes[1]==SR_KEMIP_STR + && ket->ptypes[2]==SR_KEMIP_STR + && ket->ptypes[3]==SR_KEMIP_STR) { if(!PyArg_ParseTuple(args, "ssss:kemi-param-ssss", &vps[0].s.s, &vps[1].s.s, &vps[2].s.s, &vps[3].s.s)) { LM_ERR("unable to retrieve str-str-str-str params %d\n", i); @@ -356,9 +362,9 @@ PyObject *sr_apy_kemi_exec_func(PyObject *self, PyObject *args, int idx) vps[1].s.len, vps[1].s.s, vps[2].s.len, vps[2].s.s, vps[3].s.len, vps[3].s.s); } else if(ket->ptypes[0]==SR_KEMIP_STR - || ket->ptypes[1]==SR_KEMIP_STR - || ket->ptypes[2]==SR_KEMIP_INT - || ket->ptypes[3]==SR_KEMIP_INT) { + && ket->ptypes[1]==SR_KEMIP_STR + && ket->ptypes[2]==SR_KEMIP_INT + && ket->ptypes[3]==SR_KEMIP_INT) { if(!PyArg_ParseTuple(args, "ssii:kemi-param-ssnn", &vps[0].s.s, &vps[1].s.s, &vps[2].n, &vps[3].n)) { LM_ERR("unable to retrieve str-str-int-int params %d\n", i); @@ -370,6 +376,21 @@ PyObject *sr_apy_kemi_exec_func(PyObject *self, PyObject *args, int idx) " [%d] [%d]\n", i, fname.len, fname.s, vps[0].s.len, vps[0].s.s, vps[1].s.len, vps[1].s.s, vps[2].n, vps[3].n); + } else if(ket->ptypes[0]==SR_KEMIP_INT + && ket->ptypes[1]==SR_KEMIP_STR + && ket->ptypes[2]==SR_KEMIP_STR + && ket->ptypes[3]==SR_KEMIP_STR) { + if(!PyArg_ParseTuple(args, "isss:kemi-param-nsss", + &vps[0].n, &vps[1].s.s, &vps[2].s.s, &vps[3].s.s)) { + LM_ERR("unable to retrieve int-str-str-str params %d\n", i); + return sr_kemi_apy_return_false(); + } + vps[1].s.len = strlen(vps[1].s.s); + vps[2].s.len = strlen(vps[2].s.s); + vps[3].s.len = strlen(vps[3].s.s); + LM_DBG("params[%d] for: %.*s are str: [%d] [%.*s] [%.*s] [%.*s]\n", i, + fname.len, fname.s, vps[0].n, vps[1].s.len, vps[1].s.s, + vps[2].s.len, vps[2].s.s, vps[3].s.len, vps[3].s.s); } else { LM_ERR("not implemented yet\n"); return sr_kemi_apy_return_false(); @@ -377,10 +398,10 @@ PyObject *sr_apy_kemi_exec_func(PyObject *self, PyObject *args, int idx) } else if(ket->ptypes[5]==SR_KEMIP_NONE) { i = 5; if(ket->ptypes[0]==SR_KEMIP_STR - || ket->ptypes[1]==SR_KEMIP_STR - || ket->ptypes[2]==SR_KEMIP_STR - || ket->ptypes[3]==SR_KEMIP_STR - || ket->ptypes[4]==SR_KEMIP_STR) { + && ket->ptypes[1]==SR_KEMIP_STR + && ket->ptypes[2]==SR_KEMIP_STR + && ket->ptypes[3]==SR_KEMIP_STR + && ket->ptypes[4]==SR_KEMIP_STR) { if(!PyArg_ParseTuple(args, "sssss:kemi-param-sssss", &vps[0].s.s, &vps[1].s.s, &vps[2].s.s, &vps[3].s.s, &vps[4].s.s)) { @@ -404,11 +425,11 @@ PyObject *sr_apy_kemi_exec_func(PyObject *self, PyObject *args, int idx) } else { i = 6; if(ket->ptypes[0]==SR_KEMIP_STR - || ket->ptypes[1]==SR_KEMIP_STR - || ket->ptypes[2]==SR_KEMIP_STR - || ket->ptypes[3]==SR_KEMIP_STR - || ket->ptypes[4]==SR_KEMIP_STR - || ket->ptypes[5]==SR_KEMIP_STR) { + && ket->ptypes[1]==SR_KEMIP_STR + && ket->ptypes[2]==SR_KEMIP_STR + && ket->ptypes[3]==SR_KEMIP_STR + && ket->ptypes[4]==SR_KEMIP_STR + && ket->ptypes[5]==SR_KEMIP_STR) { if(!PyArg_ParseTuple(args, "ssssss:kemi-param-ssssss", &vps[0].s.s, &vps[1].s.s, &vps[2].s.s, &vps[3].s.s, &vps[4].s.s, &vps[5].s.s)) { @@ -574,7 +595,7 @@ PyObject *sr_apy_kemi_exec_func(PyObject *self, PyObject *args, int idx) && ket->ptypes[1]==SR_KEMIP_STR && ket->ptypes[2]==SR_KEMIP_STR && ket->ptypes[3]==SR_KEMIP_INT) { - /* ssnn */ + /* sssn */ ret = ((sr_kemi_fmsssn_f)(ket->func))(lmsg, &vps[0].s, &vps[1].s, &vps[2].s, vps[3].n); return sr_kemi_apy_return_int(ket, ret); @@ -590,7 +611,7 @@ PyObject *sr_apy_kemi_exec_func(PyObject *self, PyObject *args, int idx) && ket->ptypes[1]==SR_KEMIP_STR && ket->ptypes[2]==SR_KEMIP_STR && ket->ptypes[3]==SR_KEMIP_STR) { - /* ssnn */ + /* nsss */ ret = ((sr_kemi_fmnsss_f)(ket->func))(lmsg, vps[0].n, &vps[1].s, &vps[2].s, &vps[3].s); return sr_kemi_apy_return_int(ket, ret);