Annotation of sbbs/sbbs3/con_out.cpp, revision 1.1.1.1

1.1       root        1: /* con_out.cpp */
                      2: 
                      3: /* Synchronet console output routines */
                      4: 
                      5: /* $Id: con_out.cpp,v 1.3 2000/11/14 02:16:57 rswindell Exp $ */
                      6: 
                      7: /****************************************************************************
                      8:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
                      9:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
                     10:  *                                                                                                                                                     *
                     11:  * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html         *
                     12:  *                                                                                                                                                     *
                     13:  * This program is free software; you can redistribute it and/or                       *
                     14:  * modify it under the terms of the GNU General Public License                         *
                     15:  * as published by the Free Software Foundation; either version 2                      *
                     16:  * of the License, or (at your option) any later version.                                      *
                     17:  * See the GNU General Public License for more details: gpl.txt or                     *
                     18:  * http://www.fsf.org/copyleft/gpl.html                                                                                *
                     19:  *                                                                                                                                                     *
                     20:  * Anonymous FTP access to the most recent released source is available at     *
                     21:  * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net     *
                     22:  *                                                                                                                                                     *
                     23:  * Anonymous CVS access to the development source and modification history     *
                     24:  * is available at cvs.synchro.net:/cvsroot/sbbs, example:                                     *
                     25:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs login                       *
                     26:  *     (just hit return, no password is necessary)                                                     *
                     27:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src                *
                     28:  *                                                                                                                                                     *
                     29:  * For Synchronet coding style and modification guidelines, see                                *
                     30:  * http://www.synchro.net/source.html                                                                          *
                     31:  *                                                                                                                                                     *
                     32:  * You are encouraged to submit any modifications (preferably in Unix diff     *
                     33:  * format) via e-mail to [email protected]                                                                      *
                     34:  *                                                                                                                                                     *
                     35:  * Note: If this box doesn't appear square, then you need to fix your tabs.    *
                     36:  ****************************************************************************/
                     37: 
                     38: 
                     39: /**********************************************************************/
                     40: /* Functions that pertain to console i/o - color, strings, chars etc. */
                     41: /* Called from functions everywhere                                   */
                     42: /**********************************************************************/
                     43: 
                     44: #include "sbbs.h"
                     45: 
                     46: /***************************************************/
                     47: /* Seven bit table for EXASCII to ASCII conversion */
                     48: /***************************************************/
                     49: const char *sbtbl="CUeaaaaceeeiiiAAEaAooouuyOUcLYRfaiounNao?--24!<>"
                     50:                        "###||||++||++++++--|-+||++--|-+----++++++++##[]#"
                     51:                        "abrpEout*ono%0ENE+><rj%=o..+n2* ";
                     52: 
                     53: /****************************************************************************/
                     54: /* Outputs a NULL terminated string locally and remotely (if applicable)    */
                     55: /* Handles ctrl-a characters                                                */
                     56: /****************************************************************************/
                     57: int sbbs_t::bputs(char *str)
                     58: {
                     59:        int i;
                     60:     ulong l=0;
                     61: 
                     62:        while(str[l]) {
                     63:                if(str[l]==1) {             /* ctrl-a */
                     64:                        ctrl_a(str[++l]);       /* skip the ctrl-a */
                     65:                        l++;                                    /* skip the attribute code */
                     66:                        continue; }
                     67:                if(str[l]=='@') {           /* '@' */
                     68:                        if(str==mnestr                  /* Mnemonic string or */
                     69:                                || (str>=text[0]        /* Straight out of TEXT.DAT */
                     70:                                        && str<=text[TOTAL_TEXT-1])) {
                     71:                                i=atcodes(str+l);               /* return 0 if not valid @ code */
                     72:                                l+=i;                                   /* i is length of code string */
                     73:                                if(i)                                   /* if valid string, go to top */
                     74:                                        continue; }
                     75:                        for(i=0;i<TOTAL_TEXT;i++)
                     76:                                if(str==text[i])
                     77:                                        break;
                     78:                        if(i<TOTAL_TEXT) {              /* Replacement text */
                     79:                                i=atcodes(str+l);
                     80:                                l+=i;
                     81:                                if(i)
                     82:                                        continue; } }
                     83:                outchar(str[l++]); }
                     84:        return(l);
                     85: }
                     86: 
                     87: /****************************************************************************/
                     88: /* Outputs a NULL terminated string locally and remotely (if applicable)    */
                     89: /* Does not expand ctrl-a characters (raw)                                  */
                     90: /* Max length of str is 64 kbytes                                           */
                     91: /****************************************************************************/
                     92: int sbbs_t::rputs(char *str)
                     93: {
                     94:     ulong l=0;
                     95: 
                     96:        while(str[l])
                     97:                outchar(str[l++]);
                     98:        return(l);
                     99: }
                    100: 
                    101: /****************************************************************************/
                    102: /* Performs printf() using bbs bputs function                                                          */
                    103: /****************************************************************************/
                    104: int sbbs_t::bprintf(char *fmt, ...)
                    105: {
                    106:        va_list argptr;
                    107:        char sbuf[1024];
                    108: 
                    109:        if(!strchr(fmt,'%'))
                    110:                return(bputs(fmt));
                    111:        va_start(argptr,fmt);
                    112:        vsprintf(sbuf,fmt,argptr);
                    113:        va_end(argptr);
                    114:        return(bputs(sbuf));
                    115: }
                    116: 
                    117: /****************************************************************************/
                    118: /* Performs printf() using bbs rputs function                                                          */
                    119: /****************************************************************************/
                    120: int sbbs_t::rprintf(char *fmt, ...)
                    121: {
                    122:        va_list argptr;
                    123:        char sbuf[1024];
                    124: 
                    125:        va_start(argptr,fmt);
                    126:        vsprintf(sbuf,fmt,argptr);
                    127:        va_end(argptr);
                    128:        return(rputs(sbuf));
                    129: }
                    130: 
                    131: /****************************************************************************/
                    132: /* Outputs character locally and remotely (if applicable), preforming echo  */
                    133: /* translations (X's and r0dent emulation) if applicable.                                      */
                    134: /****************************************************************************/
                    135: void sbbs_t::outchar(char ch)
                    136: {
                    137:        int             i;
                    138: 
                    139:        if(console&CON_ECHO_OFF)
                    140:                return;
                    141:        if(ch==ESC)
                    142:                outchar_esc=1;
                    143:        else if(outchar_esc==1) {
                    144:                if(ch=='[')
                    145:                        outchar_esc++;
                    146:                else
                    147:                        outchar_esc=0; }
                    148:        else
                    149:                outchar_esc=0;
                    150:        if(useron.misc&NO_EXASCII && ch&0x80)
                    151:                ch=sbtbl[(uchar)ch^0x80];  /* seven bit table */
                    152:        if(ch==FF && lncntr>1 && !tos) {
                    153:                lncntr=0;
                    154:                CRLF;
                    155:                pause();
                    156:                while(lncntr && online && !(sys_status&SS_ABORT))
                    157:                        pause(); }
                    158:        if(sys_status&SS_CAP    /* Writes to Capture File */
                    159:                && (sys_status&SS_ANSCAP || (ch!=ESC /* && !lclaes() */)))
                    160:                fwrite(&ch,1,1,capfile);
                    161: 
                    162:        #if 0 
                    163:        if(console&CON_L_ECHO) {
                    164:                if(console&CON_L_ECHOX && (uchar)ch>=SP)
                    165:                        putch('X');
                    166:                else if(cfg.node_misc&NM_NOBEEP && ch==BEL);     /* Do nothing if beep */
                    167:                else if(ch==BEL) {
                    168:                                sbbs_beep(2000,110);
                    169:                                nosound(); }
                    170:                else putch(ch); }
                    171:        #endif
                    172: 
                    173:        if(online==ON_REMOTE && console&CON_R_ECHO) {
                    174:                if(console&CON_R_ECHOX && (uchar)ch>=SP)
                    175:                        ch='X';
                    176:                if(ch==FF && useron.misc&ANSI) {
                    177:                        putcom("\x1b[2J\x1b[H");        /* clear screen, home cursor */
                    178:                }
                    179:                else {
                    180:                        i=0;
                    181:                        while(outcom(ch)&TXBOF && i<1440) { /* 3 minute pause delay */
                    182:                                if(!online)
                    183:                                        break;
                    184:                                i++;
                    185:                                if(sys_status&SS_SYSPAGE)
                    186:                                        sbbs_beep(i,80);
                    187:                                else
                    188:                                        mswait(80); }
                    189:                        if(i==1440) {                                                   /* timeout - beep flush outbuf */
                    190:                                i=rioctl(TXBC);
                    191:                                lprintf("timeout(outchar) %04X %04X\r\n",i,rioctl(IOFO));
                    192:                                outcom(BEL);
                    193:                                rioctl(IOCS|PAUSE); } } }
                    194:        if(ch==LF) {
                    195:                lncntr++;
                    196:                lbuflen=0;
                    197:                tos=0;
                    198:        } else if(ch==FF) {
                    199:                lncntr=0;
                    200:                lbuflen=0;
                    201:                tos=1;
                    202:        } else {
                    203:                if(!lbuflen)
                    204:                        latr=curatr;
                    205:                if(lbuflen<LINE_BUFSIZE)
                    206:                        lbuf[lbuflen++]=ch; }
                    207: 
                    208:        if(lncntr==rows-1 && ((useron.misc&UPAUSE && !(sys_status&SS_PAUSEOFF))
                    209:                || sys_status&SS_PAUSEON)) {
                    210:                lncntr=0;
                    211:                pause(); }
                    212: 
                    213: }
                    214: 
                    215: void sbbs_t::center(char *instr)
                    216: {
                    217:        char str[256];
                    218:        int i,j;
                    219: 
                    220:        sprintf(str,"%.*s",sizeof(str)-1,instr);
                    221:        truncsp(str);
                    222:        j=bstrlen(str);
                    223:        for(i=0;i<(80-j)/2;i++)
                    224:                outchar(SP);
                    225:        bputs(str);
                    226:        CRLF;
                    227: }
                    228: 
                    229: 
                    230: /****************************************************************************/
                    231: /* performs the correct attribute modifications for the Ctrl-A code                    */
                    232: /****************************************************************************/
                    233: void sbbs_t::ctrl_a(char x)
                    234: {
                    235:        int             i;
                    236:        char    tmp1[128],atr=curatr;
                    237:        struct  tm * tm;
                    238: 
                    239:        if(x && (uchar)x<ESC) {    /* Ctrl-A through Ctrl-Z for users with MF only */
                    240:                if(!(useron.flags1&FLAG(x+64)))
                    241:                        console^=(CON_ECHO_OFF);
                    242:                return; }
                    243:        if((uchar)x>=0x7f) {
                    244:                if(useron.misc&ANSI)
                    245:                        bprintf("\x1b[%uC",(uchar)x-0x7f);
                    246:                else
                    247:                        for(i=0;i<(uchar)x-0x7f;i++)
                    248:                                outchar(SP);
                    249:                return; }
                    250:        switch(toupper(x)) {
                    251:                case '!':   /* level 10 or higher */
                    252:                        if(useron.level<10)
                    253:                                console^=CON_ECHO_OFF;
                    254:                        break;
                    255:                case '@':   /* level 20 or higher */
                    256:                        if(useron.level<20)
                    257:                                console^=CON_ECHO_OFF;
                    258:                        break;
                    259:                case '#':   /* level 30 or higher */
                    260:                        if(useron.level<30)
                    261:                                console^=CON_ECHO_OFF;
                    262:                        break;
                    263:                case '$':   /* level 40 or higher */
                    264:                        if(useron.level<40)
                    265:                                console^=CON_ECHO_OFF;
                    266:                        break;
                    267:                case '%':   /* level 50 or higher */
                    268:                        if(useron.level<50)
                    269:                                console^=CON_ECHO_OFF;
                    270:                        break;
                    271:                case '^':   /* level 60 or higher */
                    272:                        if(useron.level<60)
                    273:                                console^=CON_ECHO_OFF;
                    274:                        break;
                    275:                case '&':   /* level 70 or higher */
                    276:                        if(useron.level<70)
                    277:                                console^=CON_ECHO_OFF;
                    278:                        break;
                    279:                case '*':   /* level 80 or higher */
                    280:                        if(useron.level<80)
                    281:                                console^=CON_ECHO_OFF;
                    282:                        break;
                    283:                case '(':   /* level 90 or higher */
                    284:                        if(useron.level<90)
                    285:                                console^=CON_ECHO_OFF;
                    286:                        break;
                    287:                case ')':   /* turn echo back on */
                    288:                        console&=~CON_ECHO_OFF;
                    289:                        break;
                    290:                case '-':                                                               /* turn off all attributes if */
                    291:                        if(atr&(HIGH|BLINK|(LIGHTGRAY<<4)))     /* high intensity, blink or */
                    292:                                attr(LIGHTGRAY);                                /* background bits are set */
                    293:                        break;
                    294:                case '_':                                                               /* turn off all attributes if */
                    295:                        if(atr&(BLINK|(LIGHTGRAY<<4)))          /* blink or background is set */
                    296:                                attr(LIGHTGRAY);
                    297:                        break;
                    298:                case 'P':       /* Pause */
                    299:                        pause();
                    300:                        break;
                    301:                case 'Q':   /* Pause reset */
                    302:                        lncntr=0;
                    303:                        break;
                    304:                case 'T':   /* Time */
                    305:                        now=time(NULL);
                    306:                        tm=gmtime(&now);
                    307:                        if(tm!=NULL)
                    308:                                bprintf("%02d:%02d %s"
                    309:                                        ,tm->tm_hour==0 ? 12
                    310:                                        : tm->tm_hour>12 ? tm->tm_hour-12
                    311:                                        : tm->tm_hour, tm->tm_min, tm->tm_hour>11 ? "pm":"am");
                    312:                        break;
                    313:                case 'D':   /* Date */
                    314:                        now=time(NULL);
                    315:                        bputs(unixtodstr(&cfg,now,tmp1));
                    316:                        break;
                    317:                case ',':   /* Delay 1/10 sec */
                    318:                        mswait(100);
                    319:                        break;
                    320:                case ';':   /* Delay 1/2 sec */
                    321:                        mswait(500);
                    322:                        break;
                    323:                case '.':   /* Delay 2 secs */
                    324:                        mswait(2000);
                    325:                        break;
                    326:                case 'S':   /* Synchronize */
                    327:                        ASYNC;
                    328:                        break;
                    329:                case 'L':       /* CLS (form feed) */
                    330:                        CLS;
                    331:                        break;
                    332:                case '>':   /* CLREOL */
                    333:                        if(useron.misc&ANSI)
                    334:                                bputs("\x1b[K");
                    335:        #if 0
                    336:                        else {
                    337:                                i=j=lclwx();    /* commented out */
                    338:                                while(i++<79)
                    339:                                        outchar(SP);
                    340:                                while(j++<79)
                    341:                                        outchar(BS); }
                    342:        #endif                
                    343:                        break;
                    344:                case '<':   /* Non-destructive backspace */
                    345:                        outchar(BS);
                    346:                        break;
                    347:                case '[':   /* Carriage return */
                    348:                        outchar(CR);
                    349:                        break;
                    350:                case ']':   /* Line feed */
                    351:                        outchar(LF);
                    352:                        break;
                    353:                case 'A':   /* Ctrl-A */
                    354:                        outchar(1);
                    355:                        break;
                    356:                case 'H':       /* High intensity */
                    357:                        atr|=HIGH;
                    358:                        attr(atr);
                    359:                        break;
                    360:                case 'I':       /* Blink */
                    361:                        atr|=BLINK;
                    362:                        attr(atr);
                    363:                        break;
                    364:                case 'N':       /* Normal */
                    365:                        attr(LIGHTGRAY);
                    366:                        break;
                    367:                case 'R':
                    368:                        atr=(atr&0xf8)|RED;
                    369:                        attr(atr);
                    370:                        break;
                    371:                case 'G':
                    372:                        atr=(atr&0xf8)|GREEN;
                    373:                        attr(atr);
                    374:                        break;
                    375:                case 'B':
                    376:                        atr=(atr&0xf8)|BLUE;
                    377:                        attr(atr);
                    378:                        break;
                    379:                case 'W':       /* White */
                    380:                        atr=(atr&0xf8)|LIGHTGRAY;
                    381:                        attr(atr);
                    382:                        break;
                    383:                case 'C':
                    384:                        atr=(atr&0xf8)|CYAN;
                    385:                        attr(atr);
                    386:                        break;
                    387:                case 'M':
                    388:                        atr=(atr&0xf8)|MAGENTA;
                    389:                        attr(atr);
                    390:                        break;
                    391:                case 'Y':   /* Yellow */
                    392:                        atr=(atr&0xf8)|BROWN;
                    393:                        attr(atr);
                    394:                        break;
                    395:                case 'K':       /* Black */
                    396:                        atr=(atr&0xf8)|BLACK;
                    397:                        attr(atr);
                    398:                        break;
                    399:                case '0':       /* Black Background */
                    400:                        atr=(atr&0x8f)|(uchar)(BLACK<<4);
                    401:                        attr(atr);
                    402:                        break;
                    403:                case '1':       /* Red Background */
                    404:                        atr=(atr&0x8f)|(uchar)(RED<<4);
                    405:                        attr(atr);
                    406:                        break;
                    407:                case '2':       /* Green Background */
                    408:                        atr=(atr&0x8f)|(uchar)(GREEN<<4);
                    409:                        attr(atr);
                    410:                        break;
                    411:                case '3':       /* Yellow Background */
                    412:                        atr=(atr&0x8f)|(uchar)(BROWN<<4);
                    413:                        attr(atr);
                    414:                        break;
                    415:                case '4':       /* Blue Background */
                    416:                        atr=(atr&0x8f)|(uchar)(BLUE<<4);
                    417:                        attr(atr);
                    418:                        break;
                    419:                case '5':       /* Magenta Background */
                    420:                        atr=(atr&0x8f)|(uchar)(MAGENTA<<4);
                    421:                        attr(atr);
                    422:                        break;
                    423:                case '6':       /* Cyan Background */
                    424:                        atr=(atr&0x8f)|(uchar)(CYAN<<4);
                    425:                        attr(atr);
                    426:                        break;
                    427:                case '7':       /* White Background */
                    428:                        atr=(atr&0x8f)|(uchar)(LIGHTGRAY<<4);
                    429:                        attr(atr);
                    430:                        break; }
                    431: }
                    432: 
                    433: /***************************************************************************/
                    434: /* Changes local and remote text attributes accounting for monochrome      */
                    435: /***************************************************************************/
                    436: /****************************************************************************/
                    437: /* Sends ansi codes to change remote ansi terminal's colors                 */
                    438: /* Only sends necessary codes - tracks remote terminal's current attributes */
                    439: /* through the 'curatr' variable                                            */
                    440: /****************************************************************************/
                    441: void sbbs_t::attr(int atr)
                    442: {
                    443: 
                    444:        if(!(useron.misc&ANSI))
                    445:                return;
                    446:        if(!(useron.misc&COLOR)) {  /* eliminate colors if user doesn't have them */
                    447:                if(atr&LIGHTGRAY)       /* if any foreground bits set, set all */
                    448:                        atr|=LIGHTGRAY;
                    449:                if(atr&(LIGHTGRAY<<4))  /* if any background bits set, set all */
                    450:                        atr|=(LIGHTGRAY<<4);
                    451:                if(atr&LIGHTGRAY && atr&(LIGHTGRAY<<4))
                    452:                        atr&=~LIGHTGRAY;    /* if background is solid, foreground is black */
                    453:                if(!atr)
                    454:                        atr|=LIGHTGRAY; }   /* don't allow black on black */
                    455:        if(curatr==atr) /* text hasn't changed. don't send codes */
                    456:                return;
                    457: 
                    458:        if((!(atr&HIGH) && curatr&HIGH) || (!(atr&BLINK) && curatr&BLINK)
                    459:                || atr==LIGHTGRAY) {
                    460:                bputs("\x1b[0m");
                    461:                curatr=LIGHTGRAY; }
                    462: 
                    463:        if(atr==LIGHTGRAY)                  /* no attributes */
                    464:                return;
                    465: 
                    466:        if(atr&BLINK) {                     /* special attributes */
                    467:                if(!(curatr&BLINK))
                    468:                        bputs(ansi(BLINK)); }
                    469:        if(atr&HIGH) {
                    470:                if(!(curatr&HIGH))
                    471:                        bputs(ansi(HIGH)); }
                    472: 
                    473:        if((atr&0x7)==BLACK) {              /* foreground colors */
                    474:                if((curatr&0x7)!=BLACK)
                    475:                        bputs(ansi(BLACK)); }
                    476:        else if((atr&0x7)==RED) {
                    477:                if((curatr&0x7)!=RED)
                    478:                        bputs(ansi(RED)); }
                    479:        else if((atr&0x7)==GREEN) {
                    480:                if((curatr&0x7)!=GREEN)
                    481:                        bputs(ansi(GREEN)); }
                    482:        else if((atr&0x7)==BROWN) {
                    483:                if((curatr&0x7)!=BROWN)
                    484:                        bputs(ansi(BROWN)); }
                    485:        else if((atr&0x7)==BLUE) {
                    486:                if((curatr&0x7)!=BLUE)
                    487:                        bputs(ansi(BLUE)); }
                    488:        else if((atr&0x7)==MAGENTA) {
                    489:                if((curatr&0x7)!=MAGENTA)
                    490:                        bputs(ansi(MAGENTA)); }
                    491:        else if((atr&0x7)==CYAN) {
                    492:                if((curatr&0x7)!=CYAN)
                    493:                        bputs(ansi(CYAN)); }
                    494:        else if((atr&0x7)==LIGHTGRAY) {
                    495:                if((curatr&0x7)!=LIGHTGRAY)
                    496:                        bputs(ansi(LIGHTGRAY)); }
                    497: 
                    498:        if((atr&0x70)==(BLACK<<4)) {        /* background colors */
                    499:                if((curatr&0x70)!=(BLACK<<4))
                    500:                        bputs("\x1b[40m"); }
                    501:        else if((atr&0x70)==(RED<<4)) {
                    502:                if((curatr&0x70)!=(RED<<4))
                    503:                        bputs(ansi(RED<<4)); }
                    504:        else if((atr&0x70)==(GREEN<<4)) {
                    505:                if((curatr&0x70)!=(GREEN<<4))
                    506:                        bputs(ansi(GREEN<<4)); }
                    507:        else if((atr&0x70)==(BROWN<<4)) {
                    508:                if((curatr&0x70)!=(BROWN<<4))
                    509:                        bputs(ansi(BROWN<<4)); }
                    510:        else if((atr&0x70)==(BLUE<<4)) {
                    511:                if((curatr&0x70)!=(BLUE<<4))
                    512:                        bputs(ansi(BLUE<<4)); }
                    513:        else if((atr&0x70)==(MAGENTA<<4)) {
                    514:                if((curatr&0x70)!=(MAGENTA<<4))
                    515:                        bputs(ansi(MAGENTA<<4)); }
                    516:        else if((atr&0x70)==(CYAN<<4)) {
                    517:                if((curatr&0x70)!=(CYAN<<4))
                    518:                        bputs(ansi(CYAN<<4)); }
                    519:        else if((atr&0x70)==(LIGHTGRAY<<4)) {
                    520:                if((curatr&0x70)!=(LIGHTGRAY<<4))
                    521:                        bputs(ansi(LIGHTGRAY<<4)); }
                    522: 
                    523:        curatr=atr;
                    524: }
                    525: 
                    526: /****************************************************************************/
                    527: /* Checks to see if user has hit Pause or Abort. Returns 1 if user aborted. */
                    528: /* If the user hit Pause, waits for a key to be hit.                        */
                    529: /* Emulates remote XON/XOFF flow control on local console                   */
                    530: /* Preserves SS_ABORT flag state, if already set.                           */
                    531: /* Called from various listing procedures that wish to check for abort      */
                    532: /****************************************************************************/
                    533: bool sbbs_t::msgabort()
                    534: {
                    535:        if(sys_status&SS_SYSPAGE) {
                    536:                sbbs_beep(sbbs_random(800),1);
                    537:        }
                    538: 
                    539:        checkline();
                    540:        if(sys_status&SS_ABORT)
                    541:                return(true);
                    542: #if 0  // no longer necessary
                    543:        if(online==ON_REMOTE && rioctl(IOSTATE)&ABORT) {
                    544:                rioctl(IOCS|ABORT);
                    545:                sys_status|=SS_ABORT;
                    546:                return(true); }
                    547: #endif
                    548:        if(!online)
                    549:                return(true);
                    550:        return(false);
                    551: }
                    552: 
                    553: 

unix.superglobalmegacorp.com

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