version 1.20, 2007/09/01 19:32:19 |
version 1.21, 2008/06/12 22:26:01 |
|
|
* SUCH DAMAGE. |
* SUCH DAMAGE. |
*/ |
*/ |
|
|
#ifndef lint |
|
#if 0 |
|
static char sccsid[] = "@(#)swap.c 8.3 (Berkeley) 4/29/95"; |
|
#endif |
|
static char rcsid[] = "$OpenBSD$"; |
|
#endif /* not lint */ |
|
|
|
#include <sys/cdefs.h> |
#include <sys/cdefs.h> |
#include <sys/param.h> |
#include <sys/param.h> |
#include <sys/buf.h> |
#include <sys/buf.h> |
|
|
#include <unistd.h> |
#include <unistd.h> |
|
|
#include "systat.h" |
#include "systat.h" |
#include "extern.h" |
|
|
|
|
|
static long blocksize; |
static long blocksize; |
static int hlen, nswap, rnswap; |
static int hlen, nswap, rnswap; |
static int first = 1; |
|
static struct swapent *swap_devices; |
static struct swapent *swap_devices; |
|
|
WINDOW * |
void print_sw(void); |
openswap(void) |
int read_sw(void); |
{ |
int select_sw(void); |
return (subwin(stdscr, LINES-1-2, 0, 2, 0)); |
static void showswap(int i); |
} |
static void showtotal(void); |
|
|
void |
|
closeswap(WINDOW *w) |
|
{ |
|
if (w == NULL) |
|
return; |
|
wclear(w); |
|
wrefresh(w); |
|
delwin(w); |
|
} |
|
|
|
/* do nothing */ |
field_def fields_sw[] = { |
|
{"DISK", 6, 16, 1, FLD_ALIGN_LEFT, -1, 0, 0, 0}, |
|
{"BLOCKS", 5, 10, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0}, |
|
{"USED", 5, 10, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0}, |
|
{"", 40, 80, 1, FLD_ALIGN_BAR, -1, 0, 0, 100}, |
|
}; |
|
|
|
#define FIELD_ADDR(x) (&fields_sw[x]) |
|
|
|
#define FLD_SW_NAME FIELD_ADDR(0) |
|
#define FLD_SW_BLOCKS FIELD_ADDR(1) |
|
#define FLD_SW_USED FIELD_ADDR(2) |
|
#define FLD_SW_BAR FIELD_ADDR(3) |
|
|
|
/* Define views */ |
|
field_def *view_sw_0[] = { |
|
FLD_SW_NAME, FLD_SW_BLOCKS, FLD_SW_USED, FLD_SW_BAR, NULL |
|
}; |
|
|
|
|
|
/* Define view managers */ |
|
struct view_manager swap_mgr = { |
|
"Swap", select_sw, read_sw, NULL, print_header, |
|
print_sw, keyboard_callback, NULL, NULL |
|
}; |
|
|
|
field_view views_sw[] = { |
|
{view_sw_0, "swap", '6', &swap_mgr}, |
|
{NULL, NULL, 0, NULL} |
|
}; |
|
|
|
|
int |
int |
initswap(void) |
select_sw(void) |
{ |
{ |
return (1); |
if (swap_devices == NULL || nswap == 0) |
|
num_disp = 1; |
|
else |
|
num_disp = nswap; |
|
if (nswap > 1) |
|
num_disp++; |
|
return (0); |
} |
} |
|
|
void |
int |
fetchswap(void) |
read_sw(void) |
{ |
{ |
int update_label = 0; |
num_disp = 1; |
|
|
first = 0; |
|
nswap = swapctl(SWAP_NSWAP, 0, 0); |
nswap = swapctl(SWAP_NSWAP, 0, 0); |
|
|
if (nswap < 0) |
if (nswap < 0) |
error("error: %s", strerror(errno)); |
error("error: %s", strerror(errno)); |
if (nswap == 0) |
if (nswap == 0) |
return; |
return 0; |
update_label = (nswap != rnswap); |
|
|
|
if (swap_devices) |
if (swap_devices) |
(void)free(swap_devices); |
(void)free(swap_devices); |
|
|
swap_devices = (struct swapent *)calloc(nswap, sizeof(*swap_devices)); |
swap_devices = (struct swapent *)calloc(nswap, sizeof(*swap_devices)); |
if (swap_devices == NULL) |
if (swap_devices == NULL) |
/* XXX */ ; /* XXX systat doesn't do errors! */ |
return 0; |
|
|
rnswap = swapctl(SWAP_STATS, (void *)swap_devices, nswap); |
rnswap = swapctl(SWAP_STATS, (void *)swap_devices, nswap); |
if (nswap < 0) |
if (rnswap < 0 || nswap != rnswap) |
/* XXX */ ; /* XXX systat doesn't do errors! */ |
return 0; |
if (nswap != rnswap) |
|
/* XXX */ ; /* XXX systat doesn't do errors! */ |
num_disp = nswap; |
if (update_label) |
if (nswap > 1) |
labelswap(); |
num_disp++; |
|
|
|
return 0; |
} |
} |
|
|
|
|
void |
void |
labelswap(void) |
print_sw(void) |
{ |
{ |
char *header; |
int n, count = 0; |
int row; |
|
|
|
row = 0; |
if (swap_devices == NULL || nswap == 0) { |
wmove(wnd, row, 0); |
print_fld_str(FLD_SW_BAR, "No swap devices"); |
wclrtobot(wnd); |
|
if (first) |
|
fetchswap(); |
|
if (nswap == 0) { |
|
mvwprintw(wnd, row++, 0, "No swap"); |
|
return; |
return; |
} |
} |
header = getbsize(&hlen, &blocksize); |
|
mvwprintw(wnd, row++, 0, "%-5s%*s%9s %55s", |
|
"Disk", hlen, header, "Used", |
for (n = dispstart; n < num_disp; n++) { |
"/0% /10% /20% /30% /40% /50% /60% /70% /80% /90% /100%"); |
if (n >= nswap) |
|
showtotal(); |
|
else |
|
showswap(n); |
|
count++; |
|
if (maxprint > 0 && count >= maxprint) |
|
break; |
|
} |
|
|
} |
} |
|
|
void |
int |
showswap(void) |
initswap(void) |
{ |
{ |
int col, div, i, j, avail, used, xsize, free; |
field_view *v; |
|
|
|
char *bs = getbsize(&hlen, &blocksize); |
|
|
|
FLD_SW_BLOCKS->title = strdup(bs); |
|
|
|
for (v = views_sw; v->name != NULL; v++) |
|
add_view(v); |
|
|
|
return(1); |
|
} |
|
|
|
|
|
static void |
|
showswap(int i) |
|
{ |
|
int div, used, xsize; |
struct swapent *sep; |
struct swapent *sep; |
char *p; |
char *p; |
|
|
div = blocksize / 512; |
div = blocksize / 512; |
free = avail = 0; |
|
for (sep = swap_devices, i = 0; i < nswap; i++, sep++) { |
|
if (sep == NULL) |
|
continue; |
|
|
|
p = strrchr(sep->se_path, '/'); |
sep = &swap_devices[i]; |
p = p ? p+1 : sep->se_path; |
|
|
|
mvwprintw(wnd, i + 1, 0, "%-5s", p); |
p = strrchr(sep->se_path, '/'); |
|
p = p ? p+1 : sep->se_path; |
|
|
col = 5; |
print_fld_str(FLD_SW_NAME, p); |
mvwprintw(wnd, i + 1, col, "%*d", hlen, sep->se_nblks / div); |
|
|
xsize = sep->se_nblks; |
|
used = sep->se_inuse; |
|
|
col += hlen; |
print_fld_uint(FLD_SW_BLOCKS, xsize / div); |
|
print_fld_uint(FLD_SW_USED, used / div); |
|
print_fld_bar(FLD_SW_BAR, 100 * used / xsize); |
|
|
|
end_line(); |
|
} |
|
|
|
static void |
|
showtotal(void) |
|
{ |
|
struct swapent *sep; |
|
int div, i, avail, used, xsize, free; |
|
|
|
div = blocksize / 512; |
|
free = avail = 0; |
|
|
|
for (sep = swap_devices, i = 0; i < nswap; i++, sep++) { |
xsize = sep->se_nblks; |
xsize = sep->se_nblks; |
used = sep->se_inuse; |
used = sep->se_inuse; |
avail += xsize; |
avail += xsize; |
free += xsize - used; |
free += xsize - used; |
mvwprintw(wnd, i + 1, col, "%9d ", used / div); |
|
for (j = (100 * used / xsize + 1) / 2; j > 0; j--) |
|
waddch(wnd, 'X'); |
|
wclrtoeol(wnd); |
|
} |
} |
/* do total if necessary */ |
used = avail - free; |
if (nswap > 1) { |
|
used = avail - free; |
print_fld_str(FLD_SW_NAME, "Total"); |
mvwprintw(wnd, i + 1, 0, "%-5s%*d%9d ", |
print_fld_uint(FLD_SW_BLOCKS, avail / div); |
"Total", hlen, avail / div, used / div); |
print_fld_uint(FLD_SW_USED, used / div); |
for (j = (100 * used / avail + 1) / 2; j > 0; j--) |
print_fld_bar(FLD_SW_BAR, 100 * used / avail); |
waddch(wnd, 'X'); |
|
wclrtoeol(wnd); |
end_line(); |
} |
|
} |
} |