X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=lib%2Fradsec.c;h=d14ad5057c39b6359fb7d099997c689b64b6b101;hb=937144b230752ac640e611cabb57387f613997bc;hp=a05a22be05003bf266199675cb1af21d39756145;hpb=2af84872cb78becf43f7bf4a654418fb7fc532d5;p=libradsec.git diff --git a/lib/radsec.c b/lib/radsec.c index a05a22b..d14ad50 100644 --- a/lib/radsec.c +++ b/lib/radsec.c @@ -1,5 +1,5 @@ /* Copyright 2010, 2011 NORDUnet A/S. All rights reserved. - See the file COPYING for licensing information. */ + See LICENSE for licensing information. */ #if defined HAVE_CONFIG_H #include @@ -12,7 +12,7 @@ #include #include -#include +#include #include #include #include @@ -28,80 +28,37 @@ /* 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 (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); + debug_init ("libradsec"); /* radsecproxy compat, FIXME: remove */ - 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_error * /* FIXME: Return int as all the others? */ -rs_resolv (struct evutil_addrinfo **addr, - rs_conn_type_t type, - const char *hostname, - const char *service) +struct rs_error * +rs_resolve (struct evutil_addrinfo **addr, + rs_conn_type_t type, + const char *hostname, + const char *service) { int err; struct evutil_addrinfo hints, *res = NULL; memset (&hints, 0, sizeof(struct evutil_addrinfo)); - hints.ai_family = AF_INET; /* IPv4 only. TODO: Set AF_UNSPEC. */ + hints.ai_family = AF_UNSPEC; hints.ai_flags = AI_ADDRCONFIG; switch (type) { @@ -137,27 +94,40 @@ 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) { - struct rs_realm *tmp = r; - for (p = r->peers; p; ) + for (r = ctx->config->realms; r; ) { - struct rs_peer *tmp = p; - if (p->addr) - evutil_freeaddrinfo (p->addr); - p = p->next; + 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); } - rs_free (ctx, r->name); - r = r->next; - rs_free (ctx, tmp); } - if (ctx->cfg) - cfg_free (ctx->cfg); - ctx->cfg = NULL; + if (ctx->config) + { + if (ctx->config->cfg) + { + cfg_free (ctx->config->cfg); + ctx->config->cfg = NULL; + } + rs_free (ctx, ctx->config); + } - rs_free (ctx, ctx); + free (ctx); } int