* Copyright (c) 1980, 1986, 1991, 1993
* The Regents of the University of California. All rights reserved.
* %sccs.include.redist.c%
static char copyright
[] =
"@(#) Copyright (c) 1980, 1986, 1991, 1993\n\
The Regents of the University of California. All rights reserved.\n";
static char sccsid
[] = "@(#)main.c 8.1 (Berkeley) %G%";
#include <sys/disklabel.h>
struct dkinfo
*dkinfo
, **nextdk
= &dkinfo
;
void dkadd
__P((u_long
, struct device
*));
char **dkselect
__P((char **));
void getdisks
__P((u_long
));
int isdk
__P((struct device
*));
char errbuf
[_POSIX2_LINE_MAX
];
interval
= reps
= todo
= 0;
while ((c
= getopt(argc
, argv
, "c:iM:mN:sw:")) != EOF
) {
errexit("usage: vmstat [-ims] [-c count] [-M core] \
[-N system] [-w wait] [disks]\n");
* Discard setgid privileges if not the running kernel so that bad
* guys can't print interesting stuff from kernel memory.
if (nlistf
!= NULL
|| memf
!= NULL
)
kd
= kvm_openfiles(nlistf
, memf
, NULL
, O_RDONLY
, errbuf
);
"vmstat: kvm_openfiles: %s\n", errbuf
);
if ((c
= kvm_nlist(kd
, nl
)) != 0) {
"vmstat: undefined symbols: ");
for (c
= 0; c
< sizeof(nl
)/sizeof(nl
[0]) - 1; c
++)
printf(" %s", nl
[c
].n_name
);
(void)fputc('\n', stderr
);
(void)fprintf(stderr
, "vmstat: kvm_nlist: %s\n",
getdev(nl
[X_ALLDEVS
].n_value
, isdk
, dkadd
);
#define BACKWARD_COMPATIBILITY
#ifdef BACKWARD_COMPATIBILITY
dovmstat(interval
, reps
);
return (dv
->dv_class
== DV_DISK
);
register struct dkinfo
*dk
;
if (dk
== NULL
|| (dk
->dk_name
= strdup(name
)) == NULL
)
errexit("dkadd(%s): malloc: %s\n", name
, strerror(errno
));
dk
->dk_2c
[1] = name
[strlen(name
) - 1];
* Fill in dk_oxfer so that we can compute deltas next time.
(void)snprintf(buf
, sizeof buf
, "%s xfer", name
);
kread(addr
+ offsetof(struct dkdevice
, dk_xfer
),
&dk
->dk_oxfer
, sizeof dk
->dk_oxfer
, buf
);
* Choose drives to be displayed. Priority goes to (in order) drives
* supplied as arguments, default drives. If everything isn't filled
* in and there are drives not taken care of, display the first few
register struct dkinfo
*dk
;
register char **cpp
, *cp
;
extern char *defdrives
[];
#define BACKWARD_COMPATIBILITY
for (; (cp
= *argv
) != NULL
; ++argv
) {
#ifdef BACKWARD_COMPATIBILITY
for (dk
= dkinfo
; dk
!= NULL
; dk
= dk
->dk_next
) {
if (strcmp(dk
->dk_name
, cp
) != 0)
for (dk
= dkinfo
; dk
!= NULL
&& ndrives
< 4; dk
= dk
->dk_next
) {
for (cpp
= defdrives
; (cp
= *cpp
) != NULL
; cpp
++)
if (strcmp(dk
->dk_name
, cp
) == 0) {
for (dk
= dkinfo
; dk
!= NULL
&& ndrives
< 4; dk
= dk
->dk_next
) {
kread(nl
[X_BOOTTIME
].n_value
, &boottime
, sizeof boottime
,
if (uptime
<= 0 || uptime
> 60*60*24*365*10) {
"vmstat: time makes no sense; namelist must be wrong.\n");