static void getinfo(struct Info *stats) { int mib[2]; size_t size; int i; cpureadstats(); drvreadstats(); size = sizeof(stats->nchstats); if (sysctlbyname("vfs.namecache_stats", &stats->nchstats, &size, NULL, 0) < 0) { error("can't get namecache statistics: %s\n", strerror(errno)); memset(&stats->nchstats, 0, sizeof(stats->nchstats)); } if (nintr) NREAD(X_INTRCNT, stats->intrcnt, nintr * LONG); for (i = 0; i < nevcnt; i++) KREAD(ie_head[i].ie_count, &stats->evcnt[i], sizeof stats->evcnt[i]); size = sizeof(stats->uvmexp); mib[0] = CTL_VM; mib[1] = VM_UVMEXP2; if (sysctl(mib, 2, &stats->uvmexp, &size, NULL, 0) < 0) { error("can't get uvmexp: %s\n", strerror(errno)); memset(&stats->uvmexp, 0, sizeof(stats->uvmexp)); } size = sizeof(stats->Total); mib[0] = CTL_VM; mib[1] = VM_METER; if (sysctl(mib, 2, &stats->Total, &size, NULL, 0) < 0) { error("Can't get kernel info: %s\n", strerror(errno)); memset(&stats->Total, 0, sizeof(stats->Total)); } }
int initvmstat(void) { static char *intrnamebuf; char *cp; int i; if (intrnamebuf) free(intrnamebuf); if (intrname) free(intrname); if (intrloc) free(intrloc); if (namelist[0].n_type == 0) { if (kvm_nlist(kd, namelist) && namelist[X_ALLEVENTS].n_type == 0) { nlisterr(namelist); return(0); } } hertz = stathz ? stathz : hz; if (!drvinit(1)) return(0); /* Old style interrupt counts - deprecated */ nintr = (namelist[X_EINTRCNT].n_value - namelist[X_INTRCNT].n_value) / sizeof (long); if (nintr) { intrloc = calloc(nintr, sizeof (long)); intrname = calloc(nintr, sizeof (long)); intrnamebuf = malloc(namelist[X_EINTRNAMES].n_value - namelist[X_INTRNAMES].n_value); if (intrnamebuf == NULL || intrname == 0 || intrloc == 0) { error("Out of memory\n"); nintr = 0; return(0); } NREAD(X_INTRNAMES, intrnamebuf, NVAL(X_EINTRNAMES) - NVAL(X_INTRNAMES)); for (cp = intrnamebuf, i = 0; i < nintr; i++) { intrname[i] = cp; cp += strlen(cp) + 1; } } /* event counter interrupt counts */ get_interrupt_events(); nextintsrow = INTSROW + 1; allocinfo(&s); allocinfo(&s1); allocinfo(&s2); allocinfo(&z); getinfo(&s2); copyinfo(&s2, &s1); return(1); }
static void get_interrupt_events(void) { struct evcntlist allevents; struct evcnt evcnt, *evptr; intr_evcnt_t *ie; intr_evcnt_t *n; if (!NREAD(X_ALLEVENTS, &allevents, sizeof allevents)) return; evptr = TAILQ_FIRST(&allevents); for (; evptr != NULL; evptr = TAILQ_NEXT(&evcnt, ev_list)) { if (!KREAD(evptr, &evcnt, sizeof evcnt)) return; if (evcnt.ev_type != EVCNT_TYPE_INTR) continue; n = realloc(ie_head, sizeof *ie * (nevcnt + 1)); if (n == NULL) { error("realloc failed"); die(0); } ie_head = n; ie = ie_head + nevcnt; ie->ie_group = malloc(evcnt.ev_grouplen + 1); ie->ie_name = malloc(evcnt.ev_namelen + 1); if (ie->ie_group == NULL || ie->ie_name == NULL) return; if (!KREAD(evcnt.ev_group, ie->ie_group, evcnt.ev_grouplen + 1)) return; if (!KREAD(evcnt.ev_name, ie->ie_name, evcnt.ev_namelen + 1)) return; ie->ie_count = &evptr->ev_count; ie->ie_loc = 0; nevcnt++; } }
int main(int argc, char **argv) { int ch; char errbuf[_POSIX2_LINE_MAX]; egid = getegid(); (void)setegid(getgid()); while ((ch = getopt(argc, argv, "M:N:nw:t:")) != -1) switch(ch) { case 'M': memf = optarg; break; case 'N': nlistf = optarg; break; case 'n': nflag = !nflag; break; case 'w': if ((naptime = atoi(optarg)) <= 0) errx(1, "interval <= 0."); break; case 't': if ((turns = atoi(optarg)) <= 0) errx(1, "turns <= 0."); break; case '?': default: usage(); } argc -= optind; argv += optind; for ( ; argc > 0; argc--, argv++) { struct mode *p; int modefound = 0; if (isdigit(argv[0][0])) { naptime = atoi(argv[0]); if (naptime <= 0) naptime = 5; continue; } for (p = modes; p->c_name ; p++) { if (strstr(p->c_name, argv[0]) == p->c_name) { curmode = p; modefound++; break; } if(strstr("all",argv[0]) == "all"){ allcounter=0; allflag=1; } } if (!modefound && !allflag) error("%s: Unknown command.", argv[0]); } /* * Discard setgid privileges. If not the running kernel, we toss * them away totally so that bad guys can't print interesting stuff * from kernel memory, otherwise switch back to kmem for the * duration of the kvm_openfiles() call. */ if (nlistf != NULL || memf != NULL) (void)setgid(getgid()); else (void)setegid(egid); kd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, errbuf); if (kd == NULL) { error("%s", errbuf); exit(1); } /* Get rid of privs for now. */ if (nlistf == NULL && memf == NULL) (void)setegid(getgid()); if (kvm_nlist(kd, namelist)) { if (nlistf) errx(1, "%s: no namelist", nlistf); else errx(1, "no namelist"); } signal(SIGINT, die); signal(SIGQUIT, die); signal(SIGTERM, die); signal(SIGWINCH, redraw); sv_stop_handler = signal(SIGTSTP, stop); /* * Initialize display. Load average appears in a one line * window of its own. Current command's display appears in * an overlapping sub-window of stdscr configured by the display * routines to minimize update work by curses. */ if (initscr() == NULL) { warnx("couldn't initialize screen"); exit(0); } CMDLINE = LINES - 1; wnd = (*curmode->c_open)(); if (wnd == NULL) { warnx("couldn't initialize display"); die(0); } wload = newwin(1, 0, 3, 20); if (wload == NULL) { warnx("couldn't set up load average window"); die(0); } gethostname(hostname, sizeof (hostname)); hostname[sizeof(hostname) - 1] = '\0'; NREAD(X_HZ, &hz, sizeof hz); NREAD(X_STATHZ, &stathz, sizeof stathz); NREAD(X_MAXSLP, &maxslp, sizeof maxslp); (*curmode->c_init)(); curmode->c_flags |= CF_INIT; labels(); dellave = 0.0; signal(SIGALRM, display); display(0); noecho(); cbreak(); keyboard(); /*NOTREACHED*/ }
static void getinfo(struct Info *ls) { struct devinfo *tmp_dinfo; struct nchstats *nch_tmp; size_t size; size_t vms_size = sizeof(ls->Vms); size_t vmm_size = sizeof(ls->Vmm); size_t nch_size = sizeof(ls->nchstats) * SMP_MAXCPU; if (sysctlbyname("vm.vmstats", &ls->Vms, &vms_size, NULL, 0)) { perror("sysctlbyname: vm.vmstats"); exit(1); } if (sysctlbyname("vm.vmmeter", &ls->Vmm, &vmm_size, NULL, 0)) { perror("sysctlbyname: vm.vmstats"); exit(1); } if (kinfo_get_sched_cputime(&ls->cp_time)) err(1, "kinfo_get_sched_cputime"); if (kinfo_get_sched_cputime(&cp_time)) err(1, "kinfo_get_sched_cputime"); NREAD(X_BUFFERSPACE, &ls->bufspace, sizeof(ls->bufspace)); NREAD(X_DESIREDVNODES, &ls->desiredvnodes, sizeof(ls->desiredvnodes)); NREAD(X_NUMVNODES, &ls->numvnodes, sizeof(ls->numvnodes)); NREAD(X_FREEVNODES, &ls->freevnodes, sizeof(ls->freevnodes)); NREAD(X_NUMDIRTYBUFFERS, &ls->dirtybufspace, sizeof(ls->dirtybufspace)); if (nintr) { size = nintr * sizeof(ls->intrcnt[0]); sysctlbyname("hw.intrcnt_all", ls->intrcnt, &size, NULL, 0); } size = sizeof(ls->Total); if (sysctlbyname("vm.vmtotal", &ls->Total, &size, NULL, 0) < 0) { error("Can't get kernel info: %s\n", strerror(errno)); bzero(&ls->Total, sizeof(ls->Total)); } if ((nch_tmp = malloc(nch_size)) == NULL) { perror("malloc"); exit(1); } else { if (sysctlbyname("vfs.cache.nchstats", nch_tmp, &nch_size, NULL, 0)) { perror("sysctlbyname vfs.cache.nchstats"); free(nch_tmp); exit(1); } else { if ((nch_tmp = realloc(nch_tmp, nch_size)) == NULL) { perror("realloc"); exit(1); } } } if (kinfo_get_cpus(&ncpu)) err(1, "kinfo_get_cpus"); kvm_nch_cpuagg(nch_tmp, &ls->nchstats, ncpu); free(nch_tmp); tmp_dinfo = last.dinfo; last.dinfo = cur.dinfo; cur.dinfo = tmp_dinfo; last.busy_time = cur.busy_time; switch (getdevs(&cur)) { case -1: errx(1, "%s", devstat_errbuf); break; case 1: num_devices = cur.dinfo->numdevs; generation = cur.dinfo->generation; cmdkre("refresh", NULL); break; default: break; } }