X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=lib%2Fconn.c;h=09a1ac07d37b3efde289bf54c38ecf36a9c48c57;hb=683e3e1bbbdfe2f08dc12f1e840e71ed6088a0e3;hp=f737820149ac817b62919f8837c01247bac284ac;hpb=2913a6b0f4fc5d097843d8c80786b8c313fb9d30;p=libradsec.git diff --git a/lib/conn.c b/lib/conn.c index f737820..09a1ac0 100644 --- a/lib/conn.c +++ b/lib/conn.c @@ -1,11 +1,13 @@ /* Copyright 2010, 2011 NORDUnet A/S. All rights reserved. - See the file COPYING for licensing information. */ + See LICENSE for licensing information. */ #if defined HAVE_CONFIG_H #include #endif #include +#include +#include #include #include #include @@ -20,11 +22,12 @@ int conn_close (struct rs_connection **connp) { - int r; + int r = 0; assert (connp); assert (*connp); - r = rs_conn_destroy (*connp); - if (!r) + if ((*connp)->is_connected) + r = rs_conn_disconnect (*connp); + if (r == RSE_OK) *connp = NULL; return r; } @@ -41,7 +44,8 @@ conn_user_dispatch_p (const struct rs_connection *conn) } int -rs_conn_create (struct rs_context *ctx, struct rs_connection **conn, +rs_conn_create (struct rs_context *ctx, + struct rs_connection **conn, const char *config) { struct rs_connection *c; @@ -91,8 +95,10 @@ rs_conn_set_type (struct rs_connection *conn, rs_conn_type_t type) } int -rs_conn_add_listener (struct rs_connection *conn, rs_conn_type_t type, - const char *hostname, int port) +rs_conn_add_listener (struct rs_connection *conn, + rs_conn_type_t type, + const char *hostname, + int port) { return rs_err_conn_push_fl (conn, RSE_NOSYS, __FILE__, __LINE__, NULL); } @@ -122,16 +128,25 @@ rs_conn_destroy (struct rs_connection *conn) if (conn->is_connected) err = rs_conn_disconnect (conn); + +#if defined (RS_ENABLE_TLS) + if (conn->tls_ssl) /* FIXME: Free SSL strucxt in rs_conn_disconnect? */ + SSL_free (conn->tls_ssl); + if (conn->tls_ctx) + SSL_CTX_free (conn->tls_ctx); +#endif + if (conn->tev) event_free (conn->tev); if (conn->bev) bufferevent_free (conn->bev); + if (conn->rev) + event_free (conn->rev); + if (conn->wev) + event_free (conn->wev); if (conn->evb) event_base_free (conn->evb); - /* TODO: free tls_ctx */ - /* TODO: free tls_ssl */ - rs_free (conn->ctx, conn); return err; @@ -171,7 +186,8 @@ rs_conn_select_peer (struct rs_connection *conn, const char *name) } int -rs_conn_get_current_peer (struct rs_connection *conn, const char *name, +rs_conn_get_current_peer (struct rs_connection *conn, + const char *name, size_t buflen) { return rs_err_conn_push_fl (conn, RSE_NOSYS, __FILE__, __LINE__, NULL); @@ -191,29 +207,13 @@ _rcb (struct rs_packet *packet, void *user_data) assert (pkt); assert (pkt->conn); - pkt->flags |= rs_packet_received_flag; + pkt->flags |= RS_PACKET_RECEIVED; if (pkt->conn->bev) bufferevent_disable (pkt->conn->bev, EV_WRITE|EV_READ); else event_del (pkt->conn->rev); } -/* Special function used in libradsec blocking dispatching mode, - i.e. with socket set to block on read/write and with no libradsec - callbacks registered. - - For any other use of libradsec, a the received_cb callback should - be registered in the callbacks member of struct rs_connection. - - On successful reception of a RADIUS message it will be verified - against REQ_MSG, if !NULL. - - If PKT_OUT is !NULL it will upon return point at a pointer to a - struct rs_packet containing the message. - - If anything goes wrong or if the read times out (TODO: explain), - PKT_OUT will not be changed and one or more errors are pushed on - the connection (available through rs_err_conn_pop()). */ int rs_conn_receive_packet (struct rs_connection *conn, struct rs_packet *req_msg, @@ -224,7 +224,7 @@ rs_conn_receive_packet (struct rs_connection *conn, assert (conn); assert (conn->realm); - assert (!conn_user_dispatch_p (conn)); /* Dispatching mode only. */ + assert (!conn_user_dispatch_p (conn)); /* Blocking mode only. */ if (rs_packet_create (conn, &pkt)) return -1; @@ -234,7 +234,7 @@ rs_conn_receive_packet (struct rs_connection *conn, conn->callbacks.received_cb = _rcb; conn->user_data = pkt; - pkt->flags &= ~rs_packet_received_flag; + pkt->flags &= ~RS_PACKET_RECEIVED; if (conn->bev) /* TCP. */ { @@ -254,7 +254,7 @@ rs_conn_receive_packet (struct rs_connection *conn, "event_add: %s", evutil_gai_strerror (err)); - /* Activae retransmission timer. */ + /* Activate retransmission timer. */ conn_activate_timeout (pkt->conn); } @@ -267,11 +267,14 @@ rs_conn_receive_packet (struct rs_connection *conn, evutil_gai_strerror (err)); rs_debug (("%s: event loop done\n", __func__)); - if ((pkt->flags & rs_packet_received_flag) == 0 + if ((pkt->flags & RS_PACKET_RECEIVED) == 0 || (req_msg && packet_verify_response (pkt->conn, pkt, req_msg) != RSE_OK)) { - assert (rs_err_conn_peek_code (pkt->conn)); + if (rs_err_conn_peek_code (pkt->conn) == RSE_OK) + /* No packet and no error on the stack _should_ mean that the + server hung up on us. */ + rs_err_conn_push (pkt->conn, RSE_DISCO, "no response"); return rs_err_conn_peek_code (conn); }