1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
/* Copyright 2010-2013 NORDUnet A/S. All rights reserved.
See LICENSE for licensing information. */
#if defined HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <libgen.h>
#include <assert.h>
#include <radius/client.h>
#include <event2/event.h>
#include <event2/util.h>
#include <radsec/radsec.h>
#include <radsec/radsec-impl.h>
#include "err.h"
#include "debug.h"
#include "radsecproxy/debug.h"
#if defined (RS_ENABLE_TLS)
#include "tls.h"
#include <regex.h>
#include "radsecproxy/list.h"
#include "radsecproxy/radsecproxy.h"
#endif
/* Public functions. */
int
rs_context_create (struct rs_context **ctx)
{
struct rs_context *h;
#if defined (RS_ENABLE_TLS)
if (tls_init ())
return RSE_SSLERR;
#endif
h = calloc (1, sizeof(*h));
if (h == NULL)
return RSE_NOMEM;
debug_init ("libradsec"); /* radsecproxy compat, FIXME: remove */
if (ctx != NULL)
*ctx = h;
return RSE_OK;
}
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_UNSPEC;
hints.ai_flags = AI_ADDRCONFIG;
switch (type)
{
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);
}
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;
}
void
rs_context_destroy (struct rs_context *ctx)
{
struct rs_realm *r = NULL;
struct rs_peer *p = NULL;
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)
{
if (ctx->config->cfg)
{
cfg_free (ctx->config->cfg);
ctx->config->cfg = NULL;
}
rs_free (ctx, ctx->config);
}
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__, NULL);
}
|