diff --git a/src/sbbs3/sbbsecho.c b/src/sbbs3/sbbsecho.c index d6b1b7dcfd4e92bbb36fbc6b79824e9d256d4dc2..6b5f5ba2a23e26435a1a662723e9de3d91293b3d 100644 --- a/src/sbbs3/sbbsecho.c +++ b/src/sbbs3/sbbsecho.c @@ -71,6 +71,7 @@ bool opt_export_ftn_echomail= false; /* Export msgs previously imported from Fid bool opt_update_msgptrs = false; bool opt_ignore_msgptrs = false; bool opt_leave_msgptrs = false; +bool opt_dump_area_file = false; /* statistics */ ulong netmail=0; /* imported */ @@ -79,7 +80,6 @@ ulong exported_netmail=0; ulong exported_echomail=0; ulong packed_netmail=0; -char tmp[256]; int cur_smb=0; FILE *fidologfile=NULL; bool twit_list; @@ -675,6 +675,7 @@ int create_netmail(const char *to, const smbmsg_t* msg, const char *subject, con ,bool file_attached) { FILE *fp; + char tmp[256]; char fname[MAX_PATH+1]; char* from=NULL; uint i; @@ -850,12 +851,30 @@ bool area_is_linked(unsigned area_num, const fidoaddr_t* addr) return false; } -uint find_linked_echo(const char* echotag, fidoaddr_t addr) +/* Returns area index */ +uint find_area(const char* echotag) { - unsigned i; - for(i=0; i<cfg.areas; i++) - if(stricmp(cfg.area[i].name, echotag) == 0 && area_is_linked(i, &addr)) - return cfg.area[i].sub; + unsigned u; + + for(u=0; u < cfg.areas; u++) + if(stricmp(cfg.area[u].name, echotag) == 0) + break; + + return u; +} + +bool area_is_valid(uint areanum) +{ + return areanum < cfg.areas; +} + +/* Returns subnum */ +uint find_linked_area(const char* echotag, fidoaddr_t addr) +{ + unsigned area; + + if(area_is_valid(area = find_area(echotag)) && area_is_linked(area, &addr)) + return cfg.area[area].sub; return INVALID_SUB; } @@ -974,10 +993,7 @@ void netmail_arealist(enum arealist_type type, fidoaddr_t addr, const char* to) tp=p; FIND_WHITESPACE(tp); *tp=0; - for(y=0;y<cfg.areas;y++) - if(!stricmp(cfg.area[y].name,p)) - break; - if(y>=cfg.areas || !area_is_linked(y,&addr)) { + if(find_linked_area(p, addr) == INVALID_SUB) { if(strListFind(area_list, p, /* case_sensitive */false) < 0) strListPush(&area_list, p); } @@ -1276,11 +1292,7 @@ void alter_areas(str_list_t add_area, str_list_t del_area, fidoaddr_t addr, cons FIND_WHITESPACE(tp); *tp=0; if(add_area[0]!=NULL && stricmp(add_area[0],"+ALL")==0) { - SAFECOPY(tmp,p); - for(y=0;y<cfg.areas;y++) - if(stricmp(p, cfg.area[y].name) == 0) - break; - if(y<cfg.areas) + if(area_is_valid(find_area(p))) continue; } for(y=0;add_area[y]!=NULL;y++) @@ -1476,7 +1488,7 @@ void areafix_command(char* instr, fidoaddr_t addr, const char* to) if(strnicmp(instr, "RESCAN ", 7) == 0) { char* p = instr + 7; SKIP_WHITESPACE(p); - int subnum = find_linked_echo(p, addr); + int subnum = find_linked_area(p, addr); if(subnum == INVALID_SUB) SAFEPRINTF(str, "Echo-tag '%s' not linked or not found.", p); else { @@ -2296,7 +2308,7 @@ ushort matchname(const char *inname) static username_t *username; ulong last_user; int userdat,i; - char str[256],name[LEN_NAME+1],alias[LEN_ALIAS+1]; + char str[256],name[LEN_NAME+1],alias[LEN_ALIAS+1],misc[9]; ulong l; if(!total_users) { /* Load CRCs */ @@ -2324,13 +2336,13 @@ ushort matchname(const char *inname) read(userdat,alias,LEN_ALIAS); read(userdat,name,LEN_NAME); lseek(userdat,(long)(((long)total_users)*U_LEN)+U_MISC,SEEK_SET); - read(userdat,tmp,8); + read(userdat,misc,8); for(i=0;i<8;i++) - if(tmp[i]==ETX || tmp[i]=='\r') break; - tmp[i]=0; + if(misc[i]==ETX || misc[i]=='\r') break; + misc[i]=0; unlock(userdat,(long)((long)(total_users)*U_LEN)+U_ALIAS ,LEN_ALIAS+LEN_NAME); - if(ahtoul(tmp)&DELETED) + if(ahtoul(misc)&DELETED) continue; for(i=0;i<LEN_ALIAS;i++) if(alias[i]==ETX || alias[i]=='\r') break; @@ -2519,6 +2531,15 @@ char* getfmsg(FILE* stream, ulong* outlen) #define MAX_TAILLEN 1024 +enum { + IMPORT_FAILURE = -1 + ,IMPORT_SUCCESS = SMB_SUCCESS + ,IMPORT_FILTERED_DUPE = SMB_DUPE_MSG + ,IMPORT_FILTERED_TWIT = 2 + ,IMPORT_FILTERED_EMPTY = 3 + ,IMPORT_FILTERED_AGE = 4 +}; + /****************************************************************************/ /* Coverts a FidoNet message into a Synchronet message */ /* Returns 0 on success, 1 dupe, 2 filtered, 3 empty, 4 too-old */ @@ -2546,7 +2567,7 @@ int fmsgtosmsg(char* fbuf, fmsghdr_t fmsghdr, uint user, uint subnum) sprintf(fname,"%stwitlist.cfg",scfg.ctrl_dir); if(findstr(fmsghdr.from,fname) || findstr(fmsghdr.to,fname)) { lprintf(LOG_INFO,"Filtering message from %s to %s",fmsghdr.from,fmsghdr.to); - return(2); + return IMPORT_FILTERED_TWIT; } } @@ -2566,7 +2587,7 @@ int fmsgtosmsg(char* fbuf, fmsghdr_t fmsghdr, uint user, uint subnum) lprintf(LOG_INFO, "Filtering message from %s due to age: %1.1f days" ,fmsghdr.from ,(now - msg.hdr.when_written.time) / (24.0*60.0*60.0)); - return 4; + return IMPORT_FILTERED_AGE; } origaddr.zone=fmsghdr.origzone; /* only valid if NetMail */ @@ -2592,14 +2613,14 @@ int fmsgtosmsg(char* fbuf, fmsghdr_t fmsghdr, uint user, uint subnum) if(fbuf==NULL) { lprintf(LOG_ERR,"ERROR line %d allocating fbuf",__LINE__); smb_freemsgmem(&msg); - return(-1); + return IMPORT_FAILURE; } length=strlen((char *)fbuf); if((sbody=(uchar*)malloc((length+1)*2))==NULL) { lprintf(LOG_ERR,"ERROR line %d allocating %lu bytes for body",__LINE__ ,(length+1)*2L); smb_freemsgmem(&msg); - return(-1); + return IMPORT_FAILURE; } for(col=l=esc=done=bodylen=taillen=0,cr=1;l<length;l++) { @@ -2801,7 +2822,7 @@ int fmsgtosmsg(char* fbuf, fmsghdr_t fmsghdr, uint user, uint subnum) lprintf(LOG_INFO,"Empty NetMail - Ignored "); smb_freemsgmem(&msg); free(sbody); - return(3); + return IMPORT_FILTERED_EMPTY; } if(!origaddr.zone && subnum==INVALID_SUB) @@ -3626,7 +3647,7 @@ int import_netmail(const char* path, fmsghdr_t hdr, FILE* fidomsg, const char* i SAFECOPY(hdr.from,"SBBSecho"); SAFECOPY(hdr.subj,"Areafix Request"); hdr.origzone=hdr.orignet=hdr.orignode=hdr.origpoint=0; - if(fmsgtosmsg(p,hdr,notify,INVALID_SUB)==0) { + if(fmsgtosmsg(p,hdr,notify,INVALID_SUB) == IMPORT_SUCCESS) { sprintf(str,"\7\1n\1hSBBSecho \1n\1msent you mail\r\n"); putsmsg(&scfg,notify,str); } @@ -3660,15 +3681,15 @@ int import_netmail(const char* path, fmsghdr_t hdr, FILE* fidomsg, const char* i fmsgbuf=getfmsg(fidomsg,&length); switch(i=fmsgtosmsg(fmsgbuf,hdr,usernumber,INVALID_SUB)) { - case 0: /* success */ + case IMPORT_SUCCESS: /* success */ break; - case 2: /* filtered */ + case IMPORT_FILTERED_DUPE: /* filtered */ lprintf(LOG_WARNING,"%s Filtered - Ignored",info); break; - case 3: /* empty */ + case IMPORT_FILTERED_EMPTY: /* empty */ lprintf(LOG_WARNING,"%s Empty - Ignored",info); break; - case 4: /* too-old */ + case IMPORT_FILTERED_AGE: /* too-old */ lprintf(LOG_WARNING,"%s Filtered - Too Old", info); break; default: @@ -4696,18 +4717,14 @@ void import_packets(const char* inbound, nodecfg_t* inbox, bool secure) continue; } - for(i=0;i<cfg.areas;i++) /* Do we carry this area? */ - if(stricmp(cfg.area[i].name, areatag) == 0) { - if(cfg.area[i].sub!=INVALID_SUB) - printf("%s ",scfg.sub[cfg.area[i].sub]->code); - else - printf("(Passthru) "); - fmsgbuf=getfmsg(fidomsg,NULL); - gen_psb(&msg_seen,&msg_path,fmsgbuf,pkt_orig.zone); /* was destzone */ - break; - } - - if(i==cfg.areas) { + if(area_is_valid(i = find_area(areatag))) { /* Do we carry this area? */ + if(cfg.area[i].sub!=INVALID_SUB) + printf("%s ",scfg.sub[cfg.area[i].sub]->code); + else + printf("(Passthru) "); + fmsgbuf=getfmsg(fidomsg,NULL); + gen_psb(&msg_seen,&msg_path,fmsgbuf,pkt_orig.zone); /* was destzone */ + } else { printf("(Unknown) "); if(cfg.badecho>=0) { i=cfg.badecho; @@ -4827,12 +4844,12 @@ void import_packets(const char* inbound, nodecfg_t* inbox, bool secure) /**********************/ result=fmsgtosmsg(fmsgbuf,hdr,0,cfg.area[i].sub); - if(result==SMB_DUPE_MSG) { + if(result==IMPORT_FILTERED_DUPE) { lprintf(LOG_NOTICE, "%s Duplicate message from %s (%s) to %s, subject: %s" ,areatag, hdr.from, fmsghdr_srcaddr_str(&hdr), hdr.to, hdr.subj); cfg.area[i].dupes++; } - else if(result==SMB_SUCCESS || cfg.relay_filtered_msgs) { /* Not a dupe */ + else if(result==IMPORT_SUCCESS || (result==IMPORT_FILTERED_AGE && cfg.relay_filtered_msgs)) { /* Not a dupe */ strip_psb(fmsgbuf); pkt_to_pkt(fmsgbuf,curarea,NULL,hdr,msg_seen,msg_path); } @@ -4874,6 +4891,8 @@ int main(int argc, char **argv) char str[1025],path[MAX_PATH+1] ,*p,*tp; char* sub_code = NULL; + char tmp_code[LEN_EXTCODE+1]; + char area_tag[FIDO_AREATAG_LEN+1]; char cmdline[256]; int i,j,fmsg; size_t f; @@ -4902,6 +4921,7 @@ int main(int argc, char **argv) " * Export echomail previously imported from FTN (-h to enable)\n" " * Update echomail export pointers without exporting messages (-u to enable)\n" " * Generate AreaFix netmail reports/notifications for links (-g to enable)\n" + " * Display the parsed area file (e.g. AREAS.BBS) for debugging (-a to enable)\n" " * Prompt for key-press upon normal exit (-@ to enable)\n" " * Prompt for key-press upon abnormal exit (-w to enable)\n" ; @@ -4984,12 +5004,14 @@ int main(int argc, char **argv) case 'W': pause_on_abend=true; break; + case 'A': + opt_dump_area_file=true; + break; default: fprintf(stderr, "Unsupported option: %c\n", argv[i][j]); case '?': printf("%s", usage); bail(0); - case 'A': case 'B': case 'D': case 'F': @@ -5125,6 +5147,7 @@ int main(int argc, char **argv) if(*p==';' || !*p) /* Ignore blank lines or start with ; */ continue; if((cfg.area=(area_t *)realloc(cfg.area,sizeof(area_t)*(cfg.areas+1)))==NULL) { + printf("\n"); lprintf(LOG_ERR,"ERROR allocating memory for area #%u.",cfg.areas+1); bail(1); return -1; @@ -5133,27 +5156,34 @@ int main(int argc, char **argv) cfg.area[cfg.areas].sub=INVALID_SUB; /* Default to passthru */ - sprintf(tmp,"%-.*s",LEN_EXTCODE,p); - tp=tmp; + sprintf(tmp_code,"%-.*s",LEN_EXTCODE,p); + tp=tmp_code; FIND_WHITESPACE(tp); *tp=0; for(i=0;i<scfg.total_subs;i++) - if(!stricmp(tmp,scfg.sub[i]->code)) + if(!stricmp(tmp_code,scfg.sub[i]->code)) break; if(i<scfg.total_subs) cfg.area[cfg.areas].sub=i; - else if(stricmp(tmp,"P")) { - lprintf(LOG_WARNING,"%s: Unrecognized internal code, assumed passthru",tmp); + else if(stricmp(tmp_code,"P")) { + printf("\n"); + lprintf(LOG_WARNING,"%s: Unrecognized internal code, assumed passthru",tmp_code); } FIND_WHITESPACE(p); /* Skip code */ SKIP_WHITESPACE(p); /* Skip white space */ - SAFECOPY(tmp,p); /* Area tag */ - truncstr(tmp,"\t "); - strupr(tmp); - if(tmp[0]=='*') /* UNKNOWN-ECHO area */ + SAFECOPY(area_tag,p); /* Area tag */ + truncstr(area_tag,"\t "); + strupr(area_tag); + if(area_tag[0]=='*') /* UNKNOWN-ECHO area */ cfg.badecho=cfg.areas; - if((cfg.area[cfg.areas].name=strdup(tmp))==NULL) { + if(area_is_valid(find_area(area_tag))) { + printf("\n"); + lprintf(LOG_WARNING, "DUPLICATE AREA (%s) in area file (%s), IGNORED!", area_tag, cfg.areafile); + continue; + } + if((cfg.area[cfg.areas].name=strdup(area_tag))==NULL) { + printf("\n"); lprintf(LOG_ERR,"ERROR allocating memory for area #%u tag name." ,cfg.areas+1); bail(1); @@ -5165,12 +5195,14 @@ int main(int argc, char **argv) while(*p && *p!=';') { if(!isdigit(*p)) { + printf("\n"); lprintf(LOG_WARNING, "Invalid Area File line, expected link address(es) after echo-tag: '%s'", str); break; } if((cfg.area[cfg.areas].link=(fidoaddr_t *) realloc(cfg.area[cfg.areas].link ,sizeof(fidoaddr_t)*(cfg.area[cfg.areas].links+1)))==NULL) { + printf("\n"); lprintf(LOG_ERR,"ERROR allocating memory for area #%u links." ,cfg.areas+1); bail(1); @@ -5178,10 +5210,11 @@ int main(int argc, char **argv) } fidoaddr_t link = atofaddr(p); cfg.area[cfg.areas].link[cfg.area[cfg.areas].links] = link; - if(findnodecfg(&cfg, link, /* exact: */false) == NULL) + if(findnodecfg(&cfg, link, /* exact: */false) == NULL) { + printf("\n"); lprintf(LOG_WARNING, "Configuration for %s-linked-node (%s) not found in %s" ,cfg.area[cfg.areas].name, faddrtoa(&link), cfg.cfgfile); - else + } else cfg.area[cfg.areas].links++; FIND_WHITESPACE(p); /* Skip address */ SKIP_WHITESPACE(p); /* Skip white space */ @@ -5192,7 +5225,19 @@ int main(int argc, char **argv) } fclose(stream); - printf("\n"); + printf("\nRead %u areas from %s\n", cfg.areas, cfg.areafile); + + if(opt_dump_area_file) { + printf("Area file dump (%u areas):\n", cfg.areas); + for(unsigned u=0; u < cfg.areas && !terminated; u++) { + printf("%-*s %-*s " + ,LEN_EXTCODE, cfg.area[u].sub == INVALID_SUB ? "P" : scfg.sub[cfg.area[u].sub]->code + ,FIDO_AREATAG_LEN, cfg.area[u].name); + for(unsigned l=0; l < cfg.area[u].links && !terminated; l++) + printf("%s ", faddrtoa(&cfg.area[u].link[l])); + printf("\n"); + } + } if(opt_gen_notify_list && !terminated) { lprintf(LOG_DEBUG,"Generating AreaFix Notifications...");