1 /*        $NetBSD: cmdtab.c,v 1.26 2018/12/26 01:47:37 sevan Exp $    */
2 
3 /*-
4  * Copyright (c) 1980, 1992, 1993
5  *        The Regents of the University of California.  All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. Neither the name of the University nor the names of its contributors
16  *    may be used to endorse or promote products derived from this software
17  *    without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  */
31 
32 #include <sys/cdefs.h>
33 #ifndef lint
34 #if 0
35 static char sccsid[] = "@(#)cmdtab.c    8.1 (Berkeley) 6/6/93";
36 #endif
37 __RCSID("$NetBSD: cmdtab.c,v 1.26 2018/12/26 01:47:37 sevan Exp $");
38 #endif /* not lint */
39 
40 #include "systat.h"
41 #include "extern.h"
42 
43 /*
44  * NOTE: if one command is a substring of another, the shorter string
45  * MUST come first, or it will be shadowed by the longer
46  */
47 
48 struct    command global_commands[] = {
49           { "help", global_help,                  "show help"},
50           { "interval",       global_interval,    "set update interval"},
51           { "load", global_load,                  "show system load averages"},
52           { "quit", global_quit,                  "exit systat"},
53           { "start",          global_interval,    "restart updating display"},
54           { "stop", global_stop,                  "stop updating display"},
55           { "?",              global_help,                  "show help"},
56           { .c_name = NULL }
57 };
58 
59 struct command      df_commands[] = {
60           { "all",  df_all,         "show all filesystems"},
61           { "some", df_some,        "show only some filesystems"},
62           { .c_name = NULL }
63 };
64 
65 struct command      icmp_commands[] = {
66           { "boot", icmp_boot,          "show total stats since boot"},
67           { "run",  icmp_run, "show running total stats"},
68           { "time", icmp_time,          "show stats for each sample time"},
69           { "zero", icmp_zero,          "re-zero running totals"},
70           { .c_name = NULL }
71 };
72 
73 struct command ifstat_commands[] = {
74           { "scale",          ifstat_scale,       "modify scale of display"},
75           { "pps",  ifstat_pps,         "toggle packets per second display"},
76           { "match",          ifstat_match,   "display matching interfaces"},
77           { .c_name = NULL }
78 };
79 
80 struct command      iostat_commands[] = {
81           { "bars", iostat_bars,        "show io stats as a bar graph"},
82           { "numbers",        iostat_numbers,     "show io stats numerically"},
83           { "secs", iostat_secs,        "include time statistics"},
84           { "rw",             iostat_rw,          "show read/write disk stats"},
85           { "all",  iostat_all,         "show combined disk stats"},
86           /* from disks.c */
87           { "display",        disks_add,          "add a disk to displayed disks"},
88           { "ignore",         disks_remove,       "remove a disk from displayed disks"},
89           { "drives",         disks_drives,       "list all disks/set disk list"},
90           { .c_name = NULL }
91 };
92 
93 struct command      ip_commands[] = {
94           { "boot", ip_boot,  "show total stats since boot"},
95           { "run",  ip_run,             "show running total stats"},
96           { "time", ip_time,  "show stats for each sample time"},
97           { "zero", ip_zero,  "re-zero running totals"},
98           { .c_name = NULL }
99 };
100 
101 #ifdef INET6
102 struct command      ip6_commands[] = {
103           { "boot", ip6_boot, "show total stats since boot"},
104           { "run",  ip6_run,  "show running total stats"},
105           { "time", ip6_time, "show stats for each sample time"},
106           { "zero", ip6_zero, "re-zero running totals"},
107           { .c_name = NULL }
108 };
109 #endif
110 
111 struct command netstat_commands[] = {
112           { "all",  netstat_all,         "include server sockets"},
113           { "display",        netstat_display, "show specified hosts or ports"},
114           { "ignore",         netstat_ignore,      "hide specified hosts or ports"},
115           { "names",          netstat_names,       "show names instead of addresses"},
116           { "numbers",        netstat_numbers, "show addresses instead of names"},
117           { "reset",          netstat_reset,       "return to default display"},
118           { "show", netstat_show,        "show current display/ignore settings"},
119           { "tcp",  netstat_tcp,         "show only tcp connections"},
120           { "udp",  netstat_udp,         "show only udp connections"},
121           { .c_name = NULL }
122 };
123 
124 struct command ps_commands[] = {
125           { "user", ps_user,  "limit displayed processes to a user"},
126           { .c_name = NULL }
127 };
128 
129 struct command      tcp_commands[] = {
130           { "boot", tcp_boot, "show total stats since boot"},
131           { "run",  tcp_run,  "show running total stats"},
132           { "time", tcp_time, "show stats for each sample time"},
133           { "zero", tcp_zero, "re-zero running totals"},
134           { .c_name = NULL }
135 };
136 
137 struct command      vmstat_commands[] = {
138           { "boot", vmstat_boot,        "show total vm stats since boot"},
139           { "run",  vmstat_run,         "show running total vm stats"},
140           { "time", vmstat_time,        "show vm stats for each sample time"},
141           { "zero", vmstat_zero,        "re-zero running totals"},
142           /* from disks.c */
143           { "display",        disks_add,          "add a disk to displayed disks"},
144           { "ignore",         disks_remove,       "remove a disk from displayed disks"},
145           { "drives",         disks_drives,       "list all disks/set disk list"},
146           { .c_name = NULL }
147 };
148 
149 struct command      syscall_commands[] = {
150           { "boot", syscall_boot,       "show total syscall stats since boot"},
151           { "run",  syscall_run,        "show running total syscall stats"},
152           { "time", syscall_time,       "show syscall stats for each sample time"},
153           { "zero", syscall_zero,       "re-zero running totals"},
154           { "sort", syscall_order,      "sort by [name|count|syscall]"},
155           { "show", syscall_show,       "show [count|time]"},
156           { .c_name = NULL }
157 };
158 
159 struct mode modes[] = {
160           /* "pigs" is the default, it must be first. */
161           { "pigs", showpigs, fetchpigs,          labelpigs,
162             initpigs,         openpigs, closepigs,          0,
163             CF_LOADAV },
164           { "bufcache",       showbufcache,       fetchbufcache,      labelbufcache,
165             initbufcache,     openbufcache,       closebufcache,      0,
166             CF_LOADAV },
167           { "df",         showdf,       fetchdf,  labeldf,
168             initdf, opendf,             closedf,  df_commands,
169             CF_LOADAV },
170           { "ifstat",         showifstat,         fetchifstat,        labelifstat,
171             initifstat,       openifstat,         closeifstat,        ifstat_commands,
172             CF_LOADAV },
173           { "inet.icmp",      showicmp, fetchicmp,          labelicmp,
174             initicmp,         openicmp, closeicmp,          icmp_commands,
175             CF_LOADAV },
176           { "inet.ip",        showip,             fetchip,  labelip,
177             initip, openip,             closeip,  ip_commands,
178             CF_LOADAV },
179           { "inet.tcp",       showtcp,  fetchtcp, labeltcp,
180             inittcp,          opentcp,  closetcp, tcp_commands,
181             CF_LOADAV },
182           { "inet.tcpsyn",showtcpsyn,   fetchtcp, labeltcpsyn,
183             inittcp,          opentcp,  closetcp, tcp_commands,
184             CF_LOADAV },
185 #ifdef INET6
186           { "inet6.ip6",      showip6,  fetchip6, labelip6,
187             initip6,          openip6,  closeip6, ip6_commands,
188             CF_LOADAV },
189 #endif
190           { "iostat",         showiostat,         fetchiostat,        labeliostat,
191             initiostat,       openiostat,         closeiostat,        iostat_commands,
192             CF_LOADAV },
193           { "mbufs",          showmbufs,          fetchmbufs,         labelmbufs,
194             initmbufs,        openmbufs,          closembufs,         0,
195             CF_LOADAV },
196           { "netstat",        shownetstat,        fetchnetstat,       labelnetstat,
197             initnetstat,      opennetstat,        closenetstat,       netstat_commands,
198             CF_LOADAV },
199           { "ps",             showps,             fetchpigs,          labelps,
200             initpigs,         openpigs, closepigs,          ps_commands,
201             CF_LOADAV },
202           { "swap", showswap, fetchswap,          labelswap,
203             initswap,         openswap, closeswap,          0,
204             CF_LOADAV },
205           { "vmstat",         showvmstat,         fetchvmstat,        labelvmstat,
206             initvmstat,       openvmstat,         closevmstat,        vmstat_commands,
207             0 },
208           { "syscall",        showsyscall,        fetchsyscall,       labelsyscall,
209             initsyscall,      opensyscall,        closesyscall,       syscall_commands,
210             0 },
211           { .c_name = NULL }
212 };
213 struct  mode *curmode = &modes[0];
214