diff --git a/src/modules/acc/acc_logic.c b/src/modules/acc/acc_logic.c index 58418441d9c..02de9f4cf30 100644 --- a/src/modules/acc/acc_logic.c +++ b/src/modules/acc/acc_logic.c @@ -41,6 +41,7 @@ #include "../../modules/tm/tm_load.h" #include "../rr/api.h" #include "../../core/flags.h" +#include "../../core/kemi.h" #include "acc.h" #include "acc_api.h" #include "acc_mod.h" @@ -219,6 +220,45 @@ int w_acc_log_request(struct sip_msg *rq, char *comment, char *foo) return acc_log_request(rq); } +static int acc_param_parse(str *s, acc_param_t *accp) +{ + if(s==NULL || s->s==NULL || s->len<=0 || accp==NULL) { + LM_ERR("invalid parameters\n"); + return -1; + } + memset(accp, 0, sizeof(acc_param_t)); + accp->reason.s = s->s; + accp->reason.len = s->len; + if (strchr(s->s, PV_MARKER)!=NULL) { + /* there is a cfg variable - not through kemi */ + LM_ERR("cfg variable detected - not supported\n"); + return -1; + } else { + if(acc_parse_code(s->s, accp)<0) { + LM_ERR("failed to parse: [%.*s] (expected [code text])\n", + s->len, s->s); + return -1; + } + } + return 0; +} + +int ki_acc_log_request(sip_msg_t *rq, str *comment) +{ + acc_param_t accp; + + if(acc_param_parse(comment, &accp)<0) { + LM_ERR("failed execution\n"); + return -1; + } + if (acc_preparse_req(rq)<0) + return -1; + + env_set_to(rq->to); + env_set_comment(&accp); + env_set_text(ACC_REQUEST, ACC_REQUEST_LEN); + return acc_log_request(rq); +} #ifdef SQL_ACC int acc_db_set_table_name(struct sip_msg *msg, void *param, str *table) @@ -270,6 +310,25 @@ int w_acc_db_request(struct sip_msg *rq, char *comment, char *table) env_set_comment(param); return acc_db_request(rq); } + +int ki_acc_db_request(sip_msg_t *rq, str *comment, str *dbtable) +{ + acc_param_t accp; + + if(acc_param_parse(comment, &accp)<0) { + LM_ERR("failed execution\n"); + return -1; + } + if (acc_preparse_req(rq)<0) + return -1; + if(acc_db_set_table_name(rq, NULL, dbtable)<0) { + LM_ERR("cannot set table name\n"); + return -1; + } + env_set_to(rq->to); + env_set_comment(&accp); + return acc_db_request(rq); +} #endif #ifdef DIAM_ACC @@ -625,5 +684,4 @@ static void tmcb_func( struct cell* t, int type, struct tmcb_params *ps ) } else if (type&TMCB_RESPONSE_IN) { acc_onreply_in( t, ps->req, ps->rpl, ps->code); } -} - +} \ No newline at end of file diff --git a/src/modules/acc/acc_logic.h b/src/modules/acc/acc_logic.h index 4101ca8f0ba..18cf198aee5 100644 --- a/src/modules/acc/acc_logic.h +++ b/src/modules/acc/acc_logic.h @@ -40,9 +40,11 @@ int acc_parse_code(char *p, struct acc_param *param); void acc_onreq( struct cell* t, int type, struct tmcb_params *ps ); int w_acc_log_request(struct sip_msg *rq, char *comment, char *foo); +int ki_acc_log_request(sip_msg_t *rq, str *comment); #ifdef SQL_ACC int w_acc_db_request(struct sip_msg *rq, char *comment, char *table); +int ki_acc_db_request(sip_msg_t *rq, str *comment, str *dbtable); #endif #ifdef DIAM_ACC diff --git a/src/modules/acc/acc_mod.c b/src/modules/acc/acc_mod.c index a60fb3e7467..6665446843d 100644 --- a/src/modules/acc/acc_mod.c +++ b/src/modules/acc/acc_mod.c @@ -45,6 +45,7 @@ #include "../../core/mem/mem.h" #include "../../modules/tm/tm_load.h" #include "../../core/str.h" +#include "../../core/kemi.h" #include "../rr/api.h" #include "acc.h" #include "acc_api.h" @@ -289,7 +290,6 @@ struct module_exports exports= { /************************** FIXUP functions ****************************/ - static int acc_fixup(void** param, int param_no) { struct acc_param *accp; @@ -781,3 +781,33 @@ acc_engine_t *acc_api_get_engines(void) return _acc_engines; } +/** + * + */ +/* clang-format off */ +static sr_kemi_t sr_kemi_acc_exports[] = { + { str_init("acc"), str_init("acc_log_request"), + SR_KEMIP_INT, ki_acc_log_request, + { SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE, + SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE } + }, +#ifdef SQL_ACC + { str_init("acc"), str_init("acc_db_request"), + SR_KEMIP_INT, ki_acc_db_request, + { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE, + SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE } + }, +#endif + + { {0, 0}, {0, 0}, 0, NULL, { 0, 0, 0, 0, 0, 0 } } +}; +/* clang-format on */ + +/** + * + */ +int mod_register(char *path, int *dlflags, void *p1, void *p2) +{ + sr_kemi_modules_add(sr_kemi_acc_exports); + return 0; +} \ No newline at end of file