]> CyberLeo.Net >> Repos - FreeBSD/releng/7.2.git/blob - usr.bin/systat/mbufs.c
Create releng/7.2 from stable/7 in preparation for 7.2-RELEASE.
[FreeBSD/releng/7.2.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()
73 {
74         return (subwin(stdscr, LINES-3-1, 0, MAINWIN_ROW, 0));
75 }
76
77 void
78 closembufs(w)
79         WINDOW *w;
80 {
81         if (w == NULL)
82                 return;
83         wclear(w);
84         wrefresh(w);
85         delwin(w);
86 }
87
88 void
89 labelmbufs()
90 {
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");
94 }
95
96 void
97 showmbufs()
98 {
99         int i, j, max, idx;
100         u_long totmbufs;
101         char buf[10];
102         const char *mtname;
103
104         totmbufs = mbstat->m_mbufs;
105
106         /*
107          * Print totals for different mbuf types.
108          */
109         for (j = 0; j < wnd->_maxy; j++) {
110                 max = 0, idx = -1;
111                 for (i = 0; i < wnd->_maxy; i++) {
112                         if (i == MT_NOTMBUF)
113                                 continue;
114                         if (i >= nmbtypes)
115                                 break;
116                         if (m_mbtypes[i] > max) {
117                                 max = m_mbtypes[i];
118                                 idx = i;
119                         }
120                 }
121                 if (max == 0)
122                         break;
123
124                 mtname = NULL;
125                 for (i = 0; i < (int)NNAMES; i++)
126                         if (mtnames[i].mt_type == idx)
127                                 mtname = mtnames[i].mt_name;
128                 if (mtname == NULL)
129                         mvwprintw(wnd, 1+j, 0, "%10d", idx);
130                 else
131                         mvwprintw(wnd, 1+j, 0, "%-10.10s", mtname);
132                 wmove(wnd, 1 + j, 10);
133                 if (max > 60) {
134                         snprintf(buf, sizeof(buf), " %d", max);
135                         max = 60;
136                         while (max--)
137                                 waddch(wnd, 'X');
138                         waddstr(wnd, buf);
139                 } else
140                         while (max--)
141                                 waddch(wnd, 'X');
142                 wclrtoeol(wnd);
143                 m_mbtypes[idx] = 0;
144         }
145
146         /*
147          * Print total number of free mbufs.
148          */
149         if (totmbufs > 0) {
150                 mvwprintw(wnd, 1+j, 0, "%-10.10s", "Mbufs");
151                 if (totmbufs > 60) {
152                         snprintf(buf, sizeof(buf), " %lu", totmbufs);
153                         totmbufs = 60;
154                         while(totmbufs--)
155                                 waddch(wnd, 'X');
156                         waddstr(wnd, buf);
157                 } else {
158                         while(totmbufs--)
159                                 waddch(wnd, 'X');
160                 }
161                 wclrtoeol(wnd);
162                 j++;
163         }
164         wmove(wnd, 1+j, 0); wclrtobot(wnd);
165 }
166
167 int
168 initmbufs()
169 {
170         size_t len;
171
172         len = sizeof *mbstat;
173         if ((mbstat = malloc(len)) == NULL) {
174                 error("malloc mbstat failed");
175                 return 0;
176         }
177         if (sysctlbyname("kern.ipc.mbstat", mbstat, &len, NULL, 0) < 0) {
178                 error("sysctl retrieving mbstat");
179                 return 0;
180         }
181         nmbtypes = mbstat->m_numtypes;
182         if ((m_mbtypes = calloc(nmbtypes, sizeof(long *))) == NULL) {
183                 error("calloc m_mbtypes failed");
184                 return 0;
185         }
186
187         return 1;
188 }
189
190 void
191 fetchmbufs()
192 {
193         size_t len;
194
195         len = sizeof *mbstat;
196         if (sysctlbyname("kern.ipc.mbstat", mbstat, &len, NULL, 0) < 0)
197                 printw("sysctl: mbstat: %s", strerror(errno));
198 }