Blame


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