eefb5ebedecda00f80e7afac43b56fea3929f19f
[radsecproxy.git] / lib / packet.c
1 #include <string.h>
2 #include <assert.h>
3 #include <freeradius/libradius.h>
4 #include "libradsec.h"
5 #include "libradsec-impl.h"
6 #if defined DEBUG
7 #include "debug.h"
8 #endif
9
10 int
11 _packet_create (struct rs_connection *conn, struct rs_packet **pkt_out,
12                 int code)
13 {
14   struct rs_packet *p;
15   RADIUS_PACKET *rpkt;
16
17   *pkt_out = NULL;
18
19   rpkt = rad_alloc (1);
20   if (!rpkt)
21     return rs_conn_err_push (conn, RSE_NOMEM, __func__);
22   rpkt->id = -1;
23   rpkt->code = code;
24
25   p = (struct rs_packet *) malloc (sizeof (struct rs_packet));
26   if (!p)
27     {
28       rad_free (&rpkt);
29       return rs_conn_err_push (conn, RSE_NOMEM, __func__);
30     }
31   memset (p, 0, sizeof (struct rs_packet));
32   p->rpkt = rpkt;
33
34   *pkt_out = p;
35   return RSE_OK;
36 }
37
38 int
39 rs_packet_create_acc_request (struct rs_connection *conn,
40                               struct rs_packet **pkt_out,
41                               const char *user_name, const char *user_pw)
42 {
43   struct rs_packet *pkt;
44   struct rs_attr *attr;
45
46   if (_packet_create (conn, pkt_out, PW_AUTHENTICATION_REQUEST))
47     return -1;
48   pkt = *pkt_out;
49
50   if (rs_attr_create (conn, &attr, "User-Name", user_name))
51     return -1;
52   rs_packet_add_attr (pkt, attr);
53
54   if (rs_attr_create (conn, &attr, "User-Password", user_pw))
55     return -1;
56   /* FIXME: need this too? rad_pwencode(user_pw, &pwlen, SECRET, reqauth) */
57   rs_packet_add_attr (pkt, attr);
58
59   return RSE_OK;
60 }
61
62 int
63 rs_packet_send (struct rs_connection *conn, const struct rs_packet *pkt,
64                 void *user_data)
65 {
66   assert (pkt->rpkt);
67
68   if (!conn->active_peer)
69     {
70       int err = rs_conn_open (conn);
71       if (err)
72         return err;
73       }
74   rad_encode (pkt->rpkt, NULL, conn->active_peer->secret);
75 #if defined (DEBUG)
76   fprintf (stderr, "%s: about to send this to %s:\n", __func__, "<fixme>");
77   rs_dump_packet (pkt);
78 #endif
79
80   return rs_conn_err_push_fl (conn, RSE_NOSYS, __FILE__, __LINE__,
81                               "%s: NYI", __func__);
82 }
83
84 int rs_packet_receive(struct rs_connection *conn, struct rs_packet **pkt)
85 {
86   return rs_conn_err_push_fl (conn, RSE_NOSYS, __FILE__, __LINE__,
87                               "%s: NYI", __func__);
88 }
89
90 void
91 rs_packet_add_attr(struct rs_packet *pkt, struct rs_attr *attr)
92 {
93   pairadd (&pkt->rpkt->vps, attr->vp);
94   attr->pkt = pkt;
95 }