From be01e9e2f2179d5230b0c349cb2234f3b29621ee Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Thu, 2 Dec 1993 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1993-12-02 --- carrera/devether.c | 34 ++++++++++++++++++++++++++++++++++ port/devlance.c | 6 ++++++ port/devproc.c | 2 +- 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/carrera/devether.c b/carrera/devether.c index 3102d5272ce18fea6afd25eeb16f17df3455319b..335db963504f24d2cf3deaae8348c3c89884d07e 100644 --- a/carrera/devether.c +++ b/carrera/devether.c @@ -682,6 +682,37 @@ isoutbuf(void *arg) return ctlr->tda[ctlr->th].status == Host; } +static int +etherloop(Etherpkt *p, long n) +{ + int s, different; + ushort t; + Netfile *f, **fp; + + different = memcmp(p->d, p->s, sizeof(p->s)); + if(different && memcmp(p->d, ether.bcast, sizeof(p->d))) + return 0; + + s = splhi(); + t = (p->type[0]<<8) | p->type[1]; + for(fp = ether.f; fp < ðer.f[Ntypes]; fp++) { + f = *fp; + if(f == 0) + continue; + if(f->type == t || f->type < 0) + switch(qproduce(f->in, p->d, n)){ + case -1: + print("etherloop overflow\n"); + break; + case -2: + print("etherloop memory\n"); + break; + } + } + splx(s); + return !different; +} + long etherwrite(Chan *c, void *buf, long n, ulong offset) { @@ -699,6 +730,9 @@ etherwrite(Chan *c, void *buf, long n, ulong offset) return netifwrite(ether[0], c, buf, n); /* we handle data */ + if(etherloop(buf, n)) + return n; + qlock(&ctlr->tlock); if(waserror()) { qunlock(&ctlr->tlock); diff --git a/port/devlance.c b/port/devlance.c index da0ff809785eefa24f81ee96f5d4117872859a9f..fbf6d55f2012caa16635cf5121faf50c5e6930f4 100644 --- a/port/devlance.c +++ b/port/devlance.c @@ -474,6 +474,11 @@ lancewrite(Chan *c, void *buf, long n, ulong offset) return n; qlock(&l.tlock); + if(waserror()) { + qunlock(&ctlr->tlock); + nexterror(); + } + m = &(LANCEMEM->tmr[l.tc]); tsleep(&l.tr, isoutbuf, m, 10000); if(!isoutbuf(m) || l.wedged) @@ -496,6 +501,7 @@ lancewrite(Chan *c, void *buf, long n, ulong offset) *l.rdp = INEA|TDMD; } qunlock(&l.tlock); + poperror(); return n; } diff --git a/port/devproc.c b/port/devproc.c index 0b6ecf709353ff5a612a733b39d1bf6b9997e78b..6cdb72631462bf2e2b438296091124b8d9761808 100644 --- a/port/devproc.c +++ b/port/devproc.c @@ -151,7 +151,7 @@ int procwalk(Chan *c, char *name) { if(strcmp(name, "..") == 0) { - c->qid.path = Qdir|CHDIR; + c->qid.path = CHDIR; return 1; }