|
|
1.1 ! root 1: /* rechocfg.C */ ! 2: ! 3: /* Synchronet FidoNet EchoMail Scanning/Tossing and NetMail Tossing Utility */ ! 4: ! 5: /* $Id: rechocfg.c,v 1.18 2004/05/30 06:47:53 deuce 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 2000 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: #ifdef _WIN32 ! 41: #include <windows.h> ! 42: #endif ! 43: #include <time.h> ! 44: #include <errno.h> ! 45: #include <stdio.h> ! 46: #include <ctype.h> ! 47: #include <fcntl.h> ! 48: #include <stdarg.h> ! 49: #include <stdlib.h> ! 50: #include <string.h> ! 51: #include <sys/stat.h> ! 52: ! 53: #include "sbbs.h" ! 54: #include "sbbsecho.h" ! 55: #include "filewrap.h" /* O_DENYNONE */ ! 56: ! 57: #ifdef __WATCOMC__ ! 58: #include <mem.h> ! 59: #define O_DENYNONE SH_DENYNO ! 60: #endif ! 61: ! 62: #ifdef __MSDOS__ ! 63: extern uchar node_swap; ! 64: #endif ! 65: extern long misc; ! 66: extern config_t cfg; ! 67: ! 68: /****************************************************************************** ! 69: Here we take a string and put a terminator in place of the first TAB or SPACE ! 70: ******************************************************************************/ ! 71: char *cleanstr(char *instr) ! 72: { ! 73: int i; ! 74: ! 75: for(i=0;instr[i];i++) ! 76: if((uchar)instr[i]<=' ') ! 77: break; ! 78: instr[i]=0; ! 79: return(instr); ! 80: } ! 81: ! 82: /****************************************************************************/ ! 83: /* Returns the FidoNet address kept in str as ASCII. */ ! 84: /****************************************************************************/ ! 85: faddr_t atofaddr(char *instr) ! 86: { ! 87: char *p,str[51]; ! 88: faddr_t addr; ! 89: ! 90: sprintf(str,"%.50s",instr); ! 91: cleanstr(str); ! 92: if(!stricmp(str,"ALL")) { ! 93: addr.zone=addr.net=addr.node=addr.point=0xffff; ! 94: return(addr); } ! 95: addr.zone=addr.net=addr.node=addr.point=0; ! 96: if((p=strchr(str,':'))!=NULL) { ! 97: if(!strnicmp(str,"ALL:",4)) ! 98: addr.zone=0xffff; ! 99: else ! 100: addr.zone=atoi(str); ! 101: p++; ! 102: if(!strnicmp(p,"ALL",3)) ! 103: addr.net=0xffff; ! 104: else ! 105: addr.net=atoi(p); } ! 106: else { ! 107: #ifdef SCFG ! 108: if(total_faddrs) ! 109: addr.zone=faddr[0].zone; ! 110: else ! 111: #endif ! 112: addr.zone=1; ! 113: addr.net=atoi(str); } ! 114: if(!addr.zone) /* no such thing as zone 0 */ ! 115: addr.zone=1; ! 116: if((p=strchr(str,'/'))!=NULL) { ! 117: p++; ! 118: if(!strnicmp(p,"ALL",3)) ! 119: addr.node=0xffff; ! 120: else ! 121: addr.node=atoi(p); } ! 122: else { ! 123: if(!addr.net) { ! 124: #ifdef SCFG ! 125: if(total_faddrs) ! 126: addr.net=faddr[0].net; ! 127: else ! 128: #endif ! 129: addr.net=1; } ! 130: addr.node=atoi(str); } ! 131: if((p=strchr(str,'.'))!=NULL) { ! 132: p++; ! 133: if(!strnicmp(p,"ALL",3)) ! 134: addr.point=0xffff; ! 135: else ! 136: addr.point=atoi(p); } ! 137: return(addr); ! 138: } ! 139: ! 140: /****************************************************************************** ! 141: This function returns the number of the node in the SBBSECHO.CFG file which ! 142: matches the address passed to it (or cfg.nodecfgs if no match). ! 143: ******************************************************************************/ ! 144: int matchnode(faddr_t addr, int exact) ! 145: { ! 146: int i; ! 147: ! 148: if(exact!=2) { ! 149: for(i=0;i<cfg.nodecfgs;i++) /* Look for exact match */ ! 150: if(!memcmp(&cfg.nodecfg[i].faddr,&addr,sizeof(faddr_t))) ! 151: break; ! 152: if(exact || i<cfg.nodecfgs) ! 153: return(i); } ! 154: ! 155: for(i=0;i<cfg.nodecfgs;i++) /* Look for point match */ ! 156: if(cfg.nodecfg[i].faddr.point==0xffff ! 157: && addr.zone==cfg.nodecfg[i].faddr.zone ! 158: && addr.net==cfg.nodecfg[i].faddr.net ! 159: && addr.node==cfg.nodecfg[i].faddr.node) ! 160: break; ! 161: if(i<cfg.nodecfgs) ! 162: return(i); ! 163: ! 164: for(i=0;i<cfg.nodecfgs;i++) /* Look for node match */ ! 165: if(cfg.nodecfg[i].faddr.node==0xffff ! 166: && addr.zone==cfg.nodecfg[i].faddr.zone ! 167: && addr.net==cfg.nodecfg[i].faddr.net) ! 168: break; ! 169: if(i<cfg.nodecfgs) ! 170: return(i); ! 171: ! 172: for(i=0;i<cfg.nodecfgs;i++) /* Look for net match */ ! 173: if(cfg.nodecfg[i].faddr.net==0xffff ! 174: && addr.zone==cfg.nodecfg[i].faddr.zone) ! 175: break; ! 176: if(i<cfg.nodecfgs) ! 177: return(i); ! 178: ! 179: for(i=0;i<cfg.nodecfgs;i++) /* Look for total wild */ ! 180: if(cfg.nodecfg[i].faddr.zone==0xffff) ! 181: break; ! 182: return(i); ! 183: } ! 184: ! 185: void read_echo_cfg() ! 186: { ! 187: uchar str[1025],tmp[512],*p,*tp; ! 188: short attr=0; ! 189: int i,j,file; ! 190: FILE *stream; ! 191: faddr_t addr,route_addr; ! 192: ! 193: ! 194: /****** READ IN SBBSECHO.CFG FILE *******/ ! 195: ! 196: printf("\nReading %s\n",cfg.cfgfile); ! 197: if((stream=fnopen(&file,cfg.cfgfile,O_RDONLY))==NULL) { ! 198: printf("Unable to open %s for read.\n",cfg.cfgfile); ! 199: bail(1); } ! 200: ! 201: cfg.maxpktsize=DFLT_PKT_SIZE; ! 202: cfg.maxbdlsize=DFLT_BDL_SIZE; ! 203: cfg.badecho=-1; ! 204: cfg.log=LOG_DEFAULTS; ! 205: cfg.check_path=TRUE; ! 206: ! 207: while(1) { ! 208: if(!fgets(str,256,stream)) ! 209: break; ! 210: truncsp(str); ! 211: p=str; ! 212: while(*p && *p<=' ') p++; ! 213: if(*p==';') ! 214: continue; ! 215: sprintf(tmp,"%-.25s",p); ! 216: tp=strchr(tmp,' '); ! 217: if(tp) ! 218: *tp=0; /* Chop off at space */ ! 219: #if 0 ! 220: strupr(tmp); /* Convert code to uppercase */ ! 221: #endif ! 222: while(*p>' ') p++; /* Skip code */ ! 223: while(*p && *p<=' ') p++; /* Skip white space */ ! 224: ! 225: if(!stricmp(tmp,"PACKER")) { /* Archive Definition */ ! 226: if((cfg.arcdef=(arcdef_t *)REALLOC(cfg.arcdef ! 227: ,sizeof(arcdef_t)*(cfg.arcdefs+1)))==NULL) { ! 228: printf("\nError allocating %u bytes of memory for arcdef #%u.\n" ! 229: ,sizeof(arcdef_t)*(cfg.arcdefs+1),cfg.arcdefs+1); ! 230: bail(1); } ! 231: sprintf(cfg.arcdef[cfg.arcdefs].name,"%-.25s",p); ! 232: tp=cfg.arcdef[cfg.arcdefs].name; ! 233: while(*tp && *tp>' ') tp++; ! 234: *tp=0; ! 235: while(*p && *p>' ') p++; ! 236: while(*p && *p<=' ') p++; ! 237: cfg.arcdef[cfg.arcdefs].byteloc=atoi(p); ! 238: while(*p && *p>' ') p++; ! 239: while(*p && *p<=' ') p++; ! 240: sprintf(cfg.arcdef[cfg.arcdefs].hexid,"%-.25s",p); ! 241: tp=cfg.arcdef[cfg.arcdefs].hexid; ! 242: while(*tp && *tp>' ') tp++; ! 243: *tp=0; ! 244: while(fgets(str,256,stream) && strnicmp(str,"END",3)) { ! 245: p=str; ! 246: while(*p && *p<=' ') p++; ! 247: if(!strnicmp(p,"PACK ",5)) { ! 248: p+=5; ! 249: while(*p && *p<=' ') p++; ! 250: sprintf(cfg.arcdef[cfg.arcdefs].pack,"%-.80s",p); ! 251: truncsp(cfg.arcdef[cfg.arcdefs].pack); ! 252: continue; } ! 253: if(!strnicmp(p,"UNPACK ",7)) { ! 254: p+=7; ! 255: while(*p && *p<=' ') p++; ! 256: sprintf(cfg.arcdef[cfg.arcdefs].unpack,"%-.80s",p); ! 257: truncsp(cfg.arcdef[cfg.arcdefs].unpack); } } ! 258: ++cfg.arcdefs; ! 259: continue; } ! 260: ! 261: if(!stricmp(tmp,"REGNUM")) ! 262: continue; ! 263: ! 264: if(!stricmp(tmp,"NOPATHCHECK")) { ! 265: cfg.check_path=FALSE; ! 266: continue; ! 267: } ! 268: ! 269: if(!stricmp(tmp,"NOTIFY")) { ! 270: cfg.notify=atoi(cleanstr(p)); ! 271: continue; } ! 272: ! 273: if(!stricmp(tmp,"LOG")) { ! 274: cleanstr(p); ! 275: if(!stricmp(p,"ALL")) ! 276: cfg.log=0xffffffffUL; ! 277: else if(!stricmp(p,"DEFAULT")) ! 278: cfg.log=LOG_DEFAULTS; ! 279: else if(!stricmp(p,"NONE")) ! 280: cfg.log=0L; ! 281: else ! 282: cfg.log=strtol(cleanstr(p),0,16); ! 283: continue; } ! 284: ! 285: if(!stricmp(tmp,"NOSWAP")) { ! 286: #ifdef __MSDOS__ ! 287: node_swap=0; ! 288: #endif ! 289: continue; } ! 290: ! 291: if(!stricmp(tmp,"SECURE_ECHOMAIL")) { ! 292: misc|=SECURE; ! 293: continue; } ! 294: ! 295: if(!stricmp(tmp,"STRIP_LF")) { ! 296: misc|=STRIP_LF; ! 297: continue; } ! 298: ! 299: if(!stricmp(tmp,"STORE_SEENBY")) { ! 300: misc|=STORE_SEENBY; ! 301: continue; } ! 302: ! 303: if(!stricmp(tmp,"STORE_PATH")) { ! 304: misc|=STORE_PATH; ! 305: continue; } ! 306: ! 307: if(!stricmp(tmp,"STORE_KLUDGE")) { ! 308: misc|=STORE_KLUDGE; ! 309: continue; } ! 310: ! 311: if(!stricmp(tmp,"FUZZY_ZONE")) { ! 312: misc|=FUZZY_ZONE; ! 313: continue; } ! 314: ! 315: if(!stricmp(tmp,"TRUNC_BUNDLES")) { ! 316: misc|=TRUNC_BUNDLES; ! 317: continue; } ! 318: ! 319: if(!stricmp(tmp,"FLO_MAILER")) { ! 320: misc|=FLO_MAILER; ! 321: continue; } ! 322: ! 323: if(!stricmp(tmp,"ELIST_ONLY")) { ! 324: misc|=ELIST_ONLY; ! 325: continue; } ! 326: ! 327: if(!stricmp(tmp,"KILL_EMPTY")) { ! 328: misc|=KILL_EMPTY_MAIL; ! 329: continue; } ! 330: ! 331: if(!stricmp(tmp,"AREAFILE")) { ! 332: sprintf(cfg.areafile,"%-.80s",cleanstr(p)); ! 333: continue; } ! 334: ! 335: if(!stricmp(tmp,"LOGFILE")) { ! 336: sprintf(cfg.logfile,"%-.80s",cleanstr(p)); ! 337: continue; } ! 338: ! 339: if(!stricmp(tmp,"INBOUND")) { /* Inbound directory */ ! 340: sprintf(cfg.inbound,"%-.80s",cleanstr(p)); ! 341: backslash(cfg.inbound); ! 342: continue; } ! 343: ! 344: if(!stricmp(tmp,"SECURE_INBOUND")) { /* Secure Inbound directory */ ! 345: sprintf(cfg.secure,"%-.80s",cleanstr(p)); ! 346: backslash(cfg.secure); ! 347: continue; } ! 348: ! 349: if(!stricmp(tmp,"OUTBOUND")) { /* Outbound directory */ ! 350: sprintf(cfg.outbound,"%-.80s",cleanstr(p)); ! 351: backslash(cfg.outbound); ! 352: continue; } ! 353: ! 354: if(!stricmp(tmp,"ARCSIZE")) { /* Maximum bundle size */ ! 355: cfg.maxbdlsize=atol(p); ! 356: continue; } ! 357: ! 358: if(!stricmp(tmp,"PKTSIZE")) { /* Maximum packet size */ ! 359: cfg.maxpktsize=atol(p); ! 360: continue; } ! 361: ! 362: if(!stricmp(tmp,"USEPACKER")) { /* Which packer to use */ ! 363: if(!*p) ! 364: continue; ! 365: strcpy(str,p); ! 366: p=str; ! 367: while(*p && *p>' ') p++; ! 368: if(!*p) ! 369: continue; ! 370: *p=0; ! 371: p++; ! 372: for(i=0;i<cfg.arcdefs;i++) ! 373: if(!strnicmp(cfg.arcdef[i].name,str ! 374: ,strlen(cfg.arcdef[i].name))) ! 375: break; ! 376: if(i==cfg.arcdefs) /* i = number of arcdef til done */ ! 377: i=0xffff; /* Uncompressed type if not found */ ! 378: while(*p) { ! 379: while(*p && *p<=' ') p++; ! 380: if(!*p) ! 381: break; ! 382: addr=atofaddr(p); ! 383: while(*p && *p>' ') p++; ! 384: j=matchnode(addr,1); ! 385: if(j==cfg.nodecfgs) { ! 386: cfg.nodecfgs++; ! 387: if((cfg.nodecfg=(nodecfg_t *)REALLOC(cfg.nodecfg ! 388: ,sizeof(nodecfg_t)*(j+1)))==NULL) { ! 389: printf("\nError allocating memory for nodecfg #%u.\n" ! 390: ,j+1); ! 391: bail(1); } ! 392: memset(&cfg.nodecfg[j],0,sizeof(nodecfg_t)); ! 393: cfg.nodecfg[j].faddr=addr; } ! 394: cfg.nodecfg[j].arctype=i; } } ! 395: ! 396: if(!stricmp(tmp,"PKTPWD")) { /* Packet Password */ ! 397: if(!*p) ! 398: continue; ! 399: addr=atofaddr(p); ! 400: while(*p && *p>' ') p++; /* Skip address */ ! 401: while(*p && *p<=' ') p++; /* Find beginning of password */ ! 402: j=matchnode(addr,1); ! 403: if(j==cfg.nodecfgs) { ! 404: cfg.nodecfgs++; ! 405: if((cfg.nodecfg=(nodecfg_t *)REALLOC(cfg.nodecfg ! 406: ,sizeof(nodecfg_t)*(j+1)))==NULL) { ! 407: printf("\nError allocating memory for nodecfg #%u.\n" ! 408: ,j+1); ! 409: bail(1); } ! 410: memset(&cfg.nodecfg[j],0,sizeof(nodecfg_t)); ! 411: cfg.nodecfg[j].faddr=addr; } ! 412: sprintf(cfg.nodecfg[j].pktpwd,"%.8s",p); } ! 413: ! 414: if(!stricmp(tmp,"PKTTYPE")) { /* Packet Type to Use */ ! 415: if(!*p) ! 416: continue; ! 417: strcpy(str,p); ! 418: p=str; ! 419: while(*p && *p>' ') p++; ! 420: *p=0; ! 421: p++; ! 422: while(*p) { ! 423: while(*p && *p<=' ') p++; ! 424: if(!*p) ! 425: break; ! 426: addr=atofaddr(p); ! 427: while(*p && *p>' ') p++; ! 428: j=matchnode(addr,1); ! 429: if(j==cfg.nodecfgs) { ! 430: cfg.nodecfgs++; ! 431: if((cfg.nodecfg=(nodecfg_t *)REALLOC(cfg.nodecfg ! 432: ,sizeof(nodecfg_t)*(j+1)))==NULL) { ! 433: printf("\nError allocating memory for nodecfg #%u.\n" ! 434: ,j+1); ! 435: bail(1); } ! 436: memset(&cfg.nodecfg[j],0,sizeof(nodecfg_t)); ! 437: cfg.nodecfg[j].faddr=addr; } ! 438: if(!strcmp(str,"2+")) ! 439: cfg.nodecfg[j].pkt_type=PKT_TWO_PLUS; ! 440: else if(!strcmp(str,"2.2")) ! 441: cfg.nodecfg[j].pkt_type=PKT_TWO_TWO; ! 442: else if(!strcmp(str,"2")) ! 443: cfg.nodecfg[j].pkt_type=PKT_TWO; } } ! 444: ! 445: if(!stricmp(tmp,"SEND_NOTIFY")) { /* Nodes to send notify lists to */ ! 446: while(*p) { ! 447: while(*p && *p<=' ') p++; ! 448: if(!*p) ! 449: break; ! 450: addr=atofaddr(p); ! 451: while(*p && *p>' ') p++; ! 452: j=matchnode(addr,1); ! 453: if(j==cfg.nodecfgs) { ! 454: cfg.nodecfgs++; ! 455: if((cfg.nodecfg=(nodecfg_t *)REALLOC(cfg.nodecfg ! 456: ,sizeof(nodecfg_t)*(j+1)))==NULL) { ! 457: printf("\nError allocating memory for nodecfg #%u.\n" ! 458: ,j+1); ! 459: bail(1); } ! 460: memset(&cfg.nodecfg[j],0,sizeof(nodecfg_t)); ! 461: cfg.nodecfg[j].faddr=addr; } ! 462: cfg.nodecfg[j].attr|=SEND_NOTIFY; } } ! 463: ! 464: if(!stricmp(tmp,"PASSIVE") ! 465: || !stricmp(tmp,"HOLD") ! 466: || !stricmp(tmp,"CRASH") ! 467: || !stricmp(tmp,"DIRECT")) { /* Set node attributes */ ! 468: if(!stricmp(tmp,"PASSIVE")) ! 469: attr=ATTR_PASSIVE; ! 470: else if(!stricmp(tmp,"CRASH")) ! 471: attr=ATTR_CRASH; ! 472: else if(!stricmp(tmp,"HOLD")) ! 473: attr=ATTR_HOLD; ! 474: else if(!stricmp(tmp,"DIRECT")) ! 475: attr=ATTR_DIRECT; ! 476: while(*p) { ! 477: while(*p && *p<=' ') p++; ! 478: if(!*p) ! 479: break; ! 480: addr=atofaddr(p); ! 481: while(*p && *p>' ') p++; ! 482: j=matchnode(addr,1); ! 483: if(j==cfg.nodecfgs) { ! 484: cfg.nodecfgs++; ! 485: if((cfg.nodecfg=(nodecfg_t *)REALLOC(cfg.nodecfg ! 486: ,sizeof(nodecfg_t)*(j+1)))==NULL) { ! 487: printf("\nError allocating memory for nodecfg #%u.\n" ! 488: ,j+1); ! 489: bail(1); } ! 490: memset(&cfg.nodecfg[j],0,sizeof(nodecfg_t)); ! 491: cfg.nodecfg[j].faddr=addr; } ! 492: cfg.nodecfg[j].attr|=attr; } } ! 493: ! 494: if(!stricmp(tmp,"ROUTE_TO")) { ! 495: while(*p && *p<=' ') p++; ! 496: if(*p) { ! 497: route_addr=atofaddr(p); ! 498: while(*p && *p>' ') p++; } ! 499: while(*p) { ! 500: while(*p && *p<=' ') p++; ! 501: if(!*p) ! 502: break; ! 503: addr=atofaddr(p); ! 504: while(*p && *p>' ') p++; ! 505: j=matchnode(addr,1); ! 506: if(j==cfg.nodecfgs) { ! 507: cfg.nodecfgs++; ! 508: if((cfg.nodecfg=(nodecfg_t *)REALLOC(cfg.nodecfg ! 509: ,sizeof(nodecfg_t)*(j+1)))==NULL) { ! 510: printf("\nError allocating memory for nodecfg #%u.\n" ! 511: ,j+1); ! 512: bail(1); } ! 513: memset(&cfg.nodecfg[j],0,sizeof(nodecfg_t)); ! 514: cfg.nodecfg[j].faddr=addr; } ! 515: cfg.nodecfg[j].route=route_addr; } } ! 516: ! 517: if(!stricmp(tmp,"AREAFIX")) { /* Areafix stuff here */ ! 518: if(!*p) ! 519: continue; ! 520: addr=atofaddr(p); ! 521: i=matchnode(addr,1); ! 522: if(i==cfg.nodecfgs) { ! 523: cfg.nodecfgs++; ! 524: if((cfg.nodecfg=(nodecfg_t *)REALLOC(cfg.nodecfg ! 525: ,sizeof(nodecfg_t)*(i+1)))==NULL) { ! 526: printf("\nError allocating memory for nodecfg #%u.\n" ! 527: ,i+1); ! 528: bail(1); } ! 529: memset(&cfg.nodecfg[i],0,sizeof(nodecfg_t)); ! 530: cfg.nodecfg[i].faddr=addr; } ! 531: cfg.nodecfg[i].flag=NULL; ! 532: while(*p && *p>' ') p++; /* Get to the end of the address */ ! 533: while(*p && *p<=' ') p++; /* Skip over whitespace chars */ ! 534: tp=p; ! 535: while(*p && *p>' ') p++; /* Find end of password */ ! 536: *p=0; /* and terminate the string */ ! 537: ++p; ! 538: sprintf(cfg.nodecfg[i].password,"%-.25s",tp); ! 539: while(*p && *p<=' ') p++; /* Search for more chars */ ! 540: if(!*p) /* Nothing else there */ ! 541: continue; ! 542: while(*p) { ! 543: tp=p; ! 544: while(*p && *p>' ') p++; /* Find end of this flag */ ! 545: *p=0; /* and terminate it */ ! 546: ++p; ! 547: for(j=0;j<cfg.nodecfg[i].numflags;j++) ! 548: if(!strnicmp(cfg.nodecfg[i].flag[j].flag,tp ! 549: ,strlen(cfg.nodecfg[i].flag[j].flag))) ! 550: break; ! 551: if(j==cfg.nodecfg[i].numflags) { ! 552: if((cfg.nodecfg[i].flag= ! 553: (flag_t *)REALLOC(cfg.nodecfg[i].flag ! 554: ,sizeof(flag_t)*(j+1)))==NULL) { ! 555: printf("\nError allocating memory for nodecfg #%u " ! 556: "flag #%u.\n",cfg.nodecfgs,j+1); ! 557: bail(1); } ! 558: cfg.nodecfg[i].numflags++; ! 559: sprintf(cfg.nodecfg[i].flag[j].flag,"%.4s",tp); } ! 560: while(*p && *p<=' ') p++; } } ! 561: ! 562: if(!stricmp(tmp,"ECHOLIST")) { /* Echolists go here */ ! 563: if((cfg.listcfg=(echolist_t *)REALLOC(cfg.listcfg ! 564: ,sizeof(echolist_t)*(cfg.listcfgs+1)))==NULL) { ! 565: printf("\nError allocating memory for echolist cfg #%u.\n" ! 566: ,cfg.listcfgs+1); ! 567: bail(1); } ! 568: memset(&cfg.listcfg[cfg.listcfgs],0,sizeof(echolist_t)); ! 569: ++cfg.listcfgs; ! 570: /* Need to forward requests? */ ! 571: if(!strnicmp(p,"FORWARD ",8) || !strnicmp(p,"HUB ",4)) { ! 572: if(!strnicmp(p,"HUB ",4)) ! 573: cfg.listcfg[cfg.listcfgs-1].misc|=NOFWD; ! 574: while(*p && *p>' ') p++; ! 575: while(*p && *p<=' ') p++; ! 576: if(*p) ! 577: cfg.listcfg[cfg.listcfgs-1].forward=atofaddr(p); ! 578: while(*p && *p>' ') p++; ! 579: while(*p && *p<=' ') p++; ! 580: if(*p && !(cfg.listcfg[cfg.listcfgs-1].misc&NOFWD)) { ! 581: tp=p; ! 582: while(*p && *p>' ') p++; ! 583: *p=0; ! 584: ++p; ! 585: while(*p && *p<=' ') p++; ! 586: SAFECOPY(cfg.listcfg[cfg.listcfgs-1].password,tp); } } ! 587: else ! 588: cfg.listcfg[cfg.listcfgs-1].misc|=NOFWD; ! 589: if(!*p) ! 590: continue; ! 591: tp=p; ! 592: while(*p && *p>' ') p++; ! 593: *p=0; ! 594: p++; ! 595: ! 596: sprintf(cfg.listcfg[cfg.listcfgs-1].listpath,"%-.128s",tp); ! 597: cfg.listcfg[cfg.listcfgs-1].numflags=0; ! 598: cfg.listcfg[cfg.listcfgs-1].flag=NULL; ! 599: while(*p && *p<=' ') p++; /* Skip over whitespace chars */ ! 600: while(*p) { ! 601: tp=p; ! 602: while(*p && *p>' ') p++; /* Find end of this flag */ ! 603: *p=0; /* and terminate it */ ! 604: ++p; ! 605: for(j=0;j<cfg.listcfg[cfg.listcfgs-1].numflags;j++) ! 606: if(!strnicmp(cfg.listcfg[cfg.listcfgs-1].flag[j].flag,tp ! 607: ,strlen(cfg.listcfg[cfg.listcfgs-1].flag[j].flag))) ! 608: break; ! 609: if(j==cfg.listcfg[cfg.listcfgs-1].numflags) { ! 610: if((cfg.listcfg[cfg.listcfgs-1].flag= ! 611: (flag_t *)REALLOC(cfg.listcfg[cfg.listcfgs-1].flag ! 612: ,sizeof(flag_t)*(j+1)))==NULL) { ! 613: printf("\nError allocating memory for listcfg #%u " ! 614: "flag #%u.\n",cfg.listcfgs,j+1); ! 615: bail(1); } ! 616: cfg.listcfg[cfg.listcfgs-1].numflags++; ! 617: sprintf(cfg.listcfg[cfg.listcfgs-1].flag[j].flag,"%.4s",tp); } ! 618: while(*p && *p<=' ') p++; } } ! 619: ! 620: // printf("Unrecognized line in SBBSECHO.CFG file.\n"); ! 621: } ! 622: fclose(stream); ! 623: printf("\n"); ! 624: } ! 625:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.