1 /* Copyright 2011 NORDUnet A/S. All rights reserved.
2 See the file COPYING for licensing information. */
4 #if defined HAVE_CONFIG_H
9 #include <event2/event.h>
10 #include <event2/bufferevent.h>
11 #include <radsec/radsec.h>
12 #include <radsec/radsec-impl.h>
22 _conn_open (struct rs_connection *conn, struct rs_packet *pkt)
24 if (event_init_eventbase (conn))
27 if (!conn->active_peer)
28 peer_pick_peer (conn);
29 if (!conn->active_peer)
30 return rs_err_conn_push_fl (conn, RSE_NOPEER, __FILE__, __LINE__, NULL);
32 if (event_init_socket (conn, conn->active_peer))
35 if (conn->realm->type == RS_CONN_TYPE_TCP
36 || conn->realm->type == RS_CONN_TYPE_TLS)
38 if (event_init_bufferevent (conn, conn->active_peer))
43 if (udp_init (conn, pkt))
47 if (!conn->is_connected)
48 if (!conn->is_connecting)
49 event_do_connect (conn);
55 _conn_is_open_p (struct rs_connection *conn)
57 return conn->active_peer && conn->is_connected;
60 /* User callback used when we're dispatching for user. */
62 _wcb (void *user_data)
64 struct rs_packet *pkt = (struct rs_packet *) user_data;
66 pkt->flags |= rs_packet_sent_flag;
68 bufferevent_disable (pkt->conn->bev, EV_WRITE|EV_READ);
70 event_del (pkt->conn->wev);
74 rs_packet_send (struct rs_packet *pkt, void *user_data)
76 struct rs_connection *conn = NULL;
83 if (_conn_is_open_p (conn))
86 if (_conn_open (conn, pkt))
90 assert (conn->active_peer);
91 assert (conn->fd >= 0);
93 conn->user_data = user_data;
95 if (conn->bev) /* TCP */
97 bufferevent_setcb (conn->bev, NULL, tcp_write_cb, tcp_event_cb, pkt);
98 bufferevent_enable (conn->bev, EV_WRITE);
102 err = event_add (conn->wev, NULL);
104 return rs_err_conn_push_fl (conn, RSE_EVENT, __FILE__, __LINE__,
106 evutil_gai_strerror (err));
109 /* Do dispatch, unless the user wants to do it herself. */
110 if (!conn_user_dispatch_p (conn))
112 conn->callbacks.sent_cb = _wcb;
113 conn->user_data = pkt;
114 rs_debug (("%s: entering event loop\n", __func__));
115 err = event_base_dispatch (conn->evb);
117 return rs_err_conn_push_fl (conn, RSE_EVENT, __FILE__, __LINE__,
118 "event_base_dispatch: %s",
119 evutil_gai_strerror (err));
120 rs_debug (("%s: event loop done\n", __func__));
121 conn->callbacks.sent_cb = NULL;
122 conn->user_data = NULL;
124 if ((pkt->flags & rs_packet_sent_flag) == 0)
126 assert (rs_err_conn_peek_code (conn));
127 return rs_err_conn_peek_code (conn);