* call-seq:
 *      io -> IO
 * Returns an +IO+ handle representing the connection to Spread. The
 * Spread "mailbox" is actually a file descriptor; I'm not sure if
 * this is documented anywhere, but it seems to be relied upon by a
 * number of things.
 * Note that it is *not* safe to do much with the IO object; in
 * particular, reading or writing to it is certainly not wise. This
 * method is intended primarily to allow the use of Kernel#select to
 * wait for Spread activity.
static VALUE
spconn_io(VALUE obj)
    struct SpreadConnection *sp_conn;

    Data_Get_Struct(obj, struct SpreadConnection, sp_conn);
    if (NIL_P(sp_conn->rb_fd))
        /* Construct a new wrapper */
        VALUE fd = INT2NUM(sp_conn->mbox);
        sp_conn->rb_fd =  rb_class_new_instance(1, &fd, rb_cIO);

    return sp_conn->rb_fd;