From fc940f632b70ec6a2b9b27f6176296863383746f Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 7 Apr 1993 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1993-04-07 --- boot/aux.c | 1 - port/auth.c | 89 ++++++++++++++++++++++++++++---------------------- port/devscsi.c | 58 ++++++++++++++++++++++++++------ port/portdat.h | 2 ++ 4 files changed, 100 insertions(+), 50 deletions(-) diff --git a/boot/aux.c b/boot/aux.c index 4fbc3423418a366abf5301c21676b683e4458fe5..55ba8af27a79eead678b9611aec5fa6de53301ca 100644 --- a/boot/aux.c +++ b/boot/aux.c @@ -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++; diff --git a/port/auth.c b/port/auth.c index ca24fdb76106730d0872b39b8adfc5a3e25c3486..656d1a9289007017493af1e7917b730fe9c4392d 100644 --- a/port/auth.c +++ b/port/auth.c @@ -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; } diff --git a/port/devscsi.c b/port/devscsi.c index d6f0a83c28f7a0cc2a0a6b63bc97d02df551cf9d..d25b2274b8fdf1a79e2c87705269d8be85e294db 100644 --- a/port/devscsi.c +++ b/port/devscsi.c @@ -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(); diff --git a/port/portdat.h b/port/portdat.h index 29ae6b93ed5dd47da1cb2ce3fa52b7d3dbc98051..222cf3d0c97b53f5ecd0fdf9bbfebcaf3b3427b3 100644 --- a/port/portdat.h +++ b/port/portdat.h @@ -231,6 +231,8 @@ enum ScsiGetcap = 0x25, ScsiRead = 0x08, ScsiWrite = 0x0a, + ScsiExtread = 0x28, + ScsiExtwrite = 0x2a, /* data direction */ ScsiIn = 1,