shithub: riscv

Download patch

ref: 6a1841dce54b372f0c08e4e0a3019c4d305918f7
parent: e09adf59442cd36888eaea1d76e66ff3259d16b8
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Apr 2 15:05:56 EDT 2017

aux/wpa: go to background when not prompting, handle open networks

--- a/sys/src/cmd/aux/wpa.c
+++ b/sys/src/cmd/aux/wpa.c
@@ -86,12 +86,17 @@
 Cipher	*peercipher;
 Cipher	*groupcipher;
 
-int	background;
+int	forked;
 int	prompt;
 int	debug;
 int	fd, cfd;
 char	*dev;
-int	ispsk;
+enum {
+	AuthNone,
+	AuthPSK,
+	AuthWPA,
+};
+int	authtype;
 char	devdir[40];
 uchar	ptk[PTKlen];
 char	essid[32+1];
@@ -345,7 +350,7 @@
 				break;
 			/* look for WPA oui */
 			if(memcmp(p, rsnawpaoui, 4) == 0){
-				ispsk = 0;
+				authtype = AuthWPA;
 				break;
 			}
 		} else {
@@ -354,7 +359,7 @@
 				break;
 			/* look for WPA oui */
 			if(memcmp(p, wpaawpaoui, 4) == 0){
-				ispsk = 0;
+				authtype = AuthWPA;
 				break;
 			}
 		}
@@ -1146,6 +1151,23 @@
 }
 
 void
+background(void)
+{
+	if(forked || debug)
+		return;
+	switch(rfork(RFNOTEG|RFREND|RFPROC|RFNOWAIT)){
+	default:
+		exits(nil);
+	case -1:
+		sysfatal("fork: %r");
+		return;
+	case 0:
+		break;
+	}
+	forked = 1;
+}
+
+void
 main(int argc, char *argv[])
 {
 	uchar mac[Eaddrlen], buf[4096], snonce[Noncelen], anonce[Noncelen];
@@ -1207,42 +1229,38 @@
 	if(essid[0] != 0){
 		if(fprint(cfd, "essid %q", essid) < 0)
 			sysfatal("write essid: %r");
-	} else {
+	} else if(prompt) {
 		getessid();
 		if(essid[0] == 0)
 			sysfatal("no essid set");
 	}
+	if(!prompt)
+		background();
 
 Connect:
  	/* bss scan might not be complete yet, so check for 10 seconds.	*/
-	for(try = 100; (background || try >= 0) && !connected(); try--)
+	for(try = 100; (forked || try >= 0) && !connected(); try--)
 		sleep(100);
 
-	ispsk = 1;
+	authtype = AuthPSK;
 	if(rsnelen <= 0 || rsne == brsne){
 		rsne = brsne;
 		rsnelen = buildrsne(rsne);
 	}
-
-	if(rsnelen <= 0){
-		/* default is WPA */
-		rsne = wpaie;
-		rsnelen = sizeof(wpaie);
-		peercipher = &tkip;
-		groupcipher = &tkip;
+	if(rsnelen > 0){
+		if(debug)
+			fprint(2, "rsne: %.*H\n", rsnelen, rsne);
+		/*
+		 * we use write() instead of fprint so the message gets written
+		 * at once and not chunked up on fprint buffer.
+		 */
+		n = sprint((char*)buf, "auth %.*H", rsnelen, rsne);
+		if(write(cfd, buf, n) != n)
+			sysfatal("write auth: %r");
+	} else {
+		authtype = AuthNone;
 	}
 
-	if(debug)
-		fprint(2, "rsne: %.*H\n", rsnelen, rsne);
-
-	/*
-	 * we use write() instead of fprint so the message gets written
-	 * at once and not chunked up on fprint buffer.
-	 */
-	n = sprint((char*)buf, "auth %.*H", rsnelen, rsne);
-	if(write(cfd, buf, n) != n)
-		sysfatal("write auth: %r");
-
 	conn.fd = fd;
 	conn.write = eapwrite;
 	conn.type = 1;	/* Start */
@@ -1251,38 +1269,31 @@
 	getbssid(conn.amac);
 
 	if(prompt){
+		UserPasswd *up;
 		prompt = 0;
-		if(ispsk){
+		switch(authtype){
+		case AuthNone:
+			print("no authentication required\n");
+			break;
+		case AuthPSK:
 			/* dummy to for factotum keyprompt */
 			genrandom(anonce, sizeof(anonce));
 			genrandom(snonce, sizeof(snonce));
 			getptk(auth_getkey, conn.smac, conn.amac, snonce, anonce, ptk);
-		} else {
-			UserPasswd *up;
-
-			if((up = auth_getuserpasswd(auth_getkey, "proto=pass service=wpa essid=%q", essid)) != nil){
-				factotumctl("key proto=mschapv2 role=client service=wpa essid=%q user=%q !password=%q\n",
+			break;
+		case AuthWPA:
+			up = auth_getuserpasswd(auth_getkey, "proto=pass service=wpa essid=%q", essid);
+			if(up != nil){
+				factotumctl("key proto=mschapv2 role=client service=wpa"
+					" essid=%q user=%q !password=%q\n",
 					essid, up->user, up->passwd);
 				freeup(up);
 			}
+			break;
 		}
+		background();
 	}
 
-	if(!background){
-		background = 1;
-		if(!debug){
-			switch(rfork(RFNOTEG|RFREND|RFPROC|RFNOWAIT)){
-			default:
-				exits(nil);
-			case -1:
-				sysfatal("fork: %r");
-				return;
-			case 0:
-				break;
-			}
-		}
-	}
-
 	lastrepc = 0ULL;
 	for(;;){
 		uchar *p, *e, *m;
@@ -1330,7 +1341,10 @@
 		if(debug)
 			fprint(2, "\nrecv(v%d,t%d) %E <- %E: ", conn.version, conn.type, conn.smac, conn.amac);
 
-		if(conn.type == 0x00 && !ispsk){
+		if(authtype == AuthNone)
+			continue;
+
+		if(conn.type == 0x00 && authtype == AuthWPA){
 			uchar code, id;
 
 			if(n < 4)