/*
 * call-seq:
 *
 *      server = Kgio::TCPServer.new('0.0.0.0', 80)
 *      server.kgio_tryaccept -> Kgio::Socket or nil
 *      server.kgio_tryaccept(klass = MySocket) -> MySocket or nil
 *      server.kgio_tryaccept(nil, flags) -> Kgio::Socket or nil
 *
 * Initiates a non-blocking accept and returns a generic Kgio::Socket
 * object with the kgio_addr attribute set to the IP address of the
 * connected client on success.
 *
 * Returns nil on EAGAIN, and raises on other errors.
 *
 * An optional +klass+ argument may be specified to override the
 * Kgio::Socket-class on a successful return value.
 *
 * An optional +flags+ argument may also be specified.
 * +flags+ is a bitmask that may contain any combination of:
 *
 * - Kgio::SOCK_CLOEXEC - close-on-exec flag (enabled by default)
 * - Kgio::SOCK_NONBLOCK - non-blocking flag (unimportant)
 */
static VALUE tcp_tryaccept(int argc, VALUE *argv, VALUE self)
{
        struct sockaddr_storage addr;
        socklen_t addrlen = sizeof(struct sockaddr_storage);
        struct accept_args a;

        a.addr = (struct sockaddr *)&addr;
        a.addrlen = &addrlen;
        prepare_accept(&a, self, argc, argv);
        return my_accept(&a, 1);
}