2 #include "../port/lib.h"
6 #include "../port/error.h"
8 static char Ebadlogctl[] = "unknown log ctl message";
21 if(alog->minread == 0)
24 alog->buf = smalloc(alog->nlog);
25 alog->rptr = alog->buf;
26 alog->end = alog->buf + alog->nlog;
51 return alog->len >= alog->minread;
55 logread(Log *alog, void *a, ulong, long n)
62 qunlock(&alog->readq);
68 if(alog->len >= alog->minread || alog->len >= n){
74 if(alog->rptr >= alog->end){
75 d = alog->rptr - alog->end;
76 alog->rptr = alog->buf + d;
84 memmove(p+i, alog->buf, d);
90 sleep(&alog->readr, logready, alog);
93 qunlock(&alog->readq);
100 logctl(Log *alog, int argc, char *argv[], Logflag *flags)
108 if(strcmp("set", argv[0]) == 0)
110 else if(strcmp("clear", argv[0]) == 0)
115 for(i = 1; i < argc; i++){
116 for(fp = flags; fp->name; fp++)
117 if(strcmp(fp->name, argv[i]) == 0)
122 alog->logmask |= fp->mask;
124 alog->logmask &= ~fp->mask;
131 logn(Log *alog, int mask, void *buf, int n)
136 if(!(alog->logmask & mask))
146 i = alog->len + n - alog->nlog;
150 if(alog->rptr >= alog->end)
151 alog->rptr = alog->buf + (alog->rptr - alog->end);
153 t = alog->rptr + alog->len;
158 t = alog->buf + (t - alog->end);
161 dowake = alog->len >= alog->minread;
165 wakeup(&alog->readr);
169 log(Log *alog, int mask, char *fmt, ...)
175 if(!(alog->logmask & mask))
182 n = vseprint(buf, buf+sizeof(buf), fmt, arg) - buf;
185 logn(alog, mask, buf, n);