Blame


1 2277c5d7 2004-03-21 devnull #include "std.h"
2 2277c5d7 2004-03-21 devnull #include "dat.h"
3 2277c5d7 2004-03-21 devnull
4 2277c5d7 2004-03-21 devnull void
5 2277c5d7 2004-03-21 devnull lbkick(Logbuf *lb)
6 2277c5d7 2004-03-21 devnull {
7 2277c5d7 2004-03-21 devnull char *s;
8 2277c5d7 2004-03-21 devnull int n;
9 2277c5d7 2004-03-21 devnull Req *r;
10 2277c5d7 2004-03-21 devnull
11 2277c5d7 2004-03-21 devnull while(lb->wait && lb->rp != lb->wp){
12 2277c5d7 2004-03-21 devnull r = lb->wait;
13 2277c5d7 2004-03-21 devnull lb->wait = r->aux;
14 2277c5d7 2004-03-21 devnull if(lb->wait == nil)
15 2277c5d7 2004-03-21 devnull lb->waitlast = &lb->wait;
16 2277c5d7 2004-03-21 devnull r->aux = nil;
17 2277c5d7 2004-03-21 devnull if(r->ifcall.count < 5){
18 2277c5d7 2004-03-21 devnull respond(r, "factotum: read request count too short");
19 2277c5d7 2004-03-21 devnull continue;
20 2277c5d7 2004-03-21 devnull }
21 2277c5d7 2004-03-21 devnull s = lb->msg[lb->rp];
22 2277c5d7 2004-03-21 devnull lb->msg[lb->rp] = nil;
23 2277c5d7 2004-03-21 devnull if(++lb->rp == nelem(lb->msg))
24 2277c5d7 2004-03-21 devnull lb->rp = 0;
25 2277c5d7 2004-03-21 devnull n = r->ifcall.count;
26 2277c5d7 2004-03-21 devnull if(n < strlen(s)+1+1){
27 2277c5d7 2004-03-21 devnull memmove(r->ofcall.data, s, n-5);
28 2277c5d7 2004-03-21 devnull n -= 5;
29 2277c5d7 2004-03-21 devnull r->ofcall.data[n] = '\0';
30 2277c5d7 2004-03-21 devnull /* look for first byte of UTF-8 sequence by skipping continuation bytes */
31 2277c5d7 2004-03-21 devnull while(n>0 && (r->ofcall.data[--n]&0xC0)==0x80)
32 2277c5d7 2004-03-21 devnull ;
33 2277c5d7 2004-03-21 devnull strcpy(r->ofcall.data+n, "...\n");
34 2277c5d7 2004-03-21 devnull }else{
35 2277c5d7 2004-03-21 devnull strcpy(r->ofcall.data, s);
36 2277c5d7 2004-03-21 devnull strcat(r->ofcall.data, "\n");
37 2277c5d7 2004-03-21 devnull }
38 2277c5d7 2004-03-21 devnull r->ofcall.count = strlen(r->ofcall.data);
39 2277c5d7 2004-03-21 devnull free(s);
40 2277c5d7 2004-03-21 devnull respond(r, nil);
41 2277c5d7 2004-03-21 devnull }
42 2277c5d7 2004-03-21 devnull }
43 2277c5d7 2004-03-21 devnull
44 2277c5d7 2004-03-21 devnull void
45 2277c5d7 2004-03-21 devnull lbread(Logbuf *lb, Req *r)
46 2277c5d7 2004-03-21 devnull {
47 2277c5d7 2004-03-21 devnull if(lb->waitlast == nil)
48 2277c5d7 2004-03-21 devnull lb->waitlast = &lb->wait;
49 2277c5d7 2004-03-21 devnull *(lb->waitlast) = r;
50 2277c5d7 2004-03-21 devnull lb->waitlast = (Req**)&r->aux;
51 2277c5d7 2004-03-21 devnull r->aux = nil;
52 2277c5d7 2004-03-21 devnull lbkick(lb);
53 2277c5d7 2004-03-21 devnull }
54 2277c5d7 2004-03-21 devnull
55 2277c5d7 2004-03-21 devnull void
56 2277c5d7 2004-03-21 devnull lbflush(Logbuf *lb, Req *r)
57 2277c5d7 2004-03-21 devnull {
58 2277c5d7 2004-03-21 devnull Req **l;
59 2277c5d7 2004-03-21 devnull
60 2277c5d7 2004-03-21 devnull for(l=&lb->wait; *l; l=(Req**)&(*l)->aux){
61 2277c5d7 2004-03-21 devnull if(*l == r){
62 2277c5d7 2004-03-21 devnull *l = r->aux;
63 2277c5d7 2004-03-21 devnull r->aux = nil;
64 2277c5d7 2004-03-21 devnull if(*l == nil)
65 2277c5d7 2004-03-21 devnull lb->waitlast = l;
66 2277c5d7 2004-03-21 devnull closereq(r);
67 2277c5d7 2004-03-21 devnull break;
68 2277c5d7 2004-03-21 devnull }
69 2277c5d7 2004-03-21 devnull }
70 2277c5d7 2004-03-21 devnull }
71 2277c5d7 2004-03-21 devnull
72 2277c5d7 2004-03-21 devnull void
73 2277c5d7 2004-03-21 devnull lbappend(Logbuf *lb, char *fmt, ...)
74 2277c5d7 2004-03-21 devnull {
75 2277c5d7 2004-03-21 devnull va_list arg;
76 2277c5d7 2004-03-21 devnull
77 2277c5d7 2004-03-21 devnull va_start(arg, fmt);
78 2277c5d7 2004-03-21 devnull lbvappend(lb, fmt, arg);
79 2277c5d7 2004-03-21 devnull va_end(arg);
80 2277c5d7 2004-03-21 devnull }
81 2277c5d7 2004-03-21 devnull
82 2277c5d7 2004-03-21 devnull void
83 2277c5d7 2004-03-21 devnull lbvappend(Logbuf *lb, char *fmt, va_list arg)
84 2277c5d7 2004-03-21 devnull {
85 2277c5d7 2004-03-21 devnull char *s;
86 2277c5d7 2004-03-21 devnull
87 2277c5d7 2004-03-21 devnull s = smprint(fmt, arg);
88 2277c5d7 2004-03-21 devnull if(s == nil)
89 2277c5d7 2004-03-21 devnull sysfatal("out of memory");
90 2277c5d7 2004-03-21 devnull if(lb->msg[lb->wp])
91 2277c5d7 2004-03-21 devnull free(lb->msg[lb->wp]);
92 2277c5d7 2004-03-21 devnull lb->msg[lb->wp] = s;
93 2277c5d7 2004-03-21 devnull if(++lb->wp == nelem(lb->msg))
94 2277c5d7 2004-03-21 devnull lb->wp = 0;
95 2277c5d7 2004-03-21 devnull lbkick(lb);
96 2277c5d7 2004-03-21 devnull }
97 2277c5d7 2004-03-21 devnull
98 2277c5d7 2004-03-21 devnull Logbuf logbuf;
99 2277c5d7 2004-03-21 devnull
100 2277c5d7 2004-03-21 devnull void
101 2277c5d7 2004-03-21 devnull logread(Req *r)
102 2277c5d7 2004-03-21 devnull {
103 2277c5d7 2004-03-21 devnull lbread(&logbuf, r);
104 2277c5d7 2004-03-21 devnull }
105 2277c5d7 2004-03-21 devnull
106 2277c5d7 2004-03-21 devnull void
107 2277c5d7 2004-03-21 devnull logflush(Req *r)
108 2277c5d7 2004-03-21 devnull {
109 2277c5d7 2004-03-21 devnull lbflush(&logbuf, r);
110 2277c5d7 2004-03-21 devnull }
111 2277c5d7 2004-03-21 devnull
112 2277c5d7 2004-03-21 devnull void
113 2277c5d7 2004-03-21 devnull flog(char *fmt, ...)
114 2277c5d7 2004-03-21 devnull {
115 2277c5d7 2004-03-21 devnull va_list arg;
116 2277c5d7 2004-03-21 devnull
117 2277c5d7 2004-03-21 devnull va_start(arg, fmt);
118 2277c5d7 2004-03-21 devnull lbvappend(&logbuf, fmt, arg);
119 2277c5d7 2004-03-21 devnull va_end(arg);
120 2277c5d7 2004-03-21 devnull }
121 2277c5d7 2004-03-21 devnull