shithub: drawterm

Download patch

ref: 7d2ec9b8dfb18ee013cf27263bb6fe77d72f0f9c
parent: 08a8630d027531e475ce1103f292bc664e57097b
parent: 9bec8b1ae32dc666388f767d9770b1eac1186f0a
author: 23hiro <[email protected]>
date: Sat Feb 20 22:55:12 EST 2016

merge

binary files a/9ball.ico /dev/null differ
binary files a/9ball.png /dev/null differ
--- a/9ball.rc
+++ /dev/null
@@ -1,1 +1,0 @@
-IDI_ICON1 ICON DISCARDABLE "9ball.ico"
--- a/Make.win32
+++ b/Make.win32
@@ -19,7 +19,7 @@
 LDFLAGS=-mwindows
 LDADD=-lkernel32 -ladvapi32 -lgdi32 -lmpr -lwsock32 -lmsvcrt -lmingw32
 TARG=drawterm.exe
-XOFILES=9ball.$O
+XOFILES=glenda-t.$O
 
 # Windows via MSVC
 #AR=???
@@ -37,6 +37,6 @@
 libmachdep.a:
 	(cd win32-386; make)
 
-9ball.$O: 9ball.rc 9ball.ico
-	$(WINDRES) -i 9ball.rc -o 9ball.o
+glenda-t.$O: glenda-t.rc glenda-t.ico
+	$(WINDRES) -i glenda-t.rc -o glenda-t.o
 
binary files a/drawterm.ico /dev/null differ
--- a/drawterm.rc
+++ b/drawterm.rc
@@ -28,7 +28,7 @@
 
 // Icon with lowest ID value placed first to ensure application icon
 // remains consistent on all systems.
-IDI_ICON1               ICON    DISCARDABLE     "drawterm.ico"
+IDI_ICON1               ICON    DISCARDABLE     "glenda-t.ico"
 
 #ifdef APSTUDIO_INVOKED
 /////////////////////////////////////////////////////////////////////////////
binary files /dev/null b/glenda-t.ico differ
--- /dev/null
+++ b/glenda-t.rc
@@ -1,0 +1,1 @@
+101 ICON DISCARDABLE "glenda-t.ico"
--- a/gui-win32/screen.c
+++ b/gui-win32/screen.c
@@ -186,7 +186,7 @@
 	wc.cbClsExtra = 0;
 	wc.cbWndExtra = 0;
 	wc.hInstance = inst;
-	wc.hIcon = LoadIcon(inst, NULL);
+	wc.hIcon = LoadIcon(inst, MAKEINTRESOURCE(101));
 	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
 	wc.hbrBackground = GetStockObject(WHITE_BRUSH);
 	wc.lpszMenuName = 0;
@@ -416,8 +416,7 @@
 			kbdputc(kbdq, Kins);
 			break;
 		case VK_DELETE:
-//			kbdputc(kbdq, Kdel);
-			kbdputc(kbdq, 0x7f);	// should have Kdel in keyboard.h
+			kbdputc(kbdq, Kdel);
 			break;
 		case VK_UP:
 			kbdputc(kbdq, Kup);
--- a/include/keyboard.h
+++ b/include/keyboard.h
@@ -1,8 +1,3 @@
-#ifdef PLAN9
-#pragma src "/sys/src/libdraw"
-#pragma lib "libdraw.a"
-#endif
-
 typedef struct 	Keyboardctl Keyboardctl;
 typedef struct	Channel	Channel;
 
@@ -18,27 +13,50 @@
 
 
 extern	Keyboardctl*	initkeyboard(char*);
-extern	int			ctlkeyboard(Keyboardctl*, char*);
-extern	void			closekeyboard(Keyboardctl*);
+extern	int		ctlkeyboard(Keyboardctl*, char*);
+extern	void		closekeyboard(Keyboardctl*);
 
 enum {
-    KF= 0xF000, /* Rune: beginning of private Unicode space */
-    Spec=   0xF800,
-    /* KF|1, KF|2, ..., KF|0xC is F1, F2, ..., F12 */
-    Khome=  KF|0x0D,
-    Kup=    KF|0x0E,
-    Kpgup=  KF|0x0F,
-    Kprint= KF|0x10,
-    Kleft=  KF|0x11,
-    Kright= KF|0x12,
-    Kdown=  Spec|0x00,
-    Kview=  Spec|0x00,  
-    Kpgdown=    KF|0x13,
-    Kins=   KF|0x14,
-    Kend=   KF|0x18,
+	KF=	0xF000,	/* Rune: beginning of private Unicode space */
+	Spec=	0xF800,
+	PF=	Spec|0x20,	/* num pad function key */
+	Kview=	Spec|0x00,	/* view (shift window up) */
+	/* KF|1, KF|2, ..., KF|0xC is F1, F2, ..., F12 */
+	Khome=	KF|0x0D,
+	Kup=	KF|0x0E,
+	Kdown=	Kview,
+	Kpgup=	KF|0x0F,
+	Kprint=	KF|0x10,
+	Kleft=	KF|0x11,
+	Kright=	KF|0x12,
+	Kpgdown=	KF|0x13,
+	Kins=	KF|0x14,
 
-    Kalt=       KF|0x15,
-    Kshift= KF|0x16,    
-    Kctl=       KF|0x17,
-};
+	Kalt=	KF|0x15,
+	Kshift=	KF|0x16,
+	Kctl=	KF|0x17,
 
+	Kend=	KF|0x18,
+	Kscroll=	KF|0x19,
+	Kscrolloneup=	KF|0x20,
+	Kscrollonedown=	KF|0x21,
+
+	Ksoh=	0x01,
+	Kstx=	0x02,
+	Ketx=	0x03,
+	Keof=	0x04,
+	Kenq=	0x05,
+	Kack=	0x06,
+	Kbs=	0x08,
+	Knack=	0x15,
+	Ketb=	0x17,
+	Kdel=	0x7f,
+	Kesc=	0x1b,
+
+	Kbreak=	Spec|0x61,
+	Kcaps=	Spec|0x64,
+	Knum=	Spec|0x65,
+	Kmiddle=	Spec|0x66,
+	Kaltgr=	Spec|0x67,
+	Kmouse=	Spec|0x100,
+};
--- a/kern/devssl.c
+++ b/kern/devssl.c
@@ -7,7 +7,7 @@
 #include	"fns.h"
 #include	"error.h"
 
-#include	"libsec.h"
+#include	<libsec.h>
 
 #define NOSPOOKS 1
 
@@ -72,15 +72,15 @@
 enum
 {
 	Maxdmsg=	1<<16,
-	Maxdstate=	128,	/* must be a power of 2 */
+	Maxdstate=	512,	/* max. open ssl conn's; must be a power of 2 */
 };
 
-Lock	dslock;
-int	dshiwat;
-char	*dsname[Maxdstate];
-Dstate	*dstate[Maxdstate];
-char	*encalgs;
-char	*hashalgs;
+static	Lock	dslock;
+static	int	dshiwat;
+static	char	*dsname[Maxdstate];
+static	Dstate	*dstate[Maxdstate];
+static	char	*encalgs;
+static	char	*hashalgs;
 
 enum{
 	Qtopdir		= 1,	/* top level directory */
@@ -113,17 +113,13 @@
 static long	sslput(Dstate *s, Block * volatile b);
 
 char *sslnames[] = {
-	/* unused */ 0,
-	/* topdir */ 0,
-	/* protodir */ 0,
-	"clone",
-	/* convdir */ 0,
-	"data",
-	"ctl",
-	"secretin",
-	"secretout",
-	"encalgs",
-	"hashalgs",
+[Qclonus]	"clone",
+[Qdata]		"data",
+[Qctl]		"ctl",
+[Qsecretin]	"secretin",
+[Qsecretout]	"secretout",
+[Qencalgs]	"encalgs",
+[Qhashalgs]	"hashalgs",
 };
 
 static int
@@ -237,7 +233,6 @@
 		devdir(c, c->qid, sslnames[TYPE(c->qid)], 0, nm, 0660, dp);
 		return 1;
 	}
-	return -1;
 }
 
 static Chan*
@@ -358,7 +353,7 @@
 
 	if(!emptystr(dir->uid))
 		kstrdup(&s->user, dir->uid);
-	if(dir->mode != ~0)
+	if(dir->mode != ~0UL)
 		s->perm = dir->mode;
 
 	free(dir);
@@ -766,9 +761,8 @@
 	int offset;
 
 	if(waserror()){
-iprint("error: %s\n", up->errstr);
 		if(b != nil)
-			free(b);
+			freeb(b);
 		nexterror();
 	}
 
@@ -900,7 +894,7 @@
 		key[6] &= 0x0f;
 	}
 
-	w->state = malloc(sizeof(DESstate));
+	w->state = smalloc(sizeof(DESstate));
 	if(w->slen >= 16)
 		setupDESstate(w->state, key, w->secret+8);
 	else if(w->slen >= 8)
@@ -936,7 +930,7 @@
 	if(w->slen > 5)
 		w->slen = 5;
 
-	w->state = malloc(sizeof(RC4state));
+	w->state = smalloc(sizeof(RC4state));
 	setupRC4state(w->state, w->secret, w->slen);
 }
 
@@ -955,7 +949,7 @@
 	if(w->slen > 16)
 		w->slen = 16;
 
-	w->state = malloc(sizeof(RC4state));
+	w->state = smalloc(sizeof(RC4state));
 	setupRC4state(w->state, w->secret, w->slen);
 }
 
@@ -1004,6 +998,7 @@
 };
 
 #ifdef NOSPOOKS
+static
 Encalg encrypttab[] =
 {
 	{ "descbc", 8, DESCBC, initDESkey, },           /* DEPRECATED -- use des_56_cbc */
@@ -1019,6 +1014,7 @@
 	{ 0 }
 };
 #else
+static
 Encalg encrypttab[] =
 {
 	{ "des_40_cbc", 8, DESCBC, initDESkey_40, },
@@ -1048,14 +1044,31 @@
 	return -1;
 }
 
+enum {
+	Cfd,
+	Calg,
+	Csin,
+	Csout,
+};
+	
+static
+Cmdtab sslcmds[] = {
+	{Cfd, 	"fd", 	2 },
+	{Calg, 	"alg", 	0 },
+	{Csin, 	"secretin", 	2 },
+	{Csout,	"secretout",	2 },
+};
+
 static long
 sslwrite(Chan *c, void *a, long n, vlong o)
 {
 	Dstate * volatile s;
 	Block * volatile b;
-	int m, t;
-	char *p, *np, *e, buf[128];
+	int m, t, i;
+	char *p, *e;
 	uchar *x;
+	Cmdbuf *cb;
+	Cmdtab *ct;
 
 	USED(o);
 	s = dstate[CONV(c->qid)];
@@ -1073,9 +1086,8 @@
 			nexterror();
 		}
 		qlock(&s->out.q);
+
 		p = a;
-if(0) iprint("write %d %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux\n",
-	n, p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
 		e = p + n;
 		do {
 			m = e - p;
@@ -1095,9 +1107,7 @@
 
 			p += m;
 		} while(p < e);
-		p = a;
-if(0) iprint("wrote %d %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux\n",
-	n, p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
+
 		poperror();
 		qunlock(&s->out.q);
 		return n;
@@ -1125,20 +1135,16 @@
 		break;
 	}
 
-	if(n >= sizeof(buf))
-		error("arg too long");
-	strncpy(buf, a, n);
-	buf[n] = 0;
-	p = strchr(buf, '\n');
-	if(p)
-		*p = 0;
-	p = strchr(buf, ' ');
-	if(p)
-		*p++ = 0;
+	cb = parsecmd(a, n);
+	if(waserror()){
+		free(cb);
+		nexterror();
+	}
+	ct = lookupcmd(cb, sslcmds, nelem(sslcmds));
+	switch(ct->index){
+	case Cfd:
+		s->c = buftochan(cb->f[1]);
 
-	if(strcmp(buf, "fd") == 0){
-		s->c = buftochan(p);
-
 		/* default is clear (msg delimiters only) */
 		s->state = Sclear;
 		s->blocklen = 1;
@@ -1146,7 +1152,11 @@
 		s->maxpad = s->max = (1<<15) - s->diglen - 1;
 		s->in.mid = 0;
 		s->out.mid = 0;
-	} else if(strcmp(buf, "alg") == 0 && p != 0){
+		break;
+	case Calg:
+		if(cb->nf < 2)
+			cmderror(cb, "no algorithms");
+
 		s->blocklen = 1;
 		s->diglen = 0;
 
@@ -1155,9 +1165,8 @@
 
 		s->state = Sclear;
 		s->maxpad = s->max = (1<<15) - s->diglen - 1;
-		if(strcmp(p, "clear") == 0){
-			goto out;
-		}
+		if(strcmp(cb->f[1], "clear") == 0)
+			break;
 
 		if(s->in.secret && s->out.secret == 0)
 			setsecret(&s->out, s->in.secret, s->in.slen);
@@ -1170,18 +1179,11 @@
 		s->encryptalg = Noencryption;
 		s->blocklen = 1;
 
-		for(;;){
-			np = strchr(p, ' ');
-			if(np)
-				*np++ = 0;
-
+		for(i=1; i<cb->nf; i++){
+			p = cb->f[i];
 			if(parsehashalg(p, s) < 0)
 			if(parseencryptalg(p, s) < 0)
 				error("bad algorithm");
-
-			if(np == 0)
-				break;
-			p = np;
 		}
 
 		if(s->hf == 0 && s->encryptalg == Noencryption)
@@ -1194,20 +1196,34 @@
 			s->maxpad -= s->maxpad % s->blocklen;
 		} else
 			s->maxpad = s->max = (1<<15) - s->diglen - 1;
-	} else if(strcmp(buf, "secretin") == 0 && p != 0) {
+		break;
+	case Csin:
+		p = cb->f[1];
 		m = (strlen(p)*3)/2;
 		x = smalloc(m);
 		t = dec64(x, m, p, strlen(p));
+		if(t <= 0){
+			free(x);
+			error(Ebadarg);
+		}
 		setsecret(&s->in, x, t);
 		free(x);
-	} else if(strcmp(buf, "secretout") == 0 && p != 0) {
+		break;
+	case Csout:
+		p = cb->f[1];
 		m = (strlen(p)*3)/2 + 1;
 		x = smalloc(m);
 		t = dec64(x, m, p, strlen(p));
+		if(t <= 0){
+			free(x);
+			error(Ebadarg);
+		}
 		setsecret(&s->out, x, t);
 		free(x);
-	} else
-		error(Ebadarg);
+		break;
+	}
+	poperror();
+	free(cb);
 
 out:
 	qunlock(&s->in.ctlq);
@@ -1426,7 +1442,7 @@
 	*p = n;
 	(*s->hf)(msgid, 4, digest, &ss);
 
-	if(memcmp(digest, bin->rp, s->diglen) != 0)
+	if(tsmemcmp(digest, bin->rp, s->diglen) != 0)
 		error("bad digest");
 }
 
--- a/main.c
+++ b/main.c
@@ -111,7 +111,7 @@
 				pass = f[i]+10;
 			if(strncmp(f[i], "dom=", 4) == 0 && strcmp(f[i]+4, dom) == 0)
 				havedom = 1;
-			if(strcmp(f[i], "proto=p9sk1") == 0)
+			if(strcmp(f[i], "proto=p9sk1") == 0 || strcmp(f[i], "proto=dp9ik") == 0)
 				haveproto = 1;
 		}
 		if(!haveproto || !havedom || !pass || !user)