/** * @brief Destroy and free a generic connection object after executing its protocol-specific destructor; update any statistics accordingly. * @param con a pointer to the connection to be destroyed. * @return This function returns no value. */ void con_destroy(connection_t *con) { if (con && !con_decrement_refs(con)) { switch (con->server->protocol) { case (POP): if (con->network.ssl) { stats_decrement_by_name("pop.connections.secure"); } stats_decrement_by_name("pop.connections.total"); pop_session_destroy(con); break; case (IMAP): if (con->network.ssl) { stats_decrement_by_name("imap.connections.secure"); } stats_decrement_by_name("imap.connections.total"); imap_session_destroy(con); break; case (HTTP): if (con->network.ssl) { stats_decrement_by_name("http.connections.secure"); } stats_decrement_by_name("http.connections.total"); http_session_destroy(con); break; case (SMTP): if (con->network.ssl) { stats_decrement_by_name("smtp.connections.secure"); } stats_decrement_by_name("smtp.connections.total"); smtp_session_destroy(con); break; case (SUBMISSION): if (con->network.ssl) { stats_decrement_by_name("smtp.connections.secure"); } stats_decrement_by_name("smtp.connections.total"); smtp_session_destroy(con); break; case (MOLTEN): if (con->network.ssl) { stats_decrement_by_name("molten.connections.secure"); } stats_decrement_by_name("molten.connections.total"); molten_session_destroy(con); break; default: break; } if (con->network.ssl) { ssl_free(con->network.ssl); } if (con->network.sockd != -1) { close(con->network.sockd); } st_cleanup(con->network.buffer); st_cleanup(con->network.reverse.domain); mutex_destroy(&(con->lock)); mm_free(con); } return; }
static void session_timeout(IOCHAN i, int event) { struct http_session *s = iochan_getdata(i); http_session_destroy(s); }