gsliepen/tinc — pull request #23 by dechamps (2014-06-27 18:44:00+00:00)
Title: Protect against spurious connection events

The event loop does not guarantee that spurious write I/O events do not happen; in fact, they are guaranteed to happen on Windows when `event_flush_output()` is called. Because `handle_meta_io()` does not check for spurious events, a metaconnection socket might appear connected even though it's not, and will fail immediately when sending the ID request.

This commit fixes this issue by making `handle_meta_io()` check the connection status before assuming the socket is connected. It seems that the only reliable way to do that is to try to call `connect()` again and look at the error code, which will be `EISCONN` if the socket is connected, or `EALREADY` if it's not.

I was originally planning to do this in #20, but I changed my mind when I realized both changes are independent from each other.