~kris/9p

9hist

fc940f632b70ec6a2b9b27f6176296863383746f — David du Colombier 33 years ago 89aa053
Plan 9 from Bell Labs 1993-04-07
4 files changed, 100 insertions(+), 50 deletions(-)

M boot/aux.c
M port/auth.c
M port/devscsi.c
M port/portdat.h
M boot/aux.c => boot/aux.c +0 -1
@@ 120,7 120,6 @@ srvcreate(char *name, int fd)
	int f;
	char buf[2*NAMELEN];

	print("post(%s)...", name);
	srvname = strrchr(name, '/');
	if(srvname)
		srvname++;

M port/auth.c => port/auth.c +50 -39
@@ 96,58 96,71 @@ sysfsession(ulong *arg)
{
	int i, n;
	Chan *c;
	Fcall *f;
	char *buf;
	Crypt *cp;
	Session *s;
	Ticketreq tr;
	Fcall f;
	char buf[MAXMSG];

	validaddr(arg[1], TICKREQLEN, 1);
	f = malloc(sizeof(Fcall));
	if(f == 0)
		error(Enomem);
	buf = malloc(MAXMSG);
	if(buf == 0){
		free(f);
		error(Enomem);
	}
	c = fdtochan(arg[0], OWRITE, 0, 1);
	s = 0;
	if(waserror()) {
		if(s)
			free(s);
	if(waserror()){
		close(c);
		free(buf);
		free(f);
		nexterror();
	}

	/*
	 *  if two processes get here at the same
	 *  time with no session exchanged, we have
	 *  a race.
	 */
	s = c->session;
	if(s == 0){
		/*  exchange a session message with the server */
		/*
		 *  no session exchanged yet
		 */
		s = malloc(sizeof(Session));
		if(s == 0)
			error(Enomem);
		memset(s, 0, sizeof(Session));
		for(i = 0; i < CHALLEN; i++)
			s->cchal[i] = nrand(256);
		f->tag = NOTAG;
		f->type = Tsession;
		memmove(f->chal, s->cchal, CHALLEN);
		n = convS2M(f, buf);
		if((*devtab[c->type].write)(c, buf, n, 0) != n)
			error(Emountrpc);
	dkhack:
		n = (*devtab[c->type].read)(c, buf, MAXMSG, 0);
		if(n == 2 && buf[0] == 'O' && buf[1] == 'K')
			goto dkhack;
		if(convM2S(buf, f, n) == 0)
			error(Emountrpc);
		if(f->type == Rsession){
			memmove(s->schal, f->chal, CHALLEN);
			memmove(s->authid, f->authid, NAMELEN);
			memmove(s->authdom, f->authdom, DOMLEN);

		/*
		 *  Exchange a session message with the server.
		 *  If an error occurs reading or writing,
		 *  assume this is a mount of a mount and turn off
		 *  authentication.
		 */
		if(!waserror()){
			for(i = 0; i < CHALLEN; i++)
				s->cchal[i] = nrand(256);
			f.tag = NOTAG;
			f.type = Tsession;
			memmove(f.chal, s->cchal, CHALLEN);
			n = convS2M(&f, buf);
			if((*devtab[c->type].write)(c, buf, n, 0) != n)
				error(Emountrpc);
			n = (*devtab[c->type].read)(c, buf, sizeof buf, 0);
			if(n == 2 && buf[0] == 'O' && buf[1] == 'K')
				n = (*devtab[c->type].read)(c, buf, sizeof buf, 0);
			poperror();
			if(convM2S(buf, &f, n) == 0){
				free(s);
				error(Emountrpc);
			}
			switch(f.type){
			case Rsession:
				memmove(s->schal, f.chal, CHALLEN);
				memmove(s->authid, f.authid, NAMELEN);
				memmove(s->authdom, f.authdom, DOMLEN);
				break;
			case Rerror:
				free(s);
				error(f.ename);
			default:
				free(s);
				error(Emountrpc);
			}
		}
		s->cid = 0;
		c->session = s;
	}



@@ 172,10 185,8 @@ sysfsession(ulong *arg)
	memmove(tr.hostid, eve, NAMELEN);
	convTR2M(&tr, (char*)arg[1]);

	poperror();
	close(c);
	free(buf);
	free(f);
	poperror();
	return 0;
}


M port/devscsi.c => port/devscsi.c +48 -10
@@ 297,6 297,7 @@ scsicmd(int dev, int cmdbyte, Scsibuf *b, long size)
	cmd->cmd.ptr = cmd->cmd.base;
	memset(cmd->cmdblk, 0, sizeof cmd->cmdblk);
	cmd->cmdblk[0] = cmdbyte;
	cmd->cmdblk[1] = cmd->lun << 5;
	switch(cmdbyte >> 5){
	case 0:
		cmd->cmd.lim = &cmd->cmdblk[6];


@@ 497,16 498,34 @@ int
scsibread(int dev, Scsibuf *b, long n, long blocksize, long blockno)
{
	Scsi *cmd;
	int cmdbyte;

	cmd = scsicmd(dev, ScsiRead, b, n*blocksize);
	if(blockno <= 0x1fffff && n <= 256)
		cmdbyte = ScsiRead;
	else
		cmdbyte = ScsiExtread;

	cmd = scsicmd(dev, cmdbyte, b, n*blocksize);
	if(waserror()){
		qunlock(cmd);
		nexterror();
	}
	cmd->cmdblk[1] = blockno >> 16;
	cmd->cmdblk[2] = blockno >> 8;
	cmd->cmdblk[3] = blockno;
	cmd->cmdblk[4] = n;
	switch(cmdbyte){
	case ScsiRead:
		cmd->cmdblk[1] |= blockno >> 16;
		cmd->cmdblk[2] = blockno >> 8;
		cmd->cmdblk[3] = blockno;
		cmd->cmdblk[4] = n;
		break;
	default:
		cmd->cmdblk[2] = blockno >> 24;
		cmd->cmdblk[3] = blockno >> 16;
		cmd->cmdblk[4] = blockno >> 8;
		cmd->cmdblk[5] = blockno;
		cmd->cmdblk[7] = n>>8;
		cmd->cmdblk[8] = n;
		break;
	}
	scsiexec(cmd, ScsiIn);
	n = cmd->data.ptr - cmd->data.base;
	poperror();


@@ 519,15 538,34 @@ scsibwrite(int dev, Scsibuf *b, long n, long blocksize, long blockno)
{
	Scsi *cmd;

	cmd = scsicmd(dev, ScsiWrite, b, n*blocksize);
	int cmdbyte;

	if(blockno <= 0x1fffff && n <= 256)
		cmdbyte = ScsiWrite;
	else
		cmdbyte = ScsiExtwrite;

	cmd = scsicmd(dev, cmdbyte, b, n*blocksize);
	if(waserror()){
		qunlock(cmd);
		nexterror();
	}
	cmd->cmdblk[1] = blockno >> 16;
	cmd->cmdblk[2] = blockno >> 8;
	cmd->cmdblk[3] = blockno;
	cmd->cmdblk[4] = n;
	switch(cmdbyte){
	case ScsiWrite:
		cmd->cmdblk[1] |= blockno >> 16;
		cmd->cmdblk[2] = blockno >> 8;
		cmd->cmdblk[3] = blockno;
		cmd->cmdblk[4] = n;
		break;
	default:
		cmd->cmdblk[2] = blockno >> 24;
		cmd->cmdblk[3] = blockno >> 16;
		cmd->cmdblk[4] = blockno >> 8;
		cmd->cmdblk[5] = blockno;
		cmd->cmdblk[7] = n>>8;
		cmd->cmdblk[8] = n;
		break;
	}
	scsiexec(cmd, ScsiOut);
	n = cmd->data.ptr - cmd->data.base;
	poperror();

M port/portdat.h => port/portdat.h +2 -0
@@ 231,6 231,8 @@ enum
	ScsiGetcap	= 0x25,
	ScsiRead	= 0x08,
	ScsiWrite	= 0x0a,
	ScsiExtread	= 0x28,
	ScsiExtwrite	= 0x2a,

	/* data direction */
	ScsiIn		= 1,