1 6e527fbc 2005-02-13 devnull #include "std.h"
2 6e527fbc 2005-02-13 devnull #include "dat.h"
5 6e527fbc 2005-02-13 devnull lbkick(Logbuf *lb)
11 6e527fbc 2005-02-13 devnull while(lb->wait && lb->rp != lb->wp){
12 6e527fbc 2005-02-13 devnull r = lb->wait;
13 6e527fbc 2005-02-13 devnull lb->wait = r->aux;
14 6e527fbc 2005-02-13 devnull if(lb->wait == nil)
15 6e527fbc 2005-02-13 devnull lb->waitlast = &lb->wait;
16 6e527fbc 2005-02-13 devnull r->aux = nil;
17 6e527fbc 2005-02-13 devnull if(r->ifcall.count < 5){
18 6e527fbc 2005-02-13 devnull respond(r, "factotum: read request count too short");
19 6e527fbc 2005-02-13 devnull continue;
21 6e527fbc 2005-02-13 devnull s = lb->msg[lb->rp];
22 6e527fbc 2005-02-13 devnull lb->msg[lb->rp] = nil;
23 6e527fbc 2005-02-13 devnull if(++lb->rp == nelem(lb->msg))
24 6e527fbc 2005-02-13 devnull lb->rp = 0;
25 6e527fbc 2005-02-13 devnull n = r->ifcall.count;
26 6e527fbc 2005-02-13 devnull if(n < strlen(s)+1+1){
27 6e527fbc 2005-02-13 devnull memmove(r->ofcall.data, s, n-5);
29 6e527fbc 2005-02-13 devnull r->ofcall.data[n] = '\0';
30 6e527fbc 2005-02-13 devnull /* look for first byte of UTF-8 sequence by skipping continuation bytes */
31 6e527fbc 2005-02-13 devnull while(n>0 && (r->ofcall.data[--n]&0xC0)==0x80)
33 6e527fbc 2005-02-13 devnull strcpy(r->ofcall.data+n, "...\n");
35 6e527fbc 2005-02-13 devnull strcpy(r->ofcall.data, s);
36 6e527fbc 2005-02-13 devnull strcat(r->ofcall.data, "\n");
38 6e527fbc 2005-02-13 devnull r->ofcall.count = strlen(r->ofcall.data);
40 6e527fbc 2005-02-13 devnull respond(r, nil);
45 6e527fbc 2005-02-13 devnull lbread(Logbuf *lb, Req *r)
47 6e527fbc 2005-02-13 devnull if(lb->waitlast == nil)
48 6e527fbc 2005-02-13 devnull lb->waitlast = &lb->wait;
49 6e527fbc 2005-02-13 devnull *(lb->waitlast) = r;
50 6e527fbc 2005-02-13 devnull lb->waitlast = (Req**)&r->aux;
51 6e527fbc 2005-02-13 devnull r->aux = nil;
52 6e527fbc 2005-02-13 devnull lbkick(lb);
56 6e527fbc 2005-02-13 devnull lbflush(Logbuf *lb, Req *r)
60 6e527fbc 2005-02-13 devnull for(l=&lb->wait; *l; l=(Req**)&(*l)->aux){
61 6e527fbc 2005-02-13 devnull if(*l == r){
62 6e527fbc 2005-02-13 devnull *l = r->aux;
63 6e527fbc 2005-02-13 devnull r->aux = nil;
64 6e527fbc 2005-02-13 devnull if(*l == nil)
65 6e527fbc 2005-02-13 devnull lb->waitlast = l;
66 6e527fbc 2005-02-13 devnull closereq(r);
73 6e527fbc 2005-02-13 devnull lbappend(Logbuf *lb, char *fmt, ...)
75 6e527fbc 2005-02-13 devnull va_list arg;
77 6e527fbc 2005-02-13 devnull va_start(arg, fmt);
78 6e527fbc 2005-02-13 devnull lbvappend(lb, fmt, arg);
79 6e527fbc 2005-02-13 devnull va_end(arg);
83 6e527fbc 2005-02-13 devnull lbvappend(Logbuf *lb, char *fmt, va_list arg)
87 6e527fbc 2005-02-13 devnull s = smprint(fmt, arg);
88 6e527fbc 2005-02-13 devnull if(s == nil)
89 6e527fbc 2005-02-13 devnull sysfatal("out of memory");
90 6e527fbc 2005-02-13 devnull if(lb->msg[lb->wp])
91 6e527fbc 2005-02-13 devnull free(lb->msg[lb->wp]);
92 6e527fbc 2005-02-13 devnull lb->msg[lb->wp] = s;
93 6e527fbc 2005-02-13 devnull if(++lb->wp == nelem(lb->msg))
94 6e527fbc 2005-02-13 devnull lb->wp = 0;
95 6e527fbc 2005-02-13 devnull lbkick(lb);
98 6e527fbc 2005-02-13 devnull Logbuf logbuf;
101 6e527fbc 2005-02-13 devnull logread(Req *r)
103 6e527fbc 2005-02-13 devnull lbread(&logbuf, r);
107 6e527fbc 2005-02-13 devnull logflush(Req *r)
109 6e527fbc 2005-02-13 devnull lbflush(&logbuf, r);
113 6e527fbc 2005-02-13 devnull flog(char *fmt, ...)
115 6e527fbc 2005-02-13 devnull va_list arg;
117 6e527fbc 2005-02-13 devnull va_start(arg, fmt);
118 6e527fbc 2005-02-13 devnull lbvappend(&logbuf, fmt, arg);
119 6e527fbc 2005-02-13 devnull va_end(arg);