]> CyberLeo.Net >> Repos - FreeBSD/releng/8.1.git/blob - usr.bin/systat/mbufs.c
Copy stable/8 to releng/8.1 in preparation for 8.1-RC1.
[FreeBSD/releng/8.1.git] / usr.bin / systat / mbufs.c
1 /*-
2  * Copyright (c) 1980, 1992, 1993
3  *      The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *      This product includes software developed by the University of
16  *      California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  */
33
34 #include <sys/cdefs.h>
35
36 __FBSDID("$FreeBSD$");
37
38 #ifdef lint
39 static const char sccsid[] = "@(#)mbufs.c       8.1 (Berkeley) 6/6/93";
40 #endif
41
42 #include <sys/param.h>
43 #include <sys/types.h>
44 #include <sys/mbuf.h>
45 #include <sys/sysctl.h>
46
47 #include <errno.h>
48 #include <stdlib.h>
49 #include <string.h>
50 #include <paths.h>
51
52 #include "systat.h"
53 #include "extern.h"
54
55 static struct mbstat *mbstat;
56 static long *m_mbtypes;
57 static short nmbtypes;
58
59 static struct mtnames {
60         short mt_type;
61         const char *mt_name;
62 } mtnames[] = {
63         { MT_DATA,      "data"},
64         { MT_HEADER,    "headers"},
65         { MT_SONAME,    "socknames"},
66         { MT_CONTROL,   "control"},
67         { MT_OOBDATA,   "oobdata"}
68 };
69 #define NNAMES  (sizeof (mtnames) / sizeof (mtnames[0]))
70
71 WINDOW *
72 openmbufs(void)
73 {
74         return (subwin(stdscr, LINES-3-1, 0, MAINWIN_ROW, 0));
75 }
76
77 void
78 closembufs(WINDOW *w)
79 {
80         if (w == NULL)
81                 return;
82         wclear(w);
83         wrefresh(w);
84         delwin(w);
85 }
86
87 void
88 labelmbufs(void)
89 {
90         wmove(wnd, 0, 0); wclrtoeol(wnd);
91         mvwaddstr(wnd, 0, 10,
92             "/0   /5   /10  /15  /20  /25  /30  /35  /40  /45  /50  /55  /60");
93 }
94
95 void
96 showmbufs(void)
97 {
98         int i, j, max, idx;
99         u_long totmbufs;
100         char buf[10];
101         const char *mtname;
102
103         totmbufs = mbstat->m_mbufs;
104
105         /*
106          * Print totals for different mbuf types.
107          */
108         for (j = 0; j < wnd->_maxy; j++) {
109                 max = 0, idx = -1;
110                 for (i = 0; i < wnd->_maxy; i++) {
111                         if (i == MT_NOTMBUF)
112                                 continue;
113                         if (i >= nmbtypes)
114                                 break;
115                         if (m_mbtypes[i] > max) {
116                                 max = m_mbtypes[i];
117                                 idx = i;
118                         }
119                 }
120                 if (max == 0)
121                         break;
122
123                 mtname = NULL;
124                 for (i = 0; i < (int)NNAMES; i++)
125                         if (mtnames[i].mt_type == idx)
126                                 mtname = mtnames[i].mt_name;
127                 if (mtname == NULL)
128                         mvwprintw(wnd, 1+j, 0, "%10d", idx);
129                 else
130                         mvwprintw(wnd, 1+j, 0, "%-10.10s", mtname);
131                 wmove(wnd, 1 + j, 10);
132                 if (max > 60) {
133                         snprintf(buf, sizeof(buf), " %d", max);
134                         max = 60;
135                         while (max--)
136                                 waddch(wnd, 'X');
137                         waddstr(wnd, buf);
138                 } else
139                         while (max--)
140                                 waddch(wnd, 'X');
141                 wclrtoeol(wnd);
142                 m_mbtypes[idx] = 0;
143         }
144
145         /*
146          * Print total number of free mbufs.
147          */
148         if (totmbufs > 0) {
149                 mvwprintw(wnd, 1+j, 0, "%-10.10s", "Mbufs");
150                 if (totmbufs > 60) {
151                         snprintf(buf, sizeof(buf), " %lu", totmbufs);
152                         totmbufs = 60;
153                         while(totmbufs--)
154                                 waddch(wnd, 'X');
155                         waddstr(wnd, buf);
156                 } else {
157                         while(totmbufs--)
158                                 waddch(wnd, 'X');
159                 }
160                 wclrtoeol(wnd);
161                 j++;
162         }
163         wmove(wnd, 1+j, 0); wclrtobot(wnd);
164 }
165
166 int
167 initmbufs(void)
168 {
169         size_t len;
170
171         len = sizeof *mbstat;
172         if ((mbstat = malloc(len)) == NULL) {
173                 error("malloc mbstat failed");
174                 return 0;
175         }
176         if (sysctlbyname("kern.ipc.mbstat", mbstat, &len, NULL, 0) < 0) {
177                 error("sysctl retrieving mbstat");
178                 return 0;
179         }
180         nmbtypes = mbstat->m_numtypes;
181         if ((m_mbtypes = calloc(nmbtypes, sizeof(long *))) == NULL) {
182                 error("calloc m_mbtypes failed");
183                 return 0;
184         }
185
186         return 1;
187 }
188
189 void
190 fetchmbufs(void)
191 {
192         size_t len;
193
194         len = sizeof *mbstat;
195         if (sysctlbyname("kern.ipc.mbstat", mbstat, &len, NULL, 0) < 0)
196                 printw("sysctl: mbstat: %s", strerror(errno));
197 }