## diffname ip/netlog.c 1997/0327
## diff -e /dev/null /n/emeliedump/1997/0327/sys/src/brazil/ip/netlog.c
0a
#include "u.h"
#include "../port/lib.h"
#include "mem.h"
#include "dat.h"
#include "fns.h"
#include "../port/error.h"
#include "../ip/ip.h"
int logmask; /* mask of things to debug */
Ipaddr iponly; /* ip address to print debugging for */
enum {
Nlog = 4*1024,
};
/*
* action log
*/
typedef struct Log {
Lock;
int opens;
char* buf;
char *end;
char *rptr;
int len;
QLock;
Rendez;
} Log;
static Log alog;
typedef struct Logflag {
char* name;
int mask;
} Logflag;
static Logflag flags[] =
{
{ "ppp", Logppp, },
{ "ip", Logip, },
{ "fs", Logfs, },
{ "tcp", Logtcp, },
{ "il", Logil, },
{ "icmp", Logicmp, },
{ "udp", Logudp, },
{ "compress", Logcompress, },
{ "ilmsg", Logil|Logilmsg, },
{ "gre", Loggre, },
{ "tcpmsg", Logtcp|Logtcpmsg, },
{ nil, 0, },
};
static char Ebadnetctl[] = "unknown netlog ctl message";
void
netlogopen(void)
{
lock(&alog);
if(waserror()){
unlock(&alog);
nexterror();
}
if(alog.opens == 0){
if(alog.buf == nil)
alog.buf = malloc(Nlog);
alog.rptr = alog.buf;
alog.end = alog.buf + Nlog;
}
alog.opens++;
unlock(&alog);
poperror();
}
void
netlogclose(void)
{
lock(&alog);
if(waserror()){
unlock(&alog);
nexterror();
}
alog.opens--;
if(alog.opens == 0){
free(alog.buf);
alog.buf = nil;
}
unlock(&alog);
poperror();
}
static int
netlogready(void*)
{
return alog.len;
}
long
netlogread(void* a, ulong, long n)
{
int i, d;
char *p, *rptr;
qlock(&alog);
if(waserror()){
qunlock(&alog);
nexterror();
}
for(;;){
lock(&alog);
if(alog.len){
if(n > alog.len)
n = alog.len;
d = 0;
rptr = alog.rptr;
alog.rptr += n;
if(alog.rptr >= alog.end){
d = alog.rptr - alog.end;
alog.rptr = alog.buf + d;
}
alog.len -= n;
unlock(&alog);
i = n;
p = a;
if(d){
memmove(p, rptr, d);
i -= d;
p += d;
rptr = alog.buf;
}
memmove(p, rptr, i);
break;
}
else
unlock(&alog);
sleep(&alog, netlogready, 0);
}
qunlock(&alog);
poperror();
return n;
}
char*
netlogctl(char* s, int len)
{
int i, n, set;
Logflag *f;
char *fields[10], *p, addr[4], buf[256];
if(len == 0)
return Ebadnetctl;
if(len >= sizeof(buf))
len = sizeof(buf)-1;
strncpy(buf, s, len);
buf[len] = 0;
if(len > 0 && buf[len-1] == '\n')
buf[len-1] = 0;
n = parsefields(buf, fields, 10, " ");
if(n < 2)
return Ebadnetctl;
if(strcmp("set", fields[0]) == 0)
set = 1;
else if(strcmp("clear", fields[0]) == 0)
set = 0;
else if(strcmp("only", fields[0]) == 0){
iponly = parseip(addr, fields[1]);
return nil;
} else
return Ebadnetctl;
p = strchr(fields[n-1], '\n');
if(p)
*p = 0;
for(i = 1; i < n; i++){
for(f = flags; f->name; f++)
if(strcmp(f->name, fields[i]) == 0)
break;
if(f->name == nil)
continue;
if(set)
logmask |= f->mask;
else
logmask &= ~f->mask;
}
return nil;
}
void
netlog(int mask, char *fmt, ...)
{
char buf[128], *t, *f;
int i, n;
va_list arg;
if(alog.opens == 0 || !(logmask & mask))
return;
va_start(arg, fmt);
n = doprint(buf, buf+sizeof(buf), fmt, arg) - buf;
va_end(arg);
if(alog.opens == 0)
return;
lock(&alog);
i = alog.len + n - Nlog;
if(i > 0){
alog.len -= i;
alog.rptr += i;
if(alog.rptr >= alog.end)
alog.rptr = alog.buf + (alog.rptr - alog.end);
}
t = alog.rptr + alog.len;
f = buf;
alog.len += n;
while(n-- > 0){
if(t >= alog.end)
t = alog.buf + (t - alog.end);
*t++ = *f++;
}
unlock(&alog);
wakeup(&alog);
}
.
## diffname ip/netlog.c 1997/0423
## diff -e /n/emeliedump/1997/0327/sys/src/brazil/ip/netlog.c /n/emeliedump/1997/0423/sys/src/brazil/ip/netlog.c
151c
char *fields[10], *p, buf[256];
uchar addr[Ipaddrlen];
.
## diffname ip/netlog.c 1997/0806
## diff -e /n/emeliedump/1997/0423/sys/src/brazil/ip/netlog.c /n/emeliedump/1997/0806/sys/src/brazil/ip/netlog.c
48a
{ "udpmsg", Logudp|Logudpmsg, },
{ "ipmsg", Logip|Logipmsg, },
.
## diffname ip/netlog.c 1997/0815
## diff -e /n/emeliedump/1997/0806/sys/src/brazil/ip/netlog.c /n/emeliedump/1997/0815/sys/src/brazil/ip/netlog.c
154c
uchar addr[IPaddrlen];
.
## diffname ip/netlog.c 1997/1104
## diff -e /n/emeliedump/1997/0815/sys/src/brazil/ip/netlog.c /n/emeliedump/1997/1104/sys/src/brazil/ip/netlog.c
66a
if(alog.buf == nil)
error(Enomem);
}
.
65c
if(alog.buf == nil){
.
## diffname ip/netlog.c 1998/0306
## diff -e /n/emeliedump/1997/1104/sys/src/brazil/ip/netlog.c /n/emeliedump/1998/0306/sys/src/brazil/ip/netlog.c
214a
print("%s", buf);
.
209c
if(!(logmask & mask))
.
178c
parseip(iponly, fields[1]);
if(ipcmp(iponly, IPnoaddr) == 0)
iponlyset = 0;
else
iponlyset = 1;
.
67,69d
65c
if(alog.buf == nil)
.
10c
uchar iponly[IPaddrlen]; /* ip address to print debugging for */
int iponlyset;
.
## diffname ip/netlog.c 1998/0307
## diff -e /n/emeliedump/1998/0306/sys/src/brazil/ip/netlog.c /n/emeliedump/1998/0307/sys/src/brazil/ip/netlog.c
155d
## diffname ip/netlog.c 1998/0313
## diff -e /n/emeliedump/1998/0307/sys/src/brazil/ip/netlog.c /n/emeliedump/1998/0313/sys/src/brazil/ip/netlog.c
240c
wakeup(f->alog);
.
238c
unlock(f->alog);
.
234,236c
if(t >= f->alog->end)
t = f->alog->buf + (t - f->alog->end);
*t++ = *fp++;
.
230,232c
t = f->alog->rptr + f->alog->len;
fp = buf;
f->alog->len += n;
.
225,228c
f->alog->len -= i;
f->alog->rptr += i;
if(f->alog->rptr >= f->alog->end)
f->alog->rptr = f->alog->buf + (f->alog->rptr - f->alog->end);
.
222,223c
lock(f->alog);
i = f->alog->len + n - Nlog;
.
217,219c
if(f->alog->opens == 0)
.
210c
if(!(f->alog->logmask & mask))
.
206c
char buf[128], *t, *fp;
.
204c
netlog(Fs *f, int mask, char *fmt, ...)
.
197c
f->alog->logmask &= ~fp->mask;
.
195c
f->alog->logmask |= fp->mask;
.
192c
if(fp->name == nil)
.
189,190c
for(fp = flags; fp->name; fp++)
if(strcmp(fp->name, fields[i]) == 0)
.
179c
f->alog->iponlyset = 1;
.
175,177c
parseip(f->alog->iponly, fields[1]);
if(ipcmp(f->alog->iponly, IPnoaddr) == 0)
f->alog->iponlyset = 0;
.
153c
Logflag *fp;
.
150c
netlogctl(Fs *f, char* s, int len)
.
143c
qunlock(f->alog);
.
140c
sleep(f->alog, netlogready, 0);
.
138c
unlock(f->alog);
.
132c
rptr = f->alog->buf;
.
123,124c
f->alog->len -= n;
unlock(f->alog);
.
117,121c
rptr = f->alog->rptr;
f->alog->rptr += n;
if(f->alog->rptr >= f->alog->end){
d = f->alog->rptr - f->alog->end;
f->alog->rptr = f->alog->buf + d;
.
112,115c
lock(f->alog);
if(f->alog->len){
if(n > f->alog->len)
n = f->alog->len;
.
107c
qunlock(f->alog);
.
105c
qlock(f->alog);
.
100c
netlogread(Fs *f, void *a, ulong, long n)
.
96c
Fs *f = a;
return f->alog->len;
.
94c
netlogready(void *a)
.
89c
unlock(f->alog);
.
84,87c
f->alog->opens--;
if(f->alog->opens == 0){
free(f->alog->buf);
f->alog->buf = nil;
.
81c
unlock(f->alog);
.
79c
lock(f->alog);
.
77c
netlogclose(Fs *f)
.
71,72c
f->alog->opens++;
unlock(f->alog);
.
65,69c
if(f->alog->opens == 0){
if(f->alog->buf == nil)
f->alog->buf = malloc(Nlog);
f->alog->rptr = f->alog->buf;
f->alog->end = f->alog->buf + Nlog;
.
62c
unlock(f->alog);
.
60c
f->alog = smalloc(sizeof(Log));
}
void
netlogopen(Fs *f)
{
lock(f->alog);
.
58c
netloginit(Fs *f)
.
36a
.
30,31c
};
.
27a
int logmask; /* mask of things to debug */
uchar iponly[IPaddrlen]; /* ip address to print debugging for */
int iponlyset;
.
20c
struct Log {
.
9,12d
## diffname ip/netlog.c 1998/0314
## diff -e /n/emeliedump/1998/0313/sys/src/brazil/ip/netlog.c /n/emeliedump/1998/0314/sys/src/brazil/ip/netlog.c
148c
sleep(f->alog, netlogready, f);
.
## diffname ip/netlog.c 1999/0316
## diff -e /n/emeliedump/1998/0314/sys/src/brazil/ip/netlog.c /n/emeliedump/1999/0316/sys/src/brazil/ip/netlog.c
161c
Netlogflag *fp;
.
60c
f->alog = smalloc(sizeof(Netlog));
.
51a
{ "esp", Logesp, },
.
37c
static Netlogflag flags[] =
.
35c
} Netlogflag;
.
32c
typedef struct Netlogflag {
.
16c
struct Netlog {
.
## diffname ip/netlog.c 1999/0731
## diff -e /n/emeliedump/1999/0316/sys/src/brazil/ip/netlog.c /n/emeliedump/1999/0731/sys/src/brazil/ip/netlog.c
143a
memmove(p+i, f->alog->buf, d);
.
137,142d
135c
i = n-d;
.
## diffname ip/netlog.c 2000/0308
## diff -e /n/emeliedump/1999/0731/sys/src/brazil/ip/netlog.c /n/emeliedump/2000/0308/sys/src/9/ip/netlog.c
170c
n = getfields(buf, fields, 10, 1, " ");
.
## diffname ip/netlog.c 2001/1117
## diff -e /n/emeliedump/2000/0308/sys/src/9/ip/netlog.c /n/emeliedump/2001/1117/sys/src/9/ip/netlog.c
170c
n = tokenize(buf, fields, 10);
.
## diffname ip/netlog.c 2001/1120
## diff -e /n/emeliedump/2001/1117/sys/src/9/ip/netlog.c /n/emeliedump/2001/1120/sys/src/9/ip/netlog.c
204c
free(cb);
poperror();
.
194c
if(strcmp(fp->name, cb->f[i]) == 0)
.
188,190c
default:
cmderror(cb, "unknown ip control message");
}
.
184,186c
free(cb);
return;
.
178,179c
break;
case CMonly:
parseip(f->alog->iponly, cb->f[1]);
.
176c
break;
case CMclear:
.
174c
SET(set);
switch(ct->index){
case CMset:
.
170,172c
ct = lookupcmd(cb, routecmd, nelem(routecmd));
.
163,168c
if(cb->nf < 2)
error(Ebadnetctl);
.
160,161c
cb = parsecmd(s, n);
if(waserror()){
free(cb);
nexterror();
}
.
158c
Cmdbuf *cb;
Cmdtab *ct;
.
156c
int i, set;
.
153,154c
void
netlogctl(Fs *f, char* s, int n)
.
57a
enum
{
CMset,
CMclear,
CMonly,
};
static
Cmdtab routecmd[] = {
CMset, "set", 0,
CMclear, "clear", 0,
CMonly, "only", 0,
};
.
56c
char Ebadnetctl[] = "too few arguments for netlog control message";
.
## diffname ip/netlog.c 2002/0217
## diff -e /n/emeliedump/2001/1120/sys/src/9/ip/netlog.c /n/emeliedump/2002/0217/sys/src/9/ip/netlog.c
241a
va_start(arg, fmt);
n = vseprint(buf, buf+sizeof(buf), fmt, arg) - buf;
va_end(arg);
.
236,239d
## diffname ip/netlog.c 2002/0306
## diff -e /n/emeliedump/2002/0217/sys/src/9/ip/netlog.c /n/emeliedump/2002/0306/sys/src/9/ip/netlog.c
210c
for(i = 1; i < cb->nf; i++){
.
## diffname ip/netlog.c 2002/0507
## diff -e /n/emeliedump/2002/0306/sys/src/9/ip/netlog.c /n/emeliedump/2002/0507/sys/src/9/ip/netlog.c
210c
for(i = 1; i < n; i++){
.
## diffname ip/netlog.c 2002/0615
## diff -e /n/emeliedump/2002/0507/sys/src/9/ip/netlog.c /n/emeliedump/2002/0615/sys/src/9/ip/netlog.c
210c
for(i = 1; i < cb->nf; i++){
.
## diffname ip/netlog.c 2002/0713
## diff -e /n/emeliedump/2002/0615/sys/src/9/ip/netlog.c /n/emeliedump/2002/0713/sys/src/9/ip/netlog.c
49c
{ "tcpwin", Logtcp|Logtcpwin, },
{ "tcprxmt", Logtcp|Logtcprxmt, },
.
|