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

1.1     ! root        1: #line 1 "CON_MID.C"
        !             2: 
        !             3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
        !             4: 
        !             5: #include "sbbs.h"
        !             6: 
        !             7: extern char *wday[];   /* 3 char days of week */
        !             8: 
        !             9: /****************************************************************************/
        !            10: /* Waits for remote or local user to hit a key. Inactivity timer is checked */
        !            11: /* and hangs up if inactive for 4 minutes. Returns key hit, or uppercase of */
        !            12: /* key hit if mode&K_UPPER or key out of KEY BUFFER. Does not print key.    */
        !            13: /* Called from functions all over the place.                                */
        !            14: /****************************************************************************/
        !            15: char getkey(long mode)
        !            16: {
        !            17:        char ch,coldkey,c=0,spin=random(5);
        !            18: 
        !            19: if(!online)
        !            20:     return(0);
        !            21: sys_status&=~SS_ABORT;
        !            22: if((sys_status&SS_USERON || action==NODE_DFLT) && !(mode&K_GETSTR))
        !            23:     mode|=(useron.misc&SPIN);
        !            24: lncntr=0;
        !            25: timeout=time(NULL);
        !            26: if(mode&K_SPIN)
        !            27:     outchar(' ');
        !            28: do {
        !            29:     checkline();    /* check to make sure remote user is still online */
        !            30:        if(online==ON_REMOTE && console&CON_R_INPUT && rioctl(IOSTATE)&ABORT) {
        !            31:         rioctl(IOCS|ABORT);
        !            32:         sys_status|=SS_ABORT;
        !            33:         if(mode&K_SPIN) /* back space once if on spinning cursor */
        !            34:             bputs("\b \b");
        !            35:         return(0); }
        !            36:        if(sys_status&SS_SYSPAGE)
        !            37:                beep(random(800),100);
        !            38:     if(mode&K_SPIN)
        !            39:         switch(spin) {
        !            40:             case 0:
        !            41:                 switch(c++) {
        !            42:                     case 0:
        !            43:                         outchar(BS);
        !            44:                         outchar('�');
        !            45:                         break;
        !            46:                     case 10:
        !            47:                         outchar(BS);
        !            48:                         outchar('/');
        !            49:                         break;
        !            50:                     case 20:
        !            51:                         outchar(BS);
        !            52:                         outchar('�');
        !            53:                         break;
        !            54:                     case 30:
        !            55:                         outchar(BS);
        !            56:                         outchar('\\');
        !            57:                         break;
        !            58:                     case 40:
        !            59:                         c=0;
        !            60:                         break;
        !            61:                     default:
        !            62:                         if(!inDV && !(node_misc&NM_WINOS2))
        !            63:                                                        mswait(DELAY_SPIN);
        !            64:                         break;  }
        !            65:                 break;
        !            66:             case 1:
        !            67:                 switch(c++) {
        !            68:                     case 0:
        !            69:                         outchar(BS);
        !            70:                         outchar('�');
        !            71:                         break;
        !            72:                     case 10:
        !            73:                         outchar(BS);
        !            74:                         outchar('�');
        !            75:                         break;
        !            76:                     case 20:
        !            77:                         outchar(BS);
        !            78:                         outchar('�');
        !            79:                         break;
        !            80:                     case 30:
        !            81:                         outchar(BS);
        !            82:                         outchar('�');
        !            83:                         break;
        !            84:                     case 40:
        !            85:                         outchar(BS);
        !            86:                         outchar('�');
        !            87:                         break;
        !            88:                     case 50:
        !            89:                         outchar(BS);
        !            90:                         outchar('�');
        !            91:                         break;
        !            92:                     case 60:
        !            93:                         c=0;
        !            94:                         break;
        !            95:                     default:
        !            96:                         if(!inDV && !(node_misc&NM_WINOS2))
        !            97:                                                        mswait(DELAY_SPIN);
        !            98:                         break;  }
        !            99:                 break;
        !           100:             case 2:
        !           101:                 switch(c++) {
        !           102:                     case 0:
        !           103:                         outchar(BS);
        !           104:                         outchar('-');
        !           105:                         break;
        !           106:                     case 10:
        !           107:                         outchar(BS);
        !           108:                         outchar('=');
        !           109:                         break;
        !           110:                     case 20:
        !           111:                         outchar(BS);
        !           112:                         outchar('�');
        !           113:                         break;
        !           114:                     case 30:
        !           115:                         outchar(BS);
        !           116:                         outchar('=');
        !           117:                         break;
        !           118:                     case 40:
        !           119:                         c=0;
        !           120:                         break;
        !           121:                     default:
        !           122:                         if(!inDV && !(node_misc&NM_WINOS2))
        !           123:                                                        mswait(DELAY_SPIN);
        !           124:                         break;  }
        !           125:                 break;
        !           126:             case 3:
        !           127:                 switch(c++) {
        !           128:                     case 0:
        !           129:                         outchar(BS);
        !           130:                         outchar('�');
        !           131:                         break;
        !           132:                     case 10:
        !           133:                         outchar(BS);
        !           134:                         outchar('�');
        !           135:                         break;
        !           136:                     case 20:
        !           137:                         outchar(BS);
        !           138:                         outchar('�');
        !           139:                         break;
        !           140:                     case 30:
        !           141:                         outchar(BS);
        !           142:                         outchar('�');
        !           143:                         break;
        !           144:                     case 40:
        !           145:                         c=0;
        !           146:                         break;
        !           147:                     default:
        !           148:                         if(!inDV && !(node_misc&NM_WINOS2))
        !           149:                                                        mswait(DELAY_SPIN);
        !           150:                         break;  }
        !           151:                 break;
        !           152:             case 4:
        !           153:                 switch(c++) {
        !           154:                     case 0:
        !           155:                         outchar(BS);
        !           156:                         outchar('�');
        !           157:                         break;
        !           158:                     case 10:
        !           159:                         outchar(BS);
        !           160:                         outchar('�');
        !           161:                         break;
        !           162:                     case 20:
        !           163:                         outchar(BS);
        !           164:                         outchar('�');
        !           165:                         break;
        !           166:                     case 30:
        !           167:                         outchar(BS);
        !           168:                         outchar('�');
        !           169:                         break;
        !           170:                     case 40:
        !           171:                         c=0;
        !           172:                         break;
        !           173:                     default:
        !           174:                         if(!inDV && !(node_misc&NM_WINOS2))
        !           175:                                                        mswait(DELAY_SPIN);
        !           176:                         break;  }
        !           177:                 break; }
        !           178:     if(keybuftop!=keybufbot) {
        !           179:         ch=keybuf[keybufbot++];
        !           180:         if(keybufbot==KEY_BUFSIZE)
        !           181:             keybufbot=0; }
        !           182:     else
        !           183:         ch=inkey(mode);
        !           184:     if(sys_status&SS_ABORT)
        !           185:         return(0);
        !           186:     now=time(NULL);
        !           187:     if(ch) {
        !           188:         if(mode&K_NUMBER && isprint(ch) && !isdigit(ch))
        !           189:             continue;
        !           190:         if(mode&K_ALPHA && isprint(ch) && !isalpha(ch))
        !           191:             continue;
        !           192:         if(mode&K_NOEXASC && ch&0x80)
        !           193:             continue;
        !           194:         if(mode&K_SPIN)
        !           195:             bputs("\b \b");
        !           196:                if(mode&K_COLD && ch>SP && useron.misc&COLDKEYS) {
        !           197:                        if(mode&K_UPPER)
        !           198:                                outchar(toupper(ch));
        !           199:                        else
        !           200:                                outchar(ch);
        !           201:                        while((coldkey=inkey(mode))==0 && online && !(sys_status&SS_ABORT))
        !           202:                                checkline();
        !           203:                        bputs("\b \b");
        !           204:                        if(coldkey==BS)
        !           205:                                continue;
        !           206:                        if(coldkey>SP)
        !           207:                                ungetkey(coldkey); }
        !           208:         if(mode&K_UPPER)
        !           209:             return(toupper(ch));
        !           210:         return(ch); }
        !           211:     if(sys_status&SS_USERON && !(sys_status&SS_LCHAT)) gettimeleft();
        !           212:     else if(online &&
        !           213:         ((node_dollars_per_call && now-answertime>SEC_BILLING)
        !           214:         || (now-answertime>SEC_LOGON && !(sys_status&SS_LCHAT)))) {
        !           215:         console&=~(CON_R_ECHOX|CON_L_ECHOX);
        !           216:         console|=(CON_R_ECHO|CON_L_ECHO);
        !           217:         bputs(text[TakenTooLongToLogon]);
        !           218:         hangup(); }
        !           219:        if(sys_status&SS_USERON && online && (timeleft/60)<(5-timeleft_warn)
        !           220:                && !SYSOP && !(sys_status&SS_LCHAT)) {
        !           221:         timeleft_warn=5-(timeleft/60);
        !           222:         SAVELINE;
        !           223:                attr(LIGHTGRAY);
        !           224:         bprintf(text[OnlyXminutesLeft]
        !           225:                        ,((ushort)timeleft/60)+1,(timeleft/60) ? "s" : nulstr);
        !           226:         RESTORELINE; }
        !           227: 
        !           228:        if(online==ON_LOCAL && node_misc&NM_NO_INACT)
        !           229:                timeout=now;
        !           230:        if(now-timeout>=sec_warn) {                                     /* warning */
        !           231:         if(sys_status&SS_USERON) {
        !           232:             SAVELINE;
        !           233:             bputs(text[AreYouThere]); }
        !           234:         else
        !           235:             bputs("\7\7");
        !           236:                while(!inkey(0) && online && now-timeout>=sec_warn) {
        !           237:             now=time(NULL);
        !           238:                        if(now-timeout>=sec_hangup) {
        !           239:                 if(online==ON_REMOTE) {
        !           240:                     console|=CON_R_ECHO;
        !           241:                     console&=~CON_R_ECHOX; }
        !           242:                 bputs(text[CallBackWhenYoureThere]);
        !           243:                 logline(nulstr,"Inactive");
        !           244:                 hangup();
        !           245:                 return(0); }
        !           246:             mswait(100); }
        !           247:         if(sys_status&SS_USERON) {
        !           248:             bputs("\r\1n\1>");
        !           249:             RESTORELINE; }
        !           250:         timeout=now; }
        !           251: 
        !           252:     } while(online);
        !           253: return(0);
        !           254: }
        !           255: 
        !           256: /****************************************************************************/
        !           257: /* This function lists users that are online.                               */
        !           258: /* If listself is true, it will list the current node.                      */
        !           259: /* Returns number of active nodes (not including current node).             */
        !           260: /****************************************************************************/
        !           261: int whos_online(char listself)
        !           262: {
        !           263:     int i,j;
        !           264:     node_t node;
        !           265: 
        !           266: CRLF;
        !           267: bputs(text[NodeLstHdr]);
        !           268: for(j=0,i=1;i<=sys_nodes && i<=sys_lastnode;i++) {
        !           269:     getnodedat(i,&node,0);
        !           270:     if(i==node_num) {
        !           271:         if(listself)
        !           272:             printnodedat(i,node);
        !           273:         continue; }
        !           274:     if(node.status==NODE_INUSE || (SYSOP && node.status==NODE_QUIET)) {
        !           275:         printnodedat(i,node);
        !           276:         if(!lastnodemsg)
        !           277:             lastnodemsg=i;
        !           278:         j++; } }
        !           279: if(!j)
        !           280:     bputs(text[NoOtherActiveNodes]);
        !           281: return(j);
        !           282: }
        !           283: 
        !           284: /****************************************************************************/
        !           285: /* Displays the information for node number 'number' contained in 'node'    */
        !           286: /****************************************************************************/
        !           287: void printnodedat(uint number, node_t node)
        !           288: {
        !           289:     uint i;
        !           290:     char hour,mer[3];
        !           291: 
        !           292: attr(color[clr_nodenum]);
        !           293: bprintf("%3d  ",number);
        !           294: attr(color[clr_nodestatus]);
        !           295: switch(node.status) {
        !           296:     case NODE_WFC:
        !           297:         bputs("Waiting for call");
        !           298:         break;
        !           299:     case NODE_OFFLINE:
        !           300:         bputs("Offline");
        !           301:         break;
        !           302:     case NODE_NETTING:
        !           303:         bputs("Networking");
        !           304:         break;
        !           305:     case NODE_LOGON:
        !           306:         bputs("At logon prompt");
        !           307:         break;
        !           308:     case NODE_EVENT_WAITING:
        !           309:         bputs("Waiting for all nodes to become inactive");
        !           310:         break;
        !           311:     case NODE_EVENT_LIMBO:
        !           312:         bprintf("Waiting for node %d to finish external event",node.aux);
        !           313:         break;
        !           314:     case NODE_EVENT_RUNNING:
        !           315:         bputs("Running external event");
        !           316:         break;
        !           317:     case NODE_NEWUSER:
        !           318:         attr(color[clr_nodeuser]);
        !           319:         bputs("New user");
        !           320:         attr(color[clr_nodestatus]);
        !           321:         bputs(" applying for access ");
        !           322:         if(!node.connection)
        !           323:             bputs("Locally");
        !           324:         else
        !           325:             bprintf("at %ubps",node.connection);
        !           326:         break;
        !           327:     case NODE_QUIET:
        !           328:         if(!SYSOP) {
        !           329:             bputs("Waiting for call");
        !           330:             break; }
        !           331:     case NODE_INUSE:
        !           332:                if(node.misc&NODE_EXT) {
        !           333:                        getnodeext(number,tmp);
        !           334:                        bputs(tmp);
        !           335:                        break; }
        !           336:         attr(color[clr_nodeuser]);
        !           337:         if(node.misc&NODE_ANON && !SYSOP)
        !           338:             bputs("UNKNOWN USER");
        !           339:         else
        !           340:             bputs(username(node.useron,tmp));
        !           341:         attr(color[clr_nodestatus]);
        !           342:         bputs(" ");
        !           343:         switch(node.action) {
        !           344:             case NODE_MAIN:
        !           345:                 bputs("at main menu");
        !           346:                 break;
        !           347:             case NODE_RMSG:
        !           348:                 bputs("reading messages");
        !           349:                 break;
        !           350:             case NODE_RMAL:
        !           351:                 bputs("reading mail");
        !           352:                 break;
        !           353:             case NODE_RSML:
        !           354:                 bputs("reading sent mail");
        !           355:                 break;
        !           356:             case NODE_RTXT:
        !           357:                 bputs("reading text files");
        !           358:                 break;
        !           359:             case NODE_PMSG:
        !           360:                 bputs("posting message");
        !           361:                 break;
        !           362:             case NODE_SMAL:
        !           363:                 bputs("sending mail");
        !           364:                 break;
        !           365:             case NODE_AMSG:
        !           366:                 bputs("posting auto-message");
        !           367:                 break;
        !           368:             case NODE_XTRN:
        !           369:                 if(!node.aux)
        !           370:                     bputs("at external program menu");
        !           371:                 else {
        !           372:                     bputs("running ");
        !           373:                     i=node.aux-1;
        !           374:                                        if(SYSOP || chk_ar(xtrn[i]->ar,useron))
        !           375:                         bputs(xtrn[node.aux-1]->name);
        !           376:                     else
        !           377:                         bputs("external program"); }
        !           378:                 break;
        !           379:             case NODE_DFLT:
        !           380:                 bputs("changing defaults");
        !           381:                 break;
        !           382:             case NODE_XFER:
        !           383:                 bputs("at transfer menu");
        !           384:                 break;
        !           385:             case NODE_RFSD:
        !           386:                 bprintf("retrieving from device #%d",node.aux);
        !           387:                 break;
        !           388:             case NODE_DLNG:
        !           389:                 bprintf("downloading");
        !           390:                 break;
        !           391:             case NODE_ULNG:
        !           392:                 bputs("uploading");
        !           393:                 break;
        !           394:             case NODE_BXFR:
        !           395:                 bputs("transferring bidirectional");
        !           396:                 break;
        !           397:             case NODE_LFIL:
        !           398:                 bputs("listing files");
        !           399:                 break;
        !           400:             case NODE_LOGN:
        !           401:                 bputs("logging on");
        !           402:                 break;
        !           403:             case NODE_LCHT:
        !           404:                 bprintf("in local chat with %s",sys_op);
        !           405:                 break;
        !           406:             case NODE_MCHT:
        !           407:                 if(node.aux) {
        !           408:                     bprintf("in multinode chat channel %d",node.aux&0xff);
        !           409:                     if(node.aux&0x1f00) { /* password */
        !           410:                         outchar('*');
        !           411:                         if(SYSOP)
        !           412:                             bprintf(" %s",unpackchatpass(tmp,node)); } }
        !           413:                 else
        !           414:                     bputs("in multinode global chat channel");
        !           415:                 break;
        !           416:             case NODE_PAGE:
        !           417:                 bprintf("paging node %u for private chat",node.aux);
        !           418:                 break;
        !           419:             case NODE_PCHT:
        !           420:                 bprintf("in private chat with node %u",node.aux);
        !           421:                 break;
        !           422:             case NODE_GCHT:
        !           423:                                i=node.aux;
        !           424:                                if(i>=total_gurus)
        !           425:                                        i=0;
        !           426:                                bprintf("chatting with %s",guru[i]->name);
        !           427:                 break;
        !           428:             case NODE_CHAT:
        !           429:                 bputs("in chat section");
        !           430:                 break;
        !           431:             case NODE_TQWK:
        !           432:                 bputs("transferring QWK packet");
        !           433:                 break;
        !           434:             case NODE_SYSP:
        !           435:                 bputs("performing sysop activities");
        !           436:                 break;
        !           437:             default:
        !           438:                 bputs(itoa(node.action,tmp,10));
        !           439:                 break;  }
        !           440:         if(!node.connection)
        !           441:             bputs(" locally");
        !           442:         else
        !           443:             bprintf(" at %ubps",node.connection);
        !           444:         if(node.action==NODE_DLNG) {
        !           445:             if(sys_misc&SM_MILITARY) {
        !           446:                 hour=node.aux/60;
        !           447:                 mer[0]=0; }
        !           448:             else if((node.aux/60)>=12) {
        !           449:                 if(node.aux/60==12)
        !           450:                     hour=12;
        !           451:                 else
        !           452:                     hour=(node.aux/60)-12;
        !           453:                 strcpy(mer,"pm"); }
        !           454:             else {
        !           455:                 if((node.aux/60)==0)    /* 12 midnite */
        !           456:                     hour=12;
        !           457:                 else hour=node.aux/60;
        !           458:                 strcpy(mer,"am"); }
        !           459:             bprintf(" ETA %02d:%02d %s"
        !           460:                 ,hour,node.aux%60,mer); }
        !           461:         break; }
        !           462: i=NODE_LOCK;
        !           463: if(node.status==NODE_INUSE || SYSOP)
        !           464:        i|=NODE_POFF|NODE_AOFF|NODE_MSGW|NODE_NMSG;
        !           465: if(node.misc&i) {
        !           466:     bputs(" (");
        !           467:        if(node.misc&(i&NODE_AOFF))
        !           468:         outchar('A');
        !           469:     if(node.misc&NODE_LOCK)
        !           470:         outchar('L');
        !           471:        if(node.misc&(i&(NODE_MSGW|NODE_NMSG)))
        !           472:         outchar('M');
        !           473:        if(node.misc&(i&NODE_POFF))
        !           474:         outchar('P');
        !           475:     outchar(')'); }
        !           476: if(SYSOP && ((node.misc
        !           477:     &(NODE_ANON|NODE_UDAT|NODE_INTR|NODE_RRUN|NODE_EVENT|NODE_DOWN))
        !           478:     || node.status==NODE_QUIET)) {
        !           479:     bputs(" [");
        !           480:     if(node.misc&NODE_ANON)
        !           481:         outchar('A');
        !           482:     if(node.misc&NODE_INTR)
        !           483:         outchar('I');
        !           484:     if(node.misc&NODE_RRUN)
        !           485:         outchar('R');
        !           486:     if(node.misc&NODE_UDAT)
        !           487:         outchar('U');
        !           488:     if(node.status==NODE_QUIET)
        !           489:         outchar('Q');
        !           490:     if(node.misc&NODE_EVENT)
        !           491:         outchar('E');
        !           492:     if(node.misc&NODE_DOWN)
        !           493:         outchar('D');
        !           494:     outchar(']'); }
        !           495: if(node.errors && SYSOP) {
        !           496:     attr(color[clr_err]);
        !           497:        bprintf(" %d error%c",node.errors, node.errors>1 ? 's' : '\0' ); }
        !           498: attr(LIGHTGRAY);
        !           499: CRLF;
        !           500: }
        !           501: 
        !           502: /****************************************************************************/
        !           503: /* Prints/updates the local status line (line #25) with the user/system     */
        !           504: /* information. Which info depends on value of statline.                    */
        !           505: /* Called from several functions                                            */
        !           506: /****************************************************************************/
        !           507: void statusline()
        !           508: {
        !           509:     int row,col,atr;
        !           510:     char tmp1[128],tmp2[256],tmp3[256],age;
        !           511: 
        !           512: #ifndef __OS2__
        !           513: if(lclaes())
        !           514:     return;
        !           515: #endif
        !           516: col=lclwx();
        !           517: row=lclwy();
        !           518: STATUSLINE;
        !           519: lclxy(1,node_scrnlen);
        !           520: age=getage(useron.birth);
        !           521: if(sys_status&(SS_CAP|SS_TMPSYSOP)) {
        !           522:     atr=lclatr((LIGHTGRAY<<4)|BLINK);
        !           523:     sys_status&SS_CAP ? lputc('C') : lputc(SP);
        !           524:     sys_status&SS_TMPSYSOP ? lputc('*') : lputc(SP);
        !           525:     lclatr(LIGHTGRAY<<4); }
        !           526: else {
        !           527:     atr=lclatr(LIGHTGRAY<<4);
        !           528:     lputs("  "); }
        !           529: switch(statline) {
        !           530:     case -1:
        !           531:         lputs("Terminal:  Alt-X Exit  Alt-D DOS  Alt-H Hangup  "
        !           532:             "Alt-L Logon  Alt-U User Edit");
        !           533:         break;
        !           534:     case 0:     /* Alias ML Password Modem Birthday Age Sex Phone */
        !           535:         lprintf("%-24.24s %02d %-8.8s %-8.8s %-8.8s %02d %c %s"
        !           536:             ,useron.alias,useron.level,sys_misc&SM_ECHO_PW ? useron.pass:"XXXX"
        !           537:             ,useron.modem,useron.birth,age,useron.sex,useron.phone);
        !           538:         break;
        !           539:     case 1:     /* Alias ML RealName Alt-Z for Help */
        !           540:         lprintf("%-24.24s %02d %-25.25s  "
        !           541:             ,useron.alias,useron.level,useron.name);
        !           542:         lputs("Alt-Z for Help");
        !           543:         break;
        !           544:     case 2:     /* Alias ML RealName Age Sex Phone */
        !           545:         lprintf("%-24.24s %02d %-25.25s  %02d %c %s"
        !           546:             ,useron.alias,useron.level,useron.name,age,useron.sex,useron.phone);
        !           547:         break;
        !           548:     case 3:     /* Alias ML Location Phone */
        !           549:         lprintf("%-24.24s %02d %-30.30s  %s"
        !           550:             ,useron.alias,useron.level,useron.location,useron.phone);
        !           551:         break;
        !           552:     case 4:     /* Alias ML Note Phone */
        !           553:         lprintf("%-24.24s %02d %-30.30s  %s"
        !           554:             ,useron.alias,useron.level,useron.note,useron.phone);
        !           555:         break;
        !           556:     case 5:     /* Alias ML MF Age Sex Phone */
        !           557:         lprintf("%-24.24s %02d %-26.26s %02d %c %s"
        !           558:             ,useron.alias,useron.level,ltoaf(useron.flags1,tmp1)
        !           559:             ,age,useron.sex,useron.phone);
        !           560:         break;
        !           561:     case 6:     /* Alias ML MF Expiration */
        !           562:         lprintf("%-24.24s %02d %-26.26s Exp: %s"
        !           563:             ,useron.alias,useron.level,ltoaf(useron.flags1,tmp1)
        !           564:             ,unixtodstr(useron.expire,tmp2));
        !           565:         break;
        !           566:     case 7:     /* Alias ML Firston Laston Expire */
        !           567:         lprintf("%-24.24s %02d First: %s Last: %s Exp: %s"
        !           568:             ,useron.alias,useron.level,unixtodstr(useron.firston,tmp1)
        !           569:             ,unixtodstr(useron.laston,tmp2),unixtodstr(useron.expire,tmp3));
        !           570:         break;
        !           571:     case 8:     /* Alias Credits Minutes Expire */
        !           572:         lprintf("%-24.24s Cdt: %-13.13s Min: %-10luExp: %s"
        !           573:             ,useron.alias,ultoac(useron.cdt,tmp1),useron.min
        !           574:             ,unixtodstr(useron.expire,tmp2));
        !           575:         break;
        !           576:     case 9:    /* Exemptions Restrictions */
        !           577:         lprintf("  Exempt:%-26.26s   Restrict:%s"
        !           578:             ,ltoaf(useron.exempt,tmp1),ltoaf(useron.rest,tmp2));
        !           579:         break;
        !           580:     case 10:    /* Computer Modem Handle*/
        !           581:         lprintf("Comp: %-30.30s  Modem: %-8.8s  Handle: %s"
        !           582:             ,useron.comp,connection,useron.handle);
        !           583:         break;
        !           584:     case 11:    /* StreetAddress Location Zip */
        !           585:         lprintf("%-30.30s %-30.30s %s"
        !           586:             ,useron.address,useron.location,useron.zipcode);
        !           587:         break;
        !           588:     case 12:    /* UploadBytes Uploads DownloadBytes Downloads Leeches */
        !           589:         lprintf("Uloads: %-13.13s / %-5u Dloads: %-13.13s / %-5u Leech: %u"
        !           590:             ,ultoac(useron.ulb,tmp1),useron.uls
        !           591:             ,ultoac(useron.dlb,tmp2),useron.dls,useron.leech);
        !           592:         break;
        !           593:     case 13:    /* Posts Emails Fbacks Waiting Logons Timeon */
        !           594:         lprintf("P: %-5u E: %-5u F: %-5u W: %-5u L: %-5u T: %-5u"
        !           595:             ,useron.posts,useron.emails,useron.fbacks,getmail(useron.number,0)
        !           596:             ,useron.logons,useron.timeon);
        !           597:         break;
        !           598:     case 14:    /* NetMail forwarding address */
        !           599:         lprintf("NetMail: %s",useron.netmail);
        !           600:         break;
        !           601:     case 15:    /* Comment */
        !           602:         lprintf("Comment: %s",useron.comment);
        !           603:         break;
        !           604:         }
        !           605: lputc(CLREOL);
        !           606: lclxy(75,lclwy());
        !           607: getnodedat(node_num,&thisnode,0);
        !           608: if(sys_status&SS_SYSALERT
        !           609:     || thisnode.misc&(NODE_RRUN|NODE_DOWN|NODE_LOCK|NODE_EVENT)) {
        !           610:     lclatr((LIGHTGRAY<<4)|BLINK);
        !           611:     sys_status&SS_SYSALERT ? lputc('A'):lputc(SP);
        !           612:     thisnode.misc&NODE_RRUN ? lputc('R'):lputc(SP);
        !           613:     thisnode.misc&NODE_DOWN ? lputc('D'):lputc(SP);
        !           614:     thisnode.misc&NODE_LOCK ? lputc('L'):lputc(SP);
        !           615:     thisnode.misc&NODE_EVENT ? lputc('E'):lputc(SP); }
        !           616: TEXTWINDOW;
        !           617: lclxy(col,row);
        !           618: lclatr(atr);
        !           619: }
        !           620: 
        !           621: /****************************************************************************/
        !           622: /* Prints PAUSE message and waits for a key stoke                           */
        !           623: /****************************************************************************/
        !           624: void pause()
        !           625: {
        !           626:        uchar tempattrs=curatr; /* was lclatr(-1) */
        !           627:     int i,j;
        !           628:        long l=K_UPPER;
        !           629: 
        !           630: RIOSYNC(0);
        !           631: if(sys_status&SS_ABORT)
        !           632:     return;
        !           633: lncntr=0;
        !           634: if(online==ON_REMOTE)
        !           635:     rioctl(IOFI);
        !           636: bputs(text[Pause]);
        !           637: j=bstrlen(text[Pause]);
        !           638: if(sys_status&SS_USERON && !(useron.misc&NO_EXASCII) && !(useron.misc&WIP))
        !           639:        l|=K_SPIN;
        !           640: if(getkey(l)==text[YN][1])
        !           641:        sys_status|=SS_ABORT;
        !           642: if(text[Pause][0]!='@')
        !           643:        for(i=0;i<j;i++)
        !           644:                bputs("\b \b");
        !           645: getnodedat(node_num,&thisnode,0);
        !           646: nodesync();
        !           647: attr(tempattrs);
        !           648: }
        !           649: 
        !           650: void getlines()
        !           651: {
        !           652: if(useron.misc&ANSI && !useron.rows         /* Auto-detect rows */
        !           653:     && online==ON_REMOTE) {                 /* Remote */
        !           654:     SYNC;   
        !           655:     putcom("\x1b[s\x1b[99B\x1b[6n\x1b[u");
        !           656:     while(online && !rioctl(RXBC) && !lkbrd(1))
        !           657:         checkline();
        !           658:     inkey(0); }
        !           659: 
        !           660: }
        !           661: 
        !           662: 
        !           663: /****************************************************************************/
        !           664: /* Prints a file remotely and locally, interpreting ^A sequences, checks    */
        !           665: /* for pauses, aborts and ANSI. 'str' is the path of the file to print      */
        !           666: /* Called from functions menu and text_sec                                  */
        !           667: /****************************************************************************/
        !           668: void printfile(char *str, int mode)
        !           669: {
        !           670:        char HUGE16 *buf;
        !           671:        int file,wip=0,rip=0;
        !           672:        long length,savcon=console;
        !           673:        FILE *stream;
        !           674: 
        !           675: if(strstr(str,".WIP"))
        !           676:        wip=1;
        !           677: if(strstr(str,".RIP"))
        !           678:        rip=1;
        !           679: 
        !           680: if(mode&P_NOABORT || wip || rip) {
        !           681:        if(online==ON_REMOTE && console&CON_R_ECHO) {
        !           682:         rioctl(IOCM|ABORT);
        !           683:         rioctl(IOCS|ABORT); }
        !           684:     sys_status&=~SS_ABORT; }
        !           685: 
        !           686: if(!tos && !wip && !rip)
        !           687:        CRLF;
        !           688: 
        !           689: if((stream=fnopen(&file,str,O_RDONLY))==NULL) {
        !           690:     bputs(text[FileNotFound]);
        !           691:     if(SYSOP) bputs(str);
        !           692:     CRLF;
        !           693:        return; }
        !           694: 
        !           695: if(wip || rip || !(console&CON_L_ECHO)) {
        !           696:        if(online!=ON_REMOTE || !(console&CON_R_ECHO)) {
        !           697:                fclose(stream);
        !           698:                return; }
        !           699:        console&=~CON_L_ECHO;
        !           700:        lprintf("PRINTFILE (Remote Only): %s\r\n",str);  }
        !           701: if(mode&P_OPENCLOSE) {
        !           702:        length=filelength(file);
        !           703:        if((buf=MALLOC(length+1L))==NULL) {
        !           704:                close(file);
        !           705:                console=savcon;
        !           706:                errormsg(WHERE,ERR_ALLOC,str,length+1L);
        !           707:                return; }
        !           708:        buf[lread(file,buf,length)]=0;
        !           709:        fclose(stream);
        !           710:        putmsg(buf,mode);
        !           711:        FREE((char *)buf); }
        !           712: else {
        !           713:        putmsg_fp(stream,filelength(file),mode);
        !           714:        fclose(stream); }
        !           715: if((mode&P_NOABORT || wip || rip) && online==ON_REMOTE) {
        !           716:     SYNC;
        !           717:     rioctl(IOSM|ABORT); }
        !           718: if(rip)
        !           719:        getlines();
        !           720: console=savcon;
        !           721: }
        !           722: 
        !           723: void printtail(char *str, int lines, int mode)
        !           724: {
        !           725:        char HUGE16 *buf,HUGE16 *p;
        !           726:        int file,cur=0;
        !           727:        ulong length,l;
        !           728: 
        !           729: if(mode&P_NOABORT) {
        !           730:     if(online==ON_REMOTE) {
        !           731:         rioctl(IOCM|ABORT);
        !           732:         rioctl(IOCS|ABORT); }
        !           733:     sys_status&=~SS_ABORT; }
        !           734: strupr(str);
        !           735: if(!tos) {
        !           736:     CRLF; }
        !           737: if((file=nopen(str,O_RDONLY))==-1) {
        !           738:     bputs(text[FileNotFound]);
        !           739:     if(SYSOP) bputs(str);
        !           740:     CRLF;
        !           741:        return; }
        !           742: length=filelength(file);
        !           743: if((buf=MALLOC(length+1L))==NULL) {
        !           744:     close(file);
        !           745:        errormsg(WHERE,ERR_ALLOC,str,length+1L);
        !           746:        return; }
        !           747: l=lread(file,buf,length);
        !           748: buf[l]=0;
        !           749: close(file);
        !           750: p=(buf+l)-1;
        !           751: if(*p==LF) p--;
        !           752: while(*p && p>buf) {
        !           753:        if(*p==LF)
        !           754:                cur++;
        !           755:        if(cur>=lines) {
        !           756:                p++;
        !           757:                break; }
        !           758:        p--; }
        !           759: putmsg(p,mode);
        !           760: if(mode&P_NOABORT && online==ON_REMOTE) {
        !           761:     SYNC;
        !           762:     rioctl(IOSM|ABORT); }
        !           763: FREE((char *)buf);
        !           764: }
        !           765: 
        !           766: /****************************************************************************/
        !           767: /* Prints the menu number 'menunum' from the text directory. Checks for ^A  */
        !           768: /* ,ANSI sequences, pauses and aborts. Usually accessed by user inputing '?'*/
        !           769: /* Called from every function that has an available menu.                   */
        !           770: /* The code definitions are as follows:                                     */
        !           771: /****************************************************************************/
        !           772: void menu(char *code)
        !           773: {
        !           774:     char str[256],path[256];
        !           775:     int c,i,l;
        !           776: 
        !           777: sys_status&=~SS_ABORT;
        !           778: if(menu_file[0])
        !           779:        strcpy(path,menu_file);
        !           780: else {
        !           781:        sprintf(str,"%sMENU\\",text_dir);
        !           782:        if(menu_dir[0]) {
        !           783:                strcat(str,menu_dir);
        !           784:                strcat(str,"\\"); }
        !           785:        strcat(str,code);
        !           786:        strcat(str,".");
        !           787:        sprintf(path,"%s%s",str,useron.misc&WIP ? "WIP":"RIP");
        !           788:        if(!(useron.misc&(RIP|WIP)) || !fexist(path)) {
        !           789:                sprintf(path,"%sMON",str);
        !           790:                if((useron.misc&(COLOR|ANSI))!=ANSI || !fexist(path)) {
        !           791:                        sprintf(path,"%sANS",str);
        !           792:                        if(!(useron.misc&ANSI) || !fexist(path))
        !           793:                                sprintf(path,"%sASC",str); } } }
        !           794: 
        !           795: printfile(path,P_OPENCLOSE);
        !           796: }
        !           797: 
        !           798: /****************************************************************************/
        !           799: /* Puts a character into the input buffer                                   */
        !           800: /****************************************************************************/
        !           801: void ungetkey(char ch)
        !           802: {
        !           803: 
        !           804: keybuf[keybuftop++]=ch;
        !           805: if(keybuftop==KEY_BUFSIZE)
        !           806:     keybuftop=0;
        !           807: }
        !           808: 

unix.superglobalmegacorp.com

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