~kris/9p

9hist

b89606ecb8d2ef58269e4c794b940801a19f3920 — David du Colombier 28 years ago 2aa11f6
Plan 9 from Bell Labs 1998-03-19
M carrera/devether.c => carrera/devether.c +3 -2
@@ 65,9 65,10 @@ etherclose(Chan* chan)
}

static long
etherread(Chan* chan, void* buf, long n, ulong offset)
etherread(Chan* chan, void* buf, long n, vlong off)
{
	Ether *ether;
	ulong offset = off;

	ether = etherxx[chan->dev];
	if((chan->qid.path & CHDIR) == 0 && ether->dev && ether->dev->ifstat){


@@ 231,7 232,7 @@ etheroq(Ether* ether, Block* bp)
}

static long
etherwrite(Chan* chan, void* buf, long n, ulong)
etherwrite(Chan* chan, void* buf, long n, vlong)
{
	Ether *ether;
	Block *bp;

M carrera/devrtc.c => carrera/devrtc.c +5 -5
@@ 112,9 112,8 @@ rtcopen(Chan *c, int omode)
}

static void	 
rtcclose(Chan *c)
rtcclose(Chan*)
{
	USED(c);
}

static long	 


@@ 200,9 199,10 @@ rtctime(void)
}

static long	 
rtcread(Chan *c, void *buf, long n, ulong offset)
rtcread(Chan *c, void *buf, long n, vlong off)
{
	uchar *f, *to, *e;
	ulong offset = off;

	if(c->qid.path & CHDIR)
		return devdirread(c, buf, n, rtcdir, nelem(rtcdir), devgen);


@@ 227,15 227,15 @@ rtcread(Chan *c, void *buf, long n, ulong offset)
}

static long	 
rtcwrite(Chan *c, void *buf, long n, ulong offset)
rtcwrite(Chan *c, void *buf, long n, vlong off)
{
	Rtc rtc;
	ulong secs;
	char *cp, *ep;
	uchar *f, *t, *e;
	uchar x;
	ulong offset = off;

	USED(c);
	switch(c->qid.path){
	case Qrtc:
		/*

M ip/devip.c => ip/devip.c +3 -2
@@ 509,13 509,14 @@ enum
};

static long
ipread(Chan *ch, void *a, long n, ulong offset)
ipread(Chan *ch, void *a, long n, vlong off)
{
	Conv *c;
	Proto *x;
	char *buf, *p;
	long m, rv;
	Fs *f;
	ulong offset = off;

	f = ipfs[ch->dev];



@@ 839,7 840,7 @@ ttlctlmsg(Conv *c, Cmdbuf *cb)
}

static long
ipwrite(Chan* ch, char* a, long n, ulong)
ipwrite(Chan* ch, char* a, long n, vlong)
{
	Conv *c;
	Proto *x;

M ip/kernel.h => ip/kernel.h +1 -1
@@ 4,7 4,7 @@ extern	void	kerrstr(char*);
extern	void	kgerrstr(char*);
extern	long	kopen(char*, int);
extern	long	kread(int, void*, long);
extern	long	kseek(int, int, int);
extern	long	kseek(int, vlong, int);
extern	long	kwrite(int, void*, long);
extern	void	kwerrstr(char *, ...);


M ip/kio.c => ip/kio.c +4 -3
@@ 88,7 88,7 @@ kread(int fd, void *va, long n)
}

long
kseek(int fd, int offset, int whence)
kseek(int fd, vlong offset, int whence)
{
	Chan *c;
	char buf[DIRLEN];


@@ 112,7 112,8 @@ kseek(int fd, int offset, int whence)
	off = 0;
	switch(whence) {
	case 0:
		off = c->offset = offset;
		off = offset;
		c->offset = offset;
		break;
	case 1:
		lock(c);	/* lock for read/write update */


@@ 123,7 124,7 @@ kseek(int fd, int offset, int whence)
	case 2:
		devtab[c->type]->stat(c, buf);
		convM2D(buf, &dir);
		c->offset = dir.length + offset;
		c->offset = dir.length2 + offset;	/* BOTCH */
		off = c->offset;
		break;
	}

M pc/devastar.c => pc/devastar.c +7 -5
@@ 334,14 334,13 @@ setpage(Astar *a, ulong offset)
 *  generate the astar directory entries
 */
static int
astargen(Chan *c, Dirtab *tab, int ntab, int i, Dir *db)
astargen(Chan *c, Dirtab *, int , int i, Dir *db)
{
	int dev, sofar, ch, t;
	extern ulong kerndate;

	memset(db, 0, sizeof(Dir));

	USED(tab, ntab);
	sofar = 0;

	for(dev = 0; dev < nastar; dev++){


@@ 349,7 348,8 @@ astargen(Chan *c, Dirtab *tab, int ntab, int i, Dir *db)
			sprint(db->name, "astar%dmem", astar[dev]->id);
			db->qid.path = QID(dev, 0, Qmem);
			db->mode = 0660;
			db->length = astar[dev]->memsize;
			db->length1 = astar[dev]->memsize; /* BOTCH */
			db->length2 = astar[dev]->memsize; /* BOTCH */
			break;
		}
		sofar++;


@@ 779,10 779,11 @@ statread(Astarchan *ac, void *buf, long n, ulong offset)
}

static long
astarread(Chan *c, void *buf, long n, ulong offset)
astarread(Chan *c, void *buf, long n, vlong off)
{
	Astar *a;
	Astarchan *ac;
	ulong offset = off;

	if(c->qid.path & CHDIR)
		return devdirread(c, buf, n, 0, 0, astargen);


@@ 1382,11 1383,12 @@ astarctl(Astarchan *ac, char *cmd)
}

static long
astarwrite(Chan *c, void *buf, long n, ulong offset)
astarwrite(Chan *c, void *buf, long n, vlong off)
{
	Astar *a;
	Astarchan *ac;
	char cmsg[32];
	ulong offset = off;

	if(c->qid.path & CHDIR)
		error(Eperm);

M pc/devata.c => pc/devata.c +4 -2
@@ 634,7 634,7 @@ ataclose(Chan* c)
}

static long
ataread(Chan* c, void* a, long n, ulong offset)
ataread(Chan* c, void* a, long n, vlong off)
{
	Drive *dp;
	long rv, i;


@@ 642,6 642,7 @@ ataread(Chan* c, void* a, long n, ulong offset)
	uchar *aa = a;
	Partition *pp;
	uchar *buf;
	ulong offset = off;

	if(c->qid.path == CHDIR)
		return devdirread(c, a, n, 0, 0, atagen);


@@ 688,13 689,14 @@ ataread(Chan* c, void* a, long n, ulong offset)
}

static long
atawrite(Chan *c, void *a, long n, ulong offset)
atawrite(Chan *c, void *a, long n, vlong off)
{
	Drive *dp;
	long rv, i, partial;
	uchar *aa = a;
	Partition *pp;
	uchar *buf;
	ulong offset = off;

	if(c->qid.path == CHDIR)
		error(Eisdir);

M pc/devether.c => pc/devether.c +3 -2
@@ 65,9 65,10 @@ etherclose(Chan* chan)
}

static long
etherread(Chan* chan, void* buf, long n, ulong offset)
etherread(Chan* chan, void* buf, long n, vlong off)
{
	Ether *ether;
	ulong offset = off;

	ether = etherxx[chan->dev];
	if((chan->qid.path & CHDIR) == 0 && ether->ifstat){


@@ 225,7 226,7 @@ etheroq(Ether* ether, Block* bp)
}

static long
etherwrite(Chan* chan, void* buf, long n, ulong)
etherwrite(Chan* chan, void* buf, long n, vlong)
{
	Ether *ether;
	Block *bp;

M pc/devfloppy.c => pc/devfloppy.c +8 -10
@@ 230,9 230,8 @@ floppyopen(Chan *c, int omode)
}

static void
floppyclose(Chan *c)
floppyclose(Chan *)
{
	USED(c);
}

static void


@@ 319,13 318,14 @@ readtrack(FDrive *dp, int cyl, int head)
}

static long
floppyread(Chan *c, void *a, long n, ulong offset)
floppyread(Chan *c, void *a, long n, vlong off)
{
	FDrive *dp;
	long rv;
	int sec, head, cyl;
	long len;
	uchar *aa;
	ulong offset = off;

	if(c->qid.path == CHDIR)
		return devdirread(c, a, n, floppydir, fl.ndrive*NFDIR, devgen);


@@ 373,12 373,13 @@ floppyread(Chan *c, void *a, long n, ulong offset)

#define SNCMP(a, b) strncmp(a, b, sizeof(b)-1)
static long
floppywrite(Chan *c, void *a, long n, ulong offset)
floppywrite(Chan *c, void *a, long n, vlong off)
{
	FDrive *dp;
	long rv, i;
	char *aa = a;
	char ctlmsg[64];
	ulong offset = off;

	rv = 0;
	dp = &fl.d[c->qid.path & ~Qmask];


@@ 438,11 439,10 @@ floppywrite(Chan *c, void *a, long n, ulong offset)
}

static void
floppykproc(void *a)
floppykproc(void *)
{
	FDrive *dp;

	USED(a);
	while(waserror())
		;
	for(;;){


@@ 622,9 622,8 @@ floppysense(void)
}

static int
cmddone(void *a)
cmddone(void *)
{
	USED(a);
	return fl.ncmd == 0;
}



@@ 982,9 981,8 @@ floppyformat(FDrive *dp, char *params)
}

static void
floppyintr(Ureg *ur)
floppyintr(Ureg *)
{
	USED(ur);
	switch(fl.cmd[0]&~Fmulti){
	case Fread:
	case Fwrite:

M pc/devi82365.c => pc/devi82365.c +10 -14
@@ 278,12 278,11 @@ slotdis(Slot *pp)
 *  status change interrupt
 */
static void
i82365intr(Ureg *ur, void *a)
i82365intr(Ureg *, void *)
{
	uchar csc, was;
	Slot *pp;

	USED(ur,a);
	if(slot == 0)
		return;



@@ 469,7 468,7 @@ enum
#define QID(s,t)	(((s)<<8)|(t))

static int
pcmgen(Chan *c, Dirtab *tab, int ntab, int i, Dir *dp)
pcmgen(Chan *c, Dirtab *, int , int i, Dir *dp)
{
	int slotno;
	Qid qid;


@@ 477,8 476,7 @@ pcmgen(Chan *c, Dirtab *tab, int ntab, int i, Dir *dp)
	Slot *pp;
	char name[NAMELEN];

	USED(tab, ntab);
	if(i>=3*nslot)
	if(i >= 3*nslot)
		return -1;
	slotno = i/3;
	pp = slot + slotno;


@@ 755,11 753,12 @@ pcmread(int slotno, int attr, void *a, long n, ulong offset)
}

static long
i82365read(Chan *c, void *a, long n, ulong offset)
i82365read(Chan *c, void *a, long n, vlong off)
{
	char *p;
	int len;
	Slot *pp;
	ulong offset = off;

	switch(TYPE(c)){
	case Qdir:


@@ 836,10 835,11 @@ pcmwrite(int dev, int attr, void *a, long n, ulong offset)
}

static long
i82365write(Chan *c, void *a, long n, ulong offset)
i82365write(Chan *c, void *a, long n, vlong off)
{
	Slot *pp;
	char buf[32];
	ulong offset = off;

	switch(TYPE(c)){
	case Qctl:


@@ 1086,12 1086,11 @@ getlong(Slot *pp, int size)
}

static void
tcfig(Slot *pp, int ttype)
tcfig(Slot *pp, int )
{
	uchar size, rasize, rmsize;
	uchar last;

	USED(ttype);
	if(readc(pp, &size) != 1)
		return;
	rasize = (size&0x3) + 1;


@@ 1279,13 1278,11 @@ memspace(Slot *pp, int asize, int lsize, int host)
}

static void
tentry(Slot *pp, int ttype)
tentry(Slot *pp, int )
{
	uchar c, i, feature;
	Conftab *ct;

	USED(ttype);

	if(pp->nctab >= Maxctab)
		return;
	if(readc(pp, &c) != 1)


@@ 1352,12 1349,11 @@ tentry(Slot *pp, int ttype)
}

static void
tvers1(Slot *pp, int ttype)
tvers1(Slot *pp, int )
{
	uchar c, major, minor;
	int  i;

	USED(ttype);
	if(readc(pp, &major) != 1)
		return;
	if(readc(pp, &minor) != 1)

M pc/devlpt.c => pc/devlpt.c +11 -10
@@ 108,29 108,31 @@ lptopen(Chan *c, int omode)
}

static void
lptclose(Chan *c)
lptclose(Chan *)
{
	USED(c);
}

static long
lptread(Chan *c, void *a, long n, ulong)
lptread(Chan *c, void *a, long n, vlong)
{
	char str[16]; int size;
	char str[16];
	int size;
	ulong o;

	if(c->qid.path == CHDIR)
		return devdirread(c, a, n, lptdir, nelem(lptdir), lptgen);
	size = sprint(str, "0x%2.2ux\n", inb(c->qid.path));
	if(c->offset >= size)
	o = c->offset;
	if(o >= size)
		return 0;
	if(c->offset+n > size)
	if(o+n > size)
		n = size-c->offset;
	memmove(a, str+c->offset, n);
	memmove(a, str+o, n);
	return n;
}

static long
lptwrite(Chan *c, void *a, long n, ulong)
lptwrite(Chan *c, void *a, long n, vlong)
{
	char str[16], *p;
	long base, k;


@@ 186,9 188,8 @@ lptready(void *base)
}

static void
lptintr(Ureg *ur, void *arg)
lptintr(Ureg *, void *)
{
	USED(ur, arg);
	wakeup(&lptrendez);
}


M pc/devrtc.c => pc/devrtc.c +4 -2
@@ 166,10 166,11 @@ rtctime(void)
}

static long	 
rtcread(Chan* c, void* buf, long n, ulong offset)
rtcread(Chan* c, void* buf, long n, vlong off)
{
	ulong t;
	char *a;
	ulong offset = off;

	if(c->qid.path & CHDIR)
		return devdirread(c, buf, n, rtcdir, nelem(rtcdir), devgen);


@@ 205,7 206,7 @@ rtcread(Chan* c, void* buf, long n, ulong offset)
#define PUTBCD(n,o) bcdclock[o] = (n % 10) | (((n / 10) % 10)<<4)

static long	 
rtcwrite(Chan* c, void* buf, long n, ulong offset)
rtcwrite(Chan* c, void* buf, long n, vlong off)
{
	int t;
	char *a;


@@ 213,6 214,7 @@ rtcwrite(Chan* c, void* buf, long n, ulong offset)
	ulong secs;
	uchar bcdclock[Nbcd];
	char *cp, *ep;
	ulong offset = off;

	if(offset!=0)
		error(Ebadarg);

M pc/devvga.c => pc/devvga.c +4 -2
@@ 65,13 65,14 @@ vgaclose(Chan*)
}

static long
vgaread(Chan* c, void* a, long n, ulong offset)
vgaread(Chan* c, void* a, long n, vlong off)
{
	int len, port;
	char *p, *s;
	ushort *sp;
	ulong *lp;
	VGAscr *scr;
	ulong offset = off;

	switch(c->qid.path & ~CHDIR){



@@ 246,12 247,13 @@ vgactl(char* a)
}

static long
vgawrite(Chan* c, void* a, long n, ulong offset)
vgawrite(Chan* c, void* a, long n, vlong off)
{
	int port;
	char *p;
	ushort *sp;
	ulong *lp;
	ulong offset = off;

	switch(c->qid.path & ~CHDIR){


M pc/ether8390.c => pc/ether8390.c +1 -5
@@ 633,13 633,11 @@ setfilter(Ether *ether, Dp8390 *ctlr)
}

static void
promiscuous(void *arg, int on)
promiscuous(void *arg, int )
{
	Ether *ether;
	Dp8390 *ctlr;

	USED(on);

	ether = arg;
	ctlr = ether->ctlr;



@@ 676,8 674,6 @@ multicast(void* arg, uchar *addr, int on)
	int i;
	ulong h;

	USED(on);

	ether = arg;
	ctlr = ether->ctlr;
	if(reverse[1] == 0){

M pc/etherelnk3.c => pc/etherelnk3.c +1 -1
@@ 1411,7 1411,7 @@ static struct xxx {
#endif /* notdef */

static int
autoselect(int port, int xcvr, int is9)
autoselect(int port, int , int is9)
{
	int media, x;


M pc/screen.h => pc/screen.h +15 -10
@@ 14,16 14,6 @@ extern int mouseputc(void*, int);
extern int mouseswap;

extern Cursorinfo cursor;

/* mouse.c */
extern void mousectl(char*);

/* screen.c */
extern void flushmemscreen(Rectangle);
extern int cursoron(int);
extern void cursoroff(int);
extern void setcursor(Cursor*);

extern Cursor arrow;

/*


@@ 114,3 104,18 @@ extern VGAscr vgascreen[];
enum {
	Backgnd		= Pwhite,
};

/* mouse.c */
extern void mousectl(char*);

/* screen.c */
extern void	flushmemscreen(Rectangle);
extern int	cursoron(int);
extern void	cursoroff(int);
extern void	setcursor(Cursor*);
extern int	screensize(int, int, int);
extern int	screenaperture(int, int);

/* vga.c */
extern void	vgascreenwin(VGAscr*);


M pc/u.h => pc/u.h +2 -4
@@ 10,11 10,9 @@ typedef ushort		Rune;

union Length
{
	char	clength[8];
	vlong	vlength;
	struct{
		long	hlength;
		long	length;
		long	length1;
		long	length2;
	};
};


M port/dev.c => port/dev.c +2 -2
@@ 37,8 37,8 @@ devdir(Chan *c, Qid qid, char *n, long length, char *user, long perm, Dir *db)
		db->mode |= CHMOUNT;
	db->atime = seconds();
	db->mtime = kerndate;
	db->hlength = 0;
	db->length = length;
	db->length1 = length;	/* BOTCH */
	db->length2 = length;	/* BOTCH */
	memmove(db->uid, user, NAMELEN);
	memmove(db->gid, eve, NAMELEN);
}

M port/devaudio.c => port/devaudio.c +3 -2
@@ 895,13 895,14 @@ audioclose(Chan *c)
}

static long
audioread(Chan *c, char *a, long n, ulong offset)
audioread(Chan *c, char *a, long n, vlong off)
{
	int liv, riv, lov, rov;
	long m, n0;
	char buf[300];
	Buf *b;
	int j;
	ulong offset = off;

	n0 = n;
	switch(c->qid.path & ~CHDIR) {


@@ 989,7 990,7 @@ audioread(Chan *c, char *a, long n, ulong offset)
}

static long
audiowrite(Chan *c, char *a, long n, ulong)
audiowrite(Chan *c, char *a, long n, vlong)
{
	long m, n0;
	int i, nf, v, left, right, in, out;

M port/devcons.c => port/devcons.c +4 -2
@@ 490,7 490,7 @@ consclose(Chan *c)
}

static long
consread(Chan *c, void *buf, long n, ulong offset)
consread(Chan *c, void *buf, long n, vlong off)
{
	ulong l;
	Mach *mp;


@@ 498,6 498,7 @@ consread(Chan *c, void *buf, long n, ulong offset)
	char tmp[128];		/* must be >= 6*NUMSIZE */
	char *cbuf = buf;
	int ch, i, k, id, eol;
	ulong offset = off;

	if(n <= 0)
		return n;


@@ 689,7 690,7 @@ consread(Chan *c, void *buf, long n, ulong offset)
}

static long
conswrite(Chan *c, void *va, long n, ulong offset)
conswrite(Chan *c, void *va, long n, vlong off)
{
	char cbuf[64];
	char buf[256];


@@ 698,6 699,7 @@ conswrite(Chan *c, void *va, long n, ulong offset)
	Mach *mp;
	int id, fd;
	Chan *swc;
	ulong offset = off;

	switch(c->qid.path){
	case Qcons:

M port/devdraw.c => port/devdraw.c +4 -2
@@ 938,7 938,7 @@ drawclose(Chan *c)
}

long
drawread(Chan *c, void *a, long n, ulong offset)
drawread(Chan *c, void *a, long n, vlong off)
{
	int index, m;
	ulong red, green, blue;


@@ 947,6 947,7 @@ drawread(Chan *c, void *a, long n, ulong offset)
	Refresh *r;
	DImage *di;
	Memimage *i;
	ulong offset = off;

	USED(offset);
	if(c->qid.path & CHDIR)


@@ 1053,11 1054,12 @@ drawwakeall(void)
}

static long
drawwrite(Chan *c, void *a, long n, ulong offset)
drawwrite(Chan *c, void *a, long n, vlong off)
{
	char buf[128], *fields[4], *q;
	Client *cl;
	int i, m, red, green, blue, x;
	ulong offset = off;

	USED(offset);
	if(c->qid.path & CHDIR)

M port/devdup.c => port/devdup.c +2 -2
@@ 68,7 68,7 @@ dupclose(Chan*)
}

static long
dupread(Chan *c, void *va, long n, ulong)
dupread(Chan *c, void *va, long n, vlong)
{
	char *a = va;



@@ 78,7 78,7 @@ dupread(Chan *c, void *va, long n, ulong)
}

static long
dupwrite(Chan*, void*, long, ulong)
dupwrite(Chan*, void*, long, vlong)
{
	panic("dupwrite");
	return 0;		/* not reached */

M port/devenv.c => port/devenv.c +4 -2
@@ 162,10 162,11 @@ envclose(Chan*)
}

static long
envread(Chan *c, void *a, long n, ulong offset)
envread(Chan *c, void *a, long n, vlong off)
{
	Egrp *eg;
	Evalue *e;
	ulong offset = off;

	if(c->qid.path & CHDIR)
		return devdirread(c, a, n, 0, 0, envgen);


@@ 192,12 193,13 @@ envread(Chan *c, void *a, long n, ulong offset)
}

static long
envwrite(Chan *c, void *a, long n, ulong offset)
envwrite(Chan *c, void *a, long n, vlong off)
{
	char *s;
	int vend;
	Egrp *eg;
	Evalue *e;
	ulong offset = off;

	if(n <= 0)
		return 0;

M port/devkprof.c => port/devkprof.c +3 -2
@@ 109,11 109,12 @@ kprofclose(Chan*)
}

static long
kprofread(Chan *c, void *va, long n, ulong offset)
kprofread(Chan *c, void *va, long n, vlong off)
{
	ulong end;
	ulong w, *bp;
	uchar *a, *ea;
	ulong offset = off;

	switch(c->qid.path & ~CHDIR){
	case Kprofdirqid:


@@ 150,7 151,7 @@ kprofread(Chan *c, void *va, long n, ulong offset)
}

static long
kprofwrite(Chan *c, char *a, long n, ulong)
kprofwrite(Chan *c, char *a, long n, vlong)
{
	switch((int)(c->qid.path&~CHDIR)){
	case Kprofctlqid:

M port/devmnt.c => port/devmnt.c +5 -2
@@ 481,10 481,11 @@ mntread9p(Chan *c, void *buf, long n, ulong offset)
}

static long	 
mntread(Chan *c, void *buf, long n, ulong offset)
mntread(Chan *c, void *buf, long n, vlong off)
{
	uchar *p, *e;
	int nc, cache, isdir;
	ulong offset = off;

	isdir = 0;
	cache = c->flag & CCACHE;


@@ 524,8 525,10 @@ mntwrite9p(Chan *c, void *buf, long n, ulong offset)
}

static long	 
mntwrite(Chan *c, void *buf, long n, ulong offset)
mntwrite(Chan *c, void *buf, long n, vlong off)
{
	ulong offset = off;

	return mntrdwr(Twrite, c, buf, n, offset);
}


M port/devmouse.c => port/devmouse.c +3 -2
@@ 159,11 159,12 @@ mouseclose(Chan *c)


static long
mouseread(Chan *c, void *va, long n, ulong offset)
mouseread(Chan *c, void *va, long n, vlong off)
{
	char buf[4*12+1];
	uchar *p;
	static int map[8] = {0, 4, 2, 6, 1, 5, 3, 7 };
	ulong offset = off;

	p = va;
	switch(c->qid.path){


@@ 206,7 207,7 @@ mouseread(Chan *c, void *va, long n, ulong offset)
}

static long
mousewrite(Chan *c, void *va, long n, ulong)
mousewrite(Chan *c, void *va, long n, vlong)
{
	char *p;
	Point pt;

M port/devns16552.c => port/devns16552.c +3 -2
@@ 808,9 808,10 @@ for(j = 0; j < 8; j++) i+=sprint(str+i, " %ux", uartrdreg(p, j));
}

static long
ns16552read(Chan *c, void *buf, long n, ulong offset)
ns16552read(Chan *c, void *buf, long n, vlong off)
{
	Uart *p;
	ulong offset = off;

	if(c->qid.path & CHDIR){
		setlength(-1);


@@ 907,7 908,7 @@ ns16552ctl(Uart *p, char *cmd)
}

static long
ns16552write(Chan *c, void *buf, long n, ulong)
ns16552write(Chan *c, void *buf, long n, vlong)
{
	Uart *p;
	char cmd[32];

M port/devpipe.c => port/devpipe.c +2 -2
@@ 243,7 243,7 @@ pipeclose(Chan *c)
}

static long
piperead(Chan *c, void *va, long n, ulong)
piperead(Chan *c, void *va, long n, vlong)
{
	Pipe *p;



@@ 284,7 284,7 @@ pipebread(Chan *c, long n, ulong offset)
 *  the process.
 */
static long
pipewrite(Chan *c, void *va, long n, ulong)
pipewrite(Chan *c, void *va, long n, vlong)
{
	Pipe *p;


M port/devproc.c => port/devproc.c +4 -2
@@ 284,7 284,7 @@ procclose(Chan * c)
}

static long
procread(Chan *c, void *va, long n, ulong offset)
procread(Chan *c, void *va, long n, vlong off)
{
	long l;
	Proc *p;


@@ 296,6 296,7 @@ procread(Chan *c, void *va, long n, ulong offset)
	char *a = va, *sps;
	int i, j, rsize, pid;
	char statbuf[NSEG*32];
	ulong offset = off;

	if(c->qid.path & CHDIR)
		return devdirread(c, a, n, 0, 0, procgen);


@@ 563,11 564,12 @@ mntscan(Mntwalk *mw)
}

static long
procwrite(Chan *c, void *va, long n, ulong offset)
procwrite(Chan *c, void *va, long n, vlong off)
{
	int id;
	Proc *p, *t, *et;
	char *a, buf[ERRLEN];
	ulong offset = off;

	a = va;
	if(c->qid.path & CHDIR)

M port/devroot.c => port/devroot.c +3 -2
@@ 143,12 143,13 @@ rdrdy(void*)
}

static long	 
rootread(Chan *c, void *buf, long n, ulong offset)
rootread(Chan *c, void *buf, long n, vlong off)
{
	ulong t;
	Dirtab *d;
	uchar *data;
	Recover *r;
	ulong offset = off;

	t = c->qid.path & ~CHDIR;
	switch(t){


@@ 193,7 194,7 @@ rootread(Chan *c, void *buf, long n, ulong offset)
}

static long	 
rootwrite(Chan *c, void *buf, long n, ulong)
rootwrite(Chan *c, void *buf, long n, vlong)
{
	char tmp[256];


M port/devsd.c => port/devsd.c +5 -2
@@ 231,8 231,10 @@ sdclose(Chan *c)
}

static long
sdread(Chan *c, void *a, long n, ulong offset)
sdread(Chan *c, void *a, long n, vlong off)
{
	ulong offset = off;

	if(c->qid.path & CHDIR)
		return devdirread(c, a, n, 0, 0, sdgen);



@@ 240,9 242,10 @@ sdread(Chan *c, void *a, long n, ulong offset)
}

static long
sdwrite(Chan *c, char *a, long n, ulong offset)
sdwrite(Chan *c, char *a, long n, vlong off)
{
	Disk *d;
	ulong offset = off;

	d = &disk[DRIVE(c->qid)];


M port/devsrv.c => port/devsrv.c +2 -2
@@ 204,14 204,14 @@ srvclose(Chan*)
}

static long
srvread(Chan *c, void *va, long n, ulong)
srvread(Chan *c, void *va, long n, vlong)
{
	isdir(c);
	return devdirread(c, va, n, 0, 0, srvgen);
}

static long
srvwrite(Chan *c, void *va, long n, ulong)
srvwrite(Chan *c, void *va, long n, vlong)
{
	Srv *sp;
	Chan *c1;

M port/devssl.c => port/devssl.c +4 -2
@@ 515,13 515,14 @@ sslbread(Chan *c, long n, ulong offset)
}

static long
sslread(Chan *c, void *a, long n, ulong offset)
sslread(Chan *c, void *a, long n, vlong off)
{
	volatile struct { Block *b; } b;
	Block *nb;
	uchar *va;
	int i;
	char buf[128];
	ulong offset = off;

	if(c->qid.path & CHDIR)
		return devdirread(c, a, n, 0, 0, sslgen);


@@ 780,12 781,13 @@ parseencryptalg(char *p, Dstate *s)
}

static long
sslwrite(Chan *c, void *a, long n, ulong offset)
sslwrite(Chan *c, void *a, long n, vlong off)
{
	volatile struct { Dstate *s; } s;
	volatile struct { Block *b; } b;
	int m, t;
	char *p, *np, *e, buf[32];
	ulong offset = off;

	s.s = dstate[CONV(c->qid)];
	if(s.s == 0)

M port/portdat.h => port/portdat.h +3 -3
@@ 141,7 141,7 @@ struct Chan
	Ref;
	Chan*	next;			/* allocation */
	Chan*	link;
	ulong	offset;			/* in file */
	vlong	offset;			/* in file */
	ushort	type;
	ulong	dev;
	ushort	mode;			/* read/write */


@@ 179,9 179,9 @@ struct Dev
	Chan*	(*open)(Chan*, int);
	void	(*create)(Chan*, char*, int, ulong);
	void	(*close)(Chan*);
	long	(*read)(Chan*, void*, long, ulong);
	long	(*read)(Chan*, void*, long, vlong);
	Block*	(*bread)(Chan*, long, ulong);
	long	(*write)(Chan*, void*, long, ulong);
	long	(*write)(Chan*, void*, long, vlong);
	long	(*bwrite)(Chan*, Block*, ulong);
	void	(*remove)(Chan*);
	void	(*wstat)(Chan*, char*);

M port/sysfile.c => port/sysfile.c +32 -8
@@ 468,12 468,16 @@ syswrite(ulong *arg)
}

long
sysseek(ulong *arg)
sysvseek(ulong *arg)
{
	Chan *c;
	char buf[DIRLEN];
	Dir dir;
	long off;
	vlong off;
	union {
		vlong v;
		ulong u[2];
	} o;

	c = fdtochan(arg[0], -1, 1, 0);
	if(c->qid.path & CHDIR)


@@ 483,29 487,49 @@ sysseek(ulong *arg)
		error(Eisstream);

	off = 0;
	switch(arg[2]){
	o.u[0] = arg[1];
	o.u[1] = arg[2];
	switch(arg[3]){
	case 0:
		off = c->offset = arg[1];
		off = o.v;
		c->offset = off;
		break;

	case 1:
		lock(c);	/* lock for read/write update */
		c->offset += (long)arg[1];
		off = c->offset;
		off = o.v + c->offset;
		c->offset = off;
		unlock(c);
		break;

	case 2:
		devtab[c->type]->stat(c, buf);
		convM2D(buf, &dir);
		c->offset = dir.length + (long)arg[1];
		off = c->offset;
		off = (long)dir.length2 + o.v;	/* BOTCH */
		c->offset = off;
		break;
	}
	return off;
}

long
sysseek(ulong *arg)
{
	union {
		vlong v;
		ulong u[2];
	} o;
	ulong a[4];

	o.v = arg[1];
	a[0] = arg[0];
	a[1] = o.u[0];
	a[2] = o.u[1];
	a[3] = arg[2];
	return sysvseek(a);
}

long
sysfstat(ulong *arg)
{
	Chan *c;

M port/systab.h => port/systab.h +3 -1
@@ 20,6 20,7 @@ Syscall sysmount;
Syscall sysopen;
Syscall sysread;
Syscall sysseek;
Syscall sysvseek;
Syscall syssleep;
Syscall sysstat;
Syscall sysrfork;


@@ 42,7 43,6 @@ Syscall sysunmount;
Syscall syswait;
Syscall syswrite9p;
Syscall sysread9p;
Syscall	sysdeath;

Syscall *systab[]={
	[SYSR1]		sysr1,


@@ 62,6 62,7 @@ Syscall *systab[]={
	[OPEN]		sysopen,
	[READ]		sysread,
	[SEEK]		sysseek,
	[VSEEK]		sysvseek,
	[SLEEP]		syssleep,
	[STAT]		sysstat,
	[RFORK]		sysrfork,


@@ 104,6 105,7 @@ char *sysctab[]={
	[OPEN]		"Open",
	[READ]		"Read",
	[SEEK]		"Seek",
	[VSEEK]		"Vseek",
	[SLEEP]		"Sleep",
	[STAT]		"Stat",
	[RFORK]		"Rfork",