size_t memory_used_before = 0;
size_t memory_used_after = 0;
#endif
-
+ virtual_server_t const *vs;
fr_pair_list_init(&filter_vps);
if (server_init(config->root_cs) < 0) EXIT_WITH_FAILURE;
- server_cs = virtual_server_find("default");
- if (!server_cs) {
+ vs = virtual_server_find("default");
+ if (!vs) {
ERROR("Cannot find virtual server 'default'");
EXIT_WITH_FAILURE;
}
+ server_cs = virtual_server_cs(vs);
+
/*
* Do some sanity checking.
*/
* Find the virtual server for this client.
*/
if (c->server) {
+ virtual_server_t const *vs;;
if (server_cs) {
cf_log_err(cs, "Clients inside of a 'server' section cannot point to a server");
goto error;
}
- c->server_cs = virtual_server_find(c->server);
+ vs = virtual_server_find(c->server);
+ if (!vs) goto error;
+
+ c->server_cs = virtual_server_cs(vs);
if (!c->server_cs) {
cf_log_err(cs, "Failed to find virtual server %s", c->server);
goto error;
* @copyright 2000 Alan Curry (pacman@world.std.com)
*/
+#include "lib/server/cf_util.h"
RCSID("$Id$")
#include <freeradius-devel/protocol/freeradius/freeradius.internal.h>
*/
fr_dict_t const *virtual_server_dict_by_name(char const *virtual_server)
{
- CONF_SECTION const *server_cs;
+ virtual_server_t const *vs;
- server_cs = virtual_server_find(virtual_server);
- if (!server_cs) return NULL;
+ vs = virtual_server_find(virtual_server);
+ if (!vs) return NULL;
- return virtual_server_dict_by_cs(server_cs);
+ return virtual_server_dict_by_cs(vs->server_cs);
}
/** Return the namespace for the virtual server specified by a config section
int virtual_server_has_namespace(CONF_SECTION **out,
char const *virtual_server, fr_dict_t const *namespace, CONF_ITEM *ci)
{
- CONF_SECTION *server_cs;
- fr_dict_t const *dict;
+ virtual_server_t const *vs;
+ CONF_SECTION *server_cs;
+ fr_dict_t const *dict;
if (out) *out = NULL;
- server_cs = virtual_server_find(virtual_server);
- if (!server_cs) {
+ vs = virtual_server_find(virtual_server);
+ if (!vs) {
if (ci) cf_log_err(ci, "Can't find virtual server \"%s\"", virtual_server);
return -1;
}
+ server_cs = virtual_server_cs(vs);
+
dict = virtual_server_dict_by_name(virtual_server);
if (!dict) {
/*
return fr_rb_insert(listen_addr_root, li);
}
+/** Return the configuration section for a virtual server
+ *
+ * @param[in] vs to return conf section for
+ * @return
+ * - The CONF_SECTION of the virtual server.
+ */
+CONF_SECTION *virtual_server_cs(virtual_server_t const *vs)
+{
+ return vs->server_cs;
+}
+
/** Return virtual server matching the specified name
*
* @note May be called in bootstrap or instantiate as all servers should be present.
* - NULL if no virtual server was found.
* - The CONF_SECTION of the named virtual server.
*/
-CONF_SECTION *virtual_server_find(char const *name)
+virtual_server_t const *virtual_server_find(char const *name)
{
- return cf_section_find(virtual_server_root, "server", name);
+ CONF_SECTION *server_cs = cf_section_find(virtual_server_root, "server", name);
+ CONF_DATA const *cd;
+
+ if (unlikely(server_cs == NULL)) return NULL;
+
+ cd = cf_data_find(server_cs, virtual_server_t, NULL);
+ if (unlikely(cd == NULL)) return NULL;
+
+ return cf_data_value(cd);
}
/** Find a virtual server using one of its sections
int virtual_server_cf_parse(UNUSED TALLOC_CTX *ctx, void *out, UNUSED void *parent,
CONF_ITEM *ci, UNUSED conf_parser_t const *rule)
{
- CONF_SECTION *server_cs;
+ virtual_server_t const *vs;
- server_cs = virtual_server_find(cf_pair_value(cf_item_to_pair(ci)));
- if (!server_cs) {
+ vs = virtual_server_find(cf_pair_value(cf_item_to_pair(ci)));
+ if (!vs) {
cf_log_err(ci, "virtual-server \"%s\" not found", cf_pair_value(cf_item_to_pair(ci)));
return -1;
}
- *((CONF_SECTION **)out) = server_cs;
+ *((CONF_SECTION **)out) = vs->server_cs;
return 0;
}
*
* @{
*/
-CONF_SECTION *virtual_server_find(char const *name) CC_HINT(nonnull);
+CONF_SECTION *virtual_server_cs(virtual_server_t const *vs) CC_HINT(nonnull);
+
+virtual_server_t const *virtual_server_find(char const *name) CC_HINT(nonnull);
virtual_server_t const *virtual_server_by_child(CONF_ITEM const *ci) CC_HINT(nonnull);
#include <freeradius-devel/protocol/freeradius/freeradius.internal.h>
+#include <freeradius-devel/server/virtual_servers.h>
+
#include <freeradius-devel/server/cf_file.h>
#include <freeradius-devel/server/main_config.h>
#include <freeradius-devel/server/map_proc.h>
#include <freeradius-devel/server/modpriv.h>
#include <freeradius-devel/server/module_rlm.h>
+
#include <freeradius-devel/server/tmpl.h>
#include <freeradius-devel/util/time.h>
#include <freeradius-devel/util/dict.h>
static unlang_t *compile_call(unlang_t *parent, unlang_compile_t *unlang_ctx, CONF_SECTION *cs)
{
+ virtual_server_t const *vs;
unlang_t *c;
unlang_group_t *g;
- unlang_call_t *gext;
+ unlang_call_t *gext;
fr_token_t type;
char const *server;
return NULL;
}
- server_cs = virtual_server_find(server);
- if (!server_cs) {
+ vs = virtual_server_find(server);
+ if (!vs) {
cf_log_err(cs, "Unknown virtual server '%s'", server);
return NULL;
}
+ server_cs = virtual_server_cs(vs);
+
/*
* The dictionaries are not compatible, forbid it.
*/
void unlang_perf_virtual_server(fr_log_t *log, char const *name)
{
- CONF_SECTION *cs = virtual_server_find(name);
- CONF_ITEM *ci;
- char const *file;
- int line;
- if (!cs) return;
+ virtual_server_t const *vs = virtual_server_find(name);
+ CONF_SECTION *cs;
+ CONF_ITEM *ci;
+ char const *file;
+ int line;
+
+ if (!vs) return;
+
+ cs = virtual_server_cs(vs);
file = cf_filename(cs);
line = cf_lineno(cs);
#ifdef HAVE_OPENSSL_OCSP_H
if (conf->ocsp.cache_server) {
- CONF_SECTION *server_cs;
+ virtual_server_t const *vs;
- server_cs = virtual_server_find(conf->ocsp.cache_server);
- if (!server_cs) {
+ vs = virtual_server_find(conf->ocsp.cache_server);
+ if (!vs) {
ERROR("No such virtual server '%s'", conf->ocsp.cache_server);
goto error;
}
- if (fr_tls_ocsp_state_cache_compile(&conf->ocsp.cache, server_cs) < 0) goto error;
+ if (fr_tls_ocsp_state_cache_compile(&conf->ocsp.cache, vs->server_cs) < 0) goto error;
}
if (conf->staple.cache_server) {
- CONF_SECTION *server_cs;
+ virtual_server_t const *vs;
- server_cs = virtual_server_find(conf->staple.cache_server);
- if (!server_cs) {
+ vs = virtual_server_find(conf->staple.cache_server);
+ if (!vs) {
ERROR("No such virtual server '%s'", conf->staple.cache_server);
goto error;
}
- if (fr_tls_ocsp_staple_cache_compile(&conf->staple.cache, server_cs) < 0) goto error;
+ if (fr_tls_ocsp_staple_cache_compile(&conf->staple.cache, vs->server_cs) < 0) goto error;
}
#endif