~kris/9p

9hist

7d76766e9f55a322c8c6c250c27a77caa8b56a8b — David du Colombier 28 years ago 11d2274
Plan 9 from Bell Labs 1998-04-17
6 files changed, 147 insertions(+), 26 deletions(-)

M carrera/kbd.c
M carrera/screen.h
M pc/mouse.c
M pc/screen.h
M port/devmouse.c
M port/devssl.c
M carrera/kbd.c => carrera/kbd.c +3 -3
@@ 397,11 397,11 @@ kbdinit(void)
}

void
mousectl(char *cmd)
mousectl(char* field[], int)
{
	int s;

	if(strncmp(cmd, "reset", 5) == 0){
	if(strncmp(field[0], "reset", 5) == 0){
		s = splhi();
		mousecmd(0xF6);
		mousecmd(0xEA);	/* streaming */


@@ 410,7 410,7 @@ mousectl(char *cmd)
		mousecmd(0xF4);	/* enabled */
		splx(s);
	}
	else if(strcmp(cmd, "accelerated") == 0){
	else if(strcmp(field[0], "accelerated") == 0){
		s = splhi();
		mousecmd(0xE7);
		splx(s);

M carrera/screen.h => carrera/screen.h +1 -1
@@ 14,5 14,5 @@ extern int	cursoron(int);
extern Point	mousexy(void);
void		setcursor(Cursor*);

void		mousectl(char*);
void		mousectl(char*[], int);
void		mousetrack(int, int, int);

M pc/mouse.c => pc/mouse.c +2 -7
@@ 101,12 101,8 @@ ps2mouse(void)
}

void
mousectl(char* arg)
mousectl(char* field[], int n)
{
	int n;
	char *field[3];

	n = parsefields(arg, field, 3, " ");
	if(strncmp(field[0], "serial", 6) == 0){
		switch(n){
		case 1:


@@ 154,8 150,7 @@ mousectl(char* arg)
			i8042auxcmd(n);
			break;
		}
	} else if(strcmp(field[0], "swap") == 0)
		mouseswap ^= 1;
	}
	else
		error(Ebadctl);
}

M pc/screen.h => pc/screen.h +1 -2
@@ 11,7 11,6 @@ extern Point mousexy(void);
extern void mouseaccelerate(char*);
extern int m3mouseputc(void*, int);
extern int mouseputc(void*, int);
extern int mouseswap;

extern Cursorinfo cursor;
extern Cursor arrow;


@@ 106,7 105,7 @@ enum {
};

/* mouse.c */
extern void mousectl(char*);
extern void mousectl(char*[], int);

/* screen.c */
extern void	flushmemscreen(Rectangle);

M port/devmouse.c => port/devmouse.c +68 -5
@@ 34,7 34,6 @@ struct Mouseinfo
Mouseinfo	mouse;
Cursorinfo	cursor;
int		mouseshifted;
int		mouseswap;
Cursor		curs;

void	Cursortocursor(Cursor*);


@@ 48,12 47,17 @@ enum{
	Qmousectl,
};

Dirtab mousedir[]={
static Dirtab mousedir[]={
	"cursor",	{Qcursor},	0,			0666,
	"mouse",	{Qmouse},	0,			0666,
	"mousectl",	{Qmousectl},	0,			0220,
};

static uchar buttonmap[8] = {
	0, 1, 2, 3, 4, 5, 6, 7,
};
static int mouseswap;

extern	Memimage	gscreen;

static void


@@ 194,7 198,7 @@ mouseread(Chan *c, void *va, long n, vlong off)

		sprint(buf, "m%11d %11d %11d %11d",
			mouse.xy.x, mouse.xy.y,
			mouseswap ? map[mouse.buttons&7] : mouse.buttons,
			buttonmap[mouse.buttons&7],
			TK2MS(MACHP(0)->ticks));
		mouse.lastcounter = mouse.counter;
		unlock(&cursor);


@@ 206,12 210,56 @@ mouseread(Chan *c, void *va, long n, vlong off)
	return 0;
}

static void
setbuttonmap(char* map)
{
	int i, x, one, two, three;

	one = two = three = 0;
	for(i = 0; i < 3; i++){
		if(map[i] == 0)
			error(Ebadarg);
		if(map[i] == '1'){
			if(one)
				error(Ebadarg);
			one = 1<<i;
		}
		else if(map[i] == '2'){
			if(two)
				error(Ebadarg);
			two = 1<<i;
		}
		else if(map[i] == '3'){
			if(three)
				error(Ebadarg);
			three = 1<<i;
		}
		else
			error(Ebadarg);
	}
	if(map[i])
		error(Ebadarg);

	memset(buttonmap, 0, 8);
	for(i = 0; i < 8; i++){
		x = 0;
		if(i & 1)
			x |= one;
		if(i & 2)
			x |= two;
		if(i & 4)
			x |= three;
		buttonmap[x] = i;
	}
}

static long
mousewrite(Chan *c, void *va, long n, vlong)
{
	char *p;
	Point pt;
	char buf[64];
	char buf[64], *field[3];
	int nf;

	p = va;
	switch(c->qid.path){


@@ 246,7 294,22 @@ mousewrite(Chan *c, void *va, long n, vlong)
			buf[n-1] = 0;
		else
			buf[n] = 0;
		mousectl(buf);
		nf = parsefields(buf, field, 3, " ");
		if(strcmp(field[0], "swap") == 0){
			if(mouseswap)
				setbuttonmap("123");
			else
				setbuttonmap("321");
			mouseswap ^= 1;
		}
		else if(strcmp(field[0], "buttonmap") == 0){
			if(nf == 1)
				setbuttonmap("123");
			else
				setbuttonmap(field[1]);
		}
		else
			mousectl(field, nf);
		return n;

	case Qmouse:

M port/devssl.c => port/devssl.c +72 -8
@@ 72,6 72,8 @@ Lock	dslock;
int	dshiwat;
int	maxdstate = 20;
Dstate** dstate;
char	*encalgs;
char	*hashalgs;

enum
{


@@ 81,12 83,15 @@ enum

enum{
	Qtopdir		= 1,	/* top level directory */
	Qprotodir,
	Qclonus,
	Qconvdir,		/* directory for a conversation */
	Qdata,
	Qctl,
	Qsecretin,
	Qsecretout
	Qsecretout,
	Qencalgs,
	Qhashalgs,
};

#define TYPE(x) 	((x).path & 0xf)


@@ 117,6 122,12 @@ sslgen(Chan *c, Dirtab *d, int nd, int s, Dir *dp)
	q.vers = 0;
	switch(TYPE(c->qid)) {
	case Qtopdir:
		if(s > 0)
			return -1;
		q.path = QID(0, Qprotodir)|CHDIR;
		devdir(c, q, "ssl", 0, eve, 0555, dp);
		return 1;
	case Qprotodir:
		if(s < dshiwat) {
			sprint(name, "%d", s);
			q.path = QID(s, Qconvdir)|CHDIR;


@@ 158,6 169,14 @@ sslgen(Chan *c, Dirtab *d, int nd, int s, Dir *dp)
			q.path = QID(CONV(c->qid), Qsecretout);
			p = "secretout";
			break;
		case 4:
			q.path = QID(CONV(c->qid), Qencalgs);
			p = "encalgs";
			break;
		case 5:
			q.path = QID(CONV(c->qid), Qhashalgs);
			p = "hashalgs";
			break;
		}
		devdir(c, q, p, 0, nm, 0660, dp);
		return 1;


@@ 165,13 184,6 @@ sslgen(Chan *c, Dirtab *d, int nd, int s, Dir *dp)
	return -1;
}

static void
sslinit(void)
{
	if((dstate = smalloc(sizeof(Dstate*) * maxdstate)) == 0)
		panic("sslinit");
}

static Chan*
sslattach(void *spec)
{


@@ 219,6 231,7 @@ sslopen(Chan *c, int omode)
	default:
		panic("sslopen");
	case Qtopdir:
	case Qprotodir:
	case Qconvdir:
		if(omode != OREAD)
			error(Eperm);


@@ 252,6 265,11 @@ sslopen(Chan *c, int omode)
		unlock(&dslock);
		poperror();
		break;
	case Qencalgs:
	case Qhashalgs:
		if(omode != OREAD)
			error(Eperm);
		break;
	}
	c->mode = openmode(omode);
	c->flag |= COPEN;


@@ 534,6 552,12 @@ sslread(Chan *c, void *a, long n, vlong off)
	case Qdata:
		b.b = sslbread(c, n, offset);
		break;
	case Qencalgs:
		return readstr(offset, a, n, encalgs);
		break;
	case Qhashalgs:
		return readstr(offset, a, n, hashalgs);
		break;
	}

	if(waserror()){


@@ 922,6 946,46 @@ out:
	return n;
}

static void
sslinit(void)
{
	struct Encalg *e;
	struct Hashalg *h;
	int n;
	char *cp;

	if((dstate = smalloc(sizeof(Dstate*) * maxdstate)) == 0)
		panic("sslinit");

	n = 1;
	for(e = encrypttab; e->name != nil; e++)
		n += strlen(e->name) + 1;
	cp = encalgs = smalloc(n);
	for(e = encrypttab;;){
		strcpy(cp, e->name);
		cp += strlen(e->name);
		e++;
		if(e->name == nil)
			break;
		*cp++ = ' ';
	}
	*cp = 0;

	n = 1;
	for(h = hashtab; h->name != nil; h++)
		n += strlen(h->name) + 1;
	cp = hashalgs = smalloc(n);
	for(h = hashtab;;){
		strcpy(cp, h->name);
		cp += strlen(h->name);
		h++;
		if(h->name == nil)
			break;
		*cp++ = ' ';
	}
	*cp = 0;
}

Dev ssldevtab = {
	'D',
	"ssl",