summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/include/radsec/radsec-impl.h2
-rw-r--r--lib/packet.c43
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)