Annotation of src/usr.bin/systat/swap.c, Revision 1.21
1.21 ! canacar 1: /* $OpenBSD: swap.c,v 1.20 2007/09/01 19:32:19 deraadt Exp $ */
1.11 weingart 2: /* $NetBSD: swap.c,v 1.9 1998/12/26 07:05:08 marc Exp $ */
1.1 deraadt 3:
4: /*-
1.11 weingart 5: * Copyright (c) 1997 Matthew R. Green. All rights reserved.
1.1 deraadt 6: * Copyright (c) 1980, 1992, 1993
7: * The Regents of the University of California. All rights reserved.
8: *
9: * Redistribution and use in source and binary forms, with or without
10: * modification, are permitted provided that the following conditions
11: * are met:
12: * 1. Redistributions of source code must retain the above copyright
13: * notice, this list of conditions and the following disclaimer.
14: * 2. Redistributions in binary form must reproduce the above copyright
15: * notice, this list of conditions and the following disclaimer in the
16: * documentation and/or other materials provided with the distribution.
1.17 millert 17: * 3. Neither the name of the University nor the names of its contributors
1.1 deraadt 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:
1.11 weingart 34: #include <sys/cdefs.h>
1.1 deraadt 35: #include <sys/param.h>
36: #include <sys/buf.h>
37: #include <sys/conf.h>
38: #include <sys/ioctl.h>
39: #include <sys/stat.h>
1.11 weingart 40: #include <sys/swap.h>
1.1 deraadt 41:
42: #include <stdio.h>
43: #include <stdlib.h>
44: #include <string.h>
1.11 weingart 45: #include <errno.h>
1.1 deraadt 46: #include <unistd.h>
47:
48: #include "systat.h"
1.21 ! canacar 49:
1.1 deraadt 50:
1.11 weingart 51: static long blocksize;
52: static int hlen, nswap, rnswap;
53: static struct swapent *swap_devices;
1.1 deraadt 54:
1.21 ! canacar 55: void print_sw(void);
! 56: int read_sw(void);
! 57: int select_sw(void);
! 58: static void showswap(int i);
! 59: static void showtotal(void);
! 60:
! 61:
! 62: field_def fields_sw[] = {
! 63: {"DISK", 6, 16, 1, FLD_ALIGN_LEFT, -1, 0, 0, 0},
! 64: {"BLOCKS", 5, 10, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
! 65: {"USED", 5, 10, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0},
! 66: {"", 40, 80, 1, FLD_ALIGN_BAR, -1, 0, 0, 100},
! 67: };
! 68:
! 69: #define FIELD_ADDR(x) (&fields_sw[x])
! 70:
! 71: #define FLD_SW_NAME FIELD_ADDR(0)
! 72: #define FLD_SW_BLOCKS FIELD_ADDR(1)
! 73: #define FLD_SW_USED FIELD_ADDR(2)
! 74: #define FLD_SW_BAR FIELD_ADDR(3)
! 75:
! 76: /* Define views */
! 77: field_def *view_sw_0[] = {
! 78: FLD_SW_NAME, FLD_SW_BLOCKS, FLD_SW_USED, FLD_SW_BAR, NULL
! 79: };
! 80:
! 81:
! 82: /* Define view managers */
! 83: struct view_manager swap_mgr = {
! 84: "Swap", select_sw, read_sw, NULL, print_header,
! 85: print_sw, keyboard_callback, NULL, NULL
! 86: };
! 87:
! 88: field_view views_sw[] = {
! 89: {view_sw_0, "swap", '6', &swap_mgr},
! 90: {NULL, NULL, 0, NULL}
! 91: };
1.1 deraadt 92:
93:
1.9 millert 94: int
1.21 ! canacar 95: select_sw(void)
1.1 deraadt 96: {
1.21 ! canacar 97: if (swap_devices == NULL || nswap == 0)
! 98: num_disp = 1;
! 99: else
! 100: num_disp = nswap;
! 101: if (nswap > 1)
! 102: num_disp++;
! 103: return (0);
1.1 deraadt 104: }
105:
1.21 ! canacar 106: int
! 107: read_sw(void)
1.1 deraadt 108: {
1.21 ! canacar 109: num_disp = 1;
1.11 weingart 110:
111: nswap = swapctl(SWAP_NSWAP, 0, 0);
1.21 ! canacar 112:
1.11 weingart 113: if (nswap < 0)
114: error("error: %s", strerror(errno));
115: if (nswap == 0)
1.21 ! canacar 116: return 0;
1.1 deraadt 117:
1.11 weingart 118: if (swap_devices)
119: (void)free(swap_devices);
1.21 ! canacar 120:
1.20 deraadt 121: swap_devices = (struct swapent *)calloc(nswap, sizeof(*swap_devices));
1.11 weingart 122: if (swap_devices == NULL)
1.21 ! canacar 123: return 0;
1.11 weingart 124:
125: rnswap = swapctl(SWAP_STATS, (void *)swap_devices, nswap);
1.21 ! canacar 126: if (rnswap < 0 || nswap != rnswap)
! 127: return 0;
! 128:
! 129: num_disp = nswap;
! 130: if (nswap > 1)
! 131: num_disp++;
! 132:
! 133: return 0;
1.1 deraadt 134: }
135:
1.21 ! canacar 136:
1.1 deraadt 137: void
1.21 ! canacar 138: print_sw(void)
1.1 deraadt 139: {
1.21 ! canacar 140: int n, count = 0;
1.1 deraadt 141:
1.21 ! canacar 142: if (swap_devices == NULL || nswap == 0) {
! 143: print_fld_str(FLD_SW_BAR, "No swap devices");
1.11 weingart 144: return;
145: }
1.21 ! canacar 146:
! 147:
! 148: for (n = dispstart; n < num_disp; n++) {
! 149: if (n >= nswap)
! 150: showtotal();
! 151: else
! 152: showswap(n);
! 153: count++;
! 154: if (maxprint > 0 && count >= maxprint)
! 155: break;
! 156: }
! 157:
! 158: }
! 159:
! 160: int
! 161: initswap(void)
! 162: {
! 163: field_view *v;
! 164:
! 165: char *bs = getbsize(&hlen, &blocksize);
! 166:
! 167: FLD_SW_BLOCKS->title = strdup(bs);
! 168:
! 169: for (v = views_sw; v->name != NULL; v++)
! 170: add_view(v);
! 171:
! 172: return(1);
1.1 deraadt 173: }
174:
1.21 ! canacar 175:
! 176: static void
! 177: showswap(int i)
1.16 deraadt 178: {
1.21 ! canacar 179: int div, used, xsize;
1.11 weingart 180: struct swapent *sep;
181: char *p;
1.1 deraadt 182:
183: div = blocksize / 512;
1.11 weingart 184:
1.21 ! canacar 185: sep = &swap_devices[i];
! 186:
! 187: p = strrchr(sep->se_path, '/');
! 188: p = p ? p+1 : sep->se_path;
! 189:
! 190: print_fld_str(FLD_SW_NAME, p);
! 191:
! 192: xsize = sep->se_nblks;
! 193: used = sep->se_inuse;
! 194:
! 195: print_fld_uint(FLD_SW_BLOCKS, xsize / div);
! 196: print_fld_uint(FLD_SW_USED, used / div);
! 197: print_fld_bar(FLD_SW_BAR, 100 * used / xsize);
! 198:
! 199: end_line();
! 200: }
1.11 weingart 201:
1.21 ! canacar 202: static void
! 203: showtotal(void)
! 204: {
! 205: struct swapent *sep;
! 206: int div, i, avail, used, xsize, free;
1.11 weingart 207:
1.21 ! canacar 208: div = blocksize / 512;
! 209: free = avail = 0;
1.11 weingart 210:
1.21 ! canacar 211: for (sep = swap_devices, i = 0; i < nswap; i++, sep++) {
1.11 weingart 212: xsize = sep->se_nblks;
213: used = sep->se_inuse;
214: avail += xsize;
215: free += xsize - used;
1.1 deraadt 216: }
1.21 ! canacar 217: used = avail - free;
! 218:
! 219: print_fld_str(FLD_SW_NAME, "Total");
! 220: print_fld_uint(FLD_SW_BLOCKS, avail / div);
! 221: print_fld_uint(FLD_SW_USED, used / div);
! 222: print_fld_bar(FLD_SW_BAR, 100 * used / avail);
! 223:
! 224: end_line();
1.1 deraadt 225: }