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",