X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=lib%2Fradsec.c;h=d14ad5057c39b6359fb7d099997c689b64b6b101;hb=937144b230752ac640e611cabb57387f613997bc;hp=3a2f5f716097419eb6c242ef7ce4fb217aa68b67;hpb=81aa93c41def5b73bc5523de852c429355926e93;p=libradsec.git diff --git a/lib/radsec.c b/lib/radsec.c index 3a2f5f7..d14ad50 100644 --- a/lib/radsec.c +++ b/lib/radsec.c @@ -1,115 +1,69 @@ -/* See the file COPYING for licensing information. */ +/* Copyright 2010, 2011 NORDUnet A/S. All rights reserved. + See LICENSE for licensing information. */ + +#if defined HAVE_CONFIG_H +#include +#endif #include #include #include #include #include +#include -#include +#include #include #include #include #include +#include "err.h" +#include "debug.h" +#include "rsp_debug.h" +#if defined (RS_ENABLE_TLS) +#include +#include "rsp_list.h" +#include "../radsecproxy.h" +#endif +/* Public functions. */ int -rs_context_create(struct rs_handle **ctx, const char *dict) +rs_context_create (struct rs_context **ctx) { - struct rs_handle *h; + struct rs_context *h; - if (ctx) - *ctx = NULL; - h = (struct rs_handle *) malloc (sizeof(struct rs_handle)); - if (h) - { - char *buf1 = NULL, *buf2 = NULL; - char *dir, *fn; + h = calloc (1, sizeof(*h)); + if (h == NULL) + return RSE_NOMEM; - 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 (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; +#if defined (RS_ENABLE_TLS) + ssl_init (); #endif - memset (h, 0, sizeof(struct rs_handle)); - fr_randinit (&h->fr_randctx, 0); - fr_rand_seed (NULL, 0); - - if (ctx) - *ctx = h; - } - return h ? RSE_OK : RSE_NOMEM; -} - -void rs_context_destroy(struct rs_handle *ctx) -{ - free (ctx); -} - -int rs_context_set_alloc_scheme(struct rs_handle *ctx, struct rs_alloc_scheme *scheme) -{ - return rs_ctx_err_push_fl (ctx, RSE_NOSYS, __FILE__, __LINE__, - "%s: NYI", __func__); -} - -int rs_context_config_read(struct rs_handle *ctx, const char *config_file) -{ - return rs_ctx_err_push_fl (ctx, RSE_NOSYS, __FILE__, __LINE__, - "%s: NYI", __func__); -} + debug_init ("libradsec"); /* radsecproxy compat, FIXME: remove */ -int rs_conn_create(struct rs_handle *ctx, struct rs_connection **conn) -{ - struct rs_connection *c; + if (ctx != NULL) + *ctx = h; - c = (struct rs_connection *) malloc (sizeof(struct rs_connection)); - if (c) - { - memset (c, 0, sizeof(struct rs_connection)); - c->ctx = ctx; - } - if (conn) - *conn = c; - return c ? RSE_OK : rs_ctx_err_push (ctx, RSE_NOMEM, NULL); + return RSE_OK; } -struct addrinfo * -_resolv (struct rs_connection *conn, const char *hostname, int port) +struct rs_error * +rs_resolve (struct evutil_addrinfo **addr, + rs_conn_type_t type, + const char *hostname, + const char *service) { int err; - char portstr[6]; struct evutil_addrinfo hints, *res = NULL; - snprintf (portstr, sizeof(portstr), "%d", port); memset (&hints, 0, sizeof(struct evutil_addrinfo)); - hints.ai_family = AF_UNSPEC; /* v4 or v6. */ + hints.ai_family = AF_UNSPEC; hints.ai_flags = AI_ADDRCONFIG; - switch (conn->type) + switch (type) { case RS_CONN_TYPE_NONE: - rs_conn_err_push_fl (conn, RSE_INVALID_CONN, __FILE__, __LINE__, NULL); - return NULL; + return err_create (RSE_INVALID_CONN, __FILE__, __LINE__, NULL, NULL); case RS_CONN_TYPE_TCP: /* Fall through. */ case RS_CONN_TYPE_TLS: @@ -122,133 +76,64 @@ _resolv (struct rs_connection *conn, const char *hostname, int port) hints.ai_socktype = SOCK_DGRAM; hints.ai_protocol = IPPROTO_UDP; break; + default: + return err_create (RSE_INVALID_CONN, __FILE__, __LINE__, NULL, NULL); } - err = evutil_getaddrinfo (hostname, portstr, &hints, &res); + err = evutil_getaddrinfo (hostname, service, &hints, &res); if (err) - rs_conn_err_push_fl (conn, RSE_BADADDR, __FILE__, __LINE__, - "%s:%d: bad host name or port (%s)", - hostname, port, evutil_gai_strerror(err)); - return res; /* Simply use first result. */ -} - -static struct rs_peer * -_peer_new (struct rs_connection *conn, const char *hostname, int port) -{ - struct rs_peer *p; - struct evutil_addrinfo *addr; - - addr = _resolv (conn, hostname, port); - if (!addr) - return NULL; - - p = (struct rs_peer *) malloc (sizeof(*p)); - if (p) - { - memset (p, 0, sizeof(struct rs_peer)); - p->conn = conn; - p->fd = -1; - p->addr = addr; - p->next = conn->peers; - if (conn->peers) - conn->peers->next = p; - else - conn->peers = p; - } - else - { - evutil_freeaddrinfo (addr); - rs_conn_err_push_fl (conn, RSE_NOMEM, __FILE__, __LINE__, NULL); - } - return p; + return err_create (RSE_BADADDR, __FILE__, __LINE__, + "%s:%s: bad host name or service name (%s)", + hostname, service, evutil_gai_strerror(err)); + *addr = res; /* Simply use first result. */ + return NULL; } -int -rs_conn_add_server(struct rs_connection *conn, struct rs_peer **server, - rs_conn_type_t type, const char *hostname, int port) +void +rs_context_destroy (struct rs_context *ctx) { - 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); + struct rs_realm *r = NULL; + struct rs_peer *p = NULL; - srv = _peer_new (conn, hostname, port); - if (srv) + if (ctx->config) { - srv->timeout = 10; - srv->tries = 3; + for (r = ctx->config->realms; r; ) + { + struct rs_realm *tmp = r; + for (p = r->peers; p; ) + { + struct rs_peer *tmp = p; + if (p->addr_cache) + { + evutil_freeaddrinfo (p->addr_cache); + p->addr_cache = NULL; + } + p = p->next; + rs_free (ctx, tmp); + } + free (r->name); + rs_free (ctx, r->transport_cred); + r = r->next; + rs_free (ctx, tmp); + } } - if (*server) - *server = srv; - return srv ? RSE_OK : -1; -} - -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 *hostname, int port) -{ - return rs_conn_err_push_fl (conn, RSE_NOSYS, __FILE__, __LINE__, - "%s: NYI", __func__); -} -void -rs_conn_destroy(struct rs_connection *conn) -{ - struct rs_peer *p; - -#warning "TODO: Disconnect active_peer." - - for (p = conn->peers; p; p = p->next) + if (ctx->config) { - if (p->addr) - evutil_freeaddrinfo (p->addr); - if (p->secret) - rs_free (conn->ctx, p->secret); + if (ctx->config->cfg) + { + cfg_free (ctx->config->cfg); + ctx->config->cfg = NULL; + } + rs_free (ctx, ctx->config); } - if (conn->evb) - event_base_free (conn->evb); -} - -int rs_conn_set_eventbase(struct rs_connection *conn, struct event_base *eb) -{ - return rs_conn_err_push_fl (conn, RSE_NOSYS, __FILE__, __LINE__, - "%s: NYI", __func__); -} - -int rs_conn_set_callbacks(struct rs_connection *conn, struct rs_conn_callbacks *cb) -{ - return rs_conn_err_push_fl (conn, RSE_NOSYS, __FILE__, __LINE__, - "%s: NYI", __func__); -} - -int rs_conn_set_server(struct rs_connection *conn, const char *name) -{ - return rs_conn_err_push_fl (conn, RSE_NOSYS, __FILE__, __LINE__, - "%s: NYI", __func__); + free (ctx); } -int rs_conn_get_current_server(struct rs_connection *conn, const char *name, size_t buflen) +int +rs_context_set_alloc_scheme (struct rs_context *ctx, + struct rs_alloc_scheme *scheme) { - return rs_conn_err_push_fl (conn, RSE_NOSYS, __FILE__, __LINE__, - "%s: NYI", __func__); + return rs_err_ctx_push_fl (ctx, RSE_NOSYS, __FILE__, __LINE__, NULL); }