Patrick Welche <prlw1@cam.ac.uk>
[netbsd-mini2440.git] / usr.bin / systat / mbufs.c
blob42983126fb65e0f859e4e899d5409c7ea33fae5f
1 /* $NetBSD: mbufs.c,v 1.14 2006/10/22 16:43:24 christos Exp $ */
3 /*-
4 * Copyright (c) 1980, 1992, 1993
5 * The Regents of the University of California. All rights reserved.
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.
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.
32 #include <sys/cdefs.h>
33 #ifndef lint
34 #if 0
35 static char sccsid[] = "@(#)mbufs.c 8.1 (Berkeley) 6/6/93";
36 #endif
37 __RCSID("$NetBSD: mbufs.c,v 1.14 2006/10/22 16:43:24 christos Exp $");
38 #endif /* not lint */
40 #include <sys/param.h>
41 #include <sys/mbuf.h>
43 #include <stdlib.h>
45 #include "systat.h"
46 #include "extern.h"
48 static struct mbstat *mb;
50 const char *mtnames[] = {
51 "free",
52 "data",
53 "headers",
54 "sockets",
55 "pcbs",
56 "routes",
57 "hosts",
58 "arps",
59 "socknames",
60 "zombies",
61 "sockopts",
62 "frags",
63 "rights",
64 "ifaddrs",
67 #define NNAMES (sizeof (mtnames) / sizeof (mtnames[0]))
69 WINDOW *
70 openmbufs(void)
73 return (subwin(stdscr, -1, 0, 5, 0));
76 void
77 closembufs(WINDOW *w)
80 if (w == NULL)
81 return;
82 wclear(w);
83 wrefresh(w);
84 delwin(w);
87 void
88 labelmbufs(void)
91 wmove(wnd, 0, 0); wclrtoeol(wnd);
92 mvwaddstr(wnd, 0, 10,
93 "/0 /5 /10 /15 /20 /25 /30 /35 /40 /45 /50 /55 /60");
96 void
97 showmbufs(void)
99 int i, j, max, idx;
100 char buf[10];
102 if (mb == 0)
103 return;
104 for (j = 0; j < getmaxy(wnd); j++) {
105 max = 0, idx = -1;
106 for (i = 0; i < getmaxy(wnd); i++)
107 if (mb->m_mtypes[i] > max) {
108 max = mb->m_mtypes[i];
109 idx = i;
111 if (max == 0)
112 break;
113 if (j > (int)NNAMES)
114 mvwprintw(wnd, 1+j, 0, "%10d", idx);
115 else
116 mvwprintw(wnd, 1+j, 0, "%-10.10s", mtnames[idx]);
117 wmove(wnd, 1 + j, 10);
118 if (max > 60) {
119 snprintf(buf, sizeof buf, " %5d", max);
120 max = 60;
121 while (max--)
122 waddch(wnd, 'X');
123 waddstr(wnd, buf);
124 } else {
125 wclrtoeol(wnd);
126 whline(wnd, 'X', max);
128 mb->m_mtypes[idx] = 0;
130 wmove(wnd, 1+j, 0); wclrtobot(wnd);
133 static struct nlist namelist[] = {
134 #define X_MBSTAT 0
135 { .n_name = "_mbstat" },
136 { .n_name = NULL }
140 initmbufs(void)
143 if (namelist[X_MBSTAT].n_type == 0) {
144 if (kvm_nlist(kd, namelist)) {
145 nlisterr(namelist);
146 return(0);
148 if (namelist[X_MBSTAT].n_type == 0) {
149 error("No namelist");
150 return(0);
153 if (mb == 0)
154 mb = (struct mbstat *)calloc(1, sizeof (*mb));
155 return(1);
158 void
159 fetchmbufs(void)
162 if (namelist[X_MBSTAT].n_type == 0)
163 return;
164 NREAD(X_MBSTAT, mb, sizeof (*mb));