reorganize window management to allow display routines to set
authorSam Leffler <sam@ucbvax.Berkeley.EDU>
Mon, 3 Oct 1983 12:46:13 +0000 (04:46 -0800)
committerSam Leffler <sam@ucbvax.Berkeley.EDU>
Mon, 3 Oct 1983 12:46:13 +0000 (04:46 -0800)
up optimal window definitions

SCCS-vsn: usr.bin/systat/Makefile 1.3
SCCS-vsn: usr.bin/systat/fetch.c 1.3
SCCS-vsn: usr.bin/systat/main.c 1.4
SCCS-vsn: usr.bin/systat/mbufs.c 1.2
SCCS-vsn: usr.bin/systat/pigs.c 1.4
SCCS-vsn: usr.bin/systat/swap.c 1.5
SCCS-vsn: usr.bin/systat/systat.h 1.2

usr/src/usr.bin/systat/Makefile
usr/src/usr.bin/systat/fetch.c
usr/src/usr.bin/systat/main.c
usr/src/usr.bin/systat/mbufs.c
usr/src/usr.bin/systat/pigs.c
usr/src/usr.bin/systat/swap.c
usr/src/usr.bin/systat/systat.h

index 829dfa7..2af7ae0 100644 (file)
@@ -1,7 +1,8 @@
-#       Makefile     1.2     83/10/02
+#       Makefile     1.3     83/10/02
 DESTDIR=
 CFLAGS= -O
 DESTDIR=
 CFLAGS= -O
-OBJS=   main.o fetch.o pigs.o swap.o mbufs.o
+OBJS=  cmds.o cmdtab.o fetch.o iostat.o keyboard.o main.o \
+       mbufs.o pigs.o swap.o
 LIBS=   -lcurses -ltermlib -lm
 
 systat: ${OBJS}
 LIBS=   -lcurses -ltermlib -lm
 
 systat: ${OBJS}
@@ -12,6 +13,7 @@ fetch.o:systat.h
 pigs.o:        systat.h
 swap.o:        systat.h
 mbufs.o:systat.h
 pigs.o:        systat.h
 swap.o:        systat.h
 mbufs.o:systat.h
+iostat.o:systat.h
 
 install: systat
        install -s systat ${DESTDIR}/usr/lfl/bin/systat
 
 install: systat
        install -s systat ${DESTDIR}/usr/lfl/bin/systat
index 6d11748..13a4e2a 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)fetch.c    1.2 (Lucasfilm) %G%";
+static char sccsid[] = "@(#)fetch.c    1.3 (Lucasfilm) %G%";
 #endif
 
 #include "systat.h"
 #endif
 
 #include "systat.h"
@@ -72,6 +72,9 @@ getcmd(pid, mproc)
         return (cmd);
 }
 
         return (cmd);
 }
 
+static int argaddr;
+static int pcbpf;
+
 getu(mproc)
         register struct proc *mproc;
 {
 getu(mproc)
         register struct proc *mproc;
 {
index 94bdab4..c3d747c 100644 (file)
@@ -1,44 +1,14 @@
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)main.c     1.3 (Lucasfilm) %G%";
+static char sccsid[] = "@(#)main.c     1.4 (Lucasfilm) %G%";
 #endif
 
 #include "systat.h"
 
 #endif
 
 #include "systat.h"
 
-struct nlist nlst[] = {
-#define X_PROC          0
-        { "_proc" },
-#define X_NPROC         1
-        { "_nproc" },
-#define X_CCPU          2
+static struct nlist nlst[] = {
+#define X_CCPU          0
         { "_ccpu" },
         { "_ccpu" },
-#define X_AVENRUN       3
+#define X_AVENRUN       1
         { "_avenrun" },
         { "_avenrun" },
-#define X_USRPTMAP      4
-        { "_Usrptmap" },
-#define X_USRPT         5
-        { "_usrpt" },
-#define X_NSWAP         6
-        { "_nswap" },
-#define X_SWAPMAP       7
-        { "_swapmap" },
-#define X_NSWAPMAP      8
-        { "_nswapmap" },
-#define X_DMMIN         9
-        { "_dmmin" },
-#define X_DMMAX         10
-        { "_dmmax" },
-#define X_NSWDEV        11
-        { "_nswdev" },
-#define        X_SWDEVT        12
-       { "_swdevt" },
-#define        X_NTEXT         13
-       { "_ntext" },
-#define        X_TEXT          14
-       { "_text" },
-#define        X_DMTEXT        15
-       { "_dmtext" },
-#define        X_MBSTAT        16
-       { "_mbstat" },
         { "" }
 };
 
         { "" }
 };
 
@@ -51,44 +21,10 @@ int     die();
 int     display();
 int     suspend();
 
 int     display();
 int     suspend();
 
-int     showpigs(), openpigs(), fetchpigs(), labelpigs(), initpigs();
-int     showswap(), fetchswap(), labelswap(), initswap();
-int    showmbufs(), fetchmbufs(), labelmbufs(), initmbufs();
-#ifdef notdef
-int     showuser(), openuser(), fetchuser(), labeluser(), inituser();
-int     shownet(), opennet(), fetchnet(), labelnet(), initnet();
-#endif
-
-struct  cmdtab {
-        char    *c_name;
-        int     (*c_refresh)();
-        int     (*c_open)();
-        int     (*c_fetch)();
-        int     (*c_label)();
-       int     (*c_init)();
-       char    c_flags;
-} cmdtab[] = {
-        { "pigs",       showpigs,       openpigs,       fetchpigs,
-          labelpigs,   initpigs },
-        { "swap",       showswap,       openpigs,       fetchswap,
-          labelswap,   initswap },
-        { "mbufs",     showmbufs,      openpigs,       fetchmbufs,
-          labelmbufs,  initmbufs },
-#ifdef notdef
-        { "user",       showuser,       openuser,       fetchuser,
-          labeluser,   inituser },
-        { "net",        shownet,        opennet,        fetchnet,
-          labelnet,    initnet },
-#endif
-        { "" }
-};
-struct  cmdtab *curcmd = &cmdtab[0];
-
 main(argc, argv)
         int argc;
         char **argv;
 {
 main(argc, argv)
         int argc;
         char **argv;
 {
-        char ch, line[80];
 
        argc--, argv++;
        while (argc > 0) {
 
        argc--, argv++;
        while (argc > 0) {
@@ -112,14 +48,44 @@ main(argc, argv)
                argc--, argv++;
        }
         nlist("/vmunix", nlst);
                argc--, argv++;
        }
         nlist("/vmunix", nlst);
-        (*curcmd->c_open)();
+       if (nlst[X_CCPU].n_type == 0) {
+               fprintf(stderr, "Couldn't namelist /vmunix.\n");
+               exit(1);
+       }
+       kmemf = "/dev/kmem";
+       kmem = open(kmemf, O_RDONLY);
+       if (kmem < 0) {
+               perror(kmemf);
+               exit(1);
+       }
+       memf = "/dev/mem";
+       mem = open(memf, O_RDONLY);
+       if (mem < 0) {
+               perror(memf);
+               exit(1);
+       }
+       swapf = "/dev/drum";
+       swap = open(swapf, O_RDONLY);
+       if (swap < 0) {
+               perror(swapf);
+               exit(1);
+       }
         signal(SIGINT, die);
         signal(SIGQUIT, die);
         signal(SIGTERM, die);
 
         signal(SIGINT, die);
         signal(SIGQUIT, die);
         signal(SIGTERM, die);
 
-        /* Initialize curses. */
+        /*
+        * Initialize display.  Load average appears in standard
+        * window with current display's overlapping sub-window
+        * maintained by the display routines to minimize update
+        * work by curses.
+        */
         initscr();
         initscr();
-        wnd = newwin(20, 70, 3, 5);
+       wnd = (*curcmd->c_open)();
+       if (wnd == NULL) {
+               fprintf(stderr, "Couldn't initialize display.\n");
+               die();
+       }
 
 #ifdef notdef
         gethostname(hostname, sizeof (hostname));
 
 #ifdef notdef
         gethostname(hostname, sizeof (hostname));
@@ -127,6 +93,8 @@ main(argc, argv)
         lseek(kmem, nlst[X_CCPU].n_value, 0);
         read(kmem, &ccpu, sizeof (ccpu));
         lccpu = log(ccpu);
         lseek(kmem, nlst[X_CCPU].n_value, 0);
         read(kmem, &ccpu, sizeof (ccpu));
         lccpu = log(ccpu);
+       (*curcmd->c_init)();
+       curcmd->c_flags = 1;
         labels();
 
         known[0].k_uid = -1;
         labels();
 
         known[0].k_uid = -1;
@@ -139,166 +107,8 @@ main(argc, argv)
         display();
         noecho();
         crmode();
         display();
         noecho();
         crmode();
-        for (;;) {
-                col = 0;
-                move(22, 0);
-                do {
-                        refresh();
-                        ch = getch() & 0177;
-                        if (ch == 0177 && ferror(stdin)) {
-                                clearerr(stdin);
-                                continue;
-                        }
-                        if (ch >= 'A' && ch <= 'Z')
-                                ch += 'a' - 'A';
-                        if (col == 0) {
-#define        mask(s) (1 << ((s) - 1))
-                                if (ch == CTRL(l)) {
-                                       int oldmask = sigblock(mask(SIGALRM));
-
-                                       wrefresh(curscr);
-                                       sigsetmask(oldmask);
-                                        continue;
-                                }
-                                if (ch != ':')
-                                        continue;
-                                move(22, 0);
-                                clrtoeol();
-                        }
-                        if (ch == _tty.sg_erase && col > 0) {
-                                if (col == 1 && line[0] == ':')
-                                        continue;
-                                col--;
-                                goto doerase;
-                        }
-                        if (ch == CTRL(w) && col > 0) {
-                                while (--col >= 0 && isspace(line[col]))
-                                        ;
-                                col++;
-                                while (--col >= 0 && !isspace(line[col]))
-                                        if (col == 0 && line[0] == ':')
-                                                break;
-                                col++;
-                                goto doerase;
-                        }
-                        if (ch == _tty.sg_kill && col > 0) {
-                                col = 0;
-                                if (line[0] == ':')
-                                        col++;
-                doerase:
-                                move(22, col);
-                                clrtoeol();
-                                continue;
-                        }
-                        if (isprint(ch)) {
-                                line[col] = ch;
-                                mvaddch(22, col, ch);
-                                col++;
-                        }
-                } while (col == 0 || (ch != '\r' && ch != '\n'));
-                line[col] = '\0';
-                command(line + 1);
-        }
-}
-
-command(cmd)
-        char *cmd;
-{
-        register char *cp;
-        register struct cmdtab *p;
-        char *arg;
-
-        for (cp = cmd; *cp && !isspace(*cp); cp++)
-                ;
-        if (*cp)
-                *cp++ = '\0';
-        if (strcmp(cmd, "quit") == 0)
-                die();
-        if (strcmp(cmd, "status") == 0 || strcmp(cmd, "help") == 0) {
-                status();
-                return;
-        }
-       if (strcmp(cmd, "load") == 0) {
-               lseek(kmem, nlst[X_AVENRUN].n_value, L_SET);
-               read(kmem, &lave, sizeof (lave));
-               mvprintw(22, 0, "%4.1f", lave);
-               clrtoeol();
-               return;
-       }
-        for (p = cmdtab; *p->c_name; p++)
-                if (strcmp(cmd, p->c_name) == 0)
-                        break;
-        if (*p->c_name) {
-                if (curcmd == p)
-                        return;
-                alarm(0);
-                curcmd = p;
-               clear(); wclear(wnd);
-               labels();
-                display();
-                status();
-                return;
-        }
-        if (strcmp(cmd, "stop") == 0) {
-                alarm(0);
-                mvaddstr(22, 0, "Refresh disabled.");
-                clrtoeol();
-                return;
-        }
-        /* commands with arguments */
-        for (; *cp && isspace(*cp); cp++)
-                ;
-        if (strcmp(cmd, "start") == 0) {
-                int x;
-
-                if (*cp == '\0')
-                        x = naptime;
-                else
-                        x = atoi(cp);
-                if (x <= 0) {
-                        mvprintw(22, 0, "%d: bad interval.", x);
-                        clrtoeol();
-                        return;
-                }
-                alarm(0);
-                naptime = x;
-                display();
-                status();
-                return;
-        }
-       if (*cmd) {
-               mvprintw(22, 0, "%s: Unknown command.", cmd);
-               clrtoeol();
-       }
-}
-
-status()
-{
-
-        mvprintw(22, 0, "Showing %s, refresh every %d seconds.",
-          curcmd->c_name, naptime);
-        clrtoeol();
-}
-
-suspend()
-{
-        int oldmask;
-
-       alarm(0);
-        move(22, 0);
-        refresh();
-        echo();
-        nocrmode();
-        signal(SIGTSTP, SIG_DFL);
-        oldmask = sigsetmask(0);
-        kill(getpid(), SIGTSTP);
-        sigsetmask(oldmask);
-        signal(SIGTSTP, suspend);
-        crmode();
-        noecho();
-        move(22, col);
-        wrefresh(curscr);
-       alarm(naptime);
+       keyboard();
+       /*NOTREACHED*/
 }
 
 labels()
 }
 
 labels()
@@ -321,10 +131,6 @@ display()
         /* Get the load average over the last minute. */
         lseek(kmem, nlst[X_AVENRUN].n_value, L_SET);
         read(kmem, &lave, sizeof (lave));
         /* Get the load average over the last minute. */
         lseek(kmem, nlst[X_AVENRUN].n_value, L_SET);
         read(kmem, &lave, sizeof (lave));
-       if (curcmd->c_flags == 0) {
-               (*curcmd->c_init)();
-               curcmd->c_flags = 1;
-       }
         (*curcmd->c_fetch)();
         j = 5.0*lave + 0.5;
         dellave -= lave;
         (*curcmd->c_fetch)();
         j = 5.0*lave + 0.5;
         dellave -= lave;
@@ -350,6 +156,15 @@ display()
         alarm(naptime);
 }
 
         alarm(naptime);
 }
 
+load()
+{
+
+       lseek(kmem, nlst[X_AVENRUN].n_value, L_SET);
+       read(kmem, &lave, sizeof (lave));
+       mvprintw(22, 0, "%4.1f", lave);
+       clrtoeol();
+}
+
 die()
 {
 
 die()
 {
 
index 0ad6776..558436a 100644 (file)
@@ -1,33 +1,38 @@
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)mbufs.c    1.1 (Lucasfilm) %G%";
+static char sccsid[] = "@(#)mbufs.c    1.2 (Lucasfilm) %G%";
 #endif
 
 #include "systat.h"
 #include <sys/mbuf.h>
 
 #endif
 
 #include "systat.h"
 #include <sys/mbuf.h>
 
-#define        X_MBSTAT        16
-
-struct mbstat *mb;
-
-initmbufs()
+WINDOW *
+openmbufs()
 {
 {
+       static WINDOW *w = NULL;
 
 
-       if (mb == 0)
-               mb = (struct mbstat *)calloc(1, sizeof (*mb));
+       if (w == NULL)
+               w = newwin(20, 70, 3, 5);
+       return (w);
 }
 
 }
 
-fetchmbufs()
+closembufs(w)
+       WINDOW *w;
 {
 
 {
 
-       lseek(kmem, nlst[X_MBSTAT].n_value, L_SET);
-       read(kmem, mb, sizeof (*mb));
+       if (w == NULL)
+               return;
+       move(5, 0);
+       clrtobot();
+       wclear(w);
+       wrefresh(w);
 }
 
 }
 
+struct mbstat *mb;
+
 labelmbufs()
 {
 
 labelmbufs()
 {
 
-        move(5, 0);
-        clrtoeol();
+        move(5, 0); clrtoeol();
         mvaddstr(5, 20,
                 "/0   /5   /10  /15  /20  /25  /30  /35  /40  /45  /50");
 }
         mvaddstr(5, 20,
                 "/0   /5   /10  /15  /20  /25  /30  /35  /40  /45  /50");
 }
@@ -84,3 +89,32 @@ showmbufs()
                wclrtoeol(wnd);
        }
 }
                wclrtoeol(wnd);
        }
 }
+
+static struct nlist nlst[] = {
+#define        X_MBSTAT        0
+       { "_mbstat" },
+        { "" }
+};
+
+initmbufs()
+{
+
+       if (nlst[X_MBSTAT].n_type == 0) {
+               nlist("/vmunix", nlst);
+               if (nlst[X_MBSTAT].n_type == 0) {
+                       error("namelist on /vmunix failed");
+                       return;
+               }
+       }
+       if (mb == 0)
+               mb = (struct mbstat *)calloc(1, sizeof (*mb));
+}
+
+fetchmbufs()
+{
+
+       if (nlst[X_MBSTAT].n_type == 0)
+               return;
+       lseek(kmem, nlst[X_MBSTAT].n_value, L_SET);
+       read(kmem, mb, sizeof (*mb));
+}
index 221d8ba..65d1d6f 100644 (file)
@@ -1,9 +1,31 @@
 #ifndef lint
 #ifndef lint
-static char sccsid[] = "@(#)pigs.c     1.3 (Lucasfilm) %G%";
+static char sccsid[] = "@(#)pigs.c     1.4 (Lucasfilm) %G%";
 #endif
 
 #include "systat.h"
 
 #endif
 
 #include "systat.h"
 
+WINDOW *
+openpigs()
+{
+       static WINDOW *w = NULL;
+
+       if (w == NULL)
+               w = newwin(20, 70, 3, 5);
+        return (w);
+}
+
+closepigs(w)
+       WINDOW *w;
+{
+
+       if (w == NULL)
+               return;
+       move(5, 20);
+       clrtobot();
+       wclear(w);
+       wrefresh(w);
+}
+
 showpigs()
 {
         register short auid;
 showpigs()
 {
         register short auid;
@@ -14,6 +36,8 @@ showpigs()
         register struct users *knptr;
         char *getpname(), *pnamp;
 
         register struct users *knptr;
         char *getpname(), *pnamp;
 
+       if (pt == NULL)
+               return;
         /* Accumulate the percent of cpu per user. */
         ptptr = pt;
         numprocs = 0;
         /* Accumulate the percent of cpu per user. */
         ptptr = pt;
         numprocs = 0;
@@ -103,40 +127,28 @@ showpigs()
         }
 }
 
         }
 }
 
-openpigs()
-{
-
-        kmemf = "/dev/kmem";
-        kmem = open(kmemf, 0);
-        if (kmem < 0) {
-                perror(kmemf);
-                exit(1);
-        }
-        memf = "/dev/mem";
-        mem = open(memf, 0);
-        if (mem < 0) {
-                perror(memf);
-                exit(1);
-        }
-        swapf = "/dev/drum";
-        swap = open(swapf, 0);
-        if (swap < 0) {
-                perror(swapf);
-                exit(1);
-        }
-}
-
-/* these don't belong here */
+static struct nlist nlst[] = {
 #define X_PROC          0
 #define X_PROC          0
+        { "_proc" },
 #define X_NPROC         1
 #define X_NPROC         1
-#define X_USRPTMAP      4
-#define X_USRPT         5
-
-struct proc *kprocp;
+        { "_nproc" },
+#define X_USRPTMAP      2
+        { "_Usrptmap" },
+#define X_USRPT         3
+        { "_usrpt" },
+        { "" }
+};
 
 initpigs()
 {
 
 
 initpigs()
 {
 
+       if (nlst[X_PROC].n_type == 0) {
+               nlist("/vmunix", nlst);
+               if (nlst[X_PROC].n_type == 0) {
+                       error("namelist on /vmunix failed");
+                       return;
+               }
+       }
         if (procp == NULL) {
                 procp = getw(nlst[X_PROC].n_value);
                 nproc = getw(nlst[X_NPROC].n_value);
         if (procp == NULL) {
                 procp = getw(nlst[X_PROC].n_value);
                 nproc = getw(nlst[X_NPROC].n_value);
@@ -158,6 +170,8 @@ fetchpigs()
         register float time;
         register struct proc *pp;
 
         register float time;
         register struct proc *pp;
 
+       if (nlst[X_PROC].n_type == 0)
+               return;
        if (kprocp == NULL) {
                kprocp = (struct proc *)calloc(nproc, sizeof (struct proc));
                if (kprocp == NULL)
        if (kprocp == NULL) {
                kprocp = (struct proc *)calloc(nproc, sizeof (struct proc));
                if (kprocp == NULL)
@@ -188,8 +202,7 @@ fetchpigs()
 labelpigs()
 {
 
 labelpigs()
 {
 
-        move(5, 0);
-        clrtoeol();
+        move(5, 0); clrtoeol();
         mvaddstr(5, 20,
                 "/0   /10  /20  /30  /40  /50  /60  /70  /80  /90  /100");
 }
         mvaddstr(5, 20,
                 "/0   /10  /20  /30  /40  /50  /60  /70  /80  /90  /100");
 }
index bd776a6..a5e167a 100644 (file)
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)swap.c      1.4 (Lucasfilm) %G%";
+static char *sccsid = "@(#)swap.c      1.5 (Lucasfilm) %G%";
 #endif
 
 #include "systat.h"
 
 #endif
 
 #include "systat.h"
 
-#include <sys/map.h>
-#include <sys/conf.h>
-#include <sys/text.h>
-
-/* these don't belong here */
-#define X_PROC          0
-#define X_NPROC         1
-#define X_USRPTMAP      4
-#define X_USRPT         5
-#define X_NSWAP         6
-#define X_DMMIN         9
-#define X_DMMAX         10
-#define X_NSWDEV        11
-#define        X_SWDEVT        12
-#define        X_NTEXT         13
-#define        X_TEXT          14
-#define        X_DMTEXT        15
-
-int    dmmin;
-int    dmmax;
-int    dmtext;
-int    nswdev;
-#define        MAXSWAPDEV      4
-short  buckets[MAXSWAPDEV][NDMAP];
-struct swdevt *swdevt;
-struct proc *kprocp;
-int    ntext;
-int    textaddr;
-struct text *xtext;
-
-initswap()
+WINDOW *
+openswap()
 {
 {
+       static WINDOW *w = NULL;
 
 
-        if (nswdev == 0) {
-                dmmin = getw(nlst[X_DMMIN].n_value);
-                dmmax = getw(nlst[X_DMMAX].n_value);
-                dmtext = getw(nlst[X_DMTEXT].n_value);
-                nswdev = getw(nlst[X_NSWDEV].n_value);
-               swdevt = (struct swdevt *)calloc(nswdev, sizeof (*swdevt));
-               klseek(kmem, nlst[X_SWDEVT].n_value, L_SET);
-               read(kmem, swdevt, nswdev * sizeof (struct swdevt));
-               ntext = getw(nlst[X_NTEXT].n_value);
-               textaddr = getw(nlst[X_TEXT].n_value);
-        }
-        if (procp == NULL) {
-                procp = getw(nlst[X_PROC].n_value);
-                nproc = getw(nlst[X_NPROC].n_value);
-        }
-       if (xtext == NULL)
-               xtext = (struct text *)calloc(ntext, sizeof (struct text));
-       if (kprocp == NULL)
-                kprocp = (struct proc *)calloc(nproc, sizeof (struct proc));
-        if (usrpt != NULL)
-                return;
-       usrpt = (struct pte *)nlst[X_USRPT].n_value;
-       Usrptma = (struct pte *)nlst[X_USRPTMAP].n_value;
-       if (pt == NULL)
-               pt = (struct p_times *)malloc(nproc * sizeof (struct p_times));
+        if (w == NULL)
+               w = newwin(20, 70, 3, 5);
+       return (w);
 }
 
 }
 
-fetchswap()
+closeswap(w)
+       WINDOW *w;
 {
 
 {
 
-       if (kprocp == NULL) {
-                kprocp = (struct proc *)malloc(sizeof (*kprocp) * nproc);
-               if (kprocp == NULL)
-                       return;
-       }
-        lseek(kmem, procp, L_SET);
-        if (read(kmem, kprocp, sizeof (struct proc) * nproc) !=
-           sizeof (struct proc) * nproc) {
-               error("couldn't read proc table");
+       if (w == NULL)
                return;
                return;
-       }
-       if (xtext == NULL) {
-               xtext = (struct text *)calloc(ntext, sizeof (struct text));
-               if (xtext == NULL)
-                       return;
-       }
-       lseek(kmem, textaddr, L_SET);
-       if (read(kmem, xtext, ntext * sizeof (struct text)) !=
-           sizeof (struct text) * ntext)
-               error("couldn't read text table");
+       move(5, 0);
+       clrtobot();
+       wclear(w);
+       wrefresh(w);
 }
 
 }
 
-#ifdef vax
-char   *devnames[] =
-     { "hp", "ht", "up", "rk", "sw", "tm", "ts", "mt", "tu", "ra", "ut",
-       "rb", "rx", "rl" };
-#endif
+int    dmmin;
+int    dmmax;
+int    dmtext;
+int    nswdev;
+#define        MAXSWAPDEV      4
+short  buckets[MAXSWAPDEV][NDMAP];
+struct swdevt *swdevt;
 int    colwidth;
 
 int    colwidth;
 
-labelswap()
-{
-       register int i, j;
-       register int row;
-
-       if (nswdev == 0)
-               initswap();
-       if (nswdev == 0) {
-               mvaddstr(22, 0, "Can't find number of swap devices.\n");
-               return;
-       }
-        move(5, 0);
-       colwidth = (70 - (nswdev - 1)) / nswdev;
-       row = swaplabel(5, dmtext, 1);
-       (void) swaplabel(row, dmmax, 0);
-}
-
-swaplabel(row, dmbound, donames)
-       register int row;
-       int dmbound, donames;
-{
-       register int i, j;
-
-       for (i = 0; i < nswdev; i++) {
-               if (donames) {
-                       move(row, 5 + i * (1 + colwidth) + (colwidth - 3) / 2);
-                       printw("%s%d", devnames[major(swdevt[i].sw_dev)],
-                           minor(swdevt[i].sw_dev) >> 3);
-               }
-               for (j = 0; j + 5 < colwidth; j += 5) {
-                       move(row + donames, 5 + i * (1 + colwidth) + j);
-                       printw("/%-2d  ", j);
-               }
-       }
-       row += 1 + donames;
-       for (j = 0, i = dmmin; i <= dmbound; i *= 2, j++, row++) {
-               int k;
-
-               mvprintw(row, 0, "%4d|", i);
-               for (k = 1; k < nswdev; k++)
-                       mvwaddch(wnd, row - 3, k * (1 + colwidth) - 1, '|');
-       }
-       return (row);
-}
-
 extern union {
         struct  user user;
         char    upages[UPAGES][NBPG];
 extern union {
         struct  user user;
         char    upages[UPAGES][NBPG];
@@ -260,3 +154,144 @@ dmtoindex(dm)
        error("dmtoindex(%d)", dm);
        return (NDMAP - 1);
 }
        error("dmtoindex(%d)", dm);
        return (NDMAP - 1);
 }
+
+static struct nlist nlst[] = {
+#define X_PROC          0
+        { "_proc" },
+#define X_NPROC         1
+        { "_nproc" },
+#define X_USRPTMAP      2
+        { "_Usrptmap" },
+#define X_USRPT         3
+        { "_usrpt" },
+#define X_NSWAP         4
+        { "_nswap" },
+#define X_DMMIN         5
+        { "_dmmin" },
+#define X_DMMAX         6
+        { "_dmmax" },
+#define        X_DMTEXT        7
+       { "_dmtext" },
+#define X_NSWDEV        8
+        { "_nswdev" },
+#define        X_SWDEVT        9
+       { "_swdevt" },
+#define        X_NTEXT         10
+       { "_ntext" },
+#define        X_TEXT          11
+       { "_text" },
+        { "" }
+};
+
+initswap()
+{
+
+       if (nlst[X_PROC].n_type == 0) {
+               nlist("/vmunix", nlst);
+               if (nlst[X_PROC].n_type == 0) {
+                       error("namelist on /vmunix failed");
+                       return;
+               }
+       }
+        if (nswdev == 0) {
+                dmmin = getw(nlst[X_DMMIN].n_value);
+                dmmax = getw(nlst[X_DMMAX].n_value);
+                dmtext = getw(nlst[X_DMTEXT].n_value);
+                nswdev = getw(nlst[X_NSWDEV].n_value);
+               swdevt = (struct swdevt *)calloc(nswdev, sizeof (*swdevt));
+               klseek(kmem, nlst[X_SWDEVT].n_value, L_SET);
+               read(kmem, swdevt, nswdev * sizeof (struct swdevt));
+               ntext = getw(nlst[X_NTEXT].n_value);
+               textp = getw(nlst[X_TEXT].n_value);
+        }
+        if (procp == NULL) {
+                procp = getw(nlst[X_PROC].n_value);
+                nproc = getw(nlst[X_NPROC].n_value);
+        }
+       if (xtext == NULL)
+               xtext = (struct text *)calloc(ntext, sizeof (struct text));
+       if (kprocp == NULL)
+                kprocp = (struct proc *)calloc(nproc, sizeof (struct proc));
+        if (usrpt != NULL)
+                return;
+       usrpt = (struct pte *)nlst[X_USRPT].n_value;
+       Usrptma = (struct pte *)nlst[X_USRPTMAP].n_value;
+       if (pt == NULL)
+               pt = (struct p_times *)malloc(nproc * sizeof (struct p_times));
+}
+
+fetchswap()
+{
+
+       if (nlst[X_PROC].n_type == 0)
+               return;
+       if (kprocp == NULL) {
+                kprocp = (struct proc *)malloc(sizeof (*kprocp) * nproc);
+               if (kprocp == NULL)
+                       return;
+       }
+        lseek(kmem, procp, L_SET);
+        if (read(kmem, kprocp, sizeof (struct proc) * nproc) !=
+           sizeof (struct proc) * nproc) {
+               error("couldn't read proc table");
+               return;
+       }
+       if (xtext == NULL) {
+               xtext = (struct text *)calloc(ntext, sizeof (struct text));
+               if (xtext == NULL)
+                       return;
+       }
+       lseek(kmem, textp, L_SET);
+       if (read(kmem, xtext, ntext * sizeof (struct text)) !=
+           sizeof (struct text) * ntext)
+               error("couldn't read text table");
+}
+
+#ifdef vax
+char   *devnames[] =
+     { "hp", "ht", "up", "rk", "sw", "tm", "ts", "mt", "tu", "ra", "ut",
+       "rb", "rx", "rl" };
+#endif
+
+labelswap()
+{
+       register int i, j;
+       register int row;
+
+       if (nswdev == 0) {
+               error("Don't know how many swap devices.\n");
+               return;
+       }
+        move(5, 0);
+       colwidth = (70 - (nswdev - 1)) / nswdev;
+       row = swaplabel(5, dmtext, 1);
+       (void) swaplabel(row, dmmax, 0);
+}
+
+swaplabel(row, dmbound, donames)
+       register int row;
+       int dmbound, donames;
+{
+       register int i, j;
+
+       for (i = 0; i < nswdev; i++) {
+               if (donames) {
+                       move(row, 5 + i * (1 + colwidth) + (colwidth - 3) / 2);
+                       printw("%s%d", devnames[major(swdevt[i].sw_dev)],
+                           minor(swdevt[i].sw_dev) >> 3);
+               }
+               for (j = 0; j + 5 < colwidth; j += 5) {
+                       move(row + donames, 5 + i * (1 + colwidth) + j);
+                       printw("/%-2d  ", j);
+               }
+       }
+       row += 1 + donames;
+       for (j = 0, i = dmmin; i <= dmbound; i *= 2, j++, row++) {
+               int k;
+
+               mvprintw(row, 0, "%4d|", i);
+               for (k = 1; k < nswdev; k++)
+                       mvwaddch(wnd, row - 3, k * (1 + colwidth) - 1, '|');
+       }
+       return (row);
+}
index a97e207..a023627 100644 (file)
@@ -1,4 +1,4 @@
-/*      systat.h     1.1     83/10/01     */
+/*      systat.h     1.2     83/10/02     */
 
 #include <sys/param.h>
 #include <sys/dir.h>
 
 #include <sys/param.h>
 #include <sys/dir.h>
@@ -7,6 +7,9 @@
 #include <sys/timeb.h>
 #include <sys/vm.h>
 #include <sys/file.h>
 #include <sys/timeb.h>
 #include <sys/vm.h>
 #include <sys/file.h>
+#include <sys/map.h>
+#include <sys/conf.h>
+#include <sys/text.h>
 
 #include <machine/pte.h>
 
 
 #include <machine/pte.h>
 
@@ -17,8 +20,6 @@
 #include <signal.h>
 #include <ctype.h>
 
 #include <signal.h>
 #include <ctype.h>
 
-struct  nlist nlst[];
-
 struct p_times {
         short   pt_pid;
         float   pt_pctcpu;
 struct p_times {
         short   pt_pid;
         float   pt_pctcpu;
@@ -38,20 +39,37 @@ struct users {
         char    k_name[16];
 } known[30];
 
         char    k_name[16];
 } known[30];
 
+struct  cmdtab {
+        char    *c_name;               /* command name */
+        int     (*c_refresh)();                /* display refresh */
+        int     (*c_fetch)();          /* sets up data structures */
+        int     (*c_label)();          /* label display */
+       int     (*c_init)();            /* initialize namelist, etc. */
+       WINDOW  *(*c_open)();           /* open display */
+       int     (*c_close)();           /* close display */
+       char    c_flags;                /* been initialized (right now) */
+};
+
+struct cmdtab *curcmd;
+struct cmdtab cmdtab[];
+
 char    *kmemf;
 char    *memf;
 char    *swapf;
 int     kmem;
 int     mem;
 int     swap;
 char    *kmemf;
 char    *memf;
 char    *swapf;
 int     kmem;
 int     mem;
 int     swap;
-int     pcbpf;
-int     argaddr;
 int     col;
 long    nproc;
 long    procp;
 int     col;
 long    nproc;
 long    procp;
+struct proc *kprocp;
+long   ntext;
+long   textp;
+struct text *xtext;
 double  ccpu;
 double  lccpu;
 char    *malloc();
 double  ccpu;
 double  lccpu;
 char    *malloc();
+char    *calloc();
 char    *namp;
 char    *strncpy();
 char    c;
 char    *namp;
 char    *strncpy();
 char    c;