|
|
1.1 ! root 1: #line 1 "MAIN_OVL.C" ! 2: ! 3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ ! 4: ! 5: #include "sbbs.h" ! 6: #include "etext.h" ! 7: #include <signal.h> ! 8: ! 9: #ifndef __FLAT__ ! 10: #include "spawno.h" ! 11: #endif ! 12: ! 13: uint asmrev; // RCIOL.OBJ revision ! 14: char llo=0 // Local logon only ! 15: ,nmi=0; // No modem init ! 16: char cidarg[65]; // Caller ID arguments ! 17: uint addrio; // Additional RIOCTL call on init ! 18: ! 19: FILE *nodefile_fp,*node_ext_fp,*logfile_fp; ! 20: ! 21: char prompt[128]; ! 22: ! 23: extern char *compile_time,*compile_date; ! 24: ! 25: #ifdef __FLAT__ ! 26: int mswtyp=0; ! 27: #else ! 28: extern mswtyp; ! 29: extern uint riobp; ! 30: #endif ! 31: ! 32: extern char onquiet; ! 33: extern char term_ret; ! 34: extern ulong connect_rate; /* already connected at xbps */ ! 35: extern char *wday[],*mon[]; ! 36: ! 37: #ifdef __OS2__ ! 38: extern long _timezone=0L; ! 39: extern int _daylight=0L; ! 40: #else ! 41: extern long timezone=0L; ! 42: extern int daylight=0L; ! 43: #endif ! 44: ! 45: #ifdef __OS2__ ! 46: extern HEV con_out_sem; ! 47: void con_out_thread(void *); ! 48: #endif ! 49: ! 50: ! 51: #ifdef __OS2__ ! 52: void cbreakh(int sig); ! 53: #else ! 54: int cbreakh(); ! 55: #endif ! 56: ! 57: void reset_logon_vars(void); ! 58: ! 59: time_t checktime(void) ! 60: { ! 61: struct tm tm; ! 62: ! 63: memset(&tm,0,sizeof(tm)); ! 64: tm.tm_year=94; ! 65: tm.tm_mday=1; ! 66: return(mktime(&tm)^0x2D24BD00L); ! 67: } ! 68: ! 69: void console_test(void) ! 70: { ! 71: int i; ! 72: time_t start=time(NULL);; ! 73: ! 74: lclxy(1,1); ! 75: online=ON_LOCAL; ! 76: console=CON_L_ECHO; ! 77: useron.misc=ANSI|COLOR; ! 78: for(i=0;i<500;i++) ! 79: bprintf("\1n%05d\t\1hWhite\1rRed\1bBlue\1gGreen\001\x82" ! 80: "\1mMagenta\t\b\b\1cCyan\1nNormal\1gGreen" ! 81: "\1yBrown\1hYellow\1rR\1gG\1bB\1cC\1mM\1yY\1kK" ! 82: "\1>\r\n" ! 83: ,i); ! 84: bprintf("\r\n%lu secs\r\n",time(NULL)-start); ! 85: getch(); ! 86: lputc(FF); ! 87: } ! 88: ! 89: ! 90: ! 91: ! 92: void startup(int argc, char *argv[]) ! 93: { ! 94: char str[256],HUGE16 *buf,c; ! 95: void *v; ! 96: int i,j,events_only=0; ! 97: int file; ! 98: ulong l; ! 99: node_t node; ! 100: struct ffblk ff; ! 101: struct tm *gm; ! 102: #ifdef __FLAT__ ! 103: uchar *cptab; /* unused */ ! 104: #else ! 105: uchar cptab[1024]; ! 106: union REGS reg; ! 107: #endif ! 108: ! 109: #ifdef __MSDOS__ ! 110: setcbrk(0); ! 111: #endif ! 112: ! 113: #ifndef __FLAT__ ! 114: if((asmrev=*(&riobp-1))!=23) { ! 115: printf("Wrong rciol.obj\n"); ! 116: exit(1); } ! 117: #endif ! 118: ! 119: #ifdef __OS2__ ! 120: signal(SIGINT,cbreakh); ! 121: signal(SIGBREAK,cbreakh); ! 122: fixkbdmode(); ! 123: #elif defined(__MSDOS__) ! 124: ctrlbrk(cbreakh); ! 125: #endif ! 126: ! 127: #ifndef __FLAT__ /* no DESQview under OS/2 */ ! 128: inDV = 0; ! 129: _CX = 0x4445; /* 'DE' */ /* set CX to 4445H; DX to 5351H */ ! 130: _DX = 0x5351; /* 'SQ' */ /* (an invalid date) */ ! 131: _AX = 0x2B01; /* DOS' set data function */ ! 132: geninterrupt( 0x21 ); /* call DOS */ ! 133: if ( _AL != 0xFF ) /* if DOS didn't see as invalid */ ! 134: _AX = _BX; /* AH=major ver; AL=minor ver */ ! 135: else /* DOS saw as invalid */ ! 136: _AX = 0; /* no desqview */ ! 137: inDV = _AX; /* Save version in inDV flag */ ! 138: #endif ! 139: ! 140: #ifdef __FLAT__ ! 141: if(putenv("TZ=UCT0")) ! 142: printf("putenv() failed!\n"); ! 143: tzset(); ! 144: #endif ! 145: ! 146: if((l=checktime())!=0) { /* Check binary time */ ! 147: printf("Time problem (%08lx)\n",l); ! 148: exit(1); } ! 149: ! 150: directvideo=1; /* default to direct video */ ! 151: ! 152: _fmode=O_BINARY; ! 153: nulstr=""; ! 154: crlf="\r\n"; ! 155: strcpy(cap_fname,"CAPTURE.TXT"); ! 156: sys_status=lncntr=tos=criterrs=keybufbot=keybuftop=lbuflen=slcnt=0L; ! 157: debug=1; ! 158: curatr=LIGHTGRAY; ! 159: errorlevel=0; ! 160: logcol=1; ! 161: next_event=0; ! 162: lastuseron[0]=0; ! 163: emsver=0; ! 164: emshandle=0xffff; ! 165: randomize(); ! 166: srand(clock()); ! 167: ! 168: for(i=0;i<127 && environ[i];i++) /* save original environment for execl() */ ! 169: envp[i]=environ[i]; ! 170: envp[i]=0; ! 171: ! 172: strcpy(str,getenv("PROMPT")); ! 173: if(!strstr(str,"[SBBS]")) { ! 174: sprintf(prompt,"PROMPT=[SBBS] %s",str); ! 175: putenv(prompt); } ! 176: ! 177: comspec=getenv("COMSPEC"); ! 178: ! 179: lputc(FF); ! 180: ! 181: #ifndef __FLAT__ ! 182: node_scrnlen=lclini(0xd<<8); /* Tab expansion, no CRLF expansion */ ! 183: #else ! 184: node_scrnlen=25; ! 185: #endif ! 186: lclini(node_scrnlen); ! 187: lclatr(LIGHTGRAY); ! 188: ! 189: #ifdef __OS2__ // Test console speed ! 190: ! 191: if(DosCreateEventSem(NULL,&con_out_sem,0,0)) { ! 192: printf("Can't create console output semaphore.\n"); ! 193: exit(2); } ! 194: ! 195: if(_beginthread(con_out_thread,1024,NULL)==-1) { ! 196: printf("Can't start console output thread.\n"); ! 197: exit(3); } ! 198: //console_test(); ! 199: #endif ! 200: ! 201: #if defined(__OS2__) ! 202: lputs(decrypt(VersionNoticeOS2,0)); ! 203: #elif defined(__WIN32__) ! 204: lputs(decrypt(VersionNoticeW32,0)); ! 205: #else ! 206: lputs(decrypt(VersionNoticeDOS,0)); ! 207: #endif ! 208: lputs(decrypt(CopyrightNotice,0)); /* display copyright notice */ ! 209: lputc(CR); ! 210: lputc(LF); ! 211: cidarg[0]=0; ! 212: addrio=0; ! 213: strcpy(orgcmd,argv[0]); /* build up original command line */ ! 214: strcat(orgcmd," "); ! 215: for(i=1;i<argc;i++) { ! 216: for(c=0;c<strlen(argv[i]);c++) ! 217: switch(toupper(argv[i][c])) { ! 218: case '/': /* ignore these characters */ ! 219: case '-': ! 220: break; ! 221: case 'B': /* desqview or other that needs bios video only */ ! 222: directvideo=0; ! 223: strcat(orgcmd,"B"); ! 224: break; ! 225: case 'C': /* connected at xbps */ ! 226: connect_rate=atol(argv[i]+c+1); ! 227: c=strlen(argv[i]); ! 228: break; ! 229: case 'D': /* assume DCD is always high */ ! 230: sys_status|=SS_DCDHIGH; ! 231: strcat(orgcmd,"D"); ! 232: break; ! 233: case 'E': ! 234: next_event=time(NULL)+(atol(argv[i]+c+1)*60L); ! 235: c=strlen(argv[i]); ! 236: break; ! 237: case 'F': ! 238: sys_status|=SS_DAILY; ! 239: break; ! 240: #ifdef __OS2__ ! 241: case 'H': ! 242: rio_handle=atoi(argv[i]+c+1); ! 243: c=strlen(argv[i]); ! 244: break; ! 245: #endif ! 246: case 'I': /* no modem init */ ! 247: strcat(orgcmd,"I"); ! 248: nmi=1; ! 249: break; ! 250: case 'L': /* local logon only */ ! 251: strcat(orgcmd,"L"); ! 252: llo=1; ! 253: break; ! 254: case 'M': /* modem debug info */ ! 255: strcat(orgcmd,"M"); ! 256: sys_status|=SS_MDMDEBUG; ! 257: break; ! 258: case 'O': /* execute events only */ ! 259: events_only=1; ! 260: break; ! 261: case 'Q': /* quit after one caller - phone off hook */ ! 262: strcat(orgcmd,"Q"); ! 263: qoc=1; ! 264: break; ! 265: case 'R': /* additional rioctl call */ ! 266: addrio=ahtoul(argv[i]+c+1); ! 267: c=strlen(argv[i]); ! 268: break; ! 269: case 'X': /* quit after one caller - phone on hook */ ! 270: strcat(orgcmd,"X"); ! 271: qoc=2; ! 272: break; ! 273: case 'Z': ! 274: sprintf(cidarg,"%-.64s",argv[i]+c+1); ! 275: c=strlen(argv[i]); ! 276: break; ! 277: case 'V': ! 278: lputs(crlf); ! 279: lprintf("Revision %c%s %s %.5s " ! 280: #ifdef __FLAT__ ! 281: "RIOLIB %u.%02u" ! 282: #else ! 283: "RCIOL %u" ! 284: #endif ! 285: " SMBLIB %s BCC %X.%02X" ! 286: ,REVISION,BETA,compile_date,compile_time ! 287: #ifdef __FLAT__ ! 288: ,rioctl(GVERS)/100,rioctl(GVERS)%100 ! 289: #else ! 290: ,rioctl(GVERS) ! 291: #endif ! 292: ,SMBLIB_VERSION ! 293: ,__BORLANDC__>>8 ! 294: ,__BORLANDC__&0xff); ! 295: lputs(crlf); ! 296: bail(0); ! 297: default: ! 298: lputs("\r\nusage: sbbs [bdmoqxfliv] [c#] [e#] [zs] [r#] [h#]" ! 299: "\r\n\r\n" ! 300: "b = use bios for video\r\n" ! 301: "d = assume DCD is always high\r\n" ! 302: "m = modem debug output\r\n" ! 303: "q = quit after one call (phone off hook)\r\n" ! 304: "x = quit after one call\r\n" ! 305: "o = execute events only and then quit\r\n" ! 306: "c# = connected at # bps (ex: c2400)\r\n" ! 307: "e# = external event in # minutes (ex: e30)\r\n" ! 308: "f = force daily event\r\n" ! 309: "l = local logon only\r\n" ! 310: "i = no modem initialization\r\n" ! 311: "zs = use s for caller-id information\r\n" ! 312: "r# = additional rioctl call during port init\r\n" ! 313: "h# = open port handle (SBBS4OS2 only)\r\n" ! 314: "v = version information\r\n" ! 315: ); ! 316: bail(0); } } ! 317: ! 318: ! 319: node_disk=getdisk(); ! 320: getcwd(node_dir,MAXDIR); /* Get current Directory */ ! 321: if(strlen(node_dir)>40) { ! 322: lputs("\r\n\7Current Directory is too long for bbs to run reliably.\r\n"); ! 323: bail(1); } ! 324: strcat(node_dir,"\\"); ! 325: initdata(); /* auto-sense scrnlen can be overridden */ ! 326: ! 327: mswtyp=0; ! 328: if(node_misc&NM_INT28) ! 329: mswtyp|=TS_INT28; ! 330: if(node_misc&NM_WINOS2) ! 331: mswtyp|=TS_WINOS2; ! 332: if(node_misc&NM_NODV) ! 333: mswtyp|=TS_NODV; ! 334: ! 335: #ifndef __FLAT__ ! 336: ! 337: __spawn_ext = (node_swap & SWAP_EXT) != 0 ; ! 338: __spawn_ems = (node_swap & SWAP_EMS) != 0 ; ! 339: __spawn_xms = (node_swap & SWAP_XMS) != 0 ; ! 340: ! 341: #endif ! 342: ! 343: #ifndef __FLAT__ /* no EMS under OS/2 */ ! 344: if(node_misc&NM_EMSOVL) { ! 345: lputs("\r\nEMS: "); ! 346: if((i=open("EMMXXXX0",O_RDONLY))==-1) ! 347: lputs("not installed."); ! 348: else { ! 349: close(i); ! 350: reg.h.ah=0x46; /* Get EMS version */ ! 351: int86(0x67,®,®); ! 352: if(reg.h.ah) ! 353: lputs("\7error getting version."); ! 354: else { ! 355: lprintf("Version %u.%u ",(reg.h.al&0xf0)>>4,reg.h.al&0xf); ! 356: emsver=reg.h.al; ! 357: reg.h.ah=0x4b; /* get handle count */ ! 358: int86(0x67,®,®); ! 359: if(reg.h.ah) ! 360: lputs("\7error getting handle count."); ! 361: else { ! 362: if(_OvrInitEms(0,0,23)) /* use up to 360K */ ! 363: lprintf("allocation failed."); ! 364: else ! 365: emshandle=reg.x.bx; } } } } ! 366: #endif ! 367: ! 368: sprintf(str,"%s%s",ctrl_dir,"NODE.DAB"); ! 369: if((nodefile_fp=fnopen(&nodefile,str ! 370: ,O_DENYNONE|O_RDWR|O_CREAT))==NULL) { ! 371: lprintf("\r\n\7Error opening/creating %s\r\n",str); ! 372: exit(1); } ! 373: sprintf(str,"%s%s",ctrl_dir,"NODE.EXB"); ! 374: if((node_ext_fp=fnopen(&node_ext,str,O_DENYNONE|O_RDWR|O_CREAT))==NULL) { ! 375: lprintf("\r\n\7Error opening/creating %s\r\n",str); ! 376: exit(1); } ! 377: memset(&node,0,sizeof(node_t)); /* write NULL to node struct */ ! 378: node.status=NODE_OFFLINE; ! 379: while(filelength(nodefile)<sys_nodes*sizeof(node_t)) { ! 380: lseek(nodefile,0L,SEEK_END); ! 381: write(nodefile,&node,sizeof(node_t)); } ! 382: if(lock(nodefile,(node_num-1)*sizeof(node_t),sizeof(node_t)) ! 383: || unlock(nodefile,(node_num-1)*sizeof(node_t),sizeof(node_t))) { ! 384: lprintf("\r\n\7File locking failed.\r\n"); ! 385: ! 386: #ifndef __FLAT__ /* no SHARE under Win32 and OS/2 */ ! 387: reg.x.ax=0x1000; ! 388: int86(0x2f,®,®); ! 389: if(!reg.h.al) { ! 390: lputs("SHARE is not installed. Must run SHARE before SBBS.\r\n"); ! 391: lputs("SHARE.EXE is included with DOS v3.0 and higher.\r\n"); } ! 392: else if(reg.h.al==1) ! 393: lputs("SHARE is not installed and NOT OKAY to install.\r\n"); ! 394: else if(reg.h.al==0xff) ! 395: lputs("SHARE is installed.\r\n"); ! 396: else ! 397: lprintf("INT 2F returned %xh in AL.\r\n",reg.h.al); ! 398: #endif ! 399: ! 400: bail(1); } ! 401: sys_status|=SS_NODEDAB; /* says that node.dab is okay to use */ ! 402: getnodedat(node_num,&thisnode,1); ! 403: ! 404: /* if not returning, clear node.dab record */ ! 405: if(!connect_rate) { ! 406: thisnode.status=thisnode.action=thisnode.useron=0; ! 407: thisnode.aux=0; /* use to always clear */ ! 408: thisnode.misc&=NODE_EVENT; } /* turn off all misc bits but event */ ! 409: criterrs=thisnode.errors; ! 410: putnodedat(node_num,thisnode); ! 411: ! 412: if(com_base==0xb) ! 413: rioctl(I14PC); ! 414: else if(com_base==0xd) ! 415: rioctl(I14DB); ! 416: else if(com_base==0xe) ! 417: rioctl(I14PS); ! 418: else if(com_base==0xf) ! 419: rioctl(I14FO); ! 420: if(com_port) { ! 421: comini(); ! 422: setrate(); } ! 423: ! 424: for(i=0;i<total_qhubs;i++) { ! 425: if(qhub[i]->node!=node_num) ! 426: continue; ! 427: for(j=0;j<10;j++) { ! 428: sprintf(str,"%s%s.QW%c",data_dir,qhub[i]->id,j ? (j-1)+'0' : 'K'); ! 429: if(fexist(str)) { ! 430: lclini(node_scrnlen-1); ! 431: delfiles(temp_dir,"*.*"); ! 432: unpack_qwk(str,i); } } } ! 433: ! 434: sprintf(str,"%sTIME.DAB",ctrl_dir); ! 435: if((file=nopen(str,O_RDWR|O_CREAT))==-1) { ! 436: lprintf("Error opening/creating %s\r\n",str); ! 437: bail(1); } ! 438: for(i=0;i<total_events;i++) { ! 439: event[i]->last=0; ! 440: if(filelength(file)<sizeof(time_t)*(i+1)) ! 441: write(file,&event[i]->last,sizeof(time_t)); ! 442: else ! 443: read(file,&event[i]->last,sizeof(time_t)); } ! 444: ! 445: close(file); ! 446: ! 447: sprintf(str,"%sQNET.DAB",ctrl_dir); ! 448: if((file=nopen(str,O_RDWR|O_CREAT))==-1) { ! 449: lprintf("Error opening/creating %s\r\n",str); ! 450: bail(1); } ! 451: ! 452: for(i=0;i<total_qhubs;i++) { ! 453: qhub[i]->last=0; ! 454: if(filelength(file)<sizeof(time_t)*(i+1)) ! 455: write(file,&qhub[i]->last,sizeof(time_t)); ! 456: else ! 457: read(file,&qhub[i]->last,sizeof(time_t)); } ! 458: ! 459: close(file); ! 460: ! 461: sprintf(str,"%sPNET.DAB",ctrl_dir); ! 462: if((file=nopen(str,O_RDWR|O_CREAT))==-1) { ! 463: lprintf("Error opening/creating %s\r\n",str); ! 464: bail(1); } ! 465: ! 466: for(i=0;i<total_phubs;i++) { ! 467: phub[i]->last=0; ! 468: if(filelength(file)<sizeof(time_t)*(i+1)) ! 469: write(file,&phub[i]->last,sizeof(time_t)); ! 470: else ! 471: read(file,&phub[i]->last,sizeof(time_t)); } ! 472: ! 473: close(file); ! 474: ! 475: sprintf(str,"%sNODE.LOG",node_dir); ! 476: lprintf("\r\nOpening %s...",str); ! 477: if((logfile_fp=fnopen(&logfile,str,O_WRONLY|O_CREAT|O_APPEND|O_DENYALL))==NULL) { ! 478: lprintf("\r\n\7Error opening %s\r\n\r\n" ! 479: "Perhaps this node is already running.\r\n",str); ! 480: bail(1); } ! 481: lprintf("\r%s opened.",str); ! 482: sys_status|=SS_LOGOPEN; ! 483: if(filelength(logfile)) { ! 484: log(crlf); ! 485: now=time(NULL); ! 486: gm=localtime(&now); ! 487: sprintf(str,"%02d:%02d%c %s %s %02d %u " ! 488: "End of preexisting log entry (possible crash)" ! 489: ,gm->tm_hour>12 ? gm->tm_hour-12 : gm->tm_hour==0 ? 12 : gm->tm_hour ! 490: ,gm->tm_min,gm->tm_hour>=12 ? 'p' : 'a',wday[gm->tm_wday] ! 491: ,mon[gm->tm_mon],gm->tm_mday,gm->tm_year+1900); ! 492: logline("L!",str); ! 493: log(crlf); ! 494: catsyslog(1); } ! 495: lputc(CLREOL); ! 496: sprintf(dszlog,"DSZLOG=%sPROTOCOL.LOG",node_dir); ! 497: putenv(dszlog); /* Makes the DSZ LOG active */ ! 498: sprintf(sbbsnode,"SBBSNODE=%s",node_dir); ! 499: putenv(sbbsnode); /* create enviornment var to contain node num */ ! 500: sprintf(sbbsnnum,"SBBSNNUM=%d",node_num); ! 501: putenv(sbbsnnum); /* create enviornment var to contain node num */ ! 502: backout(); ! 503: if(events_only) { ! 504: reset_logon_vars(); ! 505: while(!wfc_events(time(NULL))) ! 506: ; ! 507: bail(0); } ! 508: } ! 509: ! 510: /****************************************************************************/ ! 511: /* Reads data from DSTS.DAB into stats structure */ ! 512: /* If node is zero, reads from ctrl\dsts.dab, otherwise from each node */ ! 513: /****************************************************************************/ ! 514: void getstats(char node,stats_t *stats) ! 515: { ! 516: char str[256]; ! 517: int file; ! 518: ! 519: sprintf(str,"%sDSTS.DAB",node ? node_path[node-1] : ctrl_dir); ! 520: if((file=nopen(str,O_RDONLY))==-1) { ! 521: errormsg(WHERE,ERR_OPEN,str,O_RDONLY); ! 522: return; } ! 523: lseek(file,4L,SEEK_SET); /* Skip update time/date */ ! 524: read(file,stats,sizeof(stats_t)); ! 525: close(file); ! 526: } ! 527: ! 528: ! 529: /****************************************************************************/ ! 530: /* Updates dstst.dab file upon user logoff. */ ! 531: /* First node, then system stats. */ ! 532: /****************************************************************************/ ! 533: void logoffstats() ! 534: { ! 535: char str[256]; ! 536: int i,file; ! 537: stats_t stats; ! 538: ! 539: for(i=0;i<2;i++) { ! 540: sprintf(str,"%sDSTS.DAB",i ? ctrl_dir : node_dir); ! 541: if((file=nopen(str,O_RDWR))==-1) { ! 542: errormsg(WHERE,ERR_OPEN,str,O_RDWR); ! 543: return; } ! 544: lseek(file,12L,SEEK_SET); /* Skip timestamp, logons and logons today */ ! 545: read(file,&stats.timeon,4); /* Total time on system */ ! 546: stats.timeon+=(now-logontime)/60; ! 547: read(file,&stats.ttoday,4); /* Time today on system */ ! 548: stats.ttoday+=(now-logontime)/60; ! 549: read(file,&stats.uls,4); /* Uploads today */ ! 550: stats.uls+=logon_uls; ! 551: read(file,&stats.ulb,4); /* Upload bytes today */ ! 552: stats.ulb+=logon_ulb; ! 553: read(file,&stats.dls,4); /* Downloads today */ ! 554: stats.dls+=logon_dls; ! 555: read(file,&stats.dlb,4); /* Download bytes today */ ! 556: stats.dlb+=logon_dlb; ! 557: read(file,&stats.ptoday,4); /* Posts today */ ! 558: if(!(useron.rest&FLAG('Q'))) ! 559: stats.ptoday+=logon_posts; ! 560: read(file,&stats.etoday,4); /* Emails today */ ! 561: stats.etoday+=logon_emails; ! 562: read(file,&stats.ftoday,4); /* Feedback sent today */ ! 563: stats.ftoday+=logon_fbacks; ! 564: read(file,&stats.nusers,2); /* New users today */ ! 565: if(sys_status&SS_NEWUSER) ! 566: stats.nusers++; ! 567: lseek(file,12L,SEEK_SET); ! 568: write(file,&stats.timeon,4); /* Total time on system */ ! 569: write(file,&stats.ttoday,4); /* Time today on system */ ! 570: write(file,&stats.uls,4); /* Uploads today */ ! 571: write(file,&stats.ulb,4); /* Upload bytes today */ ! 572: write(file,&stats.dls,4); /* Downloads today */ ! 573: write(file,&stats.dlb,4); /* Download bytes today */ ! 574: write(file,&stats.ptoday,4); /* Posts today */ ! 575: write(file,&stats.etoday,4); /* Emails today */ ! 576: write(file,&stats.ftoday,4); /* Feedback sent today */ ! 577: write(file,&stats.nusers,2); /* New users today */ ! 578: close(file); } ! 579: ! 580: } ! 581: ! 582: /****************************************************************************/ ! 583: /* Lists system statistics for everyday the bbs has been running. */ ! 584: /* Either for the current node (node=1) or the system (node=0) */ ! 585: /****************************************************************************/ ! 586: void printstatslog(uint node) ! 587: { ! 588: char str[256]; ! 589: uchar *buf; ! 590: int file; ! 591: time_t timestamp; ! 592: long l; ! 593: ulong length, ! 594: logons, ! 595: timeon, ! 596: posts, ! 597: emails, ! 598: fbacks, ! 599: ulb, ! 600: uls, ! 601: dlb, ! 602: dls; ! 603: ! 604: if(node) ! 605: bprintf(text[NodeStatsLogHdr],node); ! 606: else ! 607: bputs(text[SysStatsLogHdr]); ! 608: sprintf(str,"%sCSTS.DAB",node ? node_path[node-1] : ctrl_dir); ! 609: if((file=nopen(str,O_RDONLY))==-1) ! 610: return; ! 611: length=filelength(file); ! 612: if(length<40) { ! 613: close(file); ! 614: return; } ! 615: if((buf=(char *)MALLOC(length))==0) { ! 616: close(file); ! 617: errormsg(WHERE,ERR_ALLOC,str,length); ! 618: return; } ! 619: read(file,buf,length); ! 620: close(file); ! 621: l=length-4; ! 622: while(l>-1L && !msgabort()) { ! 623: fbacks=buf[l]|((long)buf[l+1]<<8)|((long)buf[l+2]<<16) ! 624: |((long)buf[l+3]<<24); ! 625: l-=4; ! 626: emails=buf[l]|((long)buf[l+1]<<8)|((long)buf[l+2]<<16) ! 627: |((long)buf[l+3]<<24); ! 628: l-=4; ! 629: posts=buf[l]|((long)buf[l+1]<<8)|((long)buf[l+2]<<16) ! 630: |((long)buf[l+3]<<24); ! 631: l-=4; ! 632: dlb=buf[l]|((long)buf[l+1]<<8)|((long)buf[l+2]<<16) ! 633: |((long)buf[l+3]<<24); ! 634: l-=4; ! 635: dls=buf[l]|((long)buf[l+1]<<8)|((long)buf[l+2]<<16) ! 636: |((long)buf[l+3]<<24); ! 637: l-=4; ! 638: ulb=buf[l]|((long)buf[l+1]<<8)|((long)buf[l+2]<<16) ! 639: |((long)buf[l+3]<<24); ! 640: l-=4; ! 641: uls=buf[l]|((long)buf[l+1]<<8)|((long)buf[l+2]<<16) ! 642: |((long)buf[l+3]<<24); ! 643: l-=4; ! 644: timeon=buf[l]|((long)buf[l+1]<<8)|((long)buf[l+2]<<16) ! 645: |((long)buf[l+3]<<24); ! 646: l-=4; ! 647: logons=buf[l]|((long)buf[l+1]<<8)|((long)buf[l+2]<<16) ! 648: |((long)buf[l+3]<<24); ! 649: l-=4; ! 650: timestamp=buf[l]|((long)buf[l+1]<<8)|((long)buf[l+2]<<16) ! 651: |((long)buf[l+3]<<24); ! 652: l-=4; ! 653: unixtodos(timestamp-(24*60*60),&date,&curtime); /* 1 day less than stamp */ ! 654: bprintf(text[SlogFmt] ! 655: ,date.da_mon,date.da_day,date.da_year-1900,timeon,logons,posts,emails ! 656: ,fbacks,ulb/1024,uls,dlb/1024,dls); } ! 657: FREE(buf); ! 658: } ! 659: ! 660: #ifdef __OS2__ ! 661: #define INPUT_LOOP 1000 ! 662: #else ! 663: #define INPUT_LOOP 1000 ! 664: #endif ! 665: ! 666: /****************************************************************************/ ! 667: /* Terminal mode */ ! 668: /* Returns 1 if it is to logon locally, 0 if it is done. */ ! 669: /****************************************************************************/ ! 670: char terminal() ! 671: { ! 672: char str[256],c,x,y,*p; ! 673: int file; ! 674: uint i,l; ! 675: ! 676: lclini(node_scrnlen-1); ! 677: statline=-1; ! 678: statusline(); ! 679: if(!term_ret) { ! 680: #ifdef __FLAT__ ! 681: setbaud(com_rate); ! 682: #else ! 683: setbaud((uint)(com_rate&0xffffL)); ! 684: #endif ! 685: mdmcmd(mdm_term); } ! 686: else ! 687: lputs("\r\nReturned.\r\n"); ! 688: ! 689: l=0; /* l is the ansi response code counter */ ! 690: ! 691: while(1) { ! 692: if(lkbrd(1)) { ! 693: i=lkbrd(0); ! 694: if((i&0xff)==0) { ! 695: i>>=8; ! 696: if(i==45) { /* Alt-X */ ! 697: rioctl(0x11); ! 698: if(DCDHIGH) { ! 699: lputs("\r\nHang up (Yes/No/Abort) ? "); ! 700: c=toupper(getch()); ! 701: if(c!='Y' && c!='N') { /* Hang-up Y/N/Abort */ ! 702: lputs("Abort\r\n"); ! 703: continue; } ! 704: if(c=='Y') { /* Yes, hang-up */ ! 705: if(mdm_misc&MDM_NODTR) ! 706: mdmcmd(mdm_hang); ! 707: else ! 708: if(dtr(15)) ! 709: lputs("Dropping DTR Failed"); } } ! 710: break; } ! 711: else if(i==35) { /* Alt-H */ ! 712: if(mdm_misc&MDM_NODTR) ! 713: mdmcmd(mdm_hang); ! 714: else ! 715: if(dtr(15)) ! 716: lputs("Dropping DTR Failed\r\n"); ! 717: dtr(1); } ! 718: else if((i>=0x3b &&i<=0x44) || (i>=0x54 &&i<=0x71) ! 719: || (i>=0x85 &&i<=0x8c)) { ! 720: sprintf(str,"%s%sF%d.MAC",text_dir ! 721: ,i<0x45 || (i>=0x85 && i<=0x86) ? nulstr ! 722: :i<0x5e || (i>=0x87 && i<=0x88) ? "SHFT-" ! 723: :i<0x68 || (i>=0x89 && i<=0x8a) ? "CTRL-" : "ALT-" ! 724: ,i<0x45 ? i-0x3a : i<0x5e ? i-0x53 : i<0x68 ? i-0x5d ! 725: :i<0x72 ? i-0x67 : i<0x87 ? i-0x7a : i<0x89 ? i-0x7c ! 726: :i<0x8b ? i-0x7e : i-0x80); ! 727: if((file=nopen(str,O_RDONLY))==-1) ! 728: continue; ! 729: i=filelength(file); ! 730: while(i--) { ! 731: read(file,&c,1); ! 732: if(c!=LF) ! 733: putcomch(c); } ! 734: close(file); } ! 735: else if(i==0x48) /* up arrow */ ! 736: putcom("\x1b[A"); ! 737: else if(i==0x50) /* dn arrow */ ! 738: putcom("\x1b[B"); ! 739: else if(i==0x4b) /* left */ ! 740: putcom("\x1b[D"); ! 741: else if(i==0x4d) /* right */ ! 742: putcom("\x1b[C"); ! 743: else if(i==0x16) { /* Alt-U User Edit */ ! 744: if((p=MALLOC((node_scrnlen*80)*2))==NULL) { ! 745: lputs("Allocation error.\r\n"); ! 746: continue; } ! 747: gettext(1,1,80,node_scrnlen,p); ! 748: x=lclwx(); ! 749: y=lclwy(); ! 750: quicklogonstuff(); ! 751: useredit(0,1); ! 752: puttext(1,1,80,node_scrnlen,p); ! 753: FREE(p); ! 754: lclxy(x,y); } ! 755: else if(i==0x26) { /* Alt-L logon locally */ ! 756: lputc(FF); ! 757: quicklogonstuff(); ! 758: if(!useron.number) { ! 759: lputc(7); ! 760: lputs("A Sysop account hasn't been created"); ! 761: continue; } ! 762: term_ret=1; ! 763: return(1); } ! 764: else if(i==0x20) { /* Alt-D Shell to DOS */ ! 765: if((p=MALLOC((node_scrnlen*80)*2))==NULL) { ! 766: lputs("Allocation error.\r\n"); ! 767: continue; } ! 768: gettext(1,1,80,node_scrnlen,p); ! 769: x=lclwx(); ! 770: y=lclwy(); ! 771: lclini(node_scrnlen); ! 772: lputc(FF); ! 773: external(comspec,0); ! 774: puttext(1,1,80,node_scrnlen,p); ! 775: FREE(p); ! 776: lclxy(x,y); } } ! 777: else { ! 778: putcomch(i); ! 779: continue; } } ! 780: for(i=0;i<INPUT_LOOP;i++) { ! 781: if((c=incom())!=0) { ! 782: if(c==ESC) ! 783: l=!l; ! 784: else if(l) { ! 785: if(c=='[') { ! 786: if(l!=1) l=0; else l++; } ! 787: else if(c=='6') { ! 788: if(l!=2) l=0; else l++; } ! 789: else if(c=='n') { ! 790: if(l==3) { ! 791: sprintf(str,"\x1b[%u;%uR" ! 792: ,lclwy(),lclwx()); ! 793: putcom(str); } ! 794: l=0; } ! 795: else l=0; } ! 796: outcon(c); } ! 797: else ! 798: break; } ! 799: if(!c) ! 800: mswait(0); } ! 801: term_ret=0; ! 802: return(0); ! 803: } ! 804: ! 805: ! 806: /****************************************************************************/ ! 807: /* Exits bbs to DOS with appropriate error code after setting COM port isr */ ! 808: /* back to normal. */ ! 809: /****************************************************************************/ ! 810: void bail(int code) ! 811: { ! 812: ! 813: if(sys_status&SS_COMISR) ! 814: rioini(0,0); ! 815: ! 816: lclatr(LIGHTGRAY); ! 817: if(code) { ! 818: getnodedat(node_num,&thisnode,1); ! 819: criterrs=++thisnode.errors; ! 820: putnodedat(node_num,thisnode); ! 821: now=time(NULL); ! 822: lprintf("\r\nExiting with errorlevel (%d) on %s\r\n",code,timestr(&now)); ! 823: if(sys_misc&SM_ERRALARM) { ! 824: beep(500,220); beep(250,220); ! 825: beep(500,220); beep(250,220); ! 826: beep(500,220); beep(250,220); ! 827: nosound(); } } ! 828: ! 829: if(sys_status&SS_INITIAL) { ! 830: getnodedat(node_num,&thisnode,1); ! 831: thisnode.status=NODE_OFFLINE; ! 832: putnodedat(node_num,thisnode); ! 833: close(nodefile); ! 834: close(node_ext); } ! 835: ! 836: exit(code); ! 837: } ! 838: ! 839:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.