## diffname port/stfcall.c 1991/0521
## diff -e /dev/null /n/bootesdump/1991/0521/sys/src/9/port/stfcall.c
0a
#include "u.h"
#include "lib.h"
#include "mem.h"
#include "dat.h"
#include "fns.h"
#include "errno.h"
#include "fcall.h"
#define DPRINT if(fcalldebug)kprint
int fcalldebug = 0;
typedef struct Fcalld Fcalld;
struct Fcalld{
int dev; /* ref. for debug output */
int state;
int type; /* of current message */
int need; /* bytes remaining in current message */
int nhdr; /* bytes of header treasured up in hdr */
uchar hdr[16];
};
enum {
Startup, Startup1, Begin, Header, Data
};
/*
* fcall stream module definition
*/
static void fcalliput(Queue*, Block*);
static void fcalloput(Queue*, Block*);
static void fcallopen(Queue*, Stream*);
static void fcallclose(Queue*);
static void fcallreset(void);
Qinfo fcallinfo =
{
fcalliput,
fcalloput,
fcallopen,
fcallclose,
"fcall",
fcallreset
};
static Block * putmsg(Queue*, Block*, int);
static uchar msglen[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 3, 3, 3, 3, 0, 67, 5, 3, 89, 13, 7, 5, 33, 13,
6, 13, 38, 13, 15, 8, 16, 7, 5, 5, 5, 5, 5,121,121, 5,
35, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
static void
fcallreset(void)
{}
static void
fcallopen(Queue *q, Stream *s)
{
Fcalld *f;
DPRINT("fcallopen %d\n", s->dev);
q->ptr = allocb(sizeof(Fcalld));
f = (Fcalld *)((Block *)q->ptr)->base;
f->dev = s->dev;
f->state = Startup;
f->type = 0;
f->need = 0;
f->nhdr = 0;
}
static void
fcallclose(Queue * q)
{
Fcalld *f = (Fcalld *)((Block *)q->ptr)->base;
DPRINT("fcallstclose %d\n", f->dev);
freeb(q->ptr);
q->ptr = 0;
}
void
fcalloput(Queue *q, Block *bp)
{
PUTNEXT(q, bp);
}
static void
fcalliput(Queue *q, Block *bp)
{
Fcalld *f = (Fcalld *)((Block *)q->ptr)->base;
int len, n;
len = BLEN(bp);
DPRINT("fcalliput %d: blen=%d\n", f->dev, len);
if(bp->type != M_DATA){
DPRINT("fcalliput %d: type=%d\n", f->dev, bp->type);
PUTNEXT(q, bp);
return;
}
bp->flags &= ~S_DELIM;
if(len == 0){
freeb(bp);
return;
}
while(len > 0)switch(f->state){
case Startup:
if (len == 1 && bp->rptr[0] == 'O'){
DPRINT("fcalliput %d: O\n", f->dev);
PUTNEXT(q, bp);
f->state = Startup1;
return;
}
if(bp->rptr[0] == 'O' && bp->rptr[1] == 'K'){
DPRINT("fcalliput %d: OK\n", f->dev);
bp = putmsg(q, bp, 2);
len -= 2;
}
f->state = Begin;
break;
case Startup1:
if(bp->rptr[0] == 'K'){
DPRINT("fcalliput %d: K\n", f->dev);
bp = putmsg(q, bp, 1);
len -= 1;
f->state = Begin;
break;
}
f->type = 'O';
f->need = msglen['O']-1;
f->state = Data;
DPRINT("fcalliput %d: type=%d, need=%d\n",
f->dev, f->type, f->need);
break;
case Begin:
f->type = bp->rptr[0];
f->need = msglen[f->type];
f->nhdr = 0;
if(f->type == Twrite || f->type == Rread)
f->state = Header;
else
f->state = Data;
DPRINT("fcalliput %d: type=%d, need=%d\n",
f->dev, f->type, f->need);
break;
case Header:
n = f->need;
if(n > len)
n = len;
memmove(&f->hdr[f->nhdr], bp->rptr, n);
f->nhdr += n;
DPRINT("fcalliput %d: nhdr=%d\n",
f->dev, f->nhdr);
if(n == f->need){
f->need += f->hdr[f->nhdr-3];
f->need += f->hdr[f->nhdr-2] << 8;
f->state = Data;
DPRINT("fcalliput %d: need=%d\n",
f->dev, f->need);
}
/* fall through */
case Data:
if(f->need > len){
f->need -= len;
PUTNEXT(q, bp);
return;
}
bp = putmsg(q, bp, f->need);
len -= f->need;
f->state = Begin;
break;
}
}
static Block *
putmsg(Queue *q, Block *bp, int n)
{
Block *xbp;
int k;
DPRINT("putmsg: n=%d\n\n", n);
k = BLEN(bp) - n;
if(k == 0){
bp->flags |= S_DELIM;
PUTNEXT(q, bp);
return 0;
}
if(n <= k){
xbp = allocb(n);
memmove(xbp->wptr, bp->rptr, n);
xbp->wptr += n;
bp->rptr += n;
xbp->flags |= S_DELIM;
PUTNEXT(q, xbp);
return bp;
}
xbp = allocb(k);
memmove(xbp->wptr, bp->rptr+n, k);
xbp->wptr += k;
bp->wptr -= k;
bp->flags |= S_DELIM;
PUTNEXT(q, bp);
return xbp;
}
.
## diffname port/stfcall.c 1991/0522
## diff -e /n/bootesdump/1991/0521/sys/src/9/port/stfcall.c /n/bootesdump/1991/0522/sys/src/9/port/stfcall.c
10c
#define DPRINT if(fcalldebug)print
.
## diffname port/stfcall.c 1991/1003
## diff -e /n/bootesdump/1991/0522/sys/src/9/port/stfcall.c /n/bootesdump/1991/1003/sys/src/9/port/stfcall.c
55c
35, 13, 69, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
.
10c
#define DPRINT if(fcalldebug)kprint
.
## diffname port/stfcall.c 1992/0111
## diff -e /n/bootesdump/1991/1003/sys/src/9/port/stfcall.c /n/bootesdump/1992/0111/sys/src/9/port/stfcall.c
6c
#include "../port/error.h"
.
## diffname port/stfcall.c 1992/0318
## diff -e /n/bootesdump/1992/0111/sys/src/9/port/stfcall.c /n/bootesdump/1992/0318/sys/src/9/port/stfcall.c
201,223c
pullup(q->first, len);
bp = q->first;
need = len+bp->rptr[off]+(bp->rptr[off+1]<<8);
if(q->len < need)
return;
upstream(q, need);
.
195,199c
if(q->len < len)
return;
.
193d
191a
case Rread: /* Fmt: TGGFFCC */
len = Rreadhdr;
off = Rreadcnt;
break;
.
165,190c
return;
case Twrite: /* Fmt: TGGFFOOOOOOOOCC */
len = Twritehdr; /* T = type, G = tag, F = fid */
off = Twritecnt; /* O = offset, C = count */
.
153,163c
bp = q->first;
switch(bp->rptr[0]) { /* This is the type */
default:
len = msglen[bp->rptr[0]];
if(len == 0)
error(Emountrpc);
if(q->len >= len)
upstream(q, len);
.
138,151c
/* Stash the data */
bp->flags &= ~S_DELIM;
putq(q, bp);
.
122,136d
117,118c
if(BLEN(bp) == 0) {
.
110,113c
if(bp->type != M_DATA) {
.
107,108c
ulong len, need, off;
.
103a
tail = &bl;
while(len) {
l = BLEN(q->first);
if(l > len)
break;
bp = getq(q); /* Consume all of block */
*tail = bp;
tail = &bp->next;
len -= l;
}
if(len) { /* Consume partial block */
lock(q);
*tail = copyb(q->first, len);
q->first->rptr += len;
q->len -= len;
unlock(q);
}
for(bp = bl; bp->next; bp = bp->next)
;
bp->flags |= S_DELIM;
PUTNEXT(q, bl);
}
.
102a
void
upstream(Queue *q, ulong len)
{
Block *bl, **tail, *bp;
ulong l;
.
90,94c
USED(q);
.
74,84c
USED(q, s);
.
69c
{
}
.
47,66d
39,44c
[Tnop] 3,
[Rnop] 3,
[Tsession] 3,
[Rsession] 3,
[Terror] 0,
[Rerror] 67,
[Tflush] 5,
[Rflush] 3,
[Tattach] 89,
[Rattach] 13,
[Tclone] 7,
[Rclone] 5,
[Twalk] 33,
[Rwalk] 13,
[Topen] 6,
[Ropen] 13,
[Tcreate] 38,
[Rcreate] 13,
[Tread] 15,
[Rread] 8,
[Twrite] 16,
[Rwrite] 7,
[Tclunk] 5,
[Rclunk] 5,
[Tremove] 5,
[Rremove] 5,
[Tstat] 5,
[Rstat] 121,
[Twstat] 121,
[Rwstat] 5,
[Tclwalk] 35,
[Rclwalk] 13,
[Tauth] 69,
[Rauth] 35,
.
37c
Qinfo fcallinfo = { fcalliput, fcalloput, fcallopen, fcallclose, "fcall", fcallreset };
static uchar msglen[256] =
.
25,31d
10,22c
enum
{
Twritehdr = 15, /* Min bytes for Twrite */
Rreadhdr = 8, /* Min bytes for Rread */
Twritecnt = 13, /* Offset in byte stream of write count */
Rreadcnt = 5, /* Offset for Readcnt */
.
## diffname port/stfcall.c 1992/0319
## diff -e /n/bootesdump/1992/0318/sys/src/9/port/stfcall.c /n/bootesdump/1992/0319/sys/src/9/port/stfcall.c
111a
if(bl->rptr[0] == 73) print("fcall Rclunk %d\n", blen(bl));
.
## diffname port/stfcall.c 1992/0320
## diff -e /n/bootesdump/1992/0319/sys/src/9/port/stfcall.c /n/bootesdump/1992/0320/sys/src/9/port/stfcall.c
154,163c
case Rread: /* Fmt: TGGFFCC */
len = Rreadhdr;
off = Rreadcnt;
break;
}
if(q->len < len)
return;
pullup(q->first, len);
bp = q->first;
need = len+bp->rptr[off]+(bp->rptr[off+1]<<8);
if(q->len < need)
return;
upstream(q, need);
}
.
143,152c
case Twrite: /* Fmt: TGGFFOOOOOOOOCC */
len = Twritehdr; /* T = type, G = tag, F = fid */
off = Twritecnt; /* O = offset, C = count */
break;
.
141a
continue;
.
134,140c
for(;;) {
bp = q->first;
if(bp == 0)
return;
switch(bp->rptr[0]) { /* This is the type */
default:
len = msglen[bp->rptr[0]];
if(len == 0)
error(Emountrpc);
if(q->len < len)
return;
.
112d
## diffname port/stfcall.c 1992/0321
## diff -e /n/bootesdump/1992/0320/sys/src/9/port/stfcall.c /n/bootesdump/1992/0321/sys/src/9/port/stfcall.c
2c
#include "../port/lib.h"
.
## diffname port/stfcall.c 1992/0619
## diff -e /n/bootesdump/1992/0321/sys/src/9/port/stfcall.c /n/bootesdump/1992/0619/sys/src/9/port/stfcall.c
8,9d
## diffname port/stfcall.c 1992/0910
## diff -e /n/bootesdump/1992/0619/sys/src/9/port/stfcall.c /n/bootesdump/1992/0910/sys/src/9/port/stfcall.c
138,139c
if(len == 0){
bp = allocb(0);
bp->type = M_HANGUP;
PUTNEXT(q, bp);
return;
}
.
10c
Twritehdr = 16, /* Min bytes for Twrite */
.
## diffname port/stfcall.c 1993/0330
## diff -e /n/bootesdump/1992/0910/sys/src/9/port/stfcall.c /n/bootesdump/1993/0330/sys/src/9/port/stfcall.c
57,58d
33,34c
[Tattach] 5+2*NAMELEN+TICKETLEN+AUTHENTLEN,
[Rattach] 13+AUTHENTLEN,
.
27,28c
[Tsession] 3+CHALLEN,
[Rsession] 3+NAMELEN+DOMLEN+CHALLEN,
.
## diffname port/stfcall.c 1993/0410
## diff -e /n/bootesdump/1993/0330/sys/src/9/port/stfcall.c /n/bootesdump/1993/0410/sys/src/9/port/stfcall.c
161,163c
/*
* the lock here is wrong. it should be a qlock since
* the pullup may block. not worth fixing.
*/
lock(q);
bp = q->first = pullup(q->first, len);
if(bp == 0)
q->len = 0;
unlock(q);
.
## diffname port/stfcall.c 1993/0501
## diff -e /n/bootesdump/1993/0410/sys/src/9/port/stfcall.c /n/fornaxdump/1993/0501/sys/src/brazil/port/stfcall.c
161,170c
pullup(q->first, len);
bp = q->first;
.
56a
[Tauth] 69,
[Rauth] 35,
.
33,34c
[Tattach] 89,
[Rattach] 13,
.
27,28c
[Tsession] 3,
[Rsession] 3,
.
## diffname port/stfcall.c 1993/0804 # deleted
## diff -e /n/fornaxdump/1993/0501/sys/src/brazil/port/stfcall.c /n/fornaxdump/1993/0804/sys/src/brazil/port/stfcall.c
1,172d
|