Annotation of researchv9/jerq/src/sysmon/jerqmon.c, revision 1.1

1.1     ! root        1: #define MUXTERM
        !             2: #define MPXTERM
        !             3: 
        !             4: #include <jerq.h>
        !             5: #include <font.h>
        !             6: #include <menu.h>
        !             7: #include "defs.h"
        !             8: 
        !             9: #undef getname /* strange hack to avoid name clash */
        !            10: 
        !            11: /* user nice sys queue idle */
        !            12: Texture black={
        !            13:        0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 
        !            14:        0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 
        !            15: };
        !            16: Texture white={
        !            17:        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
        !            18:        0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
        !            19: };
        !            20: Texture darkgrey = {
        !            21:        0xDDDD, 0x7777, 0xDDDD, 0x7777, 0xDDDD, 0x7777, 0xDDDD, 0x7777,
        !            22:        0xDDDD, 0x7777, 0xDDDD, 0x7777, 0xDDDD, 0x7777, 0xDDDD, 0x7777,
        !            23: };
        !            24: Texture lightgrey = {
        !            25:        0x2222, 0x8888, 0x2222, 0x8888, 0x2222, 0x8888, 0x2222, 0x8888,
        !            26:        0x2222, 0x8888, 0x2222, 0x8888, 0x2222, 0x8888, 0x2222, 0x8888,
        !            27: };
        !            28: Texture grey = {
        !            29:        0xAAAA, 0x5555, 0xAAAA, 0x5555, 0xAAAA, 0x5555, 0xAAAA, 0x5555,
        !            30:        0xAAAA, 0x5555, 0xAAAA, 0x5555, 0xAAAA, 0x5555, 0xAAAA, 0x5555,
        !            31: };
        !            32: Texture *txt[]={
        !            33:        &black, &lightgrey, &darkgrey, &grey, &white
        !            34: };
        !            35: 
        !            36: #      define TIMELEN 6
        !            37: char time[TIMELEN];
        !            38: #      define NAMELEN 9
        !            39: #      define LOADLEN 13
        !            40: #      define MAILLEN 18
        !            41: 
        !            42: struct nodedef {
        !            43:     Rectangle bar;             /* the bar graph of system use */
        !            44:     char name[NAMELEN];                /* node name */
        !            45:     char load[LOADLEN];                /* load numbers */
        !            46:     int vec[5];                        /* current use vectors */
        !            47:     int oldvec[5];             /* old use vectors */
        !            48:     char mail[MAILLEN];                /* last mail from this node */
        !            49: };
        !            50: struct nodedef node0;          /* preallocate node 0 */
        !            51: int nodes = 0;                 /* number of nodes */
        !            52: struct nodedef *node[MAXMACHS] = {
        !            53:        &node0
        !            54: };
        !            55: 
        !            56: /* size contraints */
        !            57: #define ICONSEP 2
        !            58: #define BARHEIGHT 18
        !            59: #define MINBARHEIGHT 4
        !            60: #define MAXBARHEIGHT 24
        !            61: #define TIMEORIGIN 2
        !            62: int CHARHEIGHT;
        !            63: int CHARWIDTH;
        !            64: int TIMECORNER;
        !            65: int LOADORIGIN;
        !            66: int LOADCORNER;
        !            67: int MAILORIGIN;
        !            68: int MAILCORNER;
        !            69: 
        !            70: int size;
        !            71: int barheight;
        !            72: int iconorigin;
        !            73: 
        !            74: /* the communications process */
        !            75: struct Proc *cwp;
        !            76: 
        !            77: /* icon info */
        !            78: #define ICONSIZE 48
        !            79: #define ICONWORDS (ICONSIZE*(ICONSIZE/16))
        !            80: Bitmap *icon, *ticon;
        !            81: int icons = 0;
        !            82: int maxicons;
        !            83: int haveicons = 0;
        !            84: 
        !            85: /* dynamically add/remove monitored systems */
        !            86: 
        !            87: static NMitem astroitems[] = {
        !            88:        {"alice"},
        !            89:        {"arend"},
        !            90:        {"atomic"},
        !            91:        {"bowell"},
        !            92:        {"dutoit"},
        !            93:        {"encke"},
        !            94:        {"forbes"},
        !            95:        {"grigg"},
        !            96:        {"ikeya"},
        !            97:        {"kwee"},
        !            98:        {"mrkos"},
        !            99:        {"panther"},
        !           100:        {"piggot"},
        !           101:        {"polya"},
        !           102:        {"research"},
        !           103:        {"seki"},
        !           104:        {"snb"},
        !           105:        {"spit"},
        !           106:        {"swift"},
        !           107:        {"west"},
        !           108:        {"wild"},
        !           109:        {0}
        !           110: };
        !           111: 
        !           112: static NMenu astromenu = {astroitems};
        !           113: 
        !           114: static NMitem phoneitems[] = {
        !           115:        {"shannon"},
        !           116:        {"shewhart"},
        !           117:        {"sid"},
        !           118:        {"slepian"},
        !           119:        {"sweet"},
        !           120:        {"tukey"},
        !           121:        {0}
        !           122: };
        !           123: 
        !           124: static NMenu phonemenu = {phoneitems};
        !           125: 
        !           126: static NMitem mercuryitems[] = {
        !           127:        {"arachne"},
        !           128:        {"balin"},
        !           129:        {"bashful"},
        !           130:        {"bifur"},
        !           131:        {"capek"},
        !           132:        {"doc"},
        !           133:        {"eeyore"},
        !           134:        {"gimli"},
        !           135:        {"gunn"},
        !           136:        {"happy"},
        !           137:        {"hunny"},
        !           138:        {"icarus"},
        !           139:        {"indra"},
        !           140:        {"iota"},
        !           141:        {"jones"},
        !           142:        {"kanga"},
        !           143:        {"sapir"},
        !           144:        {"siriusb"},
        !           145:        {"sola"},
        !           146:        {"sweet"},
        !           147:        {"thorin"},
        !           148:        {0}
        !           149: };
        !           150: 
        !           151: static NMenu mercurymenu = {mercuryitems};
        !           152: 
        !           153: static NMitem machitems[] = {
        !           154:        {"mh/vlsi/araki"},
        !           155:        {"alc/ram/most"},
        !           156:        {"mh/astro", 0, &astromenu},
        !           157:        {"mh/mercury", 0, &mercurymenu},
        !           158:        {"mh/phone", 0, &phonemenu},
        !           159:        {0}
        !           160: };
        !           161: 
        !           162: NMenu nmenu2 = {machitems};
        !           163: 
        !           164: static struct {
        !           165:        char *name;
        !           166:        NMitem *base, *lim;
        !           167: } menulist[] = {
        !           168:        {"mh/astro/", astroitems, astroitems+sizeof(astroitems)/(sizeof(NMitem))-1},
        !           169:        {"mh/mercury/", mercuryitems, mercuryitems+sizeof(mercuryitems)/(sizeof(NMitem))-1},
        !           170:        {"mh/phone/", phoneitems, phoneitems+sizeof(phoneitems)/(sizeof(NMitem))-1},
        !           171:        {0}
        !           172: };
        !           173: 
        !           174: 
        !           175: main()
        !           176: {
        !           177:        register i, state, hadmouse;
        !           178: 
        !           179: #ifdef LUCA
        !           180:        Rectangle tempr;
        !           181: 
        !           182:        /*
        !           183:         *      The following is a layer reshaping for Luca.  See sysmon -l.
        !           184:         */
        !           185:        tempr = display.rect;
        !           186:        dellayer(P->layer);
        !           187:        tempr.corner.y = tempr.origin.y + 8+ICONSIZE;
        !           188:        if (Drect.corner.y > YMAX-16) {
        !           189:                tempr.corner.y = YMAX-8;
        !           190:                tempr.origin.y = YMAX-8-(8+ICONSIZE);
        !           191:        }
        !           192:        Drect = inset(tempr,2);
        !           193:        Jdisplayp = (Bitmap *) (P->layer = newlayer(tempr));
        !           194:        if (!P->layer)
        !           195:                exit();
        !           196: #endif
        !           197: 
        !           198:        request(RCV|MOUSE|KBD);
        !           199: 
        !           200:        CHARHEIGHT = defont.height - 2;
        !           201:        CHARWIDTH = strwidth(&defont, "m");
        !           202:        TIMECORNER = NAMELEN*CHARWIDTH;
        !           203:        LOADORIGIN = TIMECORNER;
        !           204:        LOADCORNER = TIMECORNER + LOADLEN*CHARWIDTH;
        !           205:        MAILORIGIN = LOADCORNER;
        !           206:        MAILCORNER = LOADCORNER + MAILLEN*CHARWIDTH;
        !           207:        barheight = MAXBARHEIGHT;
        !           208:        iconorigin = MAILCORNER;
        !           209:        time[0] =  0;
        !           210:        hadmouse = 0;
        !           211: 
        !           212:        for(;;sleep(3)){
        !           213:                if (cwp != 0 && cwp->state == 0)
        !           214:                        cwp = 0;
        !           215:                state = own();
        !           216:                if(state&RCV)
        !           217:                        get();
        !           218:                if(state&MOUSE) {
        !           219:                        if(button2()) {
        !           220:                                domenu();
        !           221:                        } else if(button3()) {
        !           222:                                request(RCV|KBD);
        !           223:                                sleep(1);
        !           224:                                request(RCV|KBD|MOUSE);
        !           225:                        } else if (!hadmouse || button1()) {
        !           226:                                clearmail();
        !           227:                                clearicon();
        !           228:                        }
        !           229:                }
        !           230:                hadmouse = state&MOUSE;
        !           231:                if(state&KBD) {
        !           232:                        while(kbdchar() != -1)  /* dump any keyboard input */
        !           233:                                ;
        !           234:                }
        !           235:                for (i = 0; i < nodes; i++)
        !           236:                        drawbar (node[i]);
        !           237:                if(P->state&RESHAPED)
        !           238:                        reshape(0);
        !           239:        }
        !           240: }
        !           241: 
        !           242: reshape(msg)
        !           243:        char *msg;
        !           244: {
        !           245:        register int i;
        !           246: 
        !           247:        P->state&=~RESHAPED;
        !           248:        rectf(&display, Drect, F_CLR);
        !           249: 
        !           250:        /* output an error message */
        !           251:        if (msg != 0) {
        !           252:                string(&defont, msg, &display,
        !           253:                Pt (Drect.origin.x+2, Drect.origin.y + 2), F_XOR);
        !           254:                sleep(200);
        !           255:                rectf(&display, Drect, F_CLR);
        !           256:        }
        !           257: 
        !           258:        /* resize objects */
        !           259:        size = Drect.corner.x-Drect.origin.x;
        !           260:        barheight = (Drect.corner.y-Drect.origin.y-2)/(nodes?nodes:1) - CHARHEIGHT;
        !           261:        if (barheight < MINBARHEIGHT)
        !           262:                barheight = MINBARHEIGHT;
        !           263:        if (haveicons) {
        !           264:                if (barheight > MAXBARHEIGHT)
        !           265:                        barheight = MAXBARHEIGHT;
        !           266:                i = 3*size/4;
        !           267: #ifndef LUCA
        !           268:                size = (i > MAILCORNER) ? MAILCORNER
        !           269:                                        : ((i > LOADCORNER) ? LOADCORNER
        !           270:                                                            : TIMECORNER);
        !           271: #else
        !           272:                size = (i > LOADCORNER) ? LOADCORNER : TIMECORNER;
        !           273: #endif LUCA
        !           274:                iconorigin = size;
        !           275:                maxicons = (Drect.corner.x-Drect.origin.x-iconorigin)
        !           276:                           / (ICONSIZE+ICONSEP);
        !           277:        }
        !           278: 
        !           279:        /* redraw */
        !           280:        for (i = 0; i < nodes; i++) {
        !           281:                nodeinit(i);
        !           282:                drawload(node[i]);
        !           283:                drawmail(node[i]);
        !           284:        };
        !           285:        drawtime();
        !           286:        clearmail();
        !           287:        clearicon();
        !           288: }
        !           289: 
        !           290: 
        !           291: /* clear out the bar and write in the node name */
        !           292: nodeinit (ind)
        !           293: int ind;                               /* index into node array */
        !           294: {
        !           295:        register struct nodedef *n;
        !           296:        register int i;
        !           297: 
        !           298:        n = node[ind];
        !           299: 
        !           300:        /* make the bar */
        !           301:        n->bar.origin.x = Drect.origin.x;
        !           302:        n->bar.origin.y = Drect.origin.y + ind*(barheight+CHARHEIGHT);
        !           303:        n->bar.corner.x = Drect.origin.x + size;
        !           304:        n->bar.corner.y = n->bar.origin.y + barheight;
        !           305:        n->bar = inset(n->bar, 4);
        !           306:        rectf(&display, inset(n->bar, -2), F_OR);
        !           307:        rectf(&display, n->bar, F_CLR);
        !           308: 
        !           309:        /* init the node */
        !           310:        for(i = 0; i<4; i++)
        !           311:                n->vec[i] = n->oldvec[i] = 0;
        !           312:        n->vec[4]=n->oldvec[4]=size;
        !           313: 
        !           314:        /* write the name */
        !           315:        if (ind != 0 && size >= TIMECORNER)
        !           316:                string (&defont, n->name, &display, 
        !           317:                        Pt(TIMEORIGIN+Drect.origin.x, n->bar.origin.y+barheight-6),
        !           318:                        F_XOR);
        !           319: };
        !           320: 
        !           321: domenu() {
        !           322:        NMitem *mhit(), *sys;
        !           323:        char name[48];
        !           324: 
        !           325:        sys = mhit(&nmenu2, 2, 0);
        !           326:        if (sys) {
        !           327:                register int i;
        !           328:                strcpy(name, "M");
        !           329:                for (i = 0; menulist[i].name; i++) {
        !           330:                        if (sys >= menulist[i].base && sys < menulist[i].lim) {
        !           331:                                strcat (name, menulist[i].name);
        !           332:                                break;
        !           333:                        }
        !           334:                }
        !           335:                strcat(name, sys->text);
        !           336:                strcat(name, "\n");
        !           337:                if (index (name, '/'))
        !           338:                        sendnchars(strlen(name), name);
        !           339:        }
        !           340: }
        !           341: 
        !           342: 
        !           343: Point pt[4];
        !           344: Rectangle new, old;
        !           345: 
        !           346: /* draw the bar graph for a system's CPU time */
        !           347: drawbar (n)
        !           348: struct nodedef *n;
        !           349: {
        !           350:        register i, now;
        !           351: 
        !           352:        pt[0].y = pt[2].y = n->bar.origin.y;
        !           353:        pt[1].y = pt[3].y = n->bar.corner.y;
        !           354:        new = old = n->bar;
        !           355:        for(i=0; i<5; i++){
        !           356:                now = relax(n->oldvec[i], n->vec[i]);
        !           357:                old.corner.x = n->oldvec[i] + old.origin.x;
        !           358:                new.corner.x = now+new.origin.x;
        !           359:                sort(old.origin.x,old.corner.x, new.origin.x,new.corner.x);
        !           360:                if (pt[3].x > n->bar.corner.x)
        !           361:                        pt[3].x = n->bar.corner.x;
        !           362:                if (pt[1].x > n->bar.corner.x)
        !           363:                        pt[1].x = n->bar.corner.x;
        !           364:                texture(&display, Rpt(pt[0], pt[1]), txt[i], F_XOR);
        !           365:                texture(&display, Rpt(pt[2], pt[3]), txt[i], F_XOR);
        !           366:                new.origin.x = new.corner.x;
        !           367:                old.origin.x = old.corner.x;
        !           368:                n->oldvec[i] = now;
        !           369:        }
        !           370: }
        !           371: 
        !           372: relax(o, n)
        !           373:        int o, n;
        !           374: {
        !           375:        register a;
        !           376:        register s=1;
        !           377:        register long lo = o;
        !           378:        register long ln = n;
        !           379: 
        !           380:        if(o>n)
        !           381:                s= -1;
        !           382:        a=abs(o-n);
        !           383:        if(a<2)
        !           384:                return n;
        !           385:        if(a<127)
        !           386:                return o+s;
        !           387:        ln = (127L*lo + ln) / 128L;
        !           388:        s = ln;
        !           389: 
        !           390:        return s;
        !           391: }
        !           392: 
        !           393: sort(x)
        !           394:        int x;
        !           395: {
        !           396:        register int *p= &x;
        !           397:        register i,j;
        !           398:        register t;
        !           399:        for(i=0; i<3; i++){
        !           400:                for(j=0; j<3; j++)
        !           401:                        if(p[j]>p[j+1]){
        !           402:                                t=p[j];
        !           403:                                p[j]=p[j+1];
        !           404:                                p[j+1]=t;
        !           405:                        }
        !           406:        }
        !           407:        for(i=0; i<4; i++)
        !           408:                pt[i].x=p[i];
        !           409: }
        !           410: 
        !           411: drawload(n)
        !           412:        struct nodedef *n;
        !           413: {
        !           414:        if (size < LOADCORNER)
        !           415:                return;
        !           416:        string(&defont, n->load, &display, 
        !           417:                Pt (Drect.origin.x+LOADORIGIN, n->bar.origin.y+barheight-6), F_XOR);
        !           418: }
        !           419: 
        !           420: drawtime()
        !           421: {
        !           422:        if (size < TIMECORNER)
        !           423:                return;
        !           424:        string(&defont, time, &display,
        !           425:                Pt (Drect.origin.x+TIMEORIGIN, Drect.origin.y+barheight-2), F_XOR);
        !           426: }
        !           427: 
        !           428: drawmail(n)
        !           429:        struct nodedef *n;
        !           430: {
        !           431:        if (size < MAILCORNER)
        !           432:                return;
        !           433:        string(&defont, n->mail, &display,
        !           434:                Pt (Drect.origin.x+MAILORIGIN, n->bar.origin.y+barheight-6), F_XOR);
        !           435: }
        !           436: 
        !           437: clearmail()
        !           438: {
        !           439:        register int i;
        !           440: 
        !           441:        for (i = 0; i < nodes; i++) {
        !           442:                drawmail(node[i]);
        !           443:                node[i]->mail[0] = '\0';
        !           444:        }
        !           445: }
        !           446: 
        !           447: drawicon()
        !           448: {
        !           449:        Rectangle rect;
        !           450:        Point to;
        !           451:        int bltwidth;
        !           452: 
        !           453:        if (!haveicons || maxicons < 1)
        !           454:                return;
        !           455: 
        !           456:        /* move icons right */
        !           457:        bltwidth = (maxicons-1)*(ICONSIZE+ICONSEP) - ICONSEP;
        !           458:        rect.origin.x = Drect.origin.x + iconorigin;
        !           459:        rect.origin.y = Drect.origin.y + 2;
        !           460:        rect.corner.x = rect.origin.x + bltwidth;
        !           461:        rect.corner.y = rect.origin.y + ICONSIZE + 4 + CHARHEIGHT;
        !           462:        to.x = rect.origin.x + ICONSIZE + ICONSEP;
        !           463:        to.y = rect.origin.y;
        !           464:        bitblt(&display, rect, &display, to, F_STORE);
        !           465: 
        !           466:        if (icons != maxicons)
        !           467:                icons++;
        !           468: 
        !           469:        /* clear area */
        !           470:        rect.corner.x = to.x;
        !           471:        rectf(&display, rect, F_CLR);
        !           472: 
        !           473:        /* drop in new picture */
        !           474:        to = rect.origin;
        !           475:        rect = icon->rect;
        !           476:        for (rect.origin.y += ICONSIZE-1;
        !           477:             rect.origin.y >= icon->rect.origin.y; 
        !           478:             rect.origin.y--) {
        !           479:                bitblt(icon, rect, &display, to, F_STORE);
        !           480:                sleep(2);
        !           481:        }
        !           482: 
        !           483:        /* add a time stamp */
        !           484:        to.y += ICONSIZE + 4;
        !           485:        string(&defont, time, &display, to, F_XOR);
        !           486: }
        !           487: 
        !           488: clearicon()
        !           489: {
        !           490:        Rectangle rect;
        !           491: 
        !           492:        if (!haveicons || maxicons < 1 || icons == 0)
        !           493:                return;
        !           494:        icons = 0;
        !           495:        rect.origin.x = Drect.origin.x + iconorigin - 1;
        !           496:        rect.origin.y = Drect.origin.y + 1;
        !           497:        rect.corner.x = rect.origin.x + maxicons*(ICONSIZE+ICONSEP) - ICONSEP + 2;
        !           498:        rect.corner.y = rect.origin.y + ICONSIZE + CHARHEIGHT + 6;
        !           499:        rectf(&display, rect, F_CLR);
        !           500: }
        !           501: 
        !           502: /* process a host message */
        !           503: get(){
        !           504:        register int ch;
        !           505:        register struct nodedef *n;
        !           506:        struct nodedef *nodeptr();
        !           507: #      define MAGIC '_'
        !           508: 
        !           509:        ch = hostchar();
        !           510:        if (ch == MAGIC) {
        !           511: 
        !           512:                /* this is probably a message from the host half of sysmon */
        !           513:                ch = hostchar();
        !           514:                switch(ch){
        !           515:                case 'V':
        !           516:                        while ((ch = hostchar()) != -1) {
        !           517:                                n = nodeptr(ch);
        !           518:                                getvec(n);
        !           519:                        }
        !           520:                        break;
        !           521:                case 'L':
        !           522:                        while ((ch = hostchar()) != -1) {
        !           523:                                n = nodeptr(ch);
        !           524:                                drawload(n);
        !           525:                                getload(n);
        !           526:                                drawload(n);
        !           527:                        }
        !           528:                        break;
        !           529:                case 'T':
        !           530:                        drawtime();
        !           531:                        gettime();
        !           532:                        drawtime();
        !           533:                        break;
        !           534:                case 'M':
        !           535:                        n = nodeptr(hostchar());
        !           536:                        drawmail(n);
        !           537:                        getmail(n);
        !           538:                        drawmail(n);
        !           539:                        break;
        !           540:                case 'I':
        !           541:                        geticon();
        !           542:                        drawicon();
        !           543:                        break;
        !           544:                case 'N':
        !           545:                        getname();
        !           546:                        reshape(0);
        !           547:                        break;
        !           548:                case 'Q':
        !           549:                        icon = balloc(Rect(0, 0, ICONSIZE, ICONSIZE));
        !           550:                        ticon = balloc(Rect(0, 0, ICONSIZE, ICONSIZE));
        !           551:                        if (!icon || !ticon) {
        !           552:                                reshape("Not enough memory for faces.");
        !           553:                                sendnchars(2, "R\n");           /* refuse faces */
        !           554:                                break;
        !           555:                        }
        !           556:                        sendnchars(2, "A\n");           /* accept faces */
        !           557:                        haveicons = 1;
        !           558:                        reshape(0);
        !           559:                        break;
        !           560:                case 'R':
        !           561:                        remove(hostchar()-'0');
        !           562:                        reshape(0);
        !           563:                        break;
        !           564:                case -1:
        !           565:                        return;
        !           566:                default:
        !           567:                        writecw(ch);
        !           568:                        break;
        !           569:                }
        !           570:        } else {
        !           571:                writecw(ch);
        !           572:        }
        !           573:        ignorerest();
        !           574: }
        !           575: 
        !           576: struct nodedef *
        !           577: nodeptr(c)
        !           578:        int c;
        !           579: {
        !           580:        register i;
        !           581: 
        !           582:        i = c - '0';
        !           583:        if (i < 0 || i >= nodes)
        !           584:                i = 0;
        !           585:        return node[i];
        !           586: }
        !           587: 
        !           588: getvec(n)
        !           589:        struct nodedef *n;
        !           590: {
        !           591:        register int i, sum, nsum, vec[5];
        !           592: 
        !           593:        for(sum=0,i=0; i<5; i++)
        !           594:                sum += (vec[i] = hostchar());
        !           595:        sum = sum ? sum : 1;
        !           596:        for(nsum=0,i=0; i<4; i++)
        !           597:                nsum += n->vec[i] = ((long)(vec[i])*size) / sum;
        !           598:        n->vec[4]=size-nsum;
        !           599: }
        !           600: 
        !           601: gettime()
        !           602: {
        !           603:        register char *p=time;
        !           604:        register int c, i=0;
        !           605: 
        !           606:        while((c = hostchar()) != -1 && ++i < TIMELEN) 
        !           607:                *p++ = c;
        !           608:        *p=0;
        !           609: }
        !           610: 
        !           611: getload(n)
        !           612:        struct nodedef *n;
        !           613: {
        !           614:        register char *p=n->load;
        !           615:        register int i=0;
        !           616: 
        !           617:        while((*p = hostchar()) != '\t' && ++i < LOADLEN)
        !           618:                p++;
        !           619:        *p=0;
        !           620: }
        !           621: 
        !           622: getname()
        !           623: {
        !           624:        register char *p;
        !           625:        register int c, i=0;
        !           626: 
        !           627:        if (nodes != 0) {
        !           628:                node[nodes] = (struct nodedef *)alloc(sizeof (struct nodedef));
        !           629:                if (!node[nodes]) {
        !           630:                        reshape("out of memory");
        !           631:                        sendnchars(2, "R\n");           /* refuse connection */
        !           632:                        return;
        !           633:                }
        !           634:        }
        !           635:        sendnchars(2, "A\n");                           /* accept connection */
        !           636:        p = node[nodes]->name;
        !           637:        while((c = hostchar()) != -1 && ++i < NAMELEN)
        !           638:                *p++ = c;
        !           639:        *p=0;
        !           640:        nodes++;
        !           641: }
        !           642: 
        !           643: remove(ind)
        !           644:        register int ind;
        !           645: {
        !           646:        if (ind < 0 || ind >= nodes)
        !           647:                return;
        !           648:        free (node[ind]);
        !           649:        for (; ind < nodes-1; ind++)
        !           650:                node[ind] = node[ind+1];
        !           651:        nodes--;
        !           652: }
        !           653: 
        !           654: getmail(n)
        !           655:        struct nodedef *n;
        !           656: {
        !           657:        register char *p=n->mail;
        !           658:        register int c, i=0;
        !           659: 
        !           660:        while((c = hostchar()) != -1 && ++i < MAILLEN)
        !           661:                *p++ = c;
        !           662:        upfront(P->layer);
        !           663:        ringbell ();
        !           664:        *p=0;
        !           665: }
        !           666: 
        !           667: geticon()
        !           668: {
        !           669:        register int c, i, j;
        !           670:        register short *ip;
        !           671: 
        !           672:        /* once per scan line */
        !           673:        ip = (short *)icon->base;
        !           674:        for (i = 0; i < ICONSIZE; i++) {
        !           675: 
        !           676:                /* once per short */
        !           677:                for (j = 0; j < ICONSIZE/16; j++) {
        !           678:                        c = hostchar();
        !           679:                        *ip = (c<<8) | hostchar();
        !           680: #ifndef        mc68000
        !           681:                        if (VALSCREENCOLOR==0)
        !           682:                                *ip = ~*ip;
        !           683: #endif mc68000
        !           684:                        ip++;
        !           685:                }
        !           686: 
        !           687: #ifndef        mc68000
        !           688:                /* blit and 5620 have different size bitmaps */
        !           689:                ip++;
        !           690: #endif mc68000
        !           691:        }
        !           692: }
        !           693: 
        !           694: int atend = 0;         /* non-zero if at end of message */
        !           695: 
        !           696: hostchar(){
        !           697:        register int c;
        !           698: 
        !           699:        if (atend)
        !           700:                return -1;
        !           701: 
        !           702:        if((c=rcvchar())==-1)
        !           703:                wait(RCV), c=rcvchar();
        !           704: 
        !           705:        if (c == '\n') {
        !           706: 
        !           707:                /* newline's mark end of message */
        !           708:                atend = 1;
        !           709:                return -1;
        !           710:        } else if (c == '\\') {
        !           711: 
        !           712:                /* backslashes are character escapes */
        !           713:                if ((c=rcvchar())==-1)
        !           714:                        wait(RCV), c=rcvchar();
        !           715:        }
        !           716: 
        !           717:        return c&0xff;
        !           718: }
        !           719: 
        !           720: ignorerest()
        !           721: {
        !           722:        while (hostchar() != -1)
        !           723:                ;
        !           724:        atend = 0;
        !           725: }
        !           726: 
        !           727: 
        !           728: #ifdef mc68000
        !           729: ringbell ()
        !           730: {
        !           731:        *((char *)(384*1024L+062)) = 2;
        !           732: }
        !           733: #endif mc68000
        !           734: 
        !           735: /*
        !           736:  *     The rest of jerqmon.c contains routines to create and update the
        !           737:  *     communications window.
        !           738:  */ 
        !           739: #define        INSET   4
        !           740: #define        C_NEW   2
        !           741: 
        !           742: makecw()
        !           743: {
        !           744:        register Rectangle r;
        !           745:        register unsigned char *pout;
        !           746: 
        !           747:        /* first see if the process already exists */
        !           748:        if (cwp != 0 && cwp->state != 0)
        !           749:                return 0;
        !           750:        else
        !           751:                cwp = 0;
        !           752: 
        !           753:        /* create process */
        !           754:        r = Drect;
        !           755:        if(!(cwp=newproc((struct Proc *)0)))
        !           756:                return -1;
        !           757:        cwp->rect=inset(r, INSET);
        !           758:        if( !rectclip(&cwp->rect,Jrect) || !(cwp->layer=newlayer(r))){
        !           759:                cwp->state=0;
        !           760:                return -1;
        !           761:        }
        !           762: 
        !           763:        /* give it a window */
        !           764: #ifndef mc68000
        !           765:        muxnewwind(cwp, C_NEW);
        !           766: #else
        !           767:        mpxnewwind(cwp, C_NEW);
        !           768: #endif mc68000
        !           769: 
        !           770:        /* wait for a prompt */
        !           771:        pout = cwp->cbufpout;
        !           772:        do sleep( 60 ); while( pout == cwp->cbufpout );
        !           773:        ringbell();
        !           774: 
        !           775:        return 0;
        !           776: }
        !           777: 
        !           778: /*
        !           779:  *     Write a string to the communications window.  Create the
        !           780:  *     window if it has disappeared.
        !           781:  */
        !           782: writecw(c)
        !           783:        register int c;
        !           784: {
        !           785:        if (makecw() < 0) {
        !           786:                drawmail(node[0]);
        !           787:                getmail(node[0], "can't open comm window\n");
        !           788:                drawmail(node[0]);
        !           789:                return;
        !           790:        }
        !           791:        do {
        !           792:                if (cwp->state) {
        !           793:                        upfront(cwp->layer);
        !           794:                        while (cwp->nchars < CBSIZE*3) {
        !           795:                                *(cwp->cbufpin++) = c != -1 ? c : '\n';
        !           796:                                cwp->nchars++;
        !           797:                                if (cwp->cbufpin >= &(cwp->cbuf[CBSIZE*3]))
        !           798:                                        cwp->cbufpin = cwp->cbuf;
        !           799:                                if (c == -1)
        !           800:                                        break;
        !           801:                                c = hostchar();
        !           802:                        }
        !           803:                        cwp->state |= WAKEUP;
        !           804:                        sleep (10);
        !           805:                } else
        !           806:                        return;
        !           807:        } while (c != -1);
        !           808: }

unix.superglobalmegacorp.com

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