Blame


1 a0d146ed 2005-07-12 devnull #include "stdinc.h"
2 a0d146ed 2005-07-12 devnull #include "dat.h"
3 a0d146ed 2005-07-12 devnull #include "fns.h"
4 a0d146ed 2005-07-12 devnull #include "xml.h"
5 a0d146ed 2005-07-12 devnull
6 a0d146ed 2005-07-12 devnull typedef struct HttpObj HttpObj;
7 a0d146ed 2005-07-12 devnull extern QLock memdrawlock;
8 a0d146ed 2005-07-12 devnull
9 a0d146ed 2005-07-12 devnull enum
10 a0d146ed 2005-07-12 devnull {
11 a0d146ed 2005-07-12 devnull ObjNameSize = 64,
12 28b49df3 2006-07-18 devnull MaxObjs = 64
13 a0d146ed 2005-07-12 devnull };
14 a0d146ed 2005-07-12 devnull
15 a0d146ed 2005-07-12 devnull struct HttpObj
16 a0d146ed 2005-07-12 devnull {
17 a0d146ed 2005-07-12 devnull char name[ObjNameSize];
18 a0d146ed 2005-07-12 devnull int (*f)(HConnect*);
19 a0d146ed 2005-07-12 devnull };
20 a0d146ed 2005-07-12 devnull
21 a0d146ed 2005-07-12 devnull static HttpObj objs[MaxObjs];
22 a0d146ed 2005-07-12 devnull
23 a0d146ed 2005-07-12 devnull static char *webroot;
24 a0d146ed 2005-07-12 devnull
25 a0d146ed 2005-07-12 devnull static void listenproc(void*);
26 a0d146ed 2005-07-12 devnull static int estats(HConnect *c);
27 a0d146ed 2005-07-12 devnull static int dindex(HConnect *c);
28 a0d146ed 2005-07-12 devnull static int xindex(HConnect *c);
29 a0d146ed 2005-07-12 devnull static int xlog(HConnect *c);
30 a0d146ed 2005-07-12 devnull static int sindex(HConnect *c);
31 28b49df3 2006-07-18 devnull static int hempty(HConnect *c);
32 28b49df3 2006-07-18 devnull static int hlcacheempty(HConnect *c);
33 28b49df3 2006-07-18 devnull static int hdcacheempty(HConnect *c);
34 28b49df3 2006-07-18 devnull static int hicacheempty(HConnect *c);
35 28b49df3 2006-07-18 devnull static int hicachekick(HConnect *c);
36 28b49df3 2006-07-18 devnull static int hdcachekick(HConnect *c);
37 a0d146ed 2005-07-12 devnull static int hicacheflush(HConnect *c);
38 a0d146ed 2005-07-12 devnull static int hdcacheflush(HConnect *c);
39 a0d146ed 2005-07-12 devnull static int httpdobj(char *name, int (*f)(HConnect*));
40 a0d146ed 2005-07-12 devnull static int xgraph(HConnect *c);
41 a0d146ed 2005-07-12 devnull static int xset(HConnect *c);
42 a0d146ed 2005-07-12 devnull static int fromwebdir(HConnect *c);
43 a0d146ed 2005-07-12 devnull
44 a0d146ed 2005-07-12 devnull int
45 a0d146ed 2005-07-12 devnull httpdinit(char *address, char *dir)
46 a0d146ed 2005-07-12 devnull {
47 a0d146ed 2005-07-12 devnull fmtinstall('D', hdatefmt);
48 a0d146ed 2005-07-12 devnull /* fmtinstall('H', httpfmt); */
49 a0d146ed 2005-07-12 devnull fmtinstall('U', hurlfmt);
50 a0d146ed 2005-07-12 devnull
51 a0d146ed 2005-07-12 devnull if(address == nil)
52 a0d146ed 2005-07-12 devnull address = "tcp!*!http";
53 a0d146ed 2005-07-12 devnull webroot = dir;
54 a0d146ed 2005-07-12 devnull
55 a0d146ed 2005-07-12 devnull httpdobj("/stats", estats);
56 a0d146ed 2005-07-12 devnull httpdobj("/index", dindex);
57 a0d146ed 2005-07-12 devnull httpdobj("/storage", sindex);
58 a0d146ed 2005-07-12 devnull httpdobj("/xindex", xindex);
59 a0d146ed 2005-07-12 devnull httpdobj("/flushicache", hicacheflush);
60 a0d146ed 2005-07-12 devnull httpdobj("/flushdcache", hdcacheflush);
61 28b49df3 2006-07-18 devnull httpdobj("/kickicache", hicachekick);
62 28b49df3 2006-07-18 devnull httpdobj("/kickdcache", hdcachekick);
63 27d28098 2007-04-21 devnull httpdobj("/graph", xgraph);
64 28b49df3 2006-07-18 devnull httpdobj("/set", xset);
65 a0d146ed 2005-07-12 devnull httpdobj("/log", xlog);
66 28b49df3 2006-07-18 devnull httpdobj("/empty", hempty);
67 28b49df3 2006-07-18 devnull httpdobj("/emptyicache", hicacheempty);
68 28b49df3 2006-07-18 devnull httpdobj("/emptylumpcache", hlcacheempty);
69 28b49df3 2006-07-18 devnull httpdobj("/emptydcache", hdcacheempty);
70 27d28098 2007-04-21 devnull httpdobj("/disk", hdisk);
71 27d28098 2007-04-21 devnull httpdobj("/debug", hdebug);
72 45ac814c 2007-10-29 rsc httpdobj("/proc/", hproc);
73 a0d146ed 2005-07-12 devnull
74 a0d146ed 2005-07-12 devnull if(vtproc(listenproc, address) < 0)
75 a0d146ed 2005-07-12 devnull return -1;
76 a0d146ed 2005-07-12 devnull return 0;
77 a0d146ed 2005-07-12 devnull }
78 a0d146ed 2005-07-12 devnull
79 a0d146ed 2005-07-12 devnull static int
80 a0d146ed 2005-07-12 devnull httpdobj(char *name, int (*f)(HConnect*))
81 a0d146ed 2005-07-12 devnull {
82 a0d146ed 2005-07-12 devnull int i;
83 a0d146ed 2005-07-12 devnull
84 a0d146ed 2005-07-12 devnull if(name == nil || strlen(name) >= ObjNameSize)
85 a0d146ed 2005-07-12 devnull return -1;
86 a0d146ed 2005-07-12 devnull for(i = 0; i < MaxObjs; i++){
87 a0d146ed 2005-07-12 devnull if(objs[i].name[0] == '\0'){
88 a0d146ed 2005-07-12 devnull strcpy(objs[i].name, name);
89 a0d146ed 2005-07-12 devnull objs[i].f = f;
90 a0d146ed 2005-07-12 devnull return 0;
91 a0d146ed 2005-07-12 devnull }
92 a0d146ed 2005-07-12 devnull if(strcmp(objs[i].name, name) == 0)
93 a0d146ed 2005-07-12 devnull return -1;
94 a0d146ed 2005-07-12 devnull }
95 a0d146ed 2005-07-12 devnull return -1;
96 a0d146ed 2005-07-12 devnull }
97 a0d146ed 2005-07-12 devnull
98 a0d146ed 2005-07-12 devnull static HConnect*
99 a0d146ed 2005-07-12 devnull mkconnect(void)
100 a0d146ed 2005-07-12 devnull {
101 a0d146ed 2005-07-12 devnull HConnect *c;
102 a0d146ed 2005-07-12 devnull
103 a0d146ed 2005-07-12 devnull c = mallocz(sizeof(HConnect), 1);
104 a0d146ed 2005-07-12 devnull if(c == nil)
105 a0d146ed 2005-07-12 devnull sysfatal("out of memory");
106 a0d146ed 2005-07-12 devnull c->replog = nil;
107 a0d146ed 2005-07-12 devnull c->hpos = c->header;
108 a0d146ed 2005-07-12 devnull c->hstop = c->header;
109 a0d146ed 2005-07-12 devnull return c;
110 a0d146ed 2005-07-12 devnull }
111 a0d146ed 2005-07-12 devnull
112 a0d146ed 2005-07-12 devnull void httpproc(void*);
113 a0d146ed 2005-07-12 devnull
114 a0d146ed 2005-07-12 devnull static void
115 a0d146ed 2005-07-12 devnull listenproc(void *vaddress)
116 a0d146ed 2005-07-12 devnull {
117 a0d146ed 2005-07-12 devnull HConnect *c;
118 a0d146ed 2005-07-12 devnull char *address, ndir[NETPATHLEN], dir[NETPATHLEN];
119 a0d146ed 2005-07-12 devnull int ctl, nctl, data;
120 a0d146ed 2005-07-12 devnull
121 a0d146ed 2005-07-12 devnull address = vaddress;
122 a0d146ed 2005-07-12 devnull ctl = announce(address, dir);
123 a0d146ed 2005-07-12 devnull if(ctl < 0){
124 a0d146ed 2005-07-12 devnull fprint(2, "venti: httpd can't announce on %s: %r\n", address);
125 a0d146ed 2005-07-12 devnull return;
126 a0d146ed 2005-07-12 devnull }
127 a0d146ed 2005-07-12 devnull
128 a0d146ed 2005-07-12 devnull if(0) print("announce ctl %d dir %s\n", ctl, dir);
129 a0d146ed 2005-07-12 devnull for(;;){
130 a0d146ed 2005-07-12 devnull /*
131 a0d146ed 2005-07-12 devnull * wait for a call (or an error)
132 a0d146ed 2005-07-12 devnull */
133 a0d146ed 2005-07-12 devnull nctl = listen(dir, ndir);
134 a0d146ed 2005-07-12 devnull if(0) print("httpd listen %d %s...\n", nctl, ndir);
135 a0d146ed 2005-07-12 devnull if(nctl < 0){
136 a0d146ed 2005-07-12 devnull fprint(2, "venti: httpd can't listen on %s: %r\n", address);
137 a0d146ed 2005-07-12 devnull return;
138 a0d146ed 2005-07-12 devnull }
139 a0d146ed 2005-07-12 devnull
140 a0d146ed 2005-07-12 devnull data = accept(ctl, ndir);
141 a0d146ed 2005-07-12 devnull if(0) print("httpd accept %d...\n", data);
142 a0d146ed 2005-07-12 devnull if(data < 0){
143 a0d146ed 2005-07-12 devnull fprint(2, "venti: httpd accept: %r\n");
144 a0d146ed 2005-07-12 devnull close(nctl);
145 a0d146ed 2005-07-12 devnull continue;
146 a0d146ed 2005-07-12 devnull }
147 a0d146ed 2005-07-12 devnull if(0) print("httpd close nctl %d\n", nctl);
148 a0d146ed 2005-07-12 devnull close(nctl);
149 a0d146ed 2005-07-12 devnull c = mkconnect();
150 a0d146ed 2005-07-12 devnull hinit(&c->hin, data, Hread);
151 a0d146ed 2005-07-12 devnull hinit(&c->hout, data, Hwrite);
152 a0d146ed 2005-07-12 devnull vtproc(httpproc, c);
153 a0d146ed 2005-07-12 devnull }
154 a0d146ed 2005-07-12 devnull }
155 a0d146ed 2005-07-12 devnull
156 a0d146ed 2005-07-12 devnull void
157 a0d146ed 2005-07-12 devnull httpproc(void *v)
158 a0d146ed 2005-07-12 devnull {
159 a0d146ed 2005-07-12 devnull HConnect *c;
160 a0d146ed 2005-07-12 devnull int ok, i, n;
161 a0d146ed 2005-07-12 devnull
162 a0d146ed 2005-07-12 devnull c = v;
163 a0d146ed 2005-07-12 devnull
164 a0d146ed 2005-07-12 devnull for(;;){
165 a0d146ed 2005-07-12 devnull /*
166 a0d146ed 2005-07-12 devnull * No timeout because the signal appears to hit every
167 a0d146ed 2005-07-12 devnull * proc, not just us.
168 a0d146ed 2005-07-12 devnull */
169 a0d146ed 2005-07-12 devnull if(hparsereq(c, 0) < 0)
170 a0d146ed 2005-07-12 devnull break;
171 27d28098 2007-04-21 devnull
172 a0d146ed 2005-07-12 devnull for(i = 0; i < MaxObjs && objs[i].name[0]; i++){
173 a0d146ed 2005-07-12 devnull n = strlen(objs[i].name);
174 a0d146ed 2005-07-12 devnull if((objs[i].name[n-1] == '/' && strncmp(c->req.uri, objs[i].name, n) == 0)
175 a0d146ed 2005-07-12 devnull || (objs[i].name[n-1] != '/' && strcmp(c->req.uri, objs[i].name) == 0)){
176 a0d146ed 2005-07-12 devnull ok = (*objs[i].f)(c);
177 a0d146ed 2005-07-12 devnull goto found;
178 a0d146ed 2005-07-12 devnull }
179 a0d146ed 2005-07-12 devnull }
180 a0d146ed 2005-07-12 devnull ok = fromwebdir(c);
181 a0d146ed 2005-07-12 devnull found:
182 27d28098 2007-04-21 devnull hflush(&c->hout);
183 a0d146ed 2005-07-12 devnull if(c->head.closeit)
184 a0d146ed 2005-07-12 devnull ok = -1;
185 a0d146ed 2005-07-12 devnull hreqcleanup(c);
186 a0d146ed 2005-07-12 devnull
187 a0d146ed 2005-07-12 devnull if(ok < 0)
188 a0d146ed 2005-07-12 devnull break;
189 a0d146ed 2005-07-12 devnull }
190 a0d146ed 2005-07-12 devnull hreqcleanup(c);
191 a0d146ed 2005-07-12 devnull close(c->hin.fd);
192 a0d146ed 2005-07-12 devnull free(c);
193 27d28098 2007-04-21 devnull }
194 27d28098 2007-04-21 devnull
195 27d28098 2007-04-21 devnull char*
196 27d28098 2007-04-21 devnull hargstr(HConnect *c, char *name, char *def)
197 27d28098 2007-04-21 devnull {
198 27d28098 2007-04-21 devnull HSPairs *p;
199 27d28098 2007-04-21 devnull
200 27d28098 2007-04-21 devnull for(p=c->req.searchpairs; p; p=p->next)
201 27d28098 2007-04-21 devnull if(strcmp(p->s, name) == 0)
202 27d28098 2007-04-21 devnull return p->t;
203 27d28098 2007-04-21 devnull return def;
204 a0d146ed 2005-07-12 devnull }
205 a0d146ed 2005-07-12 devnull
206 27d28098 2007-04-21 devnull vlong
207 27d28098 2007-04-21 devnull hargint(HConnect *c, char *name, vlong def)
208 27d28098 2007-04-21 devnull {
209 27d28098 2007-04-21 devnull char *a;
210 27d28098 2007-04-21 devnull
211 27d28098 2007-04-21 devnull if((a = hargstr(c, name, nil)) == nil)
212 27d28098 2007-04-21 devnull return def;
213 27d28098 2007-04-21 devnull return atoll(a);
214 27d28098 2007-04-21 devnull }
215 27d28098 2007-04-21 devnull
216 a0d146ed 2005-07-12 devnull static int
217 28b49df3 2006-07-18 devnull percent(ulong v, ulong total)
218 a0d146ed 2005-07-12 devnull {
219 a0d146ed 2005-07-12 devnull if(total == 0)
220 a0d146ed 2005-07-12 devnull total = 1;
221 a0d146ed 2005-07-12 devnull if(v < 1000*1000)
222 a0d146ed 2005-07-12 devnull return (v * 100) / total;
223 a0d146ed 2005-07-12 devnull total /= 100;
224 a0d146ed 2005-07-12 devnull if(total == 0)
225 a0d146ed 2005-07-12 devnull total = 1;
226 a0d146ed 2005-07-12 devnull return v / total;
227 a0d146ed 2005-07-12 devnull }
228 a0d146ed 2005-07-12 devnull
229 a0d146ed 2005-07-12 devnull static int
230 a0d146ed 2005-07-12 devnull preq(HConnect *c)
231 a0d146ed 2005-07-12 devnull {
232 a0d146ed 2005-07-12 devnull if(hparseheaders(c, 0) < 0)
233 a0d146ed 2005-07-12 devnull return -1;
234 a0d146ed 2005-07-12 devnull if(strcmp(c->req.meth, "GET") != 0
235 a0d146ed 2005-07-12 devnull && strcmp(c->req.meth, "HEAD") != 0)
236 a0d146ed 2005-07-12 devnull return hunallowed(c, "GET, HEAD");
237 a0d146ed 2005-07-12 devnull if(c->head.expectother || c->head.expectcont)
238 a0d146ed 2005-07-12 devnull return hfail(c, HExpectFail, nil);
239 a0d146ed 2005-07-12 devnull return 0;
240 a0d146ed 2005-07-12 devnull }
241 a0d146ed 2005-07-12 devnull
242 27d28098 2007-04-21 devnull int
243 27d28098 2007-04-21 devnull hsettype(HConnect *c, char *type)
244 a0d146ed 2005-07-12 devnull {
245 a0d146ed 2005-07-12 devnull Hio *hout;
246 a0d146ed 2005-07-12 devnull int r;
247 a0d146ed 2005-07-12 devnull
248 a0d146ed 2005-07-12 devnull r = preq(c);
249 a0d146ed 2005-07-12 devnull if(r < 0)
250 a0d146ed 2005-07-12 devnull return r;
251 a0d146ed 2005-07-12 devnull
252 a0d146ed 2005-07-12 devnull hout = &c->hout;
253 a0d146ed 2005-07-12 devnull if(c->req.vermaj){
254 a0d146ed 2005-07-12 devnull hokheaders(c);
255 a0d146ed 2005-07-12 devnull hprint(hout, "Content-type: %s\r\n", type);
256 a0d146ed 2005-07-12 devnull if(http11(c))
257 a0d146ed 2005-07-12 devnull hprint(hout, "Transfer-Encoding: chunked\r\n");
258 a0d146ed 2005-07-12 devnull hprint(hout, "\r\n");
259 a0d146ed 2005-07-12 devnull }
260 a0d146ed 2005-07-12 devnull
261 a0d146ed 2005-07-12 devnull if(http11(c))
262 a0d146ed 2005-07-12 devnull hxferenc(hout, 1);
263 a0d146ed 2005-07-12 devnull else
264 a0d146ed 2005-07-12 devnull c->head.closeit = 1;
265 a0d146ed 2005-07-12 devnull return 0;
266 a0d146ed 2005-07-12 devnull }
267 a0d146ed 2005-07-12 devnull
268 27d28098 2007-04-21 devnull int
269 27d28098 2007-04-21 devnull hsethtml(HConnect *c)
270 a0d146ed 2005-07-12 devnull {
271 27d28098 2007-04-21 devnull return hsettype(c, "text/html; charset=utf-8");
272 a0d146ed 2005-07-12 devnull }
273 a0d146ed 2005-07-12 devnull
274 27d28098 2007-04-21 devnull int
275 27d28098 2007-04-21 devnull hsettext(HConnect *c)
276 27d28098 2007-04-21 devnull {
277 27d28098 2007-04-21 devnull return hsettype(c, "text/plain; charset=utf-8");
278 27d28098 2007-04-21 devnull }
279 27d28098 2007-04-21 devnull
280 a0d146ed 2005-07-12 devnull static int
281 28b49df3 2006-07-18 devnull herror(HConnect *c)
282 28b49df3 2006-07-18 devnull {
283 28b49df3 2006-07-18 devnull int n;
284 28b49df3 2006-07-18 devnull Hio *hout;
285 28b49df3 2006-07-18 devnull
286 28b49df3 2006-07-18 devnull hout = &c->hout;
287 28b49df3 2006-07-18 devnull n = snprint(c->xferbuf, HBufSize, "<html><head><title>Error</title></head>\n<body><h1>Error</h1>\n<pre>%r</pre>\n</body></html>");
288 28b49df3 2006-07-18 devnull hprint(hout, "%s %s\r\n", hversion, "400 Bad Request");
289 28b49df3 2006-07-18 devnull hprint(hout, "Date: %D\r\n", time(nil));
290 28b49df3 2006-07-18 devnull hprint(hout, "Server: Venti\r\n");
291 28b49df3 2006-07-18 devnull hprint(hout, "Content-Type: text/html\r\n");
292 28b49df3 2006-07-18 devnull hprint(hout, "Content-Length: %d\r\n", n);
293 28b49df3 2006-07-18 devnull if(c->head.closeit)
294 28b49df3 2006-07-18 devnull hprint(hout, "Connection: close\r\n");
295 28b49df3 2006-07-18 devnull else if(!http11(c))
296 28b49df3 2006-07-18 devnull hprint(hout, "Connection: Keep-Alive\r\n");
297 28b49df3 2006-07-18 devnull hprint(hout, "\r\n");
298 28b49df3 2006-07-18 devnull
299 28b49df3 2006-07-18 devnull if(c->req.meth == nil || strcmp(c->req.meth, "HEAD") != 0)
300 28b49df3 2006-07-18 devnull hwrite(hout, c->xferbuf, n);
301 28b49df3 2006-07-18 devnull
302 28b49df3 2006-07-18 devnull return hflush(hout);
303 28b49df3 2006-07-18 devnull }
304 28b49df3 2006-07-18 devnull
305 27d28098 2007-04-21 devnull int
306 27d28098 2007-04-21 devnull hnotfound(HConnect *c)
307 a0d146ed 2005-07-12 devnull {
308 a0d146ed 2005-07-12 devnull int r;
309 a0d146ed 2005-07-12 devnull
310 a0d146ed 2005-07-12 devnull r = preq(c);
311 a0d146ed 2005-07-12 devnull if(r < 0)
312 a0d146ed 2005-07-12 devnull return r;
313 a0d146ed 2005-07-12 devnull return hfail(c, HNotFound, c->req.uri);
314 a0d146ed 2005-07-12 devnull }
315 a0d146ed 2005-07-12 devnull
316 a0d146ed 2005-07-12 devnull struct {
317 a0d146ed 2005-07-12 devnull char *ext;
318 a0d146ed 2005-07-12 devnull char *type;
319 a0d146ed 2005-07-12 devnull } exttab[] = {
320 a0d146ed 2005-07-12 devnull ".html", "text/html",
321 a0d146ed 2005-07-12 devnull ".txt", "text/plain",
322 a0d146ed 2005-07-12 devnull ".xml", "text/xml",
323 a0d146ed 2005-07-12 devnull ".png", "image/png",
324 a0d146ed 2005-07-12 devnull ".gif", "image/gif",
325 a0d146ed 2005-07-12 devnull 0
326 a0d146ed 2005-07-12 devnull };
327 a0d146ed 2005-07-12 devnull
328 a0d146ed 2005-07-12 devnull static int
329 a0d146ed 2005-07-12 devnull fromwebdir(HConnect *c)
330 a0d146ed 2005-07-12 devnull {
331 a0d146ed 2005-07-12 devnull char buf[4096], *p, *ext, *type;
332 a0d146ed 2005-07-12 devnull int i, fd, n, defaulted;
333 a0d146ed 2005-07-12 devnull Dir *d;
334 a0d146ed 2005-07-12 devnull
335 a0d146ed 2005-07-12 devnull if(webroot == nil || strstr(c->req.uri, ".."))
336 27d28098 2007-04-21 devnull return hnotfound(c);
337 a0d146ed 2005-07-12 devnull snprint(buf, sizeof buf-20, "%s/%s", webroot, c->req.uri+1);
338 a0d146ed 2005-07-12 devnull defaulted = 0;
339 a0d146ed 2005-07-12 devnull reopen:
340 a0d146ed 2005-07-12 devnull if((fd = open(buf, OREAD)) < 0)
341 27d28098 2007-04-21 devnull return hnotfound(c);
342 a0d146ed 2005-07-12 devnull d = dirfstat(fd);
343 a0d146ed 2005-07-12 devnull if(d == nil){
344 a0d146ed 2005-07-12 devnull close(fd);
345 27d28098 2007-04-21 devnull return hnotfound(c);
346 a0d146ed 2005-07-12 devnull }
347 a0d146ed 2005-07-12 devnull if(d->mode&DMDIR){
348 a0d146ed 2005-07-12 devnull if(!defaulted){
349 a0d146ed 2005-07-12 devnull defaulted = 1;
350 a0d146ed 2005-07-12 devnull strcat(buf, "/index.html");
351 a0d146ed 2005-07-12 devnull free(d);
352 a0d146ed 2005-07-12 devnull close(fd);
353 a0d146ed 2005-07-12 devnull goto reopen;
354 a0d146ed 2005-07-12 devnull }
355 a0d146ed 2005-07-12 devnull free(d);
356 27d28098 2007-04-21 devnull return hnotfound(c);
357 a0d146ed 2005-07-12 devnull }
358 a0d146ed 2005-07-12 devnull free(d);
359 a0d146ed 2005-07-12 devnull p = buf+strlen(buf);
360 a0d146ed 2005-07-12 devnull type = "application/octet-stream";
361 a0d146ed 2005-07-12 devnull for(i=0; exttab[i].ext; i++){
362 a0d146ed 2005-07-12 devnull ext = exttab[i].ext;
363 a0d146ed 2005-07-12 devnull if(p-strlen(ext) >= buf && strcmp(p-strlen(ext), ext) == 0){
364 a0d146ed 2005-07-12 devnull type = exttab[i].type;
365 a0d146ed 2005-07-12 devnull break;
366 a0d146ed 2005-07-12 devnull }
367 a0d146ed 2005-07-12 devnull }
368 27d28098 2007-04-21 devnull if(hsettype(c, type) < 0){
369 a0d146ed 2005-07-12 devnull close(fd);
370 a0d146ed 2005-07-12 devnull return 0;
371 a0d146ed 2005-07-12 devnull }
372 a0d146ed 2005-07-12 devnull while((n = read(fd, buf, sizeof buf)) > 0)
373 a0d146ed 2005-07-12 devnull if(hwrite(&c->hout, buf, n) < 0)
374 a0d146ed 2005-07-12 devnull break;
375 a0d146ed 2005-07-12 devnull close(fd);
376 a0d146ed 2005-07-12 devnull hflush(&c->hout);
377 a0d146ed 2005-07-12 devnull return 0;
378 a0d146ed 2005-07-12 devnull }
379 a0d146ed 2005-07-12 devnull
380 a0d146ed 2005-07-12 devnull static struct
381 a0d146ed 2005-07-12 devnull {
382 a0d146ed 2005-07-12 devnull char *name;
383 a0d146ed 2005-07-12 devnull int *p;
384 a0d146ed 2005-07-12 devnull } namedints[] =
385 a0d146ed 2005-07-12 devnull {
386 a0d146ed 2005-07-12 devnull "compress", &compressblocks,
387 a0d146ed 2005-07-12 devnull "devnull", &writestodevnull,
388 a0d146ed 2005-07-12 devnull "logging", &ventilogging,
389 a0d146ed 2005-07-12 devnull "stats", &collectstats,
390 a0d146ed 2005-07-12 devnull "icachesleeptime", &icachesleeptime,
391 28b49df3 2006-07-18 devnull "minicachesleeptime", &minicachesleeptime,
392 a0d146ed 2005-07-12 devnull "arenasumsleeptime", &arenasumsleeptime,
393 28b49df3 2006-07-18 devnull "l0quantum", &l0quantum,
394 28b49df3 2006-07-18 devnull "l1quantum", &l1quantum,
395 28b49df3 2006-07-18 devnull "manualscheduling", &manualscheduling,
396 28b49df3 2006-07-18 devnull "ignorebloom", &ignorebloom,
397 28b49df3 2006-07-18 devnull "syncwrites", &syncwrites,
398 28b49df3 2006-07-18 devnull "icacheprefetch", &icacheprefetch,
399 a0d146ed 2005-07-12 devnull 0
400 a0d146ed 2005-07-12 devnull };
401 28b49df3 2006-07-18 devnull
402 28b49df3 2006-07-18 devnull static int
403 27d28098 2007-04-21 devnull xset(HConnect *c)
404 28b49df3 2006-07-18 devnull {
405 27d28098 2007-04-21 devnull int i, old;
406 27d28098 2007-04-21 devnull char *name, *value;
407 a0d146ed 2005-07-12 devnull
408 27d28098 2007-04-21 devnull if(hsettext(c) < 0)
409 27d28098 2007-04-21 devnull return -1;
410 28b49df3 2006-07-18 devnull
411 27d28098 2007-04-21 devnull if((name = hargstr(c, "name", nil)) == nil || name[0] == 0){
412 28b49df3 2006-07-18 devnull for(i=0; namedints[i].name; i++)
413 28b49df3 2006-07-18 devnull hprint(&c->hout, "%s = %d\n", namedints[i].name, *namedints[i].p);
414 28b49df3 2006-07-18 devnull hflush(&c->hout);
415 28b49df3 2006-07-18 devnull return 0;
416 28b49df3 2006-07-18 devnull }
417 27d28098 2007-04-21 devnull
418 27d28098 2007-04-21 devnull for(i=0; namedints[i].name; i++)
419 27d28098 2007-04-21 devnull if(strcmp(name, namedints[i].name) == 0)
420 27d28098 2007-04-21 devnull break;
421 27d28098 2007-04-21 devnull if(!namedints[i].name){
422 27d28098 2007-04-21 devnull hprint(&c->hout, "%s not found\n", name);
423 27d28098 2007-04-21 devnull hflush(&c->hout);
424 27d28098 2007-04-21 devnull return 0;
425 a0d146ed 2005-07-12 devnull }
426 27d28098 2007-04-21 devnull
427 27d28098 2007-04-21 devnull if((value = hargstr(c, "value", nil)) == nil || value[0] == 0){
428 27d28098 2007-04-21 devnull hprint(&c->hout, "%s = %d\n", namedints[i].name, *namedints[i].p);
429 27d28098 2007-04-21 devnull hflush(&c->hout);
430 27d28098 2007-04-21 devnull return 0;
431 27d28098 2007-04-21 devnull }
432 27d28098 2007-04-21 devnull
433 27d28098 2007-04-21 devnull old = *namedints[i].p;
434 27d28098 2007-04-21 devnull *namedints[i].p = atoll(value);
435 27d28098 2007-04-21 devnull hprint(&c->hout, "%s = %d (was %d)\n", name, *namedints[i].p, old);
436 27d28098 2007-04-21 devnull hflush(&c->hout);
437 27d28098 2007-04-21 devnull return 0;
438 a0d146ed 2005-07-12 devnull }
439 a0d146ed 2005-07-12 devnull
440 a0d146ed 2005-07-12 devnull static int
441 a0d146ed 2005-07-12 devnull estats(HConnect *c)
442 a0d146ed 2005-07-12 devnull {
443 a0d146ed 2005-07-12 devnull Hio *hout;
444 a0d146ed 2005-07-12 devnull int r;
445 a0d146ed 2005-07-12 devnull
446 27d28098 2007-04-21 devnull r = hsettext(c);
447 a0d146ed 2005-07-12 devnull if(r < 0)
448 a0d146ed 2005-07-12 devnull return r;
449 a0d146ed 2005-07-12 devnull
450 a0d146ed 2005-07-12 devnull
451 a0d146ed 2005-07-12 devnull hout = &c->hout;
452 a0d146ed 2005-07-12 devnull /*
453 a0d146ed 2005-07-12 devnull hprint(hout, "lump writes=%,ld\n", stats.lumpwrites);
454 a0d146ed 2005-07-12 devnull hprint(hout, "lump reads=%,ld\n", stats.lumpreads);
455 a0d146ed 2005-07-12 devnull hprint(hout, "lump cache read hits=%,ld\n", stats.lumphit);
456 a0d146ed 2005-07-12 devnull hprint(hout, "lump cache read misses=%,ld\n", stats.lumpmiss);
457 a0d146ed 2005-07-12 devnull
458 a0d146ed 2005-07-12 devnull hprint(hout, "clump disk writes=%,ld\n", stats.clumpwrites);
459 a0d146ed 2005-07-12 devnull hprint(hout, "clump disk bytes written=%,lld\n", stats.clumpbwrites);
460 a0d146ed 2005-07-12 devnull hprint(hout, "clump disk bytes compressed=%,lld\n", stats.clumpbcomp);
461 a0d146ed 2005-07-12 devnull hprint(hout, "clump disk reads=%,ld\n", stats.clumpreads);
462 a0d146ed 2005-07-12 devnull hprint(hout, "clump disk bytes read=%,lld\n", stats.clumpbreads);
463 a0d146ed 2005-07-12 devnull hprint(hout, "clump disk bytes uncompressed=%,lld\n", stats.clumpbuncomp);
464 a0d146ed 2005-07-12 devnull
465 a0d146ed 2005-07-12 devnull hprint(hout, "clump directory disk writes=%,ld\n", stats.ciwrites);
466 a0d146ed 2005-07-12 devnull hprint(hout, "clump directory disk reads=%,ld\n", stats.cireads);
467 a0d146ed 2005-07-12 devnull
468 a0d146ed 2005-07-12 devnull hprint(hout, "index disk writes=%,ld\n", stats.indexwrites);
469 a0d146ed 2005-07-12 devnull hprint(hout, "index disk reads=%,ld\n", stats.indexreads);
470 a0d146ed 2005-07-12 devnull hprint(hout, "index disk bloom filter hits=%,ld %d%% falsemisses=%,ld %d%%\n",
471 a0d146ed 2005-07-12 devnull stats.indexbloomhits,
472 a0d146ed 2005-07-12 devnull percent(stats.indexbloomhits, stats.indexreads),
473 a0d146ed 2005-07-12 devnull stats.indexbloomfalsemisses,
474 a0d146ed 2005-07-12 devnull percent(stats.indexbloomfalsemisses, stats.indexreads));
475 a0d146ed 2005-07-12 devnull hprint(hout, "bloom filter bits=%,ld of %,ld %d%%\n",
476 a0d146ed 2005-07-12 devnull stats.bloomones, stats.bloombits, percent(stats.bloomones, stats.bloombits));
477 a0d146ed 2005-07-12 devnull hprint(hout, "index disk reads for modify=%,ld\n", stats.indexwreads);
478 a0d146ed 2005-07-12 devnull hprint(hout, "index disk reads for allocation=%,ld\n", stats.indexareads);
479 a0d146ed 2005-07-12 devnull hprint(hout, "index block splits=%,ld\n", stats.indexsplits);
480 a0d146ed 2005-07-12 devnull
481 a0d146ed 2005-07-12 devnull hprint(hout, "index cache lookups=%,ld\n", stats.iclookups);
482 a0d146ed 2005-07-12 devnull hprint(hout, "index cache hits=%,ld %d%%\n", stats.ichits,
483 a0d146ed 2005-07-12 devnull percent(stats.ichits, stats.iclookups));
484 a0d146ed 2005-07-12 devnull hprint(hout, "index cache fills=%,ld %d%%\n", stats.icfills,
485 a0d146ed 2005-07-12 devnull percent(stats.icfills, stats.iclookups));
486 a0d146ed 2005-07-12 devnull hprint(hout, "index cache inserts=%,ld\n", stats.icinserts);
487 a0d146ed 2005-07-12 devnull
488 a0d146ed 2005-07-12 devnull hprint(hout, "disk cache hits=%,ld\n", stats.pchit);
489 a0d146ed 2005-07-12 devnull hprint(hout, "disk cache misses=%,ld\n", stats.pcmiss);
490 a0d146ed 2005-07-12 devnull hprint(hout, "disk cache reads=%,ld\n", stats.pcreads);
491 a0d146ed 2005-07-12 devnull hprint(hout, "disk cache bytes read=%,lld\n", stats.pcbreads);
492 a0d146ed 2005-07-12 devnull
493 a0d146ed 2005-07-12 devnull hprint(hout, "disk cache writes=%,ld\n", stats.dirtydblocks);
494 a0d146ed 2005-07-12 devnull hprint(hout, "disk cache writes absorbed=%,ld %d%%\n", stats.absorbedwrites,
495 a0d146ed 2005-07-12 devnull percent(stats.absorbedwrites, stats.dirtydblocks));
496 a0d146ed 2005-07-12 devnull
497 a0d146ed 2005-07-12 devnull hprint(hout, "disk cache flushes=%,ld\n", stats.dcacheflushes);
498 a0d146ed 2005-07-12 devnull hprint(hout, "disk cache flush writes=%,ld (%,ld per flush)\n",
499 a0d146ed 2005-07-12 devnull stats.dcacheflushwrites,
500 a0d146ed 2005-07-12 devnull stats.dcacheflushwrites/(stats.dcacheflushes ? stats.dcacheflushes : 1));
501 a0d146ed 2005-07-12 devnull
502 a0d146ed 2005-07-12 devnull hprint(hout, "disk writes=%,ld\n", stats.diskwrites);
503 a0d146ed 2005-07-12 devnull hprint(hout, "disk bytes written=%,lld\n", stats.diskbwrites);
504 a0d146ed 2005-07-12 devnull hprint(hout, "disk reads=%,ld\n", stats.diskreads);
505 a0d146ed 2005-07-12 devnull hprint(hout, "disk bytes read=%,lld\n", stats.diskbreads);
506 a0d146ed 2005-07-12 devnull */
507 a0d146ed 2005-07-12 devnull
508 a0d146ed 2005-07-12 devnull hflush(hout);
509 a0d146ed 2005-07-12 devnull return 0;
510 a0d146ed 2005-07-12 devnull }
511 a0d146ed 2005-07-12 devnull
512 a0d146ed 2005-07-12 devnull static int
513 a0d146ed 2005-07-12 devnull sindex(HConnect *c)
514 a0d146ed 2005-07-12 devnull {
515 a0d146ed 2005-07-12 devnull Hio *hout;
516 a0d146ed 2005-07-12 devnull Index *ix;
517 a0d146ed 2005-07-12 devnull Arena *arena;
518 a0d146ed 2005-07-12 devnull vlong clumps, cclumps, uncsize, used, size;
519 a0d146ed 2005-07-12 devnull int i, r, active;
520 a0d146ed 2005-07-12 devnull
521 27d28098 2007-04-21 devnull r = hsettext(c);
522 a0d146ed 2005-07-12 devnull if(r < 0)
523 a0d146ed 2005-07-12 devnull return r;
524 a0d146ed 2005-07-12 devnull hout = &c->hout;
525 a0d146ed 2005-07-12 devnull
526 a0d146ed 2005-07-12 devnull ix = mainindex;
527 a0d146ed 2005-07-12 devnull
528 a0d146ed 2005-07-12 devnull hprint(hout, "index=%s\n", ix->name);
529 a0d146ed 2005-07-12 devnull
530 a0d146ed 2005-07-12 devnull active = 0;
531 a0d146ed 2005-07-12 devnull clumps = 0;
532 a0d146ed 2005-07-12 devnull cclumps = 0;
533 a0d146ed 2005-07-12 devnull uncsize = 0;
534 a0d146ed 2005-07-12 devnull used = 0;
535 a0d146ed 2005-07-12 devnull size = 0;
536 a0d146ed 2005-07-12 devnull for(i = 0; i < ix->narenas; i++){
537 a0d146ed 2005-07-12 devnull arena = ix->arenas[i];
538 a0d146ed 2005-07-12 devnull if(arena != nil && arena->memstats.clumps != 0){
539 a0d146ed 2005-07-12 devnull active++;
540 a0d146ed 2005-07-12 devnull clumps += arena->memstats.clumps;
541 a0d146ed 2005-07-12 devnull cclumps += arena->memstats.cclumps;
542 a0d146ed 2005-07-12 devnull uncsize += arena->memstats.uncsize;
543 a0d146ed 2005-07-12 devnull used += arena->memstats.used;
544 a0d146ed 2005-07-12 devnull }
545 a0d146ed 2005-07-12 devnull size += arena->size;
546 a0d146ed 2005-07-12 devnull }
547 a0d146ed 2005-07-12 devnull hprint(hout, "total arenas=%,d active=%,d\n", ix->narenas, active);
548 a0d146ed 2005-07-12 devnull hprint(hout, "total space=%,lld used=%,lld\n", size, used + clumps * ClumpInfoSize);
549 a0d146ed 2005-07-12 devnull hprint(hout, "clumps=%,lld compressed clumps=%,lld data=%,lld compressed data=%,lld\n",
550 a0d146ed 2005-07-12 devnull clumps, cclumps, uncsize, used - clumps * ClumpSize);
551 a0d146ed 2005-07-12 devnull hflush(hout);
552 a0d146ed 2005-07-12 devnull return 0;
553 a0d146ed 2005-07-12 devnull }
554 a0d146ed 2005-07-12 devnull
555 a0d146ed 2005-07-12 devnull static void
556 a0d146ed 2005-07-12 devnull darena(Hio *hout, Arena *arena)
557 a0d146ed 2005-07-12 devnull {
558 a0d146ed 2005-07-12 devnull hprint(hout, "arena='%s' on %s at [%lld,%lld)\n\tversion=%d created=%d modified=%d",
559 a0d146ed 2005-07-12 devnull arena->name, arena->part->name, arena->base, arena->base + arena->size + 2 * arena->blocksize,
560 a0d146ed 2005-07-12 devnull arena->version, arena->ctime, arena->wtime);
561 a0d146ed 2005-07-12 devnull if(arena->memstats.sealed)
562 a0d146ed 2005-07-12 devnull hprint(hout, " mem=sealed");
563 a0d146ed 2005-07-12 devnull if(arena->diskstats.sealed)
564 a0d146ed 2005-07-12 devnull hprint(hout, " disk=sealed");
565 030fb939 2008-07-04 rsc if(arena->inqueue)
566 030fb939 2008-07-04 rsc hprint(hout, " inqueue");
567 a0d146ed 2005-07-12 devnull hprint(hout, "\n");
568 a0d146ed 2005-07-12 devnull if(scorecmp(zeroscore, arena->score) != 0)
569 a0d146ed 2005-07-12 devnull hprint(hout, "\tscore=%V\n", arena->score);
570 a0d146ed 2005-07-12 devnull
571 45ac814c 2007-10-29 rsc hprint(hout, "\twritten: clumps=%d compressed clumps=%d data=%,lld compressed data=%,lld storage=%,lld\n",
572 a0d146ed 2005-07-12 devnull arena->memstats.clumps, arena->memstats.cclumps, arena->memstats.uncsize,
573 a0d146ed 2005-07-12 devnull arena->memstats.used - arena->memstats.clumps * ClumpSize,
574 a0d146ed 2005-07-12 devnull arena->memstats.used + arena->memstats.clumps * ClumpInfoSize);
575 45ac814c 2007-10-29 rsc hprint(hout, "\tindexed: clumps=%d compressed clumps=%d data=%,lld compressed data=%,lld storage=%,lld\n",
576 a0d146ed 2005-07-12 devnull arena->diskstats.clumps, arena->diskstats.cclumps, arena->diskstats.uncsize,
577 a0d146ed 2005-07-12 devnull arena->diskstats.used - arena->diskstats.clumps * ClumpSize,
578 a0d146ed 2005-07-12 devnull arena->diskstats.used + arena->diskstats.clumps * ClumpInfoSize);
579 a0d146ed 2005-07-12 devnull }
580 a0d146ed 2005-07-12 devnull
581 a0d146ed 2005-07-12 devnull static int
582 28b49df3 2006-07-18 devnull hempty(HConnect *c)
583 28b49df3 2006-07-18 devnull {
584 28b49df3 2006-07-18 devnull Hio *hout;
585 28b49df3 2006-07-18 devnull int r;
586 28b49df3 2006-07-18 devnull
587 27d28098 2007-04-21 devnull r = hsettext(c);
588 28b49df3 2006-07-18 devnull if(r < 0)
589 28b49df3 2006-07-18 devnull return r;
590 28b49df3 2006-07-18 devnull hout = &c->hout;
591 28b49df3 2006-07-18 devnull
592 28b49df3 2006-07-18 devnull emptylumpcache();
593 28b49df3 2006-07-18 devnull emptydcache();
594 28b49df3 2006-07-18 devnull emptyicache();
595 28b49df3 2006-07-18 devnull hprint(hout, "emptied all caches\n");
596 28b49df3 2006-07-18 devnull hflush(hout);
597 28b49df3 2006-07-18 devnull return 0;
598 28b49df3 2006-07-18 devnull }
599 28b49df3 2006-07-18 devnull
600 28b49df3 2006-07-18 devnull static int
601 28b49df3 2006-07-18 devnull hlcacheempty(HConnect *c)
602 28b49df3 2006-07-18 devnull {
603 28b49df3 2006-07-18 devnull Hio *hout;
604 28b49df3 2006-07-18 devnull int r;
605 28b49df3 2006-07-18 devnull
606 27d28098 2007-04-21 devnull r = hsettext(c);
607 28b49df3 2006-07-18 devnull if(r < 0)
608 28b49df3 2006-07-18 devnull return r;
609 28b49df3 2006-07-18 devnull hout = &c->hout;
610 28b49df3 2006-07-18 devnull
611 28b49df3 2006-07-18 devnull emptylumpcache();
612 28b49df3 2006-07-18 devnull hprint(hout, "emptied lumpcache\n");
613 28b49df3 2006-07-18 devnull hflush(hout);
614 28b49df3 2006-07-18 devnull return 0;
615 28b49df3 2006-07-18 devnull }
616 28b49df3 2006-07-18 devnull
617 28b49df3 2006-07-18 devnull static int
618 28b49df3 2006-07-18 devnull hicacheempty(HConnect *c)
619 28b49df3 2006-07-18 devnull {
620 28b49df3 2006-07-18 devnull Hio *hout;
621 28b49df3 2006-07-18 devnull int r;
622 28b49df3 2006-07-18 devnull
623 27d28098 2007-04-21 devnull r = hsettext(c);
624 28b49df3 2006-07-18 devnull if(r < 0)
625 28b49df3 2006-07-18 devnull return r;
626 28b49df3 2006-07-18 devnull hout = &c->hout;
627 28b49df3 2006-07-18 devnull
628 28b49df3 2006-07-18 devnull emptyicache();
629 28b49df3 2006-07-18 devnull hprint(hout, "emptied icache\n");
630 28b49df3 2006-07-18 devnull hflush(hout);
631 28b49df3 2006-07-18 devnull return 0;
632 28b49df3 2006-07-18 devnull }
633 28b49df3 2006-07-18 devnull
634 28b49df3 2006-07-18 devnull static int
635 28b49df3 2006-07-18 devnull hdcacheempty(HConnect *c)
636 28b49df3 2006-07-18 devnull {
637 28b49df3 2006-07-18 devnull Hio *hout;
638 28b49df3 2006-07-18 devnull int r;
639 28b49df3 2006-07-18 devnull
640 27d28098 2007-04-21 devnull r = hsettext(c);
641 28b49df3 2006-07-18 devnull if(r < 0)
642 28b49df3 2006-07-18 devnull return r;
643 28b49df3 2006-07-18 devnull hout = &c->hout;
644 28b49df3 2006-07-18 devnull
645 28b49df3 2006-07-18 devnull emptydcache();
646 28b49df3 2006-07-18 devnull hprint(hout, "emptied dcache\n");
647 28b49df3 2006-07-18 devnull hflush(hout);
648 28b49df3 2006-07-18 devnull return 0;
649 28b49df3 2006-07-18 devnull }
650 28b49df3 2006-07-18 devnull static int
651 28b49df3 2006-07-18 devnull hicachekick(HConnect *c)
652 28b49df3 2006-07-18 devnull {
653 28b49df3 2006-07-18 devnull Hio *hout;
654 28b49df3 2006-07-18 devnull int r;
655 28b49df3 2006-07-18 devnull
656 27d28098 2007-04-21 devnull r = hsettext(c);
657 28b49df3 2006-07-18 devnull if(r < 0)
658 28b49df3 2006-07-18 devnull return r;
659 28b49df3 2006-07-18 devnull hout = &c->hout;
660 28b49df3 2006-07-18 devnull
661 28b49df3 2006-07-18 devnull kickicache();
662 28b49df3 2006-07-18 devnull hprint(hout, "kicked icache\n");
663 28b49df3 2006-07-18 devnull hflush(hout);
664 28b49df3 2006-07-18 devnull return 0;
665 28b49df3 2006-07-18 devnull }
666 28b49df3 2006-07-18 devnull
667 28b49df3 2006-07-18 devnull static int
668 28b49df3 2006-07-18 devnull hdcachekick(HConnect *c)
669 28b49df3 2006-07-18 devnull {
670 28b49df3 2006-07-18 devnull Hio *hout;
671 28b49df3 2006-07-18 devnull int r;
672 28b49df3 2006-07-18 devnull
673 27d28098 2007-04-21 devnull r = hsettext(c);
674 28b49df3 2006-07-18 devnull if(r < 0)
675 28b49df3 2006-07-18 devnull return r;
676 28b49df3 2006-07-18 devnull hout = &c->hout;
677 28b49df3 2006-07-18 devnull
678 28b49df3 2006-07-18 devnull kickdcache();
679 28b49df3 2006-07-18 devnull hprint(hout, "kicked dcache\n");
680 28b49df3 2006-07-18 devnull hflush(hout);
681 28b49df3 2006-07-18 devnull return 0;
682 28b49df3 2006-07-18 devnull }
683 28b49df3 2006-07-18 devnull static int
684 a0d146ed 2005-07-12 devnull hicacheflush(HConnect *c)
685 a0d146ed 2005-07-12 devnull {
686 a0d146ed 2005-07-12 devnull Hio *hout;
687 a0d146ed 2005-07-12 devnull int r;
688 a0d146ed 2005-07-12 devnull
689 27d28098 2007-04-21 devnull r = hsettext(c);
690 a0d146ed 2005-07-12 devnull if(r < 0)
691 a0d146ed 2005-07-12 devnull return r;
692 a0d146ed 2005-07-12 devnull hout = &c->hout;
693 a0d146ed 2005-07-12 devnull
694 a0d146ed 2005-07-12 devnull flushicache();
695 a0d146ed 2005-07-12 devnull hprint(hout, "flushed icache\n");
696 a0d146ed 2005-07-12 devnull hflush(hout);
697 a0d146ed 2005-07-12 devnull return 0;
698 a0d146ed 2005-07-12 devnull }
699 a0d146ed 2005-07-12 devnull
700 a0d146ed 2005-07-12 devnull static int
701 a0d146ed 2005-07-12 devnull hdcacheflush(HConnect *c)
702 a0d146ed 2005-07-12 devnull {
703 a0d146ed 2005-07-12 devnull Hio *hout;
704 a0d146ed 2005-07-12 devnull int r;
705 a0d146ed 2005-07-12 devnull
706 27d28098 2007-04-21 devnull r = hsettext(c);
707 a0d146ed 2005-07-12 devnull if(r < 0)
708 a0d146ed 2005-07-12 devnull return r;
709 a0d146ed 2005-07-12 devnull hout = &c->hout;
710 a0d146ed 2005-07-12 devnull
711 a0d146ed 2005-07-12 devnull flushdcache();
712 a0d146ed 2005-07-12 devnull hprint(hout, "flushed dcache\n");
713 a0d146ed 2005-07-12 devnull hflush(hout);
714 a0d146ed 2005-07-12 devnull return 0;
715 a0d146ed 2005-07-12 devnull }
716 a0d146ed 2005-07-12 devnull
717 a0d146ed 2005-07-12 devnull static int
718 a0d146ed 2005-07-12 devnull dindex(HConnect *c)
719 a0d146ed 2005-07-12 devnull {
720 a0d146ed 2005-07-12 devnull Hio *hout;
721 a0d146ed 2005-07-12 devnull Index *ix;
722 a0d146ed 2005-07-12 devnull int i, r;
723 a0d146ed 2005-07-12 devnull
724 27d28098 2007-04-21 devnull r = hsettext(c);
725 a0d146ed 2005-07-12 devnull if(r < 0)
726 a0d146ed 2005-07-12 devnull return r;
727 a0d146ed 2005-07-12 devnull hout = &c->hout;
728 a0d146ed 2005-07-12 devnull
729 a0d146ed 2005-07-12 devnull
730 a0d146ed 2005-07-12 devnull ix = mainindex;
731 a0d146ed 2005-07-12 devnull hprint(hout, "index=%s version=%d blocksize=%d tabsize=%d\n",
732 a0d146ed 2005-07-12 devnull ix->name, ix->version, ix->blocksize, ix->tabsize);
733 a0d146ed 2005-07-12 devnull hprint(hout, "\tbuckets=%d div=%d\n", ix->buckets, ix->div);
734 a0d146ed 2005-07-12 devnull for(i = 0; i < ix->nsects; i++)
735 a0d146ed 2005-07-12 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);
736 a0d146ed 2005-07-12 devnull for(i = 0; i < ix->narenas; i++){
737 a0d146ed 2005-07-12 devnull if(ix->arenas[i] != nil && ix->arenas[i]->memstats.clumps != 0){
738 a0d146ed 2005-07-12 devnull hprint(hout, "arena=%s at index [%lld,%lld)\n\t", ix->amap[i].name, ix->amap[i].start, ix->amap[i].stop);
739 a0d146ed 2005-07-12 devnull darena(hout, ix->arenas[i]);
740 a0d146ed 2005-07-12 devnull }
741 a0d146ed 2005-07-12 devnull }
742 a0d146ed 2005-07-12 devnull hflush(hout);
743 a0d146ed 2005-07-12 devnull return 0;
744 a0d146ed 2005-07-12 devnull }
745 a0d146ed 2005-07-12 devnull
746 a0d146ed 2005-07-12 devnull typedef struct Arg Arg;
747 a0d146ed 2005-07-12 devnull struct Arg
748 a0d146ed 2005-07-12 devnull {
749 a0d146ed 2005-07-12 devnull int index;
750 a0d146ed 2005-07-12 devnull int index2;
751 a0d146ed 2005-07-12 devnull };
752 a0d146ed 2005-07-12 devnull
753 a0d146ed 2005-07-12 devnull static long
754 a0d146ed 2005-07-12 devnull rawgraph(Stats *s, Stats *t, void *va)
755 a0d146ed 2005-07-12 devnull {
756 a0d146ed 2005-07-12 devnull Arg *a;
757 a0d146ed 2005-07-12 devnull
758 28b49df3 2006-07-18 devnull USED(s);
759 a0d146ed 2005-07-12 devnull a = va;
760 a0d146ed 2005-07-12 devnull return t->n[a->index];
761 a0d146ed 2005-07-12 devnull }
762 a0d146ed 2005-07-12 devnull
763 a0d146ed 2005-07-12 devnull static long
764 a0d146ed 2005-07-12 devnull diffgraph(Stats *s, Stats *t, void *va)
765 a0d146ed 2005-07-12 devnull {
766 a0d146ed 2005-07-12 devnull Arg *a;
767 a0d146ed 2005-07-12 devnull
768 a0d146ed 2005-07-12 devnull a = va;
769 a0d146ed 2005-07-12 devnull return t->n[a->index] - s->n[a->index];
770 a0d146ed 2005-07-12 devnull }
771 a0d146ed 2005-07-12 devnull
772 a0d146ed 2005-07-12 devnull static long
773 a0d146ed 2005-07-12 devnull pctgraph(Stats *s, Stats *t, void *va)
774 a0d146ed 2005-07-12 devnull {
775 a0d146ed 2005-07-12 devnull Arg *a;
776 a0d146ed 2005-07-12 devnull
777 28b49df3 2006-07-18 devnull USED(s);
778 a0d146ed 2005-07-12 devnull a = va;
779 a0d146ed 2005-07-12 devnull return percent(t->n[a->index], t->n[a->index2]);
780 a0d146ed 2005-07-12 devnull }
781 a0d146ed 2005-07-12 devnull
782 a0d146ed 2005-07-12 devnull static long
783 a0d146ed 2005-07-12 devnull pctdiffgraph(Stats *s, Stats *t, void *va)
784 a0d146ed 2005-07-12 devnull {
785 a0d146ed 2005-07-12 devnull Arg *a;
786 a0d146ed 2005-07-12 devnull
787 a0d146ed 2005-07-12 devnull a = va;
788 a0d146ed 2005-07-12 devnull return percent(t->n[a->index]-s->n[a->index], t->n[a->index2]-s->n[a->index2]);
789 a0d146ed 2005-07-12 devnull }
790 a0d146ed 2005-07-12 devnull
791 a0d146ed 2005-07-12 devnull static long
792 6932098c 2007-04-21 devnull xdiv(long a, long b)
793 27d28098 2007-04-21 devnull {
794 27d28098 2007-04-21 devnull if(b == 0)
795 27d28098 2007-04-21 devnull b++;
796 27d28098 2007-04-21 devnull return a/b;
797 27d28098 2007-04-21 devnull }
798 27d28098 2007-04-21 devnull
799 27d28098 2007-04-21 devnull static long
800 27d28098 2007-04-21 devnull divdiffgraph(Stats *s, Stats *t, void *va)
801 27d28098 2007-04-21 devnull {
802 27d28098 2007-04-21 devnull Arg *a;
803 27d28098 2007-04-21 devnull
804 27d28098 2007-04-21 devnull a = va;
805 6932098c 2007-04-21 devnull return xdiv(t->n[a->index] - s->n[a->index], t->n[a->index2] - s->n[a->index2]);
806 27d28098 2007-04-21 devnull }
807 27d28098 2007-04-21 devnull
808 27d28098 2007-04-21 devnull static long
809 a0d146ed 2005-07-12 devnull netbw(Stats *s)
810 a0d146ed 2005-07-12 devnull {
811 a0d146ed 2005-07-12 devnull ulong *n;
812 a0d146ed 2005-07-12 devnull
813 a0d146ed 2005-07-12 devnull n = s->n;
814 a0d146ed 2005-07-12 devnull return n[StatRpcReadBytes]+n[StatRpcWriteBytes]; /* not exactly right */
815 a0d146ed 2005-07-12 devnull }
816 a0d146ed 2005-07-12 devnull
817 a0d146ed 2005-07-12 devnull static long
818 a0d146ed 2005-07-12 devnull diskbw(Stats *s)
819 a0d146ed 2005-07-12 devnull {
820 a0d146ed 2005-07-12 devnull ulong *n;
821 a0d146ed 2005-07-12 devnull
822 a0d146ed 2005-07-12 devnull n = s->n;
823 a0d146ed 2005-07-12 devnull return n[StatApartReadBytes]+n[StatApartWriteBytes]
824 a0d146ed 2005-07-12 devnull + n[StatIsectReadBytes]+n[StatIsectWriteBytes]
825 a0d146ed 2005-07-12 devnull + n[StatSumReadBytes];
826 a0d146ed 2005-07-12 devnull }
827 a0d146ed 2005-07-12 devnull
828 a0d146ed 2005-07-12 devnull static long
829 a0d146ed 2005-07-12 devnull iobw(Stats *s)
830 a0d146ed 2005-07-12 devnull {
831 a0d146ed 2005-07-12 devnull return netbw(s)+diskbw(s);
832 a0d146ed 2005-07-12 devnull }
833 a0d146ed 2005-07-12 devnull
834 a0d146ed 2005-07-12 devnull static long
835 a0d146ed 2005-07-12 devnull diskgraph(Stats *s, Stats *t, void *va)
836 a0d146ed 2005-07-12 devnull {
837 a0d146ed 2005-07-12 devnull USED(va);
838 a0d146ed 2005-07-12 devnull return diskbw(t)-diskbw(s);
839 a0d146ed 2005-07-12 devnull }
840 a0d146ed 2005-07-12 devnull
841 a0d146ed 2005-07-12 devnull static long
842 a0d146ed 2005-07-12 devnull netgraph(Stats *s, Stats *t, void *va)
843 a0d146ed 2005-07-12 devnull {
844 a0d146ed 2005-07-12 devnull USED(va);
845 a0d146ed 2005-07-12 devnull return netbw(t)-netbw(s);
846 a0d146ed 2005-07-12 devnull }
847 a0d146ed 2005-07-12 devnull
848 a0d146ed 2005-07-12 devnull static long
849 a0d146ed 2005-07-12 devnull iograph(Stats *s, Stats *t, void *va)
850 a0d146ed 2005-07-12 devnull {
851 a0d146ed 2005-07-12 devnull USED(va);
852 a0d146ed 2005-07-12 devnull return iobw(t)-iobw(s);
853 a0d146ed 2005-07-12 devnull }
854 a0d146ed 2005-07-12 devnull
855 a0d146ed 2005-07-12 devnull
856 a0d146ed 2005-07-12 devnull static char* graphname[] =
857 a0d146ed 2005-07-12 devnull {
858 a0d146ed 2005-07-12 devnull "rpctotal",
859 a0d146ed 2005-07-12 devnull "rpcread",
860 a0d146ed 2005-07-12 devnull "rpcreadok",
861 a0d146ed 2005-07-12 devnull "rpcreadfail",
862 a0d146ed 2005-07-12 devnull "rpcreadbyte",
863 a0d146ed 2005-07-12 devnull "rpcreadtime",
864 a0d146ed 2005-07-12 devnull "rpcreadcached",
865 a0d146ed 2005-07-12 devnull "rpcreadcachedtime",
866 a0d146ed 2005-07-12 devnull "rpcreaduncached",
867 a0d146ed 2005-07-12 devnull "rpcreaduncachedtime",
868 a0d146ed 2005-07-12 devnull "rpcwrite",
869 a0d146ed 2005-07-12 devnull "rpcwritenew",
870 a0d146ed 2005-07-12 devnull "rpcwriteold",
871 a0d146ed 2005-07-12 devnull "rpcwritefail",
872 a0d146ed 2005-07-12 devnull "rpcwritebyte",
873 a0d146ed 2005-07-12 devnull "rpcwritetime",
874 a0d146ed 2005-07-12 devnull "rpcwritenewtime",
875 a0d146ed 2005-07-12 devnull "rpcwriteoldtime",
876 a0d146ed 2005-07-12 devnull
877 a0d146ed 2005-07-12 devnull "lcachehit",
878 a0d146ed 2005-07-12 devnull "lcachemiss",
879 a0d146ed 2005-07-12 devnull "lcachelookup",
880 a0d146ed 2005-07-12 devnull "lcachewrite",
881 a0d146ed 2005-07-12 devnull "lcachesize",
882 a0d146ed 2005-07-12 devnull "lcachestall",
883 a0d146ed 2005-07-12 devnull "lcachelookuptime",
884 a0d146ed 2005-07-12 devnull
885 a0d146ed 2005-07-12 devnull "dcachehit",
886 a0d146ed 2005-07-12 devnull "dcachemiss",
887 a0d146ed 2005-07-12 devnull "dcachelookup",
888 a0d146ed 2005-07-12 devnull "dcacheread",
889 a0d146ed 2005-07-12 devnull "dcachewrite",
890 a0d146ed 2005-07-12 devnull "dcachedirty",
891 a0d146ed 2005-07-12 devnull "dcachesize",
892 a0d146ed 2005-07-12 devnull "dcacheflush",
893 a0d146ed 2005-07-12 devnull "dcachestall",
894 a0d146ed 2005-07-12 devnull "dcachelookuptime",
895 a0d146ed 2005-07-12 devnull
896 a0d146ed 2005-07-12 devnull "dblockstall",
897 a0d146ed 2005-07-12 devnull "lumpstall",
898 a0d146ed 2005-07-12 devnull
899 a0d146ed 2005-07-12 devnull "icachehit",
900 a0d146ed 2005-07-12 devnull "icachemiss",
901 7a400ee9 2007-09-25 rsc "icacheread",
902 a0d146ed 2005-07-12 devnull "icachewrite",
903 a0d146ed 2005-07-12 devnull "icachefill",
904 a0d146ed 2005-07-12 devnull "icacheprefetch",
905 a0d146ed 2005-07-12 devnull "icachedirty",
906 a0d146ed 2005-07-12 devnull "icachesize",
907 a0d146ed 2005-07-12 devnull "icacheflush",
908 a0d146ed 2005-07-12 devnull "icachestall",
909 a0d146ed 2005-07-12 devnull "icachelookuptime",
910 7a400ee9 2007-09-25 rsc "icachelookup",
911 7a400ee9 2007-09-25 rsc "scachehit",
912 7a400ee9 2007-09-25 rsc "scacheprefetch",
913 a0d146ed 2005-07-12 devnull
914 a0d146ed 2005-07-12 devnull "bloomhit",
915 a0d146ed 2005-07-12 devnull "bloommiss",
916 a0d146ed 2005-07-12 devnull "bloomfalsemiss",
917 a0d146ed 2005-07-12 devnull "bloomlookup",
918 a0d146ed 2005-07-12 devnull "bloomones",
919 a0d146ed 2005-07-12 devnull "bloombits",
920 a0d146ed 2005-07-12 devnull
921 a0d146ed 2005-07-12 devnull "apartread",
922 a0d146ed 2005-07-12 devnull "apartreadbyte",
923 a0d146ed 2005-07-12 devnull "apartwrite",
924 a0d146ed 2005-07-12 devnull "apartwritebyte",
925 a0d146ed 2005-07-12 devnull
926 a0d146ed 2005-07-12 devnull "isectread",
927 a0d146ed 2005-07-12 devnull "isectreadbyte",
928 a0d146ed 2005-07-12 devnull "isectwrite",
929 a0d146ed 2005-07-12 devnull "isectwritebyte",
930 a0d146ed 2005-07-12 devnull
931 a0d146ed 2005-07-12 devnull "sumread",
932 28b49df3 2006-07-18 devnull "sumreadbyte",
933 7a400ee9 2007-09-25 rsc
934 7a400ee9 2007-09-25 rsc "cigload",
935 7a400ee9 2007-09-25 rsc "cigloadtime",
936 a0d146ed 2005-07-12 devnull };
937 a0d146ed 2005-07-12 devnull
938 a0d146ed 2005-07-12 devnull static int
939 a0d146ed 2005-07-12 devnull findname(char *s)
940 a0d146ed 2005-07-12 devnull {
941 a0d146ed 2005-07-12 devnull int i;
942 a0d146ed 2005-07-12 devnull
943 a0d146ed 2005-07-12 devnull for(i=0; i<nelem(graphname); i++)
944 a0d146ed 2005-07-12 devnull if(strcmp(graphname[i], s) == 0)
945 a0d146ed 2005-07-12 devnull return i;
946 a0d146ed 2005-07-12 devnull return -1;
947 a0d146ed 2005-07-12 devnull }
948 a0d146ed 2005-07-12 devnull
949 a0d146ed 2005-07-12 devnull static void
950 a0d146ed 2005-07-12 devnull dotextbin(Hio *io, Graph *g)
951 a0d146ed 2005-07-12 devnull {
952 a0d146ed 2005-07-12 devnull int i, nbin;
953 a0d146ed 2005-07-12 devnull Statbin *b, bin[2000]; /* 32 kB, but whack is worse */
954 a0d146ed 2005-07-12 devnull
955 a0d146ed 2005-07-12 devnull needstack(8192); /* double check that bin didn't kill us */
956 a0d146ed 2005-07-12 devnull nbin = 100;
957 a0d146ed 2005-07-12 devnull binstats(g->fn, g->arg, g->t0, g->t1, bin, nbin);
958 a0d146ed 2005-07-12 devnull
959 a0d146ed 2005-07-12 devnull hprint(io, "stats\n\n");
960 a0d146ed 2005-07-12 devnull for(i=0; i<nbin; i++){
961 a0d146ed 2005-07-12 devnull b = &bin[i];
962 a0d146ed 2005-07-12 devnull hprint(io, "%d: nsamp=%d min=%d max=%d avg=%d\n",
963 a0d146ed 2005-07-12 devnull i, b->nsamp, b->min, b->max, b->avg);
964 a0d146ed 2005-07-12 devnull }
965 a0d146ed 2005-07-12 devnull }
966 a0d146ed 2005-07-12 devnull
967 a0d146ed 2005-07-12 devnull static int
968 a0d146ed 2005-07-12 devnull xgraph(HConnect *c)
969 a0d146ed 2005-07-12 devnull {
970 27d28098 2007-04-21 devnull char *name;
971 a0d146ed 2005-07-12 devnull Hio *hout;
972 a0d146ed 2005-07-12 devnull Memimage *m;
973 27d28098 2007-04-21 devnull int dotext;
974 a0d146ed 2005-07-12 devnull Graph g;
975 a0d146ed 2005-07-12 devnull Arg arg;
976 27d28098 2007-04-21 devnull char *graph, *a;
977 a0d146ed 2005-07-12 devnull
978 27d28098 2007-04-21 devnull name = hargstr(c, "arg", "");
979 27d28098 2007-04-21 devnull if((arg.index = findname(name)) == -1 && strcmp(name, "*") != 0){
980 27d28098 2007-04-21 devnull werrstr("unknown name %s", name);
981 28b49df3 2006-07-18 devnull goto error;
982 28b49df3 2006-07-18 devnull }
983 27d28098 2007-04-21 devnull a = hargstr(c, "arg2", "");
984 27d28098 2007-04-21 devnull if(a[0] && (arg.index2 = findname(a)) == -1){
985 27d28098 2007-04-21 devnull werrstr("unknown name %s", a);
986 28b49df3 2006-07-18 devnull goto error;
987 28b49df3 2006-07-18 devnull }
988 27d28098 2007-04-21 devnull
989 a0d146ed 2005-07-12 devnull g.arg = &arg;
990 27d28098 2007-04-21 devnull g.t0 = hargint(c, "t0", -120);
991 27d28098 2007-04-21 devnull g.t1 = hargint(c, "t1", 0);
992 27d28098 2007-04-21 devnull g.min = hargint(c, "min", -1);
993 27d28098 2007-04-21 devnull g.max = hargint(c, "max", -1);
994 27d28098 2007-04-21 devnull g.wid = hargint(c, "wid", -1);
995 27d28098 2007-04-21 devnull g.ht = hargint(c, "ht", -1);
996 27d28098 2007-04-21 devnull dotext = hargstr(c, "text", "")[0] != 0;
997 27d28098 2007-04-21 devnull g.fill = hargint(c, "fill", -1);
998 27d28098 2007-04-21 devnull
999 27d28098 2007-04-21 devnull graph = hargstr(c, "graph", "raw");
1000 27d28098 2007-04-21 devnull if(strcmp(graph, "raw") == 0)
1001 27d28098 2007-04-21 devnull g.fn = rawgraph;
1002 27d28098 2007-04-21 devnull else if(strcmp(graph, "diskbw") == 0)
1003 27d28098 2007-04-21 devnull g.fn = diskgraph;
1004 27d28098 2007-04-21 devnull else if(strcmp(graph, "iobw") == 0)
1005 27d28098 2007-04-21 devnull g.fn = iograph;
1006 27d28098 2007-04-21 devnull else if(strcmp(graph, "netbw") == 0)
1007 27d28098 2007-04-21 devnull g.fn = netgraph;
1008 27d28098 2007-04-21 devnull else if(strcmp(graph, "diff") == 0)
1009 27d28098 2007-04-21 devnull g.fn = diffgraph;
1010 27d28098 2007-04-21 devnull else if(strcmp(graph, "pct") == 0)
1011 27d28098 2007-04-21 devnull g.fn = pctgraph;
1012 27d28098 2007-04-21 devnull else if(strcmp(graph, "pctdiff") == 0)
1013 27d28098 2007-04-21 devnull g.fn = pctdiffgraph;
1014 27d28098 2007-04-21 devnull else if(strcmp(graph, "divdiff") == 0)
1015 27d28098 2007-04-21 devnull g.fn = divdiffgraph;
1016 27d28098 2007-04-21 devnull else{
1017 27d28098 2007-04-21 devnull werrstr("unknown graph %s", graph);
1018 27d28098 2007-04-21 devnull goto error;
1019 a0d146ed 2005-07-12 devnull }
1020 27d28098 2007-04-21 devnull
1021 a0d146ed 2005-07-12 devnull if(dotext){
1022 27d28098 2007-04-21 devnull hsettype(c, "text/plain");
1023 a0d146ed 2005-07-12 devnull dotextbin(&c->hout, &g);
1024 a0d146ed 2005-07-12 devnull hflush(&c->hout);
1025 a0d146ed 2005-07-12 devnull return 0;
1026 a0d146ed 2005-07-12 devnull }
1027 a0d146ed 2005-07-12 devnull
1028 a0d146ed 2005-07-12 devnull m = statgraph(&g);
1029 a0d146ed 2005-07-12 devnull if(m == nil)
1030 28b49df3 2006-07-18 devnull goto error;
1031 a0d146ed 2005-07-12 devnull
1032 27d28098 2007-04-21 devnull if(hsettype(c, "image/png") < 0)
1033 a0d146ed 2005-07-12 devnull return -1;
1034 a0d146ed 2005-07-12 devnull hout = &c->hout;
1035 a0d146ed 2005-07-12 devnull writepng(hout, m);
1036 a0d146ed 2005-07-12 devnull qlock(&memdrawlock);
1037 a0d146ed 2005-07-12 devnull freememimage(m);
1038 a0d146ed 2005-07-12 devnull qunlock(&memdrawlock);
1039 a0d146ed 2005-07-12 devnull hflush(hout);
1040 a0d146ed 2005-07-12 devnull return 0;
1041 a0d146ed 2005-07-12 devnull
1042 28b49df3 2006-07-18 devnull error:
1043 28b49df3 2006-07-18 devnull return herror(c);
1044 a0d146ed 2005-07-12 devnull }
1045 a0d146ed 2005-07-12 devnull
1046 a0d146ed 2005-07-12 devnull static int
1047 a0d146ed 2005-07-12 devnull xloglist(HConnect *c)
1048 a0d146ed 2005-07-12 devnull {
1049 27d28098 2007-04-21 devnull if(hsettype(c, "text/html") < 0)
1050 a0d146ed 2005-07-12 devnull return -1;
1051 a0d146ed 2005-07-12 devnull vtloghlist(&c->hout);
1052 a0d146ed 2005-07-12 devnull hflush(&c->hout);
1053 a0d146ed 2005-07-12 devnull return 0;
1054 a0d146ed 2005-07-12 devnull }
1055 a0d146ed 2005-07-12 devnull
1056 a0d146ed 2005-07-12 devnull static int
1057 a0d146ed 2005-07-12 devnull xlog(HConnect *c)
1058 a0d146ed 2005-07-12 devnull {
1059 a0d146ed 2005-07-12 devnull char *name;
1060 a0d146ed 2005-07-12 devnull VtLog *l;
1061 a0d146ed 2005-07-12 devnull
1062 27d28098 2007-04-21 devnull name = hargstr(c, "log", "");
1063 27d28098 2007-04-21 devnull if(!name[0])
1064 a0d146ed 2005-07-12 devnull return xloglist(c);
1065 a0d146ed 2005-07-12 devnull l = vtlogopen(name, 0);
1066 a0d146ed 2005-07-12 devnull if(l == nil)
1067 27d28098 2007-04-21 devnull return hnotfound(c);
1068 27d28098 2007-04-21 devnull if(hsettype(c, "text/html") < 0){
1069 a0d146ed 2005-07-12 devnull vtlogclose(l);
1070 a0d146ed 2005-07-12 devnull return -1;
1071 a0d146ed 2005-07-12 devnull }
1072 a0d146ed 2005-07-12 devnull vtloghdump(&c->hout, l);
1073 a0d146ed 2005-07-12 devnull vtlogclose(l);
1074 a0d146ed 2005-07-12 devnull hflush(&c->hout);
1075 a0d146ed 2005-07-12 devnull return 0;
1076 a0d146ed 2005-07-12 devnull }
1077 a0d146ed 2005-07-12 devnull
1078 a0d146ed 2005-07-12 devnull static int
1079 a0d146ed 2005-07-12 devnull xindex(HConnect *c)
1080 a0d146ed 2005-07-12 devnull {
1081 27d28098 2007-04-21 devnull if(hsettype(c, "text/xml") < 0)
1082 a0d146ed 2005-07-12 devnull return -1;
1083 a0d146ed 2005-07-12 devnull xmlindex(&c->hout, mainindex, "index", 0);
1084 a0d146ed 2005-07-12 devnull hflush(&c->hout);
1085 a0d146ed 2005-07-12 devnull return 0;
1086 a0d146ed 2005-07-12 devnull }
1087 a0d146ed 2005-07-12 devnull
1088 a0d146ed 2005-07-12 devnull void
1089 a0d146ed 2005-07-12 devnull xmlindent(Hio *hout, int indent)
1090 a0d146ed 2005-07-12 devnull {
1091 a0d146ed 2005-07-12 devnull int i;
1092 a0d146ed 2005-07-12 devnull
1093 a0d146ed 2005-07-12 devnull for(i = 0; i < indent; i++)
1094 a0d146ed 2005-07-12 devnull hputc(hout, '\t');
1095 a0d146ed 2005-07-12 devnull }
1096 a0d146ed 2005-07-12 devnull
1097 a0d146ed 2005-07-12 devnull void
1098 a0d146ed 2005-07-12 devnull xmlaname(Hio *hout, char *v, char *tag)
1099 a0d146ed 2005-07-12 devnull {
1100 a0d146ed 2005-07-12 devnull hprint(hout, " %s=\"%s\"", tag, v);
1101 a0d146ed 2005-07-12 devnull }
1102 a0d146ed 2005-07-12 devnull
1103 a0d146ed 2005-07-12 devnull void
1104 a0d146ed 2005-07-12 devnull xmlscore(Hio *hout, u8int *v, char *tag)
1105 a0d146ed 2005-07-12 devnull {
1106 a0d146ed 2005-07-12 devnull if(scorecmp(zeroscore, v) == 0)
1107 a0d146ed 2005-07-12 devnull return;
1108 a0d146ed 2005-07-12 devnull hprint(hout, " %s=\"%V\"", tag, v);
1109 a0d146ed 2005-07-12 devnull }
1110 a0d146ed 2005-07-12 devnull
1111 a0d146ed 2005-07-12 devnull void
1112 a0d146ed 2005-07-12 devnull xmlsealed(Hio *hout, int v, char *tag)
1113 a0d146ed 2005-07-12 devnull {
1114 a0d146ed 2005-07-12 devnull if(!v)
1115 a0d146ed 2005-07-12 devnull return;
1116 a0d146ed 2005-07-12 devnull hprint(hout, " %s=\"yes\"", tag);
1117 a0d146ed 2005-07-12 devnull }
1118 a0d146ed 2005-07-12 devnull
1119 a0d146ed 2005-07-12 devnull void
1120 a0d146ed 2005-07-12 devnull xmlu32int(Hio *hout, u32int v, char *tag)
1121 a0d146ed 2005-07-12 devnull {
1122 a0d146ed 2005-07-12 devnull hprint(hout, " %s=\"%ud\"", tag, v);
1123 a0d146ed 2005-07-12 devnull }
1124 a0d146ed 2005-07-12 devnull
1125 a0d146ed 2005-07-12 devnull void
1126 a0d146ed 2005-07-12 devnull xmlu64int(Hio *hout, u64int v, char *tag)
1127 a0d146ed 2005-07-12 devnull {
1128 a0d146ed 2005-07-12 devnull hprint(hout, " %s=\"%llud\"", tag, v);
1129 a0d146ed 2005-07-12 devnull }
1130 a0d146ed 2005-07-12 devnull
1131 a0d146ed 2005-07-12 devnull void
1132 a0d146ed 2005-07-12 devnull vtloghdump(Hio *h, VtLog *l)
1133 a0d146ed 2005-07-12 devnull {
1134 a0d146ed 2005-07-12 devnull int i;
1135 a0d146ed 2005-07-12 devnull VtLogChunk *c;
1136 a0d146ed 2005-07-12 devnull char *name;
1137 a0d146ed 2005-07-12 devnull
1138 a0d146ed 2005-07-12 devnull name = l ? l->name : "&lt;nil&gt;";
1139 a0d146ed 2005-07-12 devnull
1140 a0d146ed 2005-07-12 devnull hprint(h, "<html><head>\n");
1141 a0d146ed 2005-07-12 devnull hprint(h, "<title>Venti Server Log: %s</title>\n", name);
1142 a0d146ed 2005-07-12 devnull hprint(h, "</head><body>\n");
1143 a0d146ed 2005-07-12 devnull hprint(h, "<b>Venti Server Log: %s</b>\n<p>\n", name);
1144 a0d146ed 2005-07-12 devnull
1145 a0d146ed 2005-07-12 devnull if(l){
1146 a0d146ed 2005-07-12 devnull c = l->w;
1147 a0d146ed 2005-07-12 devnull for(i=0; i<l->nchunk; i++){
1148 a0d146ed 2005-07-12 devnull if(++c == l->chunk+l->nchunk)
1149 a0d146ed 2005-07-12 devnull c = l->chunk;
1150 a0d146ed 2005-07-12 devnull hwrite(h, c->p, c->wp-c->p);
1151 a0d146ed 2005-07-12 devnull }
1152 a0d146ed 2005-07-12 devnull }
1153 a0d146ed 2005-07-12 devnull hprint(h, "</body></html>\n");
1154 a0d146ed 2005-07-12 devnull }
1155 a0d146ed 2005-07-12 devnull
1156 a0d146ed 2005-07-12 devnull static int
1157 a0d146ed 2005-07-12 devnull strpcmp(const void *va, const void *vb)
1158 a0d146ed 2005-07-12 devnull {
1159 a0d146ed 2005-07-12 devnull return strcmp(*(char**)va, *(char**)vb);
1160 a0d146ed 2005-07-12 devnull }
1161 a0d146ed 2005-07-12 devnull
1162 a0d146ed 2005-07-12 devnull void
1163 a0d146ed 2005-07-12 devnull vtloghlist(Hio *h)
1164 a0d146ed 2005-07-12 devnull {
1165 a0d146ed 2005-07-12 devnull char **p;
1166 a0d146ed 2005-07-12 devnull int i, n;
1167 a0d146ed 2005-07-12 devnull
1168 a0d146ed 2005-07-12 devnull hprint(h, "<html><head>\n");
1169 a0d146ed 2005-07-12 devnull hprint(h, "<title>Venti Server Logs</title>\n");
1170 a0d146ed 2005-07-12 devnull hprint(h, "</head><body>\n");
1171 a0d146ed 2005-07-12 devnull hprint(h, "<b>Venti Server Logs</b>\n<p>\n");
1172 a0d146ed 2005-07-12 devnull
1173 a0d146ed 2005-07-12 devnull p = vtlognames(&n);
1174 a0d146ed 2005-07-12 devnull qsort(p, n, sizeof(p[0]), strpcmp);
1175 a0d146ed 2005-07-12 devnull for(i=0; i<n; i++)
1176 27d28098 2007-04-21 devnull hprint(h, "<a href=\"/log?log=%s\">%s</a><br>\n", p[i], p[i]);
1177 a0d146ed 2005-07-12 devnull vtfree(p);
1178 a0d146ed 2005-07-12 devnull hprint(h, "</body></html>\n");
1179 a0d146ed 2005-07-12 devnull }