home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 239.lha / amiga / src / client / loadav.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-05-02  |  5.9 KB  |  288 lines

  1.  
  2. /*
  3.  *  LOADAV.C
  4.  *
  5.  *  DNET (c)Copyright 1988, Matthew Dillon, All Rights Reserved.
  6.  *
  7.  *  LOADAV  [frequency]     Connect to remote UNIX system and display
  8.  *                load average.  Default is every 5 minutes.
  9.  *
  10.  *  frequency in seconds, default is every 60 seconds
  11.  *
  12.  */
  13.  
  14. #include <stdio.h>
  15. #include <local/typedefs.h>
  16. #include "/dnet/channel.h"
  17. #include "/server/servers.h"
  18. #include <local/deemu.h>
  19.  
  20. short Deemu[] = {
  21.     DMSTRT, 0, 0,
  22.     DMNW  , 0, 10, 2, 2, -80, 40, 0xFFFF,
  23.     DMEND , 0, 0
  24. };
  25.  
  26. #define DMNWOFF 4
  27.  
  28. #define NA  0
  29. #define GWIDTH    (sizeof(Graph)/sizeof(Graph[0]))
  30. #define GDEPTH    (sizeof(GMap)/sizeof(GMap[0]))
  31. #define GMASK    (GWIDTH-1)
  32.  
  33. uword    GMax[] = { 2*256, 50 };
  34. uword    GIncr[]= { 2*256, 20 };
  35. uword    GMap[2] = { 0, 1 };
  36. uword    Graph[1024][GDEPTH];    /*  5Min,#users.       */
  37. uword    Gi;
  38.  
  39. ubyte    Scr[128];
  40. ubyte    Initial;
  41.  
  42. ubyte Title[128];
  43.  
  44. extern void updatewindow();
  45.  
  46. NW Nw = {
  47.     0, 0, 320, 50, -1, -1,
  48.     NEWSIZE|CLOSEWINDOW,
  49.     WINDOWSIZING|WINDOWDRAG|WINDOWDEPTH|WINDOWCLOSE|NOCAREREFRESH,
  50.     NULL, NULL, Title, NULL, NULL,
  51.     32, 18, -1, -1, WBENCHSCREEN
  52. };
  53.  
  54. WIN *Win;
  55. RP  *Rp;
  56.  
  57. int Enable_Abort;
  58.  
  59. long IntuitionBase;
  60. long GfxBase;
  61.  
  62. main(ac,av)
  63. char *av[];
  64. {
  65.     long chan = NULL;
  66.     short numsecs = 60;
  67.     long n;
  68.     long imask, tmask, dmask, mask;
  69.     char notdone = 1;
  70.     char *host = NULL;
  71.     PORT *TimPort = CreatePort(NULL, 0);
  72.     IOT Iot;
  73.  
  74.     sprintf(Title, "LoadAv V%s%s", VERSION, LOADAV_VERSION);
  75.     {
  76.     register short i;
  77.     for (i = 1; i < ac; ++i) {
  78.         if (strncmp(av[i], "-N", 2) == 0) {
  79.         host = av[i]+2;
  80.         continue;
  81.         }
  82.         numsecs = atoi(av[i]);
  83.     }
  84.     }
  85.  
  86.  
  87.     Iot.tr_node.io_Device = NULL;
  88.  
  89.     if (OpenDevice("timer.device", UNIT_VBLANK, &Iot, 0))
  90.     goto fail;
  91.     Iot.tr_node.io_Command = TR_ADDREQUEST;
  92.     Iot.tr_node.io_Message.mn_ReplyPort = TimPort;
  93.     Iot.tr_time.tv_micro = 1;
  94.     Iot.tr_time.tv_secs  = 0;
  95.     SendIO(&Iot);
  96.  
  97.     Enable_Abort = 0;
  98.     IntuitionBase = (long)OpenLibrary("intuition.library", 0);
  99.     GfxBase = (long)OpenLibrary("graphics.library", 0);
  100.  
  101.     chan = DOpen(host, PORT_LOADAV, 25, 25);
  102.     if (chan == NULL) {
  103.     puts("no connect");
  104.     goto fail;
  105.     }
  106.     InitDeemuNW(Deemu+DMNWOFF, &Nw);
  107.     Win = OpenWindow(&Nw);
  108.     if (Win == NULL) {
  109.     puts("Unable to open window");
  110.     goto fail;
  111.     }
  112.     Rp = Win->RPort;
  113.     imask   = 1 << Win->UserPort->mp_SigBit;
  114.     dmask   = 1 << ((PORT *)chan)->mp_SigBit;
  115.     tmask   = 1 << TimPort->mp_SigBit;
  116.  
  117.     clearwindow();
  118.     while (notdone) {
  119.     mask = Wait(imask|dmask|tmask|SIGBREAKF_CTRL_C);
  120.     if (mask & SIGBREAKF_CTRL_C)
  121.         notdone = 0;
  122.     if (mask & imask) {
  123.         IMESS *im;
  124.         while (im = GetMsg(Win->UserPort)) {
  125.         switch(im->Class) {
  126.         case NEWSIZE:
  127.             clearwindow();
  128.             break;
  129.         case CLOSEWINDOW:
  130.             notdone = 0;
  131.             break;
  132.         }
  133.         ReplyMsg(im);
  134.         }
  135.     }
  136.     if (mask & dmask) {
  137.         char dummy;
  138.         if ((dummy = DNRead(chan, &dummy, 1)) != 0)
  139.         notdone = 0;
  140.     }
  141.     while (mask & tmask) {      /*  while just so we can break */
  142.         char len = 0;
  143.  
  144.         if (GetMsg(TimPort)) {
  145.         Iot.tr_time.tv_micro = 0;
  146.         Iot.tr_time.tv_secs  = numsecs;
  147.         SendIO(&Iot);
  148.         if (DWrite(chan, &len, 1) == 1 && DRead(chan, &len, 1) == 1) {
  149.             if (len < sizeof(Title) && DRead(chan, Title, len) == len) {
  150.             Title[len] = 0;
  151.             updatewindow(Title);
  152.             SetWindowTitles(Win, Title, -1);
  153.             break;
  154.             }
  155.         }
  156.         notdone = 0;
  157.         }
  158.         break;
  159.     }
  160.     }
  161.  
  162. fail:
  163.     if (Iot.tr_node.io_Device) {
  164.     AbortIO(&Iot);
  165.     WaitIO(&Iot);
  166.     CloseDevice(&Iot);
  167.     }
  168.     DeletePort(TimPort);
  169.     if (Win)
  170.     CloseWindow(Win);
  171.     if (chan)
  172.     DClose(chan);
  173.     if (IntuitionBase)
  174.     CloseLibrary(IntuitionBase);
  175.     if (GfxBase)
  176.     CloseLibrary(GfxBase);
  177. }
  178.  
  179. /*
  180.  *  Graphics routines.    ************************************************
  181.  */
  182.  
  183. short WOx, WOy, Ww, Wh;
  184.  
  185. clearwindow()
  186. {
  187.     short i, j, d;
  188.  
  189.     WOx = Win->BorderLeft;
  190.     WOy = Win->BorderTop;
  191.     Ww    = Win->Width - Win->BorderRight - Win->BorderLeft;
  192.     Wh    = Win->Height- Win->BorderTop    - Win->BorderBottom;
  193.  
  194.     SetAPen(Rp, 0);
  195.     RectFill(Rp, WOx, WOy, Ww + WOx, Wh + WOy);
  196.     WOx += 2;
  197.     WOy += 2;
  198.     Ww    -= 4;
  199.     Wh    -= 4;
  200.  
  201.     /*
  202.      *    Redraw the graph.  Scale values relative to GMax[?] and Wh.
  203.      *
  204.      *    ypos = (WOy + Wh) - (Wh * value / GMax[d])
  205.      *
  206.      */
  207.  
  208.     for (d = 0; d < GDEPTH; ++d) {
  209.     char move = 1;
  210.     SetAPen(Rp, (d & 1) ? 3 : 1);
  211.     for (i = Ww - 1, j = Gi - 1; i >= 0; --i, --j) {
  212.         uword value = Wh * Graph[j&GMASK][d] / GMax[GMap[d]];
  213.         (move) ?
  214.         Move(Rp, WOx + i, WOy + Wh - value - 1) :
  215.         Draw(Rp, WOx + i, WOy + Wh - value - 1)
  216.         ;
  217.         move = 0;
  218.     }
  219.     }
  220. }
  221.  
  222. /*
  223.  *  5:44pm up 2 days, 22:30, 37 users, load average: 5.98, 7.93, 7.97
  224.  *              7 mins,
  225.  */
  226.  
  227. void
  228. updatewindow(str)
  229. char *str;
  230. {
  231.     short d;
  232.     char refresh = 0;
  233.     uword ary[GDEPTH];
  234.     int n;
  235.  
  236.     {
  237.     long nusers, i1, f1, i5, f5;
  238.     register char *ptr = str;
  239.  
  240.     while (strncmp(ptr, "users", 5) && *ptr)
  241.         ++ptr;
  242.     while (*--ptr == ' ' && ptr != str)
  243.         --ptr;
  244.     while (*--ptr != ' ' && ptr != str)
  245.         --ptr;
  246.     nusers = atoi(ptr+1);
  247.     while (strncmp(ptr, "load", 4) && *ptr)
  248.         ++ptr;
  249.     sscanf(ptr, "load average: %ld.%ld, %ld.%ld,",
  250.         &i1, &f1, &i5, &f5
  251.     );
  252.     /*
  253.     ary[0] = (i1 << 8) | ((f1 << 8) / 100);
  254.     */
  255.     ary[0] = (i5 << 8) | ((f5 << 8) / 100);
  256.     ary[1] = nusers;
  257.     }
  258.     for (d = 0; d < GDEPTH; ++d) {
  259.     while (ary[d] > GMax[GMap[d]] && ary[d] < 65000) {
  260.         GMax[GMap[d]] += GIncr[GMap[d]];
  261.         refresh = 1;
  262.     }
  263.     Graph[Gi][d] = ary[d];
  264.     }
  265.     if (!Initial) {
  266.     short i;
  267.     Initial = 1;
  268.     for (i = 0; i < GWIDTH; ++i) {
  269.         for (d = 0; d < GDEPTH; ++d)
  270.         Graph[i][d] = Graph[Gi][d];
  271.     }
  272.     }
  273.     Gi = (Gi + 1) & GMASK;
  274.     if (refresh) {
  275.     clearwindow();
  276.     return;
  277.     }
  278.     ScrollRaster(Rp, 1, 0, WOx, WOy, WOx + Ww - 1, WOy + Wh - 1);
  279.     for (d = 0; d < GDEPTH; ++d) {
  280.     uword value1 = Wh * Graph[(Gi-2)&GMASK][d] / GMax[GMap[d]];
  281.     uword value2 = Wh * Graph[(Gi-1)&GMASK][d] / GMax[GMap[d]];
  282.     SetAPen(Rp, (d & 1) ? 3 : 1);
  283.     Move(Rp, Ww + WOx - 2, WOy + Wh - value1 - 1);
  284.     Draw(Rp, Ww + WOx - 1, WOy + Wh - value2 - 1);
  285.     }
  286. }
  287.  
  288.