From 7d76766e9f55a322c8c6c250c27a77caa8b56a8b Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 17 Apr 1998 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1998-04-17 --- carrera/kbd.c | 6 ++-- carrera/screen.h | 2 +- pc/mouse.c | 9 ++---- pc/screen.h | 3 +- port/devmouse.c | 73 ++++++++++++++++++++++++++++++++++++++++--- port/devssl.c | 80 +++++++++++++++++++++++++++++++++++++++++++----- 6 files changed, 147 insertions(+), 26 deletions(-) diff --git a/carrera/kbd.c b/carrera/kbd.c index 18b29ce9e4948ab5e045211f39c08047a1a8398a..d02d2d66004fc6bb3a8898cf05b0d8ba4982cc6a 100644 --- a/carrera/kbd.c +++ b/carrera/kbd.c @@ -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); diff --git a/carrera/screen.h b/carrera/screen.h index a1af648a93605478afc66a9e0de08c916905e414..427db66f23a4f6ada93e497f45143a0a265ae6c4 100644 --- a/carrera/screen.h +++ b/carrera/screen.h @@ -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); diff --git a/pc/mouse.c b/pc/mouse.c index e1165d0bd434689b0965d0ce1d6af60ada3ebc76..6cc0a1278fb0c11758f41ef4f9707d94946155b8 100644 --- a/pc/mouse.c +++ b/pc/mouse.c @@ -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); } diff --git a/pc/screen.h b/pc/screen.h index f8ab293d73c2299301aadceb1f1df7944159fd7d..c6b0f8b9d0ff75cbe4a6447affa4dda390f7e355 100644 --- a/pc/screen.h +++ b/pc/screen.h @@ -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); diff --git a/port/devmouse.c b/port/devmouse.c index 438fab6ad8ad88088306b2f91991aebf04964572..432385a1ad6821022a417bd1245b3cdb6c7fdce0 100644 --- a/port/devmouse.c +++ b/port/devmouse.c @@ -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<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: diff --git a/port/devssl.c b/port/devssl.c index 95dc506fd5f93d87eb45334c7714433d3bb1c424..cc22f7f79f539cd02a5187219d62d02c3daeaf55 100644 --- a/port/devssl.c +++ b/port/devssl.c @@ -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",