~kris/9p

9hist

e44792ff9c7d95ff8d7680e3f4eb1419930e8050 — David du Colombier 25 years ago 597ca1e
Plan 9 from Bell Labs 2001-08-08
8 files changed, 59 insertions(+), 134 deletions(-)

M bitsy/mem.h
M bitsy/power.c
M bitsy/screen.c
M boot/doauthenticate.c
M port/auth.c
M port/devdraw.c
M port/devmnt.c
M port/portfns.h
M bitsy/mem.h => bitsy/mem.h +1 -1
@@ 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

M bitsy/power.c => bitsy/power.c +5 -2
@@ 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);

M bitsy/screen.c => bitsy/screen.c +1 -7
@@ 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

M boot/doauthenticate.c => boot/doauthenticate.c +15 -8
@@ 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*

M port/auth.c => port/auth.c +32 -82
@@ 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;
}

/*

M port/devdraw.c => port/devdraw.c +2 -6
@@ 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);

M port/devmnt.c => port/devmnt.c +3 -27
@@ 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)
{

M port/portfns.h => port/portfns.h +0 -1
@@ 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*);