shithub: irc.myr

Download patch

ref: e07b71bff44cc81ec103880eea7a49da6cc624d6
parent: 65a4e90cb71cd53f913591ec0102e18358dd0c6b
author: Ori Bernstein <ori@eigenstate.org>
date: Sun Aug 5 12:56:55 EDT 2018

Be less obnoxious about error handling.

--- a/irc.myr
+++ b/irc.myr
@@ -15,7 +15,7 @@
 	const send	: (irc : irc#, srv : server#, fmt : byte[:], args : ... -> bool)
 	const status	: (irc : irc#, chan : chan#, fmt : byte[:], args : ... -> void)
 	const chancycle	: (irc : irc#, delta : std.size -> void)
-	const handshake	: (irc : irc#, srv : server# -> bool)
+	const handshake	: (irc : irc#, srv : server# -> void)
 	const message	: (irc : irc#, ln : byte[:] -> void)
 	const cmd	: (irc : irc#, ln : byte[:] -> void)
 	const getstr	: (chars : char[:] -> byte[:])
@@ -412,19 +412,14 @@
 	match std.dial(ds)
 	| `std.Ok fd:
 		srv = mksrv(irc, fd, ds)
-		if handshake(irc, srv)
-			srv.id = irc.srv.len
-			std.slpush(&irc.srv, srv)
-			if irc.focus == -1
-				irc.focus = irc.srv.len - 1
-				srv.death = 0
-			;;
-			status(irc, irc.self, "connected to {}", ds)
-		else
-			status(irc, irc.self, "could not handshake with {j= }", args)
-			std.close(srv.fd)
-			std.free(srv)
+		handshake(irc, srv)
+		srv.id = irc.srv.len
+		std.slpush(&irc.srv, srv)
+		if irc.focus == -1
+			irc.focus = irc.srv.len - 1
+			srv.death = 0
 		;;
+		status(irc, irc.self, "connected to {}", ds)
 	| `std.Err e:
 		status(irc, irc.self, "failed to connect: {}", e)
 	;;
@@ -453,7 +448,6 @@
 const handshake = {irc, srv
 	send(irc, srv, "NICK {}\r\n", srv.nick)
 	send(irc, srv, "USER {} 8 * :{}\r\n", srv.user, srv.user)
-	-> true
 }
 
 const join = {irc, args
--- a/main.myr
+++ b/main.myr
@@ -60,13 +60,11 @@
 			continue
 		;;
 		std.close(s.fd)
+		s.fd = -1
 		match std.dial(s.ds)
 		| `std.Ok fd:
 			s.fd = fd
-			if !handshake(irc, s)
-				std.close(s.fd)
-				continue
-			;;
+			handshake(irc, s)
 			s.death = 0
 			for c : irc.onconn
 				do(irc, c)
@@ -78,6 +76,8 @@
 				std.usleep(200*std.Msec)
 			;;
 		| `std.Err e:
+			/* push back our next reconnection attempt */
+			s.death = std.now()
 		;;
 	;;
 }
@@ -93,6 +93,9 @@
 		.revents=0,
 	])
 	for s : irc.srv
+		if s.fd == -1
+			continue
+		;;
 		std.slpush(&pfd, [
 			.fd=(s.fd : sys.fd),
 			.events=sys.Pollin,
@@ -104,7 +107,7 @@
 		start = std.rand(0, pfd.len)
 		for var j = 0; j != pfd.len; j++
 			i = (j + start) % pfd.len
-			if pfd[i].revents != 0
+			if pfd[i].revents & (sys.Pollin|sys.Pollerr) != 0
 				fd = (pfd[i].fd : std.fd)
 				break
 			;;
--