xref: /plan9/sys/src/cmd/auth/factotum/log.c (revision d3c05884522721166d85a4d78bb2a932ad0e3f06)
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