Move connection related functions to conn.c.
[radsecproxy.git] / lib / radsec.c
1 /* See the file COPYING for licensing information.  */
2
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <stdint.h>
6 #include <string.h>
7 #include <libgen.h>
8 #include <assert.h>
9
10 #include <freeradius/libradius.h>
11 #include <event2/event.h>
12 #include <event2/util.h>
13 #include <radsec/radsec.h>
14 #include <radsec/radsec-impl.h>
15
16 int
17 rs_context_create(struct rs_context **ctx, const char *dict)
18 {
19   struct rs_context *h;
20
21   if (ctx)
22     *ctx = NULL;
23   h = (struct rs_context *) malloc (sizeof(struct rs_context));
24   if (h)
25     {
26       char *buf1 = NULL, *buf2 = NULL;
27       char *dir, *fn;
28
29       buf1 = malloc (strlen (dict) + 1);
30       buf2 = malloc (strlen (dict) + 1);
31       if (!buf1 || !buf2)
32         {
33           free (h);
34           if (buf1)
35             free (buf1);
36           if (buf2)
37             free (buf2);
38           return RSE_NOMEM;
39         }
40       strcpy (buf1, dict);
41       dir = dirname (buf1);
42       strcpy (buf2, dict);
43       fn = basename (buf2);
44       if (dict_init (dir, fn) < 0)
45         {
46           free (h);
47           return RSE_SOME_ERROR;
48         }
49       free (buf1);
50       free (buf2);
51 #if defined (DEBUG)
52       fr_log_fp = stderr;
53       fr_debug_flag = 1;
54 #endif
55
56       memset (h, 0, sizeof(struct rs_context));
57       fr_randinit (&h->fr_randctx, 0);
58       fr_rand_seed (NULL, 0);
59
60       if (ctx)
61         *ctx = h;
62     }
63   return h ? RSE_OK : RSE_NOMEM;
64 }
65
66 void rs_context_destroy(struct rs_context *ctx)
67 {
68   free (ctx);
69 }
70
71 int rs_context_set_alloc_scheme(struct rs_context *ctx,
72                                 struct rs_alloc_scheme *scheme)
73 {
74   return rs_err_ctx_push_fl (ctx, RSE_NOSYS, __FILE__, __LINE__,
75                              "%s: NYI", __func__);
76 }
77
78
79 struct rs_peer *
80 _rs_peer_create (struct rs_context *ctx, struct rs_peer **rootp)
81 {
82   struct rs_peer *p;
83
84   p = (struct rs_peer *) rs_malloc (ctx, sizeof(*p));
85   if (p)
86     {
87       memset (p, 0, sizeof(struct rs_peer));
88       p->fd = -1;
89       if (*rootp)
90         (*rootp)->next = p;
91       else
92         *rootp = p;
93     }
94   return p;
95 }
96
97 int
98 rs_server_create (struct rs_connection *conn, struct rs_peer **server)
99 {
100   struct rs_peer *srv;
101
102   srv = _rs_peer_create (conn->ctx, &conn->peers);
103   if (srv)
104     {
105       srv->conn = conn;
106       srv->timeout = 1;
107       srv->tries = 3;
108     }
109   else
110     return rs_err_conn_push_fl (conn, RSE_NOMEM, __FILE__, __LINE__, NULL);
111   if (*server)
112     *server = srv;
113   return RSE_OK;
114 }
115
116 int
117 rs_server_set_address (struct rs_peer *server, const char *hostname,
118                        const char *service)
119 {
120   struct rs_error *err;
121
122   err = _rs_resolv (&server->addr, server->conn->type, hostname, service);
123   if (err)
124     return _rs_err_conn_push_err (server->conn, err);
125   return RSE_OK;
126 }
127
128 void
129 rs_server_set_timeout (struct rs_peer *server, int timeout)
130 {
131   server->timeout = timeout;
132 }
133 void
134 rs_server_set_tries (struct rs_peer *server, int tries)
135 {
136   server->tries = tries;
137 }
138
139 int
140 rs_server_set_secret (struct rs_peer *server, const char *secret)
141 {
142   if (server->secret)
143     free (server->secret);
144   server->secret = (char *) malloc (strlen(secret) + 1);
145   if (!server->secret)
146     return rs_err_conn_push (server->conn, RSE_NOMEM, NULL);
147   strcpy (server->secret, secret);
148   return RSE_OK;
149 }
150