From e44792ff9c7d95ff8d7680e3f4eb1419930e8050 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 8 Aug 2001 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2001-08-08 --- bitsy/mem.h | 2 +- bitsy/power.c | 7 ++- bitsy/screen.c | 8 +-- boot/doauthenticate.c | 23 ++++++--- port/auth.c | 114 ++++++++++++------------------------------ port/devdraw.c | 8 +-- port/devmnt.c | 30 ++--------- port/portfns.h | 1 - 8 files changed, 59 insertions(+), 134 deletions(-) diff --git a/bitsy/mem.h b/bitsy/mem.h index 3a47ade0f9caa4857f670c438c8957ce275b58f8..c92a3d93dfac073e4c56ef27049ec30bb800517f 100644 --- a/bitsy/mem.h +++ b/bitsy/mem.h @@ -70,7 +70,7 @@ */ #define Flash_bootldr (FLASHZERO+0x0) /* boot loader */ #define Flash_kernel (FLASHZERO+0x10000) /* boot kernel */ -#define Flash_tar (FLASHZERO+0x100000) /* tar file containing fs.sac */ +#define Flash_tar (FLASHZERO+0x200000) /* fs.sac (tar file) */ /* * virtual MMU diff --git a/bitsy/power.c b/bitsy/power.c index acc220f6bcc7b35526c78a7b6d507bff82bd7f90..d0f74d84d7943c18a60ab541002fa5b6bb3507fa 100644 --- a/bitsy/power.c +++ b/bitsy/power.c @@ -78,7 +78,9 @@ static void sa1100_power_off(void) { - /* enable wakeup by µcontroller, on/off switch or real-time clock alarm */ + /* enable wakeup by µcontroller, on/off switch + * or real-time clock alarm + */ powerregs->pwer = 1 << IRQrtc | 1 << IRQgpio0 | 1 << IRQgpio1; /* clear previous reset status */ @@ -88,7 +90,8 @@ sa1100_power_off(void) powerregs->pcfr = PCFR_opde | PCFR_fp | PCFR_fs; powerregs->pgsr = 0; /* set resume address. The loader jumps to it */ - powerregs->pspr = (ulong)sa1100_power_resume; +// powerregs->pspr = (ulong)sa1100_power_resume; + powerregs->pspr = 0; /* set lowest clock; delay to avoid resume hangs on fast sa1110 */ delay(90); diff --git a/bitsy/screen.c b/bitsy/screen.c index cf59d514f55f672bbb871741b43b0fdef13b1b82..bb2cb529d89ab7e4a4ba5f9c0285e6a344956c5e 100644 --- a/bitsy/screen.c +++ b/bitsy/screen.c @@ -212,13 +212,7 @@ lcdtweak(Cmdbuf *cmd) void screenpower(int on) { - if (on == 0){ - memmove(savedpalette, framebuf->palette, sizeof framebuf->palette); - blankscreen(1); - } else { - memmove(framebuf->palette, savedpalette, sizeof framebuf->palette); - blankscreen(0); - } + blankscreen(on == 0); } void diff --git a/boot/doauthenticate.c b/boot/doauthenticate.c index d89983947a78abbd576ffb0c5c1ce05829731457..f632ab08e29d36d69e07a63e25db4072f3acee12 100644 --- a/boot/doauthenticate.c +++ b/boot/doauthenticate.c @@ -73,21 +73,28 @@ void doauthenticate(int fd, Method *mp) { char *msg; - char authlist[1024]; + char trbuf[TICKREQLEN]; + char tbuf[2*TICKETLEN]; print("session..."); - if(fsession(fd, authlist, sizeof authlist) < 0) -{print("boot failed in session: %r\n"); + if(fsession(fd, trbuf, sizeof trbuf) < 0) fatal("session command failed"); -} - -print("boot says session done\n"); /* no authentication required? */ - if(authlist[0] == 0) + memset(tbuf, 0, 2*TICKETLEN); + if(trbuf[0] == 0) return; - print("not authenticated!!!\n"); + /* try getting to an auth server */ + print("getting ticket..."); + msg = fromauth(mp, trbuf, tbuf); + print("authenticating..."); + if(msg == 0) + if(fauth(fd, tbuf) >= 0) + return; + + /* didn't work, go for the security hole */ + fprint(2, "no authentication server (%s), using your key as server key\n", msg); } char* diff --git a/port/auth.c b/port/auth.c index addaec29f151d16bd4cac1d8b82108435f5d7ecc..1bdfe04e630a0e73977b66bc975b73b6d75ae541 100644 --- a/port/auth.c +++ b/port/auth.c @@ -11,31 +11,6 @@ char *eve; char evekey[DESKEYLEN]; char hostdomain[DOMLEN]; -struct Session -{ - char *authlist; -}; - -Session* -allocsession(char *authlist) -{ - Session *s; - - s = smalloc(sizeof(*s)); - s->authlist = nil; - kstrdup(&s->authlist, authlist); - return s; -} - -void -freesession(Session *s) -{ - if(s == nil) - return; - free(s->authlist); - free(s); -} - /* * return true if current user is eve */ @@ -136,16 +111,36 @@ Return: return m; } -void -sendsession(Chan *c) +long +sysfsession(ulong *arg) { Fcall f; uchar *msg; - uint n, m; + uint authlen, n, m; + Chan *c; uvlong oo; +//BUG print("warning: stub fsession being used\n"); + authlen = arg[2]; + validaddr(arg[1], authlen, 1); + c = fdtochan(arg[0], ORDWR, 0, 1); + if(waserror()){ + cclose(c); + nexterror(); + } + + if(c->flag & CMSG){ +//BUG what to do? + ((uchar*)arg[1])[0] = 0; + poperror(); + cclose(c); + return 0; + } + f.type = Tsession; f.tag = NOTAG; + f.nchal = 0; + f.chal = (uchar*)""; msg = smalloc(8192+IOHDRSZ); if(waserror()){ free(msg); @@ -161,7 +156,6 @@ sendsession(Chan *c) unlock(c); m = devtab[c->type]->write(c, msg, n, oo); -print("session sent\n"); if(m < n){ lock(c); @@ -174,78 +168,34 @@ print("session sent\n"); m = devtab[c->type]->read(c, msg, 8192+IOHDRSZ, c->offset); if(m <= 0) error("EOF receiving fsession reply"); -print("rsession rcvd\n"); lock(c); c->offset += m; unlock(c); n = convM2S(msg, m, &f); -print("rsession conv returns %d\n", n); if(n != m) error("bad fsession conversion on reply"); if(f.type != Rsession) error("unexpected reply type in fsession"); - c->session = allocsession(f.authlist); + m = f.nchal; + if(m > authlen) + error(Eshort); +//BUG print("auth stuff ignored; noauth by default\n"); + ((uchar*)arg[1])[0] = 0; free(msg); poperror(); -} - -long -sysfsession(ulong *arg) -{ - Chan *c; - uint authlen, n; - - authlen = arg[2]; - validaddr(arg[1], authlen, 1); - c = fdtochan(arg[0], ORDWR, 0, 1); - if(waserror()){ - cclose(c); - nexterror(); - } - - if(c->session == nil){ - if(c->flag&CMSG) - error("session on mounted channel"); - sendsession(c); - } - - n = strlen(c->session->authlist)+1; - if(n > authlen) - error(Eshort); - memmove((uchar*)arg[1], c->session->authlist, n); - poperror(); cclose(c); - return n; - + return m; } long -sysfauth(ulong *arg) +sysfauth(ulong *) { - Chan *c; - uint authlen, rauthlen; - int n; - - authlen = arg[2]; - validaddr(arg[1], authlen, 1); - rauthlen = arg[4]; - validaddr(arg[3], rauthlen, 1); - c = fdtochan(arg[0], ORDWR, 0, 1); - if(waserror()){ - cclose(c); - nexterror(); - } - - n = mntauth(c, (uchar*)arg[1], authlen, (uchar*)arg[3], rauthlen); - - poperror(); - cclose(c); - return n; - + error("sysfauth unimplemented"); + return -1; } /* diff --git a/port/devdraw.c b/port/devdraw.c index bc4dd2b786569612f57c8a6cdfe2a17d58daebbb..f6e4a22801d1bf771ac65fcd6161b118e5e56043 100644 --- a/port/devdraw.c +++ b/port/devdraw.c @@ -303,14 +303,13 @@ drawrefreshscreen(DImage *l, Client *client) static void -drawrefresh(Memimage *l, Rectangle r, void *v) +drawrefresh(Memimage*, Rectangle r, void *v) { Refx *x; DImage *d; Client *c; Refresh *ref; - USED(l); if(v == 0) return; x = v; @@ -1014,7 +1013,6 @@ drawread(Chan *c, void *a, long n, vlong off) ulong offset = off; char buf[16]; - USED(offset); if(c->qid.type & QTDIR) return devdirread(c, a, n, 0, 0, drawgen); cl = drawclient(c); @@ -1121,14 +1119,12 @@ drawwakeall(void) } static long -drawwrite(Chan *c, void *a, long n, vlong off) +drawwrite(Chan *c, void *a, long n, vlong) { char buf[128], *fields[4], *q; Client *cl; int i, m, red, green, blue, x; - ulong offset = off; - USED(offset); if(c->qid.type & QTDIR) error(Eisdir); cl = drawclient(c); diff --git a/port/devmnt.c b/port/devmnt.c index 02bbd51412efda8b7115fb31cbc1bf55ed4c3851..bfb041fe342bd23989f6bea5b2f8724943d51b68 100644 --- a/port/devmnt.c +++ b/port/devmnt.c @@ -37,6 +37,7 @@ struct Mntalloc }mntalloc; void mattach(Mnt*, Chan*, char*); +void mntauth(Mnt*, Mntrpc*, char*, ushort); Mnt* mntchk(Chan*); void mntdirfix(uchar*, Chan*); Mntrpc* mntflushalloc(Mntrpc*, ulong); @@ -192,6 +193,8 @@ mattach(Mnt *m, Chan *c, char *spec) r->request.fid = c->fid; r->request.uname = up->user; r->request.aname = spec; + r->request.nauth = 0; + r->request.auth = (uchar*)""; mountrpc(m, r); c->qid = r->reply.qid; @@ -460,33 +463,6 @@ mntwstat(Chan *c, uchar *dp, int n) return n; } -int -mntauth(Chan *c, uchar *auth, int nauth, uchar *rauth, int nrauth) -{ - int n; - Mnt *m; - Mntrpc *r; - - m = mntchk(c); - r = mntralloc(c, m->c->iounit); - if(waserror()) { - mntfree(r); - nexterror(); - } - r->request.type = Tauth; - r->request.fid = c->fid; - r->request.nauth = nauth; - r->request.auth = auth; - mountrpc(m, r); - n = r->reply.nrauth; - if(nrauth < n) - error(Eshort); - memmove(rauth, r->reply.rauth, n); - poperror(); - mntfree(r); - return n; -} - static long mntread(Chan *c, void *buf, long n, vlong off) { diff --git a/port/portfns.h b/port/portfns.h index 306b4696d3298ecff42b03c98625c229fd7fb92c..d4e2eed19132e59a92ff9a9822e740956d4b9af5 100644 --- a/port/portfns.h +++ b/port/portfns.h @@ -162,7 +162,6 @@ void microdelay(int); void mkqid(Qid*, vlong, ulong, int); void mmurelease(Proc*); void mmuswitch(Proc*); -int mntauth(Chan*, uchar*, int, uchar*, int); void mntdump(void); void mountfree(Mount*); ulong msize(void*);