68adf2b269069d36d4cd126060e1766d5a98c8a2
[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     rad_free (&rpkt);
28     return rs_conn_err_push (conn, RSE_NOMEM, __func__);
29   }
30   memset (p, 0, sizeof (struct rs_packet));
31   p->rpkt = rpkt;
32
33   *pkt_out = p;
34   return RSE_OK;
35 }
36
37 int
38 rs_packet_create_acc_request (struct rs_connection *conn,
39                               struct rs_packet **pkt_out,
40                               const char *user_name, const char *user_pw)
41 {
42   struct rs_packet *pkt;
43   struct rs_attr *attr;
44
45   if (_packet_create (conn, pkt_out, PW_AUTHENTICATION_REQUEST))
46     return -1;
47   pkt = *pkt_out;
48
49   if (rs_attr_create (conn, &attr, "User-Name", user_name))
50     return -1;
51   rs_packet_add_attr (pkt, attr);
52
53   if (rs_attr_create (conn, &attr, "User-Password", user_name))
54     return -1;
55   /* FIXME: need this too? rad_pwencode(user_pw, &pwlen, SECRET, reqauth) */
56   rs_packet_add_attr (pkt, attr);
57
58   return RSE_OK;
59 }
60
61 int
62 rs_packet_send (struct rs_connection *conn, const struct rs_packet *pkt,
63                 void *user_data)
64 {
65   assert (pkt->rpkt);
66
67   if (!conn->active_peer)
68     {
69       int err = rs_conn_open (conn);
70       if (err)
71         return err;
72       }
73   rad_encode (pkt->rpkt, NULL, conn->active_peer->secret);
74 #if defined (DEBUG)
75   fprintf (stderr, "%s: about to send this to %s", __func__, "fixme");
76   rs_dump_packet (pkt);
77 #endif
78
79   return RSE_NOSYS;
80 }
81
82 int rs_packet_receive(struct rs_connection *conn, struct rs_packet **pkt)
83 {
84   return RSE_NOSYS;
85 }
86
87 void
88 rs_packet_add_attr(struct rs_packet *pkt, struct rs_attr *attr)
89 {
90   pairadd (&pkt->rpkt->vps, attr->vp);
91   attr->pkt = pkt;
92 }