swap.c revision 165498
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: head/usr.bin/systat/swap.c 165498 2006-12-23 17:46:32Z yar $");
37
38#ifdef lint
39static const char sccsid[] = "@(#)swap.c	8.3 (Berkeley) 4/29/95";
40#endif
41
42/*
43 * swapinfo - based on a program of the same name by Kevin Lahey
44 */
45
46#include <sys/param.h>
47#include <sys/ioctl.h>
48#include <sys/stat.h>
49
50#include <kvm.h>
51#include <nlist.h>
52#include <stdio.h>
53#include <stdlib.h>
54#include <unistd.h>
55#include <string.h>
56#include <err.h>
57
58#include "systat.h"
59#include "extern.h"
60
61kvm_t	*kd;
62
63static char *header;
64static long blocksize;
65static int hlen;
66static int ulen, oulen;
67static int pagesize;
68
69WINDOW *
70openswap()
71{
72	return (subwin(stdscr, LINES-3-1, 0, MAINWIN_ROW, 0));
73}
74
75void
76closeswap(w)
77	WINDOW *w;
78{
79	if (w == NULL)
80		return;
81	wclear(w);
82	wrefresh(w);
83	delwin(w);
84}
85
86/*
87 * The meat of all the swap stuff is stolen from pstat(8)'s
88 * swapmode(), which is based on a program called swapinfo written by
89 * Kevin Lahey <kml@rokkaku.atl.ga.us>.
90 */
91
92int
93initswap()
94{
95	char msgbuf[BUFSIZ];
96	static int once = 0;
97	struct kvm_swap dummy;
98
99	if (once)
100		return (1);
101
102	header = getbsize(&hlen, &blocksize);
103	pagesize = getpagesize();
104
105	if (kvm_getswapinfo(kd, &dummy, 1, 0) < 0) {
106		snprintf(msgbuf, sizeof(msgbuf), "systat: kvm_getswapinfo failed");
107		error("%s", msgbuf);
108		return (0);
109	}
110
111	once = 1;
112	return (1);
113}
114
115static struct kvm_swap	kvmsw[16];
116static int kvnsw, okvnsw;
117
118#define CONVERT(v)	((int)((int64_t)(v) * pagesize / blocksize))
119
120void
121fetchswap()
122{
123	int n;
124
125	okvnsw = kvnsw;
126	kvnsw = kvm_getswapinfo(kd, kvmsw, 16, 0);
127
128	oulen = ulen;
129	for (n = CONVERT(kvmsw[kvnsw].ksw_used), ulen = 2; n /= 10; ++ulen);
130	if (ulen < sizeof("Used"))
131		ulen = sizeof("Used");
132}
133
134void
135labelswap()
136{
137	char *name;
138	int i;
139
140	fetchswap();
141
142	werase(wnd);
143
144	mvwprintw(wnd, 0, 0, "%-5s%*s%*s %s",
145	    "Disk", hlen, header, ulen, "Used",
146	    "/0%  /10  /20  /30  /40  /50  /60  /70  /80  /90  /100");
147
148	for (i = 0; i <= kvnsw; ++i) {
149		if (i == kvnsw) {
150			if (kvnsw == 1)
151				break;
152			name = "Total";
153		} else
154			name = kvmsw[i].ksw_devname;
155		mvwprintw(wnd, i + 1, 0, "%-5s", name);
156	}
157}
158
159void
160showswap()
161{
162	int count;
163	int i;
164
165	if (kvnsw != okvnsw || ulen != oulen)
166		labelswap();
167
168	for (i = 0; i <= kvnsw; ++i) {
169		if (i == kvnsw) {
170			if (kvnsw == 1)
171				break;
172		}
173
174		if (kvmsw[i].ksw_total == 0) {
175			mvwprintw(
176			    wnd,
177			    i + 1,
178			    5 + hlen + ulen + 1,
179			    "(swap not configured)"
180			);
181			continue;
182		}
183
184		wmove(wnd, i + 1, 5);
185
186		wprintw(wnd, "%*d", hlen, CONVERT(kvmsw[i].ksw_total));
187		wprintw(wnd, "%*d", ulen, CONVERT(kvmsw[i].ksw_used));
188
189		count = 50.0 * kvmsw[i].ksw_used / kvmsw[i].ksw_total + 1;
190
191		waddch(wnd, ' ');
192		while (count--)
193			waddch(wnd, 'X');
194	}
195}
196