summaryrefslogtreecommitdiff
path: root/lib/radsec.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/radsec.c')
-rw-r--r--lib/radsec.c108
1 files changed, 90 insertions, 18 deletions
diff --git a/lib/radsec.c b/lib/radsec.c
index f645ee1..e0c881a 100644
--- a/lib/radsec.c
+++ b/lib/radsec.c
@@ -1,6 +1,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
+#include <string.h>
#include <libgen.h>
#include <freeradius/libradius.h>
@@ -12,40 +13,49 @@ rs_context_create(struct rs_handle **ctx, const char *dict)
{
struct rs_handle *h;
- *ctx = NULL;
- h = (struct rs_handle *) malloc (sizeof (struct rs_handle));
+ if (ctx)
+ *ctx = NULL;
+ h = (struct rs_handle *) malloc (sizeof(struct rs_handle));
if (h)
{
- char *buf;
+ char *buf1 = NULL, *buf2 = NULL;
char *dir, *fn;
- buf = malloc (strlen (dict) + 1);
- if (!buf)
+ buf1 = malloc (strlen (dict) + 1);
+ buf2 = malloc (strlen (dict) + 1);
+ if (!buf1 || !buf2)
{
free (h);
+ if (buf1)
+ free (buf1);
+ if (buf2)
+ free (buf2);
return RSE_NOMEM;
}
- strcpy (buf, dict);
- dir = dirname (buf);
- free (buf);
- strcpy (buf, dict);
- fn = basename (buf);
- free (buf);
+ strcpy (buf1, dict);
+ dir = dirname (buf1);
+ strcpy (buf2, dict);
+ fn = basename (buf2);
if (dict_init (dir, fn) < 0)
{
free (h);
return RSE_SOME_ERROR;
}
+ free (buf1);
+ free (buf2);
#if defined (DEBUG)
fr_log_fp = stderr;
fr_debug_flag = 1;
#endif
+
+ memset (h, 0, sizeof(struct rs_handle));
fr_randinit (&h->fr_randctx, 0);
fr_rand_seed (NULL, 0);
- *ctx = h;
+ if (ctx)
+ *ctx = h;
}
- return (h ? RSE_OK : RSE_NOMEM);
+ return h ? RSE_OK : RSE_NOMEM;
}
void rs_context_destroy(struct rs_handle *ctx)
@@ -63,17 +73,73 @@ int rs_context_config_read(struct rs_handle *ctx, const char *config_file)
return RSE_NOSYS;
}
-int rs_conn_create(const struct rs_handle *ctx, struct rs_connection **conn)
+int rs_conn_create(struct rs_handle *ctx, struct rs_connection **conn)
{
- return RSE_NOSYS;
+ struct rs_connection *c;
+
+ c = (struct rs_connection *) malloc (sizeof(struct rs_connection));
+ if (c)
+ {
+ memset (c, 0, sizeof(struct rs_connection));
+ c->ctx = ctx;
+ c->peers.next = &c->peers;
+ }
+ if (conn)
+ *conn = c;
+ return c ? RSE_OK : rs_ctx_err_push (ctx, RSE_NOMEM, NULL);
}
-int rs_conn_add_server(struct rs_connection *conn, rs_conn_type_t type, const char *host, int port, int timeout, int tries, const char *secret)
+struct addrinfo *
+_resolv (const char *host, int port)
{
- return RSE_NOSYS;
+ return NULL;
}
-int rs_conn_add_listener(struct rs_connection *conn, rs_conn_type_t type, const char *host, int port, const char *secret)
+int rs_conn_add_server(struct rs_connection *conn, struct rs_peer **server, rs_conn_type_t type, const char *host, int port)
+{
+ struct rs_peer *srv;
+
+ if (conn->type == RS_CONN_TYPE_NONE)
+ conn->type = type;
+ else if (conn->type != type)
+ return rs_conn_err_push (conn, RSE_CONN_TYPE_MISMATCH, NULL);
+
+ srv = (struct rs_peer *) malloc (sizeof(struct rs_peer));
+ if (srv)
+ {
+ memset (srv, 0, sizeof(struct rs_peer));
+ srv->conn = conn;
+ srv->addr = _resolv (host, port);
+ srv->timeout = 10;
+ srv->tries = 3;
+ srv->next = conn->peers.next;
+ conn->peers.next = srv;
+ }
+ if (*server)
+ *server = srv;
+ return srv ? RSE_OK : rs_conn_err_push (conn, RSE_NOMEM, NULL);
+}
+
+void rs_server_set_timeout(struct rs_peer *server, int timeout)
+{
+ server->timeout = timeout;
+}
+void rs_server_set_tries(struct rs_peer *server, int tries)
+{
+ server->tries = tries;
+}
+int rs_server_set_secret(struct rs_peer *server, const char *secret)
+{
+ if (server->secret)
+ free (server->secret);
+ server->secret = (char *) malloc (strlen(secret) + 1);
+ if (!server->secret)
+ return rs_conn_err_push (server->conn, RSE_NOMEM, NULL);
+ strcpy (server->secret, secret);
+ return RSE_OK;
+}
+
+int rs_conn_add_listener(struct rs_connection *conn, rs_conn_type_t type, const char *host, int port)
{
return RSE_NOSYS;
}
@@ -102,3 +168,9 @@ int rs_conn_get_server(const struct rs_connection *conn, const char *name, size_
{
return RSE_NOSYS;
}
+
+int rs_conn_open(struct rs_connection *conn)
+{
+ return rs_conn_err_push_fl (conn, RSE_NOSYS, __FILE__, __LINE__,
+ "%s: NYI", __func__);
+}