X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=lib%2Fradsec.c;h=d14ad5057c39b6359fb7d099997c689b64b6b101;hb=937144b230752ac640e611cabb57387f613997bc;hp=760da84769aa0a09bbf10770b1e4f32bf3645051;hpb=94e3f46ef6c976f6bbd670555262ec6466314d8a;p=libradsec.git diff --git a/lib/radsec.c b/lib/radsec.c index 760da84..d14ad50 100644 --- a/lib/radsec.c +++ b/lib/radsec.c @@ -1,71 +1,139 @@ +/* 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 "libradsec.h" -#include "libradsec-impl.h" +#include +#include +#include -#define ERR_OK 0 -#define ERR_NOMEM 1 -#define ERR_NOSYS 2 -#define ERR_SOME_ERROR 99 +#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 -int rs_context_create(struct rs_handle **ctx) +/* Public functions. */ +int +rs_context_create (struct rs_context **ctx) { - *ctx = (struct rs_handle *) malloc (sizeof (struct rs_handle)); - return (ctx ? ERR_OK : ERR_NOMEM); -} + struct rs_context *h; -void rs_context_destroy(struct rs_handle *ctx) -{ - free (ctx); -} + h = calloc (1, sizeof(*h)); + if (h == NULL) + return RSE_NOMEM; -int rs_context_set_alloc_scheme(struct rs_handle *ctx, struct rs_alloc_scheme *scheme) -{ - return ERR_NOSYS; -} +#if defined (RS_ENABLE_TLS) + ssl_init (); +#endif -int rs_context_config_read(struct rs_handle *ctx, const char *config_file) -{ - return ERR_NOSYS; -} + debug_init ("libradsec"); /* radsecproxy compat, FIXME: remove */ -int rs_conn_create(const struct rs_handle *ctx, struct rs_connection **conn) -{ - return ERR_NOSYS; -} + if (ctx != NULL) + *ctx = h; -int rs_conn_destroy(struct rs_connection *conn) -{ - return ERR_NOSYS; + return RSE_OK; } -int rs_conn_set_eventbase(struct rs_connection *conn, struct event_base *eb) +struct rs_error * +rs_resolve (struct evutil_addrinfo **addr, + rs_conn_type_t type, + const char *hostname, + const char *service) { - return ERR_NOSYS; -} + int err; + struct evutil_addrinfo hints, *res = NULL; -int rs_conn_set_callbacks(struct rs_connection *conn, struct rs_conn_callbacks *cb) -{ - return ERR_NOSYS; + 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; } -int rs_conn_set_server(struct rs_connection *conn, const char *name) +void +rs_context_destroy (struct rs_context *ctx) { - return ERR_NOSYS; -} + struct rs_realm *r = NULL; + struct rs_peer *p = NULL; -int rs_conn_get_server(const struct rs_connection *conn, const char *name, size_t buflen) -{ - return ERR_NOSYS; -} + 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); + } + } -int rs_packet_send(const struct rs_conn *conn, const struct rs_packet *pkt, void *user_data) -{ - return ERR_NOSYS; + 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_packet_receive(const struct rs_conn *conn, struct rs_packet **pkt) +int +rs_context_set_alloc_scheme (struct rs_context *ctx, + struct rs_alloc_scheme *scheme) { - return ERR_NOSYS; + return rs_err_ctx_push_fl (ctx, RSE_NOSYS, __FILE__, __LINE__, NULL); }