Module: kamailio Branch: master Commit: b177f05ee8b3a6bf553160ececdb3508a99a65b0 URL: https://github.com/kamailio/kamailio/commit/b177f05ee8b3a6bf553160ececdb3508...
Author: Riccardo Villa riccardo.villa@netaxis.be Committer: Daniel-Constantin Mierla miconda@gmail.com Date: 2022-01-11T12:45:40+01:00
dialog: add filter based on start timestamp to dlg.list_match
---
Modified: src/modules/dialog/dialog.c
---
Diff: https://github.com/kamailio/kamailio/commit/b177f05ee8b3a6bf553160ececdb3508... Patch: https://github.com/kamailio/kamailio/commit/b177f05ee8b3a6bf553160ececdb3508...
---
diff --git a/src/modules/dialog/dialog.c b/src/modules/dialog/dialog.c index da3ce7cbfd..a25224318c 100644 --- a/src/modules/dialog/dialog.c +++ b/src/modules/dialog/dialog.c @@ -2932,6 +2932,8 @@ static void rpc_dlg_list_match_ex(rpc_t *rpc, void *c, int with_context) str mop = {NULL, 0}; str mval = {NULL, 0}; str sval = {NULL, 0}; + unsigned int ival = 0; + unsigned int mival = 0; int n = 0; int m = 0; int vkey = 0; @@ -2960,6 +2962,8 @@ static void rpc_dlg_list_match_ex(rpc_t *rpc, void *c, int with_context) vkey = 2; } else if(mkey.len==6 && strncmp(mkey.s, "callid", mkey.len)==0) { vkey = 3; + } else if(mkey.len==8 && strncmp(mkey.s, "start_ts", mkey.len)==0) { + vkey = 4; } else { LM_ERR("invalid key %.*s\n", mkey.len, mkey.s); rpc->fault(c, 500, "Invalid matching key parameter"); @@ -2983,6 +2987,10 @@ static void rpc_dlg_list_match_ex(rpc_t *rpc, void *c, int with_context) } } else if(strncmp(mop.s, "sw", 2)==0) { vop = 2; + } else if(strncmp(mop.s, "gt", 2)==0) { + vop = 3; + } else if(strncmp(mop.s, "lt", 2)==0) { + vop = 4; } else { LM_ERR("invalid matching operator %.*s\n", mop.len, mop.s); rpc->fault(c, 500, "Invalid matching operator parameter"); @@ -2992,6 +3000,18 @@ static void rpc_dlg_list_match_ex(rpc_t *rpc, void *c, int with_context) n = 0; }
+ if (vkey == 4 && vop <= 2) { + LM_ERR("Matching operator %.*s not supported with start_ts key\n", mop.len, mop.s); + rpc->fault(c, 500, "Matching operator not supported with start_ts key"); + return; + } + + if (vkey != 4 && vop >= 3) { + LM_ERR("Matching operator %.*s not supported with key %.*s\n", mop.len, mop.s, mkey.len, mkey.s); + rpc->fault(c, 500, "Matching operator not supported"); + return; + } + for(i=0; i<d_table->size; i++) { dlg_lock(d_table, &(d_table->entries[i])); for(dlg=d_table->entries[i].first; dlg!=NULL; dlg=dlg->next) { @@ -3009,6 +3029,9 @@ static void rpc_dlg_list_match_ex(rpc_t *rpc, void *c, int with_context) case 3: sval = dlg->callid; break; + case 4: + ival = dlg->start_ts; + break; } switch(vop) { case 0: @@ -3031,6 +3054,17 @@ static void rpc_dlg_list_match_ex(rpc_t *rpc, void *c, int with_context) matched = 1; } break; + case 3: + /* greater than */ + if (str2int(&mval, &mival) == 0 && ival > mival) { + matched = 1; + } + break; + case 4: + if (str2int(&mval, &mival) == 0 && ival < mival) { + matched = 1; + } + break; } if (matched==1) { m++;