Blame


1 7a4ee46d 2003-11-23 devnull #include "stdinc.h"
2 7a4ee46d 2003-11-23 devnull #include "dat.h"
3 7a4ee46d 2003-11-23 devnull #include "fns.h"
4 7a4ee46d 2003-11-23 devnull #include "httpd.h"
5 7a4ee46d 2003-11-23 devnull #include "xml.h"
6 7a4ee46d 2003-11-23 devnull
7 7a4ee46d 2003-11-23 devnull typedef struct HttpObj HttpObj;
8 7a4ee46d 2003-11-23 devnull
9 7a4ee46d 2003-11-23 devnull enum
10 7a4ee46d 2003-11-23 devnull {
11 7a4ee46d 2003-11-23 devnull ObjNameSize = 64,
12 7a4ee46d 2003-11-23 devnull MaxObjs = 16
13 7a4ee46d 2003-11-23 devnull };
14 7a4ee46d 2003-11-23 devnull
15 7a4ee46d 2003-11-23 devnull struct HttpObj
16 7a4ee46d 2003-11-23 devnull {
17 7a4ee46d 2003-11-23 devnull char name[ObjNameSize];
18 7a4ee46d 2003-11-23 devnull int (*f)(HConnect*);
19 7a4ee46d 2003-11-23 devnull };
20 7a4ee46d 2003-11-23 devnull
21 7a4ee46d 2003-11-23 devnull static HttpObj objs[MaxObjs];
22 7a4ee46d 2003-11-23 devnull
23 7a4ee46d 2003-11-23 devnull static void listenproc(void*);
24 7a4ee46d 2003-11-23 devnull static int estats(HConnect *c);
25 7a4ee46d 2003-11-23 devnull static int dindex(HConnect *c);
26 7a4ee46d 2003-11-23 devnull static int xindex(HConnect *c);
27 7a4ee46d 2003-11-23 devnull static int sindex(HConnect *c);
28 7a4ee46d 2003-11-23 devnull static int notfound(HConnect *c);
29 7a4ee46d 2003-11-23 devnull static int httpdobj(char *name, int (*f)(HConnect*));
30 7a4ee46d 2003-11-23 devnull
31 7a4ee46d 2003-11-23 devnull int
32 7a4ee46d 2003-11-23 devnull httpdinit(char *address)
33 7a4ee46d 2003-11-23 devnull {
34 7a4ee46d 2003-11-23 devnull fmtinstall('D', hdatefmt);
35 7a4ee46d 2003-11-23 devnull fmtinstall('H', httpfmt);
36 7a4ee46d 2003-11-23 devnull fmtinstall('U', hurlfmt);
37 7a4ee46d 2003-11-23 devnull
38 7a4ee46d 2003-11-23 devnull if(address == nil)
39 7a4ee46d 2003-11-23 devnull address = "tcp!*!http";
40 7a4ee46d 2003-11-23 devnull
41 7a4ee46d 2003-11-23 devnull httpdobj("/stats", estats);
42 7a4ee46d 2003-11-23 devnull httpdobj("/index", dindex);
43 7a4ee46d 2003-11-23 devnull httpdobj("/storage", sindex);
44 7a4ee46d 2003-11-23 devnull httpdobj("/xindex", xindex);
45 7a4ee46d 2003-11-23 devnull
46 7a4ee46d 2003-11-23 devnull if(vtproc(listenproc, address) < 0)
47 7a4ee46d 2003-11-23 devnull return -1;
48 7a4ee46d 2003-11-23 devnull return 0;
49 7a4ee46d 2003-11-23 devnull }
50 7a4ee46d 2003-11-23 devnull
51 7a4ee46d 2003-11-23 devnull static int
52 7a4ee46d 2003-11-23 devnull httpdobj(char *name, int (*f)(HConnect*))
53 7a4ee46d 2003-11-23 devnull {
54 7a4ee46d 2003-11-23 devnull int i;
55 7a4ee46d 2003-11-23 devnull
56 7a4ee46d 2003-11-23 devnull if(name == nil || strlen(name) >= ObjNameSize)
57 7a4ee46d 2003-11-23 devnull return -1;
58 7a4ee46d 2003-11-23 devnull for(i = 0; i < MaxObjs; i++){
59 7a4ee46d 2003-11-23 devnull if(objs[i].name[0] == '\0'){
60 7a4ee46d 2003-11-23 devnull strcpy(objs[i].name, name);
61 7a4ee46d 2003-11-23 devnull objs[i].f = f;
62 7a4ee46d 2003-11-23 devnull return 0;
63 7a4ee46d 2003-11-23 devnull }
64 7a4ee46d 2003-11-23 devnull if(strcmp(objs[i].name, name) == 0)
65 7a4ee46d 2003-11-23 devnull return -1;
66 7a4ee46d 2003-11-23 devnull }
67 7a4ee46d 2003-11-23 devnull return -1;
68 7a4ee46d 2003-11-23 devnull }
69 7a4ee46d 2003-11-23 devnull
70 7a4ee46d 2003-11-23 devnull static HConnect*
71 7a4ee46d 2003-11-23 devnull mkconnect(void)
72 7a4ee46d 2003-11-23 devnull {
73 7a4ee46d 2003-11-23 devnull HConnect *c;
74 7a4ee46d 2003-11-23 devnull
75 7a4ee46d 2003-11-23 devnull c = mallocz(sizeof(HConnect), 1);
76 7a4ee46d 2003-11-23 devnull if(c == nil)
77 7a4ee46d 2003-11-23 devnull sysfatal("out of memory");
78 7a4ee46d 2003-11-23 devnull c->replog = nil;
79 7a4ee46d 2003-11-23 devnull c->hpos = c->header;
80 7a4ee46d 2003-11-23 devnull c->hstop = c->header;
81 7a4ee46d 2003-11-23 devnull return c;
82 7a4ee46d 2003-11-23 devnull }
83 7a4ee46d 2003-11-23 devnull
84 7a4ee46d 2003-11-23 devnull void httpproc(void*);
85 7a4ee46d 2003-11-23 devnull
86 7a4ee46d 2003-11-23 devnull static void
87 7a4ee46d 2003-11-23 devnull listenproc(void *vaddress)
88 7a4ee46d 2003-11-23 devnull {
89 7a4ee46d 2003-11-23 devnull HConnect *c;
90 7a4ee46d 2003-11-23 devnull char *address, ndir[NETPATHLEN], dir[NETPATHLEN];
91 7a4ee46d 2003-11-23 devnull int ctl, nctl, data;
92 7a4ee46d 2003-11-23 devnull
93 7a4ee46d 2003-11-23 devnull //sleep(1000); /* let strace find us */
94 7a4ee46d 2003-11-23 devnull
95 7a4ee46d 2003-11-23 devnull address = vaddress;
96 7a4ee46d 2003-11-23 devnull ctl = announce(address, dir);
97 7a4ee46d 2003-11-23 devnull if(ctl < 0){
98 7a4ee46d 2003-11-23 devnull fprint(2, "venti: httpd can't announce on %s: %r\n", address);
99 7a4ee46d 2003-11-23 devnull return;
100 7a4ee46d 2003-11-23 devnull }
101 7a4ee46d 2003-11-23 devnull
102 7a4ee46d 2003-11-23 devnull print("announce ctl %d dir %s\n", ctl, dir);
103 7a4ee46d 2003-11-23 devnull for(;;){
104 7a4ee46d 2003-11-23 devnull /*
105 7a4ee46d 2003-11-23 devnull * wait for a call (or an error)
106 7a4ee46d 2003-11-23 devnull */
107 7a4ee46d 2003-11-23 devnull nctl = listen(dir, ndir);
108 7a4ee46d 2003-11-23 devnull print("httpd listen %d %s...\n", nctl, ndir);
109 7a4ee46d 2003-11-23 devnull if(nctl < 0){
110 7a4ee46d 2003-11-23 devnull fprint(2, "venti: httpd can't listen on %s: %r\n", address);
111 7a4ee46d 2003-11-23 devnull return;
112 7a4ee46d 2003-11-23 devnull }
113 7a4ee46d 2003-11-23 devnull
114 7a4ee46d 2003-11-23 devnull data = accept(ctl, ndir);
115 7a4ee46d 2003-11-23 devnull print("httpd accept %d...\n", data);
116 7a4ee46d 2003-11-23 devnull if(data < 0){
117 7a4ee46d 2003-11-23 devnull fprint(2, "venti: httpd accept: %r\n");
118 7a4ee46d 2003-11-23 devnull close(nctl);
119 7a4ee46d 2003-11-23 devnull continue;
120 7a4ee46d 2003-11-23 devnull }
121 7a4ee46d 2003-11-23 devnull print("httpd close nctl %d\n", nctl);
122 7a4ee46d 2003-11-23 devnull close(nctl);
123 7a4ee46d 2003-11-23 devnull c = mkconnect();
124 7a4ee46d 2003-11-23 devnull hinit(&c->hin, data, Hread);
125 7a4ee46d 2003-11-23 devnull hinit(&c->hout, data, Hwrite);
126 7a4ee46d 2003-11-23 devnull vtproc(httpproc, c);
127 7a4ee46d 2003-11-23 devnull }
128 7a4ee46d 2003-11-23 devnull }
129 7a4ee46d 2003-11-23 devnull
130 7a4ee46d 2003-11-23 devnull void
131 7a4ee46d 2003-11-23 devnull httpproc(void *v)
132 7a4ee46d 2003-11-23 devnull {
133 7a4ee46d 2003-11-23 devnull HConnect *c;
134 7a4ee46d 2003-11-23 devnull int ok, t, i;
135 7a4ee46d 2003-11-23 devnull
136 7a4ee46d 2003-11-23 devnull //sleep(1000); /* let strace find us */
137 7a4ee46d 2003-11-23 devnull c = v;
138 7a4ee46d 2003-11-23 devnull
139 7a4ee46d 2003-11-23 devnull for(t = 15*60*1000; ; t = 15*1000){
140 24998851 2004-03-11 devnull if(hparsereq(c, t) < 0)
141 7a4ee46d 2003-11-23 devnull break;
142 7a4ee46d 2003-11-23 devnull
143 7a4ee46d 2003-11-23 devnull ok = -1;
144 7a4ee46d 2003-11-23 devnull for(i = 0; i < MaxObjs && objs[i].name[0]; i++){
145 7a4ee46d 2003-11-23 devnull if(strcmp(c->req.uri, objs[i].name) == 0){
146 7a4ee46d 2003-11-23 devnull ok = (*objs[i].f)(c);
147 7a4ee46d 2003-11-23 devnull break;
148 7a4ee46d 2003-11-23 devnull }
149 7a4ee46d 2003-11-23 devnull }
150 7a4ee46d 2003-11-23 devnull if(i == MaxObjs)
151 7a4ee46d 2003-11-23 devnull ok = notfound(c);
152 7a4ee46d 2003-11-23 devnull if(c->head.closeit)
153 7a4ee46d 2003-11-23 devnull ok = -1;
154 7a4ee46d 2003-11-23 devnull hreqcleanup(c);
155 7a4ee46d 2003-11-23 devnull
156 7a4ee46d 2003-11-23 devnull if(ok < 0)
157 7a4ee46d 2003-11-23 devnull break;
158 7a4ee46d 2003-11-23 devnull }
159 7a4ee46d 2003-11-23 devnull hreqcleanup(c);
160 7a4ee46d 2003-11-23 devnull close(c->hin.fd);
161 7a4ee46d 2003-11-23 devnull free(c);
162 7a4ee46d 2003-11-23 devnull }
163 7a4ee46d 2003-11-23 devnull
164 7a4ee46d 2003-11-23 devnull static int
165 7a4ee46d 2003-11-23 devnull percent(long v, long total)
166 7a4ee46d 2003-11-23 devnull {
167 7a4ee46d 2003-11-23 devnull if(total == 0)
168 7a4ee46d 2003-11-23 devnull total = 1;
169 7a4ee46d 2003-11-23 devnull if(v < 1000*1000)
170 7a4ee46d 2003-11-23 devnull return (v * 100) / total;
171 7a4ee46d 2003-11-23 devnull total /= 100;
172 7a4ee46d 2003-11-23 devnull if(total == 0)
173 7a4ee46d 2003-11-23 devnull total = 1;
174 7a4ee46d 2003-11-23 devnull return v / total;
175 7a4ee46d 2003-11-23 devnull }
176 7a4ee46d 2003-11-23 devnull
177 7a4ee46d 2003-11-23 devnull static int
178 7a4ee46d 2003-11-23 devnull preq(HConnect *c)
179 7a4ee46d 2003-11-23 devnull {
180 7a4ee46d 2003-11-23 devnull if(hparseheaders(c, 15*60*1000) < 0)
181 24998851 2004-03-11 devnull {
182 24998851 2004-03-11 devnull fprint(2, "hparseheaders failed\n");
183 7a4ee46d 2003-11-23 devnull return -1;
184 24998851 2004-03-11 devnull }
185 7a4ee46d 2003-11-23 devnull if(strcmp(c->req.meth, "GET") != 0
186 7a4ee46d 2003-11-23 devnull && strcmp(c->req.meth, "HEAD") != 0)
187 7a4ee46d 2003-11-23 devnull return hunallowed(c, "GET, HEAD");
188 7a4ee46d 2003-11-23 devnull if(c->head.expectother || c->head.expectcont)
189 7a4ee46d 2003-11-23 devnull return hfail(c, HExpectFail, nil);
190 7a4ee46d 2003-11-23 devnull return 0;
191 7a4ee46d 2003-11-23 devnull }
192 7a4ee46d 2003-11-23 devnull
193 7a4ee46d 2003-11-23 devnull static int
194 7a4ee46d 2003-11-23 devnull preqtext(HConnect *c)
195 7a4ee46d 2003-11-23 devnull {
196 7a4ee46d 2003-11-23 devnull Hio *hout;
197 7a4ee46d 2003-11-23 devnull int r;
198 7a4ee46d 2003-11-23 devnull
199 7a4ee46d 2003-11-23 devnull r = preq(c);
200 24998851 2004-03-11 devnull if(r < 0)
201 7a4ee46d 2003-11-23 devnull return r;
202 7a4ee46d 2003-11-23 devnull
203 7a4ee46d 2003-11-23 devnull hout = &c->hout;
204 7a4ee46d 2003-11-23 devnull if(c->req.vermaj){
205 7a4ee46d 2003-11-23 devnull hokheaders(c);
206 7a4ee46d 2003-11-23 devnull hprint(hout, "Content-type: text/plain\r\n");
207 7a4ee46d 2003-11-23 devnull if(http11(c))
208 7a4ee46d 2003-11-23 devnull hprint(hout, "Transfer-Encoding: chunked\r\n");
209 7a4ee46d 2003-11-23 devnull hprint(hout, "\r\n");
210 7a4ee46d 2003-11-23 devnull }
211 7a4ee46d 2003-11-23 devnull
212 7a4ee46d 2003-11-23 devnull if(http11(c))
213 7a4ee46d 2003-11-23 devnull hxferenc(hout, 1);
214 7a4ee46d 2003-11-23 devnull else
215 7a4ee46d 2003-11-23 devnull c->head.closeit = 1;
216 7a4ee46d 2003-11-23 devnull return 0;
217 7a4ee46d 2003-11-23 devnull }
218 7a4ee46d 2003-11-23 devnull
219 7a4ee46d 2003-11-23 devnull static int
220 7a4ee46d 2003-11-23 devnull notfound(HConnect *c)
221 7a4ee46d 2003-11-23 devnull {
222 7a4ee46d 2003-11-23 devnull int r;
223 7a4ee46d 2003-11-23 devnull
224 7a4ee46d 2003-11-23 devnull r = preq(c);
225 24998851 2004-03-11 devnull if(r < 0)
226 7a4ee46d 2003-11-23 devnull return r;
227 7a4ee46d 2003-11-23 devnull return hfail(c, HNotFound, c->req.uri);
228 7a4ee46d 2003-11-23 devnull }
229 7a4ee46d 2003-11-23 devnull
230 7a4ee46d 2003-11-23 devnull static int
231 7a4ee46d 2003-11-23 devnull estats(HConnect *c)
232 7a4ee46d 2003-11-23 devnull {
233 7a4ee46d 2003-11-23 devnull Hio *hout;
234 7a4ee46d 2003-11-23 devnull int r;
235 7a4ee46d 2003-11-23 devnull
236 7a4ee46d 2003-11-23 devnull r = preqtext(c);
237 24998851 2004-03-11 devnull if(r < 0)
238 7a4ee46d 2003-11-23 devnull return r;
239 7a4ee46d 2003-11-23 devnull
240 9ffbb5ad 2004-03-12 devnull
241 7a4ee46d 2003-11-23 devnull hout = &c->hout;
242 7a4ee46d 2003-11-23 devnull hprint(hout, "lump writes=%,ld\n", stats.lumpwrites);
243 7a4ee46d 2003-11-23 devnull hprint(hout, "lump reads=%,ld\n", stats.lumpreads);
244 7a4ee46d 2003-11-23 devnull hprint(hout, "lump cache read hits=%,ld\n", stats.lumphit);
245 7a4ee46d 2003-11-23 devnull hprint(hout, "lump cache read misses=%,ld\n", stats.lumpmiss);
246 7a4ee46d 2003-11-23 devnull
247 7a4ee46d 2003-11-23 devnull hprint(hout, "clump disk writes=%,ld\n", stats.clumpwrites);
248 7a4ee46d 2003-11-23 devnull hprint(hout, "clump disk bytes written=%,lld\n", stats.clumpbwrites);
249 7a4ee46d 2003-11-23 devnull hprint(hout, "clump disk bytes compressed=%,lld\n", stats.clumpbcomp);
250 7a4ee46d 2003-11-23 devnull hprint(hout, "clump disk reads=%,ld\n", stats.clumpreads);
251 7a4ee46d 2003-11-23 devnull hprint(hout, "clump disk bytes read=%,lld\n", stats.clumpbreads);
252 7a4ee46d 2003-11-23 devnull hprint(hout, "clump disk bytes uncompressed=%,lld\n", stats.clumpbuncomp);
253 7a4ee46d 2003-11-23 devnull
254 7a4ee46d 2003-11-23 devnull hprint(hout, "clump directory disk writes=%,ld\n", stats.ciwrites);
255 7a4ee46d 2003-11-23 devnull hprint(hout, "clump directory disk reads=%,ld\n", stats.cireads);
256 7a4ee46d 2003-11-23 devnull
257 7a4ee46d 2003-11-23 devnull hprint(hout, "index disk writes=%,ld\n", stats.indexwrites);
258 7a4ee46d 2003-11-23 devnull hprint(hout, "index disk reads=%,ld\n", stats.indexreads);
259 7a4ee46d 2003-11-23 devnull hprint(hout, "index disk reads for modify=%,ld\n", stats.indexwreads);
260 7a4ee46d 2003-11-23 devnull hprint(hout, "index disk reads for allocation=%,ld\n", stats.indexareads);
261 333c1dcc 2004-03-13 devnull hprint(hout, "index block splits=%,ld\n", stats.indexsplits);
262 7a4ee46d 2003-11-23 devnull
263 7a4ee46d 2003-11-23 devnull hprint(hout, "index cache lookups=%,ld\n", stats.iclookups);
264 7a4ee46d 2003-11-23 devnull hprint(hout, "index cache hits=%,ld %d%%\n", stats.ichits,
265 7a4ee46d 2003-11-23 devnull percent(stats.ichits, stats.iclookups));
266 7a4ee46d 2003-11-23 devnull hprint(hout, "index cache fills=%,ld %d%%\n", stats.icfills,
267 7a4ee46d 2003-11-23 devnull percent(stats.icfills, stats.iclookups));
268 7a4ee46d 2003-11-23 devnull hprint(hout, "index cache inserts=%,ld\n", stats.icinserts);
269 7a4ee46d 2003-11-23 devnull
270 7a4ee46d 2003-11-23 devnull hprint(hout, "disk cache hits=%,ld\n", stats.pchit);
271 7a4ee46d 2003-11-23 devnull hprint(hout, "disk cache misses=%,ld\n", stats.pcmiss);
272 7a4ee46d 2003-11-23 devnull hprint(hout, "disk cache reads=%,ld\n", stats.pcreads);
273 7a4ee46d 2003-11-23 devnull hprint(hout, "disk cache bytes read=%,lld\n", stats.pcbreads);
274 9ffbb5ad 2004-03-12 devnull
275 24998851 2004-03-11 devnull hprint(hout, "disk cache writes=%,ld\n", stats.dirtydblocks);
276 24998851 2004-03-11 devnull hprint(hout, "disk cache writes absorbed=%,ld %d%%\n", stats.absorbedwrites,
277 24998851 2004-03-11 devnull percent(stats.absorbedwrites, stats.dirtydblocks));
278 7a4ee46d 2003-11-23 devnull
279 9ffbb5ad 2004-03-12 devnull hprint(hout, "disk cache flushes=%,ld\n", stats.dcacheflushes);
280 9ffbb5ad 2004-03-12 devnull hprint(hout, "disk cache flush writes=%,ld (%,ld per flush)\n",
281 333c1dcc 2004-03-13 devnull stats.dcacheflushwrites,
282 333c1dcc 2004-03-13 devnull stats.dcacheflushwrites/(stats.dcacheflushes ? stats.dcacheflushes : 1));
283 24998851 2004-03-11 devnull
284 7a4ee46d 2003-11-23 devnull hprint(hout, "disk writes=%,ld\n", stats.diskwrites);
285 7a4ee46d 2003-11-23 devnull hprint(hout, "disk bytes written=%,lld\n", stats.diskbwrites);
286 7a4ee46d 2003-11-23 devnull hprint(hout, "disk reads=%,ld\n", stats.diskreads);
287 7a4ee46d 2003-11-23 devnull hprint(hout, "disk bytes read=%,lld\n", stats.diskbreads);
288 7a4ee46d 2003-11-23 devnull
289 7a4ee46d 2003-11-23 devnull hflush(hout);
290 7a4ee46d 2003-11-23 devnull return 0;
291 7a4ee46d 2003-11-23 devnull }
292 7a4ee46d 2003-11-23 devnull
293 7a4ee46d 2003-11-23 devnull static int
294 7a4ee46d 2003-11-23 devnull sindex(HConnect *c)
295 7a4ee46d 2003-11-23 devnull {
296 7a4ee46d 2003-11-23 devnull Hio *hout;
297 7a4ee46d 2003-11-23 devnull Index *ix;
298 7a4ee46d 2003-11-23 devnull Arena *arena;
299 7a4ee46d 2003-11-23 devnull vlong clumps, cclumps, uncsize, used, size;
300 7a4ee46d 2003-11-23 devnull int i, r, active;
301 7a4ee46d 2003-11-23 devnull
302 7a4ee46d 2003-11-23 devnull r = preqtext(c);
303 24998851 2004-03-11 devnull if(r < 0)
304 7a4ee46d 2003-11-23 devnull return r;
305 7a4ee46d 2003-11-23 devnull hout = &c->hout;
306 7a4ee46d 2003-11-23 devnull
307 7a4ee46d 2003-11-23 devnull ix = mainindex;
308 7a4ee46d 2003-11-23 devnull
309 7a4ee46d 2003-11-23 devnull hprint(hout, "index=%s\n", ix->name);
310 7a4ee46d 2003-11-23 devnull
311 7a4ee46d 2003-11-23 devnull active = 0;
312 7a4ee46d 2003-11-23 devnull clumps = 0;
313 7a4ee46d 2003-11-23 devnull cclumps = 0;
314 7a4ee46d 2003-11-23 devnull uncsize = 0;
315 7a4ee46d 2003-11-23 devnull used = 0;
316 7a4ee46d 2003-11-23 devnull size = 0;
317 7a4ee46d 2003-11-23 devnull for(i = 0; i < ix->narenas; i++){
318 7a4ee46d 2003-11-23 devnull arena = ix->arenas[i];
319 7a4ee46d 2003-11-23 devnull if(arena != nil && arena->clumps != 0){
320 7a4ee46d 2003-11-23 devnull active++;
321 7a4ee46d 2003-11-23 devnull clumps += arena->clumps;
322 7a4ee46d 2003-11-23 devnull cclumps += arena->cclumps;
323 7a4ee46d 2003-11-23 devnull uncsize += arena->uncsize;
324 7a4ee46d 2003-11-23 devnull used += arena->used;
325 7a4ee46d 2003-11-23 devnull }
326 7a4ee46d 2003-11-23 devnull size += arena->size;
327 7a4ee46d 2003-11-23 devnull }
328 7a4ee46d 2003-11-23 devnull hprint(hout, "total arenas=%d active=%d\n", ix->narenas, active);
329 7a4ee46d 2003-11-23 devnull hprint(hout, "total space=%lld used=%lld\n", size, used + clumps * ClumpInfoSize);
330 7a4ee46d 2003-11-23 devnull hprint(hout, "clumps=%lld compressed clumps=%lld data=%lld compressed data=%lld\n",
331 7a4ee46d 2003-11-23 devnull clumps, cclumps, uncsize, used - clumps * ClumpSize);
332 7a4ee46d 2003-11-23 devnull hflush(hout);
333 7a4ee46d 2003-11-23 devnull return 0;
334 7a4ee46d 2003-11-23 devnull }
335 7a4ee46d 2003-11-23 devnull
336 7a4ee46d 2003-11-23 devnull static void
337 7a4ee46d 2003-11-23 devnull darena(Hio *hout, Arena *arena)
338 7a4ee46d 2003-11-23 devnull {
339 7a4ee46d 2003-11-23 devnull hprint(hout, "arena='%s' on %s at [%lld,%lld)\n\tversion=%d created=%d modified=%d",
340 7a4ee46d 2003-11-23 devnull arena->name, arena->part->name, arena->base, arena->base + arena->size + 2 * arena->blocksize,
341 7a4ee46d 2003-11-23 devnull arena->version, arena->ctime, arena->wtime);
342 7a4ee46d 2003-11-23 devnull if(arena->sealed)
343 7a4ee46d 2003-11-23 devnull hprint(hout, " sealed\n");
344 7a4ee46d 2003-11-23 devnull else
345 7a4ee46d 2003-11-23 devnull hprint(hout, "\n");
346 7a4ee46d 2003-11-23 devnull if(scorecmp(zeroscore, arena->score) != 0)
347 7a4ee46d 2003-11-23 devnull hprint(hout, "\tscore=%V\n", arena->score);
348 7a4ee46d 2003-11-23 devnull
349 7a4ee46d 2003-11-23 devnull hprint(hout, "\tclumps=%d compressed clumps=%d data=%lld compressed data=%lld disk storage=%lld\n",
350 7a4ee46d 2003-11-23 devnull arena->clumps, arena->cclumps, arena->uncsize,
351 7a4ee46d 2003-11-23 devnull arena->used - arena->clumps * ClumpSize,
352 7a4ee46d 2003-11-23 devnull arena->used + arena->clumps * ClumpInfoSize);
353 7a4ee46d 2003-11-23 devnull }
354 7a4ee46d 2003-11-23 devnull
355 7a4ee46d 2003-11-23 devnull static int
356 7a4ee46d 2003-11-23 devnull dindex(HConnect *c)
357 7a4ee46d 2003-11-23 devnull {
358 7a4ee46d 2003-11-23 devnull Hio *hout;
359 7a4ee46d 2003-11-23 devnull Index *ix;
360 7a4ee46d 2003-11-23 devnull int i, r;
361 7a4ee46d 2003-11-23 devnull
362 7a4ee46d 2003-11-23 devnull r = preqtext(c);
363 24998851 2004-03-11 devnull if(r < 0)
364 7a4ee46d 2003-11-23 devnull return r;
365 7a4ee46d 2003-11-23 devnull hout = &c->hout;
366 7a4ee46d 2003-11-23 devnull
367 7a4ee46d 2003-11-23 devnull
368 7a4ee46d 2003-11-23 devnull ix = mainindex;
369 7a4ee46d 2003-11-23 devnull hprint(hout, "index=%s version=%d blocksize=%d tabsize=%d\n",
370 7a4ee46d 2003-11-23 devnull ix->name, ix->version, ix->blocksize, ix->tabsize);
371 7a4ee46d 2003-11-23 devnull hprint(hout, "\tbuckets=%d div=%d\n", ix->buckets, ix->div);
372 7a4ee46d 2003-11-23 devnull for(i = 0; i < ix->nsects; i++)
373 333c1dcc 2004-03-13 devnull hprint(hout, "\tsect=%s for buckets [%lld,%lld) buckmax=%d\n", ix->smap[i].name, ix->smap[i].start, ix->smap[i].stop, ix->sects[i]->buckmax);
374 7a4ee46d 2003-11-23 devnull for(i = 0; i < ix->narenas; i++){
375 7a4ee46d 2003-11-23 devnull if(ix->arenas[i] != nil && ix->arenas[i]->clumps != 0){
376 7a4ee46d 2003-11-23 devnull hprint(hout, "arena=%s at index [%lld,%lld)\n\t", ix->amap[i].name, ix->amap[i].start, ix->amap[i].stop);
377 7a4ee46d 2003-11-23 devnull darena(hout, ix->arenas[i]);
378 7a4ee46d 2003-11-23 devnull }
379 7a4ee46d 2003-11-23 devnull }
380 7a4ee46d 2003-11-23 devnull hflush(hout);
381 7a4ee46d 2003-11-23 devnull return 0;
382 7a4ee46d 2003-11-23 devnull }
383 7a4ee46d 2003-11-23 devnull
384 7a4ee46d 2003-11-23 devnull static int
385 7a4ee46d 2003-11-23 devnull xindex(HConnect *c)
386 7a4ee46d 2003-11-23 devnull {
387 7a4ee46d 2003-11-23 devnull Hio *hout;
388 7a4ee46d 2003-11-23 devnull int r;
389 7a4ee46d 2003-11-23 devnull
390 7a4ee46d 2003-11-23 devnull r = preq(c);
391 24998851 2004-03-11 devnull if(r < 0)
392 7a4ee46d 2003-11-23 devnull return r;
393 7a4ee46d 2003-11-23 devnull
394 7a4ee46d 2003-11-23 devnull hout = &c->hout;
395 7a4ee46d 2003-11-23 devnull if(c->req.vermaj){
396 7a4ee46d 2003-11-23 devnull hokheaders(c);
397 7a4ee46d 2003-11-23 devnull hprint(hout, "Content-type: text/xml\r\n");
398 7a4ee46d 2003-11-23 devnull if(http11(c))
399 7a4ee46d 2003-11-23 devnull hprint(hout, "Transfer-Encoding: chunked\r\n");
400 7a4ee46d 2003-11-23 devnull hprint(hout, "\r\n");
401 7a4ee46d 2003-11-23 devnull }
402 7a4ee46d 2003-11-23 devnull
403 7a4ee46d 2003-11-23 devnull if(http11(c))
404 7a4ee46d 2003-11-23 devnull hxferenc(hout, 1);
405 7a4ee46d 2003-11-23 devnull else
406 7a4ee46d 2003-11-23 devnull c->head.closeit = 1;
407 7a4ee46d 2003-11-23 devnull xmlindex(hout, mainindex, "index", 0);
408 7a4ee46d 2003-11-23 devnull hflush(hout);
409 7a4ee46d 2003-11-23 devnull return 0;
410 7a4ee46d 2003-11-23 devnull }
411 7a4ee46d 2003-11-23 devnull
412 7a4ee46d 2003-11-23 devnull void
413 7a4ee46d 2003-11-23 devnull xmlindent(Hio *hout, int indent)
414 7a4ee46d 2003-11-23 devnull {
415 7a4ee46d 2003-11-23 devnull int i;
416 7a4ee46d 2003-11-23 devnull
417 7a4ee46d 2003-11-23 devnull for(i = 0; i < indent; i++)
418 7a4ee46d 2003-11-23 devnull hputc(hout, '\t');
419 7a4ee46d 2003-11-23 devnull }
420 7a4ee46d 2003-11-23 devnull
421 7a4ee46d 2003-11-23 devnull void
422 7a4ee46d 2003-11-23 devnull xmlaname(Hio *hout, char *v, char *tag)
423 7a4ee46d 2003-11-23 devnull {
424 7a4ee46d 2003-11-23 devnull hprint(hout, " %s=\"%s\"", tag, v);
425 7a4ee46d 2003-11-23 devnull }
426 7a4ee46d 2003-11-23 devnull
427 7a4ee46d 2003-11-23 devnull void
428 7a4ee46d 2003-11-23 devnull xmlscore(Hio *hout, u8int *v, char *tag)
429 7a4ee46d 2003-11-23 devnull {
430 7a4ee46d 2003-11-23 devnull if(scorecmp(zeroscore, v) == 0)
431 7a4ee46d 2003-11-23 devnull return;
432 7a4ee46d 2003-11-23 devnull hprint(hout, " %s=\"%V\"", tag, v);
433 7a4ee46d 2003-11-23 devnull }
434 7a4ee46d 2003-11-23 devnull
435 7a4ee46d 2003-11-23 devnull void
436 7a4ee46d 2003-11-23 devnull xmlsealed(Hio *hout, int v, char *tag)
437 7a4ee46d 2003-11-23 devnull {
438 7a4ee46d 2003-11-23 devnull if(!v)
439 7a4ee46d 2003-11-23 devnull return;
440 7a4ee46d 2003-11-23 devnull hprint(hout, " %s=\"yes\"", tag);
441 7a4ee46d 2003-11-23 devnull }
442 7a4ee46d 2003-11-23 devnull
443 7a4ee46d 2003-11-23 devnull void
444 7a4ee46d 2003-11-23 devnull xmlu32int(Hio *hout, u32int v, char *tag)
445 7a4ee46d 2003-11-23 devnull {
446 7a4ee46d 2003-11-23 devnull hprint(hout, " %s=\"%ud\"", tag, v);
447 7a4ee46d 2003-11-23 devnull }
448 7a4ee46d 2003-11-23 devnull
449 7a4ee46d 2003-11-23 devnull void
450 7a4ee46d 2003-11-23 devnull xmlu64int(Hio *hout, u64int v, char *tag)
451 7a4ee46d 2003-11-23 devnull {
452 7a4ee46d 2003-11-23 devnull hprint(hout, " %s=\"%llud\"", tag, v);
453 7a4ee46d 2003-11-23 devnull }