From 32051b32b84bed1a75817515f8e0cc870a3bc251 Mon Sep 17 00:00:00 2001 From: rswindell <> Date: Fri, 8 Feb 2019 02:39:04 +0000 Subject: [PATCH] Add/use new function findstr_list() which opens and returns a string list suitable for passing to findstr_in_list(). SBBSecho peformance improvement: don't open/read the twitlist.cfg file for *each* imported message: just read it once during initialization (using the new findstr_list() function of course). Reversed course on the findstr()/trashcan() matching logic: significant leading white-space was not backwards compatible (and was the cause of recent lost messages in DOVE-Net) - so I decided to go a different route and support C-style character escape sequences (e.g. \r, \n, \t, \x##, etc.) in findstr comparison strings, so the new way to represent a leading space character in a filter file (e.g. twitlist.cfg, name.can) would be: "\ ". So to match (e.g. filter/disallow) all strings with a leading space: "\ *". "\x20 *" would also work (0x20 is ASCII for "space"). Now, again, leading white-space in filter files (e.g. text/*.can, twitlist.cfg) is ignored. <sigh> --- src/sbbs3/sbbs.h | 1 + src/sbbs3/sbbsecho.c | 14 +++++--------- src/sbbs3/str_util.c | 31 ++++++++++++++++++++++++------- src/sbbs3/un_qwk.cpp | 5 +---- src/sbbs3/un_rep.cpp | 5 +---- 5 files changed, 32 insertions(+), 24 deletions(-) diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h index 792f7b83e7..e7d132bf5a 100644 --- a/src/sbbs3/sbbs.h +++ b/src/sbbs3/sbbs.h @@ -1100,6 +1100,7 @@ extern "C" { DLLEXPORT BOOL DLLCALL findstr(const char *insearch, const char *fname); DLLEXPORT BOOL DLLCALL findstr_in_string(const char* insearchof, char* string); DLLEXPORT BOOL DLLCALL findstr_in_list(const char* insearchof, str_list_t list); + DLLEXPORT str_list_t DLLCALL findstr_list(const char* fname); DLLEXPORT BOOL DLLCALL trashcan(scfg_t* cfg, const char *insearch, const char *name); DLLEXPORT char * DLLCALL trashcan_fname(scfg_t* cfg, const char *name, char* fname, size_t); DLLEXPORT str_list_t DLLCALL trashcan_list(scfg_t* cfg, const char* name); diff --git a/src/sbbs3/sbbsecho.c b/src/sbbs3/sbbsecho.c index 80842cdd5a..5f51db58ce 100644 --- a/src/sbbs3/sbbsecho.c +++ b/src/sbbs3/sbbsecho.c @@ -90,7 +90,7 @@ ulong bundles_unpacked=0; int cur_smb=0; FILE *fidologfile=NULL; -bool twit_list; +str_list_t twit_list; str_list_t bad_areas; fidoaddr_t sys_faddr = {1,1,1,0}; /* Default system address: 1:1/1.0 */ @@ -3293,17 +3293,13 @@ int fmsgtosmsg(char* fbuf, fmsghdr_t* hdr, uint user, uint subnum) long dupechk_hashes=SMB_HASH_SOURCE_DUPE; fidoaddr_t faddr,origaddr,destaddr; smb_t* smbfile; - char fname[MAX_PATH+1]; smbmsg_t msg; time32_t now=time32(NULL); ulong max_msg_age = (subnum == INVALID_SUB) ? cfg.max_netmail_age : cfg.max_echomail_age; - if(twit_list) { - sprintf(fname,"%stwitlist.cfg",scfg.ctrl_dir); - if(findstr(hdr->from,fname) || findstr(hdr->to,fname)) { - lprintf(LOG_INFO,"Filtering message from %s to %s",hdr->from,hdr->to); - return IMPORT_FILTERED_TWIT; - } + if(findstr_in_list(hdr->from, twit_list) || findstr_in_list(hdr->to, twit_list)) { + lprintf(LOG_INFO,"Filtering message from %s to %s",hdr->from,hdr->to); + return IMPORT_FILTERED_TWIT; } memset(&msg,0,sizeof(smbmsg_t)); @@ -6132,7 +6128,7 @@ int main(int argc, char **argv) } SAFEPRINTF(str,"%stwitlist.cfg",scfg.ctrl_dir); - twit_list=fexist(str); + twit_list=findstr_list(str); if(scfg.total_faddrs) sys_faddr=scfg.faddr[0]; diff --git a/src/sbbs3/str_util.c b/src/sbbs3/str_util.c index 71df3ef1ae..8ede95b5f4 100644 --- a/src/sbbs3/str_util.c +++ b/src/sbbs3/str_util.c @@ -290,10 +290,13 @@ BOOL DLLCALL findstr(const char* insearchof, const char* fname) while(!feof(fp) && !ferror(fp) && !found) { if(!fgets(str,sizeof(str),fp)) break; - if(ip_addr !=0 && (cidr = parse_cidr(str, &subnet)) != 0) - found = is_cidr_match(str, ip_addr, cidr, subnet); + char* p = str; + SKIP_WHITESPACE(p); + c_unescape_str(p); + if(ip_addr !=0 && (cidr = parse_cidr(p, &subnet)) != 0) + found = is_cidr_match(p, ip_addr, cidr, subnet); else - found = findstr_in_string(insearchof, str); + found = findstr_in_string(insearchof, p); } fclose(fp); @@ -318,23 +321,37 @@ char* DLLCALL trashcan_fname(scfg_t* cfg, const char* name, char* fname, size_t return fname; } +static char* process_findstr_item(size_t index, char *str, void* cbdata) +{ + SKIP_WHITESPACE(str); + return c_unescape_str(str); +} + /****************************************************************************/ -str_list_t DLLCALL trashcan_list(scfg_t* cfg, const char* name) +str_list_t DLLCALL findstr_list(const char* fname) { - char fname[MAX_PATH+1]; FILE* fp; str_list_t list; - if((fp=fopen(trashcan_fname(cfg, name, fname, sizeof(fname)),"r"))==NULL) + if((fp=fopen(fname,"r"))==NULL) return NULL; - list=strListReadFile(fp,NULL,255); + list=strListReadFile(fp, NULL, /* Max line length: */255); + strListModifyEach(list, process_findstr_item, /* cbdata: */NULL); fclose(fp); return list; } +/****************************************************************************/ +str_list_t DLLCALL trashcan_list(scfg_t* cfg, const char* name) +{ + char fname[MAX_PATH+1]; + + return findstr_list(trashcan_fname(cfg, name, fname, sizeof(fname))); +} + /****************************************************************************/ /* Returns the printed columns from 'str' accounting for Ctrl-A codes */ /****************************************************************************/ diff --git a/src/sbbs3/un_qwk.cpp b/src/sbbs3/un_qwk.cpp index a08f8498bc..31531452dc 100644 --- a/src/sbbs3/un_qwk.cpp +++ b/src/sbbs3/un_qwk.cpp @@ -125,10 +125,7 @@ bool sbbs_t::unpack_qwk(char *packet,uint hubnum) subject_can=trashcan_list(&cfg,"subject"); SAFEPRINTF(fname,"%stwitlist.cfg",cfg.ctrl_dir); - if((fp=fopen(fname,"r"))!=NULL) { - twit_list=strListReadFile(fp,NULL,128); - fclose(fp); - } + twit_list = findstr_list(fname); for(l=QWK_BLOCK_LEN;l<size;l+=blocks*QWK_BLOCK_LEN) { if(terminated) { diff --git a/src/sbbs3/un_rep.cpp b/src/sbbs3/un_rep.cpp index 0ba5c3d56f..437778d39a 100644 --- a/src/sbbs3/un_rep.cpp +++ b/src/sbbs3/un_rep.cpp @@ -168,10 +168,7 @@ bool sbbs_t::unpack_rep(char* repfile) subject_can=trashcan_list(&cfg,"subject"); SAFEPRINTF(fname,"%stwitlist.cfg",cfg.ctrl_dir); - if((fp=fopen(fname,"r"))!=NULL) { - twit_list=strListReadFile(fp,NULL,128); - fclose(fp); - } + twit_list = findstr_list(fname); now=time(NULL); for(l=QWK_BLOCK_LEN;l<size;l+=blocks*QWK_BLOCK_LEN) { -- GitLab