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