X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=lib%2Fradsec.c;h=83ce6c590b35438c68cd7ed7427f723eb2708bbf;hb=11570f6201548b957b70e8b93e954538f01d09c7;hp=45c4f42b7cf731e51de6081f2933a96ebf523c16;hpb=da2100919c081204ae2fe48e8e3c156bf717d353;p=libradsec.git diff --git a/lib/radsec.c b/lib/radsec.c index 45c4f42..83ce6c5 100644 --- a/lib/radsec.c +++ b/lib/radsec.c @@ -1,4 +1,5 @@ -/* See the file COPYING for licensing information. */ +/* Copyright 2010-2013 NORDUnet A/S. All rights reserved. + See LICENSE for licensing information. */ #if defined HAVE_CONFIG_H #include @@ -11,144 +12,130 @@ #include #include -#include +#include #include #include #include #include +#include "err.h" +#include "debug.h" +#include "radsecproxy/debug.h" #if defined (RS_ENABLE_TLS) +#include "tls.h" #include -#include "debug.h" -#include "rsp_list.h" -#include "../radsecproxy.h" +#include "radsecproxy/list.h" +#include "radsecproxy/radsecproxy.h" #endif -#include "rsp_debug.h" +/* Public functions. */ int -rs_context_create(struct rs_context **ctx, const char *dict) +rs_context_create (struct rs_context **ctx) { - int err = RSE_OK; struct rs_context *h; - char *buf1 = NULL, *buf2 = NULL; - char *dir, *fn; - assert (dict); +#if defined (RS_ENABLE_TLS) + if (tls_init ()) + return RSE_SSLERR; +#endif - if (ctx) - *ctx = NULL; - h = (struct rs_context *) malloc (sizeof(struct rs_context)); - if (!h) + h = calloc (1, sizeof(*h)); + if (h == NULL) return RSE_NOMEM; - /* Initialize freeradius dictionary. */ - buf1 = malloc (strlen (dict) + 1); - buf2 = malloc (strlen (dict) + 1); - if (!buf1 || !buf2) - { - err = RSE_NOMEM; - goto err_out; - } - strcpy (buf1, dict); - dir = dirname (buf1); - strcpy (buf2, dict); - fn = basename (buf2); - if (dict_init (dir, fn) < 0) - { - err = RSE_FR; - goto err_out; - } - free (buf1); - free (buf2); - -#if defined (RS_ENABLE_TLS) - ssl_init (); -#endif -#if defined (DEBUG) - fr_log_fp = stderr; - fr_debug_flag = 1; -#endif debug_init ("libradsec"); /* radsecproxy compat, FIXME: remove */ - memset (h, 0, sizeof(struct rs_context)); - fr_randinit (&h->fr_randctx, 0); - fr_rand_seed (NULL, 0); - - if (ctx) + if (ctx != NULL) *ctx = h; return RSE_OK; - - err_out: - if (buf1) - free (buf1); - if (buf2) - free (buf2); - if (h) - free (h); - return err; } -struct rs_peer * -_rs_peer_create (struct rs_context *ctx, struct rs_peer **rootp) +struct rs_error * +rs_resolve (struct evutil_addrinfo **addr, + rs_conn_type_t type, + const char *hostname, + const char *service) { - struct rs_peer *p; + int err; + struct evutil_addrinfo hints, *res = NULL; - p = (struct rs_peer *) rs_malloc (ctx, sizeof(*p)); - if (p) + memset (&hints, 0, sizeof(struct evutil_addrinfo)); + hints.ai_family = AF_UNSPEC; + hints.ai_flags = AI_ADDRCONFIG; + switch (type) { - memset (p, 0, sizeof(struct rs_peer)); - if (*rootp) - { - p->next = (*rootp)->next; - (*rootp)->next = p; - } - else - *rootp = p; + case RS_CONN_TYPE_NONE: + return err_create (RSE_INVALID_CONN, __FILE__, __LINE__, NULL, NULL); + case RS_CONN_TYPE_TCP: + /* Fall through. */ + case RS_CONN_TYPE_TLS: + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = IPPROTO_TCP; + break; + case RS_CONN_TYPE_UDP: + /* Fall through. */ + case RS_CONN_TYPE_DTLS: + hints.ai_socktype = SOCK_DGRAM; + hints.ai_protocol = IPPROTO_UDP; + break; + default: + return err_create (RSE_INVALID_CONN, __FILE__, __LINE__, NULL, NULL); } - return p; + err = evutil_getaddrinfo (hostname, service, &hints, &res); + if (err) + 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; } -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; - } - if (p->secret) - rs_free (p->conn->ctx, p->secret); - rs_free (p->conn->ctx, p); -} - -void rs_context_destroy(struct rs_context *ctx) +void +rs_context_destroy (struct rs_context *ctx) { struct rs_realm *r = NULL; struct rs_peer *p = NULL; - for (r = ctx->realms; r; ) + if (ctx->config) + { + 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 (ctx->config) { - struct rs_realm *tmp = r; - for (p = r->peers; p; ) + if (ctx->config->cfg) { - struct rs_peer *tmp = p; - p = p->next; - _rs_peer_destroy (tmp); + cfg_free (ctx->config->cfg); + ctx->config->cfg = NULL; } - r = r->next; - rs_free (ctx, tmp); + rs_free (ctx, ctx->config); } - dict_free (); - rs_free (ctx, ctx); + + free (ctx); } -int rs_context_set_alloc_scheme(struct rs_context *ctx, - struct rs_alloc_scheme *scheme) +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__); + return rs_err_ctx_push_fl (ctx, RSE_NOSYS, __FILE__, __LINE__, NULL); } +