diff --git a/src/sbbs3/netmail.cpp b/src/sbbs3/netmail.cpp index edd1cdaa99775d25cdee232626c23a2067f1822e..7436a178ac9c3a021be5d3a754b318603eb00cdd 100644 --- a/src/sbbs3/netmail.cpp +++ b/src/sbbs3/netmail.cpp @@ -170,16 +170,7 @@ bool sbbs_t::netmail(const char *into, const char *title, long mode, smb_t* resm return(false); } - for(i=0;i<cfg.total_faddrs;i++) - if(dest_addr.zone==cfg.faddr[i].zone && dest_addr.net==cfg.faddr[i].net) - break; - if(i==cfg.total_faddrs) { - for(i=0;i<cfg.total_faddrs;i++) - if(dest_addr.zone==cfg.faddr[i].zone) - break; - } - if(i >= cfg.total_faddrs) - i=0; + i = nearest_sysfaddr_index(&cfg, &dest_addr); if((cfg.netmail_misc&NMAIL_CHSRCADDR) && cfg.total_faddrs > 1) { for(uint j=0; j < cfg.total_faddrs; j++) diff --git a/src/sbbs3/scfglib.h b/src/sbbs3/scfglib.h index 1c70181c1dc46395a764f189095fb527c5c3ea7c..afd0a58a50141a89c098a5f0d5041df168081ed4 100644 --- a/src/sbbs3/scfglib.h +++ b/src/sbbs3/scfglib.h @@ -80,6 +80,7 @@ DLLEXPORT char * sub_newsgroup_name(scfg_t*, sub_t*, char*, size_t); DLLEXPORT char * sub_area_tag(scfg_t*, sub_t*, char*, size_t); DLLEXPORT char * dir_area_tag(scfg_t*, dir_t*, char*, size_t); +uint nearest_sysfaddr_index(scfg_t*, faddr_t*); faddr_t* nearest_sysfaddr(scfg_t*, faddr_t*); #ifdef __cplusplus diff --git a/src/sbbs3/scfglib1.c b/src/sbbs3/scfglib1.c index 1a7a8c4fc1d077724e9551a832e3802937ce4e88..fcb74e5bbf58e1c5b61be9fcebd7d7f691330c5b 100644 --- a/src/sbbs3/scfglib1.c +++ b/src/sbbs3/scfglib1.c @@ -851,29 +851,40 @@ BOOL is_valid_grpnum(scfg_t* cfg, int grpnum) return (grpnum >= 0) && (cfg != NULL) && (grpnum < cfg->total_grps); } -faddr_t* nearest_sysfaddr(scfg_t* cfg, faddr_t* addr) +uint nearest_sysfaddr_index(scfg_t* cfg, faddr_t* addr) { uint i; - - if(cfg->total_faddrs <= 0) - return addr; + uint nearest = 0; + int min = INT_MAX; for(i=0; i < cfg->total_faddrs; i++) if(memcmp(addr, &cfg->faddr[i], sizeof(*addr)) == 0) - return &cfg->faddr[i]; + return i; for(i=0; i < cfg->total_faddrs; i++) if(addr->zone == cfg->faddr[i].zone && addr->net == cfg->faddr[i].net && addr->node == cfg->faddr[i].node) - return &cfg->faddr[i]; + return i; for(i=0; i < cfg->total_faddrs; i++) if(addr->zone == cfg->faddr[i].zone && addr->net == cfg->faddr[i].net) - return &cfg->faddr[i]; - for(i=0; i < cfg->total_faddrs; i++) - if(addr->zone == cfg->faddr[i].zone) - return &cfg->faddr[i]; - return &cfg->faddr[0]; + return i; + for(i=0; i < cfg->total_faddrs; i++) { + int diff = abs((int)addr->zone - (int)cfg->faddr[i].zone); + if(diff < min) { + min = diff; + nearest = i; + } + } + return nearest; +} + +faddr_t* nearest_sysfaddr(scfg_t* cfg, faddr_t* addr) +{ + uint i = nearest_sysfaddr_index(cfg, addr); + if(i >= cfg->total_faddrs) + return addr; + return &cfg->faddr[i]; } /****************************************************************************/