|
|
1.1 ! root 1: /* echocfg.c */ ! 2: ! 3: /* SBBSecho configuration utility */ ! 4: ! 5: /* $Id: echocfg.c,v 1.15 2004/11/19 03:22:12 rswindell Exp $ */ ! 6: ! 7: /**************************************************************************** ! 8: * @format.tab-size 4 (Plain Text/Source Code File Header) * ! 9: * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * ! 10: * * ! 11: * Copyright 2002 Rob Swindell - http://www.synchro.net/copyright.html * ! 12: * * ! 13: * This program is free software; you can redistribute it and/or * ! 14: * modify it under the terms of the GNU General Public License * ! 15: * as published by the Free Software Foundation; either version 2 * ! 16: * of the License, or (at your option) any later version. * ! 17: * See the GNU General Public License for more details: gpl.txt or * ! 18: * http://www.fsf.org/copyleft/gpl.html * ! 19: * * ! 20: * Anonymous FTP access to the most recent released source is available at * ! 21: * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * ! 22: * * ! 23: * Anonymous CVS access to the development source and modification history * ! 24: * is available at cvs.synchro.net:/cvsroot/sbbs, example: * ! 25: * cvs -d :pserver:[email protected]:/cvsroot/sbbs login * ! 26: * (just hit return, no password is necessary) * ! 27: * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src * ! 28: * * ! 29: * For Synchronet coding style and modification guidelines, see * ! 30: * http://www.synchro.net/source.html * ! 31: * * ! 32: * You are encouraged to submit any modifications (preferably in Unix diff * ! 33: * format) via e-mail to [email protected] * ! 34: * * ! 35: * Note: If this box doesn't appear square, then you need to fix your tabs. * ! 36: ****************************************************************************/ ! 37: ! 38: /* Portions written by Allen Christiansen 1994-1996 */ ! 39: ! 40: #include <stdio.h> ! 41: ! 42: #undef JAVASCRIPT ! 43: ! 44: /* XPDEV Headers */ ! 45: #include "gen_defs.h" ! 46: ! 47: #define __COLORS ! 48: #include "ciolib.h" ! 49: #include "uifc.h" ! 50: #include "sbbs.h" ! 51: #include "sbbsecho.h" ! 52: ! 53: char **opt; ! 54: ! 55: // void uifc.bail(int code); ! 56: int main(); ! 57: ! 58: uchar node_swap=1; ! 59: long misc=0; ! 60: config_t cfg; ! 61: ! 62: unsigned _stklen=16000; ! 63: ! 64: uifcapi_t uifc; ! 65: ! 66: void bail(int code) ! 67: { ! 68: ! 69: if(uifc.bail!=NULL) ! 70: uifc.bail(); ! 71: exit(code); ! 72: } ! 73: ! 74: /****************************************************************************/ ! 75: /* Returns an ASCII string for FidoNet address 'addr' */ ! 76: /****************************************************************************/ ! 77: char *wcfaddrtoa(faddr_t* addr) ! 78: { ! 79: static char str[25]; ! 80: char tmp[25]; ! 81: ! 82: if(addr->zone==0xffff) ! 83: strcpy(str,"ALL"); ! 84: else { ! 85: sprintf(str,"%u:",addr->zone); ! 86: if(addr->net==0xffff) ! 87: strcat(str,"ALL"); ! 88: else { ! 89: sprintf(tmp,"%u/",addr->net); ! 90: strcat(str,tmp); ! 91: if(addr->node==0xffff) ! 92: strcat(str,"ALL"); ! 93: else { ! 94: sprintf(tmp,"%u",addr->node); ! 95: strcat(str,tmp); ! 96: if(addr->point==0xffff) ! 97: strcat(str,".ALL"); ! 98: else if(addr->point) { ! 99: sprintf(tmp,".%u",addr->point); ! 100: strcat(str,tmp); ! 101: } ! 102: } ! 103: } ! 104: } ! 105: return(str); ! 106: } ! 107: ! 108: ! 109: int main(int argc, char **argv) ! 110: { ! 111: char str[256],*p; ! 112: int i,j,k,x,dflt,nodeop=0; ! 113: FILE *stream; ! 114: echolist_t savlistcfg; ! 115: nodecfg_t savnodecfg; ! 116: arcdef_t savarcdef; ! 117: BOOL door_mode=FALSE; ! 118: int ciolib_mode=CIOLIB_MODE_AUTO; ! 119: ! 120: fprintf(stderr,"\nSBBSecho Configuration Version %s Copyright 2003 " ! 121: "Rob Swindell\n\n",SBBSECHO_VER); ! 122: ! 123: memset(&cfg,0,sizeof(config_t)); ! 124: str[0]=0; ! 125: for(i=1;i<argc;i++) { ! 126: if(argv[i][0]=='-') ! 127: switch(toupper(argv[i][1])) { ! 128: case 'D': ! 129: printf("NOTICE: The -d option is depreciated, use -id instead\r\n"); ! 130: SLEEP(2000); ! 131: door_mode=TRUE; ! 132: break; ! 133: case 'L': ! 134: uifc.scrn_len=atoi(argv[i]+2); ! 135: break; ! 136: case 'E': ! 137: uifc.esc_delay=atoi(argv[i]+2); ! 138: break; ! 139: case 'I': ! 140: switch(toupper(argv[i][2])) { ! 141: case 'A': ! 142: ciolib_mode=CIOLIB_MODE_ANSI; ! 143: break; ! 144: case 'C': ! 145: ciolib_mode=CIOLIB_MODE_CURSES; ! 146: break; ! 147: case 0: ! 148: printf("NOTICE: The -i option is depreciated, use -if instead\r\n"); ! 149: SLEEP(2000); ! 150: case 'F': ! 151: ciolib_mode=CIOLIB_MODE_CURSES_IBM; ! 152: break; ! 153: case 'X': ! 154: ciolib_mode=CIOLIB_MODE_X; ! 155: break; ! 156: case 'W': ! 157: ciolib_mode=CIOLIB_MODE_CONIO; ! 158: break; ! 159: case 'D': ! 160: door_mode=TRUE; ! 161: break; ! 162: default: ! 163: goto USAGE; ! 164: } ! 165: break; ! 166: case 'M': /* Monochrome mode */ ! 167: uifc.mode|=UIFC_MONO; ! 168: break; ! 169: case 'C': ! 170: uifc.mode|=UIFC_COLOR; ! 171: break; ! 172: case 'V': ! 173: textmode(atoi(argv[i]+2)); ! 174: break; ! 175: default: ! 176: USAGE: ! 177: printf("\nusage: echocfg [ctrl_dir] [options]" ! 178: "\n\noptions:\n\n" ! 179: "-c = force color mode\r\n" ! 180: "-m = force monochrome mode\r\n" ! 181: "-e# = set escape delay to #msec\r\n" ! 182: "-iX = set interface mode to X (default=auto) where X is one of:\r\n" ! 183: #ifdef __unix__ ! 184: " X = X11 mode\r\n" ! 185: " C = Curses mode\r\n" ! 186: " F = Curses mode with forced IBM charset\r\n" ! 187: #else ! 188: " W = Win32 native mode\r\n" ! 189: #endif ! 190: " A = ANSI mode\r\n" ! 191: " D = standard input/output/door mode\r\n" ! 192: "-v# = set video mode to # (default=auto)\r\n" ! 193: "-l# = set screen lines to # (default=auto-detect)\r\n" ! 194: ); ! 195: exit(0); ! 196: } ! 197: else ! 198: strcpy(str,argv[1]); ! 199: } ! 200: if(str[0]==0) { ! 201: p=getenv("SBBSCTRL"); ! 202: if(!p) { ! 203: p=getenv("SBBSNODE"); ! 204: if(!p) { ! 205: printf("usage: echocfg [cfg_file]\n"); ! 206: exit(1); } ! 207: strcpy(str,p); ! 208: backslash(str); ! 209: strcat(str,"../ctrl/sbbsecho.cfg"); } ! 210: else { ! 211: strcpy(str,p); ! 212: backslash(str); ! 213: strcat(str,"sbbsecho.cfg"); ! 214: } ! 215: } ! 216: strcpy(cfg.cfgfile,str); ! 217: ! 218: read_echo_cfg(); ! 219: ! 220: // savnum=0; ! 221: if((opt=(char **)MALLOC(sizeof(char *)*300))==NULL) { ! 222: uifc.bail(); ! 223: puts("memory allocation error\n"); ! 224: exit(1); ! 225: } ! 226: for(i=0;i<300;i++) ! 227: if((opt[i]=(char *)MALLOC(MAX_OPLN))==NULL) { ! 228: uifc.bail(); ! 229: puts("memory allocation error\n"); ! 230: exit(1); ! 231: } ! 232: uifc.size=sizeof(uifc); ! 233: if(!door_mode) { ! 234: i=initciolib(ciolib_mode); ! 235: if(i!=0) { ! 236: printf("ciolib library init returned error %d\n",i); ! 237: exit(1); ! 238: } ! 239: i=uifcini32(&uifc); /* curses/conio/X/ANSI */ ! 240: } ! 241: else ! 242: i=uifcinix(&uifc); /* stdio */ ! 243: ! 244: if(i!=0) { ! 245: printf("uifc library init returned error %d\n",i); ! 246: exit(1); ! 247: } ! 248: ! 249: sprintf(str,"SBBSecho Configuration v%s",SBBSECHO_VER); ! 250: uifc.scrn(str); ! 251: ! 252: dflt=0; ! 253: while(1) { ! 254: uifc.helpbuf= ! 255: " SBBSecho Configuration \r\n\r\n" ! 256: "Move through the various options using the arrow keys. Select the\r\n" ! 257: "highlighted options by pressing ENTER.\r\n\r\n"; ! 258: i=0; ! 259: sprintf(opt[i++],"%-30.30s %s","Mailer Type" ! 260: ,misc&FLO_MAILER ? "Binkley/FLO":"FrontDoor/Attach"); ! 261: sprintf(opt[i++],"%-30.30s %luK","Maximum Packet Size" ! 262: ,cfg.maxpktsize/1024UL); ! 263: sprintf(opt[i++],"%-30.30s %luK","Maximum Bundle Size" ! 264: ,cfg.maxbdlsize/1024UL); ! 265: if(cfg.notify) ! 266: sprintf(str,"User #%u",cfg.notify); ! 267: else ! 268: strcpy(str,"Disabled"); ! 269: sprintf(opt[i++],"%-30.30s %s","Areafix Failure Notification",str); ! 270: sprintf(opt[i++],"Nodes..."); ! 271: sprintf(opt[i++],"Paths..."); ! 272: sprintf(opt[i++],"Log Options..."); ! 273: sprintf(opt[i++],"Toggle Options..."); ! 274: sprintf(opt[i++],"Archive Programs..."); ! 275: sprintf(opt[i++],"Additional Echo Lists..."); ! 276: opt[i][0]=0; ! 277: switch(uifc.list(WIN_ORG|WIN_MID|WIN_ACT|WIN_ESC,0,0,52,&dflt,0 ! 278: ,cfg.cfgfile,opt)) { ! 279: ! 280: case 0: ! 281: misc^=FLO_MAILER; ! 282: break; ! 283: ! 284: case 1: ! 285: uifc.helpbuf= ! 286: " Maximum Packet Size \r\n\r\n" ! 287: "This is the maximum file size that SBBSecho will create when placing\r\n" ! 288: "outgoing messages into packets. The default size is 250k.\r\n"; ! 289: sprintf(str,"%lu",cfg.maxpktsize); ! 290: uifc.input(WIN_MID|WIN_BOT,0,0,"Maximum Packet Size",str ! 291: ,9,K_EDIT|K_NUMBER); ! 292: cfg.maxpktsize=atol(str); ! 293: break; ! 294: ! 295: case 2: ! 296: uifc.helpbuf= ! 297: " Maximum Bundle Size \r\n\r\n" ! 298: "This is the maximum file size that SBBSecho will create when placing\r\n" ! 299: "outgoing packets into bundles. The default size is 250k.\r\n"; ! 300: sprintf(str,"%lu",cfg.maxbdlsize); ! 301: uifc.input(WIN_MID|WIN_BOT,0,0,"Maximum Bundle Size",str ! 302: ,9,K_EDIT|K_NUMBER); ! 303: cfg.maxbdlsize=atol(str); ! 304: break; ! 305: ! 306: case 3: ! 307: uifc.helpbuf= ! 308: " Areafix Failure Notification \r\n\r\n" ! 309: "Setting this option to a user number (usually #1), enables the\r\n" ! 310: "automatic notification of that user, via e-mail, of failed areafix\r\n" ! 311: "attempts. Setting this option to 0, disables this feature.\r\n"; ! 312: sprintf(str,"%u",cfg.notify); ! 313: uifc.input(WIN_MID|WIN_BOT,0,0,"Areafix Notification User Number",str ! 314: ,5,K_EDIT|K_NUMBER); ! 315: cfg.notify=atoi(str); ! 316: break; ! 317: ! 318: case 4: ! 319: uifc.helpbuf= ! 320: " Nodes... \r\n\r\n" ! 321: "From this menu you can configure the area manager options for your\r\n" ! 322: "uplink nodes.\r\n"; ! 323: i=0; ! 324: while(1) { ! 325: for(j=0;j<cfg.nodecfgs;j++) ! 326: strcpy(opt[j],wcfaddrtoa(&cfg.nodecfg[j].faddr)); ! 327: opt[j][0]=0; ! 328: i=uifc.list(WIN_ORG|WIN_INS|WIN_DEL|WIN_ACT|WIN_GET|WIN_PUT ! 329: |WIN_INSACT|WIN_DELACT|WIN_XTR ! 330: ,0,0,0,&i,0,"Nodes",opt); ! 331: if(i==-1) ! 332: break; ! 333: if((i&MSK_ON)==MSK_INS) { ! 334: i&=MSK_OFF; ! 335: str[0]=0; ! 336: uifc.helpbuf= ! 337: " Address \r\n\r\n" ! 338: "This is the FidoNet style address of the node you wish to add\r\n"; ! 339: if(uifc.input(WIN_MID,0,0 ! 340: ,"Node Address (ALL wildcard allowed)",str ! 341: ,25,K_EDIT)<1) ! 342: continue; ! 343: if((cfg.nodecfg=(nodecfg_t *)REALLOC(cfg.nodecfg ! 344: ,sizeof(nodecfg_t)*(cfg.nodecfgs+1)))==NULL) { ! 345: printf("\nMemory Allocation Error\n"); ! 346: exit(1); } ! 347: for(j=cfg.nodecfgs;j>i;j--) ! 348: memcpy(&cfg.nodecfg[j],&cfg.nodecfg[j-1] ! 349: ,sizeof(nodecfg_t)); ! 350: cfg.nodecfgs++; ! 351: memset(&cfg.nodecfg[i],0,sizeof(nodecfg_t)); ! 352: cfg.nodecfg[i].faddr=atofaddr(str); ! 353: continue; } ! 354: ! 355: if((i&MSK_ON)==MSK_DEL) { ! 356: i&=MSK_OFF; ! 357: cfg.nodecfgs--; ! 358: if(cfg.nodecfgs<=0) { ! 359: cfg.nodecfgs=0; ! 360: continue; } ! 361: for(j=i;j<cfg.nodecfgs;j++) ! 362: memcpy(&cfg.nodecfg[j],&cfg.nodecfg[j+1] ! 363: ,sizeof(nodecfg_t)); ! 364: if((cfg.nodecfg=(nodecfg_t *)REALLOC(cfg.nodecfg ! 365: ,sizeof(nodecfg_t)*(cfg.nodecfgs)))==NULL) { ! 366: printf("\nMemory Allocation Error\n"); ! 367: exit(1); } ! 368: continue; } ! 369: if((i&MSK_ON)==MSK_GET) { ! 370: i&=MSK_OFF; ! 371: memcpy(&savnodecfg,&cfg.nodecfg[i],sizeof(nodecfg_t)); ! 372: continue; } ! 373: if((i&MSK_ON)==MSK_PUT) { ! 374: i&=MSK_OFF; ! 375: memcpy(&cfg.nodecfg[i],&savnodecfg,sizeof(nodecfg_t)); ! 376: continue; } ! 377: while(1) { ! 378: uifc.helpbuf= ! 379: " Node Options \r\n\r\n" ! 380: "These are the configurable options available for this node.\r\n"; ! 381: j=0; ! 382: sprintf(opt[j++],"%-20.20s %s","Address" ! 383: ,wcfaddrtoa(&cfg.nodecfg[i].faddr)); ! 384: sprintf(opt[j++],"%-20.20s %s","Archive Type" ! 385: ,cfg.nodecfg[i].arctype>cfg.arcdefs ? ! 386: "None":cfg.arcdef[cfg.nodecfg[i].arctype].name); ! 387: sprintf(opt[j++],"%-20.20s %s","Packet Type" ! 388: ,cfg.nodecfg[i].pkt_type==PKT_TWO ? "2" ! 389: :cfg.nodecfg[i].pkt_type==PKT_TWO_TWO ? "2.2":"2+"); ! 390: sprintf(opt[j++],"%-20.20s %s","Packet Password" ! 391: ,cfg.nodecfg[i].pktpwd); ! 392: sprintf(opt[j++],"%-20.20s %s","Areafix Password" ! 393: ,cfg.nodecfg[i].password); ! 394: str[0]=0; ! 395: for(k=0;k<cfg.nodecfg[i].numflags;k++) { ! 396: strcat(str,cfg.nodecfg[i].flag[k].flag); ! 397: strcat(str," "); } ! 398: sprintf(opt[j++],"%-20.20s %s","Areafix Flags",str); ! 399: sprintf(opt[j++],"%-20.20s %s","Status" ! 400: ,cfg.nodecfg[i].attr&ATTR_CRASH ? "Crash" ! 401: :cfg.nodecfg[i].attr&ATTR_HOLD ? "Hold" : "None"); ! 402: sprintf(opt[j++],"%-20.20s %s","Direct" ! 403: ,cfg.nodecfg[i].attr&ATTR_DIRECT ? "Yes":"No"); ! 404: sprintf(opt[j++],"%-20.20s %s","Passive" ! 405: ,cfg.nodecfg[i].attr&ATTR_PASSIVE ? "Yes":"No"); ! 406: sprintf(opt[j++],"%-20.20s %s","Send Notify List" ! 407: ,cfg.nodecfg[i].attr&SEND_NOTIFY ? "Yes" : "No"); ! 408: if(misc&FLO_MAILER) ! 409: sprintf(opt[j++],"%-20.20s %s","Route To" ! 410: ,cfg.nodecfg[i].route.zone ! 411: ? wcfaddrtoa(&cfg.nodecfg[i].route) : "Disabled"); ! 412: opt[j][0]=0; ! 413: k=uifc.list(WIN_MID|WIN_ACT,0,0,40,&nodeop,0 ! 414: ,wcfaddrtoa(&cfg.nodecfg[i].faddr),opt); ! 415: if(k==-1) ! 416: break; ! 417: switch(k) { ! 418: case 0: ! 419: uifc.helpbuf= ! 420: " Address \r\n\r\n" ! 421: "This is the FidoNet style address of this node.\r\n"; ! 422: strcpy(str,wcfaddrtoa(&cfg.nodecfg[i].faddr)); ! 423: uifc.input(WIN_MID|WIN_SAV,0,0 ! 424: ,"Node Address (ALL wildcard allowed)",str ! 425: ,25,K_EDIT|K_UPPER); ! 426: cfg.nodecfg[i].faddr=atofaddr(str); ! 427: break; ! 428: case 1: ! 429: uifc.helpbuf= ! 430: " Archive Type \r\n\r\n" ! 431: "This is the compression type that will be used for compressing packets\r\n" ! 432: "to and decompressing packets from this node.\r\n"; ! 433: for(j=0;j<cfg.arcdefs;j++) ! 434: strcpy(opt[j],cfg.arcdef[j].name); ! 435: strcpy(opt[j++],"None"); ! 436: opt[j][0]=0; ! 437: if(cfg.nodecfg[i].arctype<j) ! 438: j=cfg.nodecfg[i].arctype; ! 439: k=uifc.list(WIN_RHT|WIN_SAV,0,0,0,&j,0 ! 440: ,"Archive Type",opt); ! 441: if(k==-1) ! 442: break; ! 443: if(k>=cfg.arcdefs) ! 444: cfg.nodecfg[i].arctype=0xffff; ! 445: else ! 446: cfg.nodecfg[i].arctype=k; ! 447: break; ! 448: case 2: ! 449: uifc.helpbuf= ! 450: " Packet Type \r\n\r\n" ! 451: "This is the packet header type that will be used in mail packets to\r\n" ! 452: "this node. SBBSecho defaults to using type 2.2.\r\n"; ! 453: j=0; ! 454: strcpy(opt[j++],"2+"); ! 455: strcpy(opt[j++],"2.2"); ! 456: strcpy(opt[j++],"2"); ! 457: opt[j][0]=0; ! 458: j=cfg.nodecfg[i].pkt_type; ! 459: k=uifc.list(WIN_RHT|WIN_SAV,0,0,0,&j,0,"Packet Type" ! 460: ,opt); ! 461: if(k==-1) ! 462: break; ! 463: cfg.nodecfg[i].pkt_type=k; ! 464: break; ! 465: case 3: ! 466: uifc.helpbuf= ! 467: " Packet Password \r\n\r\n" ! 468: "This is an optional password that SBBSecho will place into packets\r\n" ! 469: "destined for this node.\r\n"; ! 470: uifc.input(WIN_MID|WIN_SAV,0,0 ! 471: ,"Packet Password (optional)" ! 472: ,cfg.nodecfg[i].pktpwd,8,K_EDIT|K_UPPER); ! 473: break; ! 474: case 4: ! 475: uifc.helpbuf= ! 476: " Areafix Password \r\n\r\n" ! 477: "This is the password that will be used by this node when doing remote\r\n" ! 478: "areamanager functions.\r\n"; ! 479: uifc.input(WIN_MID|WIN_SAV,0,0 ! 480: ,"Areafix Password" ! 481: ,cfg.nodecfg[i].password,8,K_EDIT|K_UPPER); ! 482: break; ! 483: case 5: ! 484: uifc.helpbuf= ! 485: " Areafix Flag \r\n\r\n" ! 486: "This is a flag to to be given to this node allowing access to one or\r\n" ! 487: "more of the configured echo lists\r\n"; ! 488: while(1) { ! 489: for(j=0;j<cfg.nodecfg[i].numflags;j++) ! 490: strcpy(opt[j],cfg.nodecfg[i].flag[j].flag); ! 491: opt[j][0]=0; ! 492: k=uifc.list(WIN_SAV|WIN_INS|WIN_DEL|WIN_ACT| ! 493: WIN_XTR|WIN_INSACT|WIN_DELACT|WIN_RHT ! 494: ,0,0,0,&k,0,"Areafix Flags",opt); ! 495: if(k==-1) ! 496: break; ! 497: if((k&MSK_ON)==MSK_INS) { ! 498: k&=MSK_OFF; ! 499: str[0]=0; ! 500: if(uifc.input(WIN_MID|WIN_SAV,0,0 ! 501: ,"Areafix Flag",str,4 ! 502: ,K_EDIT|K_UPPER)<1) ! 503: continue; ! 504: if((cfg.nodecfg[i].flag=(flag_t *) ! 505: REALLOC(cfg.nodecfg[i].flag ! 506: ,sizeof(flag_t)* ! 507: (cfg.nodecfg[i].numflags+1)))==NULL) { ! 508: printf("\nMemory Allocation Error\n"); ! 509: exit(1); } ! 510: for(j=cfg.nodecfg[i].numflags;j>i;j--) ! 511: memcpy(&cfg.nodecfg[i].flag[j] ! 512: ,&cfg.nodecfg[i].flag[j-1] ! 513: ,sizeof(flag_t)); ! 514: cfg.nodecfg[i].numflags++; ! 515: memset(&cfg.nodecfg[i].flag[k].flag ! 516: ,0,sizeof(flag_t)); ! 517: strcpy(cfg.nodecfg[i].flag[k].flag,str); ! 518: continue; } ! 519: ! 520: if((k&MSK_ON)==MSK_DEL) { ! 521: k&=MSK_OFF; ! 522: cfg.nodecfg[i].numflags--; ! 523: if(cfg.nodecfg[i].numflags<=0) { ! 524: cfg.nodecfg[i].numflags=0; ! 525: continue; } ! 526: for(j=k;j<cfg.nodecfg[i].numflags;j++) ! 527: strcpy(cfg.nodecfg[i].flag[j].flag ! 528: ,cfg.nodecfg[i].flag[j+1].flag); ! 529: if((cfg.nodecfg[i].flag=(flag_t *) ! 530: REALLOC(cfg.nodecfg[i].flag ! 531: ,sizeof(flag_t)* ! 532: (cfg.nodecfg[i].numflags)))==NULL) { ! 533: printf("\nMemory Allocation Error\n"); ! 534: exit(1); } ! 535: continue; } ! 536: strcpy(str,cfg.nodecfg[i].flag[k].flag); ! 537: uifc.input(WIN_MID|WIN_SAV,0,0,"Areafix Flag" ! 538: ,str,4,K_EDIT|K_UPPER); ! 539: strcpy(cfg.nodecfg[i].flag[k].flag,str); ! 540: continue; } ! 541: break; ! 542: case 6: ! 543: if(cfg.nodecfg[i].attr&ATTR_CRASH) { ! 544: cfg.nodecfg[i].attr^=ATTR_CRASH; ! 545: cfg.nodecfg[i].attr|=ATTR_HOLD; ! 546: break; } ! 547: if(cfg.nodecfg[i].attr&ATTR_HOLD) { ! 548: cfg.nodecfg[i].attr^=ATTR_HOLD; ! 549: break; } ! 550: cfg.nodecfg[i].attr|=ATTR_CRASH; ! 551: break; ! 552: case 7: ! 553: cfg.nodecfg[i].attr^=ATTR_DIRECT; ! 554: break; ! 555: case 8: ! 556: cfg.nodecfg[i].attr^=ATTR_PASSIVE; ! 557: break; ! 558: case 9: ! 559: cfg.nodecfg[i].attr^=SEND_NOTIFY; ! 560: break; ! 561: case 10: ! 562: uifc.helpbuf= ! 563: " Route To \r\n\r\n" ! 564: "When using a FLO type mailer, this is the node number of an address\r\n" ! 565: "to route mail to for this node.\r\n"; ! 566: strcpy(str,wcfaddrtoa(&cfg.nodecfg[i].route)); ! 567: uifc.input(WIN_MID|WIN_SAV,0,0 ! 568: ,"Node Address to Route To",str ! 569: ,25,K_EDIT); ! 570: if(str[0]) ! 571: cfg.nodecfg[i].route=atofaddr(str); ! 572: break; ! 573: } } } ! 574: break; ! 575: ! 576: case 5: ! 577: uifc.helpbuf= ! 578: " Paths... \r\n\r\n" ! 579: "From this menu you can configure the paths that SBBSecho will use\r\n" ! 580: "when importing and exporting.\r\n"; ! 581: j=0; ! 582: while(1) { ! 583: i=0; ! 584: sprintf(opt[i++],"%-30.30s %s","Inbound Directory" ! 585: ,cfg.inbound[0] ? cfg.inbound : "<Specified in SCFG>"); ! 586: sprintf(opt[i++],"%-30.30s %s","Secure Inbound (optional)" ! 587: ,cfg.secure[0] ? cfg.secure : "None Specified"); ! 588: sprintf(opt[i++],"%-30.30s %s","Outbound Directory" ! 589: ,cfg.outbound); ! 590: sprintf(opt[i++],"%-30.30s %s","Area File" ! 591: ,cfg.areafile[0] ? cfg.areafile ! 592: : "SCFG->data/areas.bbs"); ! 593: sprintf(opt[i++],"%-30.30s %s","Log File" ! 594: ,cfg.logfile[0] ? cfg.logfile ! 595: : "SCFG->data/sbbsecho.log"); ! 596: opt[i][0]=0; ! 597: j=uifc.list(WIN_MID|WIN_ACT,0,0,60,&j,0 ! 598: ,"Paths and Filenames",opt); ! 599: if(j==-1) ! 600: break; ! 601: switch(j) { ! 602: case 0: ! 603: uifc.helpbuf= ! 604: " Inbound Directory \r\n\r\n" ! 605: "This is the complete path (drive and directory) where your front\r\n" ! 606: "end mailer stores, and where SBBSecho will look for, incoming message\r\n" ! 607: "bundles and packets."; ! 608: uifc.input(WIN_MID|WIN_SAV,0,0,"Inbound",cfg.inbound ! 609: ,50,K_EDIT); ! 610: break; ! 611: ! 612: case 1: ! 613: uifc.helpbuf= ! 614: " Secure Inbound Directory \r\n\r\n" ! 615: "This is the complete path (drive and directory) where your front\r\n" ! 616: "end mailer stores, and where SBBSecho will look for, incoming message\r\n" ! 617: "bundles and packets for SECURE sessions."; ! 618: uifc.input(WIN_MID|WIN_SAV,0,0,"Secure Inbound",cfg.secure ! 619: ,50,K_EDIT); ! 620: break; ! 621: ! 622: case 2: ! 623: uifc.helpbuf= ! 624: " Outbound Directory \r\n\r\n" ! 625: "This is the complete path (drive and directory) where your front\r\n" ! 626: "end mailer will look for, and where SBBSecho will place, outgoing\r\n" ! 627: "message bundles and packets."; ! 628: uifc.input(WIN_MID|WIN_SAV,0,0,"Outbound",cfg.outbound ! 629: ,50,K_EDIT); ! 630: break; ! 631: ! 632: case 3: ! 633: uifc.helpbuf= ! 634: " Area File \r\n\r\n" ! 635: "This is the complete path (drive, directory, and filename) of the\r\n" ! 636: "file SBBSecho will use as your AREAS.BBS file."; ! 637: uifc.input(WIN_MID|WIN_SAV,0,0,"Areafile",cfg.areafile ! 638: ,50,K_EDIT); ! 639: break; ! 640: ! 641: case 4: ! 642: uifc.helpbuf= ! 643: " Log File \r\n\r\n" ! 644: "This is the complete path (drive, directory, and filename) of the\r\n" ! 645: "file SBBSecho will use to log information each time it is run."; ! 646: uifc.input(WIN_MID|WIN_SAV,0,0,"Logfile",cfg.logfile ! 647: ,50,K_EDIT); ! 648: break; } } ! 649: break; ! 650: case 6: ! 651: uifc.helpbuf= ! 652: " Log Options \r\n" ! 653: "\r\n" ! 654: "Each loggable item can be toggled off or on from this menu. You must run\r\n" ! 655: "&SBBSecho& with the &/L& command line option for any of these items to be\r\n" ! 656: "logged."; ! 657: j=0; ! 658: while(1) { ! 659: i=0; ! 660: strcpy(opt[i++],"ALL"); ! 661: strcpy(opt[i++],"NONE"); ! 662: strcpy(opt[i++],"DEFAULT"); ! 663: sprintf(opt[i++],"%-35.35s%-3.3s","Ignored NetMail Messages" ! 664: ,cfg.log&LOG_IGNORED ? "Yes":"No"); ! 665: sprintf(opt[i++],"%-35.35s%-3.3s","NetMail for Unknown Users" ! 666: ,cfg.log&LOG_UNKNOWN ? "Yes":"No"); ! 667: sprintf(opt[i++],"%-35.35s%-3.3s","Areafix NetMail Messages" ! 668: ,cfg.log&LOG_AREAFIX ? "Yes":"No"); ! 669: sprintf(opt[i++],"%-35.35s%-3.3s","Imported NetMail Messages" ! 670: ,cfg.log&LOG_IMPORTED ? "Yes":"No"); ! 671: sprintf(opt[i++],"%-35.35s%-3.3s","Packing Out-bound NetMail" ! 672: ,cfg.log&LOG_PACKING ? "Yes":"No"); ! 673: sprintf(opt[i++],"%-35.35s%-3.3s","Routing Out-bound NetMail" ! 674: ,cfg.log&LOG_ROUTING ? "Yes":"No"); ! 675: sprintf(opt[i++],"%-35.35s%-3.3s","In-bound Packet Information" ! 676: ,cfg.log&LOG_PACKETS ? "Yes":"No"); ! 677: sprintf(opt[i++],"%-35.35s%-3.3s","In-bound Security Violations" ! 678: ,cfg.log&LOG_SECURE ? "Yes":"No"); ! 679: sprintf(opt[i++],"%-35.35s%-3.3s","In-bound Grunged Messages" ! 680: ,cfg.log&LOG_GRUNGED ? "Yes":"No"); ! 681: sprintf(opt[i++],"%-35.35s%-3.3s","Disallowed Private EchoMail" ! 682: ,cfg.log&LOG_PRIVATE ? "Yes":"No"); ! 683: sprintf(opt[i++],"%-35.35s%-3.3s","Circular EchoMail Messages" ! 684: ,cfg.log&LOG_CIRCULAR ? "Yes":"No"); ! 685: sprintf(opt[i++],"%-35.35s%-3.3s","Duplicate EchoMail Messages" ! 686: ,cfg.log&LOG_DUPES ? "Yes":"No"); ! 687: sprintf(opt[i++],"%-35.35s%-3.3s","Area Totals" ! 688: ,cfg.log&LOG_AREA_TOTALS ? "Yes":"No"); ! 689: sprintf(opt[i++],"%-35.35s%-3.3s","Over-All Totals" ! 690: ,cfg.log&LOG_TOTALS ? "Yes":"No"); ! 691: opt[i][0]=0; ! 692: j=uifc.list(0,0,0,43,&j,0,"Log Options",opt); ! 693: if(j==-1) ! 694: break; ! 695: switch(j) { ! 696: case 0: ! 697: cfg.log=~0L; ! 698: break; ! 699: case 1: ! 700: cfg.log=0; ! 701: break; ! 702: case 2: ! 703: cfg.log=LOG_DEFAULTS; ! 704: break; ! 705: case 3: ! 706: cfg.log^=LOG_IGNORED; ! 707: break; ! 708: case 4: ! 709: cfg.log^=LOG_UNKNOWN; ! 710: break; ! 711: case 5: ! 712: cfg.log^=LOG_AREAFIX; ! 713: break; ! 714: case 6: ! 715: cfg.log^=LOG_IMPORTED; ! 716: break; ! 717: case 7: ! 718: cfg.log^=LOG_PACKING; ! 719: break; ! 720: case 8: ! 721: cfg.log^=LOG_ROUTING; ! 722: break; ! 723: case 9: ! 724: cfg.log^=LOG_PACKETS; ! 725: break; ! 726: case 10: ! 727: cfg.log^=LOG_SECURE; ! 728: break; ! 729: case 11: ! 730: cfg.log^=LOG_GRUNGED; ! 731: break; ! 732: case 12: ! 733: cfg.log^=LOG_PRIVATE; ! 734: break; ! 735: case 13: ! 736: cfg.log^=LOG_CIRCULAR; ! 737: break; ! 738: case 14: ! 739: cfg.log^=LOG_DUPES; ! 740: break; ! 741: case 15: ! 742: cfg.log^=LOG_AREA_TOTALS; ! 743: break; ! 744: case 16: ! 745: cfg.log^=LOG_TOTALS; ! 746: break; } } ! 747: break; ! 748: ! 749: ! 750: case 7: ! 751: uifc.helpbuf= ! 752: "&Secure Operation& tells SBBSecho to check the AREAS.BBS file to insure\r\n" ! 753: " that the packet origin exists there as well as check the password of\r\n" ! 754: " that node (if configured).\r\n\r\n" ! 755: "&Swap for Executables& tells SBBSecho whether or not it should swap\r\n" ! 756: " out of memory when executing external executables.\r\n\r\n" ! 757: "&Fuzzy Zone Operation& when set to yes if SBBSecho receives an inbound\r\n" ! 758: " netmail with no international zone information, it will compare the\r\n" ! 759: " net/node of the destination to the net/node information in your AKAs\r\n" ! 760: " and assume the zone of a matching AKA.\r\n\r\n" ! 761: "&Store PATH/SEEN-BY/Unkown Kludge Lines in Message Base& allows you to\r\n" ! 762: " determine whether or not SBBSecho will store this information from\r\n" ! 763: " incoming messages in the Synchronet message base.\r\n\r\n" ! 764: "&Allow Nodes to Add Areas in the AREAS.BBS List& when set to YES allows\r\n" ! 765: " uplinks to add areas listed in the AREAS.BBS file\r\n"; ! 766: j=0; ! 767: while(1) { ! 768: i=0; ! 769: sprintf(opt[i++],"%-50.50s%-3.3s","Secure Operation" ! 770: ,misc&SECURE ? "Yes":"No"); ! 771: sprintf(opt[i++],"%-50.50s%-3.3s","Swap for Executables" ! 772: ,node_swap ? "Yes":"No"); ! 773: sprintf(opt[i++],"%-50.50s%-3.3s","Fuzzy Zone Operation" ! 774: ,misc&FUZZY_ZONE ? "Yes":"No"); ! 775: sprintf(opt[i++],"%-50.50s%-3.3s","Store PATH Lines in " ! 776: "Message Base",misc&STORE_SEENBY ? "Yes":"No"); ! 777: sprintf(opt[i++],"%-50.50s%-3.3s","Store SEEN-BY Lines in " ! 778: "Message Base",misc&STORE_PATH ? "Yes":"No"); ! 779: sprintf(opt[i++],"%-50.50s%-3.3s","Store Unknown Kludge Lines " ! 780: "in Message Base",misc&STORE_KLUDGE ? "Yes":"No"); ! 781: sprintf(opt[i++],"%-50.50s%-3.3s","Allow Nodes to Add Areas " ! 782: "in the AREAS.BBS List",misc&ELIST_ONLY?"No":"Yes"); ! 783: sprintf(opt[i++],"%-50.50s%-3.3s","Strip Line Feeds " ! 784: "From Outgoing Messages",misc&STRIP_LF ? "Yes":"No"); ! 785: sprintf(opt[i++],"%-50.50s%-3.3s","Kill/Ignore Empty NetMail " ! 786: "Messages",misc&KILL_EMPTY_MAIL ? "Yes":"No"); ! 787: sprintf(opt[i++],"%-50.50s%s","Circular Path Detection" ! 788: ,cfg.check_path ? "Enabled" : "Disabled"); ! 789: sprintf(opt[i++],"%-50.50s%s","Bundle Attachments" ! 790: ,misc&TRUNC_BUNDLES ? "Truncate" : "Kill"); ! 791: opt[i][0]=0; ! 792: j=uifc.list(0,0,0,65,&j,0,"Toggle Options",opt); ! 793: if(j==-1) ! 794: break; ! 795: switch(j) { ! 796: case 0: ! 797: misc^=SECURE; ! 798: break; ! 799: case 1: ! 800: if(node_swap) ! 801: node_swap=0; ! 802: else ! 803: node_swap=1; ! 804: break; ! 805: case 2: ! 806: misc^=FUZZY_ZONE; ! 807: break; ! 808: case 3: ! 809: misc^=STORE_SEENBY; ! 810: break; ! 811: case 4: ! 812: misc^=STORE_PATH; ! 813: break; ! 814: case 5: ! 815: misc^=STORE_KLUDGE; ! 816: break; ! 817: case 6: ! 818: misc^=ELIST_ONLY; ! 819: break; ! 820: case 7: ! 821: misc^=STRIP_LF; ! 822: break; ! 823: case 8: ! 824: misc^=KILL_EMPTY_MAIL; ! 825: break; ! 826: case 9: ! 827: cfg.check_path=!cfg.check_path; ! 828: break; ! 829: case 10: ! 830: misc^=TRUNC_BUNDLES; ! 831: break; ! 832: } ! 833: } ! 834: break; ! 835: case 8: ! 836: uifc.helpbuf= ! 837: " Archive Programs \r\n\r\n" ! 838: "These are the archiving programs (types) which are available for\r\n" ! 839: "compressing outgoing packets.\r\n"; ! 840: i=0; ! 841: while(1) { ! 842: for(j=0;j<cfg.arcdefs;j++) ! 843: sprintf(opt[j],"%-30.30s",cfg.arcdef[j].name); ! 844: opt[j][0]=0; ! 845: i=uifc.list(WIN_ORG|WIN_INS|WIN_DEL|WIN_ACT|WIN_GET|WIN_PUT ! 846: |WIN_INSACT|WIN_DELACT|WIN_XTR ! 847: ,0,0,0,&i,0,"Archive Programs",opt); ! 848: if(i==-1) ! 849: break; ! 850: if((i&MSK_ON)==MSK_INS) { ! 851: i&=MSK_OFF; ! 852: str[0]=0; ! 853: uifc.helpbuf= ! 854: " Packer Name \r\n\r\n" ! 855: "This is the identifying name of the archiving program\r\n"; ! 856: if(uifc.input(WIN_MID,0,0 ! 857: ,"Packer Name",str,25,K_EDIT|K_UPPER)<1) ! 858: continue; ! 859: if((cfg.arcdef=(arcdef_t *)REALLOC(cfg.arcdef ! 860: ,sizeof(arcdef_t)*(cfg.arcdefs+1)))==NULL) { ! 861: printf("\nMemory Allocation Error\n"); ! 862: exit(1); } ! 863: for(j=cfg.arcdefs;j>i;j--) ! 864: memcpy(&cfg.arcdef[j],&cfg.arcdef[j-1] ! 865: ,sizeof(arcdef_t)); ! 866: strcpy(cfg.arcdef[j].name ! 867: ,cfg.arcdef[j-1].name); ! 868: cfg.arcdefs++; ! 869: memset(&cfg.arcdef[i],0,sizeof(arcdef_t)); ! 870: strcpy(cfg.arcdef[i].name,str); ! 871: continue; } ! 872: ! 873: if((i&MSK_ON)==MSK_DEL) { ! 874: i&=MSK_OFF; ! 875: cfg.arcdefs--; ! 876: if(cfg.arcdefs<=0) { ! 877: cfg.arcdefs=0; ! 878: continue; } ! 879: for(j=i;j<cfg.arcdefs;j++) ! 880: memcpy(&cfg.arcdef[j],&cfg.arcdef[j+1] ! 881: ,sizeof(arcdef_t)); ! 882: if((cfg.arcdef=(arcdef_t *)REALLOC(cfg.arcdef ! 883: ,sizeof(arcdef_t)*(cfg.arcdefs)))==NULL) { ! 884: printf("\nMemory Allocation Error\n"); ! 885: exit(1); } ! 886: continue; } ! 887: if((i&MSK_ON)==MSK_GET) { ! 888: i&=MSK_OFF; ! 889: memcpy(&savarcdef,&cfg.arcdef[i],sizeof(arcdef_t)); ! 890: continue; } ! 891: if((i&MSK_ON)==MSK_PUT) { ! 892: i&=MSK_OFF; ! 893: memcpy(&cfg.arcdef[i],&savarcdef,sizeof(arcdef_t)); ! 894: continue; } ! 895: while(1) { ! 896: j=0; ! 897: sprintf(opt[j++],"%-20.20s %s","Packer Name" ! 898: ,cfg.arcdef[i].name); ! 899: sprintf(opt[j++],"%-20.20s %s","Hexadecimal ID" ! 900: ,cfg.arcdef[i].hexid); ! 901: sprintf(opt[j++],"%-20.20s %u","Offset to Hex ID" ! 902: ,cfg.arcdef[i].byteloc); ! 903: sprintf(opt[j++],"%-20.20s %s","Pack Command Line" ! 904: ,cfg.arcdef[i].pack); ! 905: sprintf(opt[j++],"%-20.20s %s","Unpack Command Line" ! 906: ,cfg.arcdef[i].unpack); ! 907: opt[j][0]=0; ! 908: sprintf(str,"%.30s",cfg.arcdef[i].name); ! 909: k=uifc.list(WIN_MID|WIN_ACT,0,0,60,&nodeop,0,str,opt); ! 910: if(k==-1) ! 911: break; ! 912: switch(k) { ! 913: case 0: ! 914: uifc.input(WIN_MID|WIN_SAV,0,0 ! 915: ,"Packer Name",cfg.arcdef[i].name,25 ! 916: ,K_EDIT|K_UPPER); ! 917: break; ! 918: case 1: ! 919: uifc.input(WIN_MID|WIN_SAV,0,0 ! 920: ,"Hexadecimal ID",cfg.arcdef[i].hexid,25 ! 921: ,K_EDIT|K_UPPER); ! 922: break; ! 923: case 2: ! 924: sprintf(str,"%u",cfg.arcdef[i].byteloc); ! 925: uifc.input(WIN_MID|WIN_SAV,0,0 ! 926: ,"Offset to Hex ID",str,5 ! 927: ,K_NUMBER|K_EDIT); ! 928: cfg.arcdef[i].byteloc=atoi(str); ! 929: break; ! 930: case 3: ! 931: uifc.input(WIN_MID|WIN_SAV,0,0 ! 932: ,"Pack Command Line",cfg.arcdef[i].pack,50 ! 933: ,K_EDIT); ! 934: break; ! 935: case 4: ! 936: uifc.input(WIN_MID|WIN_SAV,0,0 ! 937: ,"Unpack Command Line",cfg.arcdef[i].unpack,50 ! 938: ,K_EDIT); ! 939: break; ! 940: } } } ! 941: break; ! 942: case 9: ! 943: uifc.helpbuf= ! 944: " Additional Echo Lists \r\n\r\n" ! 945: "This feature allows you to specify echo lists (in addition to your\r\n" ! 946: "AREAS.BBS file) for SBBSecho to search for area add requests.\r\n"; ! 947: i=0; ! 948: while(1) { ! 949: for(j=0;j<cfg.listcfgs;j++) ! 950: sprintf(opt[j],"%-50.50s",cfg.listcfg[j].listpath); ! 951: opt[j][0]=0; ! 952: i=uifc.list(WIN_ORG|WIN_INS|WIN_DEL|WIN_ACT|WIN_GET|WIN_PUT ! 953: |WIN_INSACT|WIN_DELACT|WIN_XTR ! 954: ,0,0,0,&i,0,"Additional Echo Lists",opt); ! 955: if(i==-1) ! 956: break; ! 957: if((i&MSK_ON)==MSK_INS) { ! 958: i&=MSK_OFF; ! 959: str[0]=0; ! 960: uifc.helpbuf= ! 961: " Echo List \r\n\r\n" ! 962: "This is the path and filename of the echo list file you wish\r\n" ! 963: "to add.\r\n"; ! 964: if(uifc.input(WIN_MID|WIN_SAV,0,0 ! 965: ,"Echo List Path/Name",str,50,K_EDIT)<1) ! 966: continue; ! 967: if((cfg.listcfg=(echolist_t *)REALLOC(cfg.listcfg ! 968: ,sizeof(echolist_t)*(cfg.listcfgs+1)))==NULL) { ! 969: printf("\nMemory Allocation Error\n"); ! 970: exit(1); } ! 971: for(j=cfg.listcfgs;j>i;j--) ! 972: memcpy(&cfg.listcfg[j],&cfg.listcfg[j-1] ! 973: ,sizeof(echolist_t)); ! 974: cfg.listcfgs++; ! 975: memset(&cfg.listcfg[i],0,sizeof(echolist_t)); ! 976: strcpy(cfg.listcfg[i].listpath,str); ! 977: continue; } ! 978: ! 979: if((i&MSK_ON)==MSK_DEL) { ! 980: i&=MSK_OFF; ! 981: cfg.listcfgs--; ! 982: if(cfg.listcfgs<=0) { ! 983: cfg.listcfgs=0; ! 984: continue; } ! 985: for(j=i;j<cfg.listcfgs;j++) ! 986: memcpy(&cfg.listcfg[j],&cfg.listcfg[j+1] ! 987: ,sizeof(echolist_t)); ! 988: if((cfg.listcfg=(echolist_t *)REALLOC(cfg.listcfg ! 989: ,sizeof(echolist_t)*(cfg.listcfgs)))==NULL) { ! 990: printf("\nMemory Allocation Error\n"); ! 991: exit(1); } ! 992: continue; } ! 993: if((i&MSK_ON)==MSK_GET) { ! 994: i&=MSK_OFF; ! 995: memcpy(&savlistcfg,&cfg.listcfg[i],sizeof(echolist_t)); ! 996: continue; } ! 997: if((i&MSK_ON)==MSK_PUT) { ! 998: i&=MSK_OFF; ! 999: memcpy(&cfg.listcfg[i],&savlistcfg,sizeof(echolist_t)); ! 1000: continue; } ! 1001: while(1) { ! 1002: j=0; ! 1003: sprintf(opt[j++],"%-20.20s %.19s","Echo List Path/Name" ! 1004: ,cfg.listcfg[i].listpath); ! 1005: sprintf(opt[j++],"%-20.20s %s","Hub Address" ! 1006: ,(cfg.listcfg[i].forward.zone) ? ! 1007: wcfaddrtoa(&cfg.listcfg[i].forward) : "None"); ! 1008: sprintf(opt[j++],"%-20.20s %s","Forward Password" ! 1009: ,(cfg.listcfg[i].password[0]) ? ! 1010: cfg.listcfg[i].password : "None"); ! 1011: sprintf(opt[j++],"%-20.20s %s","Forward Requests" ! 1012: ,(cfg.listcfg[i].misc&NOFWD) ? "No" : "Yes"); ! 1013: str[0]=0; ! 1014: for(k=0;k<cfg.listcfg[i].numflags;k++) { ! 1015: strcat(str,cfg.listcfg[i].flag[k].flag); ! 1016: strcat(str," "); } ! 1017: sprintf(opt[j++],"%-20.20s %s","Echo List Flags",str); ! 1018: opt[j][0]=0; ! 1019: k=uifc.list(WIN_MID|WIN_ACT,0,0,60,&nodeop,0,"Echo List",opt); ! 1020: if(k==-1) ! 1021: break; ! 1022: switch(k) { ! 1023: case 0: ! 1024: strcpy(str,cfg.listcfg[i].listpath); ! 1025: if(uifc.input(WIN_MID|WIN_SAV,0,0 ! 1026: ,"Echo List Path/Name",str,50 ! 1027: ,K_EDIT)<1) ! 1028: continue; ! 1029: strcpy(cfg.listcfg[i].listpath,str); ! 1030: break; ! 1031: case 1: ! 1032: if(cfg.listcfg[i].forward.zone) ! 1033: strcpy(str,wcfaddrtoa(&cfg.listcfg[i].forward)); ! 1034: else ! 1035: str[0]=0; ! 1036: uifc.input(WIN_MID|WIN_SAV,0,0 ! 1037: ,"Hub Address",str ! 1038: ,25,K_EDIT); ! 1039: if(str[0]) ! 1040: cfg.listcfg[i].forward=atofaddr(str); ! 1041: else ! 1042: memset(&cfg.listcfg[i].forward,0 ! 1043: ,sizeof(faddr_t)); ! 1044: break; ! 1045: case 2: ! 1046: uifc.input(WIN_MID|WIN_SAV,0,0 ! 1047: ,"Password to use when forwarding requests" ! 1048: ,cfg.listcfg[i].password,25,K_EDIT|K_UPPER); ! 1049: break; ! 1050: case 3: ! 1051: cfg.listcfg[i].misc^=NOFWD; ! 1052: if(cfg.listcfg[i].misc&NOFWD) ! 1053: cfg.listcfg[i].password[0]=0; ! 1054: break; ! 1055: case 4: ! 1056: while(1) { ! 1057: for(j=0;j<cfg.listcfg[i].numflags;j++) ! 1058: strcpy(opt[j],cfg.listcfg[i].flag[j].flag); ! 1059: opt[j][0]=0; ! 1060: x=uifc.list(WIN_SAV|WIN_INS|WIN_DEL|WIN_ACT| ! 1061: WIN_XTR|WIN_INSACT|WIN_DELACT|WIN_RHT ! 1062: ,0,0,0,&x,0,"Echo List Flags",opt); ! 1063: if(x==-1) ! 1064: break; ! 1065: if((x&MSK_ON)==MSK_INS) { ! 1066: x&=MSK_OFF; ! 1067: str[0]=0; ! 1068: uifc.helpbuf= ! 1069: " Echo List Flag \r\n\r\n" ! 1070: "These flags determine which nodes have access to the current\r\n" ! 1071: "echolist file\r\n"; ! 1072: if(uifc.input(WIN_MID|WIN_SAV,0,0 ! 1073: ,"Echo List Flag",str,4 ! 1074: ,K_EDIT|K_UPPER)<1) ! 1075: continue; ! 1076: if((cfg.listcfg[i].flag=(flag_t *) ! 1077: REALLOC(cfg.listcfg[i].flag ! 1078: ,sizeof(flag_t)* ! 1079: (cfg.listcfg[i].numflags+1)))==NULL) { ! 1080: printf("\nMemory Allocation Error\n"); ! 1081: exit(1); } ! 1082: for(j=cfg.listcfg[i].numflags;j>x;j--) ! 1083: memcpy(&cfg.listcfg[i].flag[j] ! 1084: ,&cfg.listcfg[i].flag[j-1] ! 1085: ,sizeof(flag_t)); ! 1086: cfg.listcfg[i].numflags++; ! 1087: memset(&cfg.listcfg[i].flag[x].flag ! 1088: ,0,sizeof(flag_t)); ! 1089: strcpy(cfg.listcfg[i].flag[x].flag,str); ! 1090: continue; } ! 1091: ! 1092: if((x&MSK_ON)==MSK_DEL) { ! 1093: x&=MSK_OFF; ! 1094: cfg.listcfg[i].numflags--; ! 1095: if(cfg.listcfg[i].numflags<=0) { ! 1096: cfg.listcfg[i].numflags=0; ! 1097: continue; } ! 1098: for(j=x;j<cfg.listcfg[i].numflags;j++) ! 1099: strcpy(cfg.listcfg[i].flag[j].flag ! 1100: ,cfg.listcfg[i].flag[j+1].flag); ! 1101: if((cfg.listcfg[i].flag=(flag_t *) ! 1102: REALLOC(cfg.listcfg[i].flag ! 1103: ,sizeof(flag_t)* ! 1104: (cfg.listcfg[i].numflags)))==NULL) { ! 1105: printf("\nMemory Allocation Error\n"); ! 1106: exit(1); } ! 1107: continue; } ! 1108: strcpy(str,cfg.listcfg[i].flag[x].flag); ! 1109: uifc.helpbuf= ! 1110: " Echo List Flag \r\n\r\n" ! 1111: "These flags determine which nodes have access to the current\r\n" ! 1112: "echolist file\r\n"; ! 1113: uifc.input(WIN_MID|WIN_SAV,0,0,"Echo List Flag" ! 1114: ,str,4,K_EDIT|K_UPPER); ! 1115: strcpy(cfg.listcfg[i].flag[x].flag,str); ! 1116: continue; } ! 1117: break; ! 1118: } } } ! 1119: break; ! 1120: ! 1121: case -1: ! 1122: uifc.helpbuf= ! 1123: " Save Configuration File \r\n\r\n" ! 1124: "Select &Yes& to save the config file, &No& to quit without saving,\r\n" ! 1125: "or hit ESC to go back to the menu.\r\n\r\n"; ! 1126: i=0; ! 1127: strcpy(opt[0],"Yes"); ! 1128: strcpy(opt[1],"No"); ! 1129: opt[2][0]=0; ! 1130: i=uifc.list(WIN_MID,0,0,0,&i,0,"Save Config File",opt); ! 1131: if(i==-1) break; ! 1132: if(i) {uifc.bail(); exit(0);} ! 1133: if((stream=fnopen(NULL,cfg.cfgfile,O_CREAT|O_TRUNC|O_WRONLY))==NULL) { ! 1134: uifc.bail(); ! 1135: printf("Error %d opening %s\n",errno,cfg.cfgfile); ! 1136: exit(1); ! 1137: } ! 1138: if(!cfg.check_path) ! 1139: fprintf(stream,"NOPATHCHECK\n"); ! 1140: if(!node_swap) ! 1141: fprintf(stream,"NOSWAP\n"); ! 1142: if(cfg.notify) ! 1143: fprintf(stream,"NOTIFY %u\n",cfg.notify); ! 1144: if(misc&SECURE) ! 1145: fprintf(stream,"SECURE_ECHOMAIL\n"); ! 1146: if(misc&KILL_EMPTY_MAIL) ! 1147: fprintf(stream,"KILL_EMPTY\n"); ! 1148: if(misc&STORE_SEENBY) ! 1149: fprintf(stream,"STORE_SEENBY\n"); ! 1150: if(misc&STORE_PATH) ! 1151: fprintf(stream,"STORE_PATH\n"); ! 1152: if(misc&STORE_KLUDGE) ! 1153: fprintf(stream,"STORE_KLUDGE\n"); ! 1154: if(misc&FUZZY_ZONE) ! 1155: fprintf(stream,"FUZZY_ZONE\n"); ! 1156: if(misc&FLO_MAILER) ! 1157: fprintf(stream,"FLO_MAILER\n"); ! 1158: if(misc&ELIST_ONLY) ! 1159: fprintf(stream,"ELIST_ONLY\n"); ! 1160: if(misc&STRIP_LF) ! 1161: fprintf(stream,"STRIP_LF\n"); ! 1162: if(misc&TRUNC_BUNDLES) ! 1163: fprintf(stream,"TRUNC_BUNDLES\n"); ! 1164: ! 1165: if(cfg.areafile[0]) ! 1166: fprintf(stream,"AREAFILE %s\n",cfg.areafile); ! 1167: if(cfg.logfile[0]) ! 1168: fprintf(stream,"LOGFILE %s\n",cfg.logfile); ! 1169: if(cfg.log!=LOG_DEFAULTS) { ! 1170: if(cfg.log==0xffffffffUL) ! 1171: fprintf(stream,"LOG ALL\n"); ! 1172: else if(cfg.log==0L) ! 1173: fprintf(stream,"LOG NONE\n"); ! 1174: else ! 1175: fprintf(stream,"LOG %08lX\n",cfg.log); } ! 1176: if(cfg.inbound[0]) ! 1177: fprintf(stream,"INBOUND %s\n",cfg.inbound); ! 1178: if(cfg.secure[0]) ! 1179: fprintf(stream,"SECURE_INBOUND %s\n",cfg.secure); ! 1180: if(cfg.outbound[0]) ! 1181: fprintf(stream,"OUTBOUND %s\n",cfg.outbound); ! 1182: if(cfg.maxbdlsize!=DFLT_BDL_SIZE) ! 1183: fprintf(stream,"ARCSIZE %lu\n",cfg.maxbdlsize); ! 1184: if(cfg.maxpktsize!=DFLT_PKT_SIZE) ! 1185: fprintf(stream,"PKTSIZE %lu\n",cfg.maxpktsize); ! 1186: for(i=j=0;i<cfg.nodecfgs;i++) ! 1187: if(cfg.nodecfg[i].attr&SEND_NOTIFY) { ! 1188: if(!j) fprintf(stream,"SEND_NOTIFY"); ! 1189: fprintf(stream," %s",wcfaddrtoa(&cfg.nodecfg[i].faddr)); ! 1190: j++; } ! 1191: if(j) fprintf(stream,"\n"); ! 1192: for(i=j=0;i<cfg.nodecfgs;i++) ! 1193: if(cfg.nodecfg[i].attr&ATTR_HOLD) { ! 1194: if(!j) fprintf(stream,"HOLD"); ! 1195: fprintf(stream," %s",wcfaddrtoa(&cfg.nodecfg[i].faddr)); ! 1196: j++; } ! 1197: if(j) fprintf(stream,"\n"); ! 1198: for(i=j=0;i<cfg.nodecfgs;i++) ! 1199: if(cfg.nodecfg[i].attr&ATTR_DIRECT) { ! 1200: if(!j) fprintf(stream,"DIRECT"); ! 1201: fprintf(stream," %s",wcfaddrtoa(&cfg.nodecfg[i].faddr)); ! 1202: j++; } ! 1203: if(j) fprintf(stream,"\n"); ! 1204: for(i=j=0;i<cfg.nodecfgs;i++) ! 1205: if(cfg.nodecfg[i].attr&ATTR_CRASH) { ! 1206: if(!j) fprintf(stream,"CRASH"); ! 1207: fprintf(stream," %s",wcfaddrtoa(&cfg.nodecfg[i].faddr)); ! 1208: j++; } ! 1209: if(j) fprintf(stream,"\n"); ! 1210: for(i=j=0;i<cfg.nodecfgs;i++) ! 1211: if(cfg.nodecfg[i].attr&ATTR_PASSIVE) { ! 1212: if(!j) fprintf(stream,"PASSIVE"); ! 1213: fprintf(stream," %s",wcfaddrtoa(&cfg.nodecfg[i].faddr)); ! 1214: j++; } ! 1215: if(j) fprintf(stream,"\n"); ! 1216: ! 1217: for(i=0;i<cfg.nodecfgs;i++) ! 1218: if(cfg.nodecfg[i].pktpwd[0]) ! 1219: fprintf(stream,"PKTPWD %s %s\n" ! 1220: ,wcfaddrtoa(&cfg.nodecfg[i].faddr),cfg.nodecfg[i].pktpwd); ! 1221: ! 1222: for(i=0;i<cfg.nodecfgs;i++) ! 1223: if(cfg.nodecfg[i].pkt_type) ! 1224: fprintf(stream,"PKTTYPE %s %s\n" ! 1225: ,cfg.nodecfg[i].pkt_type==PKT_TWO_TWO ? "2.2":"2" ! 1226: ,wcfaddrtoa(&cfg.nodecfg[i].faddr)); ! 1227: ! 1228: for(i=0;i<cfg.arcdefs;i++) ! 1229: fprintf(stream,"PACKER %s %u %s\n PACK %s\n" ! 1230: " UNPACK %s\nEND\n" ! 1231: ,cfg.arcdef[i].name ! 1232: ,cfg.arcdef[i].byteloc ! 1233: ,cfg.arcdef[i].hexid ! 1234: ,cfg.arcdef[i].pack ! 1235: ,cfg.arcdef[i].unpack ! 1236: ); ! 1237: for(i=0;i<cfg.arcdefs;i++) { ! 1238: for(j=k=0;j<cfg.nodecfgs;j++) ! 1239: if(cfg.nodecfg[j].arctype==i) { ! 1240: if(!k) ! 1241: fprintf(stream,"%-10s %s","USEPACKER" ! 1242: ,cfg.arcdef[i].name); ! 1243: k++; ! 1244: fprintf(stream," %s",wcfaddrtoa(&cfg.nodecfg[j].faddr)); } ! 1245: if(k) ! 1246: fprintf(stream,"\n"); } ! 1247: ! 1248: for(i=j=0;i<cfg.nodecfgs;i++) ! 1249: if(cfg.nodecfg[i].arctype==0xffff) { ! 1250: if(!j) ! 1251: fprintf(stream,"%-10s %s","USEPACKER","NONE"); ! 1252: j++; ! 1253: fprintf(stream," %s",wcfaddrtoa(&cfg.nodecfg[i].faddr)); } ! 1254: if(j) ! 1255: fprintf(stream,"\n"); ! 1256: ! 1257: for(i=0;i<cfg.listcfgs;i++) { ! 1258: fprintf(stream,"%-10s","ECHOLIST"); ! 1259: if(cfg.listcfg[i].password[0]) ! 1260: fprintf(stream," FORWARD %s %s" ! 1261: ,wcfaddrtoa(&cfg.listcfg[i].forward) ! 1262: ,cfg.listcfg[i].password); ! 1263: else if(cfg.listcfg[i].misc&NOFWD && ! 1264: cfg.listcfg[i].forward.zone) ! 1265: fprintf(stream," HUB %s" ! 1266: ,wcfaddrtoa(&cfg.listcfg[i].forward)); ! 1267: fprintf(stream," %s",cfg.listcfg[i].listpath); ! 1268: for(j=0;j<cfg.listcfg[i].numflags;j++) ! 1269: fprintf(stream," %s",cfg.listcfg[i].flag[j].flag); ! 1270: fprintf(stream,"\n"); } ! 1271: ! 1272: for(i=0;i<cfg.nodecfgs;i++) ! 1273: if(cfg.nodecfg[i].password[0]) { ! 1274: fprintf(stream,"%-10s %s %s","AREAFIX" ! 1275: ,wcfaddrtoa(&cfg.nodecfg[i].faddr) ! 1276: ,cfg.nodecfg[i].password); ! 1277: for(j=0;j<cfg.nodecfg[i].numflags;j++) ! 1278: fprintf(stream," %s",cfg.nodecfg[i].flag[j].flag); ! 1279: fprintf(stream,"\n"); } ! 1280: ! 1281: for(i=0;i<cfg.nodecfgs;i++) ! 1282: if(cfg.nodecfg[i].route.zone) { ! 1283: fprintf(stream,"%-10s %s","ROUTE_TO" ! 1284: ,wcfaddrtoa(&cfg.nodecfg[i].route)); ! 1285: fprintf(stream," %s" ! 1286: ,wcfaddrtoa(&cfg.nodecfg[i].faddr)); ! 1287: for(j=i+1;j<cfg.nodecfgs;j++) ! 1288: if(!memcmp(&cfg.nodecfg[j].route,&cfg.nodecfg[i].route ! 1289: ,sizeof(faddr_t))) { ! 1290: fprintf(stream," %s" ! 1291: ,wcfaddrtoa(&cfg.nodecfg[j].faddr)); ! 1292: cfg.nodecfg[j].route.zone=0; } ! 1293: fprintf(stream,"\n"); } ! 1294: ! 1295: fclose(stream); ! 1296: uifc.bail(); ! 1297: exit(0); ! 1298: } ! 1299: } ! 1300: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.