3 #include <freeradius/libradius.h>
4 #include <event2/event.h>
5 #include <event2/bufferevent.h>
7 #include "libradsec-impl.h"
13 _packet_create (struct rs_connection *conn, struct rs_packet **pkt_out,
23 return rs_conn_err_push (conn, RSE_NOMEM, __func__);
27 p = (struct rs_packet *) malloc (sizeof (struct rs_packet));
31 return rs_conn_err_push (conn, RSE_NOMEM, __func__);
33 memset (p, 0, sizeof (struct rs_packet));
42 rs_packet_create_acc_request (struct rs_connection *conn,
43 struct rs_packet **pkt_out,
44 const char *user_name, const char *user_pw)
46 struct rs_packet *pkt;
49 if (_packet_create (conn, pkt_out, PW_AUTHENTICATION_REQUEST))
53 if (rs_attr_create (conn, &attr, "User-Name", user_name))
55 rs_packet_add_attr (pkt, attr);
57 if (rs_attr_create (conn, &attr, "User-Password", user_pw))
59 /* FIXME: need this too? rad_pwencode(user_pw, &pwlen, SECRET, reqauth) */
60 rs_packet_add_attr (pkt, attr);
66 _event_cb (struct bufferevent *bev, short events, void *ctx)
68 struct rs_packet *pkt = (struct rs_packet *) ctx;
72 if (events & BEV_EVENT_CONNECTED)
75 fprintf (stderr, "%s: connected\n", __func__);
77 rad_encode (pkt->rpkt, NULL, pkt->conn->active_peer->secret);
79 fprintf (stderr, "%s: about to send this to %s:\n", __func__, "<fixme>");
82 if (bufferevent_write(bev, pkt->rpkt->data, pkt->rpkt->data_len))
83 rs_conn_err_push_fl (pkt->conn, RSE_EVENT, __FILE__, __LINE__,
85 /* Packet will be freed in write callback. */
87 else if (events & BEV_EVENT_ERROR)
88 rs_conn_err_push_fl (pkt->conn, RSE_CONNERR, __FILE__, __LINE__, NULL);
92 rs_packet_destroy(struct rs_packet *pkt)
94 rad_free (&pkt->rpkt);
95 rs_free (pkt->conn->ctx, pkt);
99 _write_cb (struct bufferevent *bev, void *ctx)
101 struct rs_packet *pkt = (struct rs_packet *) ctx;
106 fprintf (stderr, "%s: packet written, breaking event loop\n", __func__);
108 if (event_base_loopbreak (pkt->conn->evb) < 0)
109 abort (); /* FIXME */
110 rs_packet_destroy (pkt);
114 rs_packet_send (struct rs_connection *conn, struct rs_packet *pkt, void *data)
116 struct bufferevent *bev;
121 if (rs_conn_open (conn))
123 p = conn->active_peer;
126 assert (conn->active_peer->s >= 0);
127 bev = bufferevent_socket_new (conn->evb, conn->active_peer->s, 0);
129 return rs_conn_err_push_fl (conn, RSE_EVENT, __FILE__, __LINE__,
130 "bufferevent_socket_new");
131 if (bufferevent_socket_connect (bev, p->addr->ai_addr, p->addr->ai_addrlen) < 0)
133 bufferevent_free (bev);
134 return rs_conn_err_push_fl (conn, RSE_EVENT, __FILE__, __LINE__,
135 "bufferevent_socket_connect");
138 bufferevent_setcb (bev, NULL, _write_cb, _event_cb, pkt);
139 event_base_dispatch (conn->evb);
141 fprintf (stderr, "%s: event loop done\n", __func__);
142 assert (event_base_got_break(conn->evb));
148 int rs_packet_receive(struct rs_connection *conn, struct rs_packet **pkt)
150 return rs_conn_err_push_fl (conn, RSE_NOSYS, __FILE__, __LINE__,
151 "%s: NYI", __func__);
155 rs_packet_add_attr(struct rs_packet *pkt, struct rs_attr *attr)
157 pairadd (&pkt->rpkt->vps, attr->vp);