8cb8b7e03110d8b3cc257fe53fbcbb10bd8123d5
[radsecproxy.git] / lib / request.c
1 /* Copyright 2010, 2011 NORDUnet A/S. All rights reserved.
2    See the file COPYING for licensing information.  */
3
4 #if defined HAVE_CONFIG_H
5 #include <config.h>
6 #endif
7
8 #include <time.h>
9 #include <assert.h>
10 #include <event2/event.h>
11 #include <radsec/radsec.h>
12 #include <radsec/radsec-impl.h>
13 #include <radsec/request.h>
14 #include <radsec/request-impl.h>
15 #include "conn.h"
16
17 int
18 rs_request_create (struct rs_connection *conn, struct rs_request **req_out)
19 {
20   struct rs_request *req = rs_malloc (conn->ctx, sizeof(*req));
21   assert (req_out);
22   if (!req)
23     return rs_err_conn_push_fl (conn, RSE_NOMEM, __FILE__, __LINE__, NULL);
24   memset (req, 0, sizeof(*req));
25   req->conn = conn;
26   *req_out = req;
27   return RSE_OK;
28 }
29
30 void
31 rs_request_add_reqpkt (struct rs_request *req, struct rs_packet *reqpkt)
32 {
33   assert (req);
34   req->req_msg = reqpkt;
35 }
36
37 int
38 rs_request_create_authn (struct rs_connection *conn,
39                          struct rs_request **req_out,
40                          const char *user_name,
41                          const char *user_pw)
42 {
43   struct rs_request *req;
44   assert (req_out);
45   if (rs_request_create (conn, &req))
46     return -1;
47
48   if (rs_packet_create_authn_request (conn, &req->req_msg, user_name, user_pw))
49     return -1;
50
51   *req_out = req;
52   return RSE_OK;
53 }
54
55 void
56 rs_request_destroy (struct rs_request *request)
57 {
58   assert (request);
59   rs_packet_destroy (request->req_msg);
60   rs_packet_destroy (request->resp_msg);
61   rs_free (request->conn->ctx, request);
62 }
63
64 #if 0
65 static void
66 _timer_cb (evutil_socket_t fd, short what, void *arg)
67
68 {
69 }
70 #endif
71
72 int
73 rs_request_send (struct rs_request *request, struct rs_packet **resp_msg)
74 {
75   struct rs_connection *conn = NULL;
76
77   if (!request || !request->conn || !request->req_msg || !resp_msg)
78     return rs_err_conn_push_fl (conn, RSE_INVAL, __FILE__, __LINE__, NULL);
79   conn = request->conn;
80   assert (!conn_user_dispatch_p (conn)); /* This function is high level.  */
81
82   if (rs_packet_send (request->req_msg, request))
83     return -1;
84
85   if (rs_conn_receive_packet (request->conn, request->req_msg, resp_msg))
86     return -1;
87
88   return RSE_OK;
89 }