Annotation of sbbs/sbbs2/main_ovl.c, revision 1.1

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,&reg,&reg);
        !           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,&reg,&reg);
        !           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,&reg,&reg);
        !           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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.