ref: bfb4900f08c0e3a1fb742a77bb66a06b447d6e48
parent: da30c36250f4c39d63b5de5bfd05aab4ad3b4ee6
author: Ori Bernstein <ori@eigenstate.org>
date: Sun Aug 5 11:05:39 EDT 2018
Time out if we don't get pings.
--- a/irc.myr
+++ b/irc.myr
@@ -20,7 +20,6 @@
const cmd : (irc : irc#, ln : byte[:] -> void)
const getstr : (chars : char[:] -> byte[:])
const puthist : (irc : irc#, chan : chan#, ent : (std.time, hist) -> void)
- const ping : (irc : irc#, srv : server# -> void)
;;
const io = {irc, fd@@ -32,10 +31,11 @@
match std.read(srv.fd, srv.buf[srv.nbuf:])
| `std.Err e: closed(irc, srv, "error reading")
| `std.Ok 0: closed(irc, srv, "eof")
- | `std.Ok n:
- srv.nbuf += n
- srv.pong = std.now()
+ | `std.Ok n: srv.nbuf += n
;;
+ if srv.death == 0
+ srv.ping = std.now()
+ ;;
while true
match nextln(irc, srv)
@@ -60,6 +60,8 @@
| "375": srvmsg(irc, args)
| "372": srvmsg(irc, args)
| "376": srvmsg(irc, args)
+ | "333": srvmsg(irc, args)
+ | "470": srvmsg(irc, args)
| "NOTICE": srvmsg(irc, args)
| "332": topic(irc, srv, args)
| "353": addusers(irc, srv, args)
@@ -80,12 +82,6 @@
;;
}
-const ping = {irc, srv- if srv.pong - std.now() > 60*std.Sec
- send(irc, srv, "PING irc.myr")
- ;;
-}
-
const renamed = {irc, srv, src, argsvar a, b
if args.len == 0
@@ -309,7 +305,7 @@
-> void
;;
match sp[0]
- | "/onconn": std.slpush(&irc.onconn, std.sldup(text[sp[0].len:]))
+ | "/onconn": std.slpush(&irc.onconn, std.sldup(std.strstrip(text[sp[0].len:])))
| "/connect": connect(irc, sp[1:])
| "/join": join(irc, sp[1:])
| "/leave": leave(irc, sp[1:])
--- a/main.myr
+++ b/main.myr
@@ -51,8 +51,12 @@
}
const redial = {irc+ var pingtime, droptime
+
for s : irc.srv
- if s.death == 0 || std.now() - s.death < 60*std.Sec
+ droptime = std.now() - s.death
+ pingtime = std.now() - s.ping
+ if pingtime < 600*std.Sec || s.death == 0 || droptime < 60*std.Sec
continue
;;
std.close(s.fd)
@@ -63,10 +67,10 @@
std.close(s.fd)
continue
;;
+ s.death = 0
for j : irc.onconn
do(irc, j)
;;
- s.death = 0
for c : s.chan
send(irc, s, "JOIN {}\r\n", c.name)std.usleep(200*std.Msec)
@@ -99,13 +103,10 @@
start = std.rand(0, pfd.len)
for var j = 0; j != pfd.len; j++
i = (j + start) % pfd.len
- if pfd[i].revents & sys.Pollin != 0
+ if pfd[i].revents & (sys.Pollin|sys.Pollerr) != 0
fd = (pfd[i].fd : std.fd)
out = false
;;
- ;;
- for s : irc.srv
- ping(irc, s)
;;
;;
std.slfree(pfd)
--- a/types.myr
+++ b/types.myr
@@ -34,7 +34,7 @@
chan : chan#[:]
focus : std.size
death : std.time
- pong : std.time
+ ping : std.time
;;
type chan = struct
--
⑨