[sr-dev] git:master:7ae02bca: dlgs: matching op with regex and fnmatch

Daniel-Constantin Mierla miconda at gmail.com
Thu Jul 9 11:37:23 CEST 2020


Module: kamailio
Branch: master
Commit: 7ae02bca24c1ed2ce80158cdc151e65e7fa2f904
URL: https://github.com/kamailio/kamailio/commit/7ae02bca24c1ed2ce80158cdc151e65e7fa2f904

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date: 2020-07-09T11:35:43+02:00

dlgs: matching op with regex and fnmatch

---

Modified: src/modules/dlgs/dlgs_records.c

---

Diff:  https://github.com/kamailio/kamailio/commit/7ae02bca24c1ed2ce80158cdc151e65e7fa2f904.diff
Patch: https://github.com/kamailio/kamailio/commit/7ae02bca24c1ed2ce80158cdc151e65e7fa2f904.patch

---

diff --git a/src/modules/dlgs/dlgs_records.c b/src/modules/dlgs/dlgs_records.c
index c948e4d0eb..6b4a6b70e8 100644
--- a/src/modules/dlgs/dlgs_records.c
+++ b/src/modules/dlgs/dlgs_records.c
@@ -24,6 +24,8 @@
 #include <unistd.h>
 #include <stdlib.h>
 #include <string.h>
+#include <regex.h>
+#include <fnmatch.h>
 
 #include "../../core/dprint.h"
 #include "../../core/ut.h"
@@ -528,6 +530,8 @@ int dlgs_match_field(dlgs_item_t *it, int tfield, int top, str *vdata,
 		void *rdata)
 {
 	str mval;
+	regmatch_t pmatch;
+
 	switch(tfield) {
 		case 1:
 			mval = it->src;
@@ -555,12 +559,23 @@ int dlgs_match_field(dlgs_item_t *it, int tfield, int top, str *vdata,
 				return 0;
 			}
 		break;
+		case 2:
+			if(rdata!=NULL
+					&& regexec((regex_t*)rdata, mval.s, 1, &pmatch, 0)==0) {
+				return 0;
+			}
+		break;
 		case 3:
 			if(mval.len >= vdata->len
 					&& strncmp(mval.s, vdata->s, vdata->len)==0) {
 				return 0;
 			}
 		break;
+		case 4:
+			if(fnmatch(vdata->s, mval.s, 0) == 0) {
+				return 0;
+			}
+		break;
 	}
 	return -1;
 }
@@ -1155,6 +1170,7 @@ static void dlgs_rpc_get_limit(rpc_t *rpc, void *ctx, int limit)
 	str vdata = STR_NULL;
 	int tfield = 0;
 	int top = 0;
+	regex_t mre;
 
 	if(_dlgs_htb == NULL) {
 		return;
@@ -1175,20 +1191,35 @@ static void dlgs_rpc_get_limit(rpc_t *rpc, void *ctx, int limit)
 		return;
 	}
 
+	if(top == 2) {
+		memset(&mre, 0, sizeof(regex_t));
+		if (regcomp(&mre, vdata.s, REG_EXTENDED|REG_ICASE|REG_NEWLINE)!=0) {
+			LM_ERR("failed to compile regex: %.*s\n", vdata.len, vdata.s);
+			rpc->fault(ctx, 500, "Invalid Matching Value");
+			return;
+		}
+	}
+
 	n = 0;
 	for(i = 0; i < _dlgs_htb->htsize; i++) {
 		lock_get(&_dlgs_htb->slots[i].lock);
 		it = _dlgs_htb->slots[i].first;
 		while(it) {
-			if(dlgs_match_field(it, tfield, top, &vdata, NULL)==0) {
+			if(dlgs_match_field(it, tfield, top, &vdata, (top==2)?&mre:NULL)==0) {
 				n++;
 				if(dlgs_rpc_add_item(rpc, ctx, it, n, 0) < 0) {
 					lock_release(&_dlgs_htb->slots[i].lock);
+					if(top == 2) {
+						regfree(&mre);
+					}
 					return;
 				}
 				if(limit!=0 && limit==n) {
 					/* finished by limit */
 					lock_release(&_dlgs_htb->slots[i].lock);
+					if(top == 2) {
+						regfree(&mre);
+					}
 					return;
 				}
 			}
@@ -1196,6 +1227,9 @@ static void dlgs_rpc_get_limit(rpc_t *rpc, void *ctx, int limit)
 		}
 		lock_release(&_dlgs_htb->slots[i].lock);
 	}
+	if(top == 2) {
+		regfree(&mre);
+	}
 }
 
 static const char *dlgs_rpc_get_doc[2] = {




More information about the sr-dev mailing list