diff --git a/src/sbbs3/echocfg.c b/src/sbbs3/echocfg.c index e4df204afaf7b22cee9dc20a332f96ca7547f1be..55e59c98044e868f395ae2309e7c401f5849e1d4 100644 --- a/src/sbbs3/echocfg.c +++ b/src/sbbs3/echocfg.c @@ -809,6 +809,8 @@ int main(int argc, char **argv) ,cfg.check_path ? "Enabled" : "Disabled"); sprintf(opt[i++],"%-50.50s%s","Bundle Attachments" ,misc&TRUNC_BUNDLES ? "Truncate" : "Kill"); + sprintf(opt[i++],"%-50.50s%s","Zone Blind SEEN-BY and PATH Lines" + ,cfg.zone_blind ? "Enabled" : "Disabled"); opt[i][0]=0; j=uifc.list(0,0,0,65,&j,0,"Toggle Options",opt); if(j==-1) @@ -847,6 +849,10 @@ int main(int argc, char **argv) case 10: misc^=TRUNC_BUNDLES; break; + case 11: + cfg.zone_blind=!cfg.zone_blind; + break; + } } break; @@ -1155,6 +1161,8 @@ int main(int argc, char **argv) } if(!cfg.check_path) fprintf(stream,"NOPATHCHECK\n"); + if(cfg.zone_blind) + fprintf(stream,"ZONE_BLIND\n"); if(cfg.notify) fprintf(stream,"NOTIFY %u\n",cfg.notify); if(misc&CONVERT_TEAR) diff --git a/src/sbbs3/rechocfg.c b/src/sbbs3/rechocfg.c index 8882b1a9710105b3fba03ecd4025dbfebb758ffb..3b153241a4d614cdd8b4c6e555f13524d74de718 100644 --- a/src/sbbs3/rechocfg.c +++ b/src/sbbs3/rechocfg.c @@ -200,6 +200,7 @@ void read_echo_cfg() cfg.log=LOG_DEFAULTS; cfg.log_level=LOG_INFO; cfg.check_path=TRUE; + cfg.zone_blind=FALSE; SAFECOPY(cfg.sysop_alias,"SYSOP"); while(1) { @@ -268,6 +269,11 @@ void read_echo_cfg() continue; } + if(!stricmp(tmp,"ZONE_BLIND")) { + cfg.zone_blind=TRUE; + continue; + } + if(!stricmp(tmp,"NOTIFY")) { cfg.notify=atoi(cleanstr(p)); continue; } diff --git a/src/sbbs3/sbbsecho.c b/src/sbbs3/sbbsecho.c index 9199f30382245136cf9a04e26969268b02c7dec6..9309c80947e213f1a6b68ad476116ccdbb05e0d2 100644 --- a/src/sbbs3/sbbsecho.c +++ b/src/sbbs3/sbbsecho.c @@ -2706,121 +2706,141 @@ void putfmsg(FILE *stream,char *fbuf,fmsghdr_t fmsghdr,areasbbs_t area ,SBBSECHO_VERSION_MAJOR,SBBSECHO_VERSION_MINOR,PLATFORM_DESC,revision); } -#if 0 - if(area.name && addr.zone!=fmsghdr.destzone) /* Zone Gate */ - fprintf(stream,"SEEN-BY: %d/%d\r",fmsghdr.destnet,fmsghdr.destnode); -#endif - if(area.name /* && addr.zone==fmsghdr.destzone */) { /* Not NetMail */ - fprintf(stream,"SEEN-BY:"); - for(i=0;i<seenbys.addrs;i++) { /* Put back original SEEN-BYs */ - strcpy(seenby," "); - if(seenbys.addr[i].zone!=addr.zone) - continue; - if(seenbys.addr[i].net!=addr.net || !net_exists) { - net_exists=1; - addr.net=seenbys.addr[i].net; - sprintf(str,"%d/",addr.net); - strcat(seenby,str); } - sprintf(str,"%d",seenbys.addr[i].node); - strcat(seenby,str); - if(lastlen+strlen(seenby)<80) { - fwrite(seenby,strlen(seenby),1,stream); - lastlen+=strlen(seenby); } - else { - --i; - lastlen=9; /* +strlen(seenby); */ - net_exists=0; - fprintf(stream,"\rSEEN-BY:"); } } - - for(i=0;i<area.uplinks;i++) { /* Add all uplinks to SEEN-BYs */ - strcpy(seenby," "); - if(area.uplink[i].zone!=addr.zone || area.uplink[i].point) - continue; - for(j=0;j<seenbys.addrs;j++) - if(!memcmp(&area.uplink[i],&seenbys.addr[j],sizeof(faddr_t))) - break; - if(j==seenbys.addrs) { - if(area.uplink[i].net!=addr.net || !net_exists) { + if(area.name) { /* EchoMail, Not NetMail */ + if(!cfg.zone_blind && addr.zone!=fmsghdr.destzone) /* Zone Gate */ + fprintf(stream,"SEEN-BY: %d/%d\r",fmsghdr.destnet,fmsghdr.destnode); + else { + fprintf(stream,"SEEN-BY:"); + for(i=0;i<seenbys.addrs;i++) { /* Put back original SEEN-BYs */ + strcpy(seenby," "); + if(!cfg.zone_blind && seenbys.addr[i].zone!=addr.zone) + continue; + if(seenbys.addr[i].net!=addr.net || !net_exists) { net_exists=1; - addr.net=area.uplink[i].net; + addr.net=seenbys.addr[i].net; sprintf(str,"%d/",addr.net); - strcat(seenby,str); } - sprintf(str,"%d",area.uplink[i].node); + strcat(seenby,str); + } + sprintf(str,"%d",seenbys.addr[i].node); strcat(seenby,str); if(lastlen+strlen(seenby)<80) { fwrite(seenby,strlen(seenby),1,stream); - lastlen+=strlen(seenby); } + lastlen+=strlen(seenby); + } else { --i; lastlen=9; /* +strlen(seenby); */ net_exists=0; - fprintf(stream,"\rSEEN-BY:"); } } } + fprintf(stream,"\rSEEN-BY:"); + } + } - for(i=0;i<scfg.total_faddrs;i++) { /* Add AKAs to SEEN-BYs */ - strcpy(seenby," "); - if(scfg.faddr[i].zone!=addr.zone || scfg.faddr[i].point) - continue; - for(j=0;j<seenbys.addrs;j++) - if(!memcmp(&scfg.faddr[i],&seenbys.addr[j],sizeof(faddr_t))) - break; - if(j==seenbys.addrs) { - if(scfg.faddr[i].net!=addr.net || !net_exists) { + for(i=0;i<area.uplinks;i++) { /* Add all uplinks to SEEN-BYs */ + strcpy(seenby," "); + if((!cfg.zone_blind && area.uplink[i].zone!=addr.zone) || area.uplink[i].point) + continue; + for(j=0;j<seenbys.addrs;j++) + if(!memcmp(&area.uplink[i],&seenbys.addr[j],sizeof(faddr_t))) + break; + if(j==seenbys.addrs) { + if(area.uplink[i].net!=addr.net || !net_exists) { + net_exists=1; + addr.net=area.uplink[i].net; + sprintf(str,"%d/",addr.net); + strcat(seenby,str); + } + sprintf(str,"%d",area.uplink[i].node); + strcat(seenby,str); + if(lastlen+strlen(seenby)<80) { + fwrite(seenby,strlen(seenby),1,stream); + lastlen+=strlen(seenby); + } + else { + --i; + lastlen=9; /* +strlen(seenby); */ + net_exists=0; + fprintf(stream,"\rSEEN-BY:"); + } + } + } + + for(i=0;i<scfg.total_faddrs;i++) { /* Add AKAs to SEEN-BYs */ + strcpy(seenby," "); + if((!cfg.zone_blind && scfg.faddr[i].zone!=addr.zone) || scfg.faddr[i].point) + continue; + for(j=0;j<seenbys.addrs;j++) + if(!memcmp(&scfg.faddr[i],&seenbys.addr[j],sizeof(faddr_t))) + break; + if(j==seenbys.addrs) { + if(scfg.faddr[i].net!=addr.net || !net_exists) { + net_exists=1; + addr.net=scfg.faddr[i].net; + sprintf(str,"%d/",addr.net); + strcat(seenby,str); } + sprintf(str,"%d",scfg.faddr[i].node); + strcat(seenby,str); + if(lastlen+strlen(seenby)<80) { + fwrite(seenby,strlen(seenby),1,stream); + lastlen+=strlen(seenby); + } + else { + --i; + lastlen=9; /* +strlen(seenby); */ + net_exists=0; + fprintf(stream,"\rSEEN-BY:"); + } + } + } + + lastlen=7; + net_exists=0; + fprintf(stream,"\r\1PATH:"); + addr=getsysfaddr(fmsghdr.destzone); + for(i=0;i<paths.addrs;i++) { /* Put back the original PATH */ + strcpy(seenby," "); + if((!cfg.zone_blind && paths.addr[i].zone!=addr.zone) || paths.addr[i].point) + continue; + if(paths.addr[i].net!=addr.net || !net_exists) { net_exists=1; - addr.net=scfg.faddr[i].net; + addr.net=paths.addr[i].net; sprintf(str,"%d/",addr.net); - strcat(seenby,str); } - sprintf(str,"%d",scfg.faddr[i].node); + strcat(seenby,str); + } + sprintf(str,"%d",paths.addr[i].node); strcat(seenby,str); if(lastlen+strlen(seenby)<80) { fwrite(seenby,strlen(seenby),1,stream); - lastlen+=strlen(seenby); } + lastlen+=strlen(seenby); + } else { --i; - lastlen=9; /* +strlen(seenby); */ + lastlen=7; /* +strlen(seenby); */ net_exists=0; - fprintf(stream,"\rSEEN-BY:"); } } } - - lastlen=7; - net_exists=0; - fprintf(stream,"\r\1PATH:"); - addr=getsysfaddr(fmsghdr.destzone); - for(i=0;i<paths.addrs;i++) { /* Put back the original PATH */ - strcpy(seenby," "); - if(paths.addr[i].zone!=addr.zone || paths.addr[i].point) - continue; - if(paths.addr[i].net!=addr.net || !net_exists) { - net_exists=1; - addr.net=paths.addr[i].net; - sprintf(str,"%d/",addr.net); - strcat(seenby,str); } - sprintf(str,"%d",paths.addr[i].node); - strcat(seenby,str); - if(lastlen+strlen(seenby)<80) { - fwrite(seenby,strlen(seenby),1,stream); - lastlen+=strlen(seenby); } - else { - --i; - lastlen=7; /* +strlen(seenby); */ - net_exists=0; - fprintf(stream,"\r\1PATH:"); } } - - strcpy(seenby," "); /* Add first address with same zone to PATH */ - sysaddr=getsysfaddr(fmsghdr.destzone); - if(!sysaddr.point) { - if(sysaddr.net!=addr.net || !net_exists) { - net_exists=1; - addr.net=sysaddr.net; - sprintf(str,"%d/",addr.net); - strcat(seenby,str); } - sprintf(str,"%d",sysaddr.node); - strcat(seenby,str); - if(lastlen+strlen(seenby)<80) - fwrite(seenby,strlen(seenby),1,stream); - else { - fprintf(stream,"\r\1PATH:"); - fwrite(seenby,strlen(seenby),1,stream); } } + fprintf(stream,"\r\1PATH:"); + } + } - fputc('\r',stream); } + strcpy(seenby," "); /* Add first address with same zone to PATH */ + sysaddr=getsysfaddr(fmsghdr.destzone); + if(!sysaddr.point) { + if(sysaddr.net!=addr.net || !net_exists) { + net_exists=1; + addr.net=sysaddr.net; + sprintf(str,"%d/",addr.net); + strcat(seenby,str); + } + sprintf(str,"%d",sysaddr.node); + strcat(seenby,str); + if(lastlen+strlen(seenby)<80) + fwrite(seenby,strlen(seenby),1,stream); + else { + fprintf(stream,"\r\1PATH:"); + fwrite(seenby,strlen(seenby),1,stream); + } + } + fputc('\r',stream); + } + } fputc(FIDO_PACKED_MSG_TERMINATOR, stream); } @@ -2990,19 +3010,27 @@ void gen_psb(addrlist_t *seenbys,addrlist_t *paths,char *inbuf /****************************************************************************** This function takes the addrs passed to it and compares them to the address - passed in inaddr. 1 is returned if inaddr matches any of the addrs - otherwise a 0 is returned. + passed in compaddr. TRUE is returned if inaddr matches any of the addrs + otherwise FALSE is returned. ******************************************************************************/ -int check_psb(addrlist_t* addrlist,faddr_t inaddr) +BOOL check_psb(addrlist_t* addrlist, faddr_t compaddr) { int i; for(i=0;i<addrlist->addrs;i++) { - if(!memcmp(&addrlist->addr[i],&inaddr,sizeof(faddr_t))) - return(1); + if(!cfg.zone_blind && compaddr.zone != addrlist->addr[i].zone) + continue; + if(compaddr.net != addrlist->addr[i].net) + continue; + if(compaddr.node != addrlist->addr[i].node) + continue; + if(compaddr.point != addrlist->addr[i].point) + continue; + return(TRUE); /* match found */ } - return(0); + return(FALSE); /* match not found */ } + /****************************************************************************** This function strips the message seen-bys and path from inbuf. ******************************************************************************/ diff --git a/src/sbbs3/sbbsecho.h b/src/sbbs3/sbbsecho.h index 8ef2d00a089645934adcca40fc02213f24a21051..2b9beaf8f7adbeb5f92ea4fb5a2b2c4aae8c618f 100644 --- a/src/sbbs3/sbbsecho.h +++ b/src/sbbs3/sbbsecho.h @@ -38,7 +38,7 @@ /* Portions written by Allen Christiansen 1994-1996 */ #define SBBSECHO_VERSION_MAJOR 2 -#define SBBSECHO_VERSION_MINOR 22 +#define SBBSECHO_VERSION_MINOR 23 #define SBBSECHO_PRODUCT_CODE 0x12FF /* from http://ftsc.org/docs/ftscprod.013 */ @@ -241,6 +241,7 @@ typedef struct { echolist_t *listcfg; /* Each echolist configuration */ areasbbs_t *area; /* Each area configuration */ BOOL check_path; /* Enable circular path detection */ + BOOL zone_blind; /* Pretend zones don't matter when parsing and constructing PATH and SEEN-BY lines (per Wilfred van Velzen, 2:280/464) */ } config_t; #ifdef __WATCOMC__