From: Arran Cudbard-Bell Date: Sat, 25 May 2024 03:06:25 +0000 (-0400) Subject: Base more operations around virtual_server_t X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8d0646adbeca6167d378a649d8a748f138d6ee02;p=thirdparty%2Ffreeradius-server.git Base more operations around virtual_server_t --- diff --git a/src/bin/unit_test_module.c b/src/bin/unit_test_module.c index 4a5e1e85d3d..ef6d679d148 100644 --- a/src/bin/unit_test_module.c +++ b/src/bin/unit_test_module.c @@ -670,7 +670,7 @@ int main(int argc, char *argv[]) size_t memory_used_before = 0; size_t memory_used_after = 0; #endif - + virtual_server_t const *vs; fr_pair_list_init(&filter_vps); @@ -929,12 +929,14 @@ int main(int argc, char *argv[]) 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. */ diff --git a/src/lib/server/client.c b/src/lib/server/client.c index 7b5f3dc0992..4ce486975eb 100644 --- a/src/lib/server/client.c +++ b/src/lib/server/client.c @@ -770,12 +770,16 @@ fr_client_t *client_afrom_cs(TALLOC_CTX *ctx, CONF_SECTION *cs, CONF_SECTION *se * 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; diff --git a/src/lib/server/virtual_servers.c b/src/lib/server/virtual_servers.c index 94af64af176..66af19467f6 100644 --- a/src/lib/server/virtual_servers.c +++ b/src/lib/server/virtual_servers.c @@ -25,6 +25,7 @@ * @copyright 2000 Alan Curry (pacman@world.std.com) */ +#include "lib/server/cf_util.h" RCSID("$Id$") #include @@ -546,12 +547,12 @@ static int server_parse(UNUSED TALLOC_CTX *ctx, void *out, UNUSED void *parent, */ 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 @@ -613,16 +614,19 @@ fr_dict_t const *virtual_server_dict_by_child_ci(CONF_ITEM const *ci) 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) { /* @@ -801,6 +805,17 @@ bool listen_record(fr_listen_t *li) 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. @@ -810,9 +825,17 @@ bool listen_record(fr_listen_t *li) * - 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 @@ -848,15 +871,15 @@ virtual_server_t const *virtual_server_by_child(CONF_ITEM const *ci) 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; } diff --git a/src/lib/server/virtual_servers.h b/src/lib/server/virtual_servers.h index bc214037f80..9a19ad13dfe 100644 --- a/src/lib/server/virtual_servers.h +++ b/src/lib/server/virtual_servers.h @@ -81,7 +81,9 @@ int virtual_server_has_namespace(CONF_SECTION **out, * * @{ */ -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); diff --git a/src/lib/unlang/compile.c b/src/lib/unlang/compile.c index 246b7c81652..74783093458 100644 --- a/src/lib/unlang/compile.c +++ b/src/lib/unlang/compile.c @@ -26,11 +26,14 @@ RCSID("$Id$") #include +#include + #include #include #include #include #include + #include #include #include @@ -4082,10 +4085,11 @@ get_packet_type: 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; @@ -4111,12 +4115,14 @@ static unlang_t *compile_call(unlang_t *parent, unlang_compile_t *unlang_ctx, CO 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. */ @@ -5053,12 +5059,16 @@ static void unlang_perf_dump(fr_log_t *log, unlang_t const *instruction, int dep 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); diff --git a/src/modules/rlm_ocsp/conf.c b/src/modules/rlm_ocsp/conf.c index 48ff1a0de47..c2a80c271be 100644 --- a/src/modules/rlm_ocsp/conf.c +++ b/src/modules/rlm_ocsp/conf.c @@ -23,27 +23,27 @@ static conf_parser_t ocsp_config[] = { #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