--- sbbs/src/sbbs3/echocfg.c 2018/04/24 16:41:23 1.1.1.1 +++ sbbs/src/sbbs3/echocfg.c 2018/04/24 16:42:53 1.1.1.2 @@ -1,1301 +1,1315 @@ -/* echocfg.c */ - -/* SBBSecho configuration utility */ - -/* $Id: echocfg.c,v 1.1.1.1 2018/04/24 16:41:23 root Exp $ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright 2002 Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU General Public License for more details: gpl.txt or * - * http://www.fsf.org/copyleft/gpl.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -/* Portions written by Allen Christiansen 1994-1996 */ - -#include - -#undef JAVASCRIPT - -/* XPDEV Headers */ -#include "gen_defs.h" - -#define __COLORS -#include "ciolib.h" -#include "uifc.h" -#include "sbbs.h" -#include "sbbsecho.h" - -char **opt; - -/* Declaration removed... why? ToDo */ -/* void uifc.bail(int code); */ -int main(); - -uchar node_swap=1; -long misc=0; -config_t cfg; - -unsigned _stklen=16000; - -uifcapi_t uifc; - -void bail(int code) -{ - - if(uifc.bail!=NULL) - uifc.bail(); - exit(code); -} - -/****************************************************************************/ -/* Returns an ASCII string for FidoNet address 'addr' */ -/****************************************************************************/ -char *wcfaddrtoa(faddr_t* addr) -{ - static char str[25]; - char tmp[25]; - - if(addr->zone==0xffff) - strcpy(str,"ALL"); - else { - sprintf(str,"%u:",addr->zone); - if(addr->net==0xffff) - strcat(str,"ALL"); - else { - sprintf(tmp,"%u/",addr->net); - strcat(str,tmp); - if(addr->node==0xffff) - strcat(str,"ALL"); - else { - sprintf(tmp,"%u",addr->node); - strcat(str,tmp); - if(addr->point==0xffff) - strcat(str,".ALL"); - else if(addr->point) { - sprintf(tmp,".%u",addr->point); - strcat(str,tmp); - } - } - } - } - return(str); -} - - -int main(int argc, char **argv) -{ - char str[256],*p; - int i,j,k,x,dflt,nodeop=0; - FILE *stream; - echolist_t savlistcfg; - nodecfg_t savnodecfg; - arcdef_t savarcdef; - BOOL door_mode=FALSE; - int ciolib_mode=CIOLIB_MODE_AUTO; - - fprintf(stderr,"\nSBBSecho Configuration Version %s Copyright 2003 " - "Rob Swindell\n\n",SBBSECHO_VER); - - memset(&cfg,0,sizeof(config_t)); - str[0]=0; - for(i=1;ii;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;jcfg.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.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;ji;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"); - 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]=0; - 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_SECURE ? "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]=0; - 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_SECURE; - 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","Strip Line Feeds " - "From Outgoing Messages",misc&STRIP_LF ? "Yes":"No"); - sprintf(opt[i++],"%-50.50s%-3.3s","Kill/Ignore Empty NetMail " - "Messages",misc&KILL_EMPTY_MAIL ? "Yes":"No"); - sprintf(opt[i++],"%-50.50s%s","Circular Path Detection" - ,cfg.check_path ? "Enabled" : "Disabled"); - sprintf(opt[i++],"%-50.50s%s","Bundle Attachments" - ,misc&TRUNC_BUNDLES ? "Truncate" : "Kill"); - opt[i][0]=0; - j=uifc.list(0,0,0,65,&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^=STRIP_LF; - break; - case 8: - misc^=KILL_EMPTY_MAIL; - break; - case 9: - cfg.check_path=!cfg.check_path; - break; - case 10: - misc^=TRUNC_BUNDLES; - break; - } - } - 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;ji;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;ji;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;jx;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 + +#undef JAVASCRIPT + +/* XPDEV Headers */ +#include "gen_defs.h" + +#define __COLORS +#include "ciolib.h" +#include "uifc.h" +#include "sbbs.h" +#include "sbbsecho.h" + +char **opt; + +/* Declaration removed... why? ToDo */ +/* void uifc.bail(int code); */ +int main(); + +long misc=0; +config_t cfg; + +unsigned _stklen=16000; + +uifcapi_t uifc; + +void bail(int code) +{ + + if(uifc.bail!=NULL) + uifc.bail(); + exit(code); +} + +/****************************************************************************/ +/* Returns an ASCII string for FidoNet address 'addr' */ +/****************************************************************************/ +char *wcfaddrtoa(faddr_t* addr) +{ + static char str[25]; + char tmp[25]; + + str[0]=0; + if(addr->zone==0xffff) + strcpy(str,"ALL"); + else if(addr->zone) { + sprintf(str,"%u:",addr->zone); + if(addr->net==0xffff) + strcat(str,"ALL"); + else { + sprintf(tmp,"%u/",addr->net); + strcat(str,tmp); + if(addr->node==0xffff) + strcat(str,"ALL"); + else { + sprintf(tmp,"%u",addr->node); + strcat(str,tmp); + if(addr->point==0xffff) + strcat(str,".ALL"); + else if(addr->point) { + sprintf(tmp,".%u",addr->point); + strcat(str,tmp); + } + } + } + } + return(str); +} + +/* These correlate with the LOG_* definitions in syslog.h/gen_defs.h */ +static char* logLevelStringList[] + = {"Emergency", "Alert", "Critical", "Error", "Warning", "Notice", "Informational", "Debugging", NULL}; + +int main(int argc, char **argv) +{ + char str[256],*p; + int i,j,k,x,dflt,nodeop=0; + FILE *stream; + echolist_t savlistcfg; + nodecfg_t savnodecfg; + arcdef_t savarcdef; + BOOL door_mode=FALSE; + int ciolib_mode=CIOLIB_MODE_AUTO; + + fprintf(stderr,"\nSBBSecho Configuration Version %s Copyright 2003 " + "Rob Swindell\n\n",SBBSECHO_VER); + + memset(&cfg,0,sizeof(config_t)); + str[0]=0; + for(i=1;ii;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;jcfg.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.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;ji;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"); + 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]=0; + 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 Level ~\r\n" + "\r\n" + "Select the minimum severity of log entries to be logged to the log file."; + j=cfg.log_level; + i=uifc.list(WIN_MID,0,0,0,&j,0,"Log Level",logLevelStringList); + if(i>=0 && i<=LOG_DEBUG) + cfg.log_level=i; + break; + case 7: + 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_SECURE ? "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]=0; + 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_SECURE; + 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 8: + 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" + "`Convert Existing Tear Lines` tells SBBSecho to convert any tear lines\r\n" + " (`---`) existing in the message text to to `===`.\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","Convert Existing Tear Lines" + ,misc&CONVERT_TEAR ? "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","Strip Line Feeds " + "From Outgoing Messages",misc&STRIP_LF ? "Yes":"No"); + sprintf(opt[i++],"%-50.50s%-3.3s","Kill/Ignore Empty NetMail " + "Messages",misc&KILL_EMPTY_MAIL ? "Yes":"No"); + sprintf(opt[i++],"%-50.50s%s","Circular Path Detection" + ,cfg.check_path ? "Enabled" : "Disabled"); + sprintf(opt[i++],"%-50.50s%s","Bundle Attachments" + ,misc&TRUNC_BUNDLES ? "Truncate" : "Kill"); + opt[i][0]=0; + j=uifc.list(0,0,0,65,&j,0,"Toggle Options",opt); + if(j==-1) + break; + switch(j) { + case 0: + misc^=SECURE; + break; + case 1: + misc^=CONVERT_TEAR; + 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^=STRIP_LF; + break; + case 8: + misc^=KILL_EMPTY_MAIL; + break; + case 9: + cfg.check_path=!cfg.check_path; + break; + case 10: + misc^=TRUNC_BUNDLES; + break; + } + } + break; + case 9: + 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;ji;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;ji;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;jx;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