diff options
-rw-r--r-- | lib/include/radsec/radsec-impl.h | 2 | ||||
-rw-r--r-- | lib/packet.c | 43 |
2 files changed, 16 insertions, 29 deletions
diff --git a/lib/include/radsec/radsec-impl.h b/lib/include/radsec/radsec-impl.h index b5dafef..932e5d2 100644 --- a/lib/include/radsec/radsec-impl.h +++ b/lib/include/radsec/radsec-impl.h @@ -93,6 +93,8 @@ struct rs_packet { uint8_t hdr[4]; RADIUS_PACKET *rpkt; struct rs_packet *original; + char valid_flag; + char written_flag; }; struct rs_attr { diff --git a/lib/packet.c b/lib/packet.c index c8f4af1..4accd2a 100644 --- a/lib/packet.c +++ b/lib/packet.c @@ -586,18 +586,10 @@ rs_packet_create_auth_request (struct rs_connection *conn, static void _wcb (void *user_data) { - struct rs_connection *conn = (struct rs_connection *) user_data; - int err; - - assert (conn); - - /* When we're running the event loop for the user, we must break - it in order to give the control back to the user. */ - 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)); + struct rs_packet *pkt = (struct rs_packet *) user_data; + assert (pkt); + pkt->written_flag = 1; + bufferevent_disable (pkt->conn->bev, EV_WRITE|EV_READ); } int @@ -623,12 +615,13 @@ rs_packet_send (struct rs_packet *pkt, void *user_data) conn->user_data = user_data; bufferevent_setcb (conn->bev, NULL, _write_cb, _event_cb, pkt); + bufferevent_enable (conn->bev, EV_WRITE); /* Do dispatch, unless the user wants to do it herself. */ if (!conn->user_dispatch_flag) { conn->callbacks.sent_cb = _wcb; - conn->user_data = conn; + conn->user_data = pkt; rs_debug (("%s: entering event loop\n", __func__)); err = event_base_dispatch (conn->evb); if (err < 0) @@ -639,7 +632,7 @@ rs_packet_send (struct rs_packet *pkt, void *user_data) conn->callbacks.sent_cb = NULL; conn->user_data = NULL; - if (!event_base_got_break (conn->evb)) + if (!pkt->written_flag) return -1; } @@ -649,15 +642,10 @@ rs_packet_send (struct rs_packet *pkt, void *user_data) static void _rcb (struct rs_packet *packet, void *user_data) { - int err = 0; - - /* When we're running the event loop for the user, we must break it - in order to give the control back to the user. */ - err = event_base_loopbreak (packet->conn->evb); - if (err < 0) - rs_err_conn_push_fl (packet->conn, RSE_EVENT, __FILE__, __LINE__, - "event_base_loopbreak: %s", - evutil_gai_strerror (err)); + struct rs_packet *pkt = (struct rs_packet *) user_data; + assert (pkt); + pkt->valid_flag = 1; + bufferevent_disable (pkt->conn->bev, EV_WRITE|EV_READ); } /* Special function used in libradsec blocking dispatching mode, @@ -698,14 +686,11 @@ rs_conn_receive_packet (struct rs_connection *conn, assert (conn->active_peer); assert (conn->fd >= 0); - /* Install callbacks with libevent. */ bufferevent_setwatermark (conn->bev, EV_READ, RS_HEADER_LEN, 0); - bufferevent_enable (conn->bev, EV_READ); bufferevent_setcb (conn->bev, _read_cb, NULL, _event_cb, pkt); - - /* Install read callback with ourselves, for breaking event - loop upon reception of a valid packet. */ + bufferevent_enable (conn->bev, EV_READ); conn->callbacks.received_cb = _rcb; + conn->user_data = pkt; /* Dispatch. */ rs_debug (("%s: entering event loop\n", __func__)); @@ -717,7 +702,7 @@ rs_conn_receive_packet (struct rs_connection *conn, evutil_gai_strerror (err)); rs_debug (("%s: event loop done\n", __func__)); - if (!event_base_got_break (conn->evb)) + if (!pkt->valid_flag) return -1; #if defined (DEBUG) |