Opened 13 years ago
Closed 13 years ago
#920 closed defect (fixed)
irc: reconnecting due to server-side EOF broken
| Reported by: | michael | Owned by: | |
|---|---|---|---|
| Priority: | major | Milestone: | |
| Component: | unknown | Version: | 4.8.x |
| Keywords: | Cc: | ||
| Estimated difficulty: |
Description
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 ;-).

Thanks for this fix, Michael. I have applied it and tagged irc 1.9.6.