diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2015-08-21 18:43:25 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2015-08-21 18:43:25 +0200 |
commit | 0ce50ebc5750c15e30c6f2d5ba23a0dd329c6c47 (patch) | |
tree | 632820e8f512fb36342f62fcfb92c517089e6e3c | |
parent | 501774b0968d59994d5012fab62fa8221d8b7923 (diff) | |
download | plan9front-0ce50ebc5750c15e30c6f2d5ba23a0dd329c6c47.tar.xz |
cwfs: remove 9p1 support
-rw-r--r-- | sys/src/cmd/cwfs/9netics32.16k/conf.c | 1 | ||||
-rw-r--r-- | sys/src/cmd/cwfs/9p1.c | 1611 | ||||
-rw-r--r-- | sys/src/cmd/cwfs/9p1.h | 116 | ||||
-rw-r--r-- | sys/src/cmd/cwfs/9p1lib.c | 523 | ||||
-rw-r--r-- | sys/src/cmd/cwfs/9p2.c | 140 | ||||
-rw-r--r-- | sys/src/cmd/cwfs/auth.c | 68 | ||||
-rw-r--r-- | sys/src/cmd/cwfs/choline/conf.c | 1 | ||||
-rw-r--r-- | sys/src/cmd/cwfs/config.c | 1 | ||||
-rw-r--r-- | sys/src/cmd/cwfs/console.c | 261 | ||||
-rw-r--r-- | sys/src/cmd/cwfs/cwfs/conf.c | 1 | ||||
-rw-r--r-- | sys/src/cmd/cwfs/emelie/conf.c | 1 | ||||
-rw-r--r-- | sys/src/cmd/cwfs/fs/conf.c | 1 | ||||
-rw-r--r-- | sys/src/cmd/cwfs/main.c | 12 | ||||
-rw-r--r-- | sys/src/cmd/cwfs/portfns.h | 36 | ||||
-rw-r--r-- | sys/src/cmd/cwfs/portmkfile | 3 |
15 files changed, 296 insertions, 2480 deletions
diff --git a/sys/src/cmd/cwfs/9netics32.16k/conf.c b/sys/src/cmd/cwfs/9netics32.16k/conf.c index 187b0e054..f3a56452f 100644 --- a/sys/src/cmd/cwfs/9netics32.16k/conf.c +++ b/sys/src/cmd/cwfs/9netics32.16k/conf.c @@ -25,7 +25,6 @@ localconfinit(void) } int (*fsprotocol[])(Msgbuf*) = { - serve9p1, serve9p2, nil, }; diff --git a/sys/src/cmd/cwfs/9p1.c b/sys/src/cmd/cwfs/9p1.c deleted file mode 100644 index 827a541d7..000000000 --- a/sys/src/cmd/cwfs/9p1.c +++ /dev/null @@ -1,1611 +0,0 @@ -#include "all.h" -#include "9p1.h" - -extern Nvrsafe nvr; - -typedef struct { - uchar chal[CHALLEN]; /* locally generated challenge */ - uchar rchal[CHALLEN]; /* remotely generated challenge */ - Lock idlock; - ulong idoffset; /* offset of id vector */ - ulong idvec; /* vector of acceptable id's */ -} Authinfo; - -static void -f_nop(Chan *cp, Fcall*, Fcall*) -{ - if(CHAT(cp)) - fprint(2, "c_nop %d\n", cp->chan); -} - -static void -f_flush(Chan *cp, Fcall*, Fcall*) -{ - if(CHAT(cp)) - fprint(2, "c_flush %d\n", cp->chan); - runlock(&cp->reflock); - wlock(&cp->reflock); - wunlock(&cp->reflock); - rlock(&cp->reflock); -} - -/* - * create a challenge for a fid space - */ -static void -mkchallenge(Authinfo *aip) -{ - int i; - - srand((uintptr)aip + time(nil)); - for(i = 0; i < CHALLEN; i++) - aip->chal[i] = nrand(256); - - aip->idoffset = 0; - aip->idvec = 0; -} - -static void -f_session(Chan *cp, Fcall *in, Fcall *ou) -{ - Authinfo *aip; - - aip = (Authinfo*)cp->authinfo; - - if(CHAT(cp)) - fprint(2, "c_session %d\n", cp->chan); - memmove(aip->rchal, in->chal, sizeof(aip->rchal)); - mkchallenge(aip); - memmove(ou->chal, aip->chal, sizeof(ou->chal)); - if(noauth) - memset(ou->authid, 0, sizeof(ou->authid)); - else - memmove(ou->authid, nvr.authid, sizeof(ou->authid)); - - sprint(ou->authdom, "%s.%s", service, nvr.authdom); - fileinit(cp); -} - -/* - * match a challenge from an attach - */ -static int -authorize(Chan *cp, Fcall *in, Fcall *ou) -{ - Ticket t; - Authenticator a; - int x; - ulong bit; - Authinfo *aip; - - if(noauth) - return 1; - - if(strcmp(in->uname, "none") == 0) - return !nonone || cp->authok; - - if(in->type == Toattach) - return 0; - - /* decrypt and unpack ticket */ - convM2T9p1(in->ticket, &t, nvr.machkey); - if(t.num != AuthTs){ - fprint(2, "9p1: bad AuthTs num\n"); - return 0; - } - - /* decrypt and unpack authenticator */ - convM2A9p1(in->auth, &a, t.key); - if(a.num != AuthAc){ - fprint(2, "9p1: bad AuthAc num\n"); - return 0; - } - - /* challenges must match */ - aip = (Authinfo*)cp->authinfo; - if(memcmp(a.chal, aip->chal, sizeof(a.chal)) != 0){ - fprint(2, "9p1: bad challenge\n"); - return 0; - } - - /* - * the id must be in a valid range. the range is specified by a - * lower bound (idoffset) and a bit vector (idvec) where a - * bit set to 1 means unusable - */ - lock(&aip->idlock); - x = a.id - aip->idoffset; - bit = 1<<x; - if(x < 0 || x > 31 || (bit&aip->idvec)){ - unlock(&aip->idlock); - fprint(2, "9p1: id out of range: idoff %ld idvec %lux id %ld\n", - aip->idoffset, aip->idvec, a.id); - return 0; - } - aip->idvec |= bit; - - /* normalize the vector */ - while(aip->idvec&0xffff0001){ - aip->idvec >>= 1; - aip->idoffset++; - } - unlock(&aip->idlock); - - /* ticket name and attach name must match */ - if(memcmp(in->uname, t.cuid, sizeof(in->uname)) != 0){ - fprint(2, "9p1: names don't match\n"); - return 0; - } - - /* copy translated name into input record */ - memmove(in->uname, t.suid, sizeof(in->uname)); - - /* craft a reply */ - a.num = AuthAs; - memmove(a.chal, aip->rchal, CHALLEN); - convA2M9p1(&a, ou->rauth, t.key); - - cp->authok = 1; - - return 1; -} - -/* - * buggery to give false qid for - * the top 2 levels of the dump fs - */ -void -mkqid(Qid* qid, Dentry *d, int buggery) -{ - int c; - - if(buggery && d->qid.path == (QPDIR|QPROOT)){ - c = d->name[0]; - if(isascii(c) && isdigit(c)){ - qid->path = 3; - qid->vers = d->qid.version; - qid->type = QTDIR; - - c = (c-'0')*10 + (d->name[1]-'0'); - if(c >= 1 && c <= 12) - qid->path = 4; - return; - } - } - - mkqid9p2(qid, &d->qid, d->mode); -} - -int -mkqidcmp(Qid* qid, Dentry *d) -{ - Qid tmp; - - mkqid(&tmp, d, 1); - if(qid->path == tmp.path && qid->type == tmp.type) - return 0; - return Eqid; -} - -static void -f_attach(Chan *cp, Fcall *in, Fcall *ou) -{ - Iobuf *p; - Dentry *d; - File *f; - int u; - Filsys *fs; - Off raddr; - - if(CHAT(cp)) { - fprint(2, "c_attach %d\n", cp->chan); - fprint(2, "\tfid = %d\n", in->fid); - fprint(2, "\tuid = %s\n", in->uname); - fprint(2, "\targ = %s\n", in->aname); - } - - ou->qid = QID9P1(0,0); - ou->fid = in->fid; - if(!in->aname[0]) /* default */ - strncpy(in->aname, "main", sizeof(in->aname)); - p = 0; - f = filep(cp, in->fid, 1); - if(!f) { - ou->err = Efid; - goto out; - } - - u = -1; - if(cp != cons.chan) { - if(noattach && strcmp(in->uname, "none")) { - ou->err = Enoattach; - goto out; - } - if(authorize(cp, in, ou) == 0 || strcmp(in->uname, "adm") == 0) { - ou->err = Eauth; - goto out; - } - u = strtouid(in->uname); - if(u < 0) { - ou->err = Ebadu; - goto out; - } - } - f->uid = u; - - fs = fsstr(in->aname); - if(fs == 0) { - ou->err = Ebadspc; - goto out; - } - raddr = getraddr(fs->dev); - p = getbuf(fs->dev, raddr, Brd); - d = getdir(p, 0); - if(!d || checktag(p, Tdir, QPROOT) || !(d->mode & DALLOC)) { - ou->err = Ealloc; - goto out; - } - if(iaccess(f, d, DEXEC) || - f->uid == 0 && fs->dev->type == Devro) { - /* - * 'none' not allowed on dump - */ - ou->err = Eaccess; - goto out; - } - accessdir(p, d, FREAD, f->uid); - mkqid(&f->qid, d, 1); - f->fs = fs; - f->addr = raddr; - f->slot = 0; - f->open = 0; - freewp(f->wpath); - f->wpath = 0; - - mkqid9p1(&ou->qid, &f->qid); - - strncpy(cp->whoname, in->uname, sizeof(cp->whoname)); - cp->whotime = time(nil); - -out: - if(p) - putbuf(p); - if(f) { - qunlock(f); - if(ou->err) - freefp(f); - } -} - -static void -f_clone(Chan *cp, Fcall *in, Fcall *ou) -{ - File *f1, *f2; - Wpath *p; - int fid, fid1; - - if(CHAT(cp)) { - fprint(2, "c_clone %d\n", cp->chan); - fprint(2, "\told fid = %d\n", in->fid); - fprint(2, "\tnew fid = %d\n", in->newfid); - } - - fid = in->fid; - fid1 = in->newfid; - - f1 = 0; - f2 = 0; - if(fid < fid1) { - f1 = filep(cp, fid, 0); - f2 = filep(cp, fid1, 1); - } else - if(fid1 < fid) { - f2 = filep(cp, fid1, 1); - f1 = filep(cp, fid, 0); - } - if(!f1 || !f2) { - ou->err = Efid; - goto out; - } - - - f2->fs = f1->fs; - f2->addr = f1->addr; - f2->open = f1->open & ~FREMOV; - f2->uid = f1->uid; - f2->slot = f1->slot; - f2->qid = f1->qid; - - freewp(f2->wpath); - lock(&wpathlock); - f2->wpath = f1->wpath; - for(p = f2->wpath; p; p = p->up) - p->refs++; - unlock(&wpathlock); - -out: - ou->fid = fid; - if(f1) - qunlock(f1); - if(f2) { - qunlock(f2); - if(ou->err) - freefp(f2); - } -} - -static void -f_walk(Chan *cp, Fcall *in, Fcall *ou) -{ - Iobuf *p, *p1; - Dentry *d, *d1; - File *f; - Wpath *w; - int slot, mask; - Off addr, qpath; - - if(CHAT(cp)) { - fprint(2, "c_walk %d\n", cp->chan); - fprint(2, "\tfid = %d\n", in->fid); - fprint(2, "\tname = %s\n", in->name); - } - - ou->fid = in->fid; - ou->qid = QID9P1(0,0); - p = 0; - f = filep(cp, in->fid, 0); - if(!f) { - ou->err = Efid; - goto out; - } - p = getbuf(f->fs->dev, f->addr, Brd); - d = getdir(p, f->slot); - if(!d || checktag(p, Tdir, QPNONE) || !(d->mode & DALLOC)) { - ou->err = Ealloc; - goto out; - } - if(!(d->mode & DDIR)) { - ou->err = Edir1; - goto out; - } - if(ou->err = mkqidcmp(&f->qid, d)) - goto out; - if(iaccess(f, d, DEXEC)) { - ou->err = Eaccess; - goto out; - } - accessdir(p, d, FREAD, f->uid); - if(strcmp(in->name, ".") == 0) - goto setdot; - if(strcmp(in->name, "..") == 0) { - if(f->wpath == 0) - goto setdot; - putbuf(p); - p = 0; - addr = f->wpath->addr; - slot = f->wpath->slot; - p1 = getbuf(f->fs->dev, addr, Brd); - d1 = getdir(p1, slot); - if(!d1 || checktag(p1, Tdir, QPNONE) || !(d1->mode & DALLOC)) { - if(p1) - putbuf(p1); - ou->err = Ephase; - goto out; - } - lock(&wpathlock); - f->wpath->refs--; - f->wpath = f->wpath->up; - unlock(&wpathlock); - goto found; - } - for(addr=0;; addr++) { - if(p == 0) { - p = getbuf(f->fs->dev, f->addr, Brd); - d = getdir(p, f->slot); - if(!d || checktag(p, Tdir, QPNONE) || !(d->mode & DALLOC)) { - ou->err = Ealloc; - goto out; - } - } - qpath = d->qid.path; - p1 = dnodebuf1(p, d, addr, 0, f->uid); - p = 0; - if(!p1 || checktag(p1, Tdir, qpath) ) { - if(p1) - putbuf(p1); - ou->err = Eentry; - goto out; - } - mask = DALLOC; - if(f->fs->dev->type == Devro) - mask |= DTMP; - for(slot=0; slot<DIRPERBUF; slot++) { - d1 = getdir(p1, slot); - if((d1->mode & mask) != DALLOC) - continue; - if(strncmp(in->name, d1->name, sizeof(in->name)) != 0) - continue; - /* - * update walk path - */ - w = newwp(); - if(!w) { - ou->err = Ewalk; - putbuf(p1); - goto out; - } - w->addr = f->addr; - w->slot = f->slot; - w->up = f->wpath; - f->wpath = w; - slot += DIRPERBUF*addr; - goto found; - } - putbuf(p1); - } - -found: - f->addr = p1->addr; - mkqid(&f->qid, d1, 1); - putbuf(p1); - f->slot = slot; - -setdot: - mkqid9p1(&ou->qid, &f->qid); - f->open = 0; - -out: - if(p) - putbuf(p); - if(f) - qunlock(f); -} - -static void -f_open(Chan *cp, Fcall *in, Fcall *ou) -{ - Iobuf *p; - Dentry *d; - File *f; - Tlock *t; - Qid qid; - int ro, fmod; - - if(CHAT(cp)) { - fprint(2, "c_open %d\n", cp->chan); - fprint(2, "\tfid = %d\n", in->fid); - fprint(2, "\tmode = %o\n", in->mode); - } - - p = 0; - f = filep(cp, in->fid, 0); - if(!f) { - ou->err = Efid; - goto out; - } - - /* - * if remove on close, check access here - */ - ro = f->fs->dev->type == Devro; - if(in->mode & ORCLOSE) { - if(ro) { - ou->err = Eronly; - goto out; - } - /* - * check on parent directory of file to be deleted - */ - if(f->wpath == 0 || f->wpath->addr == f->addr) { - ou->err = Ephase; - goto out; - } - p = getbuf(f->fs->dev, f->wpath->addr, Brd); - d = getdir(p, f->wpath->slot); - if(!d || checktag(p, Tdir, QPNONE) || !(d->mode & DALLOC)) { - ou->err = Ephase; - goto out; - } - if(iaccess(f, d, DWRITE)) { - ou->err = Eaccess; - goto out; - } - putbuf(p); - } - p = getbuf(f->fs->dev, f->addr, Brd); - d = getdir(p, f->slot); - if(!d || checktag(p, Tdir, QPNONE) || !(d->mode & DALLOC)) { - ou->err = Ealloc; - goto out; - } - if(ou->err = mkqidcmp(&f->qid, d)) - goto out; - mkqid(&qid, d, 1); - switch(in->mode & 7) { - - case OREAD: - if(iaccess(f, d, DREAD)) - goto badaccess; - fmod = FREAD; - break; - - case OWRITE: - if((d->mode & DDIR) || iaccess(f, d, DWRITE)) - goto badaccess; - if(ro) { - ou->err = Eronly; - goto out; - } - fmod = FWRITE; - break; - - case ORDWR: - if((d->mode & DDIR) || iaccess(f, d, DREAD) || iaccess(f, d, DWRITE)) - goto badaccess; - if(ro) { - ou->err = Eronly; - goto out; - } - fmod = FREAD+FWRITE; - break; - - case OEXEC: - if((d->mode & DDIR) || iaccess(f, d, DEXEC)) - goto badaccess; - fmod = FREAD; - break; - - default: - ou->err = Emode; - goto out; - } - if(in->mode & OTRUNC) { - if((d->mode & DDIR) || iaccess(f, d, DWRITE)) - goto badaccess; - if(ro) { - ou->err = Eronly; - goto out; - } - } - t = 0; - if(d->mode & DLOCK) { - t = tlocked(p, d); - if(t == nil) { - ou->err = Elocked; - goto out; - } - } - if(in->mode & ORCLOSE) - fmod |= FREMOV; - f->open = fmod; - if(in->mode & OTRUNC) - if(!(d->mode & DAPND)) { - dtrunc(p, d, f->uid); - qid.vers = d->qid.version; - } - f->tlock = t; - if(t) - t->file = f; - f->lastra = 1; - mkqid9p1(&ou->qid, &qid); - goto out; - -badaccess: - ou->err = Eaccess; - f->open = 0; - -out: - if(p) - putbuf(p); - if(f) - qunlock(f); - ou->fid = in->fid; -} - -static void -f_create(Chan *cp, Fcall *in, Fcall *ou) -{ - Iobuf *p, *p1; - Dentry *d, *d1; - File *f; - int slot, slot1, fmod; - Off addr, addr1, path; - Qid qid; - Tlock *t; - Wpath *w; - - if(CHAT(cp)) { - fprint(2, "c_create %d\n", cp->chan); - fprint(2, "\tfid = %d\n", in->fid); - fprint(2, "\tname = %s\n", in->name); - fprint(2, "\tperm = %lx+%lo\n", (in->perm>>28)&0xf, - in->perm&0777); - fprint(2, "\tmode = %o\n", in->mode); - } - - p = 0; - f = filep(cp, in->fid, 0); - if(!f) { - ou->err = Efid; - goto out; - } - if(f->fs->dev->type == Devro) { - ou->err = Eronly; - goto out; - } - - p = getbuf(f->fs->dev, f->addr, Brd); - d = getdir(p, f->slot); - if(!d || checktag(p, Tdir, QPNONE) || !(d->mode & DALLOC)) { - ou->err = Ealloc; - goto out; - } - if(ou->err = mkqidcmp(&f->qid, d)) - goto out; - if(!(d->mode & DDIR)) { - ou->err = Edir2; - goto out; - } - if(iaccess(f, d, DWRITE)) { - ou->err = Eaccess; - goto out; - } - accessdir(p, d, FREAD, f->uid); - if(ou->err = checkname(in->name)) - goto out; - addr1 = 0; - slot1 = 0; /* set */ - for(addr=0;; addr++) { - p1 = dnodebuf(p, d, addr, 0, f->uid); - if(!p1) { - if(addr1) - break; - p1 = dnodebuf(p, d, addr, Tdir, f->uid); - } - if(p1 == 0) { - ou->err = Efull; - goto out; - } - if(checktag(p1, Tdir, d->qid.path)) { - putbuf(p1); - goto phase; - } - for(slot=0; slot<DIRPERBUF; slot++) { - d1 = getdir(p1, slot); - if(!(d1->mode & DALLOC)) { - if(!addr1) { - addr1 = p1->addr; - slot1 = slot + addr*DIRPERBUF; - } - continue; - } - if(!strncmp(in->name, d1->name, sizeof(in->name))) { - putbuf(p1); - ou->err = Eexist; - goto out; - } - } - putbuf(p1); - } - switch(in->mode & 7) { - case OEXEC: - case OREAD: /* seems only useful to make directories */ - fmod = FREAD; - break; - - case OWRITE: - fmod = FWRITE; - break; - - case ORDWR: - fmod = FREAD+FWRITE; - break; - - default: - ou->err = Emode; - goto out; - } - if(in->perm & PDIR) - if((in->mode & OTRUNC) || (in->perm & PAPND) || (fmod & FWRITE)) - goto badaccess; - /* - * do it - */ - path = qidpathgen(f->fs->dev); - p1 = getbuf(f->fs->dev, addr1, Brd|Bimm|Bmod); - d1 = getdir(p1, slot1); - if(!d1 || checktag(p1, Tdir, d->qid.path)) { - if(p1) - putbuf(p1); - goto phase; - } - if(d1->mode & DALLOC) { - putbuf(p1); - goto phase; - } - - strncpy(d1->name, in->name, sizeof(in->name)); - if(cp == cons.chan) { - d1->uid = cons.uid; - d1->gid = cons.gid; - } else { - d1->uid = f->uid; - d1->gid = d->gid; - in->perm &= d->mode | ~0666; - if(in->perm & PDIR) - in->perm &= d->mode | ~0777; - } - d1->qid.path = path; - d1->qid.version = 0; - d1->mode = DALLOC | (in->perm & 0777); - if(in->perm & PDIR) { - d1->mode |= DDIR; - d1->qid.path |= QPDIR; - } - if(in->perm & PAPND) - d1->mode |= DAPND; - t = 0; - if(in->perm & PLOCK) { - d1->mode |= DLOCK; - t = tlocked(p1, d1); - /* if nil, out of tlock structures */ - } - accessdir(p1, d1, FWRITE, f->uid); - mkqid(&qid, d1, 0); - putbuf(p1); - accessdir(p, d, FWRITE, f->uid); - - /* - * do a walk to new directory entry - */ - w = newwp(); - if(!w) { - ou->err = Ewalk; - goto out; - } - w->addr = f->addr; - w->slot = f->slot; - w->up = f->wpath; - f->wpath = w; - f->qid = qid; - f->tlock = t; - if(t) - t->file = f; - f->lastra = 1; - if(in->mode & ORCLOSE) - fmod |= FREMOV; - f->open = fmod; - f->addr = addr1; - f->slot = slot1; - mkqid9p1(&ou->qid, &qid); - goto out; - -badaccess: - ou->err = Eaccess; - goto out; - -phase: - ou->err = Ephase; - -out: - if(p) - putbuf(p); - if(f) - qunlock(f); - ou->fid = in->fid; -} - -static void -f_read(Chan *cp, Fcall *in, Fcall *ou) -{ - Iobuf *p, *p1; - File *f; - Dentry *d, *d1; - Tlock *t; - Off addr, offset; - Timet tim; - int nread, count, mask, n, o, slot; - - if(CHAT(cp)) { - fprint(2, "c_read %d\n", cp->chan); - fprint(2, "\tfid = %d\n", in->fid); - fprint(2, "\toffset = %lld\n", (Wideoff)in->offset); - fprint(2, "\tcount = %ld\n", in->count); - } - - p = 0; - count = in->count; - offset = in->offset; - nread = 0; - f = filep(cp, in->fid, 0); - if(!f) { - ou->err = Efid; - goto out; - } - if(!(f->open & FREAD)) { - ou->err = Eopen; - goto out; - } - if(count < 0 || count > MAXDAT) { - ou->err = Ecount; - goto out; - } - if(offset < 0) { - ou->err = Eoffset; - goto out; - } - p = getbuf(f->fs->dev, f->addr, Brd); - d = getdir(p, f->slot); - if(!d || !(d->mode & DALLOC)) { - ou->err = Ealloc; - goto out; - } - if(ou->err = mkqidcmp(&f->qid, d)) - goto out; - if(t = f->tlock) { - tim = toytime(); - if(t->time < tim || t->file != f) { - ou->err = Ebroken; - goto out; - } - /* renew the lock */ - t->time = tim + TLOCK; - } - accessdir(p, d, FREAD, f->uid); - if(d->mode & DDIR) { - addr = 0; - goto dread; - } - - /* XXXX terrible hack to get at raw data XXXX */ - if(rawreadok && strncmp(d->name, "--raw--", 7) == 0) { - Device *dev; - Devsize boff, bsize; - - dev = p->dev; - putbuf(p); - p = 0; - - boff = number(d->name + 7, 0, 10) * 100000; - if(boff < 0) - boff = 0; - if(boff > devsize(dev)) - boff = devsize(dev); - bsize = devsize(dev) - boff; - - if(offset+count >= 100000*RBUFSIZE) - count = 100000*RBUFSIZE - offset; - - if((offset+count)/RBUFSIZE >= bsize) - /* will not overflow */ - count = bsize*RBUFSIZE - offset; - - while(count > 0) { - addr = offset / RBUFSIZE; - addr += boff; - o = offset % RBUFSIZE; - n = RBUFSIZE - o; - if(n > count) - n = count; - - p1 = getbuf(dev, addr, Brd); - if(p1) { - memmove(ou->data+nread, p1->iobuf+o, n); - putbuf(p1); - } else - memset(ou->data+nread, 0, n); - count -= n; - nread += n; - offset += n; - } - goto out; - } - if(offset >= d->size) - count = 0; - else if(offset+count > d->size) - count = d->size - offset; - while(count > 0) { - if(p == 0) { - p = getbuf(f->fs->dev, f->addr, Brd); - d = getdir(p, f->slot); - if(!d || !(d->mode & DALLOC)) { - ou->err = Ealloc; - goto out; - } - } - addr = offset / BUFSIZE; - f->lastra = dbufread(p, d, addr, f->lastra, f->uid); - o = offset % BUFSIZE; - n = BUFSIZE - o; - if(n > count) - n = count; - p1 = dnodebuf1(p, d, addr, 0, f->uid); - p = 0; - if(p1) { - if(checktag(p1, Tfile, QPNONE)) { - ou->err = Ephase; - putbuf(p1); - goto out; - } - memmove(ou->data+nread, p1->iobuf+o, n); - putbuf(p1); - } else - memset(ou->data+nread, 0, n); - count -= n; - nread += n; - offset += n; - } - goto out; - -dread: - for (;;) { - if(p == 0) { - p = getbuf(f->fs->dev, f->addr, Brd); - d = getdir(p, f->slot); - if(!d || !(d->mode & DALLOC)) { - ou->err = Ealloc; - goto out; - } - } - p1 = dnodebuf1(p, d, addr, 0, f->uid); - p = 0; - if(!p1) - goto out; - if(checktag(p1, Tdir, QPNONE)) { - ou->err = Ephase; - putbuf(p1); - goto out; - } - n = DIRREC; - mask = DALLOC; - if(f->fs->dev->type == Devro) - mask |= DTMP; - for(slot=0; slot<DIRPERBUF; slot++) { - d1 = getdir(p1, slot); - if((d1->mode & mask) != DALLOC) - continue; - if(offset >= n) { - offset -= n; - continue; - } - if(count < n) { - putbuf(p1); - goto out; - } - if(convD2M9p1(d1, ou->data+nread) != n) - fprint(2, "9p1: dirread convD2M1990\n"); - nread += n; - count -= n; - } - putbuf(p1); - addr++; - } -out: - count = in->count - nread; - if(count > 0) - memset(ou->data+nread, 0, count); - if(p) - putbuf(p); - if(f) - qunlock(f); - ou->fid = in->fid; - ou->count = nread; - if(CHAT(cp)) - fprint(2, "\tnread = %d\n", nread); -} - -static void -f_write(Chan *cp, Fcall *in, Fcall *ou) -{ - Iobuf *p, *p1; - Dentry *d; - File *f; - Tlock *t; - Off offset, addr, qpath; - Timet tim; - int count, nwrite, o, n; - - if(CHAT(cp)) { - fprint(2, "c_write %d\n", cp->chan); - fprint(2, "\tfid = %d\n", in->fid); - fprint(2, "\toffset = %lld\n", (Wideoff)in->offset); - fprint(2, "\tcount = %ld\n", in->count); - } - - offset = in->offset; - count = in->count; - nwrite = 0; - p = 0; - f = filep(cp, in->fid, 0); - if(!f) { - ou->err = Efid; - goto out; - } - if(!(f->open & FWRITE)) { - ou->err = Eopen; - goto out; - } - if(f->fs->dev->type == Devro) { - ou->err = Eronly; - goto out; - } - if(count < 0 || count > MAXDAT) { - ou->err = Ecount; - goto out; - } - if(offset < 0) { - ou->err = Eoffset; - goto out; - } - p = getbuf(f->fs->dev, f->addr, Brd|Bmod); - d = getdir(p, f->slot); - if(!d || !(d->mode & DALLOC)) { - ou->err = Ealloc; - goto out; - } - if(ou->err = mkqidcmp(&f->qid, d)) - goto out; - if(t = f->tlock) { - tim = toytime(); - if(t->time < tim || t->file != f) { - ou->err = Ebroken; - goto out; - } - /* renew the lock */ - t->time = tim + TLOCK; - } - accessdir(p, d, FWRITE, f->uid); - if(d->mode & DAPND) - offset = d->size; - if(offset+count > d->size) - d->size = offset+count; - while(count > 0) { - if(p == 0) { - p = getbuf(f->fs->dev, f->addr, Brd|Bmod); - d = getdir(p, f->slot); - if(!d || !(d->mode & DALLOC)) { - ou->err = Ealloc; - goto out; - } - } - addr = offset / BUFSIZE; - o = offset % BUFSIZE; - n = BUFSIZE - o; - if(n > count) - n = count; - qpath = d->qid.path; - p1 = dnodebuf1(p, d, addr, Tfile, f->uid); - p = 0; - if(p1 == 0) { - ou->err = Efull; - goto out; - } - if(checktag(p1, Tfile, qpath)) { - putbuf(p1); - ou->err = Ephase; - goto out; - } - memmove(p1->iobuf+o, in->data+nwrite, n); - p1->flags |= Bmod; - putbuf(p1); - count -= n; - nwrite += n; - offset += n; - } - if(CHAT(cp)) - fprint(2, "\tnwrite = %d\n", nwrite); - -out: - if(p) - putbuf(p); - if(f) - qunlock(f); - ou->fid = in->fid; - ou->count = nwrite; -} - -int -doremove(File *f) -{ - Iobuf *p, *p1; - Dentry *d, *d1; - Off addr; - int slot, err; - - p = 0; - p1 = 0; - if(f->fs->dev->type == Devro) { - err = Eronly; - goto out; - } - /* - * check on parent directory of file to be deleted - */ - if(f->wpath == 0 || f->wpath->addr == f->addr) { - err = Ephase; - goto out; - } - p1 = getbuf(f->fs->dev, f->wpath->addr, Brd); - d1 = getdir(p1, f->wpath->slot); - if(!d1 || checktag(p1, Tdir, QPNONE) || !(d1->mode & DALLOC)) { - err = Ephase; - goto out; - } - if(iaccess(f, d1, DWRITE)) { - err = Eaccess; - goto out; - } - accessdir(p1, d1, FWRITE, f->uid); - putbuf(p1); - p1 = 0; - - /* - * check on file to be deleted - */ - p = getbuf(f->fs->dev, f->addr, Brd); - d = getdir(p, f->slot); - if(!d || checktag(p, Tdir, QPNONE) || !(d->mode & DALLOC)) { - err = Ealloc; - goto out; - } - if(err = mkqidcmp(&f->qid, d)) - goto out; - - /* - * if deleting a directory, make sure it is empty - */ - if((d->mode & DDIR)) - for(addr=0;; addr++) { - p1 = dnodebuf(p, d, addr, 0, f->uid); - if(!p1) - break; - if(checktag(p1, Tdir, d->qid.path)) { - err = Ephase; - goto out; - } - for(slot=0; slot<DIRPERBUF; slot++) { - d1 = getdir(p1, slot); - if(!(d1->mode & DALLOC)) - continue; - err = Eempty; - goto out; - } - putbuf(p1); - } - - /* - * do it - */ - dtrunc(p, d, f->uid); - memset(d, 0, sizeof(Dentry)); - settag(p, Tdir, QPNONE); - -out: - if(p1) - putbuf(p1); - if(p) - putbuf(p); - return err; -} - -static int -doclunk(File* f, int remove) -{ - Tlock *t; - int err; - - err = 0; - if(t = f->tlock) { - if(t->file == f) - t->time = 0; /* free the lock */ - f->tlock = 0; - } - if(remove) - err = doremove(f); - f->open = 0; - freewp(f->wpath); - freefp(f); - - return err; -} - -static void -f_clunk(Chan *cp, Fcall *in, Fcall *ou) -{ - File *f; - - if(CHAT(cp)) { - fprint(2, "c_clunk %d\n", cp->chan); - fprint(2, "\tfid = %d\n", in->fid); - } - - f = filep(cp, in->fid, 0); - if(!f) - ou->err = Efid; - else { - doclunk(f, f->open & FREMOV); - qunlock(f); - } - ou->fid = in->fid; -} - -static void -f_remove(Chan *cp, Fcall *in, Fcall *ou) -{ - File *f; - - if(CHAT(cp)) { - fprint(2, "c_remove %d\n", cp->chan); - fprint(2, "\tfid = %d\n", in->fid); - } - - f = filep(cp, in->fid, 0); - if(!f) - ou->err = Efid; - else { - ou->err = doclunk(f, 1); - qunlock(f); - } - ou->fid = in->fid; -} - -static void -f_stat(Chan *cp, Fcall *in, Fcall *ou) -{ - Iobuf *p; - Dentry *d; - File *f; - - if(CHAT(cp)) { - fprint(2, "c_stat %d\n", cp->chan); - fprint(2, "\tfid = %d\n", in->fid); - } - - p = 0; - memset(ou->stat, 0, sizeof(ou->stat)); - f = filep(cp, in->fid, 0); - if(!f) { - ou->err = Efid; - goto out; - } - p = getbuf(f->fs->dev, f->addr, Brd); - d = getdir(p, f->slot); - if(!d || checktag(p, Tdir, QPNONE) || !(d->mode & DALLOC)) { - ou->err = Ealloc; - goto out; - } - if(ou->err = mkqidcmp(&f->qid, d)) - goto out; - if(d->qid.path == QPROOT) /* stat of root gives time */ - d->atime = time(nil); - if(convD2M9p1(d, ou->stat) != DIRREC) - fprint(2, "9p1: stat convD2M\n"); - -out: - if(p) - putbuf(p); - if(f) - qunlock(f); - ou->fid = in->fid; -} - -static void -f_wstat(Chan *cp, Fcall *in, Fcall *ou) -{ - Iobuf *p, *p1; - Dentry *d, *d1, xd; - File *f; - int slot; - Off addr; - - if(CHAT(cp)) { - fprint(2, "c_wstat %d\n", cp->chan); - fprint(2, "\tfid = %d\n", in->fid); - } - - p = 0; - p1 = 0; - d1 = 0; - f = filep(cp, in->fid, 0); - if(!f) { - ou->err = Efid; - goto out; - } - if(f->fs->dev->type == Devro) { - ou->err = Eronly; - goto out; - } - - /* - * first get parent - */ - if(f->wpath) { - p1 = getbuf(f->fs->dev, f->wpath->addr, Brd); - d1 = getdir(p1, f->wpath->slot); - if(!d1 || checktag(p1, Tdir, QPNONE) || !(d1->mode & DALLOC)) { - ou->err = Ephase; - goto out; - } - } - - p = getbuf(f->fs->dev, f->addr, Brd); - d = getdir(p, f->slot); - if(!d || checktag(p, Tdir, QPNONE) || !(d->mode & DALLOC)) { - ou->err = Ealloc; - goto out; - } - if(ou->err = mkqidcmp(&f->qid, d)) - goto out; - - convM2D9p1(in->stat, &xd); - if(CHAT(cp)) { - fprint(2, "\td.name = %s\n", xd.name); - fprint(2, "\td.uid = %d\n", xd.uid); - fprint(2, "\td.gid = %d\n", xd.gid); - fprint(2, "\td.mode = %o\n", xd.mode); - } - - /* - * if user none, - * cant do anything - */ - if(f->uid == 0) { - ou->err = Eaccess; - goto out; - } - - /* - * if chown, - * must be god - */ - if(xd.uid != d->uid && !isallowed(f)) { - ou->err = Ewstatu; - goto out; - } - - /* - * if chgroup, - * must be either - * a) owner and in new group - * b) leader of both groups - */ - if (xd.gid != d->gid && !isallowed(f) && - (d->uid != f->uid || !ingroup(f->uid, xd.gid)) && - (!leadgroup(f->uid, xd.gid) || !leadgroup(f->uid, d->gid))) { - ou->err = Ewstatg; - goto out; - } - - /* - * if rename, - * must have write permission in parent - */ - if (strncmp(d->name, xd.name, sizeof(d->name)) != 0) { - if(ou->err = checkname(xd.name)) - goto out; - - /* rename root? */ - if(!d1){ - ou->err = Ename; - goto out; - } - - /* - * drop entry to prevent lock, then - * check that destination name is unique, - */ - putbuf(p); - for(addr=0;; addr++) { - p = dnodebuf(p1, d1, addr, 0, f->uid); - if(!p) - break; - if(checktag(p, Tdir, d1->qid.path)) { - putbuf(p); - continue; - } - for(slot=0; slot<DIRPERBUF; slot++) { - d = getdir(p, slot); - if(!(d->mode & DALLOC)) - continue; - if(!strncmp(xd.name, d->name, sizeof(xd.name))) { - ou->err = Eexist; - goto out; - } - } - putbuf(p); - } - - /* - * reacquire entry - */ - p = getbuf(f->fs->dev, f->addr, Brd); - d = getdir(p, f->slot); - if(!d || checktag(p, Tdir, QPNONE) || !(d->mode & DALLOC)) { - ou->err = Ephase; - goto out; - } - - if(iaccess(f, d1, DWRITE)) { - ou->err = Eaccess; - goto out; - } - } - - /* - * if mode/time, either - * a) owner - * b) leader of either group - */ - if (d->mtime != xd.mtime || - ((d->mode^xd.mode) & (DAPND|DLOCK|0777))) - if (d->uid != f->uid && !isallowed(f) && - !leadgroup(f->uid, xd.gid) && - !leadgroup(f->uid, d->gid)) { - ou->err = Ewstatu; - goto out; - } - d->mtime = xd.mtime; - d->uid = xd.uid; - d->gid = xd.gid; - d->mode = (xd.mode & (DAPND|DLOCK|0777)) | (d->mode & (DALLOC|DDIR)); - - strncpy(d->name, xd.name, sizeof(d->name)); - accessdir(p, d, FREAD, f->uid); - -out: - if(p) - putbuf(p); - if(p1) - putbuf(p1); - if(f) - qunlock(f); - ou->fid = in->fid; -} - -static void -f_clwalk(Chan *cp, Fcall *in, Fcall *ou) -{ - int er, fid; - - if(CHAT(cp)) - fprint(2, "c_clwalk macro\n"); - - f_clone(cp, in, ou); /* sets tag, fid */ - if(ou->err) - return; - fid = in->fid; - in->fid = in->newfid; - f_walk(cp, in, ou); /* sets tag, fid, qid */ - er = ou->err; - if(er == Eentry) { - /* - * if error is "no entry" - * return non error and fid - */ - ou->err = 0; - f_clunk(cp, in, ou); /* sets tag, fid */ - ou->err = 0; - ou->fid = fid; - if(CHAT(cp)) - fprint(2, "\terror: %s\n", errstr9p[er]); - } else if(er) { - /* - * if any other error - * return an error - */ - ou->err = 0; - f_clunk(cp, in, ou); /* sets tag, fid */ - ou->err = er; - } - /* - * non error - * return newfid - */ -} - -void (*call9p1[MAXSYSCALL])(Chan*, Fcall*, Fcall*) = -{ - [Tnop] f_nop, - [Tosession] f_session, - [Tsession] f_session, - [Tflush] f_flush, - [Toattach] f_attach, - [Tattach] f_attach, - [Tclone] f_clone, - [Twalk] f_walk, - [Topen] f_open, - [Tcreate] f_create, - [Tread] f_read, - [Twrite] f_write, - [Tclunk] f_clunk, - [Tremove] f_remove, - [Tstat] f_stat, - [Twstat] f_wstat, - [Tclwalk] f_clwalk, -}; - -int -error9p1(Chan* cp, Msgbuf* mb) -{ - Msgbuf *mb1; - - fprint(2, "type=%d count=%d\n", mb->data[0], mb->count); - hexdump(mb->data, 12); - - mb1 = mballoc(3, cp, Mbreply4); - mb1->data[0] = Rnop; /* your nop was ok */ - mb1->data[1] = ~0; - mb1->data[2] = ~0; - mb1->count = 3; - mb1->param = mb->param; - fs_send(cp->reply, mb1); - - return 1; -} - -int -serve9p1(Msgbuf* mb) -{ - int t, n; - Chan *cp; - Msgbuf *mb1; - Fcall fi, fo; - - assert(mb != nil); - cp = mb->chan; - assert(mb->data != nil); - if(convM2S9p1(mb->data, &fi, mb->count) == 0){ - assert(cp != nil); - if(cp->protocol == nil) - return 0; - fprint(2, "9p1: bad M2S conversion\n"); - return error9p1(cp, mb); - } - - t = fi.type; - if(t < 0 || t >= MAXSYSCALL || (t&1) || !call9p1[t]) { - fprint(2, "9p1: bad message type\n"); - return error9p1(cp, mb); - } - - /* - * allocate reply message - */ - if(t == Tread) { - mb1 = mballoc(MAXMSG+MAXDAT, cp, Mbreply2); - fo.data = (char*)(mb1->data + 8); - } else - mb1 = mballoc(MAXMSG, cp, Mbreply3); - - /* - * call the file system - */ - assert(cp != nil); - fo.err = 0; - - (*call9p1[t])(cp, &fi, &fo); - - fo.type = t+1; - fo.tag = fi.tag; - - if(fo.err) { - if(cons.flags&errorflag) - fprint(2, "\ttype %d: error: %s\n", t, errstr9p[fo.err]); - if(CHAT(cp)) - fprint(2, "\terror: %s\n", errstr9p[fo.err]); - fo.type = Rerror; - strncpy(fo.ename, errstr9p[fo.err], sizeof(fo.ename)); - } - - n = convS2M9p1(&fo, mb1->data); - if(n == 0) { - fprint(2, "9p1: bad S2M conversion\n"); - mbfree(mb1); - return error9p1(cp, mb); - } - mb1->count = n; - mb1->param = mb->param; - fs_send(cp->reply, mb1); - - return 1; -} diff --git a/sys/src/cmd/cwfs/9p1.h b/sys/src/cmd/cwfs/9p1.h deleted file mode 100644 index 9df867166..000000000 --- a/sys/src/cmd/cwfs/9p1.h +++ /dev/null @@ -1,116 +0,0 @@ -#include <authsrv.h> - -enum { - DIRREC = 116, /* size of a directory ascii record */ - ERRREC = 64, /* size of a error record */ -}; - -typedef struct Fcall Fcall; - -struct Fcall -{ - char type; - ushort fid; - short err; - short tag; - union - { - struct - { - short uid; /* T-Userstr [obs.] */ - short oldtag; /* T-nFlush */ - Qid9p1 qid; /* R-Attach, R-Clwalk, R-Walk, - * R-Open, R-Create */ - char rauth[AUTHENTLEN]; /* R-attach */ - }; - struct - { - char uname[NAMELEN]; /* T-nAttach */ - char aname[NAMELEN]; /* T-nAttach */ - char ticket[TICKETLEN]; /* T-attach */ - char auth[AUTHENTLEN]; /* T-attach */ - }; - struct - { - char ename[ERRREC]; /* R-nError */ - char chal[CHALLEN]; /* T-session, R-session */ - char authid[NAMELEN]; /* R-session */ - char authdom[DOMLEN]; /* R-session */ - }; - struct - { - char name[NAMELEN]; /* T-Walk, T-Clwalk, T-Create, T-Remove */ - long perm; /* T-Create */ - ushort newfid; /* T-Clone, T-Clwalk */ - char mode; /* T-Create, T-Open */ - }; - struct - { - Off offset; /* T-Read, T-Write */ - long count; /* T-Read, T-Write, R-Read */ - char* data; /* T-Write, R-Read */ - }; - struct - { - char stat[DIRREC]; /* T-Wstat, R-Stat */ - }; - }; -}; - -/* - * P9 protocol message types - */ -enum -{ - Tnop = 50, - Rnop, - Tosession = 52, - Rosession, - Terror = 54, /* illegal */ - Rerror, - Tflush = 56, - Rflush, - Toattach = 58, - Roattach, - Tclone = 60, - Rclone, - Twalk = 62, - Rwalk, - Topen = 64, - Ropen, - Tcreate = 66, - Rcreate, - Tread = 68, - Rread, - Twrite = 70, - Rwrite, - Tclunk = 72, - Rclunk, - Tremove = 74, - Rremove, - Tstat = 76, - Rstat, - Twstat = 78, - Rwstat, - Tclwalk = 80, - Rclwalk, - Tauth = 82, /* illegal */ - Rauth, /* illegal */ - Tsession = 84, - Rsession, - Tattach = 86, - Rattach, - - MAXSYSCALL -}; - -int convA2M9p1(Authenticator*, char*, char*); -void convM2A9p1(char*, Authenticator*, char*); -void convM2T9p1(char*, Ticket*, char*); -int convD2M9p1(Dentry*, char*); -int convM2D9p1(char*, Dentry*); -int convM2S9p1(uchar*, Fcall*, int); -int convS2M9p1(Fcall*, uchar*); -void fcall9p1(Chan*, Fcall*, Fcall*); - -void (*call9p1[MAXSYSCALL])(Chan*, Fcall*, Fcall*); diff --git a/sys/src/cmd/cwfs/9p1lib.c b/sys/src/cmd/cwfs/9p1lib.c deleted file mode 100644 index b6833bfaa..000000000 --- a/sys/src/cmd/cwfs/9p1lib.c +++ /dev/null @@ -1,523 +0,0 @@ -#include "all.h" - -/* BUG transition */ -// int client9p = 2; -// int kernel9p = 2; - -#include "9p1.h" - -#define CHAR(x) *p++ = f->x -#define SHORT(x) { ulong vvv = f->x; *p++ = vvv; *p++ = vvv>>8; } -#define LONGINT(q) {*p++ = (q); *p++ = (q)>>8; *p++ = (q)>>16; *p++ = (q)>>24;} -#define LONG(x) { ulong vvv = f->x; LONGINT(vvv); } -#define VLONG(x) { \ - uvlong q = f->x; \ - *p++ = (q)>> 0; *p++ = (q)>> 8; *p++ = (q)>>16; *p++ = (q)>>24; \ - *p++ = (q)>>32; *p++ = (q)>>40; *p++ = (q)>>48; *p++ = (q)>>56; \ - } - -#define BYTES(x,n) memmove(p, f->x, n); p += n -#define STRING(x,n) strncpy((char*)p, f->x, n); p += n - -int -convS2M9p1(Fcall *f, uchar *ap) -{ - uchar *p; - int t; - - p = ap; - CHAR(type); - t = f->type; - SHORT(tag); - switch(t) { - default: - fprint(2, "convS2M9p1: bad type: %d\n", t); - return 0; - - case Tnop: - case Tosession: - break; - - case Tsession: - BYTES(chal, sizeof(f->chal)); - break; - - case Tflush: - SHORT(oldtag); - break; - - case Tattach: - SHORT(fid); - STRING(uname, sizeof(f->uname)); - STRING(aname, sizeof(f->aname)); - BYTES(ticket, sizeof(f->ticket)); - BYTES(auth, sizeof(f->auth)); - break; - - case Toattach: - SHORT(fid); - STRING(uname, sizeof(f->uname)); - STRING(aname, sizeof(f->aname)); - BYTES(ticket, NAMELEN); - break; - - case Tclone: - SHORT(fid); - SHORT(newfid); - break; - - case Twalk: - SHORT(fid); - STRING(name, sizeof(f->name)); - break; - - case Tclwalk: - SHORT(fid); - SHORT(newfid); - STRING(name, sizeof(f->name)); - break; - - case Topen: - SHORT(fid); - CHAR(mode); - break; - - case Tcreate: - SHORT(fid); - STRING(name, sizeof(f->name)); - LONG(perm); - CHAR(mode); - break; - - case Tread: - SHORT(fid); - VLONG(offset); - SHORT(count); - break; - - case Twrite: - SHORT(fid); - VLONG(offset); - SHORT(count); - p++; - if((uchar*)p == (uchar*)f->data) { - p += f->count; - break; - } - BYTES(data, f->count); - break; - - case Tclunk: - case Tremove: - case Tstat: - SHORT(fid); - break; - - case Twstat: - SHORT(fid); - BYTES(stat, sizeof(f->stat)); - break; -/* - */ - case Rnop: - case Rosession: - case Rflush: - break; - - case Rsession: - BYTES(chal, sizeof(f->chal)); - BYTES(authid, sizeof(f->authid)); - BYTES(authdom, sizeof(f->authdom)); - break; - - case Rerror: - STRING(ename, sizeof(f->ename)); - break; - - case Rclone: - case Rclunk: - case Rremove: - case Rwstat: - SHORT(fid); - break; - - case Rwalk: - case Ropen: - case Rcreate: - case Rclwalk: - SHORT(fid); - LONG(qid.path); - LONG(qid.version); - break; - - case Rattach: - SHORT(fid); - LONG(qid.path); - LONG(qid.version); - BYTES(rauth, sizeof(f->rauth)); - break; - - case Roattach: - SHORT(fid); - LONG(qid.path); - LONG(qid.version); - break; - - case Rread: - SHORT(fid); - SHORT(count); - p++; - if((uchar*)p == (uchar*)f->data) { - p += f->count; - break; - } - BYTES(data, f->count); - break; - - case Rwrite: - SHORT(fid); - SHORT(count); - break; - - case Rstat: - SHORT(fid); - BYTES(stat, sizeof(f->stat)); - break; - } - return p - (uchar*)ap; -} - -/* - * buggery to give false qid for - * the top 2 levels of the dump fs - */ -static ulong -fakeqid9p1(Dentry *f) -{ - ulong q; - int c; - - q = f->qid.path; - if(q == (QPROOT|QPDIR)) { - c = f->name[0]; - if(isascii(c) && isdigit(c)) { - q = 3|QPDIR; - c = (c-'0')*10 + (f->name[1]-'0'); - if(c >= 1 && c <= 12) - q = 4|QPDIR; - } - } - return q; -} - -int -convD2M9p1(Dentry *f, char *ap) -{ - uchar *p; - ulong q; - - p = (uchar*)ap; - STRING(name, sizeof(f->name)); - - memset(p, 0, 2*NAMELEN); - uidtostr((char*)p, f->uid, 1); - p += NAMELEN; - - uidtostr((char*)p, f->gid, 1); - p += NAMELEN; - - q = fakeqid9p1(f); - LONGINT(q); - LONG(qid.version); - - q = f->mode & 0x0fff; - if(f->mode & DDIR) - q |= PDIR; - if(f->mode & DAPND) - q |= PAPND; - if(f->mode & DLOCK) - q |= PLOCK; - LONGINT(q); - - LONG(atime); - LONG(mtime); - VLONG(size); - LONGINT(0); - return p - (uchar*)ap; -} - -int -convA2M9p1(Authenticator *f, char *ap, char *key) -{ - int n; - uchar *p; - - p = (uchar*)ap; - CHAR(num); - BYTES(chal, CHALLEN); - LONG(id); - n = p - (uchar*)ap; - if(key) - encrypt(key, ap, n); - return n; -} - -#undef CHAR -#undef SHORT -#undef LONG -#undef LONGINT -#undef VLONG -#undef BYTES -#undef STRING - -#define CHAR(x) f->x = *p++ -#define SHORT(x) f->x = (p[0] | (p[1]<<8)); p += 2 -#define LONG(x) f->x = p[0] | (p[1]<<8) | (p[2]<<16) | (p[3]<<24); p += 4 -#define VLONG(x) { \ - f->x = (p[0] | (p[1]<<8) | (p[2]<<16) | (p[3]<<24)) | \ - (uvlong)(p[4] | (p[5]<<8) | (p[6]<<16) | (p[7]<<24)) << 32; \ - p += 8; \ -} - -#define BYTES(x,n) memmove(f->x, p, n); p += n -#define STRING(x,n) memmove(f->x, p, n); p += n - -int -convM2S9p1(uchar *ap, Fcall *f, int n) -{ - uchar *p; - int t; - - p = ap; - CHAR(type); - t = f->type; - SHORT(tag); - switch(t) { - default: - /* - * only whine if it couldn't be a 9P2000 Tversion. - */ - if(t != 19 || ap[4] != 100) - fprint(2, "convM2S9p1: bad type: %d\n", f->type); - return 0; - - case Tnop: - case Tosession: - break; - - case Tsession: - BYTES(chal, sizeof(f->chal)); - break; - - case Tflush: - SHORT(oldtag); - break; - - case Tattach: - SHORT(fid); - BYTES(uname, sizeof(f->uname)); - BYTES(aname, sizeof(f->aname)); - BYTES(ticket, sizeof(f->ticket)); - BYTES(auth, sizeof(f->auth)); - break; - - case Toattach: - SHORT(fid); - BYTES(uname, sizeof(f->uname)); - BYTES(aname, sizeof(f->aname)); - BYTES(ticket, NAMELEN); - break; - - case Tclone: - SHORT(fid); - SHORT(newfid); - break; - - case Twalk: - SHORT(fid); - BYTES(name, sizeof(f->name)); - break; - - case Tclwalk: - SHORT(fid); - SHORT(newfid); - BYTES(name, sizeof(f->name)); - break; - - case Tremove: - SHORT(fid); - break; - - case Topen: - SHORT(fid); - CHAR(mode); - break; - - case Tcreate: - SHORT(fid); - BYTES(name, sizeof(f->name)); - LONG(perm); - CHAR(mode); - break; - - case Tread: - SHORT(fid); - VLONG(offset); - SHORT(count); - break; - - case Twrite: - SHORT(fid); - VLONG(offset); - SHORT(count); - p++; - f->data = (char*)p; p += f->count; - break; - - case Tclunk: - case Tstat: - SHORT(fid); - break; - - case Twstat: - SHORT(fid); - BYTES(stat, sizeof(f->stat)); - break; - -/* - */ - case Rnop: - case Rosession: - break; - - case Rsession: - BYTES(chal, sizeof(f->chal)); - BYTES(authid, sizeof(f->authid)); - BYTES(authdom, sizeof(f->authdom)); - break; - - case Rerror: - BYTES(ename, sizeof(f->ename)); - break; - - case Rflush: - break; - - case Rclone: - case Rclunk: - case Rremove: - case Rwstat: - SHORT(fid); - break; - - case Rwalk: - case Rclwalk: - case Ropen: - case Rcreate: - SHORT(fid); - LONG(qid.path); - LONG(qid.version); - break; - - case Rattach: - SHORT(fid); - LONG(qid.path); - LONG(qid.version); - BYTES(rauth, sizeof(f->rauth)); - break; - - case Roattach: - SHORT(fid); - LONG(qid.path); - LONG(qid.version); - break; - - case Rread: - SHORT(fid); - SHORT(count); - p++; - f->data = (char*)p; p += f->count; - break; - - case Rwrite: - SHORT(fid); - SHORT(count); - break; - - case Rstat: - SHORT(fid); - BYTES(stat, sizeof(f->stat)); - break; - } - if((uchar*)ap+n == p) - return n; - return 0; -} - -int -convM2D9p1(char *ap, Dentry *f) -{ - uchar *p; - char str[NAMELEN]; - - p = (uchar*)ap; - BYTES(name, sizeof(f->name)); - - memmove(str, p, NAMELEN); - p += NAMELEN; - f->uid = strtouid(str); - - memmove(str, p, NAMELEN); - p += NAMELEN; - f->gid = strtouid(str); - - LONG(qid.path); - LONG(qid.version); - - LONG(atime); - f->mode = (f->atime & 0x0fff) | DALLOC; - if(f->atime & PDIR) - f->mode |= DDIR; - if(f->atime & PAPND) - f->mode |= DAPND; - if(f->atime & PLOCK) - f->mode |= DLOCK; - - LONG(atime); - LONG(mtime); - VLONG(size); - p += 4; - return p - (uchar*)ap; -} - -void -convM2A9p1(char *ap, Authenticator *f, char *key) -{ - uchar *p; - - if(key) - decrypt(key, ap, AUTHENTLEN); - p = (uchar*)ap; - CHAR(num); - BYTES(chal, CHALLEN); - LONG(id); - USED(p); -} - -void -convM2T9p1(char *ap, Ticket *f, char *key) -{ - uchar *p; - - if(key) - decrypt(key, ap, TICKETLEN); - p = (uchar*)ap; - CHAR(num); - BYTES(chal, CHALLEN); - STRING(cuid, NAMELEN); - f->cuid[NAMELEN-1] = 0; - STRING(suid, NAMELEN); - f->suid[NAMELEN-1] = 0; - BYTES(key, DESKEYLEN); - USED(p); -} diff --git a/sys/src/cmd/cwfs/9p2.c b/sys/src/cmd/cwfs/9p2.c index e72756c01..d5f484987 100644 --- a/sys/src/cmd/cwfs/9p2.c +++ b/sys/src/cmd/cwfs/9p2.c @@ -110,7 +110,44 @@ mkdir9p2(Dir* dir, Dentry* dentry, void* strs) return p-op; } -static int +/* + * buggery to give false qid for + * the top 2 levels of the dump fs + */ +void +mkqid(Qid* qid, Dentry *d, int buggery) +{ + int c; + + if(buggery && d->qid.path == (QPDIR|QPROOT)){ + c = d->name[0]; + if(isascii(c) && isdigit(c)){ + qid->path = 3; + qid->vers = d->qid.version; + qid->type = QTDIR; + + c = (c-'0')*10 + (d->name[1]-'0'); + if(c >= 1 && c <= 12) + qid->path = 4; + return; + } + } + + mkqid9p2(qid, &d->qid, d->mode); +} + +int +mkqidcmp(Qid* qid, Dentry *d) +{ + Qid tmp; + + mkqid(&tmp, d, 1); + if(qid->path == tmp.path && qid->type == tmp.type) + return 0; + return Eqid; +} + +int version(Chan* chan, Fcall* f, Fcall* r) { if(chan->protocol != nil || f->msize < 256) @@ -237,7 +274,7 @@ authorize(Chan* chan, Fcall* f) return uid; } -static int +int attach(Chan* chan, Fcall* f, Fcall* r) { char *aname; @@ -494,7 +531,7 @@ out: return error; } -static int +int walk(Chan* chan, Fcall* f, Fcall* r) { int error, nwname; @@ -599,7 +636,7 @@ walk(Chan* chan, Fcall* f, Fcall* r) return error; } -static int +int fs_open(Chan* chan, Fcall* f, Fcall* r) { Iobuf *p; @@ -748,7 +785,7 @@ out: return error; } -static int +int fs_create(Chan* chan, Fcall* f, Fcall* r) { Iobuf *p, *p1; @@ -946,7 +983,7 @@ out: return error; } -static int +int fs_read(Chan* chan, Fcall* f, Fcall* r, uchar* data) { Iobuf *p, *p1; @@ -975,6 +1012,7 @@ fs_read(Chan* chan, Fcall* f, Fcall* r, uchar* data) } iounit = chan->msize-IOHDRSZ; if(count < 0 || count > iounit){ +fprint(2, "fs_read %d %d\n", count, iounit); error = Ecount; goto out; } @@ -1149,7 +1187,7 @@ out: return error; } -static int +int fs_write(Chan* chan, Fcall* f, Fcall* r) { Iobuf *p, *p1; @@ -1263,6 +1301,90 @@ out: return error; } +int +doremove(File *f) +{ + Iobuf *p, *p1; + Dentry *d, *d1; + Off addr; + int slot, err; + + p = 0; + p1 = 0; + if(f->fs->dev->type == Devro) { + err = Eronly; + goto out; + } + /* + * check on parent directory of file to be deleted + */ + if(f->wpath == 0 || f->wpath->addr == f->addr) { + err = Ephase; + goto out; + } + p1 = getbuf(f->fs->dev, f->wpath->addr, Brd); + d1 = getdir(p1, f->wpath->slot); + if(!d1 || checktag(p1, Tdir, QPNONE) || !(d1->mode & DALLOC)) { + err = Ephase; + goto out; + } + if(iaccess(f, d1, DWRITE)) { + err = Eaccess; + goto out; + } + accessdir(p1, d1, FWRITE, f->uid); + putbuf(p1); + p1 = 0; + + /* + * check on file to be deleted + */ + p = getbuf(f->fs->dev, f->addr, Brd); + d = getdir(p, f->slot); + if(!d || checktag(p, Tdir, QPNONE) || !(d->mode & DALLOC)) { + err = Ealloc; + goto out; + } + if(err = mkqidcmp(&f->qid, d)) + goto out; + + /* + * if deleting a directory, make sure it is empty + */ + if((d->mode & DDIR)) + for(addr=0;; addr++) { + p1 = dnodebuf(p, d, addr, 0, f->uid); + if(!p1) + break; + if(checktag(p1, Tdir, d->qid.path)) { + err = Ephase; + goto out; + } + for(slot=0; slot<DIRPERBUF; slot++) { + d1 = getdir(p1, slot); + if(!(d1->mode & DALLOC)) + continue; + err = Eempty; + goto out; + } + putbuf(p1); + } + + /* + * do it + */ + dtrunc(p, d, f->uid); + memset(d, 0, sizeof(Dentry)); + settag(p, Tdir, QPNONE); + +out: + if(p1) + putbuf(p1); + if(p) + putbuf(p); + return err; +} + static int _clunk(File* file, int remove) { @@ -1299,7 +1421,7 @@ clunk(Chan* chan, Fcall* f, Fcall*) return 0; } -static int +int fs_remove(Chan* chan, Fcall* f, Fcall*) { File *file; @@ -1309,7 +1431,7 @@ fs_remove(Chan* chan, Fcall* f, Fcall*) return _clunk(file, 1); } -static int +int fs_stat(Chan* chan, Fcall* f, Fcall* r, uchar* data) { Dir dir; diff --git a/sys/src/cmd/cwfs/auth.c b/sys/src/cmd/cwfs/auth.c index 5f088a17e..6a16fff64 100644 --- a/sys/src/cmd/cwfs/auth.c +++ b/sys/src/cmd/cwfs/auth.c @@ -1,48 +1,13 @@ #include "all.h" #include "io.h" -#include <authsrv.h> #include <auth.h> -Nvrsafe nvr; - -static int gotnvr; /* flag: nvr contains nvram; it could be bad */ - char* nvrgetconfig(void) { return conf.confdev; } -/* - * we shouldn't be writing nvram any more. - * the secstore/config field is now just secstore key. - */ - -int -nvrcheck(void) -{ - uchar csum; - - if (readnvram(&nvr, NVread) < 0) { - fprint(2, "nvrcheck: can't read nvram\n"); - return 1; - } else - gotnvr = 1; - - if(chatty) - print("nvr read\n"); - - csum = nvcsum(nvr.machkey, sizeof nvr.machkey); - if(csum != nvr.machsum) { - fprint(2, "\n\n ** NVR key checksum is incorrect **\n"); - fprint(2, " ** set password to allow attaches **\n\n"); - memset(nvr.machkey, 0, sizeof nvr.machkey); - return 1; - } - - return 0; -} - int nvrsetconfig(char* word) { @@ -51,39 +16,6 @@ nvrsetconfig(char* word) return 0; } -int -conslock(void) -{ - char *ln; - Authkey nkey1; - static char zeroes[DESKEYLEN]; - - if(memcmp(nvr.machkey, zeroes, DESKEYLEN) == 0) { - print("no password set\n"); - return 0; - } - - for(;;) { - print("%s password:", service); - /* could turn off echo here */ - - if ((ln = Brdline(&bin, '\n')) == nil) - return 0; - ln[Blinelen(&bin)-1] = '\0'; - - /* could turn on echo here */ - passtokey(&nkey1, ln); - if(memcmp(nkey1.des, nvr.machkey, DESKEYLEN) == 0) { - prdate(); - break; - } - - print("Bad password\n"); - delay(1000); - } - return 1; -} - static char *keyspec = "proto=p9any role=server"; void* diff --git a/sys/src/cmd/cwfs/choline/conf.c b/sys/src/cmd/cwfs/choline/conf.c index b2836ddca..75231df60 100644 --- a/sys/src/cmd/cwfs/choline/conf.c +++ b/sys/src/cmd/cwfs/choline/conf.c @@ -25,7 +25,6 @@ localconfinit(void) } int (*fsprotocol[])(Msgbuf*) = { - serve9p1, serve9p2, nil, }; diff --git a/sys/src/cmd/cwfs/config.c b/sys/src/cmd/cwfs/config.c index a59306e90..634ac5bb6 100644 --- a/sys/src/cmd/cwfs/config.c +++ b/sys/src/cmd/cwfs/config.c @@ -965,7 +965,6 @@ arginit(void) char word[Maxword+1], *cp; Filsys *fs; - nvrcheck(); if(!setconfig(conf.confdev) && !conf.configfirst) return; diff --git a/sys/src/cmd/cwfs/console.c b/sys/src/cmd/cwfs/console.c index e1bae4886..3a5e7771f 100644 --- a/sys/src/cmd/cwfs/console.c +++ b/sys/src/cmd/cwfs/console.c @@ -1,147 +1,208 @@ #include "all.h" -#include "9p1.h" +#include <fcall.h> + +/* 9p2 */ +int version(Chan*, Fcall*, Fcall*); +int attach(Chan*, Fcall*, Fcall*); +int walk(Chan*, Fcall*, Fcall*); +int fs_open(Chan*, Fcall*, Fcall*); +int fs_create(Chan*, Fcall*, Fcall*); +int fs_read(Chan*, Fcall*, Fcall*, uchar*); +int fs_write(Chan*, Fcall*, Fcall*); +int fs_remove(Chan*, Fcall*, Fcall*); -void -fcall9p1(Chan *cp, Fcall *in, Fcall *ou) +int +con_session(void) { - int t; + Fcall in, ou; + int err; - rlock(&mainlock); - t = in->type; - if(t < 0 || t >= MAXSYSCALL || (t&1) || !call9p1[t]) { - fprint(2, "bad message type %d\n", t); - panic(""); - } - ou->type = t+1; - ou->err = 0; + memset(&in, 0, sizeof(in)); + memset(&ou, 0, sizeof(ou)); - rlock(&cp->reflock); - (*call9p1[t])(cp, in, ou); - runlock(&cp->reflock); + in.type = Tversion; + in.version = VERSION9P; + in.msize = MAXDAT + IOHDRSZ; - if(ou->err && CHAT(cp)) - fprint(2, "\terror: %s\n", errstr9p[ou->err]); + rlock(&mainlock); + err = version(cons.chan, &in, &ou); runlock(&mainlock); -} -int -con_session(void) -{ - Fcall in, ou; - - in.type = Tsession; - fcall9p1(cons.chan, &in, &ou); - return ou.err; + return err; } int con_attach(int fid, char *uid, char *arg) { Fcall in, ou; + int err; + + memset(&in, 0, sizeof(in)); + memset(&ou, 0, sizeof(ou)); in.type = Tattach; in.fid = fid; - strncpy(in.uname, uid, NAMELEN); - strncpy(in.aname, arg, NAMELEN); - fcall9p1(cons.chan, &in, &ou); - return ou.err; + in.uname = uid; + in.aname = arg; + + rlock(&mainlock); + err = attach(cons.chan, &in, &ou); + runlock(&mainlock); + + return err; } int con_clone(int fid1, int fid2) { Fcall in, ou; + int err; - in.type = Tclone; + memset(&in, 0, sizeof(in)); + memset(&ou, 0, sizeof(ou)); + + in.type = Twalk; in.fid = fid1; in.newfid = fid2; - fcall9p1(cons.chan, &in, &ou); - return ou.err; + in.nwname = 0; + + rlock(&mainlock); + err = walk(cons.chan, &in, &ou); + runlock(&mainlock); + + return err; } int con_walk(int fid, char *name) { Fcall in, ou; + int err; + + memset(&in, 0, sizeof(in)); + memset(&ou, 0, sizeof(ou)); in.type = Twalk; in.fid = fid; - strncpy(in.name, name, NAMELEN); - fcall9p1(cons.chan, &in, &ou); - return ou.err; + in.newfid = fid; + in.wname[0] = name; + in.nwname = 1; + + rlock(&mainlock); + err = walk(cons.chan, &in, &ou); + runlock(&mainlock); + + return err; } int con_open(int fid, int mode) { Fcall in, ou; + int err; + + memset(&in, 0, sizeof(in)); + memset(&ou, 0, sizeof(ou)); in.type = Topen; in.fid = fid; in.mode = mode; - fcall9p1(cons.chan, &in, &ou); - return ou.err; + + rlock(&mainlock); + err = fs_open(cons.chan, &in, &ou); + runlock(&mainlock); + + return err; +} + +int +con_create(int fid, char *name, int uid, int gid, long perm, int mode) +{ + Fcall in, ou; + int err; + + cons.uid = uid; /* beyond ugly */ + cons.gid = gid; + + memset(&in, 0, sizeof(in)); + memset(&ou, 0, sizeof(ou)); + + in.type = Tcreate; + in.fid = fid; + in.mode = mode; + in.perm = perm; + in.name = name; + + rlock(&mainlock); + err = fs_create(cons.chan, &in, &ou); + runlock(&mainlock); + + return err; } int con_read(int fid, char *data, Off offset, int count) { Fcall in, ou; + int err; + + memset(&in, 0, sizeof(in)); + memset(&ou, 0, sizeof(ou)); in.type = Tread; in.fid = fid; in.offset = offset; in.count = count; - ou.data = data; - fcall9p1(cons.chan, &in, &ou); - if(ou.err) - return 0; - return ou.count; + + rlock(&mainlock); + err = fs_read(cons.chan, &in, &ou, (uchar*)data); + runlock(&mainlock); + + return err ? 0 : ou.count; } int con_write(int fid, char *data, Off offset, int count) { Fcall in, ou; + int err; + + memset(&in, 0, sizeof(in)); + memset(&ou, 0, sizeof(ou)); in.type = Twrite; in.fid = fid; - in.data = data; in.offset = offset; in.count = count; - fcall9p1(cons.chan, &in, &ou); - if(ou.err) - return 0; - return ou.count; + in.data = data; + + rlock(&mainlock); + err = fs_write(cons.chan, &in, &ou); + runlock(&mainlock); + + return err ? 0 : ou.count; } int con_remove(int fid) { Fcall in, ou; + int err; + + memset(&in, 0, sizeof(in)); + memset(&ou, 0, sizeof(ou)); in.type = Tremove; in.fid = fid; - fcall9p1(cons.chan, &in, &ou); - return ou.err; -} -int -con_create(int fid, char *name, int uid, int gid, long perm, int mode) -{ - Fcall in, ou; + rlock(&mainlock); + err = fs_remove(cons.chan, &in, &ou); + runlock(&mainlock); - in.type = Tcreate; - in.fid = fid; - strncpy(in.name, name, NAMELEN); - in.perm = perm; - in.mode = mode; - cons.uid = uid; /* beyond ugly */ - cons.gid = gid; - fcall9p1(cons.chan, &in, &ou); - return ou.err; + return err; } + int doclri(File *f) { @@ -196,14 +257,15 @@ out: return err; } -void +static int f_fstat(Chan *cp, Fcall *in, Fcall *ou) { File *f; Iobuf *p; Dentry *d; - int i; + int i, err; + err = 0; if(CHAT(cp)) { fprint(2, "c_fstat %d\n", cp->chan); fprint(2, "\tfid = %d\n", in->fid); @@ -212,7 +274,7 @@ f_fstat(Chan *cp, Fcall *in, Fcall *ou) p = 0; f = filep(cp, in->fid, 0); if(!f) { - ou->err = Efid; + err = Efid; goto out; } p = getbuf(f->fs->dev, f->addr, Brd); @@ -238,12 +300,33 @@ out: ou->fid = in->fid; if(f) qunlock(f); + return err; +} + +int +con_fstat(int fid) +{ + Fcall in, ou; + int err; + + memset(&in, 0, sizeof(in)); + memset(&ou, 0, sizeof(ou)); + + in.type = Tstat; + in.fid = fid; + + rlock(&mainlock); + err = f_fstat(cons.chan, &in, &ou); + runlock(&mainlock); + + return err; } -void +static int f_clri(Chan *cp, Fcall *in, Fcall *ou) { File *f; + int err; if(CHAT(cp)) { fprint(2, "c_clri %d\n", cp->chan); @@ -252,57 +335,33 @@ f_clri(Chan *cp, Fcall *in, Fcall *ou) f = filep(cp, in->fid, 0); if(!f) { - ou->err = Efid; + err = Efid; goto out; } - ou->err = doclri(f); + err = doclri(f); out: ou->fid = in->fid; if(f) qunlock(f); + return err; } int con_clri(int fid) { Fcall in, ou; - Chan *cp; + int err; + + memset(&in, 0, sizeof(in)); + memset(&ou, 0, sizeof(ou)); in.type = Tremove; in.fid = fid; - cp = cons.chan; rlock(&mainlock); - ou.type = Tremove+1; - ou.err = 0; - - rlock(&cp->reflock); - f_clri(cp, &in, &ou); - runlock(&cp->reflock); - + err = f_clri(cons.chan, &in, &ou); runlock(&mainlock); - return ou.err; -} - -int -con_fstat(int fid) -{ - Fcall in, ou; - Chan *cp; - in.type = Tstat; - in.fid = fid; - cp = cons.chan; - - rlock(&mainlock); - ou.type = Tstat+1; - ou.err = 0; - - rlock(&cp->reflock); - f_fstat(cp, &in, &ou); - runlock(&cp->reflock); - - runlock(&mainlock); - return ou.err; + return err; } diff --git a/sys/src/cmd/cwfs/cwfs/conf.c b/sys/src/cmd/cwfs/cwfs/conf.c index c27da0778..48ac243db 100644 --- a/sys/src/cmd/cwfs/cwfs/conf.c +++ b/sys/src/cmd/cwfs/cwfs/conf.c @@ -26,7 +26,6 @@ localconfinit(void) } int (*fsprotocol[])(Msgbuf*) = { - serve9p1, serve9p2, nil, }; diff --git a/sys/src/cmd/cwfs/emelie/conf.c b/sys/src/cmd/cwfs/emelie/conf.c index 5bd0207d2..79328a2d4 100644 --- a/sys/src/cmd/cwfs/emelie/conf.c +++ b/sys/src/cmd/cwfs/emelie/conf.c @@ -27,7 +27,6 @@ localconfinit(void) } int (*fsprotocol[])(Msgbuf*) = { - serve9p1, serve9p2, nil, }; diff --git a/sys/src/cmd/cwfs/fs/conf.c b/sys/src/cmd/cwfs/fs/conf.c index 842777e6f..8df007ebd 100644 --- a/sys/src/cmd/cwfs/fs/conf.c +++ b/sys/src/cmd/cwfs/fs/conf.c @@ -26,7 +26,6 @@ localconfinit(void) } int (*fsprotocol[])(Msgbuf*) = { - serve9p1, serve9p2, nil, }; diff --git a/sys/src/cmd/cwfs/main.c b/sys/src/cmd/cwfs/main.c index 97ce1cb42..96362f2b9 100644 --- a/sys/src/cmd/cwfs/main.c +++ b/sys/src/cmd/cwfs/main.c @@ -1,7 +1,6 @@ /* cached-worm file server */ #include "all.h" #include "io.h" -#include "9p1.h" Map *devmap; @@ -466,10 +465,11 @@ serve(void *) if (mb->data == nil) panic("serve: nil mb->data"); - /* better sniffing code in /sys/src/cmd/disk/kfs/9p12.c */ - if(cp->protocol == nil){ + if(cp->protocol != nil){ + /* process the request, generate an answer and reply */ + cp->protocol(mb); + } else { /* do we recognise the protocol in this packet? */ - /* better sniffing code: /sys/src/cmd/disk/kfs/9p12.c */ for(i = 0; fsprotocol[i] != nil; i++) if(fsprotocol[i](mb) != 0) { cp->protocol = fsprotocol[i]; @@ -479,9 +479,7 @@ serve(void *) fprint(2, "no protocol for message\n"); hexdump(mb->data, 12); } - } else - /* process the request, generate an answer and reply */ - cp->protocol(mb); + } mbfree(mb); runlock(&mainlock); diff --git a/sys/src/cmd/cwfs/portfns.h b/sys/src/cmd/cwfs/portfns.h index d6628c640..dbf1b8b6c 100644 --- a/sys/src/cmd/cwfs/portfns.h +++ b/sys/src/cmd/cwfs/portfns.h @@ -1,6 +1,5 @@ void accessdir(Iobuf*, Dentry*, int, int); void addfree(Device*, Off, Superb*); -void arpstart(void); void arginit(void); void* authnew(void); void authfree(void*); @@ -12,25 +11,17 @@ Device* config(void); Off bufalloc(Device*, int, long, int); void buffree(Device*, Off, int, Truncstate *); int byuid(void*, void*); -int canlock(Lock*); -int canqlock(QLock*); void cfsdump(Filsys*); void chanhangup(Chan *cp, char *msg); Chan* fs_chaninit(int, int); void cmd_check(int, char*[]); void cmd_users(int, char*[]); void cmd_newuser(int, char*[]); -void cmd_netdb(int, char*[]); void cmd_printconf(int, char*[]); void cmd_wormreset(int, char *[]); int checkname(char*); int checktag(Iobuf*, int, Off); -int cksum(void*, int, int); -int cksum0(int, int); -void cyclstart(void); -void dotrace(int); void consserve(void); -int conslock(void); int con_attach(int, char*, char*); int con_clone(int, int); int con_create(int, char*, int, int, long, int); @@ -75,11 +66,7 @@ void netstart(void); void exit(void); void fileinit(Chan*); File* filep(Chan*, ulong, int); -void firmware(void); -int fname(char*); -int fpair(char*, char*); void formatinit(void); -int fread(void*, int); void freefp(File*); void freewp(Wpath*); Filsys* fsstr(char*); @@ -91,7 +78,6 @@ int fwormwrite(Device*, Off, void*); Iobuf* getbuf(Device*, Off, int); char* getwrd(char*, char*); Dentry* getdir(Iobuf*, int); -Chan* getlcp(uchar*, long); Off getraddr(Device*); void hexdump(void*, int); int iaccess(File*, Dentry*, int); @@ -101,7 +87,6 @@ Off ibbpowsum(int); Device* iconfig(char *); Off indfetch(Device*, Off, Off, Off , int, int, int); int ingroup(int, int); -int inh(int, uchar*); Devsize inqsize(char *file); void iobufinit(void); void* iobufmap(Iobuf*); @@ -115,13 +100,8 @@ void jukeream(Device*); void jukerecover(Device*); Off jukesaddr(Device*); Devsize jukesize(Device*); -void kbdchar(int); -void lights(int, int); -void launchinit(void); void localconfinit(void); int leadgroup(int, int); -void lock(Lock*); -void lockinit(void); void machinit(void); Msgbuf* mballoc(int, Chan*, int); void mbinit(void); @@ -143,13 +123,11 @@ void mlevinit(Device*); int mlevread(Device*, Off, void*); Devsize mlevsize(Device*); int mlevwrite(Device*, Off, void*); -int nametokey(char*, char*); File* newfp(void); void newscsi(Device *d, Scsi *sc); Queue* newqueue(int, char*); void newstart(void); Wpath* newwp(void); -int nvrcheck(void); char* nvrgetconfig(void); int nvrsetconfig(char*); int walkto(char*); @@ -164,23 +142,15 @@ int partwrite(Device*, Off, void*); void prdate(void); void preread(Device*, Off); int prime(vlong); -void printinit(void); -void procinit(void); void procsetname(char *fmt, ...); void putbuf(Iobuf*); Off qidpathgen(Device*); -void qlock(QLock*); void* querychanger(Device *); -void qunlock(QLock*); void rahead(void *); void ream(Filsys*); void* fs_recv(Queue*, int); void rootream(Device*, Off); int roread(Device*, Off, void*); -void rstate(Chan*, int); -Timet rtc2sec(Rtc *); -void sched(void); -void schedinit(void); int scsiio(Device*, int, uchar*, int, void*, int); void scsiinit(void); Off scsiread(int, void*, long); @@ -190,10 +160,8 @@ char* sdof(Device*); void sec2rtc(Timet, Rtc *); void fs_send(Queue*, void*); void serve(void *); -int serve9p1(Msgbuf*); int serve9p2(Msgbuf*); void settag(Iobuf*, int, long); -void settime(Timet); int strtouid(char*); Off superaddr(Device*); void superream(Device*, Off); @@ -208,11 +176,8 @@ int Tfmt(Fmt*); Timet nextime(Timet, int, int); Tlock* tlocked(Iobuf*, Dentry*); Timet toytime(void); -Timet rtctime(void); -void setrtc(Timet); void uidtostr(char*, int, int); Uid* uidpstr(char*); -void unlock(Lock*); void newproc(void(*)(void *), void*, char*); void wormcopy(void *); void wormprobe(void); @@ -232,4 +197,3 @@ void cmd_install(char*, char*, void (*)(int, char*[])); ulong flag_install(char*, char*); void srvinit(void); Chan *srvchan(int, char *); - diff --git a/sys/src/cmd/cwfs/portmkfile b/sys/src/cmd/cwfs/portmkfile index c49e23f22..5c69dbf8f 100644 --- a/sys/src/cmd/cwfs/portmkfile +++ b/sys/src/cmd/cwfs/portmkfile @@ -3,8 +3,6 @@ BIN=/$objtype/bin TARG=cwfs$FS OFILES=\ - 9p1.$O\ - 9p1lib.$O\ 9p2.$O\ auth.$O\ chk.$O\ @@ -33,7 +31,6 @@ HFILES=\ ../32bit.h\ ../64bit.h\ ../64xbit.h\ - ../9p1.h\ ../all.h\ dat.h\ ../io.h\ |