#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "dat.h" void xapm(int); void xloadavg(int); void xcpu(int); void xswap(int); void xsysctl(int); void xnet(int); void (*statfn[])(int) = { xapm, xloadavg, xcpu, xsysctl, xnet, 0 }; void xloadavg(int first) { double l[3]; if(first) return; if(getloadavg(l, 3) < 0) return; Bprint(&bout, "load =%d 1000\n", (int)(l[0]*1000.0)); } void xapm(int first) { static int fd; struct apm_power_info ai; if(first){ fd = open("/dev/apm", OREAD); return; } if(ioctl(fd, APM_IOC_GETPOWER, &ai) < 0) return; if(ai.battery_life <= 100) Bprint(&bout, "battery =%d 100\n", ai.battery_life); } void xnet(int first) { ulong out, in, outb, inb, err; struct ifaddrs *ifa, *ifap; struct if_data *ifd = NULL; if (first) return; out = in = outb = inb = err = 0; if (getifaddrs(&ifap) == -1) return; for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) { if (ifa->ifa_addr == NULL || ifa->ifa_addr->sa_family != AF_LINK) continue; ifd = ifa->ifa_data; if (ifd != NULL) { out += ifd->ifi_opackets; in += ifd->ifi_ipackets; outb += ifd->ifi_obytes; inb += ifd->ifi_ibytes; err += ifd->ifi_ierrors; } } Bprint(&bout, "etherin %lud 1000\n", in); Bprint(&bout, "etherout %lud 1000\n", out); Bprint(&bout, "etherinb %lud 1000000\n", inb); Bprint(&bout, "etheroutb %lud 1000000\n", outb); Bprint(&bout, "ethererr %lud 1000\n", err); Bprint(&bout, "ether %lud 1000\n", in+out); Bprint(&bout, "etherb %lud 1000000\n", inb+outb); freeifaddrs(ifap); } void xcpu(int first) { static int stathz; ulong x[20]; struct clockinfo *ci; int mib[2]; size_t l; if(first){ mib[0] = CTL_KERN; mib[1] = KERN_CLOCKRATE; l = sizeof(x); sysctl(mib, 2, (char *)&x, &l, nil, 0); x[l] = 0; if (l < sizeof(ci)) stathz = 128; else{ ci = (struct clockinfo*)x; stathz = ci->stathz; } return; } mib[0] = CTL_KERN; mib[1] = KERN_CPTIME; l = sizeof(x); sysctl(mib, 2, (char *)&x, &l, nil, 0); if (l < 5*sizeof(ulong)) return; x[l] = 0; Bprint(&bout, "user %lud %d\n", x[CP_USER]+x[CP_NICE], stathz); Bprint(&bout, "sys %lud %d\n", x[CP_SYS], stathz); Bprint(&bout, "cpu %lud %d\n", x[CP_USER]+x[CP_NICE]+x[CP_SYS], stathz); Bprint(&bout, "idle %lud %d\n", x[CP_IDLE], stathz); } void xsysctl(int first) { struct uvmexp vm; static int pgsize; int mib[2]; size_t l; l = sizeof(vm); mib[0] = CTL_VM; mib[1] = VM_UVMEXP; sysctl(mib, 2, &vm, &l, nil, 0); if (l < sizeof(vm)) return; if (first) pgsize = vm.pagesize; Bprint(&bout, "mem =%lud %lud\n", vm.active*pgsize, vm.npages*pgsize); Bprint(&bout, "context %lud 1000\n", vm.swtch); Bprint(&bout, "syscall %lud 1000\n", vm.syscalls); Bprint(&bout, "intr %lud 1000\n", vm.intrs+vm.traps); Bprint(&bout, "fault %lud 1000\n", vm.faults); Bprint(&bout, "fork %ud 1000\n", vm.forks); Bprint(&bout, "swap =%lud %lud\n", vm.swpginuse*pgsize, vm.swpages*pgsize); }