X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=lib%2Fevent.c;h=b572184f8dda209b69e4bf1d9b57e03dcacc3f8d;hb=d401ecbd70e02ad5b0cd7ab103359a23c6af3224;hp=2229689ec0305d9e377d16c666425ffeaa920b2d;hpb=19b5ce7ac3f838e689ae6e6b1e4a0c114b44ce67;p=libradsec.git diff --git a/lib/event.c b/lib/event.c index 2229689..b572184 100644 --- a/lib/event.c +++ b/lib/event.c @@ -1,11 +1,14 @@ -/* Copyright 2011 NORDUnet A/S. All rights reserved. - See the file COPYING for licensing information. */ +/* Copyright 2011-2013 NORDUnet A/S. All rights reserved. + See LICENSE for licensing information. */ #if defined HAVE_CONFIG_H #include #endif #include +#include +#include + #include #include #if defined (RS_ENABLE_TLS) @@ -89,6 +92,21 @@ event_retransmit_timeout_cb (int fd, short event, void *data) rs_debug (("%s: retransmission timeout on %p (fd %d) sending to %p\n", __func__, conn, conn->fd, conn->active_peer)); rs_err_conn_push_fl (conn, RSE_TIMEOUT_IO, __FILE__, __LINE__, NULL); + + /* Disable/delete read and write events. Timing out on reading + might f.ex. trigger resending of a message. It'd be + surprising to end up reading without having enabled/created a + read event in that case. */ + if (conn->bev) /* TCP. */ + bufferevent_disable (conn->bev, EV_WRITE|EV_READ); + else /* UDP. */ + { + if (conn->wev) + event_del (conn->wev); + if (conn->rev) + event_del (conn->rev); + } + event_loopbreak (conn); } } @@ -219,9 +237,7 @@ event_loopbreak (struct rs_connection *conn) { int err = event_base_loopbreak (conn->evb); if (err < 0) - rs_err_conn_push_fl (conn, RSE_EVENT, __FILE__, __LINE__, - "event_base_loopbreak: %s", - evutil_gai_strerror (err)); + rs_err_conn_push (conn, RSE_EVENT, "event_base_loopbreak"); return err; } @@ -236,10 +252,21 @@ event_on_disconnect (struct rs_connection *conn) conn->callbacks.disconnected_cb (conn->user_data); } -void +/** Internal connect event returning 0 on success or -1 on error. */ +int event_on_connect (struct rs_connection *conn, struct rs_packet *pkt) { assert (!conn->is_connecting); + +#if defined (RS_ENABLE_TLS) + if (conn_type_tls(conn) && !conn_cred_psk(conn)) + if (tls_verify_cert (conn) != RSE_OK) + { + rs_debug (("%s: server cert verification failed\n", __func__)); + return -1; + } +#endif /* RS_ENABLE_TLS */ + conn->is_connected = 1; rs_debug (("%s: %p connected\n", __func__, conn->active_peer)); @@ -248,6 +275,8 @@ event_on_connect (struct rs_connection *conn, struct rs_packet *pkt) if (pkt) packet_do_send (pkt); + + return 0; } int