Skip to content
Snippets Groups Projects
Commit 641747f6 authored by Rob Swindell's avatar Rob Swindell :speech_balloon:
Browse files

Use nearest-zone matching for source FTN address when replying to netmail

Rather than only matching exact zone numbers as a final "nearest" address
search, use a "nearest zone" matching algorithm ("nearest" being the most
mathematically near). This way, replying to netmail from a zone 2 address
would always match a zone 1 source address, regardless of how many othernet
addresses are configured and which order they are configured in SCFG.

Fixes issue #447 reported by Charles Blackburn (FBOBBS)
parent cf35956b
No related branches found
No related tags found
1 merge request!463MRC mods by Codefenix (2024-10-20)
Pipeline #3271 passed
...@@ -170,16 +170,7 @@ bool sbbs_t::netmail(const char *into, const char *title, long mode, smb_t* resm ...@@ -170,16 +170,7 @@ bool sbbs_t::netmail(const char *into, const char *title, long mode, smb_t* resm
return(false); return(false);
} }
for(i=0;i<cfg.total_faddrs;i++) i = nearest_sysfaddr_index(&cfg, &dest_addr);
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;
if((cfg.netmail_misc&NMAIL_CHSRCADDR) && cfg.total_faddrs > 1) { if((cfg.netmail_misc&NMAIL_CHSRCADDR) && cfg.total_faddrs > 1) {
for(uint j=0; j < cfg.total_faddrs; j++) for(uint j=0; j < cfg.total_faddrs; j++)
......
...@@ -80,6 +80,7 @@ DLLEXPORT char * sub_newsgroup_name(scfg_t*, sub_t*, char*, size_t); ...@@ -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 * sub_area_tag(scfg_t*, sub_t*, char*, size_t);
DLLEXPORT char * dir_area_tag(scfg_t*, dir_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*); faddr_t* nearest_sysfaddr(scfg_t*, faddr_t*);
#ifdef __cplusplus #ifdef __cplusplus
......
...@@ -851,29 +851,40 @@ BOOL is_valid_grpnum(scfg_t* cfg, int grpnum) ...@@ -851,29 +851,40 @@ BOOL is_valid_grpnum(scfg_t* cfg, int grpnum)
return (grpnum >= 0) && (cfg != NULL) && (grpnum < cfg->total_grps); 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; uint i;
uint nearest = 0;
if(cfg->total_faddrs <= 0) int min = INT_MAX;
return addr;
for(i=0; i < cfg->total_faddrs; i++) for(i=0; i < cfg->total_faddrs; i++)
if(memcmp(addr, &cfg->faddr[i], sizeof(*addr)) == 0) if(memcmp(addr, &cfg->faddr[i], sizeof(*addr)) == 0)
return &cfg->faddr[i]; return i;
for(i=0; i < cfg->total_faddrs; i++) for(i=0; i < cfg->total_faddrs; i++)
if(addr->zone == cfg->faddr[i].zone if(addr->zone == cfg->faddr[i].zone
&& addr->net == cfg->faddr[i].net && addr->net == cfg->faddr[i].net
&& addr->node == cfg->faddr[i].node) && addr->node == cfg->faddr[i].node)
return &cfg->faddr[i]; return i;
for(i=0; i < cfg->total_faddrs; i++) for(i=0; i < cfg->total_faddrs; i++)
if(addr->zone == cfg->faddr[i].zone if(addr->zone == cfg->faddr[i].zone
&& addr->net == cfg->faddr[i].net) && addr->net == cfg->faddr[i].net)
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]; 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];
} }
/****************************************************************************/ /****************************************************************************/
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment