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
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++)
......
......@@ -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
......
......@@ -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];
}
/****************************************************************************/
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment