diff --git a/src/sbbs3/echocfg.c b/src/sbbs3/echocfg.c new file mode 100644 index 0000000000000000000000000000000000000000..4cf55dd9d2ac7354474c9f0babc2a5a456ca5aa9 --- /dev/null +++ b/src/sbbs3/echocfg.c @@ -0,0 +1,1139 @@ +/* ECHOCFG.C */ + +/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ + +/* Portions written by Allen Christiansen 1994-1996 */ + +#include <uifc.h> + +#ifndef __unix__ +#include <sys\stat.h> +#endif + +#include "gen_defs.h" +#include "sbbsdefs.h" +#include "sbbsecho.h" +#include "dirwrap.h" + +char **opt; + +// void uifc.bail(int code); +int main(); +char *wcfaddrtoa(faddr_t addr); + +uchar node_swap=1; +long misc=0; +config_t cfg; + +unsigned _stklen=16000; + +uifcapi_t uifc; + +/* +void uifc.bail(int code) +{ + +if(code) + getch(); +uifc.bail(); +exit(code); +} +*/ + +// ToDo Fix This. +#define lprintf printf + +int main(int argc, char **argv) +{ + char str[256],*p; + int i,j,k,x,file,dflt,nodeop=0; + FILE *stream; + echolist_t savlistcfg; + nodecfg_t savnodecfg; + arcdef_t savarcdef; + +fprintf(stderr,"\nSBBSecho Configuration Version %s Developed 1995-1997 " + "Rob Swindell\n\n",SBBSECHO_VER); + +memset(&cfg,0,sizeof(config_t)); +if(argc>1) + strcpy(str,argv[1]); +else { + p=getenv("SBBSCTRL"); + if(!p) { + p=getenv("SBBSNODE"); + if(!p) { + printf("usage: echocfg [cfg_file]\n"); + exit(1); } + strcpy(str,p); + if(str[strlen(str)-1]!='/') + strcat(str,"/"); + strcat(str,"../ctrl/sbbsecho.cfg"); } + else { + strcpy(str,p); + if(str[strlen(str)-1]!='/') + strcat(str,"/"); + strcat(str,"sbbsecho.cfg"); } } +strcpy(cfg.cfgfile,str); +// strupr(cfg.cfgfile); + +read_cfg(); + +// savnum=0; +if((opt=(char **)MALLOC(sizeof(char *)*300))==NULL) { +// ToDo fix this. +// cputs("memory allocation error\r\n"); +// uifc.bail(); } + exit(1); } +for(i=0;i<300;i++) + if((opt[i]=(char *)MALLOC(MAX_OPLN))==NULL) { +// ToDo fix this. +// cputs("memory allocation error\r\n"); +// uifc.bail(); } + exit(1); } +uifc.size=sizeof(uifc); +#ifdef USE_DIALOG +uifcinid(&uifc); +#elif defined USE_CURSES +uifcinic(&uifc); +#else +uifcinix(&uifc); +#endif +sprintf(str,"SBBSecho Configuration v%s",SBBSECHO_VER); +uifc.scrn(str); + +dflt=0; +while(1) { + uifc.helpbuf= +" SBBSecho Configuration \r\n\r\n" +"Move through the various options using the arrow keys. Select the\r\n" +"highlighted options by pressing ENTER.\r\n\r\n"; + i=0; + sprintf(opt[i++],"%-30.30s %s","Mailer Type" + ,misc&FLO_MAILER ? "Binkley/FLO":"FrontDoor/Attach"); + sprintf(opt[i++],"%-30.30s %luK","Maximum Packet Size" + ,cfg.maxpktsize/1024UL); + sprintf(opt[i++],"%-30.30s %luK","Maximum Bundle Size" + ,cfg.maxbdlsize/1024UL); + if(cfg.notify) + sprintf(str,"User #%u",cfg.notify); + else + strcpy(str,"Disabled"); + sprintf(opt[i++],"%-30.30s %s","Areafix Failure Notification",str); + sprintf(opt[i++],"Nodes..."); + sprintf(opt[i++],"Paths..."); + sprintf(opt[i++],"Log Options..."); + sprintf(opt[i++],"Toggle Options..."); + sprintf(opt[i++],"Archive Programs..."); + sprintf(opt[i++],"Additional Echo Lists..."); + opt[i][0]=NULL; + switch(uifc.list(WIN_ORG|WIN_MID|WIN_ACT|WIN_ESC,0,0,52,&dflt,0 + ,cfg.cfgfile,opt)) { + + case 0: + misc^=FLO_MAILER; + break; + + case 1: +uifc.helpbuf= +" Maximum Packet Size \r\n\r\n" +"This is the maximum file size that SBBSecho will create when placing\r\n" +"outgoing messages into packets. The default size is 250k.\r\n"; + sprintf(str,"%lu",cfg.maxpktsize); + uifc.input(WIN_MID|WIN_BOT,0,0,"Maximum Packet Size",str + ,9,K_EDIT|K_NUMBER); + cfg.maxpktsize=atol(str); + break; + + case 2: +uifc.helpbuf= +" Maximum Bundle Size \r\n\r\n" +"This is the maximum file size that SBBSecho will create when placing\r\n" +"outgoing packets into bundles. The default size is 250k.\r\n"; + sprintf(str,"%lu",cfg.maxbdlsize); + uifc.input(WIN_MID|WIN_BOT,0,0,"Maximum Bundle Size",str + ,9,K_EDIT|K_NUMBER); + cfg.maxbdlsize=atol(str); + break; + + case 3: +uifc.helpbuf= +" Areafix Failure Notification \r\n\r\n" +"Setting this option to a user number (usually #1), enables the\r\n" +"automatic notification of that user, via e-mail, of failed areafix\r\n" +"attempts. Setting this option to 0, disables this feature.\r\n"; + sprintf(str,"%u",cfg.notify); + uifc.input(WIN_MID|WIN_BOT,0,0,"Areafix Notification User Number",str + ,5,K_EDIT|K_NUMBER); + cfg.notify=atoi(str); + break; + + case 4: +uifc.helpbuf= +" Nodes... \r\n\r\n" +"From this menu you can configure the area manager options for your\r\n" +"uplink nodes.\r\n"; + i=0; + while(1) { + for(j=0;j<cfg.nodecfgs;j++) + strcpy(opt[j],wcfaddrtoa(cfg.nodecfg[j].faddr)); + opt[j][0]=0; + i=uifc.list(WIN_ORG|WIN_INS|WIN_DEL|WIN_ACT|WIN_GET|WIN_PUT + |WIN_INSACT|WIN_DELACT|WIN_XTR + ,0,0,0,&i,0,"Nodes",opt); + if(i==-1) + break; + if((i&MSK_ON)==MSK_INS) { + i&=MSK_OFF; + str[0]=0; +uifc.helpbuf= +" Address \r\n\r\n" +"This is the FidoNet style address of the node you wish to add\r\n"; + if(uifc.input(WIN_MID,0,0 + ,"Node Address (ALL wildcard allowed)",str + ,25,K_EDIT)<1) + continue; + if((cfg.nodecfg=(nodecfg_t *)REALLOC(cfg.nodecfg + ,sizeof(nodecfg_t)*(cfg.nodecfgs+1)))==NULL) { + printf("\nMemory Allocation Error\n"); + exit(1); } + for(j=cfg.nodecfgs;j>i;j--) + memcpy(&cfg.nodecfg[j],&cfg.nodecfg[j-1] + ,sizeof(nodecfg_t)); + cfg.nodecfgs++; + memset(&cfg.nodecfg[i],0,sizeof(nodecfg_t)); + cfg.nodecfg[i].faddr=atofaddr(str); + continue; } + + if((i&MSK_ON)==MSK_DEL) { + i&=MSK_OFF; + cfg.nodecfgs--; + if(cfg.nodecfgs<=0) { + cfg.nodecfgs=0; + continue; } + for(j=i;j<cfg.nodecfgs;j++) + memcpy(&cfg.nodecfg[j],&cfg.nodecfg[j+1] + ,sizeof(nodecfg_t)); + if((cfg.nodecfg=(nodecfg_t *)REALLOC(cfg.nodecfg + ,sizeof(nodecfg_t)*(cfg.nodecfgs)))==NULL) { + printf("\nMemory Allocation Error\n"); + exit(1); } + continue; } + if((i&MSK_ON)==MSK_GET) { + i&=MSK_OFF; + memcpy(&savnodecfg,&cfg.nodecfg[i],sizeof(nodecfg_t)); + continue; } + if((i&MSK_ON)==MSK_PUT) { + i&=MSK_OFF; + memcpy(&cfg.nodecfg[i],&savnodecfg,sizeof(nodecfg_t)); + continue; } + while(1) { +uifc.helpbuf= +" Node Options \r\n\r\n" +"These are the configurable options available for this node.\r\n"; + j=0; + sprintf(opt[j++],"%-20.20s %s","Address" + ,wcfaddrtoa(cfg.nodecfg[i].faddr)); + sprintf(opt[j++],"%-20.20s %s","Archive Type" + ,cfg.nodecfg[i].arctype>cfg.arcdefs ? + "None":cfg.arcdef[cfg.nodecfg[i].arctype].name); + sprintf(opt[j++],"%-20.20s %s","Packet Type" + ,cfg.nodecfg[i].pkt_type==PKT_TWO ? "2" + :cfg.nodecfg[i].pkt_type==PKT_TWO_TWO ? "2.2":"2+"); + sprintf(opt[j++],"%-20.20s %s","Packet Password" + ,cfg.nodecfg[i].pktpwd); + sprintf(opt[j++],"%-20.20s %s","Areafix Password" + ,cfg.nodecfg[i].password); + str[0]=0; + for(k=0;k<cfg.nodecfg[i].numflags;k++) { + strcat(str,cfg.nodecfg[i].flag[k].flag); + strcat(str," "); } + sprintf(opt[j++],"%-20.20s %s","Areafix Flags",str); + sprintf(opt[j++],"%-20.20s %s","Status" + ,cfg.nodecfg[i].attr&ATTR_CRASH ? "Crash" + :cfg.nodecfg[i].attr&ATTR_HOLD ? "Hold" : "None"); + sprintf(opt[j++],"%-20.20s %s","Direct" + ,cfg.nodecfg[i].attr&ATTR_DIRECT ? "Yes":"No"); + sprintf(opt[j++],"%-20.20s %s","Passive" + ,cfg.nodecfg[i].attr&ATTR_PASSIVE ? "Yes":"No"); + sprintf(opt[j++],"%-20.20s %s","Send Notify List" + ,cfg.nodecfg[i].attr&SEND_NOTIFY ? "Yes" : "No"); + if(misc&FLO_MAILER) + sprintf(opt[j++],"%-20.20s %s","Route To" + ,cfg.nodecfg[i].route.zone + ? wcfaddrtoa(cfg.nodecfg[i].route) : "Disabled"); + opt[j][0]=0; + k=uifc.list(WIN_MID|WIN_ACT,0,0,40,&nodeop,0 + ,wcfaddrtoa(cfg.nodecfg[i].faddr),opt); + if(k==-1) + break; + switch(k) { + case 0: +uifc.helpbuf= +" Address \r\n\r\n" +"This is the FidoNet style address of this node.\r\n"; + strcpy(str,wcfaddrtoa(cfg.nodecfg[i].faddr)); + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Node Address (ALL wildcard allowed)",str + ,25,K_EDIT|K_UPPER); + cfg.nodecfg[i].faddr=atofaddr(str); + break; + case 1: +uifc.helpbuf= +" Archive Type \r\n\r\n" +"This is the compression type that will be used for compressing packets\r\n" +"to and decompressing packets from this node.\r\n"; + for(j=0;j<cfg.arcdefs;j++) + strcpy(opt[j],cfg.arcdef[j].name); + strcpy(opt[j++],"None"); + opt[j][0]=0; + if(cfg.nodecfg[i].arctype<j) + j=cfg.nodecfg[i].arctype; + k=uifc.list(WIN_RHT|WIN_SAV,0,0,0,&j,0 + ,"Archive Type",opt); + if(k==-1) + break; + if(k>=cfg.arcdefs) + cfg.nodecfg[i].arctype=0xffff; + else + cfg.nodecfg[i].arctype=k; + break; + case 2: +uifc.helpbuf= +" Packet Type \r\n\r\n" +"This is the packet header type that will be used in mail packets to\r\n" +"this node. SBBSecho defaults to using type 2.2.\r\n"; + j=0; + strcpy(opt[j++],"2+"); + strcpy(opt[j++],"2.2"); + strcpy(opt[j++],"2"); + opt[j][0]=0; + j=cfg.nodecfg[i].pkt_type; + k=uifc.list(WIN_RHT|WIN_SAV,0,0,0,&j,0,"Packet Type" + ,opt); + if(k==-1) + break; + cfg.nodecfg[i].pkt_type=k; + break; + case 3: +uifc.helpbuf= +" Packet Password \r\n\r\n" +"This is an optional password that SBBSecho will place into packets\r\n" +"destined for this node.\r\n"; + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Packet Password (optional)" + ,cfg.nodecfg[i].pktpwd,8,K_EDIT|K_UPPER); + break; + case 4: +uifc.helpbuf= +" Areafix Password \r\n\r\n" +"This is the password that will be used by this node when doing remote\r\n" +"areamanager functions.\r\n"; + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Areafix Password" + ,cfg.nodecfg[i].password,8,K_EDIT|K_UPPER); + break; + case 5: +uifc.helpbuf= +" Areafix Flag \r\n\r\n" +"This is a flag to to be given to this node allowing access to one or\r\n" +"more of the configured echo lists\r\n"; + while(1) { + for(j=0;j<cfg.nodecfg[i].numflags;j++) + strcpy(opt[j],cfg.nodecfg[i].flag[j].flag); + opt[j][0]=0; + k=uifc.list(WIN_SAV|WIN_INS|WIN_DEL|WIN_ACT| + WIN_XTR|WIN_INSACT|WIN_DELACT|WIN_RHT + ,0,0,0,&k,0,"Areafix Flags",opt); + if(k==-1) + break; + if((k&MSK_ON)==MSK_INS) { + k&=MSK_OFF; + str[0]=0; + if(uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Areafix Flag",str,4 + ,K_EDIT|K_UPPER)<1) + continue; + if((cfg.nodecfg[i].flag=(flag_t *) + REALLOC(cfg.nodecfg[i].flag + ,sizeof(flag_t)* + (cfg.nodecfg[i].numflags+1)))==NULL) { + printf("\nMemory Allocation Error\n"); + exit(1); } + for(j=cfg.nodecfg[i].numflags;j>i;j--) + memcpy(&cfg.nodecfg[i].flag[j] + ,&cfg.nodecfg[i].flag[j-1] + ,sizeof(flag_t)); + cfg.nodecfg[i].numflags++; + memset(&cfg.nodecfg[i].flag[k].flag + ,0,sizeof(flag_t)); + strcpy(cfg.nodecfg[i].flag[k].flag,str); + continue; } + + if((k&MSK_ON)==MSK_DEL) { + k&=MSK_OFF; + cfg.nodecfg[i].numflags--; + if(cfg.nodecfg[i].numflags<=0) { + cfg.nodecfg[i].numflags=0; + continue; } + for(j=k;j<cfg.nodecfg[i].numflags;j++) + strcpy(cfg.nodecfg[i].flag[j].flag + ,cfg.nodecfg[i].flag[j+1].flag); + if((cfg.nodecfg[i].flag=(flag_t *) + REALLOC(cfg.nodecfg[i].flag + ,sizeof(flag_t)* + (cfg.nodecfg[i].numflags)))==NULL) { + printf("\nMemory Allocation Error\n"); + exit(1); } + continue; } + strcpy(str,cfg.nodecfg[i].flag[k].flag); + uifc.input(WIN_MID|WIN_SAV,0,0,"Areafix Flag" + ,str,4,K_EDIT|K_UPPER); + strcpy(cfg.nodecfg[i].flag[k].flag,str); + continue; } + break; + case 6: + if(cfg.nodecfg[i].attr&ATTR_CRASH) { + cfg.nodecfg[i].attr^=ATTR_CRASH; + cfg.nodecfg[i].attr|=ATTR_HOLD; + break; } + if(cfg.nodecfg[i].attr&ATTR_HOLD) { + cfg.nodecfg[i].attr^=ATTR_HOLD; + break; } + cfg.nodecfg[i].attr|=ATTR_CRASH; + break; + case 7: + cfg.nodecfg[i].attr^=ATTR_DIRECT; + break; + case 8: + cfg.nodecfg[i].attr^=ATTR_PASSIVE; + break; + case 9: + cfg.nodecfg[i].attr^=SEND_NOTIFY; + break; + case 10: +uifc.helpbuf= +" Route To \r\n\r\n" +"When using a FLO type mailer, this is the node number of an address\r\n" +"to route mail to for this node.\r\n"; + strcpy(str,wcfaddrtoa(cfg.nodecfg[i].route)); + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Node Address to Route To",str + ,25,K_EDIT); + if(str[0]) + cfg.nodecfg[i].route=atofaddr(str); + break; + } } } + break; + + case 5: +uifc.helpbuf= +" Paths... \r\n\r\n" +"From this menu you can configure the paths that SBBSecho will use\r\n" +"when importing and exporting.\r\n"; + j=0; + while(1) { + i=0; + sprintf(opt[i++],"%-30.30s %s","Inbound Directory" + ,cfg.inbound[0] ? cfg.inbound : "<Specified in SCFG>"); + sprintf(opt[i++],"%-30.30s %s","Secure Inbound (optional)" + ,cfg.secure[0] ? cfg.secure : "None Specified"); + sprintf(opt[i++],"%-30.30s %s","Outbound Directory" + ,cfg.outbound); + sprintf(opt[i++],"%-30.30s %s","Area File" + ,cfg.areafile[0] ? cfg.areafile + : "SCFG->data/areas.bbs"); + sprintf(opt[i++],"%-30.30s %s","Log File" + ,cfg.logfile[0] ? cfg.logfile + : "SCFG->data/sbbsecho.log"); + opt[i][0]=NULL; + j=uifc.list(WIN_MID|WIN_ACT,0,0,60,&j,0 + ,"Paths and Filenames",opt); + if(j==-1) + break; + switch(j) { + case 0: +uifc.helpbuf= +" Inbound Directory \r\n\r\n" +"This is the complete path (drive and directory) where your front\r\n" +"end mailer stores, and where SBBSecho will look for, incoming message\r\n" +"bundles and packets."; + uifc.input(WIN_MID|WIN_SAV,0,0,"Inbound",cfg.inbound + ,50,K_EDIT); + break; + + case 1: +uifc.helpbuf= +" Secure Inbound Directory \r\n\r\n" +"This is the complete path (drive and directory) where your front\r\n" +"end mailer stores, and where SBBSecho will look for, incoming message\r\n" +"bundles and packets for SECURE sessions."; + uifc.input(WIN_MID|WIN_SAV,0,0,"Secure Inbound",cfg.secure + ,50,K_EDIT); + break; + + case 2: +uifc.helpbuf= +" Outbound Directory \r\n\r\n" +"This is the complete path (drive and directory) where your front\r\n" +"end mailer will look for, and where SBBSecho will place, outgoing\r\n" +"message bundles and packets."; + uifc.input(WIN_MID|WIN_SAV,0,0,"Outbound",cfg.outbound + ,50,K_EDIT); + break; + + case 3: +uifc.helpbuf= +" Area File \r\n\r\n" +"This is the complete path (drive, directory, and filename) of the\r\n" +"file SBBSecho will use as your AREAS.BBS file."; + uifc.input(WIN_MID|WIN_SAV,0,0,"Areafile",cfg.areafile + ,50,K_EDIT); + break; + + case 4: +uifc.helpbuf= +" Log File \r\n\r\n" +"This is the complete path (drive, directory, and filename) of the\r\n" +"file SBBSecho will use to log information each time it is run."; + uifc.input(WIN_MID|WIN_SAV,0,0,"Logfile",cfg.logfile + ,50,K_EDIT); + break; } } + break; + case 6: +uifc.helpbuf= +" Log Options \r\n" +"\r\n" +"Each loggable item can be toggled off or on from this menu. You must run\r\n" +"SBBSecho with the /L command line option for any of these items to be\r\n" +"logged."; + j=0; + while(1) { + i=0; + strcpy(opt[i++],"ALL"); + strcpy(opt[i++],"NONE"); + strcpy(opt[i++],"DEFAULT"); + sprintf(opt[i++],"%-35.35s%-3.3s","Ignored NetMail Messages" + ,cfg.log&LOG_IGNORED ? "Yes":"No"); + sprintf(opt[i++],"%-35.35s%-3.3s","NetMail for Unknown Users" + ,cfg.log&LOG_UNKNOWN ? "Yes":"No"); + sprintf(opt[i++],"%-35.35s%-3.3s","Areafix NetMail Messages" + ,cfg.log&LOG_AREAFIX ? "Yes":"No"); + sprintf(opt[i++],"%-35.35s%-3.3s","Imported NetMail Messages" + ,cfg.log&LOG_IMPORTED ? "Yes":"No"); + sprintf(opt[i++],"%-35.35s%-3.3s","Packing Out-bound NetMail" + ,cfg.log&LOG_PACKING ? "Yes":"No"); + sprintf(opt[i++],"%-35.35s%-3.3s","Routing Out-bound NetMail" + ,cfg.log&LOG_ROUTING ? "Yes":"No"); + sprintf(opt[i++],"%-35.35s%-3.3s","In-bound Packet Information" + ,cfg.log&LOG_PACKETS ? "Yes":"No"); + sprintf(opt[i++],"%-35.35s%-3.3s","In-bound Security Violations" + ,cfg.log&LOG_SECURITY ? "Yes":"No"); + sprintf(opt[i++],"%-35.35s%-3.3s","In-bound Grunged Messages" + ,cfg.log&LOG_GRUNGED ? "Yes":"No"); + sprintf(opt[i++],"%-35.35s%-3.3s","Disallowed Private EchoMail" + ,cfg.log&LOG_PRIVATE ? "Yes":"No"); + sprintf(opt[i++],"%-35.35s%-3.3s","Circular EchoMail Messages" + ,cfg.log&LOG_CIRCULAR ? "Yes":"No"); + sprintf(opt[i++],"%-35.35s%-3.3s","Duplicate EchoMail Messages" + ,cfg.log&LOG_DUPES ? "Yes":"No"); + sprintf(opt[i++],"%-35.35s%-3.3s","Area Totals" + ,cfg.log&LOG_AREA_TOTALS ? "Yes":"No"); + sprintf(opt[i++],"%-35.35s%-3.3s","Over-All Totals" + ,cfg.log&LOG_TOTALS ? "Yes":"No"); + opt[i][0]=NULL; + j=uifc.list(0,0,0,43,&j,0,"Log Options",opt); + if(j==-1) + break; + switch(j) { + case 0: + cfg.log=~0L; + break; + case 1: + cfg.log=0; + break; + case 2: + cfg.log=LOG_DEFAULTS; + break; + case 3: + cfg.log^=LOG_IGNORED; + break; + case 4: + cfg.log^=LOG_UNKNOWN; + break; + case 5: + cfg.log^=LOG_AREAFIX; + break; + case 6: + cfg.log^=LOG_IMPORTED; + break; + case 7: + cfg.log^=LOG_PACKING; + break; + case 8: + cfg.log^=LOG_ROUTING; + break; + case 9: + cfg.log^=LOG_PACKETS; + break; + case 10: + cfg.log^=LOG_SECURITY; + break; + case 11: + cfg.log^=LOG_GRUNGED; + break; + case 12: + cfg.log^=LOG_PRIVATE; + break; + case 13: + cfg.log^=LOG_CIRCULAR; + break; + case 14: + cfg.log^=LOG_DUPES; + break; + case 15: + cfg.log^=LOG_AREA_TOTALS; + break; + case 16: + cfg.log^=LOG_TOTALS; + break; } } + break; + + + case 7: +uifc.helpbuf= +"Secure Operation tells SBBSecho to check the AREAS.BBS file to insure\r\n" +" that the packet origin exists there as well as check the password of\r\n" +" that node (if configured).\r\n\r\n" +"Swap for Executables tells SBBSecho whether or not it should swap\r\n" +" out of memory when executing external executables.\r\n\r\n" +"Fuzzy Zone Operation when set to yes if SBBSecho receives an inbound\r\n" +" netmail with no international zone information, it will compare the\r\n" +" net/node of the destination to the net/node information in your AKAs\r\n" +" and assume the zone of a matching AKA.\r\n\r\n" +"Store PATH/SEEN-BY/Unkown Kludge Lines in Message Base allows you to\r\n" +" determine whether or not SBBSecho will store this information from\r\n" +" incoming messages in the Synchronet message base.\r\n\r\n" +"Allow Nodes to Add Areas in the AREAS.BBS List when set to YES allows\r\n" +" uplinks to add areas listed in the AREAS.BBS file\r\n"; + j=0; + while(1) { + i=0; + sprintf(opt[i++],"%-50.50s%-3.3s","Secure Operation" + ,misc&SECURE ? "Yes":"No"); + sprintf(opt[i++],"%-50.50s%-3.3s","Swap for Executables" + ,node_swap ? "Yes":"No"); + sprintf(opt[i++],"%-50.50s%-3.3s","Fuzzy Zone Operation" + ,misc&FUZZY_ZONE ? "Yes":"No"); + sprintf(opt[i++],"%-50.50s%-3.3s","Store PATH Lines in " + "Message Base",misc&STORE_SEENBY ? "Yes":"No"); + sprintf(opt[i++],"%-50.50s%-3.3s","Store SEEN-BY Lines in " + "Message Base",misc&STORE_PATH ? "Yes":"No"); + sprintf(opt[i++],"%-50.50s%-3.3s","Store Unknown Kludge Lines " + "in Message Base",misc&STORE_KLUDGE ? "Yes":"No"); + sprintf(opt[i++],"%-50.50s%-3.3s","Allow Nodes to Add Areas " + "in the AREAS.BBS List",misc&ELIST_ONLY?"No":"Yes"); + sprintf(opt[i++],"%-50.50s%-3.3s","Kill/Ignore Empty NetMail " + "Messages",misc&KILL_EMPTY_MAIL ? "Yes":"No"); + opt[i][0]=NULL; + j=uifc.list(0,0,0,60,&j,0,"Toggle Options",opt); + if(j==-1) + break; + switch(j) { + case 0: + misc^=SECURE; + break; + case 1: + if(node_swap) + node_swap=0; + else + node_swap=1; + break; + case 2: + misc^=FUZZY_ZONE; + break; + case 3: + misc^=STORE_SEENBY; + break; + case 4: + misc^=STORE_PATH; + break; + case 5: + misc^=STORE_KLUDGE; + break; + case 6: + misc^=ELIST_ONLY; + break; + case 7: + misc^=KILL_EMPTY_MAIL; + } } + break; + case 8: +uifc.helpbuf= +" Archive Programs \r\n\r\n" +"These are the archiving programs (types) which are available for\r\n" +"compressing outgoing packets.\r\n"; + i=0; + while(1) { + for(j=0;j<cfg.arcdefs;j++) + sprintf(opt[j],"%-30.30s",cfg.arcdef[j].name); + opt[j][0]=0; + i=uifc.list(WIN_ORG|WIN_INS|WIN_DEL|WIN_ACT|WIN_GET|WIN_PUT + |WIN_INSACT|WIN_DELACT|WIN_XTR + ,0,0,0,&i,0,"Archive Programs",opt); + if(i==-1) + break; + if((i&MSK_ON)==MSK_INS) { + i&=MSK_OFF; + str[0]=0; +uifc.helpbuf= +" Packer Name \r\n\r\n" +"This is the identifying name of the archiving program\r\n"; + if(uifc.input(WIN_MID,0,0 + ,"Packer Name",str,25,K_EDIT|K_UPPER)<1) + continue; + if((cfg.arcdef=(arcdef_t *)REALLOC(cfg.arcdef + ,sizeof(arcdef_t)*(cfg.arcdefs+1)))==NULL) { + printf("\nMemory Allocation Error\n"); + exit(1); } + for(j=cfg.arcdefs;j>i;j--) + memcpy(&cfg.arcdef[j],&cfg.arcdef[j-1] + ,sizeof(arcdef_t)); + strcpy(cfg.arcdef[j].name + ,cfg.arcdef[j-1].name); + cfg.arcdefs++; + memset(&cfg.arcdef[i],0,sizeof(arcdef_t)); + strcpy(cfg.arcdef[i].name,str); + continue; } + + if((i&MSK_ON)==MSK_DEL) { + i&=MSK_OFF; + cfg.arcdefs--; + if(cfg.arcdefs<=0) { + cfg.arcdefs=0; + continue; } + for(j=i;j<cfg.arcdefs;j++) + memcpy(&cfg.arcdef[j],&cfg.arcdef[j+1] + ,sizeof(arcdef_t)); + if((cfg.arcdef=(arcdef_t *)REALLOC(cfg.arcdef + ,sizeof(arcdef_t)*(cfg.arcdefs)))==NULL) { + printf("\nMemory Allocation Error\n"); + exit(1); } + continue; } + if((i&MSK_ON)==MSK_GET) { + i&=MSK_OFF; + memcpy(&savarcdef,&cfg.arcdef[i],sizeof(arcdef_t)); + continue; } + if((i&MSK_ON)==MSK_PUT) { + i&=MSK_OFF; + memcpy(&cfg.arcdef[i],&savarcdef,sizeof(arcdef_t)); + continue; } + while(1) { + j=0; + sprintf(opt[j++],"%-20.20s %s","Packer Name" + ,cfg.arcdef[i].name); + sprintf(opt[j++],"%-20.20s %s","Hexadecimal ID" + ,cfg.arcdef[i].hexid); + sprintf(opt[j++],"%-20.20s %u","Offset to Hex ID" + ,cfg.arcdef[i].byteloc); + sprintf(opt[j++],"%-20.20s %s","Pack Command Line" + ,cfg.arcdef[i].pack); + sprintf(opt[j++],"%-20.20s %s","Unpack Command Line" + ,cfg.arcdef[i].unpack); + opt[j][0]=0; + sprintf(str,"%.30s",cfg.arcdef[i].name); + k=uifc.list(WIN_MID|WIN_ACT,0,0,60,&nodeop,0,str,opt); + if(k==-1) + break; + switch(k) { + case 0: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Packer Name",cfg.arcdef[i].name,25 + ,K_EDIT|K_UPPER); + break; + case 1: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Hexadecimal ID",cfg.arcdef[i].hexid,25 + ,K_EDIT|K_UPPER); + break; + case 2: + sprintf(str,"%u",cfg.arcdef[i].byteloc); + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Offset to Hex ID",str,5 + ,K_NUMBER|K_EDIT); + cfg.arcdef[i].byteloc=atoi(str); + break; + case 3: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Pack Command Line",cfg.arcdef[i].pack,50 + ,K_EDIT); + break; + case 4: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Unpack Command Line",cfg.arcdef[i].unpack,50 + ,K_EDIT); + break; + } } } + break; + case 9: +uifc.helpbuf= +" Additional Echo Lists \r\n\r\n" +"This feature allows you to specify echo lists (in addition to your\r\n" +"AREAS.BBS file) for SBBSecho to search for area add requests.\r\n"; + i=0; + while(1) { + for(j=0;j<cfg.listcfgs;j++) + sprintf(opt[j],"%-50.50s",cfg.listcfg[j].listpath); + opt[j][0]=0; + i=uifc.list(WIN_ORG|WIN_INS|WIN_DEL|WIN_ACT|WIN_GET|WIN_PUT + |WIN_INSACT|WIN_DELACT|WIN_XTR + ,0,0,0,&i,0,"Additional Echo Lists",opt); + if(i==-1) + break; + if((i&MSK_ON)==MSK_INS) { + i&=MSK_OFF; + str[0]=0; +uifc.helpbuf= +" Echo List \r\n\r\n" +"This is the path and filename of the echo list file you wish\r\n" +"to add.\r\n"; + if(uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Echo List Path/Name",str,50,K_EDIT)<1) + continue; + if((cfg.listcfg=(echolist_t *)REALLOC(cfg.listcfg + ,sizeof(echolist_t)*(cfg.listcfgs+1)))==NULL) { + printf("\nMemory Allocation Error\n"); + exit(1); } + for(j=cfg.listcfgs;j>i;j--) + memcpy(&cfg.listcfg[j],&cfg.listcfg[j-1] + ,sizeof(echolist_t)); + cfg.listcfgs++; + memset(&cfg.listcfg[i],0,sizeof(echolist_t)); + strcpy(cfg.listcfg[i].listpath,str); + continue; } + + if((i&MSK_ON)==MSK_DEL) { + i&=MSK_OFF; + cfg.listcfgs--; + if(cfg.listcfgs<=0) { + cfg.listcfgs=0; + continue; } + for(j=i;j<cfg.listcfgs;j++) + memcpy(&cfg.listcfg[j],&cfg.listcfg[j+1] + ,sizeof(echolist_t)); + if((cfg.listcfg=(echolist_t *)REALLOC(cfg.listcfg + ,sizeof(echolist_t)*(cfg.listcfgs)))==NULL) { + printf("\nMemory Allocation Error\n"); + exit(1); } + continue; } + if((i&MSK_ON)==MSK_GET) { + i&=MSK_OFF; + memcpy(&savlistcfg,&cfg.listcfg[i],sizeof(echolist_t)); + continue; } + if((i&MSK_ON)==MSK_PUT) { + i&=MSK_OFF; + memcpy(&cfg.listcfg[i],&savlistcfg,sizeof(echolist_t)); + continue; } + while(1) { + j=0; + sprintf(opt[j++],"%-20.20s %.19s","Echo List Path/Name" + ,cfg.listcfg[i].listpath); + sprintf(opt[j++],"%-20.20s %s","Hub Address" + ,(cfg.listcfg[i].forward.zone) ? + wcfaddrtoa(cfg.listcfg[i].forward) : "None"); + sprintf(opt[j++],"%-20.20s %s","Forward Password" + ,(cfg.listcfg[i].password[0]) ? + cfg.listcfg[i].password : "None"); + sprintf(opt[j++],"%-20.20s %s","Forward Requests" + ,(cfg.listcfg[i].misc&NOFWD) ? "No" : "Yes"); + str[0]=0; + for(k=0;k<cfg.listcfg[i].numflags;k++) { + strcat(str,cfg.listcfg[i].flag[k].flag); + strcat(str," "); } + sprintf(opt[j++],"%-20.20s %s","Echo List Flags",str); + opt[j][0]=0; + k=uifc.list(WIN_MID|WIN_ACT,0,0,60,&nodeop,0,"Echo List",opt); + if(k==-1) + break; + switch(k) { + case 0: + strcpy(str,cfg.listcfg[i].listpath); + if(uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Echo List Path/Name",str,50 + ,K_EDIT)<1) + continue; + strcpy(cfg.listcfg[i].listpath,str); + break; + case 1: + if(cfg.listcfg[i].forward.zone) + strcpy(str,wcfaddrtoa(cfg.listcfg[i].forward)); + else + str[0]=0; + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Hub Address",str + ,25,K_EDIT); + if(str[0]) + cfg.listcfg[i].forward=atofaddr(str); + else + memset(&cfg.listcfg[i].forward,0 + ,sizeof(faddr_t)); + break; + case 2: + uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Password to use when forwarding requests" + ,cfg.listcfg[i].password,25,K_EDIT|K_UPPER); + break; + case 3: + cfg.listcfg[i].misc^=NOFWD; + if(cfg.listcfg[i].misc&NOFWD) + cfg.listcfg[i].password[0]=0; + break; + case 4: + while(1) { + for(j=0;j<cfg.listcfg[i].numflags;j++) + strcpy(opt[j],cfg.listcfg[i].flag[j].flag); + opt[j][0]=0; + x=uifc.list(WIN_SAV|WIN_INS|WIN_DEL|WIN_ACT| + WIN_XTR|WIN_INSACT|WIN_DELACT|WIN_RHT + ,0,0,0,&x,0,"Echo List Flags",opt); + if(x==-1) + break; + if((x&MSK_ON)==MSK_INS) { + x&=MSK_OFF; + str[0]=0; +uifc.helpbuf= +" Echo List Flag \r\n\r\n" +"These flags determine which nodes have access to the current\r\n" +"echolist file\r\n"; + if(uifc.input(WIN_MID|WIN_SAV,0,0 + ,"Echo List Flag",str,4 + ,K_EDIT|K_UPPER)<1) + continue; + if((cfg.listcfg[i].flag=(flag_t *) + REALLOC(cfg.listcfg[i].flag + ,sizeof(flag_t)* + (cfg.listcfg[i].numflags+1)))==NULL) { + printf("\nMemory Allocation Error\n"); + exit(1); } + for(j=cfg.listcfg[i].numflags;j>x;j--) + memcpy(&cfg.listcfg[i].flag[j] + ,&cfg.listcfg[i].flag[j-1] + ,sizeof(flag_t)); + cfg.listcfg[i].numflags++; + memset(&cfg.listcfg[i].flag[x].flag + ,0,sizeof(flag_t)); + strcpy(cfg.listcfg[i].flag[x].flag,str); + continue; } + + if((x&MSK_ON)==MSK_DEL) { + x&=MSK_OFF; + cfg.listcfg[i].numflags--; + if(cfg.listcfg[i].numflags<=0) { + cfg.listcfg[i].numflags=0; + continue; } + for(j=x;j<cfg.listcfg[i].numflags;j++) + strcpy(cfg.listcfg[i].flag[j].flag + ,cfg.listcfg[i].flag[j+1].flag); + if((cfg.listcfg[i].flag=(flag_t *) + REALLOC(cfg.listcfg[i].flag + ,sizeof(flag_t)* + (cfg.listcfg[i].numflags)))==NULL) { + printf("\nMemory Allocation Error\n"); + exit(1); } + continue; } + strcpy(str,cfg.listcfg[i].flag[x].flag); +uifc.helpbuf= +" Echo List Flag \r\n\r\n" +"These flags determine which nodes have access to the current\r\n" +"echolist file\r\n"; + uifc.input(WIN_MID|WIN_SAV,0,0,"Echo List Flag" + ,str,4,K_EDIT|K_UPPER); + strcpy(cfg.listcfg[i].flag[x].flag,str); + continue; } + break; + } } } + break; + + case -1: +uifc.helpbuf= +" Save Configuration File \r\n\r\n" +"Select Yes to save the config file, No to quit without saving,\r\n" +"or hit ESC to go back to the menu.\r\n\r\n"; + i=0; + strcpy(opt[0],"Yes"); + strcpy(opt[1],"No"); + opt[2][0]=0; + i=uifc.list(WIN_MID,0,0,0,&i,0,"Save Config File",opt); + if(i==-1) break; + if(i) {uifc.bail(); exit(0);} + if((file=open(cfg.cfgfile +#ifdef __unix__ + ,O_WRONLY|O_CREAT|O_EXLOCK|O_TRUNC))==-1) { +#else + ,O_WRONLY|O_BINARY|O_CREAT|O_DENYALL|O_TRUNC,S_IWRITE))==-1) { +#endif +// textattr(LIGHTGRAY); +// clrscr(); + lprintf("Error opening %s\r\n",cfg.cfgfile); + uifc.bail(); exit(1); } + if((stream=fdopen(file,"wb"))==NULL) { +// textattr(LIGHTGRAY); +// clrscr(); + lprintf("Error fdopen %s\r\n",cfg.cfgfile); + uifc.bail(); exit(1);} + if(!node_swap) + fprintf(stream,"NOSWAP\r\n"); + if(cfg.notify) + fprintf(stream,"NOTIFY %u\r\n",cfg.notify); + if(misc&SECURE) + fprintf(stream,"SECURE_ECHOMAIL\r\n"); + if(misc&KILL_EMPTY_MAIL) + fprintf(stream,"KILL_EMPTY\r\n"); + if(misc&STORE_SEENBY) + fprintf(stream,"STORE_SEENBY\r\n"); + if(misc&STORE_PATH) + fprintf(stream,"STORE_PATH\r\n"); + if(misc&STORE_KLUDGE) + fprintf(stream,"STORE_KLUDGE\r\n"); + if(misc&FUZZY_ZONE) + fprintf(stream,"FUZZY_ZONE\r\n"); + if(misc&FLO_MAILER) + fprintf(stream,"FLO_MAILER\r\n"); + if(misc&ELIST_ONLY) + fprintf(stream,"ELIST_ONLY\r\n"); + if(cfg.areafile[0]) + fprintf(stream,"AREAFILE %s\r\n",cfg.areafile); + if(cfg.logfile[0]) + fprintf(stream,"LOGFILE %s\r\n",cfg.logfile); + if(cfg.log!=LOG_DEFAULTS) { + if(cfg.log==0xffffffffUL) + fprintf(stream,"LOG ALL\r\n"); + else if(cfg.log==0L) + fprintf(stream,"LOG NONE\r\n"); + else + fprintf(stream,"LOG %08lX\r\n",cfg.log); } + if(cfg.inbound[0]) + fprintf(stream,"INBOUND %s\r\n",cfg.inbound); + if(cfg.secure[0]) + fprintf(stream,"SECURE_INBOUND %s\r\n",cfg.secure); + if(cfg.outbound[0]) + fprintf(stream,"OUTBOUND %s\r\n",cfg.outbound); + if(cfg.maxbdlsize!=DFLT_BDL_SIZE) + fprintf(stream,"ARCSIZE %lu\r\n",cfg.maxbdlsize); + if(cfg.maxpktsize!=DFLT_PKT_SIZE) + fprintf(stream,"PKTSIZE %lu\r\n",cfg.maxpktsize); + for(i=j=0;i<cfg.nodecfgs;i++) + if(cfg.nodecfg[i].attr&SEND_NOTIFY) { + if(!j) fprintf(stream,"SEND_NOTIFY"); + fprintf(stream," %s",wcfaddrtoa(cfg.nodecfg[i].faddr)); + j++; } + if(j) fprintf(stream,"\r\n"); + for(i=j=0;i<cfg.nodecfgs;i++) + if(cfg.nodecfg[i].attr&ATTR_HOLD) { + if(!j) fprintf(stream,"HOLD"); + fprintf(stream," %s",wcfaddrtoa(cfg.nodecfg[i].faddr)); + j++; } + if(j) fprintf(stream,"\r\n"); + for(i=j=0;i<cfg.nodecfgs;i++) + if(cfg.nodecfg[i].attr&ATTR_DIRECT) { + if(!j) fprintf(stream,"DIRECT"); + fprintf(stream," %s",wcfaddrtoa(cfg.nodecfg[i].faddr)); + j++; } + if(j) fprintf(stream,"\r\n"); + for(i=j=0;i<cfg.nodecfgs;i++) + if(cfg.nodecfg[i].attr&ATTR_CRASH) { + if(!j) fprintf(stream,"CRASH"); + fprintf(stream," %s",wcfaddrtoa(cfg.nodecfg[i].faddr)); + j++; } + if(j) fprintf(stream,"\r\n"); + for(i=j=0;i<cfg.nodecfgs;i++) + if(cfg.nodecfg[i].attr&ATTR_PASSIVE) { + if(!j) fprintf(stream,"PASSIVE"); + fprintf(stream," %s",wcfaddrtoa(cfg.nodecfg[i].faddr)); + j++; } + if(j) fprintf(stream,"\r\n"); + + for(i=0;i<cfg.nodecfgs;i++) + if(cfg.nodecfg[i].pktpwd[0]) + fprintf(stream,"PKTPWD %s %s\r\n" + ,wcfaddrtoa(cfg.nodecfg[i].faddr),cfg.nodecfg[i].pktpwd); + + for(i=0;i<cfg.nodecfgs;i++) + if(cfg.nodecfg[i].pkt_type) + fprintf(stream,"PKTTYPE %s %s\r\n" + ,cfg.nodecfg[i].pkt_type==PKT_TWO_TWO ? "2.2":"2" + ,wcfaddrtoa(cfg.nodecfg[i].faddr)); + + for(i=0;i<cfg.arcdefs;i++) + fprintf(stream,"PACKER %s %u %s\r\n PACK %s\r\n" + " UNPACK %s\r\nEND\r\n" + ,cfg.arcdef[i].name + ,cfg.arcdef[i].byteloc + ,cfg.arcdef[i].hexid + ,cfg.arcdef[i].pack + ,cfg.arcdef[i].unpack + ); + for(i=0;i<cfg.arcdefs;i++) { + for(j=k=0;j<cfg.nodecfgs;j++) + if(cfg.nodecfg[j].arctype==i) { + if(!k) + fprintf(stream,"%-10s %s","USEPACKER" + ,cfg.arcdef[i].name); + k++; + fprintf(stream," %s",wcfaddrtoa(cfg.nodecfg[j].faddr)); } + if(k) + fprintf(stream,"\r\n"); } + + for(i=j=0;i<cfg.nodecfgs;i++) + if(cfg.nodecfg[i].arctype==0xffff) { + if(!j) + fprintf(stream,"%-10s %s","USEPACKER","NONE"); + j++; + fprintf(stream," %s",wcfaddrtoa(cfg.nodecfg[i].faddr)); } + if(j) + fprintf(stream,"\r\n"); + + for(i=0;i<cfg.listcfgs;i++) { + fprintf(stream,"%-10s","ECHOLIST"); + if(cfg.listcfg[i].password[0]) + fprintf(stream," FORWARD %s %s" + ,wcfaddrtoa(cfg.listcfg[i].forward) + ,cfg.listcfg[i].password); + else if(cfg.listcfg[i].misc&NOFWD && + cfg.listcfg[i].forward.zone) + fprintf(stream," HUB %s" + ,wcfaddrtoa(cfg.listcfg[i].forward)); + fprintf(stream," %s",cfg.listcfg[i].listpath); + for(j=0;j<cfg.listcfg[i].numflags;j++) + fprintf(stream," %s",cfg.listcfg[i].flag[j].flag); + fprintf(stream,"\r\n"); } + + for(i=0;i<cfg.nodecfgs;i++) + if(cfg.nodecfg[i].password[0]) { + fprintf(stream,"%-10s %s %s","AREAFIX" + ,wcfaddrtoa(cfg.nodecfg[i].faddr) + ,cfg.nodecfg[i].password); + for(j=0;j<cfg.nodecfg[i].numflags;j++) + fprintf(stream," %s",cfg.nodecfg[i].flag[j].flag); + fprintf(stream,"\r\n"); } + + for(i=0;i<cfg.nodecfgs;i++) + if(cfg.nodecfg[i].route.zone) { + fprintf(stream,"%-10s %s","ROUTE_TO" + ,wcfaddrtoa(cfg.nodecfg[i].route)); + fprintf(stream," %s" + ,wcfaddrtoa(cfg.nodecfg[i].faddr)); + for(j=i+1;j<cfg.nodecfgs;j++) + if(!memcmp(&cfg.nodecfg[j].route,&cfg.nodecfg[i].route + ,sizeof(faddr_t))) { + fprintf(stream," %s" + ,wcfaddrtoa(cfg.nodecfg[j].faddr)); + cfg.nodecfg[j].route.zone=0; } + fprintf(stream,"\r\n"); } + + fclose(stream); + uifc.bail(); + exit(0); + } +} +}