Rototill global command matching -- switch from ad-hoc tomfoolery to a
table lookup. This will make prefix matching and so on easier. Expect a similar change for mode-specific commands before too long. While there, rename some structures with misleading names. Watch this space for more changes soon.
This commit is contained in:
parent
e9bbfca96b
commit
06f376613f
|
@ -1,4 +1,4 @@
|
|||
# $NetBSD: Makefile,v 1.19 1999/11/15 06:16:56 simonb Exp $
|
||||
# $NetBSD: Makefile,v 1.20 1999/12/16 04:02:22 jwise Exp $
|
||||
# @(#)Makefile 8.1 (Berkeley) 6/6/93
|
||||
|
||||
PROG= systat
|
||||
|
@ -7,9 +7,9 @@ PROG= systat
|
|||
|
||||
CPPFLAGS+=-I${.CURDIR}/../../usr.bin/vmstat
|
||||
CWARNFLAGS+= -Wno-format-y2k
|
||||
SRCS= bufcache.c cmds.c cmdtab.c disks.c dkstats.c fetch.c icmp.c iostat.c \
|
||||
ip.c keyboard.c main.c mbufs.c netcmds.c netstat.c pigs.c ps.c swap.c \
|
||||
tcp.c vmstat.c
|
||||
SRCS= bufcache.c cmds.c cmdtab.c disks.c dkstats.c fetch.c globalcmds.c \
|
||||
icmp.c iostat.c ip.c keyboard.c main.c mbufs.c netcmds.c netstat.c \
|
||||
pigs.c ps.c swap.c tcp.c vmstat.c
|
||||
DPADD= ${LIBCURSES} ${LIBM} ${LIBKVM}
|
||||
LDADD= -lcurses -lm -lkvm
|
||||
BINGRP= kmem
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: cmds.c,v 1.10 1999/08/02 02:01:57 sommerfeld Exp $ */
|
||||
/* $NetBSD: cmds.c,v 1.11 1999/12/16 04:02:22 jwise Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1980, 1992, 1993
|
||||
|
@ -38,7 +38,7 @@
|
|||
#if 0
|
||||
static char sccsid[] = "@(#)cmds.c 8.2 (Berkeley) 4/29/95";
|
||||
#endif
|
||||
__RCSID("$NetBSD: cmds.c,v 1.10 1999/08/02 02:01:57 sommerfeld Exp $");
|
||||
__RCSID("$NetBSD: cmds.c,v 1.11 1999/12/16 04:02:22 jwise Exp $");
|
||||
#endif /* not lint */
|
||||
|
||||
#include <stdlib.h>
|
||||
|
@ -53,7 +53,8 @@ void
|
|||
command(cmd)
|
||||
char *cmd;
|
||||
{
|
||||
struct cmdtab *p;
|
||||
struct command *c;
|
||||
struct mode *p;
|
||||
char *cp;
|
||||
int interval;
|
||||
sigset_t set;
|
||||
|
@ -69,33 +70,14 @@ command(cmd)
|
|||
return;
|
||||
for (; *cp && isspace((unsigned char)*cp); cp++)
|
||||
;
|
||||
if (strcmp(cmd, "quit") == 0 || strcmp(cmd, "q") == 0)
|
||||
die(0);
|
||||
if (strcmp(cmd, "load") == 0) {
|
||||
load();
|
||||
goto done;
|
||||
}
|
||||
if (strcmp(cmd, "stop") == 0) {
|
||||
alarm(0);
|
||||
mvaddstr(CMDLINE, 0, "Refresh disabled.");
|
||||
clrtoeol();
|
||||
goto done;
|
||||
}
|
||||
if (strcmp(cmd, "help") == 0) {
|
||||
int col, len;
|
||||
|
||||
move(CMDLINE, col = 0);
|
||||
for (p = cmdtab; p->c_name; p++) {
|
||||
len = strlen(p->c_name);
|
||||
if (col + len > COLS)
|
||||
break;
|
||||
addstr(p->c_name); col += len;
|
||||
if (col + 1 < COLS)
|
||||
addch(' ');
|
||||
for (c = global_commands; c->c_name; c++) {
|
||||
if (strcmp(cmd, c->c_name) == 0) {
|
||||
(c->c_cmd)();
|
||||
goto done;
|
||||
}
|
||||
clrtoeol();
|
||||
goto done;
|
||||
}
|
||||
|
||||
interval = atoi(cmd);
|
||||
if (interval <= 0 &&
|
||||
(strcmp(cmd, "start") == 0 || strcmp(cmd, "interval") == 0)) {
|
||||
|
@ -113,24 +95,24 @@ command(cmd)
|
|||
goto done;
|
||||
}
|
||||
p = lookup(cmd);
|
||||
if (p == (struct cmdtab *)-1) {
|
||||
if (p == (struct mode *)-1) {
|
||||
error("%s: Ambiguous command.", cmd);
|
||||
goto done;
|
||||
}
|
||||
if (p) {
|
||||
if (curcmd == p)
|
||||
if (curmode == p)
|
||||
goto done;
|
||||
alarm(0);
|
||||
(*curcmd->c_close)(wnd);
|
||||
(*curmode->c_close)(wnd);
|
||||
wnd = (*p->c_open)();
|
||||
if (wnd == 0) {
|
||||
error("Couldn't open new display");
|
||||
wnd = (*curcmd->c_open)();
|
||||
wnd = (*curmode->c_open)();
|
||||
if (wnd == 0) {
|
||||
error("Couldn't change back to previous cmd");
|
||||
exit(1);
|
||||
}
|
||||
p = curcmd;
|
||||
p = curmode;
|
||||
}
|
||||
if ((p->c_flags & CF_INIT) == 0) {
|
||||
if ((*p->c_init)())
|
||||
|
@ -138,30 +120,30 @@ command(cmd)
|
|||
else
|
||||
goto done;
|
||||
}
|
||||
curcmd = p;
|
||||
curmode = p;
|
||||
labels();
|
||||
display(0);
|
||||
status();
|
||||
goto done;
|
||||
}
|
||||
if (curcmd->c_cmd == 0 || !(*curcmd->c_cmd)(cmd, cp))
|
||||
if (curmode->c_cmd == 0 || !(*curmode->c_cmd)(cmd, cp))
|
||||
error("%s: Unknown command.", cmd);
|
||||
done:
|
||||
sigprocmask(SIG_UNBLOCK, &set, NULL);
|
||||
}
|
||||
|
||||
struct cmdtab *
|
||||
struct mode *
|
||||
lookup(name)
|
||||
char *name;
|
||||
{
|
||||
char *p, *q;
|
||||
struct cmdtab *c, *found;
|
||||
struct mode *c, *found;
|
||||
int nmatches, longest;
|
||||
|
||||
longest = 0;
|
||||
nmatches = 0;
|
||||
found = (struct cmdtab *) 0;
|
||||
for (c = cmdtab; (p = c->c_name); c++) {
|
||||
found = (struct mode *) 0;
|
||||
for (c = modes; (p = c->c_name); c++) {
|
||||
for (q = name; *q == *p++; q++)
|
||||
if (*q == 0) /* exact match? */
|
||||
return (c);
|
||||
|
@ -175,14 +157,14 @@ lookup(name)
|
|||
}
|
||||
}
|
||||
if (nmatches > 1)
|
||||
return ((struct cmdtab *)-1);
|
||||
return ((struct mode *)-1);
|
||||
return (found);
|
||||
}
|
||||
|
||||
void
|
||||
status()
|
||||
{
|
||||
error("Showing %s, refresh every %d seconds.", curcmd->c_name, naptime);
|
||||
error("Showing %s, refresh every %d seconds.", curmode->c_name, naptime);
|
||||
}
|
||||
|
||||
/* case insensitive prefix comparison */
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: cmdtab.c,v 1.8 1999/11/15 06:16:56 simonb Exp $ */
|
||||
/* $NetBSD: cmdtab.c,v 1.9 1999/12/16 04:02:22 jwise Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1980, 1992, 1993
|
||||
|
@ -38,13 +38,13 @@
|
|||
#if 0
|
||||
static char sccsid[] = "@(#)cmdtab.c 8.1 (Berkeley) 6/6/93";
|
||||
#endif
|
||||
__RCSID("$NetBSD: cmdtab.c,v 1.8 1999/11/15 06:16:56 simonb Exp $");
|
||||
__RCSID("$NetBSD: cmdtab.c,v 1.9 1999/12/16 04:02:22 jwise Exp $");
|
||||
#endif /* not lint */
|
||||
|
||||
#include "systat.h"
|
||||
#include "extern.h"
|
||||
|
||||
struct cmdtab cmdtab[] = {
|
||||
struct mode modes[] = {
|
||||
/* "pigs" is the default, it must be first. */
|
||||
{ "pigs", showpigs, fetchpigs, labelpigs,
|
||||
initpigs, openpigs, closepigs, 0,
|
||||
|
@ -84,4 +84,14 @@ struct cmdtab cmdtab[] = {
|
|||
0 },
|
||||
{ 0 }
|
||||
};
|
||||
struct cmdtab *curcmd = &cmdtab[0];
|
||||
struct mode *curmode = &modes[0];
|
||||
|
||||
struct command global_commands[] = {
|
||||
{ "help", global_help, "show help"},
|
||||
{ "load", global_load, "show system load averages"},
|
||||
{ "quit", global_quit, "exit systat"},
|
||||
/* until prefix matching works, handle the same special case */
|
||||
{ "q", global_quit, "exit systat"},
|
||||
{ "stop", global_stop, "stop updating display"},
|
||||
{ 0 }
|
||||
};
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: extern.h,v 1.11 1999/11/15 06:16:56 simonb Exp $ */
|
||||
/* $NetBSD: extern.h,v 1.12 1999/12/16 04:02:23 jwise Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1991, 1993
|
||||
|
@ -39,8 +39,9 @@
|
|||
#include <fcntl.h>
|
||||
#include <kvm.h>
|
||||
|
||||
extern struct cmdtab *curcmd;
|
||||
extern struct cmdtab cmdtab[];
|
||||
extern struct command global_commands[];
|
||||
extern struct mode *curmode;
|
||||
extern struct mode modes[];
|
||||
extern struct text *xtext;
|
||||
extern WINDOW *wnd;
|
||||
extern char **dr_name;
|
||||
|
@ -76,7 +77,7 @@ void closetcp __P ((WINDOW *));
|
|||
int cmdiostat __P((char *, char *));
|
||||
int cmdkre __P((char *, char *));
|
||||
int cmdnetstat __P((char *, char *));
|
||||
struct cmdtab *lookup __P((char *));
|
||||
struct mode *lookup __P((char *));
|
||||
void command __P((char *));
|
||||
void die __P((int));
|
||||
void display __P((int));
|
||||
|
@ -93,6 +94,10 @@ void fetchnetstat __P((void));
|
|||
void fetchpigs __P((void));
|
||||
void fetchswap __P((void));
|
||||
void fetchtcp __P((void));
|
||||
void global_help __P((void));
|
||||
void global_load __P((void));
|
||||
void global_quit __P((void));
|
||||
void global_stop __P((void));
|
||||
int initbufcache __P((void));
|
||||
int initicmp __P((void));
|
||||
int initiostat __P((void));
|
||||
|
@ -118,7 +123,6 @@ void labels __P((void));
|
|||
void labelswap __P((void));
|
||||
void labeltcp __P((void));
|
||||
void labeltcpsyn __P((void));
|
||||
void load __P((void));
|
||||
int netcmd __P((char *, char *));
|
||||
void nlisterr __P((struct nlist []));
|
||||
WINDOW *openbufcache __P((void));
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: main.c,v 1.17 1999/11/11 03:06:04 soren Exp $ */
|
||||
/* $NetBSD: main.c,v 1.18 1999/12/16 04:02:23 jwise Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1980, 1992, 1993
|
||||
|
@ -40,7 +40,7 @@ __COPYRIGHT("@(#) Copyright (c) 1980, 1992, 1993\n\
|
|||
#if 0
|
||||
static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 6/6/93";
|
||||
#endif
|
||||
__RCSID("$NetBSD: main.c,v 1.17 1999/11/11 03:06:04 soren Exp $");
|
||||
__RCSID("$NetBSD: main.c,v 1.18 1999/12/16 04:02:23 jwise Exp $");
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/param.h>
|
||||
|
@ -125,14 +125,14 @@ main(argc, argv)
|
|||
if (naptime <= 0)
|
||||
naptime = 5;
|
||||
} else {
|
||||
struct cmdtab *p;
|
||||
struct mode *p;
|
||||
|
||||
p = lookup(&argv[0][0]);
|
||||
if (p == (struct cmdtab *)-1)
|
||||
if (p == (struct mode *)-1)
|
||||
errx(1, "ambiguous request: %s", &argv[0][0]);
|
||||
if (p == 0)
|
||||
errx(1, "unknown request: %s", &argv[0][0]);
|
||||
curcmd = p;
|
||||
curmode = p;
|
||||
}
|
||||
argc--, argv++;
|
||||
}
|
||||
|
@ -182,7 +182,7 @@ main(argc, argv)
|
|||
}
|
||||
|
||||
CMDLINE = LINES - 1;
|
||||
wnd = (*curcmd->c_open)();
|
||||
wnd = (*curmode->c_open)();
|
||||
if (wnd == NULL) {
|
||||
warnx("couldn't initialize display");
|
||||
die(0);
|
||||
|
@ -196,8 +196,8 @@ main(argc, argv)
|
|||
hostname[sizeof(hostname) - 1] = '\0';
|
||||
NREAD(X_HZ, &hz, sizeof hz);
|
||||
NREAD(X_STATHZ, &stathz, sizeof stathz);
|
||||
(*curcmd->c_init)();
|
||||
curcmd->c_flags |= CF_INIT;
|
||||
(*curmode->c_init)();
|
||||
curmode->c_flags |= CF_INIT;
|
||||
labels();
|
||||
|
||||
dellave = 0.0;
|
||||
|
@ -222,12 +222,12 @@ usage()
|
|||
void
|
||||
labels()
|
||||
{
|
||||
if (curcmd->c_flags & CF_LOADAV) {
|
||||
if (curmode->c_flags & CF_LOADAV) {
|
||||
mvaddstr(2, 20,
|
||||
"/0 /1 /2 /3 /4 /5 /6 /7 /8 /9 /10");
|
||||
mvaddstr(3, 5, "Load Average");
|
||||
}
|
||||
(*curcmd->c_label)();
|
||||
(*curmode->c_label)();
|
||||
#ifdef notdef
|
||||
mvprintw(21, 25, "CPU usage on %s", hostname);
|
||||
#endif
|
||||
|
@ -242,8 +242,8 @@ display(signo)
|
|||
|
||||
/* Get the load average over the last minute. */
|
||||
(void)getloadavg(avenrun, sizeof(avenrun) / sizeof(avenrun[0]));
|
||||
(*curcmd->c_fetch)();
|
||||
if (curcmd->c_flags & CF_LOADAV) {
|
||||
(*curmode->c_fetch)();
|
||||
if (curmode->c_flags & CF_LOADAV) {
|
||||
j = 5.0*avenrun[0] + 0.5;
|
||||
dellave -= avenrun[0];
|
||||
if (dellave >= 0.0)
|
||||
|
@ -261,8 +261,8 @@ display(signo)
|
|||
if (j > 50)
|
||||
wprintw(wload, " %4.1f", avenrun[0]);
|
||||
}
|
||||
(*curcmd->c_refresh)();
|
||||
if (curcmd->c_flags & CF_LOADAV)
|
||||
(*curmode->c_refresh)();
|
||||
if (curmode->c_flags & CF_LOADAV)
|
||||
wrefresh(wload);
|
||||
wrefresh(wnd);
|
||||
move(CMDLINE, col);
|
||||
|
@ -284,16 +284,6 @@ redraw(signo)
|
|||
sigprocmask(SIG_UNBLOCK, &set, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
load()
|
||||
{
|
||||
|
||||
(void)getloadavg(avenrun, sizeof(avenrun)/sizeof(avenrun[0]));
|
||||
mvprintw(CMDLINE, 0, "%4.1f %4.1f %4.1f",
|
||||
avenrun[0], avenrun[1], avenrun[2]);
|
||||
clrtoeol();
|
||||
}
|
||||
|
||||
void
|
||||
die(signo)
|
||||
int signo;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: systat.h,v 1.3 1997/07/21 07:05:08 mrg Exp $ */
|
||||
/* $NetBSD: systat.h,v 1.4 1999/12/16 04:02:23 jwise Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1980, 1989, 1992, 1993
|
||||
|
@ -37,7 +37,7 @@
|
|||
|
||||
#include <curses.h>
|
||||
|
||||
struct cmdtab {
|
||||
struct mode {
|
||||
char *c_name; /* command name */
|
||||
void (*c_refresh) __P((void)); /* display refresh */
|
||||
void (*c_fetch) __P((void)); /* sets up data structures */
|
||||
|
@ -49,6 +49,12 @@ struct cmdtab {
|
|||
char c_flags; /* see below */
|
||||
};
|
||||
|
||||
struct command {
|
||||
char *c_name;
|
||||
void (*c_cmd) __P((void));
|
||||
char *helptext;
|
||||
};
|
||||
|
||||
#define CF_INIT 0x1 /* been initialized */
|
||||
#define CF_LOADAV 0x2 /* display w/ load average */
|
||||
|
||||
|
|
Loading…
Reference in New Issue