code: drawterm

Download patch

ref: 6ffcc16c81afebbe735eaed7622659b144edaf07
parent: 50746b16b551b78b0891a2be35be0f8796f2ad6f
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun May 29 22:55:26 EDT 2016

reduce error verbosity, hang when panicing in graphics mode

--- a/cpu.c
+++ b/cpu.c
@@ -13,7 +13,6 @@
 
 #define MaxStr 128
 
-static void	fatal(int, char*, ...);
 static void	usage(void);
 static void	writestr(int, char*, char*, int);
 static int	readstr(int, char*, int);
@@ -37,10 +36,10 @@
 char *authserver;
 char *secstore;
 
-void
-exits(char *s)
+static void
+ending(void)
 {
-	exit(1);
+	panic("ending");
 }
 
 void
@@ -98,7 +97,7 @@
 	int n;
 
 	if(fprint(fd, "%7ld\n%s", strlen(script), script) < 0)
-		fatal(1, "sending aan script");
+		sysfatal("sending aan script: %r");
 	n = read(fd, buf, sizeof(buf)-1);
 	close(fd);
 
@@ -139,17 +138,17 @@
 	if(aanfilter){
 		fd = startaan(host, fd);
 		if(fd < 0)
-			fatal(1, "startaan");
+			sysfatal("startaan: %r");
 		fd = p9authtls(fd);
 	}
 	memset(secstorebuf, 0, sizeof(secstorebuf));	/* forget secstore secrets */
 
 	if(fprint(fd, "%7ld\n%s", strlen(script), script) < 0)
-		fatal(1, "sending script");
+		sysfatal("sending script: %r");
 
 	/* Begin serving the namespace */
 	exportfs(fd);
-	fatal(1, "starting exportfs");
+	sysfatal("starting exportfs: %r");
 }
 
 void
@@ -169,9 +168,9 @@
 	}
 	writestr(fd, buf, "negotiating authentication method", 0);
 	if(readstr(fd, buf, sizeof buf) < 0)
-		fatal(1, "can't negotiate authentication method: %r");
+		sysfatal("can't negotiate authentication method: %r");
 	if(*buf)
-		fatal(1, "%s", buf);
+		sysfatal("%s", buf);
 
 	/* authenticate and encrypt the channel */
 	fd = p9authssl(fd);
@@ -187,7 +186,7 @@
 	 *  of /mnt/term
 	 */
 	if(readstr(fd, buf, sizeof(buf)) < 0)
-		fatal(1, "waiting for FS: %r");
+		sysfatal("waiting for FS: %r");
 	if(strncmp("FS", buf, 2) != 0) {
 		print("remote cpu: %s", buf);
 		exits(buf);
@@ -194,7 +193,7 @@
 	}
 
 	if(readstr(fd, buf, sizeof(buf)) < 0)
-		fatal(1, "waiting for remote export: %r");
+		sysfatal("waiting for remote export: %r");
 	if(strcmp(buf, "/") != 0){
 		print("remote cpu: %s", buf);
 		exits(buf);
@@ -203,7 +202,7 @@
 
 	/* Begin serving the gnot namespace */
 	exportfs(fd);
-	fatal(1, "starting exportfs");
+	sysfatal("starting exportfs: %r");
 }
 
 void
@@ -267,6 +266,7 @@
 			panic("bind #i: %r");
 		if(bind("#m", "/dev", MBEFORE) < 0)
 			panic("bind #m: %r");
+		atexit(ending);
 	}
 
 	if(bind("/root", "/", MAFTER) < 0)
@@ -273,14 +273,17 @@
 		panic("bind /root: %r");
 
 	if(host == nil)
-		host = readcons("cpu", "cpu", 0);
+		if((host = readcons("cpu", "cpu", 0)) == nil)
+			sysfatal("user terminated input");
 
-	if(user == nil)
-		user = readcons("user", "glenda", 0);
-
 	if(authserver == nil)
-		authserver = readcons("auth", host, 0);
+		if((authserver = readcons("auth", host, 0)) == nil)
+			sysfatal("user terminated input");
 
+	if(user == nil)
+		if((user = readcons("user", "glenda", 0)) == nil)
+			sysfatal("user terminated input");
+
 	if(mountfactotum() < 0){
 		if(secstore == nil)
 			secstore = authserver;
@@ -299,30 +302,10 @@
 
 	ncpu(host);
 
-	fatal(1, "can't dial %s: %r", host);
+	sysfatal("can't dial %s: %r", host);
 }
 
 void
-fatal(int syserr, char *fmt, ...)
-{
-	Fmt f;
-	char *str;
-	va_list arg;
-
-	fmtstrinit(&f);
-	fmtprint(&f, "cpu: ");
-	va_start(arg, fmt);
-	fmtvprint(&f, fmt, arg);
-	va_end(arg);
-	if(syserr)
-		fmtprint(&f, ": %r");
-	fmtprint(&f, "\n");
-	str = fmtstrflush(&f);
-	write(2, str, strlen(str));
-	exits(str);
-}
-
-void
 writestr(int fd, char *str, char *thing, int ignore)
 {
 	int l, n;
@@ -330,7 +313,7 @@
 	l = strlen(str);
 	n = write(fd, str, l+1);
 	if(!ignore && n < 0)
-		fatal(1, "writing network: %s", thing);
+		sysfatal("writing network: %s: %r", thing);
 }
 
 int
@@ -372,13 +355,13 @@
 	ai = p9any(fd);
 	memset(secstorebuf, 0, sizeof(secstorebuf));	/* forget secstore secrets */
 	if(ai == nil)
-		fatal(1, "can't authenticate");
+		sysfatal("can't authenticate: %r");
 
 	if(ealgs == nil)
 		return fd;
 
 	if(ai->nsecret < 8){
-		fatal(1, "p9authssl: secret too small");
+		sysfatal("p9authssl: secret too small");
 		return -1;
 	}
 	memmove(key+4, ai->secret, 8);
@@ -386,11 +369,11 @@
 	/* exchange random numbers */
 	genrandom(key, 4);
 	if(write(fd, key, 4) != 4){
-		fatal(1, "p9authssl: write random: %r");
+		sysfatal("p9authssl: write random: %r");
 		return -1;
 	}
 	if(readn(fd, key+12, 4) != 4){
-		fatal(1, "p9authssl: read random: %r");
+		sysfatal("p9authssl: read random: %r");
 		return -1;
 	}
 
@@ -402,7 +385,7 @@
 	/* set up encryption */
 	fd = pushssl(fd, ealgs, fromclientsecret, fromserversecret, nil);
 	if(fd < 0)
-		fatal(1, "p9authssl: pushssl: %r");
+		sysfatal("p9authssl: pushssl: %r");
 
 	return fd;
 }
@@ -418,7 +401,7 @@
 
 	ai = p9any(fd);
 	if(ai == nil)
-		fatal(1, "can't authenticate");
+		sysfatal("can't authenticate: %r");
 
 	conn = mallocz(sizeof(TLSconn), 1);
 	conn->pskID = "p9secret";
@@ -427,7 +410,7 @@
 
 	fd = tlsClient(fd, conn);
 	if(fd < 0)
-		fatal(1, "tlsClient");
+		sysfatal("tlsClient: %r");
 
 	auth_freeAI(ai);
 	free(conn->sessionID);
@@ -627,7 +610,7 @@
 	werrstr("");
 
 	if(readstr(fd, buf, sizeof buf) < 0)
-		fatal(1, "cannot read p9any negotiation");
+		sysfatal("cannot read p9any negotiation: %r");
 	bbuf = buf;
 	v2 = 0;
 	if(strncmp(buf, "v.2 ", 4) == 0){
@@ -640,7 +623,7 @@
 		if((p = strchr(bbuf, ' ')))
 			*p++ = 0;
 		if((dom = strchr(bbuf, '@')) == nil)
-			fatal(1, "bad p9any domain");
+			sysfatal("bad p9any domain");
 		*dom++ = 0;
 		if(strcmp(bbuf, "p9sk1") == 0 || strcmp(bbuf, "dp9ik") == 0){
 			proto = bbuf;
@@ -652,21 +635,21 @@
 		bbuf = p;
 	}
 	if(proto == nil)
-		fatal(1, "server did not offer p9sk1 or dp9ik");
+		sysfatal("server did not offer p9sk1 or dp9ik");
 	proto = estrdup(proto);
 	sprint(buf2, "%s %s", proto, dom);
 	if(write(fd, buf2, strlen(buf2)+1) != strlen(buf2)+1)
-		fatal(1, "cannot write user/domain choice in p9any");
+		sysfatal("cannot write user/domain choice in p9any");
 	if(v2){
 		if(readstr(fd, buf, sizeof buf) < 0)
-			fatal(1, "cannot read OK in p9any");
+			sysfatal("cannot read OK in p9any: %r");
 		if(memcmp(buf, "OK\0", 3) != 0)
-			fatal(1, "did not get OK in p9any: got %s", buf);
+			sysfatal("did not get OK in p9any: got %s", buf);
 	}
 	genrandom(crand, 2*NONCELEN);
 	genrandom(cchal, CHALLEN);
 	if(write(fd, cchal, CHALLEN) != CHALLEN)
-		fatal(1, "cannot write p9sk1 challenge");
+		sysfatal("cannot write p9sk1 challenge: %r");
 
 	n = TICKREQLEN;
 	if(dp9ik)
@@ -673,11 +656,11 @@
 		n += PAKYLEN;
 
 	if(readn(fd, trbuf, n) != n || convM2TR(trbuf, TICKREQLEN, &tr) <= 0)
-		fatal(1, "cannot read ticket request in p9sk1");
+		sysfatal("cannot read ticket request in p9sk1: %r");
 
 	if(!findkey(&authkey, user, tr.authdom, proto)){
 again:		if(!getkey(&authkey, user, tr.authdom, proto))
-			fatal(1, "no password");
+			sysfatal("no password");
 	}
 
 	strecpy(tr.hostid, tr.hostid+sizeof tr.hostid, user);
@@ -690,7 +673,7 @@
 		n = gettickets(&authkey, &tr, nil, tbuf, sizeof(tbuf));
 	}
 	if(n <= 0)
-		fatal(1, "cannot get auth tickets in p9sk1");
+		sysfatal("cannot get auth tickets in p9sk1: %r");
 
 	m = convM2T(tbuf, n, &t, &authkey);
 	if(m <= 0 || t.num != AuthTc){
@@ -701,7 +684,7 @@
 	memmove(tbuf, tbuf+m, n);
 
 	if(dp9ik && write(fd, y, PAKYLEN) != PAKYLEN)
-		fatal(1, "cannot send authpak public key back");
+		sysfatal("cannot send authpak public key back: %r");
 
 	auth.num = AuthAc;
 	memmove(auth.rand, crand, NONCELEN);
@@ -710,11 +693,11 @@
 	n += m;
 
 	if(write(fd, tbuf, n) != n)
-		fatal(1, "cannot send ticket and authenticator back");
+		sysfatal("cannot send ticket and authenticator back: %r");
 
 	if((n=readn(fd, tbuf, m)) != m || memcmp(tbuf, "cpu:", 4) == 0){
 		if(n <= 4)
-			fatal(1, "cannot read authenticator");
+			sysfatal("cannot read authenticator");
 
 		/*
 		 * didn't send back authenticator:
@@ -725,8 +708,7 @@
 		if(i > 0)
 			n += i;
 		buf[n] = 0;
-		werrstr("");
-		fatal(0, "server says: %s", buf);
+		sysfatal("server says: %s", buf);
 	}
 	
 	if(convM2A(tbuf, n, &auth, &t) <= 0
@@ -733,7 +715,7 @@
 	|| auth.num != AuthAs || tsmemcmp(auth.chal, cchal, CHALLEN) != 0){
 		print("?you and auth server agree about password.\n");
 		print("?server is confused.\n");
-		fatal(0, "server lies got %llux want %llux", *(vlong*)auth.chal, *(vlong*)cchal);
+		sysfatal("server lies");
 	}
 	memmove(crand+NONCELEN, auth.rand, NONCELEN);
 
--- a/include/user.h
+++ b/include/user.h
@@ -93,4 +93,5 @@
 extern	void	lock(Lock*);
 extern	void	unlock(Lock*);
 extern	int	iprint(char*, ...);
+extern	int	atexit(void (*)(void));
 extern	void	exits(char*);
--- a/kern/Makefile
+++ b/kern/Makefile
@@ -33,7 +33,6 @@
 	smalloc.$O\
 	stub.$O\
 	sysfile.$O\
-	sysproc.$O\
 	qio.$O\
 	qlock.$O\
 	term.$O\
--- a/kern/devcons.c
+++ b/kern/devcons.c
@@ -11,7 +11,6 @@
 #undef write
 #undef read
 
-void	(*consdebug)(void) = 0;
 void	(*screenputs)(char*, int) = 0;
 
 Queue*	kbdq;			/* unprocessed console input */
@@ -38,7 +37,6 @@
 	char	line[1024];	/* current input line */
 
 	int	count;
-	int	ctlpoff;
 
 	/* a place to save up characters at interrupt time before dumping them in the queue */
 	Lock	lockputc;
@@ -53,7 +51,6 @@
 	0,
 	{ 0 },
 	0,
-	0,
 	{ 0 },
 	{ 0 },
 	kbd.istage,
@@ -102,11 +99,6 @@
 	setterm(0);
 }
 
-void
-prflush(void)
-{
-}
-
 /*
  *   Print a string on the console.  Convert \n to \r\n for serial
  *   line consoles.  Locking of the queues is left up to the screen
@@ -166,10 +158,8 @@
 
 	kprintoq = nil;	/* don't try to write to /dev/kprint */
 
-	if(panicking)
-		for(;;);
-	panicking = 1;
-
+	if(panicking++)
+		for(;;) osyield();
 	splhi();
 	strcpy(buf, "panic: ");
 	va_start(arg, fmt);
@@ -176,15 +166,11 @@
 	n = vseprint(buf+strlen(buf), buf+sizeof(buf), fmt, arg) - buf;
 	va_end(arg);
 	buf[n] = '\n';
-	if(screenputs != 0)
-		write(2, buf, n+1);
-	if(consdebug)
-		(*consdebug)();
 	spllo();
-	prflush();
 	putstrn(buf, n+1);
-	dumpstack();
-
+	while(screenputs != 0)
+		osyield();
+	setterm(0);
 	exit(1);
 }
 
@@ -248,76 +234,6 @@
 static void
 echo(char *buf, int n)
 {
-	static int ctrlt;
-	int x;
-	char *e, *p;
-
-	e = buf+n;
-	for(p = buf; p < e; p++){
-		switch(*p){
-		case 0x10:	/* ^P */
-			if(cpuserver && !kbd.ctlpoff){
-				active.exiting = 1;
-				return;
-			}
-			break;
-		case 0x14:	/* ^T */
-			ctrlt++;
-			if(ctrlt > 2)
-				ctrlt = 2;
-			continue;
-		}
-
-		if(ctrlt != 2)
-			continue;
-
-		/* ^T escapes */
-		ctrlt = 0;
-		switch(*p){
-		case 'S':
-			x = splhi();
-			dumpstack();
-			procdump();
-			splx(x);
-			return;
-		case 's':
-			dumpstack();
-			return;
-		case 'x':
-			xsummary();
-			ixsummary();
-			mallocsummary();
-			pagersummary();
-			return;
-		case 'd':
-			if(consdebug == 0)
-				consdebug = rdb;
-			else
-				consdebug = 0;
-			print("consdebug now 0x%p\n", consdebug);
-			return;
-		case 'D':
-			if(consdebug == 0)
-				consdebug = rdb;
-			consdebug();
-			return;
-		case 'p':
-			x = spllo();
-			procdump();
-			splx(x);
-			return;
-		case 'q':
-			scheddump();
-			return;
-		case 'k':
-			killbig();
-			return;
-		case 'r':
-			exit(0);
-			return;
-		}
-	}
-
 	qproduce(kbdq, buf, n);
 	if(kbd.raw)
 		return;
@@ -789,10 +705,6 @@
 				if(screenputs == 0)
 					setterm(0);
 				qunlock(&kbd.lk);
-			} else if(strncmp(a, "ctlpon", 6) == 0){
-				kbd.ctlpoff = 0;
-			} else if(strncmp(a, "ctlpoff", 7) == 0){
-				kbd.ctlpoff = 1;
 			}
 			if((a = strchr(a, ' ')))
 				a++;
--- a/kern/fns.h
+++ b/kern/fns.h
@@ -215,7 +215,6 @@
 void		portclock(Ureg*);
 int		postnote(Proc*, int, char*, int);
 int		pprint(char*, ...);
-void		prflush(void);
 ulong		procalarm(ulong);
 int		proccounter(char *name);
 void		procctl(Proc*);
--- a/kern/sysproc.c
+++ /dev/null
@@ -1,32 +1,0 @@
-#include	"u.h"
-#include	"lib.h"
-#include	"dat.h"
-#include	"fns.h"
-#include	"error.h"
-
-long
-sysexits(ulong *arg)
-{
-	char *status;
-	char *inval = "invalid exit string";
-	char buf[ERRMAX];
-
-	status = (char*)arg[0];
-	if(status){
-		if(waserror())
-			status = inval;
-		else{
-			validaddr((ulong)status, 1, 0);
-			if(vmemchr(status, 0, ERRMAX) == 0){
-				memmove(buf, status, ERRMAX);
-				buf[ERRMAX-1] = 0;
-				status = buf;
-			}
-		}
-		poperror();
-
-	}
-	pexit(status, 1);
-	return 0;		/* not reached */
-}
-
--- a/libc/Makefile
+++ b/libc/Makefile
@@ -3,6 +3,7 @@
 LIB=libc.a
 
 OFILES=\
+	atexit.$O\
 	charstod.$O\
 	cleanname.$O\
 	convD2M.$O\
--- /dev/null
+++ b/libc/atexit.c
@@ -1,0 +1,46 @@
+#include <u.h>
+#include <libc.h>
+
+#define	NEXIT	33
+
+typedef struct Onex Onex;
+struct Onex{
+	void	(*f)(void);
+	int	pid;
+};
+
+static Lock onexlock;
+Onex onex[NEXIT];
+
+int
+atexit(void (*f)(void))
+{
+	int i;
+
+	lock(&onexlock);
+	for(i=0; i<NEXIT; i++)
+		if(onex[i].f == 0) {
+			onex[i].pid = getpid();
+			onex[i].f = f;
+			unlock(&onexlock);
+			return 1;
+		}
+	unlock(&onexlock);
+	return 0;
+}
+
+void
+exits(char *s)
+{
+	int i, pid;
+	void (*f)(void);
+
+	pid = getpid();
+	for(i = NEXIT-1; i >= 0; i--)
+		if((f = onex[i].f) && pid == onex[i].pid) {
+			onex[i].f = 0;
+			(*f)();
+		}
+	exit(s && *s);
+}
+
--- a/libc/sysfatal.c
+++ b/libc/sysfatal.c
@@ -11,10 +11,7 @@
 		fprint(2, "%s: %s\n", argv0, buf);
 	else
 		fprint(2, "%s\n", buf);
-#undef write
-write(2, buf, strlen(buf));
-write(2, "\n", 1);
-	panic("sysfatal");
+	exits("sysfatal");
 }
 
 void (*_sysfatal)(char *fmt, va_list arg) = _sysfatalimpl;