#include #include #include #include #include <9p.h> #include "dat.h" #include "fns.h" void netloginit(Netlog *l) { memset(l, 0, sizeof(Netlog)); l->ping = chancreate(sizeof(int), 0); } void netlogopen(Netlog *l) { qlock(l); if(l->opens == 0){ if(l->buf == nil) l->buf = emalloc9p(Nlog); l->rptr = l->buf; l->end = l->buf + Nlog; } l->opens++; qunlock(l); } void netlogclose(Netlog *l) { qlock(l); l->opens--; if(l->opens == 0){ free(l->buf); l->buf = nil; } qunlock(l); } long netlogread(Netlog *l, void *a, long n, vlong o, int *off) { int i, d, od; char *p, *rptr, *eptr; // syslog(0, logname, "netlogread %p n=%ld l->len=%d o=%lld l->o=%lld", l, n, l->len, o, l->offset); qlock(l); if (o + *off < l->offset) *off = l->offset - o; if(l->len){ od = 0; o += *off; if (o > l->offset) od = o - l->offset; // syslog(0, logname, "netlogread %p: n=%ld od=%d l->len=%d", l, n, od, l->len); if (od >= l->len) { qunlock(l); return 0; } if(n > l->len - od) n = l->len - od; if (n < 0) logfatal(0, "netlogread n < 0"); else if (n == 0) { qunlock(l); return 0; } d = 0; rptr = l->rptr; rptr += od; if (rptr >= l->end){ d = rptr - l->end; rptr = l->buf + d; } d = 0; eptr = rptr + n; if(eptr >= l->end){ d = eptr - l->end; eptr = l->buf + d; } i = n-d; p = a; memmove(p, rptr, i); memmove(p+i, l->buf, d); } else n = 0; qunlock(l); return n; } int netlog(Netlog *l, char *fmt, va_list arg) { vlong ns; char buf[1024], *t, *fp; char *ctim, *p, *pp; int i, n; if (l->opens == 0) return 0; ns = nsec(); ctim = nsctime(ns); p = buf + snprint(buf, sizeof(buf)-1, "%s ", ctim); p = vseprint(p, buf+sizeof(buf)-1, fmt, arg); // syslog( 0, logname, "%s", buf); pp = p - 1; if (pp >= buf && *pp != '\n') { *p = '\n'; p++; } n = p - buf; qlock(l); i = l->len + n - Nlog; if(i > 0){ l->offset += i; l->len -= i; l->rptr += i; if(l->rptr >= l->end) l->rptr = l->buf + (l->rptr - l->end); } t = l->rptr + l->len; fp = buf; l->len += n; while(n-- > 0){ if(t >= l->end) t = l->buf + (t - l->end); *t++ = *fp++; } qunlock(l); send(l->ping, nil); return n; }