static gboolean ssl_starttls_real(gpointer data, gint source, b_input_condition cond) { struct scd *conn = data; return ssl_connected(conn, conn->fd, B_EV_IO_WRITE); }
/** Called on successful connections and errors */ void ssl_event_cb(struct bufferevent *bev, short e, void *data) { struct conn *c = data; uint32_t error_conditions = BEV_EVENT_EOF | BEV_EVENT_ERROR | BEV_EVENT_TIMEOUT; #if SSL_DEBUG_LEVEL > 1 errprintf(stdout, "ssl_slave: event callback triggered with flags 0x%hx\n", e); #endif if (e & BEV_EVENT_CONNECTED) { if (c->local_bev == bev) { local_connected(c); } else { ssl_connected(c); } } else if (e & BEV_EVENT_TIMEOUT) { if (c->state == C_SSL_CONNECTING) { /* Handshake timed out. */ #if SSL_DEBUG_LEVEL > 0 errprintf(stdout, "ssl_slave: SSL handshake timeout.\n"); #endif bufferevent_disable(c->remote_bev, EV_READ | EV_WRITE); bufferevent_free(c->remote_bev); c->remote_bev = NULL; c->state = C_SHUTTINGDOWN; if (c->local_bev) { bufferevent_disable(c->local_bev, EV_READ); bufferevent_flush(c->local_bev, EV_WRITE, BEV_FINISHED); } delete_conn(c); } else { /* Bug in some versions of libevent cause this to trigger when it shouldn't. Ignore. */ return; } } else if (e & error_conditions) { if (c->local_bev == bev) { /* Mush side of the connection went away. Flush SSL buffer and shut down. */ #if SSL_DEBUG_LEVEL > 0 errprintf(stdout, "ssl_slave: Lost local connection. State: %d, reason 0x%hx.\n", c->state, e); #endif bufferevent_disable(c->local_bev, EV_READ | EV_WRITE); bufferevent_free(c->local_bev); c->local_bev = NULL; c->state = C_SHUTTINGDOWN; if (c->remote_bev) { bufferevent_disable(c->remote_bev, EV_READ); bufferevent_flush(c->remote_bev, EV_WRITE, BEV_FINISHED); SSL_shutdown(bufferevent_openssl_get_ssl(c->remote_bev)); } delete_conn(c); } else { /* Remote side of the connection went away. Flush mush buffer and shut down. */ #if SSL_DEBUG_LEVEL > 0 errprintf(stdout, "ssl_slave: Lost SSL connection. State: %d, reason 0x%hx.\n", c->state, e); #endif bufferevent_disable(c->remote_bev, EV_READ | EV_WRITE); bufferevent_free(c->remote_bev); c->remote_bev = NULL; c->state = C_SHUTTINGDOWN; if (c->local_bev) { bufferevent_disable(c->local_bev, EV_READ); bufferevent_flush(c->local_bev, EV_WRITE, BEV_FINISHED); } delete_conn(c); } } }