code: drawterm

Download patch

ref: 691adfab413b4776a028ee94016fcaf1fa519c6f
parent: 5b50d2da070cc4155ef09853cd088c69a9cbb220
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Apr 17 17:31:08 EDT 2016

remove -C flag, cleanup

--- a/cpu.c
+++ b/cpu.c
@@ -1,8 +1,5 @@
 /*
  * cpu.c - Make a connection to a cpu server
- *
- *	   Invoked by listen as 'cpu -R | -N service net netdir'
- *	    	   by users  as 'cpu [-h host] [-c cmd args ...]'
  */
 
 #include <u.h>
@@ -20,7 +17,6 @@
 static void	usage(void);
 static void	writestr(int, char*, char*, int);
 static int	readstr(int, char*, int);
-static char	*rexcall(int*, char*, char*);
 static char 	*keyspec = "";
 static AuthInfo *p9any(int);
 static int	getkey(Authkey*, char*, char*, char*);
@@ -27,18 +23,18 @@
 static int	findkey(Authkey*, char*, char*, char*);
 
 static char	*host;
+static int	aanfilter;
 static int	norcpu;
 static int	nokbd;
-static int	cflag;
 
-static char	*srvname = "ncpu";
 static char	*ealgs = "rc4_256 sha1";
 
 /* authentication mechanisms */
-static int	p9auth(int);
+static int	p9authssl(int);
+static int	p9authtls(int);
 
 char *authserver;
-int aanfilter;
+char *secstore;
 
 void
 exits(char *s)
@@ -73,36 +69,7 @@
 	return 0;
 }
 
-/*
- * p9any authentication followed by tls-psk encryption
- */
 static int
-p9authtls(int fd)
-{
-	AuthInfo *ai;
-	TLSconn *conn;
-
-	ai = p9any(fd);
-	if(ai == nil)
-		fatal(1, "can't authenticate");
-
-	conn = mallocz(sizeof(TLSconn), 1);
-	conn->pskID = "p9secret";
-	conn->psk = ai->secret;
-	conn->psklen = ai->nsecret;
-
-	fd = tlsClient(fd, conn);
-	if(fd < 0)
-		fatal(1, "tlsClient");
-
-	auth_freeAI(ai);
-	free(conn->sessionID);
-	free(conn);
-
-	return fd;
-}
-
-static int
 startaan(char *host, int fd)
 {
 	static char script[] =
@@ -158,11 +125,9 @@
 "	bind -q /mnt/term/dev/cons /dev/cons\n"
 "}\n"
 "</dev/cons >/dev/cons >[2=1] service=cpu exec rc -li\n";
-	char *na;
 	int fd;
 
-	na = netmkaddr(host, "tcp", "17019");
-	if((fd = dial(na, nil, nil, nil)) < 0)
+	if((fd = dial(netmkaddr(host, "tcp", "17019"), nil, nil, nil)) < 0)
 		return;
 
 	/* provide /dev/kbd for kbdfs */
@@ -187,13 +152,65 @@
 }
 
 void
+ncpu(char *host)
+{
+	char buf[MaxStr];
+	int fd;
+
+	if((fd = dial(netmkaddr(host, "tcp", "17010"), nil, nil, nil)) < 0)
+		return;
+
+	/* negotiate authentication mechanism */
+	strcpy(buf, "p9");
+	if(ealgs != nil){
+		strcat(buf, " ");
+		strcat(buf, ealgs);
+	}
+	writestr(fd, buf, "negotiating authentication method", 0);
+	if(readstr(fd, buf, sizeof buf) < 0)
+		fatal(1, "can't negotiate authentication method: %r");
+	if(*buf)
+		fatal(1, "%s", buf);
+
+	/* authenticate and encrypt the channel */
+	fd = p9authssl(fd);
+
+	/* Tell the remote side where our working directory is */
+	if(getcwd(buf, sizeof(buf)) == 0)
+		writestr(fd, "NO", "dir", 0);
+	else
+		writestr(fd, buf, "dir", 0);
+
+	/* 
+	 *  Wait for the other end to execute and start our file service
+	 *  of /mnt/term
+	 */
+	if(readstr(fd, buf, sizeof(buf)) < 0)
+		fatal(1, "waiting for FS: %r");
+	if(strncmp("FS", buf, 2) != 0) {
+		print("remote cpu: %s", buf);
+		exits(buf);
+	}
+
+	if(readstr(fd, buf, sizeof(buf)) < 0)
+		fatal(1, "waiting for remote export: %r");
+	if(strcmp(buf, "/") != 0){
+		print("remote cpu: %s", buf);
+		exits(buf);
+	}
+	write(fd, "OK", 2);
+
+	/* Begin serving the gnot namespace */
+	exportfs(fd);
+	fatal(1, "starting exportfs");
+}
+
+void
 cpumain(int argc, char **argv)
 {
-	char dat[MaxStr], buf[MaxStr], cmd[MaxStr], *err, *secstoreserver, *p, *s;
-	int data;
+	char *s;
 
 	user = getenv("USER");
-	secstoreserver = nil;
 	authserver = getenv("auth");
 	host = getenv("cpu");
 	ARGBEGIN{
@@ -210,22 +227,14 @@
 			ealgs = nil;
 		break;
 	case 'r':
-		snprint(buf, sizeof(buf), "/root/%s", EARGF(usage()));
-		cleanname(buf);
-		if(bind(buf, "/root", MREPL) < 0)
+		s = smprint("/root/%s", EARGF(usage()));
+		cleanname(s);
+		if(bind(s, "/root", MREPL) < 0)
 			panic("bind /root: %r");
+		free(s);
 		break;
-	case 'C':
-		cflag++;
-		cmd[0] = '!';
-		cmd[1] = '\0';
-		while((p = ARGF()) != nil) {
-			strcat(cmd, " ");
-			strcat(cmd, p);
-		}
-		break;
 	case 's':
-		secstoreserver = EARGF(usage());
+		secstore = EARGF(usage());
 		break;
 	case 'k':
 		keyspec = EARGF(usage());
@@ -262,10 +271,10 @@
 		authserver = readcons("auth", host, 0);
 
 	if(mountfactotum() < 0){
-		if(secstoreserver == nil)
-			secstoreserver = authserver;
-	 	if(havesecstore(secstoreserver, user)){
-			s = secstorefetch(secstoreserver, user, nil);
+		if(secstore == nil)
+			secstore = authserver;
+	 	if(havesecstore(secstore, user)){
+			s = secstorefetch(secstore, user, nil);
 			if(s){
 				if(strlen(s) >= sizeof secstorebuf)
 					sysfatal("secstore data too big");
@@ -277,39 +286,9 @@
 	if(!norcpu)
 		rcpu(host);
 
-	if((err = rexcall(&data, host, srvname)))
-		fatal(1, "%s: %s", err, host);
+	ncpu(host);
 
-	/* Tell the remote side the command to execute and where our working directory is */
-	if(cflag)
-		writestr(data, cmd, "command", 0);
-	if(getcwd(dat, sizeof(dat)) == 0)
-		writestr(data, "NO", "dir", 0);
-	else
-		writestr(data, dat, "dir", 0);
-
-	/* 
-	 *  Wait for the other end to execute and start our file service
-	 *  of /mnt/term
-	 */
-	if(readstr(data, buf, sizeof(buf)) < 0)
-		fatal(1, "waiting for FS: %r");
-	if(strncmp("FS", buf, 2) != 0) {
-		print("remote cpu: %s", buf);
-		exits(buf);
-	}
-
-	if(readstr(data, buf, sizeof buf) < 0)
-		fatal(1, "waiting for remote export: %r");
-	if(strcmp(buf, "/") != 0){
-		print("remote cpu: %s" , buf);
-		exits(buf);
-	}
-	write(data, "OK", 2);
-
-	/* Begin serving the gnot namespace */
-	exportfs(data);
-	fatal(1, "starting exportfs");
+	fatal(1, "can't dial %s: %r", host);
 }
 
 void
@@ -332,43 +311,6 @@
 	exits(str);
 }
 
-char *negstr = "negotiating authentication method";
-
-char*
-rexcall(int *fd, char *host, char *service)
-{
-	char *na;
-	char dir[MaxStr];
-	char err[ERRMAX];
-	char msg[MaxStr];
-	int n;
-
-	na = netmkaddr(host, "tcp", "17010");
-	if((*fd = dial(na, 0, dir, 0)) < 0)
-		return "can't dial";
-
-	/* negotiate authentication mechanism */
-	strcpy(msg, "p9");
-	if(ealgs != nil){
-		strcat(msg, " ");
-		strcat(msg, ealgs);
-	}
-	writestr(*fd, msg, negstr, 0);
-	n = readstr(*fd, err, sizeof err);
-	if(n < 0)
-		return negstr;
-	if(*err){
-		werrstr(err);
-		return negstr;
-	}
-
-	/* authenticate */
-	*fd = p9auth(*fd);
-	if(*fd < 0)
-		return "can't authenticate";
-	return 0;
-}
-
 void
 writestr(int fd, char *str, char *thing, int ignore)
 {
@@ -408,24 +350,24 @@
  *  plan9 authentication followed by rc4 encryption
  */
 static int
-p9auth(int fd)
+p9authssl(int fd)
 {
 	uchar key[16];
 	uchar digest[SHA1dlen];
 	char fromclientsecret[21];
 	char fromserversecret[21];
-	int i;
 	AuthInfo *ai;
 
 	ai = p9any(fd);
 	memset(secstorebuf, 0, sizeof(secstorebuf));	/* forget secstore secrets */
 	if(ai == nil)
-		return -1;
+		fatal(1, "can't authenticate");
+
 	if(ealgs == nil)
 		return fd;
 
 	if(ai->nsecret < 8){
-		werrstr("secret too small");
+		fatal(1, "p9authssl: secret too small");
 		return -1;
 	}
 	memmove(key+4, ai->secret, 8);
@@ -432,10 +374,14 @@
 
 	/* exchange random numbers */
 	genrandom(key, 4);
-	if(write(fd, key, 4) != 4)
+	if(write(fd, key, 4) != 4){
+		fatal(1, "p9authssl: write random: %r");
 		return -1;
-	if(readn(fd, key+12, 4) != 4)
+	}
+	if(readn(fd, key+12, 4) != 4){
+		fatal(1, "p9authssl: read random: %r");
 		return -1;
+	}
 
 	/* scramble into two secrets */
 	sha1(key, sizeof(key), digest, nil);
@@ -443,10 +389,40 @@
 	mksecret(fromserversecret, digest+10);
 
 	/* set up encryption */
-	i = pushssl(fd, ealgs, fromclientsecret, fromserversecret, nil);
-	if(i < 0)
-		werrstr("can't establish ssl connection: %r");
-	return i;
+	fd = pushssl(fd, ealgs, fromclientsecret, fromserversecret, nil);
+	if(fd < 0)
+		fatal(1, "p9authssl: pushssl: %r");
+
+	return fd;
+}
+
+/*
+ * p9any authentication followed by tls-psk encryption
+ */
+static int
+p9authtls(int fd)
+{
+	AuthInfo *ai;
+	TLSconn *conn;
+
+	ai = p9any(fd);
+	if(ai == nil)
+		fatal(1, "can't authenticate");
+
+	conn = mallocz(sizeof(TLSconn), 1);
+	conn->pskID = "p9secret";
+	conn->psk = ai->secret;
+	conn->psklen = ai->nsecret;
+
+	fd = tlsClient(fd, conn);
+	if(fd < 0)
+		fatal(1, "tlsClient");
+
+	auth_freeAI(ai);
+	free(conn->sessionID);
+	free(conn);
+
+	return fd;
 }
 
 int