]> CyberLeo.Net >> Repos - FreeBSD/releng/8.1.git/blob - usr.sbin/kernbb/kernbb.c
Copy stable/8 to releng/8.1 in preparation for 8.1-RC1.
[FreeBSD/releng/8.1.git] / usr.sbin / kernbb / kernbb.c
1 /*
2  * ----------------------------------------------------------------------------
3  * "THE BEER-WARE LICENSE" (Revision 42):
4  * <phk@FreeBSD.org> wrote this file.  As long as you retain this notice you
5  * can do whatever you want with this stuff. If we meet some day, and you think
6  * this stuff is worth it, you can buy me a beer in return.   Poul-Henning Kamp
7  * ----------------------------------------------------------------------------
8  *
9  */
10
11 #include <sys/cdefs.h>
12 __FBSDID("$FreeBSD$");
13
14 #include <err.h>
15 #include <fcntl.h>
16 #include <kvm.h>
17 #include <nlist.h>
18 #include <stdio.h>
19 #include <stdlib.h>
20 #include <string.h>
21 #include <unistd.h>
22 #include <sys/endian.h>
23
24 typedef long long gcov_type;
25
26 #define PARAMS(foo)     foo
27 #define ATTRIBUTE_UNUSED __unused
28 #include "gcov-io.h"
29
30 struct bbf {
31         long    checksum;
32         int     arc_count;
33         u_long  name;
34 };
35
36 struct bb {
37         u_long  zero_one;
38         u_long  filename;
39         u_long  counts;
40         u_long  ncounts;
41         u_long  next;
42         u_long  sizeof_bb;
43         u_long  funcs;
44 };
45
46 struct nlist namelist[] = {
47         { "bbhead", 0, 0, 0, 0 },
48         { NULL, 0, 0, 0, 0 }
49 };
50
51 kvm_t   *kv;
52
53 int
54 main(int argc __unused, char **argv __unused)
55 {
56         int i, funcs;
57         u_long l1,l2,l4;
58         struct bb bb;
59         struct bbf bbf;
60         char buf[BUFSIZ], *p;
61         gcov_type *q, *qr;
62         
63         FILE *f;
64
65         kv = kvm_open(NULL,NULL,NULL,O_RDWR,"dnc");
66         if (!kv) 
67                 err(1,"kvm_open");
68         i = kvm_nlist(kv,namelist);
69         if (i)
70                 err(1,"kvm_nlist");
71
72         l1 = namelist[0].n_value;
73         kvm_read(kv,l1,&l2,sizeof l2);
74         while(l2) {
75                 l1 += sizeof l1;
76                 kvm_read(kv,l2,&bb,sizeof bb);
77 #if 0
78 printf("%lx\n%lx\n%lx\n%lx\n%lx\n%lx\n%lx\n",
79         bb.zero_one, bb.filename, bb.counts, bb.ncounts, bb.next,
80         bb.sizeof_bb, bb.funcs);
81 #endif
82
83                 funcs = 0;
84                 for (l4 = bb.funcs; ; l4 += sizeof (bbf)) {
85                         kvm_read(kv, l4, &bbf, sizeof(bbf));
86                         if (bbf.arc_count == -1)
87                                 break;
88                         funcs++;
89                 }
90                 
91                 l2 = bb.next;
92
93                 kvm_read(kv, bb.filename, buf, sizeof(buf));
94                 p = buf;
95                 f = fopen(p, "w");
96                 if (f != NULL) {
97                         printf("Writing \"%s\"\n", p);
98                 } else {
99                         p = strrchr(buf, '/');
100                         if (p == NULL)
101                                 p = buf;
102                         else
103                                 p++;
104                         printf("Writing \"%s\" (spec \"%s\")\n", p, buf);
105                         f = fopen(p, "w");
106                 }
107                 if (f == NULL)
108                         err(1,"%s", p);
109                 __write_long(-123, f, 4);
110
111                 __write_long(funcs, f, 4);
112
113                 __write_long(4 + 8 + 8 + 4 + 8 + 8, f, 4);
114
115                 __write_long(bb.ncounts, f, 4);
116                 __write_long(0, f, 8);
117                 __write_long(0, f, 8);
118
119                 __write_long(bb.ncounts, f, 4);
120                 __write_long(0, f, 8);
121                 __write_long(0, f, 8);
122
123                 qr = malloc(bb.ncounts * 8);
124                 kvm_read(kv, bb.counts, qr, bb.ncounts * 8);
125                 q = qr;
126                 for (l4 = bb.funcs; ; l4 += sizeof (bbf)) {
127                         kvm_read(kv, l4, &bbf, sizeof(bbf));
128                         if (bbf.arc_count == -1)
129                                 break;
130                         kvm_read(kv, bbf.name, buf, sizeof(buf));
131
132                         __write_gcov_string(buf, strlen(buf), f, -1);
133                         
134                         __write_long(bbf.checksum, f, 4);
135                         __write_long(bbf.arc_count, f, 4);
136                         for (i = 0; i < bbf.arc_count; i++) {
137                                 __write_gcov_type(*q, f, 8);
138                                 q++;
139                         }
140                 }
141                 fclose(f);
142                 free(qr);
143         }
144         return 0;
145 }