﻿id	summary	reporter	owner	description	type	status	priority	milestone	component	version	resolution	keywords	cc	difficulty
920	irc: reconnecting due to server-side EOF broken	michael		"With the irc egg in version 1.9.5, the reconnect handling in `irc:wait` is broken:

When I use `/kill testuser` on the server, the connection gets shut down by the server and `(read-input con)` returns an EOF object.

However, `irc:wait` does not check for an EOF object, it only uses `condition-case` to catch an `irc/eof` error. This is useless, because `(read-input con)` doesn’t `signal` an EOF error, it merely returns an EOF object.

Therefore, `irc:wait` will pass this EOF object to `parse-reply`, which '''does''' check for EOF objects and calls `(eof-error con)`. Since that is outside of the `condition-case`, this error aborts the program flow instead of triggering the reconnect behavior.

Here is a naive fix for the problem:
{{{
(define (irc:wait con)
  (unless (irc:connection-connected? con)
    (error ""not connected"" con) )
  (parse-reply
   (let loop ()
     (condition-case
       (let ((line (read-input con)))
        (when (eof-object? line)
          (eof-error con))
        line)
       (ex (exn net timeout)
           ;(print ""\n*** timeout - reconnecting"")
           (cond ((irc:connection-reconnect? con)
                  (irc:reconnect con)
                  (loop))
                 (else (abort ex))))
       (ex (irc/eof)
           (print ""\n*** EOF - reconnecting"")
           (cond ((irc:connection-reconnect? con)
                  (irc:reconnect con)
                  (loop))
                 (else (abort ex))))))
   con))
}}}

PS: Forgive me if my terminology is wrong. I’m still new ;-)."	defect	closed	major		unknown	4.8.x	fixed			
