summaryrefslogtreecommitdiff
path: root/lib/radsec.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/radsec.c')
-rw-r--r--lib/radsec.c89
1 files changed, 60 insertions, 29 deletions
diff --git a/lib/radsec.c b/lib/radsec.c
index 16a554f..c821566 100644
--- a/lib/radsec.c
+++ b/lib/radsec.c
@@ -18,6 +18,7 @@
#include <radsec/radsec-impl.h>
#if defined (RS_ENABLE_TLS)
#include <regex.h>
+#include "debug.h"
#include "rsp_list.h"
#include "../radsecproxy.h"
#endif
@@ -69,14 +70,6 @@ rs_context_create(struct rs_context **ctx, const char *dict)
debug_init ("libradsec"); /* radsecproxy compat, FIXME: remove */
memset (h, 0, sizeof(struct rs_context));
- h->realms = malloc (sizeof (struct rs_realm));
- if (!h->realms)
- {
- err = RSE_NOMEM;
- goto err_out;
- }
- memset (h->realms, 0, sizeof (struct rs_realm));
- h->realms->next = h->realms;
fr_randinit (&h->fr_randctx, 0);
fr_rand_seed (NULL, 0);
@@ -95,19 +88,6 @@ rs_context_create(struct rs_context **ctx, const char *dict)
return err;
}
-void rs_context_destroy(struct rs_context *ctx)
-{
- free (ctx);
-}
-
-int rs_context_set_alloc_scheme(struct rs_context *ctx,
- struct rs_alloc_scheme *scheme)
-{
- return rs_err_ctx_push_fl (ctx, RSE_NOSYS, __FILE__, __LINE__,
- "%s: NYI", __func__);
-}
-
-
struct rs_peer *
_rs_peer_create (struct rs_context *ctx, struct rs_peer **rootp)
{
@@ -117,15 +97,59 @@ _rs_peer_create (struct rs_context *ctx, struct rs_peer **rootp)
if (p)
{
memset (p, 0, sizeof(struct rs_peer));
- p->fd = -1;
if (*rootp)
- (*rootp)->next = p;
+ {
+ p->next = (*rootp)->next;
+ (*rootp)->next = p;
+ }
else
*rootp = p;
}
return p;
}
+static void
+_rs_peer_destroy (struct rs_peer *p)
+{
+ assert (p);
+ assert (p->conn);
+ assert (p->conn->ctx);
+ /* NOTE: The peer object doesn't own its connection (conn). */
+ if (p->addr)
+ {
+ evutil_freeaddrinfo (p->addr);
+ p->addr = NULL;
+ }
+ rs_free (p->conn->ctx, p);
+}
+
+void rs_context_destroy(struct rs_context *ctx)
+{
+ struct rs_realm *r = NULL;
+ struct rs_peer *p = NULL;
+
+ for (r = ctx->realms; r; )
+ {
+ struct rs_realm *tmp = r;
+ for (p = r->peers; p; )
+ {
+ struct rs_peer *tmp = p;
+ p = p->next;
+ _rs_peer_destroy (tmp);
+ }
+ r = r->next;
+ rs_free (ctx, tmp);
+ }
+ rs_free (ctx, ctx);
+}
+
+int rs_context_set_alloc_scheme(struct rs_context *ctx,
+ struct rs_alloc_scheme *scheme)
+{
+ return rs_err_ctx_push_fl (ctx, RSE_NOSYS, __FILE__, __LINE__,
+ "%s: NYI", __func__);
+}
+
int
rs_server_create (struct rs_connection *conn, struct rs_peer **server)
{
@@ -135,8 +159,8 @@ rs_server_create (struct rs_connection *conn, struct rs_peer **server)
if (srv)
{
srv->conn = conn;
- srv->timeout = 1;
- srv->tries = 3;
+ srv->realm->timeout = 2;
+ srv->realm->retries = 2;
}
else
return rs_err_conn_push_fl (conn, RSE_NOMEM, __FILE__, __LINE__, NULL);
@@ -151,7 +175,10 @@ rs_server_set_address (struct rs_peer *server, const char *hostname,
{
struct rs_error *err;
- err = _rs_resolv (&server->addr, server->conn->type, hostname, service);
+ assert (server);
+ assert (server->realm);
+
+ err = _rs_resolv (&server->addr, server->realm->type, hostname, service);
if (err)
return _rs_err_conn_push_err (server->conn, err);
return RSE_OK;
@@ -160,12 +187,16 @@ rs_server_set_address (struct rs_peer *server, const char *hostname,
void
rs_server_set_timeout (struct rs_peer *server, int timeout)
{
- server->timeout = timeout;
+ assert (server);
+ assert (server->realm);
+ server->realm->timeout = timeout;
}
void
-rs_server_set_tries (struct rs_peer *server, int tries)
+rs_server_set_retries (struct rs_peer *server, int retries)
{
- server->tries = tries;
+ assert (server);
+ assert (server->realm);
+ server->realm->retries = retries;
}
int