Annotation of 43BSDReno/contrib/isode-beta/others/image/xwho.c, revision 1.1.1.1

1.1       root        1: /* xwho.c - who for X windows */
                      2: 
                      3: #ifndef        lint
                      4: static char *rcsid = "$Header: /f/osi/others/image/RCS/xwho.c,v 7.0 89/11/23 22:00:06 mrose Rel $";
                      5: #endif
                      6: 
                      7: /* 
                      8:  * $Header: /f/osi/others/image/RCS/xwho.c,v 7.0 89/11/23 22:00:06 mrose Rel $
                      9:  *
                     10:  *
                     11:  * $Log:       xwho.c,v $
                     12:  * Revision 7.0  89/11/23  22:00:06  mrose
                     13:  * Release 6.0
                     14:  * 
                     15:  */
                     16: 
                     17: /*
                     18:  *                               NOTICE
                     19:  *
                     20:  *    Acquisition, use, and distribution of this module and related
                     21:  *    materials are subject to the restrictions of a license agreement.
                     22:  *    Consult the Preface in the User's Manual for the full terms of
                     23:  *    this agreement.
                     24:  *
                     25:  */
                     26: 
                     27: 
                     28: #include <stdio.h>
                     29: #include "imagesbr.h"
                     30: #include <X11/Xlib.h>
                     31: #include <X11/Xutil.h>
                     32: #include "rwhod.h"
                     33: #include <netdb.h>
                     34: #include <sys/file.h>
                     35: #include "usr.dirent.h"
                     36: 
                     37: 
                     38: #define        NHOSTS  100
                     39: 
                     40: /*    DATA */
                     41: 
                     42: int    debug = 0;
                     43: int    errsw = 0;
                     44: static int  sleepsw = 60;
                     45: 
                     46: static char  *host_list[NHOSTS + 1];   /* Hosts to (not) list */
                     47: static char **host_end = host_list;
                     48: static int    dont_list = 0;
                     49: 
                     50: static char *myname = "xwho";
                     51: 
                     52: 
                     53: static char *display = NULL;
                     54: static char *geometry = NULL;
                     55: 
                     56: /*  */
                     57: 
                     58: typedef struct _frame {
                     59:     short x, y;
                     60:     unsigned int width, height;
                     61:     unsigned int bdrwidth;
                     62:     unsigned long border;
                     63:     unsigned long background;
                     64: }      OpaqueFrame;
                     65: 
                     66: static Display *DISP;
                     67: static int     SCRN;
                     68: 
                     69: static int    mapped;
                     70: 
                     71: static Window mywindow;
                     72: static OpaqueFrame myframe;
                     73: 
                     74: static char *fontname = "6x10";
                     75: static XFontStruct *myfont;
                     76: 
                     77: static int  bwidth;
                     78: static XSizeHints hints;
                     79: static XSetWindowAttributes xswattrs;
                     80: static unsigned long xswattrs_mask;
                     81: 
                     82: static unsigned long backpix, bdrpix;
                     83: static GC  forepix, highpix;
                     84: 
                     85: 
                     86: struct face {
                     87:     char    f_name[8 + 1];
                     88:     int            f_active;
                     89: 
                     90:     int            f_update;
                     91:     Window     f_window;
                     92:     OpaqueFrame f_frame;
                     93: 
                     94:     struct type_IMAGE_Image *f_imap;
                     95: 
                     96:     struct face *f_next;
                     97: };
                     98: 
                     99: 
                    100: struct host {
                    101:     char    h_name[32 + 1];
                    102:     int            h_up;
                    103: 
                    104:     int            h_update;
                    105:     char    h_string[32 + 2];
                    106:     Window  h_window;
                    107:     GC     h_gc;
                    108:     int     h_ascent;
                    109:     OpaqueFrame h_frame;
                    110: 
                    111:     struct face *h_faces;
                    112: 
                    113:     struct host *h_next;
                    114: };
                    115: 
                    116: static int largest_h, largest_w;
                    117: 
                    118: static struct host *hosts;
                    119: 
                    120: 
                    121: long   time ();
                    122: 
                    123: /*    MAIN */
                    124: 
                    125: /* ARGSUSED */
                    126: 
                    127: main (argc, argv, envp)
                    128: int    argc;
                    129: char  **argv,
                    130:       **envp;
                    131: {
                    132:     int            nfds;
                    133:     fd_set  rfds;
                    134: 
                    135:     arginit (argv);
                    136: 
                    137:     if (errsw)
                    138:        errsw = NOTOK;
                    139: 
                    140:     update_X ();
                    141:     
                    142:     FD_ZERO (&rfds);
                    143:     nfds = ConnectionNumber (DISP) + 1;
                    144:     FD_SET (ConnectionNumber (DISP), &rfds);
                    145:     for (;;) {
                    146:        fd_set  ifds;
                    147: 
                    148:        ifds = rfds;
                    149:        (void) xselect (nfds, &ifds, NULLFD, NULLFD, sleepsw);
                    150:        
                    151:        update_X ();
                    152:     }
                    153: }
                    154: 
                    155: /*    ARGINIT */
                    156: 
                    157: arginit (vec)
                    158: char  **vec;
                    159: {
                    160:     int            n,
                    161:            nhosts;
                    162:     register char  *ap,
                    163:                   *cp,
                    164:                   *lp;
                    165:     register struct hostent *hp;
                    166: 
                    167:     if (myname = rindex (*vec, '/'))
                    168:        myname++;
                    169:     if (myname == NULL || *myname == NULL)
                    170:        myname = *vec;
                    171: 
                    172:     isodetailor (myname, 1);
                    173:     lp = NULL;
                    174: 
                    175:     nhosts = 0;
                    176:     for (vec++; ap = *vec; vec++)
                    177:        if (*ap == '-')
                    178:            switch (*++ap) {
                    179:                case 'd':
                    180:                    debug++;
                    181:                    break;
                    182: 
                    183:                case 'e': 
                    184:                    errsw++;
                    185:                    break;
                    186: 
                    187:                case 'l':
                    188:                    if ((lp = *++vec) == NULL)
                    189:                        adios (NULLCP, "usage: %s -h local_dit", myname);
                    190:                    break;
                    191: 
                    192:                case 'r':
                    193:                    recording++;
                    194:                    break;
                    195: 
                    196:                case 's':
                    197:                    if ((ap = *++vec) == NULL
                    198:                            || sscanf (ap, "%d", &sleepsw) != 1
                    199:                            || sleepsw < 1)
                    200:                        adios (NULLCP, "usage: %s -s seconds", myname);
                    201:                    break;
                    202: 
                    203:                case 'n':
                    204:                    dont_list++;
                    205:                    break;
                    206: 
                    207:                default: 
                    208:                    adios (NULLCP, "unknown switch -%s", ap);
                    209:            }
                    210:        else
                    211:            if (*ap == '=')
                    212:                geometry = ap;
                    213:            else
                    214:                if ((cp = rindex (ap, ':')) && sscanf (++cp, "%d", &n) == 1)
                    215:                    display = ap;
                    216:                else {
                    217:                    if (nhosts++ >= NHOSTS)
                    218:                        adios (NULLCP, "too many hosts");
                    219: 
                    220:                    if ((hp = gethostbyname (ap)) == NULL)
                    221:                        adios (NULLCP, "%s: unknown host", ap);
                    222:                    if ((ap = malloc ((unsigned) (strlen (hp -> h_name) + 1)))
                    223:                            == NULL)
                    224:                        adios (NULLCP, "out of memory");
                    225: 
                    226:                    (void) strcpy (*host_end++ = ap, hp -> h_name);
                    227:                }
                    228: 
                    229:     init_aka (myname, 1, lp);
                    230: 
                    231:     if (debug)
                    232:        ll_dbinit (pgm_log, myname);
                    233:     else
                    234:        ll_hdinit (pgm_log, myname);
                    235:     (void) ll_open (pgm_log);
                    236: 
                    237:     if ((DISP = XOpenDisplay (display)) == NULL)
                    238:        adios (NULLCP, "unable to open display \"%s\"",
                    239:                XDisplayName (display));
                    240:     SCRN = DefaultScreen (DISP);
                    241: 
                    242:     forepix = XCreateGC (DISP, RootWindow (DISP, SCRN), 0L, (XGCValues *)NULL);
                    243:     highpix = XCreateGC (DISP, RootWindow (DISP, SCRN), 0L, (XGCValues *)NULL);
                    244:     XCopyGC (DISP, DefaultGC (DISP, SCRN), (1L<<(GCLastBit+1)) - 1, forepix);
                    245:     XCopyGC (DISP, DefaultGC (DISP, SCRN), (1L<<(GCLastBit+1)) - 1, highpix);
                    246:     if ((cp = XGetDefault (DISP, myname, "ReverseVideo"))
                    247:            && strcmp (cp, "on") == 0) {
                    248:        XSetForeground(DISP, forepix, WhitePixel(DISP, SCRN));
                    249:        XSetForeground(DISP, highpix, WhitePixel(DISP, SCRN));
                    250:        backpix = BlackPixel(DISP, SCRN);
                    251:        bdrpix  = WhitePixel(DISP, SCRN);
                    252:        XSetFunction(DISP, forepix, GXcopyInverted);
                    253:        XSetFunction(DISP, highpix, GXand);
                    254:     }
                    255:     else {
                    256:        XSetForeground(DISP, forepix, BlackPixel(DISP, SCRN));
                    257:        XSetForeground(DISP, highpix, BlackPixel(DISP, SCRN));
                    258:        backpix = WhitePixel(DISP, SCRN);
                    259:        bdrpix  = BlackPixel(DISP, SCRN);
                    260:        XSetFunction(DISP, forepix, GXcopy);
                    261:        XSetFunction(DISP, highpix, GXor);
                    262:     }
                    263: 
                    264:     XSetBackground (DISP, forepix, backpix);
                    265:     XSetBackground (DISP, highpix, backpix);
                    266: 
                    267:     if (cp = XGetDefault (DISP, myname, "BorderWidth"))
                    268:        bwidth = atoi (cp);
                    269:     else
                    270:        bwidth = 2;
                    271: 
                    272:     if (cp = XGetDefault (DISP, myname, "BodyFont"))
                    273:        fontname = cp;
                    274:     myfont = XLoadQueryFont (DISP, fontname);
                    275: }
                    276: 
                    277: /*    XWINDOWS */
                    278: 
                    279: static update_X ()
                    280: {
                    281:     register struct host   *hp;
                    282:     register struct face   *fp;
                    283:     XGCValues gcvalues;
                    284: 
                    285:     service_X ();
                    286: 
                    287:     if (mywindow && !mapped)
                    288:        return;
                    289: 
                    290:     read_X ();
                    291: 
                    292:     layout_X ();
                    293: 
                    294:     if (mywindow == NULL)
                    295:        init_X ();
                    296: 
                    297:     for (hp = hosts; hp; hp = hp -> h_next) {
                    298:        if (hp -> h_update && display_this_host (hp -> h_name)) {
                    299:            if (hp -> h_window) {
                    300:                XFreeGC (DISP, hp -> h_gc);
                    301:                XDestroyWindow (DISP, hp -> h_window);
                    302:            }
                    303: 
                    304:            if (debug)
                    305:                fprintf (stderr, "%s: %dx%d+%d+%d/%d\n",
                    306:                        hp -> h_name, hp -> h_frame.width,
                    307:                        hp -> h_frame.height, hp -> h_frame.x,
                    308:                        hp -> h_frame.y, hp -> h_frame.bdrwidth);
                    309:            hp -> h_window = XCreateSimpleWindow (DISP, mywindow,
                    310:                                        hp -> h_frame.x,
                    311:                                        hp -> h_frame.y,
                    312:                                        hp -> h_frame.width,
                    313:                                        hp -> h_frame.height,
                    314:                                        hp -> h_frame.bdrwidth,
                    315:                                        hp -> h_frame.border,
                    316:                                        hp -> h_frame.background);
                    317: 
                    318:            XSelectInput (DISP, hp -> h_window, ExposureMask);
                    319: 
                    320:            XMapWindow (DISP, hp -> h_window);
                    321: 
                    322:            gcvalues.foreground = bdrpix;
                    323:            gcvalues.background = backpix;
                    324:            gcvalues.font = myfont -> fid;
                    325:            hp -> h_gc = XCreateGC (DISP, hp -> h_window,
                    326:                                    GCForeground | GCBackground | GCFont,
                    327:                                    &gcvalues);
                    328:        }
                    329: 
                    330:        for (fp = hp -> h_faces; fp; fp = fp -> f_next)
                    331:            if (fp -> f_update) {
                    332:                if (fp -> f_window)
                    333:                    XDestroyWindow (DISP, fp -> f_window);
                    334: 
                    335:                if (debug)
                    336:                    fprintf (stderr, "%s: %dx%d+%d+%d/%d\n",
                    337:                            fp -> f_name, fp -> f_frame.width,
                    338:                            fp -> f_frame.height, fp -> f_frame.x,
                    339:                            fp -> f_frame.y, fp -> f_frame.bdrwidth);
                    340:                fp -> f_window = XCreateSimpleWindow(DISP, mywindow,
                    341:                                        fp -> f_frame.x,
                    342:                                        fp -> f_frame.y,
                    343:                                        fp -> f_frame.width,
                    344:                                        fp -> f_frame.height,
                    345:                                        fp -> f_frame.bdrwidth,
                    346:                                        fp -> f_frame.border,
                    347:                                        fp -> f_frame.background);
                    348: 
                    349:                XSelectInput (DISP, fp -> f_window, ExposureMask);
                    350: 
                    351:                XMapWindow (DISP, fp -> f_window);
                    352:            }
                    353:     }
                    354: 
                    355:     service_X ();
                    356: }
                    357: 
                    358: /*  */
                    359: 
                    360: static int  service_X ()
                    361: {
                    362:     int            wh,
                    363:            ww;
                    364:     register Window w;
                    365:     register struct face   *fp;
                    366:     register struct host   *hp;
                    367:     XEvent xevent;
                    368:     register XEvent *xe = &xevent;
                    369: 
                    370:     while (XPending (DISP)) {
                    371:        XNextEvent (DISP, xe);
                    372: 
                    373:        switch (xe -> type) {
                    374:            case Expose: 
                    375:                if ((w = ((XExposeEvent *) xe) -> window) == mywindow) {
                    376:                    display_top ();
                    377:                    break;
                    378:                }
                    379: 
                    380:                for (hp = hosts; hp; hp = hp -> h_next) {
                    381:                    if (!display_this_host (hp -> h_name))
                    382:                        continue;
                    383: 
                    384:                    if (hp -> h_window == w) {
                    385:                        display_host (hp);
                    386:                        break;
                    387:                    }
                    388: 
                    389:                    for (fp = hp -> h_faces; fp; fp = fp -> f_next)
                    390:                        if (fp -> f_window == w)
                    391:                            break;
                    392:                    if (fp) {
                    393:                        display_face (fp);
                    394:                        break;
                    395:                    }
                    396:                }
                    397:                break;
                    398: 
                    399:            case MapNotify:
                    400:                if (debug)
                    401:                    fprintf (stderr, "MapNotify\n");
                    402:                mapped = 1;
                    403:                display_top ();
                    404:                break;
                    405: 
                    406:            case ConfigureNotify:
                    407:                if (debug)
                    408:                    fprintf (stderr, "ConfigureNotify %dx%d\n",
                    409:                             ((XConfigureEvent *) xe) -> height,
                    410:                             ((XConfigureEvent *) xe) -> width);
                    411:                if (((XConfigureEvent *) xe) -> window == mywindow
                    412:                        && (wh = ((XConfigureEvent *) xe) -> height) > 0
                    413:                        && (ww = ((XConfigureEvent *) xe) -> width) > 0)
                    414:                    myframe.height = wh, myframe.width = ww;
                    415:                break;
                    416:                
                    417:            case UnmapNotify:
                    418:                if (debug)
                    419:                    fprintf (stderr, "UnmapNotify\n");
                    420:                mapped = 0;
                    421:                break;
                    422: 
                    423:            case ReparentNotify:
                    424:                if (debug)
                    425:                    fprintf (stderr, "ReparentNotify\n");
                    426:                break;
                    427: 
                    428:            default: 
                    429:                if (debug)
                    430:                    fprintf (stderr, "Event %d\n", xe -> type);
                    431:                break;
                    432:        }
                    433:     }
                    434: }
                    435: 
                    436: /*  */
                    437: 
                    438: static init_X ()
                    439: {
                    440:     char    def[BUFSIZ];
                    441: 
                    442:     myframe.bdrwidth = bwidth;
                    443:     myframe.height = largest_h + 100;
                    444:     if (myframe.height + bwidth * 2 > DisplayHeight (DISP, SCRN))
                    445:        myframe.height = DisplayHeight (DISP, SCRN) - bwidth * 2;
                    446:     myframe.width = largest_w + 100;
                    447:     if (myframe.width + bwidth * 2 > DisplayWidth (DISP, SCRN))
                    448:        myframe.width = DisplayWidth (DISP, SCRN) - bwidth * 2;
                    449:     myframe.x = DisplayWidth (DISP, SCRN) - (myframe.width + bwidth * 2);
                    450:     myframe.y = 0;
                    451:     (void) sprintf (def, "=%dx%d+%d+%d", myframe.width, myframe.height,
                    452:                    myframe.x, myframe.y);
                    453: 
                    454:     if (debug)
                    455:        fprintf (stderr, "def: %s, myframe: =%dx%d+%d+%d/%d\n", def,
                    456:                 myframe.width, myframe.height, myframe.x, myframe.y,
                    457:                 myframe.bdrwidth);
                    458: 
                    459:     hints.width = largest_w + 100;
                    460:     hints.height = largest_h + 100;
                    461:     hints.x = hints.y = 0;
                    462:     hints.flags = PSize | PPosition;
                    463: 
                    464:     xswattrs.border_pixel = bdrpix;
                    465:     xswattrs.background_pixel = backpix;
                    466:     xswattrs_mask = CWBackPixel | CWBorderPixel;
                    467: 
                    468:     mywindow = XCreateWindow (DISP, RootWindow (DISP, SCRN),
                    469:                              myframe.x, myframe.y,
                    470:                              myframe.width, myframe.height,
                    471:                              myframe.bdrwidth,
                    472:                              0, InputOutput, (Visual *) CopyFromParent,
                    473:                              xswattrs_mask, &xswattrs);
                    474: 
                    475:     XSetStandardProperties (DISP, mywindow, myname, "X Who", None,
                    476:                            (char **) 0, 0, &hints);
                    477: 
                    478:     XSelectInput (DISP, mywindow, ExposureMask | StructureNotifyMask);
                    479: 
                    480:     XMapWindow (DISP, mywindow);
                    481:     mapped = 0;
                    482: }
                    483: 
                    484: /*  */
                    485: 
                    486: static layout_X ()
                    487: {
                    488:     int     h;
                    489:     register struct face   *fp;
                    490:     register struct host   *hp;
                    491:     XCharStruct mychar;
                    492: 
                    493:     h = largest_w = 0;
                    494: 
                    495:     for (hp = hosts; hp; hp = hp -> h_next) {
                    496:        int     hh,
                    497:                hw;
                    498: 
                    499:        hh = hw = 0;
                    500:        if (hp -> h_window == NULL || hp -> h_frame.y != h) {
                    501:            int     direction_return,
                    502:                    font_ascent_return,
                    503:                    font_descent_return;
                    504: 
                    505:            hp -> h_frame.bdrwidth = 2;
                    506:            XTextExtents (myfont, hp -> h_string, strlen (hp -> h_string),
                    507:                          &direction_return, &font_ascent_return,
                    508:                          &font_descent_return, &mychar);
                    509:            hp -> h_ascent = mychar.ascent;
                    510:            hp -> h_frame.height = mychar.ascent + mychar.descent;
                    511:            hp -> h_frame.border = backpix;
                    512:            hp -> h_frame.background = backpix;
                    513:            hp -> h_frame.x = 0;
                    514:            hp -> h_frame.y = h;
                    515:            hp -> h_update = 1;
                    516:        }
                    517:        else
                    518:            hp -> h_update = 0;
                    519:        h += hp -> h_frame.height + 2 * hp -> h_frame.bdrwidth;
                    520: 
                    521:        for (fp = hp -> h_faces; fp; fp = fp -> f_next)
                    522:            if (fp -> f_imap && fp -> f_imap -> height > hh)
                    523:                hh = fp -> f_imap -> height;
                    524: 
                    525:        for (fp = hp -> h_faces; fp; fp = fp -> f_next)
                    526:            if (fp -> f_imap) {
                    527:                if (fp -> f_window == NULL
                    528:                        || fp -> f_frame.height != hh
                    529:                        || fp -> f_frame.width != fp -> f_imap -> width
                    530:                        || fp -> f_frame.x != hw
                    531:                        || fp -> f_frame.y != h) {
                    532:                    fp -> f_frame.bdrwidth = bwidth;
                    533:                    fp -> f_frame.height = hh;
                    534:                    fp -> f_frame.width = fp -> f_imap -> width;
                    535:                    fp -> f_frame.border = backpix;
                    536:                    fp -> f_frame.background = backpix;
                    537:                    fp -> f_frame.x = hw;
                    538:                    fp -> f_frame.y = h;
                    539: 
                    540:                    fp -> f_update = 1;
                    541:                }
                    542:                else
                    543:                    fp -> f_update = 0;
                    544: 
                    545:                hw += fp -> f_imap -> width + bwidth * 2;
                    546:            }
                    547:            else
                    548:                fp -> f_update = 0;
                    549:        if (hw > largest_w)
                    550:            largest_w = hw;
                    551:        if (hp -> h_frame.width > largest_w)
                    552:            largest_w = hp -> h_frame.width;
                    553: 
                    554:        if (hw > 0)
                    555:            h += hh + 2;
                    556:        else {
                    557:            h -= hp -> h_frame.height + 2 * hp -> h_frame.bdrwidth;
                    558:            hp -> h_update = 0;
                    559:            if (hp -> h_window) {
                    560:                XFreeGC (DISP, hp -> h_gc);
                    561:                XDestroyWindow (DISP, hp -> h_window);
                    562:                hp -> h_window = NULL;
                    563:            }
                    564:        }
                    565:     }
                    566: 
                    567:     largest_h = h;
                    568: }
                    569: 
                    570: /*  */
                    571: 
                    572: static display_top ()
                    573: {
                    574:     if (debug)
                    575:        fprintf (stderr, "top window\n");
                    576: }
                    577: 
                    578: 
                    579: static display_host (hp)
                    580: register struct host *hp;
                    581: {
                    582:     if (debug)
                    583:        fprintf (stderr, "%s:\n", hp -> h_name);
                    584: 
                    585:     XDrawImageString (DISP, hp -> h_window, hp -> h_gc, 0, hp -> h_ascent,
                    586:                 hp -> h_string, strlen (hp -> h_string));
                    587: }
                    588: 
                    589: /*  */
                    590: 
                    591: static display_face (fp)
                    592: register struct face *fp;
                    593: {
                    594:     int     sx,
                    595:             sy,
                    596:             dx,
                    597:             dy;
                    598:     unsigned int    h,
                    599:                    w;
                    600:     register struct type_IMAGE_Image *im = fp -> f_imap;
                    601:     register OpaqueFrame *xm = &fp -> f_frame;
                    602:     XImage *image;
                    603:     
                    604:     sx = max (im -> width - (int) xm -> width, 0) / 2;
                    605:     sy = max (im -> height - (int) xm -> height, 0) / 2;
                    606:     dx = max ((int) xm -> width - im -> width, 0) / 2;
                    607:     dy = max ((int) xm -> height - im -> height, 0) / 2;
                    608:     w = min (xm -> width, im -> width);
                    609:     h = min (xm -> height, im -> height);
                    610: 
                    611:     if (debug) {
                    612:        fprintf (stderr, "im: %dx%d frame:%dx%d\n",
                    613:                 im -> width, im -> height, xm -> width, xm -> height);
                    614:        fprintf (stderr, "sx=%d sy=%d dx=%d dy=%d w=%d h=%d\n",
                    615:                sx, sy, dx, dy, w, h);
                    616:     }
                    617: 
                    618:     image = XCreateImage (DISP, DefaultVisual (DISP, SCRN), 1, XYBitmap, 0,
                    619:                          im -> data -> qb_forw -> qb_data,
                    620:                          (unsigned int) im -> width,
                    621:                          (unsigned int) im -> height, 8, 0);
                    622:     if (image == NULL)
                    623:        adios (NULLCP, "XCreateImage failed");
                    624:     image -> byte_order = image -> bitmap_bit_order = LSBFirst;
                    625:     XClearWindow (DISP, fp -> f_window);
                    626:     XPutImage (DISP, fp -> f_window, forepix, image, sx, sy, dx, dy, w, h);
                    627: 
                    628:     XDestroyImage (image);
                    629: }
                    630: 
                    631: /*  */
                    632: 
                    633: static int facecmp (f1, f2)
                    634: struct face **f1,
                    635:            **f2;
                    636: {
                    637:     return strcmp ((*f1) -> f_name, (*f2) -> f_name);
                    638: }
                    639: 
                    640: 
                    641: static int hostcmp (h1, h2)
                    642: struct host **h1,
                    643:            **h2;
                    644: {
                    645:     return strcmp ((*h1) -> h_name, (*h2) -> h_name);
                    646: }
                    647: 
                    648: 
                    649: static read_X ()
                    650: {
                    651:     int            fd,
                    652:            n;
                    653:     long    now;
                    654:     register struct dirent *dp;
                    655:     register struct face *fp,
                    656:                        **fpp;
                    657:     register struct host *hp,
                    658:                        **hpp;
                    659:     struct whod wds;
                    660:     register struct whod *wd = &wds;
                    661:     register struct whoent *we;
                    662:     static DIR *dd = NULL;
                    663: 
                    664:     (void) time (&now);
                    665:     for (hp = hosts; hp; hp = hp -> h_next) {
                    666:        hp -> h_up = 0;
                    667:        for (fp = hp -> h_faces; fp; fp = fp -> f_next)
                    668:            fp -> f_active = 0;
                    669:     }
                    670:        
                    671:     if (dd == NULL) {
                    672:        if (chdir ("/usr/spool/rwho") == NOTOK)
                    673:            adios ("/usr/spool/rwho", "unable to change directory to");
                    674: 
                    675:        if ((dd = opendir (".")) == NULL)
                    676:            adios ("/usr/spool/rwho", "unable to read");
                    677:     }
                    678:     else
                    679:        rewinddir (dd);
                    680: 
                    681:     while (dp = readdir (dd)) {
                    682:        if (dp -> d_ino == 0 || strncmp (dp -> d_name, "whod.", 5) != 0)
                    683:            continue;
                    684: 
                    685:        if ((fd = open (dp -> d_name, O_RDONLY)) == NOTOK)
                    686:            continue;
                    687:        n = read (fd, (char *) wd, sizeof *wd);
                    688:        (void) close (fd);
                    689:        if ((n -= sizeof *wd - sizeof wd -> wd_we) < 0)
                    690:            continue;
                    691: 
                    692:        if (now - wd -> wd_recvtime > 5 * 60 || n < sizeof *we)
                    693:            continue;
                    694: 
                    695:        for (hp = hosts; hp; hp = hp -> h_next)
                    696:            if (strncmp (hp -> h_name, wd -> wd_hostname,
                    697:                        sizeof wd -> wd_hostname) == 0)
                    698:                break;
                    699:        if (hp == NULL) {
                    700:            if ((hp = (struct host *) calloc (1, sizeof *hp)) == NULL)
                    701:                adios (NULLCP, "out of memory");
                    702:            hp -> h_next = hosts;
                    703:            hosts = hp;
                    704: 
                    705:            (void) strncpy (hp -> h_name, wd -> wd_hostname,
                    706:                    sizeof wd -> wd_hostname);
                    707:            (void) sprintf (hp -> h_string, "%s:", hp -> h_name);
                    708:            hp -> h_frame.width = XTextWidth (myfont, hp -> h_string,
                    709:                                              strlen (hp -> h_string));
                    710:        }
                    711: 
                    712:        hp -> h_up = 1;
                    713: 
                    714:        for (we = wd -> wd_we, n = n / sizeof *we; n > 0; we++, n--) {
                    715:            if (we -> we_idle > 60 * 60)
                    716:                continue;
                    717: 
                    718:            for (fp = hp -> h_faces; fp; fp = fp -> f_next)
                    719:                if (strncmp (fp -> f_name, we -> we_utmp.out_name,
                    720:                            sizeof we -> we_utmp.out_name) == 0)
                    721:                    break;
                    722:            if (fp == NULL) {
                    723:                if ((fp = (struct face *) calloc (1, sizeof *fp)) == NULL)
                    724:                    adios (NULLCP, "out of memory");
                    725:                fp -> f_next = hp -> h_faces;
                    726:                hp -> h_faces = fp;
                    727: 
                    728:                (void) strncpy (fp -> f_name, we -> we_utmp.out_name,
                    729:                        sizeof we -> we_utmp.out_name);
                    730: 
                    731:                if (display_this_host (hp -> h_name)
                    732:                        && (fp -> f_imap = fetch_image (fp -> f_name, NULLCP))
                    733:                                    == NULL) {
                    734:                    if (recording)
                    735:                        LLOG (pgm_log, LLOG_NOTICE,
                    736:                              ("no image for \"%s\" \"%s\"",
                    737:                               hp -> h_name, fp -> f_name));
                    738:                }
                    739:            }
                    740: 
                    741:            fp -> f_active = 1;
                    742:        }
                    743:     }
                    744: 
                    745:     for (hpp = &hosts; hp = *hpp;) {
                    746:        for (fpp = &hp -> h_faces; fp = *fpp;) {
                    747:            if (!hp -> h_up || !fp -> f_active) {
                    748:                *fpp = fp -> f_next;
                    749:                if (fp -> f_window)
                    750:                    XDestroyWindow (DISP, fp -> f_window);
                    751:                free ((char *) fp);
                    752:                continue;
                    753:            }
                    754: 
                    755:            fpp = &fp -> f_next;
                    756:        }
                    757: 
                    758:        if (!hp -> h_up || hp -> h_faces == NULL) {
                    759:            *hpp = hp -> h_next;
                    760:            if (hp -> h_window) {
                    761:                XFreeGC (DISP, hp -> h_gc);
                    762:                XDestroyWindow (DISP, hp -> h_window);
                    763:            }
                    764:            free ((char *) hp);
                    765:        }
                    766:        else
                    767:            hpp = &hp -> h_next;
                    768:     }
                    769: 
                    770:     {
                    771:        register int    i;
                    772:        register struct host **hq;
                    773: 
                    774:        i = 0;
                    775:        for (hp = hosts; hp; hp = hp -> h_next) {
                    776:            register int j;
                    777:            register struct face **fq;
                    778: 
                    779:            i++, j = 0;
                    780:            for (fp = hp -> h_faces; fp; fp = fp -> f_next)
                    781:                j++;
                    782:            if (j > 1) {
                    783:                register struct face **faces;
                    784: 
                    785:                if ((faces = (struct face **)
                    786:                                calloc ((unsigned) j, sizeof *faces)) == NULL)
                    787:                    continue;
                    788:                for (fp = hp -> h_faces, fq = faces;
                    789:                        *fq = fp;
                    790:                        fp = fp -> f_next, fq++)
                    791:                    continue;
                    792:                qsort ((char *) faces, j, sizeof *faces, facecmp);
                    793:                for (fq = faces, fpp = &hp -> h_faces;
                    794:                        *fpp = *fq;
                    795:                        fq++, fpp = &(*fpp) -> f_next)
                    796:                    continue;
                    797: 
                    798:                free ((char *) faces);
                    799:            }
                    800:        }
                    801: 
                    802:        if (i > 1) {
                    803:            register struct host **hostz;
                    804: 
                    805:            if ((hostz = (struct host **)
                    806:                            calloc ((unsigned) i, sizeof *hostz)) == NULL)
                    807:                goto out;
                    808:            for (hp = hosts, hq = hostz; *hq = hp; hp = hp -> h_next, hq++)
                    809:                continue;
                    810:            qsort ((char *) hostz, i, sizeof *hostz, hostcmp);
                    811:            for (hq = hostz, hpp = &hosts;
                    812:                    *hpp = *hq;
                    813:                    hq++, hpp = &(*hpp) -> h_next)
                    814:                continue;
                    815: 
                    816:            free ((char *) hostz);
                    817:        }
                    818:     }
                    819: 
                    820: out: ;
                    821: }
                    822: 
                    823: /*  */
                    824: 
                    825: static int  display_this_host (n)
                    826: register char *n;
                    827: {
                    828:     register char **ap;
                    829: 
                    830:     if (host_list == host_end)
                    831:        return 1;
                    832: 
                    833:     for (ap = host_list; ap < host_end; ap++)
                    834:        if (strcmp (*ap, n) == 0)
                    835:            return (!dont_list);
                    836: 
                    837:     return dont_list;
                    838: }

unix.superglobalmegacorp.com

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