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 fa325e9b 2020-01-10 cross
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 fa325e9b 2020-01-10 cross
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 fa325e9b 2020-01-10 cross
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 fa325e9b 2020-01-10 cross
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 fa325e9b 2020-01-10 cross
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 fa325e9b 2020-01-10 cross
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 fa325e9b 2020-01-10 cross
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 e7e953b3 2012-04-22 rsc "bootstrap", &bootstrap,
400 a0d146ed 2005-07-12 devnull 0
401 a0d146ed 2005-07-12 devnull };
402 28b49df3 2006-07-18 devnull
403 28b49df3 2006-07-18 devnull static int
404 27d28098 2007-04-21 devnull xset(HConnect *c)
405 28b49df3 2006-07-18 devnull {
406 27d28098 2007-04-21 devnull int i, old;
407 27d28098 2007-04-21 devnull char *name, *value;
408 a0d146ed 2005-07-12 devnull
409 27d28098 2007-04-21 devnull if(hsettext(c) < 0)
410 27d28098 2007-04-21 devnull return -1;
411 28b49df3 2006-07-18 devnull
412 27d28098 2007-04-21 devnull if((name = hargstr(c, "name", nil)) == nil || name[0] == 0){
413 28b49df3 2006-07-18 devnull for(i=0; namedints[i].name; i++)
414 28b49df3 2006-07-18 devnull hprint(&c->hout, "%s = %d\n", namedints[i].name, *namedints[i].p);
415 28b49df3 2006-07-18 devnull hflush(&c->hout);
416 28b49df3 2006-07-18 devnull return 0;
417 28b49df3 2006-07-18 devnull }
418 27d28098 2007-04-21 devnull
419 27d28098 2007-04-21 devnull for(i=0; namedints[i].name; i++)
420 27d28098 2007-04-21 devnull if(strcmp(name, namedints[i].name) == 0)
421 27d28098 2007-04-21 devnull break;
422 27d28098 2007-04-21 devnull if(!namedints[i].name){
423 27d28098 2007-04-21 devnull hprint(&c->hout, "%s not found\n", name);
424 27d28098 2007-04-21 devnull hflush(&c->hout);
425 27d28098 2007-04-21 devnull return 0;
426 a0d146ed 2005-07-12 devnull }
427 27d28098 2007-04-21 devnull
428 27d28098 2007-04-21 devnull if((value = hargstr(c, "value", nil)) == nil || value[0] == 0){
429 27d28098 2007-04-21 devnull hprint(&c->hout, "%s = %d\n", namedints[i].name, *namedints[i].p);
430 27d28098 2007-04-21 devnull hflush(&c->hout);
431 27d28098 2007-04-21 devnull return 0;
432 27d28098 2007-04-21 devnull }
433 fa325e9b 2020-01-10 cross
434 27d28098 2007-04-21 devnull old = *namedints[i].p;
435 27d28098 2007-04-21 devnull *namedints[i].p = atoll(value);
436 27d28098 2007-04-21 devnull hprint(&c->hout, "%s = %d (was %d)\n", name, *namedints[i].p, old);
437 27d28098 2007-04-21 devnull hflush(&c->hout);
438 27d28098 2007-04-21 devnull return 0;
439 a0d146ed 2005-07-12 devnull }
440 a0d146ed 2005-07-12 devnull
441 a0d146ed 2005-07-12 devnull static int
442 a0d146ed 2005-07-12 devnull estats(HConnect *c)
443 a0d146ed 2005-07-12 devnull {
444 a0d146ed 2005-07-12 devnull Hio *hout;
445 a0d146ed 2005-07-12 devnull int r;
446 a0d146ed 2005-07-12 devnull
447 27d28098 2007-04-21 devnull r = hsettext(c);
448 a0d146ed 2005-07-12 devnull if(r < 0)
449 a0d146ed 2005-07-12 devnull return r;
450 a0d146ed 2005-07-12 devnull
451 a0d146ed 2005-07-12 devnull
452 a0d146ed 2005-07-12 devnull hout = &c->hout;
453 a0d146ed 2005-07-12 devnull /*
454 a0d146ed 2005-07-12 devnull hprint(hout, "lump writes=%,ld\n", stats.lumpwrites);
455 a0d146ed 2005-07-12 devnull hprint(hout, "lump reads=%,ld\n", stats.lumpreads);
456 a0d146ed 2005-07-12 devnull hprint(hout, "lump cache read hits=%,ld\n", stats.lumphit);
457 a0d146ed 2005-07-12 devnull hprint(hout, "lump cache read misses=%,ld\n", stats.lumpmiss);
458 a0d146ed 2005-07-12 devnull
459 a0d146ed 2005-07-12 devnull hprint(hout, "clump disk writes=%,ld\n", stats.clumpwrites);
460 a0d146ed 2005-07-12 devnull hprint(hout, "clump disk bytes written=%,lld\n", stats.clumpbwrites);
461 a0d146ed 2005-07-12 devnull hprint(hout, "clump disk bytes compressed=%,lld\n", stats.clumpbcomp);
462 a0d146ed 2005-07-12 devnull hprint(hout, "clump disk reads=%,ld\n", stats.clumpreads);
463 a0d146ed 2005-07-12 devnull hprint(hout, "clump disk bytes read=%,lld\n", stats.clumpbreads);
464 a0d146ed 2005-07-12 devnull hprint(hout, "clump disk bytes uncompressed=%,lld\n", stats.clumpbuncomp);
465 a0d146ed 2005-07-12 devnull
466 a0d146ed 2005-07-12 devnull hprint(hout, "clump directory disk writes=%,ld\n", stats.ciwrites);
467 a0d146ed 2005-07-12 devnull hprint(hout, "clump directory disk reads=%,ld\n", stats.cireads);
468 a0d146ed 2005-07-12 devnull
469 a0d146ed 2005-07-12 devnull hprint(hout, "index disk writes=%,ld\n", stats.indexwrites);
470 a0d146ed 2005-07-12 devnull hprint(hout, "index disk reads=%,ld\n", stats.indexreads);
471 a0d146ed 2005-07-12 devnull hprint(hout, "index disk bloom filter hits=%,ld %d%% falsemisses=%,ld %d%%\n",
472 a0d146ed 2005-07-12 devnull stats.indexbloomhits,
473 a0d146ed 2005-07-12 devnull percent(stats.indexbloomhits, stats.indexreads),
474 a0d146ed 2005-07-12 devnull stats.indexbloomfalsemisses,
475 a0d146ed 2005-07-12 devnull percent(stats.indexbloomfalsemisses, stats.indexreads));
476 a0d146ed 2005-07-12 devnull hprint(hout, "bloom filter bits=%,ld of %,ld %d%%\n",
477 a0d146ed 2005-07-12 devnull stats.bloomones, stats.bloombits, percent(stats.bloomones, stats.bloombits));
478 a0d146ed 2005-07-12 devnull hprint(hout, "index disk reads for modify=%,ld\n", stats.indexwreads);
479 a0d146ed 2005-07-12 devnull hprint(hout, "index disk reads for allocation=%,ld\n", stats.indexareads);
480 a0d146ed 2005-07-12 devnull hprint(hout, "index block splits=%,ld\n", stats.indexsplits);
481 a0d146ed 2005-07-12 devnull
482 a0d146ed 2005-07-12 devnull hprint(hout, "index cache lookups=%,ld\n", stats.iclookups);
483 a0d146ed 2005-07-12 devnull hprint(hout, "index cache hits=%,ld %d%%\n", stats.ichits,
484 a0d146ed 2005-07-12 devnull percent(stats.ichits, stats.iclookups));
485 a0d146ed 2005-07-12 devnull hprint(hout, "index cache fills=%,ld %d%%\n", stats.icfills,
486 a0d146ed 2005-07-12 devnull percent(stats.icfills, stats.iclookups));
487 a0d146ed 2005-07-12 devnull hprint(hout, "index cache inserts=%,ld\n", stats.icinserts);
488 a0d146ed 2005-07-12 devnull
489 a0d146ed 2005-07-12 devnull hprint(hout, "disk cache hits=%,ld\n", stats.pchit);
490 a0d146ed 2005-07-12 devnull hprint(hout, "disk cache misses=%,ld\n", stats.pcmiss);
491 a0d146ed 2005-07-12 devnull hprint(hout, "disk cache reads=%,ld\n", stats.pcreads);
492 a0d146ed 2005-07-12 devnull hprint(hout, "disk cache bytes read=%,lld\n", stats.pcbreads);
493 a0d146ed 2005-07-12 devnull
494 a0d146ed 2005-07-12 devnull hprint(hout, "disk cache writes=%,ld\n", stats.dirtydblocks);
495 a0d146ed 2005-07-12 devnull hprint(hout, "disk cache writes absorbed=%,ld %d%%\n", stats.absorbedwrites,
496 a0d146ed 2005-07-12 devnull percent(stats.absorbedwrites, stats.dirtydblocks));
497 a0d146ed 2005-07-12 devnull
498 a0d146ed 2005-07-12 devnull hprint(hout, "disk cache flushes=%,ld\n", stats.dcacheflushes);
499 fa325e9b 2020-01-10 cross hprint(hout, "disk cache flush writes=%,ld (%,ld per flush)\n",
500 a0d146ed 2005-07-12 devnull stats.dcacheflushwrites,
501 a0d146ed 2005-07-12 devnull stats.dcacheflushwrites/(stats.dcacheflushes ? stats.dcacheflushes : 1));
502 a0d146ed 2005-07-12 devnull
503 a0d146ed 2005-07-12 devnull hprint(hout, "disk writes=%,ld\n", stats.diskwrites);
504 a0d146ed 2005-07-12 devnull hprint(hout, "disk bytes written=%,lld\n", stats.diskbwrites);
505 a0d146ed 2005-07-12 devnull hprint(hout, "disk reads=%,ld\n", stats.diskreads);
506 a0d146ed 2005-07-12 devnull hprint(hout, "disk bytes read=%,lld\n", stats.diskbreads);
507 a0d146ed 2005-07-12 devnull */
508 a0d146ed 2005-07-12 devnull
509 a0d146ed 2005-07-12 devnull hflush(hout);
510 a0d146ed 2005-07-12 devnull return 0;
511 a0d146ed 2005-07-12 devnull }
512 a0d146ed 2005-07-12 devnull
513 a0d146ed 2005-07-12 devnull static int
514 a0d146ed 2005-07-12 devnull sindex(HConnect *c)
515 a0d146ed 2005-07-12 devnull {
516 a0d146ed 2005-07-12 devnull Hio *hout;
517 a0d146ed 2005-07-12 devnull Index *ix;
518 a0d146ed 2005-07-12 devnull Arena *arena;
519 a0d146ed 2005-07-12 devnull vlong clumps, cclumps, uncsize, used, size;
520 a0d146ed 2005-07-12 devnull int i, r, active;
521 a0d146ed 2005-07-12 devnull
522 27d28098 2007-04-21 devnull r = hsettext(c);
523 a0d146ed 2005-07-12 devnull if(r < 0)
524 a0d146ed 2005-07-12 devnull return r;
525 a0d146ed 2005-07-12 devnull hout = &c->hout;
526 a0d146ed 2005-07-12 devnull
527 a0d146ed 2005-07-12 devnull ix = mainindex;
528 a0d146ed 2005-07-12 devnull
529 a0d146ed 2005-07-12 devnull hprint(hout, "index=%s\n", ix->name);
530 a0d146ed 2005-07-12 devnull
531 a0d146ed 2005-07-12 devnull active = 0;
532 a0d146ed 2005-07-12 devnull clumps = 0;
533 a0d146ed 2005-07-12 devnull cclumps = 0;
534 a0d146ed 2005-07-12 devnull uncsize = 0;
535 a0d146ed 2005-07-12 devnull used = 0;
536 a0d146ed 2005-07-12 devnull size = 0;
537 a0d146ed 2005-07-12 devnull for(i = 0; i < ix->narenas; i++){
538 a0d146ed 2005-07-12 devnull arena = ix->arenas[i];
539 a0d146ed 2005-07-12 devnull if(arena != nil && arena->memstats.clumps != 0){
540 a0d146ed 2005-07-12 devnull active++;
541 a0d146ed 2005-07-12 devnull clumps += arena->memstats.clumps;
542 a0d146ed 2005-07-12 devnull cclumps += arena->memstats.cclumps;
543 a0d146ed 2005-07-12 devnull uncsize += arena->memstats.uncsize;
544 a0d146ed 2005-07-12 devnull used += arena->memstats.used;
545 a0d146ed 2005-07-12 devnull }
546 a0d146ed 2005-07-12 devnull size += arena->size;
547 a0d146ed 2005-07-12 devnull }
548 a0d146ed 2005-07-12 devnull hprint(hout, "total arenas=%,d active=%,d\n", ix->narenas, active);
549 a0d146ed 2005-07-12 devnull hprint(hout, "total space=%,lld used=%,lld\n", size, used + clumps * ClumpInfoSize);
550 a0d146ed 2005-07-12 devnull hprint(hout, "clumps=%,lld compressed clumps=%,lld data=%,lld compressed data=%,lld\n",
551 a0d146ed 2005-07-12 devnull clumps, cclumps, uncsize, used - clumps * ClumpSize);
552 a0d146ed 2005-07-12 devnull hflush(hout);
553 a0d146ed 2005-07-12 devnull return 0;
554 a0d146ed 2005-07-12 devnull }
555 a0d146ed 2005-07-12 devnull
556 a0d146ed 2005-07-12 devnull static void
557 a0d146ed 2005-07-12 devnull darena(Hio *hout, Arena *arena)
558 a0d146ed 2005-07-12 devnull {
559 a0d146ed 2005-07-12 devnull hprint(hout, "arena='%s' on %s at [%lld,%lld)\n\tversion=%d created=%d modified=%d",
560 a0d146ed 2005-07-12 devnull arena->name, arena->part->name, arena->base, arena->base + arena->size + 2 * arena->blocksize,
561 a0d146ed 2005-07-12 devnull arena->version, arena->ctime, arena->wtime);
562 a0d146ed 2005-07-12 devnull if(arena->memstats.sealed)
563 a0d146ed 2005-07-12 devnull hprint(hout, " mem=sealed");
564 a0d146ed 2005-07-12 devnull if(arena->diskstats.sealed)
565 a0d146ed 2005-07-12 devnull hprint(hout, " disk=sealed");
566 030fb939 2008-07-04 rsc if(arena->inqueue)
567 030fb939 2008-07-04 rsc hprint(hout, " inqueue");
568 a0d146ed 2005-07-12 devnull hprint(hout, "\n");
569 a0d146ed 2005-07-12 devnull if(scorecmp(zeroscore, arena->score) != 0)
570 a0d146ed 2005-07-12 devnull hprint(hout, "\tscore=%V\n", arena->score);
571 a0d146ed 2005-07-12 devnull
572 45ac814c 2007-10-29 rsc hprint(hout, "\twritten: clumps=%d compressed clumps=%d data=%,lld compressed data=%,lld storage=%,lld\n",
573 a0d146ed 2005-07-12 devnull arena->memstats.clumps, arena->memstats.cclumps, arena->memstats.uncsize,
574 a0d146ed 2005-07-12 devnull arena->memstats.used - arena->memstats.clumps * ClumpSize,
575 a0d146ed 2005-07-12 devnull arena->memstats.used + arena->memstats.clumps * ClumpInfoSize);
576 45ac814c 2007-10-29 rsc hprint(hout, "\tindexed: clumps=%d compressed clumps=%d data=%,lld compressed data=%,lld storage=%,lld\n",
577 a0d146ed 2005-07-12 devnull arena->diskstats.clumps, arena->diskstats.cclumps, arena->diskstats.uncsize,
578 a0d146ed 2005-07-12 devnull arena->diskstats.used - arena->diskstats.clumps * ClumpSize,
579 a0d146ed 2005-07-12 devnull arena->diskstats.used + arena->diskstats.clumps * ClumpInfoSize);
580 a0d146ed 2005-07-12 devnull }
581 a0d146ed 2005-07-12 devnull
582 a0d146ed 2005-07-12 devnull static int
583 28b49df3 2006-07-18 devnull hempty(HConnect *c)
584 28b49df3 2006-07-18 devnull {
585 28b49df3 2006-07-18 devnull Hio *hout;
586 28b49df3 2006-07-18 devnull int r;
587 28b49df3 2006-07-18 devnull
588 27d28098 2007-04-21 devnull r = hsettext(c);
589 28b49df3 2006-07-18 devnull if(r < 0)
590 28b49df3 2006-07-18 devnull return r;
591 28b49df3 2006-07-18 devnull hout = &c->hout;
592 28b49df3 2006-07-18 devnull
593 28b49df3 2006-07-18 devnull emptylumpcache();
594 28b49df3 2006-07-18 devnull emptydcache();
595 28b49df3 2006-07-18 devnull emptyicache();
596 28b49df3 2006-07-18 devnull hprint(hout, "emptied all caches\n");
597 28b49df3 2006-07-18 devnull hflush(hout);
598 28b49df3 2006-07-18 devnull return 0;
599 28b49df3 2006-07-18 devnull }
600 28b49df3 2006-07-18 devnull
601 28b49df3 2006-07-18 devnull static int
602 28b49df3 2006-07-18 devnull hlcacheempty(HConnect *c)
603 28b49df3 2006-07-18 devnull {
604 28b49df3 2006-07-18 devnull Hio *hout;
605 28b49df3 2006-07-18 devnull int r;
606 28b49df3 2006-07-18 devnull
607 27d28098 2007-04-21 devnull r = hsettext(c);
608 28b49df3 2006-07-18 devnull if(r < 0)
609 28b49df3 2006-07-18 devnull return r;
610 28b49df3 2006-07-18 devnull hout = &c->hout;
611 28b49df3 2006-07-18 devnull
612 28b49df3 2006-07-18 devnull emptylumpcache();
613 28b49df3 2006-07-18 devnull hprint(hout, "emptied lumpcache\n");
614 28b49df3 2006-07-18 devnull hflush(hout);
615 28b49df3 2006-07-18 devnull return 0;
616 28b49df3 2006-07-18 devnull }
617 28b49df3 2006-07-18 devnull
618 28b49df3 2006-07-18 devnull static int
619 28b49df3 2006-07-18 devnull hicacheempty(HConnect *c)
620 28b49df3 2006-07-18 devnull {
621 28b49df3 2006-07-18 devnull Hio *hout;
622 28b49df3 2006-07-18 devnull int r;
623 28b49df3 2006-07-18 devnull
624 27d28098 2007-04-21 devnull r = hsettext(c);
625 28b49df3 2006-07-18 devnull if(r < 0)
626 28b49df3 2006-07-18 devnull return r;
627 28b49df3 2006-07-18 devnull hout = &c->hout;
628 28b49df3 2006-07-18 devnull
629 28b49df3 2006-07-18 devnull emptyicache();
630 28b49df3 2006-07-18 devnull hprint(hout, "emptied icache\n");
631 28b49df3 2006-07-18 devnull hflush(hout);
632 28b49df3 2006-07-18 devnull return 0;
633 28b49df3 2006-07-18 devnull }
634 28b49df3 2006-07-18 devnull
635 28b49df3 2006-07-18 devnull static int
636 28b49df3 2006-07-18 devnull hdcacheempty(HConnect *c)
637 28b49df3 2006-07-18 devnull {
638 28b49df3 2006-07-18 devnull Hio *hout;
639 28b49df3 2006-07-18 devnull int r;
640 28b49df3 2006-07-18 devnull
641 27d28098 2007-04-21 devnull r = hsettext(c);
642 28b49df3 2006-07-18 devnull if(r < 0)
643 28b49df3 2006-07-18 devnull return r;
644 28b49df3 2006-07-18 devnull hout = &c->hout;
645 28b49df3 2006-07-18 devnull
646 28b49df3 2006-07-18 devnull emptydcache();
647 28b49df3 2006-07-18 devnull hprint(hout, "emptied dcache\n");
648 28b49df3 2006-07-18 devnull hflush(hout);
649 28b49df3 2006-07-18 devnull return 0;
650 28b49df3 2006-07-18 devnull }
651 28b49df3 2006-07-18 devnull static int
652 28b49df3 2006-07-18 devnull hicachekick(HConnect *c)
653 28b49df3 2006-07-18 devnull {
654 28b49df3 2006-07-18 devnull Hio *hout;
655 28b49df3 2006-07-18 devnull int r;
656 28b49df3 2006-07-18 devnull
657 27d28098 2007-04-21 devnull r = hsettext(c);
658 28b49df3 2006-07-18 devnull if(r < 0)
659 28b49df3 2006-07-18 devnull return r;
660 28b49df3 2006-07-18 devnull hout = &c->hout;
661 28b49df3 2006-07-18 devnull
662 28b49df3 2006-07-18 devnull kickicache();
663 28b49df3 2006-07-18 devnull hprint(hout, "kicked icache\n");
664 28b49df3 2006-07-18 devnull hflush(hout);
665 28b49df3 2006-07-18 devnull return 0;
666 28b49df3 2006-07-18 devnull }
667 28b49df3 2006-07-18 devnull
668 28b49df3 2006-07-18 devnull static int
669 28b49df3 2006-07-18 devnull hdcachekick(HConnect *c)
670 28b49df3 2006-07-18 devnull {
671 28b49df3 2006-07-18 devnull Hio *hout;
672 28b49df3 2006-07-18 devnull int r;
673 28b49df3 2006-07-18 devnull
674 27d28098 2007-04-21 devnull r = hsettext(c);
675 28b49df3 2006-07-18 devnull if(r < 0)
676 28b49df3 2006-07-18 devnull return r;
677 28b49df3 2006-07-18 devnull hout = &c->hout;
678 28b49df3 2006-07-18 devnull
679 28b49df3 2006-07-18 devnull kickdcache();
680 28b49df3 2006-07-18 devnull hprint(hout, "kicked dcache\n");
681 28b49df3 2006-07-18 devnull hflush(hout);
682 28b49df3 2006-07-18 devnull return 0;
683 28b49df3 2006-07-18 devnull }
684 28b49df3 2006-07-18 devnull static int
685 a0d146ed 2005-07-12 devnull hicacheflush(HConnect *c)
686 a0d146ed 2005-07-12 devnull {
687 a0d146ed 2005-07-12 devnull Hio *hout;
688 a0d146ed 2005-07-12 devnull int r;
689 a0d146ed 2005-07-12 devnull
690 27d28098 2007-04-21 devnull r = hsettext(c);
691 a0d146ed 2005-07-12 devnull if(r < 0)
692 a0d146ed 2005-07-12 devnull return r;
693 a0d146ed 2005-07-12 devnull hout = &c->hout;
694 a0d146ed 2005-07-12 devnull
695 a0d146ed 2005-07-12 devnull flushicache();
696 a0d146ed 2005-07-12 devnull hprint(hout, "flushed icache\n");
697 a0d146ed 2005-07-12 devnull hflush(hout);
698 a0d146ed 2005-07-12 devnull return 0;
699 a0d146ed 2005-07-12 devnull }
700 a0d146ed 2005-07-12 devnull
701 a0d146ed 2005-07-12 devnull static int
702 a0d146ed 2005-07-12 devnull hdcacheflush(HConnect *c)
703 a0d146ed 2005-07-12 devnull {
704 a0d146ed 2005-07-12 devnull Hio *hout;
705 a0d146ed 2005-07-12 devnull int r;
706 a0d146ed 2005-07-12 devnull
707 27d28098 2007-04-21 devnull r = hsettext(c);
708 a0d146ed 2005-07-12 devnull if(r < 0)
709 a0d146ed 2005-07-12 devnull return r;
710 a0d146ed 2005-07-12 devnull hout = &c->hout;
711 a0d146ed 2005-07-12 devnull
712 a0d146ed 2005-07-12 devnull flushdcache();
713 a0d146ed 2005-07-12 devnull hprint(hout, "flushed dcache\n");
714 a0d146ed 2005-07-12 devnull hflush(hout);
715 a0d146ed 2005-07-12 devnull return 0;
716 a0d146ed 2005-07-12 devnull }
717 a0d146ed 2005-07-12 devnull
718 a0d146ed 2005-07-12 devnull static int
719 a0d146ed 2005-07-12 devnull dindex(HConnect *c)
720 a0d146ed 2005-07-12 devnull {
721 a0d146ed 2005-07-12 devnull Hio *hout;
722 a0d146ed 2005-07-12 devnull Index *ix;
723 a0d146ed 2005-07-12 devnull int i, r;
724 a0d146ed 2005-07-12 devnull
725 27d28098 2007-04-21 devnull r = hsettext(c);
726 a0d146ed 2005-07-12 devnull if(r < 0)
727 a0d146ed 2005-07-12 devnull return r;
728 a0d146ed 2005-07-12 devnull hout = &c->hout;
729 a0d146ed 2005-07-12 devnull
730 a0d146ed 2005-07-12 devnull
731 a0d146ed 2005-07-12 devnull ix = mainindex;
732 a0d146ed 2005-07-12 devnull hprint(hout, "index=%s version=%d blocksize=%d tabsize=%d\n",
733 a0d146ed 2005-07-12 devnull ix->name, ix->version, ix->blocksize, ix->tabsize);
734 a0d146ed 2005-07-12 devnull hprint(hout, "\tbuckets=%d div=%d\n", ix->buckets, ix->div);
735 a0d146ed 2005-07-12 devnull for(i = 0; i < ix->nsects; i++)
736 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);
737 a0d146ed 2005-07-12 devnull for(i = 0; i < ix->narenas; i++){
738 a0d146ed 2005-07-12 devnull if(ix->arenas[i] != nil && ix->arenas[i]->memstats.clumps != 0){
739 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);
740 a0d146ed 2005-07-12 devnull darena(hout, ix->arenas[i]);
741 a0d146ed 2005-07-12 devnull }
742 a0d146ed 2005-07-12 devnull }
743 a0d146ed 2005-07-12 devnull hflush(hout);
744 a0d146ed 2005-07-12 devnull return 0;
745 a0d146ed 2005-07-12 devnull }
746 a0d146ed 2005-07-12 devnull
747 a0d146ed 2005-07-12 devnull typedef struct Arg Arg;
748 a0d146ed 2005-07-12 devnull struct Arg
749 a0d146ed 2005-07-12 devnull {
750 a0d146ed 2005-07-12 devnull int index;
751 a0d146ed 2005-07-12 devnull int index2;
752 a0d146ed 2005-07-12 devnull };
753 a0d146ed 2005-07-12 devnull
754 a0d146ed 2005-07-12 devnull static long
755 a0d146ed 2005-07-12 devnull rawgraph(Stats *s, Stats *t, void *va)
756 a0d146ed 2005-07-12 devnull {
757 a0d146ed 2005-07-12 devnull Arg *a;
758 a0d146ed 2005-07-12 devnull
759 28b49df3 2006-07-18 devnull USED(s);
760 a0d146ed 2005-07-12 devnull a = va;
761 a0d146ed 2005-07-12 devnull return t->n[a->index];
762 a0d146ed 2005-07-12 devnull }
763 a0d146ed 2005-07-12 devnull
764 a0d146ed 2005-07-12 devnull static long
765 a0d146ed 2005-07-12 devnull diffgraph(Stats *s, Stats *t, void *va)
766 a0d146ed 2005-07-12 devnull {
767 a0d146ed 2005-07-12 devnull Arg *a;
768 a0d146ed 2005-07-12 devnull
769 a0d146ed 2005-07-12 devnull a = va;
770 a0d146ed 2005-07-12 devnull return t->n[a->index] - s->n[a->index];
771 a0d146ed 2005-07-12 devnull }
772 a0d146ed 2005-07-12 devnull
773 a0d146ed 2005-07-12 devnull static long
774 a0d146ed 2005-07-12 devnull pctgraph(Stats *s, Stats *t, void *va)
775 a0d146ed 2005-07-12 devnull {
776 a0d146ed 2005-07-12 devnull Arg *a;
777 a0d146ed 2005-07-12 devnull
778 28b49df3 2006-07-18 devnull USED(s);
779 a0d146ed 2005-07-12 devnull a = va;
780 a0d146ed 2005-07-12 devnull return percent(t->n[a->index], t->n[a->index2]);
781 a0d146ed 2005-07-12 devnull }
782 a0d146ed 2005-07-12 devnull
783 a0d146ed 2005-07-12 devnull static long
784 a0d146ed 2005-07-12 devnull pctdiffgraph(Stats *s, Stats *t, void *va)
785 a0d146ed 2005-07-12 devnull {
786 a0d146ed 2005-07-12 devnull Arg *a;
787 a0d146ed 2005-07-12 devnull
788 a0d146ed 2005-07-12 devnull a = va;
789 a0d146ed 2005-07-12 devnull return percent(t->n[a->index]-s->n[a->index], t->n[a->index2]-s->n[a->index2]);
790 a0d146ed 2005-07-12 devnull }
791 a0d146ed 2005-07-12 devnull
792 a0d146ed 2005-07-12 devnull static long
793 6932098c 2007-04-21 devnull xdiv(long a, long b)
794 27d28098 2007-04-21 devnull {
795 27d28098 2007-04-21 devnull if(b == 0)
796 27d28098 2007-04-21 devnull b++;
797 27d28098 2007-04-21 devnull return a/b;
798 27d28098 2007-04-21 devnull }
799 27d28098 2007-04-21 devnull
800 27d28098 2007-04-21 devnull static long
801 27d28098 2007-04-21 devnull divdiffgraph(Stats *s, Stats *t, void *va)
802 27d28098 2007-04-21 devnull {
803 27d28098 2007-04-21 devnull Arg *a;
804 27d28098 2007-04-21 devnull
805 27d28098 2007-04-21 devnull a = va;
806 6932098c 2007-04-21 devnull return xdiv(t->n[a->index] - s->n[a->index], t->n[a->index2] - s->n[a->index2]);
807 27d28098 2007-04-21 devnull }
808 27d28098 2007-04-21 devnull
809 27d28098 2007-04-21 devnull static long
810 a0d146ed 2005-07-12 devnull netbw(Stats *s)
811 a0d146ed 2005-07-12 devnull {
812 a0d146ed 2005-07-12 devnull ulong *n;
813 a0d146ed 2005-07-12 devnull
814 a0d146ed 2005-07-12 devnull n = s->n;
815 a0d146ed 2005-07-12 devnull return n[StatRpcReadBytes]+n[StatRpcWriteBytes]; /* not exactly right */
816 a0d146ed 2005-07-12 devnull }
817 a0d146ed 2005-07-12 devnull
818 a0d146ed 2005-07-12 devnull static long
819 a0d146ed 2005-07-12 devnull diskbw(Stats *s)
820 a0d146ed 2005-07-12 devnull {
821 a0d146ed 2005-07-12 devnull ulong *n;
822 a0d146ed 2005-07-12 devnull
823 a0d146ed 2005-07-12 devnull n = s->n;
824 fa325e9b 2020-01-10 cross return n[StatApartReadBytes]+n[StatApartWriteBytes]
825 a0d146ed 2005-07-12 devnull + n[StatIsectReadBytes]+n[StatIsectWriteBytes]
826 a0d146ed 2005-07-12 devnull + n[StatSumReadBytes];
827 a0d146ed 2005-07-12 devnull }
828 a0d146ed 2005-07-12 devnull
829 a0d146ed 2005-07-12 devnull static long
830 a0d146ed 2005-07-12 devnull iobw(Stats *s)
831 a0d146ed 2005-07-12 devnull {
832 a0d146ed 2005-07-12 devnull return netbw(s)+diskbw(s);
833 a0d146ed 2005-07-12 devnull }
834 a0d146ed 2005-07-12 devnull
835 a0d146ed 2005-07-12 devnull static long
836 a0d146ed 2005-07-12 devnull diskgraph(Stats *s, Stats *t, void *va)
837 a0d146ed 2005-07-12 devnull {
838 a0d146ed 2005-07-12 devnull USED(va);
839 a0d146ed 2005-07-12 devnull return diskbw(t)-diskbw(s);
840 a0d146ed 2005-07-12 devnull }
841 a0d146ed 2005-07-12 devnull
842 a0d146ed 2005-07-12 devnull static long
843 a0d146ed 2005-07-12 devnull netgraph(Stats *s, Stats *t, void *va)
844 a0d146ed 2005-07-12 devnull {
845 a0d146ed 2005-07-12 devnull USED(va);
846 a0d146ed 2005-07-12 devnull return netbw(t)-netbw(s);
847 a0d146ed 2005-07-12 devnull }
848 a0d146ed 2005-07-12 devnull
849 a0d146ed 2005-07-12 devnull static long
850 a0d146ed 2005-07-12 devnull iograph(Stats *s, Stats *t, void *va)
851 a0d146ed 2005-07-12 devnull {
852 a0d146ed 2005-07-12 devnull USED(va);
853 a0d146ed 2005-07-12 devnull return iobw(t)-iobw(s);
854 a0d146ed 2005-07-12 devnull }
855 a0d146ed 2005-07-12 devnull
856 a0d146ed 2005-07-12 devnull
857 a0d146ed 2005-07-12 devnull static char* graphname[] =
858 a0d146ed 2005-07-12 devnull {
859 a0d146ed 2005-07-12 devnull "rpctotal",
860 a0d146ed 2005-07-12 devnull "rpcread",
861 a0d146ed 2005-07-12 devnull "rpcreadok",
862 a0d146ed 2005-07-12 devnull "rpcreadfail",
863 a0d146ed 2005-07-12 devnull "rpcreadbyte",
864 a0d146ed 2005-07-12 devnull "rpcreadtime",
865 a0d146ed 2005-07-12 devnull "rpcreadcached",
866 a0d146ed 2005-07-12 devnull "rpcreadcachedtime",
867 a0d146ed 2005-07-12 devnull "rpcreaduncached",
868 a0d146ed 2005-07-12 devnull "rpcreaduncachedtime",
869 a0d146ed 2005-07-12 devnull "rpcwrite",
870 a0d146ed 2005-07-12 devnull "rpcwritenew",
871 a0d146ed 2005-07-12 devnull "rpcwriteold",
872 a0d146ed 2005-07-12 devnull "rpcwritefail",
873 a0d146ed 2005-07-12 devnull "rpcwritebyte",
874 a0d146ed 2005-07-12 devnull "rpcwritetime",
875 a0d146ed 2005-07-12 devnull "rpcwritenewtime",
876 a0d146ed 2005-07-12 devnull "rpcwriteoldtime",
877 a0d146ed 2005-07-12 devnull
878 a0d146ed 2005-07-12 devnull "lcachehit",
879 a0d146ed 2005-07-12 devnull "lcachemiss",
880 a0d146ed 2005-07-12 devnull "lcachelookup",
881 a0d146ed 2005-07-12 devnull "lcachewrite",
882 a0d146ed 2005-07-12 devnull "lcachesize",
883 a0d146ed 2005-07-12 devnull "lcachestall",
884 a0d146ed 2005-07-12 devnull "lcachelookuptime",
885 fa325e9b 2020-01-10 cross
886 a0d146ed 2005-07-12 devnull "dcachehit",
887 a0d146ed 2005-07-12 devnull "dcachemiss",
888 a0d146ed 2005-07-12 devnull "dcachelookup",
889 a0d146ed 2005-07-12 devnull "dcacheread",
890 a0d146ed 2005-07-12 devnull "dcachewrite",
891 a0d146ed 2005-07-12 devnull "dcachedirty",
892 a0d146ed 2005-07-12 devnull "dcachesize",
893 a0d146ed 2005-07-12 devnull "dcacheflush",
894 a0d146ed 2005-07-12 devnull "dcachestall",
895 a0d146ed 2005-07-12 devnull "dcachelookuptime",
896 a0d146ed 2005-07-12 devnull
897 a0d146ed 2005-07-12 devnull "dblockstall",
898 a0d146ed 2005-07-12 devnull "lumpstall",
899 a0d146ed 2005-07-12 devnull
900 a0d146ed 2005-07-12 devnull "icachehit",
901 a0d146ed 2005-07-12 devnull "icachemiss",
902 7a400ee9 2007-09-25 rsc "icacheread",
903 a0d146ed 2005-07-12 devnull "icachewrite",
904 a0d146ed 2005-07-12 devnull "icachefill",
905 a0d146ed 2005-07-12 devnull "icacheprefetch",
906 a0d146ed 2005-07-12 devnull "icachedirty",
907 a0d146ed 2005-07-12 devnull "icachesize",
908 a0d146ed 2005-07-12 devnull "icacheflush",
909 a0d146ed 2005-07-12 devnull "icachestall",
910 a0d146ed 2005-07-12 devnull "icachelookuptime",
911 7a400ee9 2007-09-25 rsc "icachelookup",
912 7a400ee9 2007-09-25 rsc "scachehit",
913 7a400ee9 2007-09-25 rsc "scacheprefetch",
914 a0d146ed 2005-07-12 devnull
915 a0d146ed 2005-07-12 devnull "bloomhit",
916 a0d146ed 2005-07-12 devnull "bloommiss",
917 a0d146ed 2005-07-12 devnull "bloomfalsemiss",
918 a0d146ed 2005-07-12 devnull "bloomlookup",
919 a0d146ed 2005-07-12 devnull "bloomones",
920 a0d146ed 2005-07-12 devnull "bloombits",
921 a0d146ed 2005-07-12 devnull
922 a0d146ed 2005-07-12 devnull "apartread",
923 a0d146ed 2005-07-12 devnull "apartreadbyte",
924 a0d146ed 2005-07-12 devnull "apartwrite",
925 a0d146ed 2005-07-12 devnull "apartwritebyte",
926 a0d146ed 2005-07-12 devnull
927 a0d146ed 2005-07-12 devnull "isectread",
928 a0d146ed 2005-07-12 devnull "isectreadbyte",
929 a0d146ed 2005-07-12 devnull "isectwrite",
930 a0d146ed 2005-07-12 devnull "isectwritebyte",
931 a0d146ed 2005-07-12 devnull
932 a0d146ed 2005-07-12 devnull "sumread",
933 28b49df3 2006-07-18 devnull "sumreadbyte",
934 fa325e9b 2020-01-10 cross
935 7a400ee9 2007-09-25 rsc "cigload",
936 7a400ee9 2007-09-25 rsc "cigloadtime",
937 a0d146ed 2005-07-12 devnull };
938 a0d146ed 2005-07-12 devnull
939 a0d146ed 2005-07-12 devnull static int
940 a0d146ed 2005-07-12 devnull findname(char *s)
941 a0d146ed 2005-07-12 devnull {
942 a0d146ed 2005-07-12 devnull int i;
943 a0d146ed 2005-07-12 devnull
944 a0d146ed 2005-07-12 devnull for(i=0; i<nelem(graphname); i++)
945 a0d146ed 2005-07-12 devnull if(strcmp(graphname[i], s) == 0)
946 a0d146ed 2005-07-12 devnull return i;
947 a0d146ed 2005-07-12 devnull return -1;
948 a0d146ed 2005-07-12 devnull }
949 a0d146ed 2005-07-12 devnull
950 a0d146ed 2005-07-12 devnull static void
951 a0d146ed 2005-07-12 devnull dotextbin(Hio *io, Graph *g)
952 a0d146ed 2005-07-12 devnull {
953 a0d146ed 2005-07-12 devnull int i, nbin;
954 a0d146ed 2005-07-12 devnull Statbin *b, bin[2000]; /* 32 kB, but whack is worse */
955 a0d146ed 2005-07-12 devnull
956 a0d146ed 2005-07-12 devnull needstack(8192); /* double check that bin didn't kill us */
957 a0d146ed 2005-07-12 devnull nbin = 100;
958 a0d146ed 2005-07-12 devnull binstats(g->fn, g->arg, g->t0, g->t1, bin, nbin);
959 a0d146ed 2005-07-12 devnull
960 a0d146ed 2005-07-12 devnull hprint(io, "stats\n\n");
961 a0d146ed 2005-07-12 devnull for(i=0; i<nbin; i++){
962 a0d146ed 2005-07-12 devnull b = &bin[i];
963 a0d146ed 2005-07-12 devnull hprint(io, "%d: nsamp=%d min=%d max=%d avg=%d\n",
964 a0d146ed 2005-07-12 devnull i, b->nsamp, b->min, b->max, b->avg);
965 a0d146ed 2005-07-12 devnull }
966 a0d146ed 2005-07-12 devnull }
967 a0d146ed 2005-07-12 devnull
968 a0d146ed 2005-07-12 devnull static int
969 a0d146ed 2005-07-12 devnull xgraph(HConnect *c)
970 a0d146ed 2005-07-12 devnull {
971 27d28098 2007-04-21 devnull char *name;
972 a0d146ed 2005-07-12 devnull Hio *hout;
973 a0d146ed 2005-07-12 devnull Memimage *m;
974 27d28098 2007-04-21 devnull int dotext;
975 a0d146ed 2005-07-12 devnull Graph g;
976 a0d146ed 2005-07-12 devnull Arg arg;
977 27d28098 2007-04-21 devnull char *graph, *a;
978 a0d146ed 2005-07-12 devnull
979 27d28098 2007-04-21 devnull name = hargstr(c, "arg", "");
980 27d28098 2007-04-21 devnull if((arg.index = findname(name)) == -1 && strcmp(name, "*") != 0){
981 27d28098 2007-04-21 devnull werrstr("unknown name %s", name);
982 28b49df3 2006-07-18 devnull goto error;
983 28b49df3 2006-07-18 devnull }
984 27d28098 2007-04-21 devnull a = hargstr(c, "arg2", "");
985 27d28098 2007-04-21 devnull if(a[0] && (arg.index2 = findname(a)) == -1){
986 27d28098 2007-04-21 devnull werrstr("unknown name %s", a);
987 28b49df3 2006-07-18 devnull goto error;
988 28b49df3 2006-07-18 devnull }
989 27d28098 2007-04-21 devnull
990 a0d146ed 2005-07-12 devnull g.arg = &arg;
991 27d28098 2007-04-21 devnull g.t0 = hargint(c, "t0", -120);
992 27d28098 2007-04-21 devnull g.t1 = hargint(c, "t1", 0);
993 27d28098 2007-04-21 devnull g.min = hargint(c, "min", -1);
994 27d28098 2007-04-21 devnull g.max = hargint(c, "max", -1);
995 27d28098 2007-04-21 devnull g.wid = hargint(c, "wid", -1);
996 27d28098 2007-04-21 devnull g.ht = hargint(c, "ht", -1);
997 27d28098 2007-04-21 devnull dotext = hargstr(c, "text", "")[0] != 0;
998 27d28098 2007-04-21 devnull g.fill = hargint(c, "fill", -1);
999 fa325e9b 2020-01-10 cross
1000 27d28098 2007-04-21 devnull graph = hargstr(c, "graph", "raw");
1001 27d28098 2007-04-21 devnull if(strcmp(graph, "raw") == 0)
1002 27d28098 2007-04-21 devnull g.fn = rawgraph;
1003 27d28098 2007-04-21 devnull else if(strcmp(graph, "diskbw") == 0)
1004 27d28098 2007-04-21 devnull g.fn = diskgraph;
1005 27d28098 2007-04-21 devnull else if(strcmp(graph, "iobw") == 0)
1006 27d28098 2007-04-21 devnull g.fn = iograph;
1007 27d28098 2007-04-21 devnull else if(strcmp(graph, "netbw") == 0)
1008 27d28098 2007-04-21 devnull g.fn = netgraph;
1009 27d28098 2007-04-21 devnull else if(strcmp(graph, "diff") == 0)
1010 27d28098 2007-04-21 devnull g.fn = diffgraph;
1011 27d28098 2007-04-21 devnull else if(strcmp(graph, "pct") == 0)
1012 27d28098 2007-04-21 devnull g.fn = pctgraph;
1013 27d28098 2007-04-21 devnull else if(strcmp(graph, "pctdiff") == 0)
1014 27d28098 2007-04-21 devnull g.fn = pctdiffgraph;
1015 27d28098 2007-04-21 devnull else if(strcmp(graph, "divdiff") == 0)
1016 27d28098 2007-04-21 devnull g.fn = divdiffgraph;
1017 27d28098 2007-04-21 devnull else{
1018 27d28098 2007-04-21 devnull werrstr("unknown graph %s", graph);
1019 27d28098 2007-04-21 devnull goto error;
1020 a0d146ed 2005-07-12 devnull }
1021 27d28098 2007-04-21 devnull
1022 a0d146ed 2005-07-12 devnull if(dotext){
1023 27d28098 2007-04-21 devnull hsettype(c, "text/plain");
1024 a0d146ed 2005-07-12 devnull dotextbin(&c->hout, &g);
1025 a0d146ed 2005-07-12 devnull hflush(&c->hout);
1026 a0d146ed 2005-07-12 devnull return 0;
1027 a0d146ed 2005-07-12 devnull }
1028 a0d146ed 2005-07-12 devnull
1029 a0d146ed 2005-07-12 devnull m = statgraph(&g);
1030 a0d146ed 2005-07-12 devnull if(m == nil)
1031 28b49df3 2006-07-18 devnull goto error;
1032 a0d146ed 2005-07-12 devnull
1033 27d28098 2007-04-21 devnull if(hsettype(c, "image/png") < 0)
1034 a0d146ed 2005-07-12 devnull return -1;
1035 a0d146ed 2005-07-12 devnull hout = &c->hout;
1036 a0d146ed 2005-07-12 devnull writepng(hout, m);
1037 a0d146ed 2005-07-12 devnull qlock(&memdrawlock);
1038 a0d146ed 2005-07-12 devnull freememimage(m);
1039 a0d146ed 2005-07-12 devnull qunlock(&memdrawlock);
1040 a0d146ed 2005-07-12 devnull hflush(hout);
1041 a0d146ed 2005-07-12 devnull return 0;
1042 a0d146ed 2005-07-12 devnull
1043 28b49df3 2006-07-18 devnull error:
1044 28b49df3 2006-07-18 devnull return herror(c);
1045 a0d146ed 2005-07-12 devnull }
1046 a0d146ed 2005-07-12 devnull
1047 a0d146ed 2005-07-12 devnull static int
1048 a0d146ed 2005-07-12 devnull xloglist(HConnect *c)
1049 a0d146ed 2005-07-12 devnull {
1050 27d28098 2007-04-21 devnull if(hsettype(c, "text/html") < 0)
1051 a0d146ed 2005-07-12 devnull return -1;
1052 a0d146ed 2005-07-12 devnull vtloghlist(&c->hout);
1053 a0d146ed 2005-07-12 devnull hflush(&c->hout);
1054 a0d146ed 2005-07-12 devnull return 0;
1055 a0d146ed 2005-07-12 devnull }
1056 a0d146ed 2005-07-12 devnull
1057 a0d146ed 2005-07-12 devnull static int
1058 a0d146ed 2005-07-12 devnull xlog(HConnect *c)
1059 a0d146ed 2005-07-12 devnull {
1060 a0d146ed 2005-07-12 devnull char *name;
1061 a0d146ed 2005-07-12 devnull VtLog *l;
1062 a0d146ed 2005-07-12 devnull
1063 27d28098 2007-04-21 devnull name = hargstr(c, "log", "");
1064 27d28098 2007-04-21 devnull if(!name[0])
1065 a0d146ed 2005-07-12 devnull return xloglist(c);
1066 a0d146ed 2005-07-12 devnull l = vtlogopen(name, 0);
1067 a0d146ed 2005-07-12 devnull if(l == nil)
1068 27d28098 2007-04-21 devnull return hnotfound(c);
1069 27d28098 2007-04-21 devnull if(hsettype(c, "text/html") < 0){
1070 a0d146ed 2005-07-12 devnull vtlogclose(l);
1071 a0d146ed 2005-07-12 devnull return -1;
1072 a0d146ed 2005-07-12 devnull }
1073 a0d146ed 2005-07-12 devnull vtloghdump(&c->hout, l);
1074 a0d146ed 2005-07-12 devnull vtlogclose(l);
1075 a0d146ed 2005-07-12 devnull hflush(&c->hout);
1076 a0d146ed 2005-07-12 devnull return 0;
1077 a0d146ed 2005-07-12 devnull }
1078 a0d146ed 2005-07-12 devnull
1079 a0d146ed 2005-07-12 devnull static int
1080 a0d146ed 2005-07-12 devnull xindex(HConnect *c)
1081 a0d146ed 2005-07-12 devnull {
1082 27d28098 2007-04-21 devnull if(hsettype(c, "text/xml") < 0)
1083 a0d146ed 2005-07-12 devnull return -1;
1084 a0d146ed 2005-07-12 devnull xmlindex(&c->hout, mainindex, "index", 0);
1085 a0d146ed 2005-07-12 devnull hflush(&c->hout);
1086 a0d146ed 2005-07-12 devnull return 0;
1087 a0d146ed 2005-07-12 devnull }
1088 a0d146ed 2005-07-12 devnull
1089 a0d146ed 2005-07-12 devnull void
1090 a0d146ed 2005-07-12 devnull xmlindent(Hio *hout, int indent)
1091 a0d146ed 2005-07-12 devnull {
1092 a0d146ed 2005-07-12 devnull int i;
1093 a0d146ed 2005-07-12 devnull
1094 a0d146ed 2005-07-12 devnull for(i = 0; i < indent; i++)
1095 a0d146ed 2005-07-12 devnull hputc(hout, '\t');
1096 a0d146ed 2005-07-12 devnull }
1097 a0d146ed 2005-07-12 devnull
1098 a0d146ed 2005-07-12 devnull void
1099 a0d146ed 2005-07-12 devnull xmlaname(Hio *hout, char *v, char *tag)
1100 a0d146ed 2005-07-12 devnull {
1101 a0d146ed 2005-07-12 devnull hprint(hout, " %s=\"%s\"", tag, v);
1102 a0d146ed 2005-07-12 devnull }
1103 a0d146ed 2005-07-12 devnull
1104 a0d146ed 2005-07-12 devnull void
1105 a0d146ed 2005-07-12 devnull xmlscore(Hio *hout, u8int *v, char *tag)
1106 a0d146ed 2005-07-12 devnull {
1107 a0d146ed 2005-07-12 devnull if(scorecmp(zeroscore, v) == 0)
1108 a0d146ed 2005-07-12 devnull return;
1109 a0d146ed 2005-07-12 devnull hprint(hout, " %s=\"%V\"", tag, v);
1110 a0d146ed 2005-07-12 devnull }
1111 a0d146ed 2005-07-12 devnull
1112 a0d146ed 2005-07-12 devnull void
1113 a0d146ed 2005-07-12 devnull xmlsealed(Hio *hout, int v, char *tag)
1114 a0d146ed 2005-07-12 devnull {
1115 a0d146ed 2005-07-12 devnull if(!v)
1116 a0d146ed 2005-07-12 devnull return;
1117 a0d146ed 2005-07-12 devnull hprint(hout, " %s=\"yes\"", tag);
1118 a0d146ed 2005-07-12 devnull }
1119 a0d146ed 2005-07-12 devnull
1120 a0d146ed 2005-07-12 devnull void
1121 a0d146ed 2005-07-12 devnull xmlu32int(Hio *hout, u32int v, char *tag)
1122 a0d146ed 2005-07-12 devnull {
1123 a0d146ed 2005-07-12 devnull hprint(hout, " %s=\"%ud\"", tag, v);
1124 a0d146ed 2005-07-12 devnull }
1125 a0d146ed 2005-07-12 devnull
1126 a0d146ed 2005-07-12 devnull void
1127 a0d146ed 2005-07-12 devnull xmlu64int(Hio *hout, u64int v, char *tag)
1128 a0d146ed 2005-07-12 devnull {
1129 a0d146ed 2005-07-12 devnull hprint(hout, " %s=\"%llud\"", tag, v);
1130 a0d146ed 2005-07-12 devnull }
1131 a0d146ed 2005-07-12 devnull
1132 a0d146ed 2005-07-12 devnull void
1133 a0d146ed 2005-07-12 devnull vtloghdump(Hio *h, VtLog *l)
1134 a0d146ed 2005-07-12 devnull {
1135 a0d146ed 2005-07-12 devnull int i;
1136 a0d146ed 2005-07-12 devnull VtLogChunk *c;
1137 a0d146ed 2005-07-12 devnull char *name;
1138 fa325e9b 2020-01-10 cross
1139 a0d146ed 2005-07-12 devnull name = l ? l->name : "&lt;nil&gt;";
1140 a0d146ed 2005-07-12 devnull
1141 a0d146ed 2005-07-12 devnull hprint(h, "<html><head>\n");
1142 a0d146ed 2005-07-12 devnull hprint(h, "<title>Venti Server Log: %s</title>\n", name);
1143 a0d146ed 2005-07-12 devnull hprint(h, "</head><body>\n");
1144 a0d146ed 2005-07-12 devnull hprint(h, "<b>Venti Server Log: %s</b>\n<p>\n", name);
1145 fa325e9b 2020-01-10 cross
1146 a0d146ed 2005-07-12 devnull if(l){
1147 a0d146ed 2005-07-12 devnull c = l->w;
1148 a0d146ed 2005-07-12 devnull for(i=0; i<l->nchunk; i++){
1149 a0d146ed 2005-07-12 devnull if(++c == l->chunk+l->nchunk)
1150 a0d146ed 2005-07-12 devnull c = l->chunk;
1151 a0d146ed 2005-07-12 devnull hwrite(h, c->p, c->wp-c->p);
1152 a0d146ed 2005-07-12 devnull }
1153 a0d146ed 2005-07-12 devnull }
1154 a0d146ed 2005-07-12 devnull hprint(h, "</body></html>\n");
1155 a0d146ed 2005-07-12 devnull }
1156 a0d146ed 2005-07-12 devnull
1157 a0d146ed 2005-07-12 devnull static int
1158 a0d146ed 2005-07-12 devnull strpcmp(const void *va, const void *vb)
1159 a0d146ed 2005-07-12 devnull {
1160 a0d146ed 2005-07-12 devnull return strcmp(*(char**)va, *(char**)vb);
1161 a0d146ed 2005-07-12 devnull }
1162 a0d146ed 2005-07-12 devnull
1163 a0d146ed 2005-07-12 devnull void
1164 a0d146ed 2005-07-12 devnull vtloghlist(Hio *h)
1165 a0d146ed 2005-07-12 devnull {
1166 a0d146ed 2005-07-12 devnull char **p;
1167 a0d146ed 2005-07-12 devnull int i, n;
1168 fa325e9b 2020-01-10 cross
1169 a0d146ed 2005-07-12 devnull hprint(h, "<html><head>\n");
1170 a0d146ed 2005-07-12 devnull hprint(h, "<title>Venti Server Logs</title>\n");
1171 a0d146ed 2005-07-12 devnull hprint(h, "</head><body>\n");
1172 a0d146ed 2005-07-12 devnull hprint(h, "<b>Venti Server Logs</b>\n<p>\n");
1173 fa325e9b 2020-01-10 cross
1174 a0d146ed 2005-07-12 devnull p = vtlognames(&n);
1175 a0d146ed 2005-07-12 devnull qsort(p, n, sizeof(p[0]), strpcmp);
1176 a0d146ed 2005-07-12 devnull for(i=0; i<n; i++)
1177 27d28098 2007-04-21 devnull hprint(h, "<a href=\"/log?log=%s\">%s</a><br>\n", p[i], p[i]);
1178 a0d146ed 2005-07-12 devnull vtfree(p);
1179 a0d146ed 2005-07-12 devnull hprint(h, "</body></html>\n");
1180 a0d146ed 2005-07-12 devnull }