diff options
-rw-r--r-- | usr.sbin/Makefile | 11 | ||||
-rw-r--r-- | usr.sbin/kernbb/Makefile | 9 | ||||
-rw-r--r-- | usr.sbin/kernbb/kernbb.c | 120 |
3 files changed, 135 insertions, 5 deletions
diff --git a/usr.sbin/Makefile b/usr.sbin/Makefile index 5cdda5d..2a065d7 100644 --- a/usr.sbin/Makefile +++ b/usr.sbin/Makefile @@ -4,11 +4,12 @@ # XXX MISSING SOURCES: quot # XXX TEMP. BROKEN: iostat SUBDIR= ac accton adduser amd arp bootparamd chown chroot cron crunch ctm \ - dev_mkdb diskpart edquota inetd kgmon kvm_mkdb lpr lsdev manctl \ - mtree mrouted named nslookup pkg_install pkg_manage portmap ppp pppd \ - pppstats pstat pwd_mkdb quotaon rarpd repquota routed rmt rwhod sa \ - sendmail sliplogin slstat sysctl syslogd tcpdump timed traceroute \ - trpt tzsetup vipw vnconfig watch xntpd xten ypbind yppoll ypset zic + dev_mkdb diskpart edquota inetd kernbb kgmon kvm_mkdb lpr lsdev \ + manctl mtree mrouted named nslookup pkg_install pkg_manage portmap \ + ppp pppd pppstats pstat pwd_mkdb quotaon rarpd repquota routed rmt \ + rwhod sa sendmail sliplogin slstat sysctl syslogd tcpdump timed \ + traceroute trpt tzsetup vipw vnconfig watch xntpd xten ypbind yppoll \ + ypset zic # # XNSrouted and trsp are of very marginal utility to anyone at this diff --git a/usr.sbin/kernbb/Makefile b/usr.sbin/kernbb/Makefile new file mode 100644 index 0000000..12c4b32 --- /dev/null +++ b/usr.sbin/kernbb/Makefile @@ -0,0 +1,9 @@ +# $Id$ + +PROG= kernbb +NOMAN= 1 +DPADD= ${LIBKVM} +LDADD= -lkvm + +.include <bsd.prog.mk> + diff --git a/usr.sbin/kernbb/kernbb.c b/usr.sbin/kernbb/kernbb.c new file mode 100644 index 0000000..c7b4ae1 --- /dev/null +++ b/usr.sbin/kernbb/kernbb.c @@ -0,0 +1,120 @@ +/* + * ---------------------------------------------------------------------------- + * "THE BEER-WARE LICENSE" (Revision 42): + * <phk@FreeBSD.org> wrote this file. As long as you retain this notice you + * can do whatever you want with this stuff. If we meet some day, and you think + * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp + * ---------------------------------------------------------------------------- + * + * $Id$ + * + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <fcntl.h> +#include <kvm.h> + +#define MAXBB 32768 + +struct bb { + u_long zero_one; + u_long filename; + u_long counts; + u_long ncounts; + u_long next; + u_long addr; + u_long nwords; + u_long func; + u_long lineno; + u_long file; +}; + +struct nlist namelist[] = { + { "bbset" }, + { NULL } +}; + +u_long lineno[MAXBB]; +u_long counts[MAXBB]; +u_long addr[MAXBB]; +u_long func[MAXBB]; +u_long file[MAXBB]; +char *fn[MAXBB]; +char *pn[MAXBB]; + +kvm_t *kv; +main() +{ + int i,j; + u_long l1,l2,l3; + struct bb bb; + char buf[128]; + + kv = kvm_open(NULL,NULL,NULL,O_RDWR,"dnc"); + if (!kv) {perror("kvm_open"); exit(1); } + i = kvm_nlist(kv,namelist); + if (i) {perror("kvm_nlist"); exit(1); } + + l1 = namelist[0].n_value; + kvm_read(kv,l1,&l2,sizeof l2); + while(l2--) { + l1 += sizeof l1; + kvm_read(kv,l1,&l3,sizeof l3); + kvm_read(kv,l3,&bb,sizeof bb); + if (!bb.ncounts) + continue; + if (bb.ncounts > MAXBB) { + fprintf(stderr,"found %u counts above limit of %u\n", + bb.ncounts, MAXBB); + exit (1); + } + kvm_read(kv,bb.lineno,lineno, bb.ncounts * sizeof lineno[0]); + kvm_read(kv,bb.counts,counts, bb.ncounts * sizeof counts[0]); + kvm_read(kv,bb.addr, addr, bb.ncounts * sizeof addr[0]); + kvm_read(kv,bb.file, file, bb.ncounts * sizeof file[0]); + kvm_read(kv,bb.func, func, bb.ncounts * sizeof func[0]); + for (i=0; i < bb.ncounts; i++) + if (counts[i]) + goto doit; + continue; + doit: + for (i=0; i < bb.ncounts; i++) { + if (!pn[i]) { + kvm_read(kv,func[i], buf, sizeof buf); + buf[sizeof buf -1] = 0; + pn[i] = malloc(strlen(buf)+1); + strcpy(pn[i],buf); + for(j=i+1;j<bb.ncounts;j++) + if (func[j] == func[i]) { + pn[j] = pn[i]; + func[j] = 0; + } + } + if (!fn[i]) { + kvm_read(kv,file[i], buf, sizeof buf); + buf[sizeof buf -1] = 0; + fn[i] = malloc(strlen(buf)+1); + strcpy(fn[i],buf); + for(j=i+1;j<bb.ncounts;j++) + if (file[j] == file[i]) { + fn[j] = fn[i]; + file[j] = 0; + } + } + printf("%s %5u %s %u %u\n", + fn[i],lineno[i],pn[i],addr[i],counts[i]); + } + for(i=0;i<bb.ncounts;i++) { + if (!func[i]) + free(pn[i]); + if (!file[i]) + free(fn[i]); + pn[i] = 0; + fn[i] = 0; + } + } + return 0; +} |