19a747e4fSDavid du Colombier #include "dat.h"
29a747e4fSDavid du Colombier
39a747e4fSDavid du Colombier void
logbufproc(Logbuf * lb)49a747e4fSDavid du Colombier logbufproc(Logbuf *lb)
59a747e4fSDavid du Colombier {
69a747e4fSDavid du Colombier char *s;
79a747e4fSDavid du Colombier int n;
89a747e4fSDavid du Colombier Req *r;
99a747e4fSDavid du Colombier
109a747e4fSDavid du Colombier while(lb->wait && lb->rp != lb->wp){
119a747e4fSDavid du Colombier r = lb->wait;
129a747e4fSDavid du Colombier lb->wait = r->aux;
139a747e4fSDavid du Colombier if(lb->wait == nil)
149a747e4fSDavid du Colombier lb->waitlast = &lb->wait;
159a747e4fSDavid du Colombier r->aux = nil;
169a747e4fSDavid du Colombier if(r->ifcall.count < 5){
179a747e4fSDavid du Colombier respond(r, "factotum: read request count too short");
189a747e4fSDavid du Colombier continue;
199a747e4fSDavid du Colombier }
209a747e4fSDavid du Colombier s = lb->msg[lb->rp];
219a747e4fSDavid du Colombier lb->msg[lb->rp] = nil;
229a747e4fSDavid du Colombier if(++lb->rp == nelem(lb->msg))
239a747e4fSDavid du Colombier lb->rp = 0;
249a747e4fSDavid du Colombier n = r->ifcall.count;
259a747e4fSDavid du Colombier if(n < strlen(s)+1+1){
269a747e4fSDavid du Colombier memmove(r->ofcall.data, s, n-5);
279a747e4fSDavid du Colombier n -= 5;
289a747e4fSDavid du Colombier r->ofcall.data[n] = '\0';
299a747e4fSDavid du Colombier /* look for first byte of UTF-8 sequence by skipping continuation bytes */
309a747e4fSDavid du Colombier while(n>0 && (r->ofcall.data[--n]&0xC0)==0x80)
319a747e4fSDavid du Colombier ;
329a747e4fSDavid du Colombier strcpy(r->ofcall.data+n, "...\n");
339a747e4fSDavid du Colombier }else{
349a747e4fSDavid du Colombier strcpy(r->ofcall.data, s);
359a747e4fSDavid du Colombier strcat(r->ofcall.data, "\n");
369a747e4fSDavid du Colombier }
379a747e4fSDavid du Colombier r->ofcall.count = strlen(r->ofcall.data);
389a747e4fSDavid du Colombier free(s);
399a747e4fSDavid du Colombier respond(r, nil);
409a747e4fSDavid du Colombier }
419a747e4fSDavid du Colombier }
429a747e4fSDavid du Colombier
439a747e4fSDavid du Colombier void
logbufread(Logbuf * lb,Req * r)449a747e4fSDavid du Colombier logbufread(Logbuf *lb, Req *r)
459a747e4fSDavid du Colombier {
469a747e4fSDavid du Colombier if(lb->waitlast == nil)
479a747e4fSDavid du Colombier lb->waitlast = &lb->wait;
489a747e4fSDavid du Colombier *(lb->waitlast) = r;
499a747e4fSDavid du Colombier lb->waitlast = &r->aux;
509a747e4fSDavid du Colombier r->aux = nil;
519a747e4fSDavid du Colombier logbufproc(lb);
529a747e4fSDavid du Colombier }
539a747e4fSDavid du Colombier
549a747e4fSDavid du Colombier void
logbufflush(Logbuf * lb,Req * r)559a747e4fSDavid du Colombier logbufflush(Logbuf *lb, Req *r)
569a747e4fSDavid du Colombier {
579a747e4fSDavid du Colombier Req **l;
589a747e4fSDavid du Colombier
599a747e4fSDavid du Colombier for(l=&lb->wait; *l; l=&(*l)->aux){
609a747e4fSDavid du Colombier if(*l == r){
619a747e4fSDavid du Colombier *l = r->aux;
629a747e4fSDavid du Colombier r->aux = nil;
639a747e4fSDavid du Colombier if(*l == nil)
649a747e4fSDavid du Colombier lb->waitlast = l;
65*d3c05884SDavid du Colombier respond(r, "interrupted");
669a747e4fSDavid du Colombier break;
679a747e4fSDavid du Colombier }
689a747e4fSDavid du Colombier }
699a747e4fSDavid du Colombier }
709a747e4fSDavid du Colombier
719a747e4fSDavid du Colombier void
logbufappend(Logbuf * lb,char * buf)729a747e4fSDavid du Colombier logbufappend(Logbuf *lb, char *buf)
739a747e4fSDavid du Colombier {
749a747e4fSDavid du Colombier if(debug)
759a747e4fSDavid du Colombier fprint(2, "%s\n", buf);
769a747e4fSDavid du Colombier
779a747e4fSDavid du Colombier if(lb->msg[lb->wp])
789a747e4fSDavid du Colombier free(lb->msg[lb->wp]);
799a747e4fSDavid du Colombier lb->msg[lb->wp] = estrdup9p(buf);
809a747e4fSDavid du Colombier if(++lb->wp == nelem(lb->msg))
819a747e4fSDavid du Colombier lb->wp = 0;
829a747e4fSDavid du Colombier logbufproc(lb);
839a747e4fSDavid du Colombier }
849a747e4fSDavid du Colombier
859a747e4fSDavid du Colombier Logbuf logbuf;
869a747e4fSDavid du Colombier
879a747e4fSDavid du Colombier void
logread(Req * r)889a747e4fSDavid du Colombier logread(Req *r)
899a747e4fSDavid du Colombier {
909a747e4fSDavid du Colombier logbufread(&logbuf, r);
919a747e4fSDavid du Colombier }
929a747e4fSDavid du Colombier
939a747e4fSDavid du Colombier void
logflush(Req * r)949a747e4fSDavid du Colombier logflush(Req *r)
959a747e4fSDavid du Colombier {
969a747e4fSDavid du Colombier logbufflush(&logbuf, r);
979a747e4fSDavid du Colombier }
989a747e4fSDavid du Colombier
999a747e4fSDavid du Colombier void
flog(char * fmt,...)1009a747e4fSDavid du Colombier flog(char *fmt, ...)
1019a747e4fSDavid du Colombier {
1029a747e4fSDavid du Colombier char buf[1024];
1039a747e4fSDavid du Colombier va_list arg;
1049a747e4fSDavid du Colombier
1059a747e4fSDavid du Colombier va_start(arg, fmt);
1069a747e4fSDavid du Colombier vseprint(buf, buf+sizeof buf, fmt, arg);
1079a747e4fSDavid du Colombier va_end(arg);
1089a747e4fSDavid du Colombier logbufappend(&logbuf, buf);
1099a747e4fSDavid du Colombier }
1109a747e4fSDavid du Colombier
111