26RCSID(
"$Id: 77df6d1b75938de60756e83fea402f4745cf737f $")
28#include <freeradius-devel/server/base.h>
29#include <freeradius-devel/server/map_proc.h>
30#include <freeradius-devel/server/module_rlm.h>
31#include <freeradius-devel/util/debug.h>
32#include <freeradius-devel/util/rand.h>
33#include <freeradius-devel/util/value.h>
34#include <freeradius-devel/util/strerror.h>
35#include <freeradius-devel/util/sbuff.h>
36#include <freeradius-devel/io/listen.h>
38#include <freeradius-devel/tls/base.h>
39#include <freeradius-devel/tls/version.h>
41#include <freeradius-devel/unlang/base.h>
43#include <freeradius-devel/protocol/freeradius/freeradius.internal.h>
44#include <freeradius-devel/radius/radius.h>
50#define EXIT_WITH_FAILURE \
67#define PROTOCOL_NAME unit_test_module_dict[1].proto
108 PERROR(
"Failed creating test client");
111 talloc_steal(client, cs);
120 vp->vp_immutable =
false;
138 if (!request->packet) request->packet =
fr_packet_alloc(request,
false);
149 .s_addr = htonl(INADDR_LOOPBACK)
159 .s_addr = htonl(INADDR_LOOPBACK)
167 request->log.dst = talloc_zero(request,
log_dst_t);
174 request->async = talloc_zero(request,
fr_async_t);
178 fprintf(stderr,
"Failed converting packet IPs to attributes");
191 static int number = 0;
203 if (!request->dict) {
211 if (!request->packet) {
215 request->packet->timestamp =
fr_time();
218 if (!request->reply) {
223 request->client = client;
224 request->number = number++;
250 request->packet->code =
vp->vp_uint32;
267 .s_addr = htonl(INADDR_LOOPBACK)
277 .s_addr = htonl(INADDR_LOOPBACK)
290 if (
vp) request->packet->code =
vp->vp_uint32;
321 ERROR(
"Expected fr_pair_t pointer got \"%s\"", talloc_get_name(
vp));
336 request->reply->id = request->packet->id;
337 request->reply->code = 0;
338 memcpy(request->reply->vector, request->packet->vector,
sizeof(request->reply->vector));
339 request->reply->data = NULL;
340 request->reply->data_len = 0;
345 request->log.dst = talloc_zero(request,
log_dst_t);
352 request->async = talloc_zero(request,
fr_async_t);
358 request->async = talloc_zero(request,
fr_async_t);
395 char const *
format =
"ERROR offset %d 'Too much text' ::%.*s::";
409 char line_buff[8192];
410 char output_buff[8192];
411 char unescaped[
sizeof(output_buff)];
416 .name =
"unprintables",
426 while (fgets(line_buff,
sizeof(line_buff), fp) != NULL) {
432 fprintf(stderr,
"%s[%d] Line too long\n", filename, lineno);
436 fr_sbuff_terminate(&
line);
439 fr_sbuff_set_to_start(&
line);
452 size_t output_len = strlen(output_buff);
455 fprintf(stderr,
"Mismatch at %s[%u]\n\tgot : %s (%zu)\n\texpected : %s (%zu)\n",
465 output_buff[0] =
'\0';
480 .allow_unresolved =
true,
534 .allow_unresolved =
true,
576 fprintf(stderr,
"Unknown keyword in %s[%d]\n", filename, lineno);
600 UNUSED map_list_t
const *maps)
610 if (!request)
return NULL;
612 if (!request->packet) request->packet =
fr_packet_alloc(request,
false);
615 memcpy(request->packet, old->packet,
sizeof(*request->packet));
616 (void)
fr_pair_list_copy(request->request_ctx, &request->request_pairs, &old->request_pairs);
617 request->packet->timestamp =
fr_time();
618 request->number = number;
624 request->dict = old->dict;
639int main(
int argc,
char *argv[])
641 int ret = EXIT_SUCCESS;
644 const char *input_file = NULL;
645 const char *xlat_input_file = NULL;
646 const char *output_file = NULL;
647 const char *filter_file = NULL;
652 bool xlat_only =
false;
658 char const *receipt_file = NULL;
661 TALLOC_CTX *thread_ctx;
669 size_t memory_used_before = 0;
670 size_t memory_used_after = 0;
690 p = strrchr(argv[0], FR_DIR_SEP);
728 while ((c = getopt(argc, argv,
"c:d:D:f:hi:I:mMn:o:p:r:S:xXz")) != -1) {
731 count = atoi(optarg);
743 filter_file = optarg;
755 xlat_input_file = optarg;
760 talloc_enable_leak_report();
768 output_file = optarg;
776 receipt_file = optarg;
781 fprintf(stderr,
"%s: Unknown configuration option '%s'\n",
807 if (receipt_file && (
fr_unlink(receipt_file) < 0)) {
864 PERROR(
"Failed to initialize the dictionaries");
899 if (!getenv(
"PROTOCOL")) {
922 client =
client_find(NULL, &(
fr_ipaddr_t) { .af = AF_INET, .prefix = 32, .addr.v4.s_addr = htonl(INADDR_LOOPBACK) },
933 ERROR(
"Cannot find virtual server 'default'");
944 ERROR(
"Virtual server namespace does not match requested namespace '%s'",
PROTOCOL_NAME);
980 memory_used_before = talloc_total_size(
autofree);
983 if (!input_file && !xlat_only) input_file =
"-";
986 if (strcmp(input_file,
"-") == 0) {
989 fp = fopen(input_file,
"r");
991 fprintf(stderr,
"Failed reading %s: %s\n",
1002 fr_perror(
"Failed reading input from %s", input_file);
1013 if (fp && (fp != stdin)) fclose(fp);
1015 fp = fopen(xlat_input_file,
"r");
1017 fprintf(stderr,
"Failed reading %s: %s\n",
1022 if (!
do_xlats(
el, request, xlat_input_file, fp)) ret = EXIT_FAILURE;
1023 if (input_file) fclose(fp);
1033 ((input_file != NULL) && (strcmp(filter_file, input_file) != 0))) {
1035 if (fp && (fp != stdin)) fclose(fp);
1048 fp = fopen(filter_file,
"r");
1050 fprintf(stderr,
"Failed reading %s: %s\n", filter_file,
fr_syserror(errno));
1056 fr_perror(
"Failed reading attributes from %s", filter_file);
1064 fr_perror(
"No attributes in filter file %s", filter_file);
1082 for (i = 0; i <
count; i++) {
1084 size_t request_used_before, request_used_after;
1090 request_used_before = talloc_total_size(
autofree);
1096 if (
config->ins_countup) {
1097 request->ins_max = i + 1;
1099 request->ins_max =
config->ins_max;
1102 if (request->ins_max < 10) request->ins_max = 10;
1104 request->ins_count = 0;
1113 request_used_after = talloc_total_size(
autofree);
1114 fr_assert(request_used_after == request_used_before);
1121 if (!output_file || (strcmp(output_file,
"-") == 0)) {
1124 fp = fopen(output_file,
"w");
1126 fprintf(stderr,
"Failed writing %s: %s\n", output_file,
fr_syserror(errno));
1131 print_packet(fp, request->reply, &request->reply_pairs);
1133 if (output_file) fclose(fp);
1146 vp->vp_uint32 = request->reply->code;
1151 fr_perror(
"Output file %s does not match attributes in filter %s",
1152 output_file ? output_file :
"-", filter_file);
1158 INFO(
"Exiting normally");
1167 memory_used_after = talloc_total_size(
autofree);
1168 if (memory_used_after != memory_used_before) {
1169 printf(
"WARNING: May have leaked memory (%zd - %zd = %zd)\n",
1170 memory_used_after, memory_used_before, memory_used_after - memory_used_before);
1255 if (receipt_file && (ret == EXIT_SUCCESS) && (
fr_touch(NULL, receipt_file, 0644,
true, 0755) <= 0)) {
1261 fr_perror(
"unit_test_module - autofree");
1280 FILE *output = status ? stderr : stdout;
1282 fprintf(output,
"Usage: %s [options]\n",
config->name);
1283 fprintf(output,
"Options:\n");
1284 fprintf(output,
" -c <count> Run packets through the interpreter <count> times\n");
1285 fprintf(output,
" -d <raddb_dir> Configuration files are in \"raddb_dir/*\".\n");
1286 fprintf(output,
" -D <dict_dir> Dictionary files are in \"dict_dir/*\".\n");
1287 fprintf(output,
" -f <file> Filter reply against attributes in 'file'.\n");
1288 fprintf(output,
" -h Print this help message.\n");
1289 fprintf(output,
" -i <file> File containing request attributes.\n");
1290 fprintf(output,
" -m On SIGINT or SIGQUIT exit cleanly instead of immediately.\n");
1291 fprintf(output,
" -n <name> Read raddb/name.conf instead of raddb/radiusd.conf.\n");
1292 fprintf(output,
" -o <file> Output file for the reply.\n");
1293 fprintf(output,
" -p <radius|...> Define which protocol namespace is used to read the file\n");
1294 fprintf(output,
" Use radius, dhcpv4, or dhcpv6\n");
1295 fprintf(output,
" -X Turn on full debugging.\n");
1296 fprintf(output,
" -x Turn on additional debugging. (-xx gives more debugging).\n");
1297 fprintf(output,
" -r <receipt_file> Create the <receipt_file> as a 'success' exit.\n");
unlang_action_t
Returned by unlang_op_t calls, determine the next action of the interpreter.
int fr_atexit_global_setup(void)
Setup the atexit handler, should be called at the start of a program's execution.
int fr_atexit_global_trigger_all(void)
Cause all global free triggers to fire.
#define fr_atexit_thread_trigger_all(...)
#define NEVER_RETURNS
Should be placed before the function return type.
unlang_action_t unlang_call_push(request_t *request, CONF_SECTION *server_cs, bool top_frame)
Push a call frame onto the stack.
A section grouping multiple CONF_PAIR.
CONF_PAIR * cf_pair_alloc(CONF_SECTION *parent, char const *attr, char const *value, fr_token_t op, fr_token_t lhs_quote, fr_token_t rhs_quote)
Allocate a CONF_PAIR.
#define cf_log_err(_cf, _fmt,...)
#define cf_section_alloc(_ctx, _parent, _name1, _name2)
static void * fr_dcursor_next(fr_dcursor_t *cursor)
Advanced the cursor to the next item.
static char panic_action[512]
The command to execute when panicking.
void fr_disable_null_tracking_on_free(TALLOC_CTX *ctx)
Disable the null tracking context when a talloc chunk is freed.
int fr_log_talloc_report(TALLOC_CTX const *ctx)
Generate a talloc memory report for a context and print to stderr/stdout.
int fr_fault_setup(TALLOC_CTX *ctx, char const *cmd, char const *program)
Registers signal handlers to execute panic_action on fatal signal.
void fr_talloc_fault_setup(void)
Register talloc fault handlers.
#define fr_exit_now(_x)
Exit without calling atexit() handlers, producing a log message in debug builds.
void dependency_version_print(void)
static NEVER_RETURNS void usage(void)
fr_dict_enum_value_t * fr_dict_enum_by_value(fr_dict_attr_t const *da, fr_value_box_t const *value)
Lookup the structure representing an enum value in a fr_dict_attr_t.
fr_dict_gctx_t * fr_dict_global_ctx_init(TALLOC_CTX *ctx, bool free_at_exit, char const *dict_dir)
Initialise the global protocol hashes.
int fr_dict_internal_afrom_file(fr_dict_t **out, char const *internal_name, char const *dependent)
(Re-)Initialize the special internal dictionary
#define fr_dict_autofree(_to_free)
bool fr_dict_compatible(fr_dict_t const *dict1, fr_dict_t const *dict2)
See if two dictionaries have the same end parent.
fr_dict_attr_t const ** out
Where to write a pointer to the resolved fr_dict_attr_t.
fr_dict_t const ** out
Where to write a pointer to the loaded/resolved fr_dict_t.
int fr_dict_free(fr_dict_t **dict, char const *dependent)
Decrement the reference count on a previously loaded dictionary.
int fr_dict_attr_autoload(fr_dict_attr_autoload_t const *to_load)
Process a dict_attr_autoload element to load/verify a dictionary attribute.
#define fr_dict_autoload(_to_load)
int fr_dict_read(fr_dict_t *dict, char const *dict_dir, char const *filename)
Read supplementary attribute definitions into an existing dictionary.
char const * name
Enum name.
Specifies an attribute which must be present for the module to function.
Specifies a dictionary which must be loaded/loadable for the module to function.
Value of an enumerated attribute.
#define fr_event_timer_in(...)
int fr_unlink(char const *filename)
Remove a regular file from the filesystem.
ssize_t fr_touch(int *fd_out, char const *filename, mode_t mode, bool mkdir, mode_t dir_mode)
Create an empty file.
bool fr_hostname_lookups
hostname -> IP lookups?
bool fr_reverse_lookups
IP -> hostname lookups?
void unlang_interpret_signal(request_t *request, fr_signal_t action)
Send a signal (usually stop) to a request.
rlm_rcode_t unlang_interpret_synchronous(fr_event_list_t *el, request_t *request)
Execute an unlang section synchronously.
Minimal data structure to use the new code.
int server_init(CONF_SECTION *cs, char const *dict_dir, fr_dict_t *dict)
Initialize src/lib/server/.
void server_free(void)
Free src/lib/server/.
Describes a host allowed to send packets to the server.
void vlog_request(fr_log_type_t type, fr_log_lvl_t lvl, request_t *request, char const *file, int line, char const *fmt, va_list ap, void *uctx)
Send a log message to its destination, possibly including fields from the request.
int fr_packet_pairs_from_packet(TALLOC_CTX *ctx, fr_pair_list_t *list, fr_packet_t const *packet)
Allocate a "Net." struct with src/dst host and port.
void fr_packet_net_from_pairs(fr_packet_t *packet, fr_pair_list_t const *list)
Convert pairs to information in a packet.
int unlang_global_init(void)
unsigned int fr_event_list_reap_signal(fr_event_list_t *el, fr_time_delta_t timeout, int signal)
Send a signal to all the processes we have in our reap list, and reap them.
fr_event_list_t * fr_event_list_alloc(TALLOC_CTX *ctx, fr_event_status_cb_t status, void *status_uctx)
Initialise a new event list.
Stores all information relating to an event list.
int fr_log_init_fp(fr_log_t *log, FILE *fp)
Initialise a file logging destination to a FILE*.
void fr_log(fr_log_t const *log, fr_log_type_t type, char const *file, int line, char const *fmt,...)
Send a server log message to its destination.
@ L_DST_STDOUT
Log to stdout.
@ L_DBG
Only displayed when debugging is enabled.
fr_packet_t * fr_packet_alloc(TALLOC_CTX *ctx, bool new_vector)
Allocate a new fr_packet_t.
int main_config_parse_option(char const *value)
int main_config_free(main_config_t **config)
main_config_t * main_config_alloc(TALLOC_CTX *ctx)
Allocate a main_config_t struct, setting defaults.
void main_config_raddb_dir_set(main_config_t *config, char const *name)
Set the global radius config directory.
void main_config_name_set_default(main_config_t *config, char const *name, bool overwrite_config)
Set the server name.
int main_config_init(main_config_t *config)
void main_config_dict_dir_set(main_config_t *config, char const *name)
Set the global dictionary directory.
Main server configuration.
int map_proc_unregister(char const *name)
Unregister a map processor by name.
int map_proc_register(TALLOC_CTX *ctx, void const *mod_inst, char const *name, map_proc_func_t evaluate, map_proc_instantiate_t instantiate, size_t inst_size, fr_value_box_safe_for_t literals_safe_for)
Register a map processor.
@ FR_TYPE_TLV
Contains nested attributes.
@ FR_TYPE_UINT32
32 Bit unsigned integer.
int modules_rlm_free(void)
Cleanup all global structures.
int modules_rlm_thread_instantiate(TALLOC_CTX *ctx, fr_event_list_t *el)
Allocates thread-specific data for all registered backend modules.
int modules_rlm_init(void)
Initialise the module list structure.
void fr_pair_list_tainted(fr_pair_list_t *list)
Mark up a list of VPs as tainted.
int fr_pair_list_copy(TALLOC_CTX *ctx, fr_pair_list_t *to, fr_pair_list_t const *from)
Duplicate a list of pairs.
void fr_pair_validate_debug(fr_pair_t const *failed[2])
Write an error to the library errorbuff detailing the mismatch.
fr_pair_t * fr_pair_find_by_da(fr_pair_list_t const *list, fr_pair_t const *prev, fr_dict_attr_t const *da)
Find the first pair with a matching da.
int fr_pair_delete_by_da(fr_pair_list_t *list, fr_dict_attr_t const *da)
Delete matching pairs from the specified list.
bool fr_pair_validate(fr_pair_t const *failed[2], fr_pair_list_t *filter, fr_pair_list_t *list)
Uses fr_pair_cmp to verify all fr_pair_ts in list match the filter defined by check.
void fr_pair_list_init(fr_pair_list_t *list)
Initialise a pair list header.
int fr_pair_list_afrom_file(TALLOC_CTX *ctx, fr_dict_t const *dict, fr_pair_list_t *out, FILE *fp, bool *pfiledone)
Read valuepairs from the fp up to End-Of-File.
static const conf_parser_t config[]
static TALLOC_CTX * autofree
#define RETURN_MODULE_FAIL
rlm_rcode_t
Return codes indicating the result of the module call.
fr_dict_attr_t const * request_attr_request
int request_global_init(void)
#define request_alloc_internal(_ctx, _args)
Allocate a new internal request.
#define request_local_alloc_external(_ctx, _args)
Allocate a new external request outside of the request pool.
@ REQUEST_ACTIVE
Request is active (running or runnable)
ssize_t fr_sbuff_in_escape(fr_sbuff_t *sbuff, char const *in, size_t inlen, fr_sbuff_escape_rules_t const *e_rules)
Print an escaped string to an sbuff.
char * fr_sbuff_adv_to_chr(fr_sbuff_t *sbuff, size_t len, char c)
Wind position to first instance of specified char.
ssize_t fr_sbuff_in_sprintf(fr_sbuff_t *sbuff, char const *fmt,...)
Print using a fmt string to an sbuff.
#define fr_sbuff_adv_past_str_literal(_sbuff, _needle)
#define FR_SBUFF_IN(_start, _len_or_end)
#define fr_sbuff_adv_past_whitespace(_sbuff, _len, _tt)
#define fr_sbuff_current(_sbuff_or_marker)
#define fr_sbuff_is_char(_sbuff_or_marker, _c)
#define SBUFF_CHAR_UNPRINTABLES_EXTENDED
#define fr_sbuff_remaining(_sbuff_or_marker)
#define FR_SBUFF_OUT(_start, _len_or_end)
#define SBUFF_CHAR_UNPRINTABLES_LOW
#define pair_update_reply(_attr, _da)
Return or allocate a fr_pair_t in the reply list.
tmpl_attr_rules_t attr
Rules/data for parsing attribute references.
struct tmpl_rules_s tmpl_rules_t
Optional arguments passed to vp_tmpl functions.
@ FR_SIGNAL_CANCEL
Request has been cancelled.
fr_client_t * client_afrom_cs(TALLOC_CTX *ctx, CONF_SECTION *cs, CONF_SECTION *server_cs, size_t extra)
Allocate a new client from a config section.
fr_client_t * client_find(fr_client_list_t const *clients, fr_ipaddr_t const *ipaddr, int proto)
bool client_add(fr_client_list_t *clients, fr_client_t *client)
Add a client to a fr_client_list_t.
void modules_init(char const *lib_dir)
Perform global initialisation for modules.
#define fr_time()
Allow us to arbitrarily manipulate time.
fr_log_dst_t dst
Log destination.
int fd
File descriptor to write messages to.
bool print_level
sometimes we don't want log levels printed
fr_dict_t const * dict_def
Default dictionary to use with unqualified attribute references.
Stores an attribute, a value and various bits of other data.
char const * fr_syserror(int num)
Guaranteed to be thread-safe version of strerror.
char * talloc_typed_asprintf(TALLOC_CTX *ctx, char const *fmt,...)
Call talloc vasprintf, setting the type on the new chunk correctly.
static TALLOC_CTX * talloc_init_const(char const *name)
Allocate a top level chunk with a constant name.
#define talloc_autofree_context
The original function is deprecated, so replace it with our version.
int fr_time_start(void)
Initialize the local time.
static fr_time_delta_t fr_time_delta_from_sec(int64_t sec)
int fr_openssl_version_consistent(void)
static fr_event_list_t * el
int main(int argc, char *argv[])
static request_t * request_clone(request_t *old, int number, CONF_SECTION *server_cs)
static fr_dict_attr_t const * attr_packet_type
static unlang_action_t mod_map_proc(rlm_rcode_t *p_result, UNUSED void const *mod_inst, UNUSED void *proc_inst, UNUSED request_t *request, UNUSED fr_value_box_list_t *src, UNUSED map_list_t const *maps)
static fr_client_t * client_alloc(TALLOC_CTX *ctx, char const *ip, char const *name)
static fr_dict_t const * dict_freeradius
static fr_dict_attr_t const * attr_net
static void pair_mutable(fr_pair_t *vp)
static fr_dict_t const * dict_protocol
fr_dict_attr_autoload_t unit_test_module_dict_attr[]
char const * radiusd_version
static request_t * request_from_file(TALLOC_CTX *ctx, FILE *fp, fr_client_t *client, CONF_SECTION *server_cs)
static void cancel_request(UNUSED fr_event_list_t *el, UNUSED fr_time_t when, void *uctx)
#define EXIT_WITH_FAILURE
static int map_proc_verify(CONF_SECTION *cs, UNUSED void const *mod_inst, UNUSED void *proc_inst, tmpl_t const *src, UNUSED map_list_t const *maps)
static void too_much_text(fr_sbuff_t *out, ssize_t slen, fr_sbuff_t *line)
static void print_packet(FILE *fp, fr_packet_t *packet, fr_pair_list_t *list)
fr_dict_autoload_t unit_test_module_dict[]
static bool do_xlats(fr_event_list_t *el, request_t *request, char const *filename, FILE *fp)
static request_t * request_from_internal(TALLOC_CTX *ctx)
int unlang_thread_instantiate(TALLOC_CTX *ctx)
Create thread-specific data structures for unlang.
ssize_t xlat_eval_compiled(char *out, size_t outlen, request_t *request, xlat_exp_head_t const *head, xlat_escape_legacy_t escape, void const *escape_ctx))
int xlat_thread_instantiate(TALLOC_CTX *ctx, fr_event_list_t *el)
Create thread specific instance tree and create thread instances.
fr_slen_t xlat_tokenize(TALLOC_CTX *ctx, xlat_exp_head_t **head, fr_sbuff_t *in, fr_sbuff_parse_rules_t const *p_rules, tmpl_rules_t const *t_rules, fr_value_box_safe_for_t literals_safe_for)
Tokenize an xlat expansion.
int xlat_resolve(xlat_exp_head_t *head, xlat_res_rules_t const *xr_rules)
Walk over an xlat tree recursively, resolving any unresolved functions or references.
fr_slen_t xlat_tokenize_expression(TALLOC_CTX *ctx, xlat_exp_head_t **head, fr_sbuff_t *in, fr_sbuff_parse_rules_t const *p_rules, tmpl_rules_t const *t_rules)
#define FR_DICTIONARY_FILE
#define FR_DICTIONARY_INTERNAL_DIR
unsigned int code
Packet code (type).
bool fr_pair_list_empty(fr_pair_list_t const *list)
Is a valuepair list empty.
#define fr_pair_list_foreach(_list_head, _iter)
Iterate over the contents of a fr_pair_list_t.
#define fr_pair_list_log(_log, _lvl, _list)
#define fr_pair_dcursor_init(_cursor, _list)
Initialises a special dcursor with callbacks that will maintain the attr sublists correctly.
#define fr_pair_dcursor_by_ancestor_init(_cursor, _list, _da)
Initialise a cursor that will return only attributes descended from the specified fr_dict_attr_t.
static void fr_socket_addr_swap(fr_socket_t *dst, fr_socket_t const *src)
Swap src/dst information of a fr_socket_t.
Holds information necessary for binding or connecting to a socket.
char const * fr_strerror(void)
Get the last library error.
void fr_perror(char const *fmt,...)
Print the current error to stderr with a prefix.
#define fr_strerror_printf(_fmt,...)
Log to thread local error buffer.
#define fr_strerror_printf_push(_fmt,...)
Add a message to an existing stack of messages at the tail.
#define fr_strerror_const(_msg)
#define fr_type_is_leaf(_x)
int fr_check_lib_magic(uint64_t magic)
Check if the application linking to the library has the correct magic number.
#define RADIUSD_VERSION_BUILD(_x)
Create a version string for a utility in the suite of FreeRADIUS utilities.
#define RADIUSD_MAGIC_NUMBER
fr_sbuff_unescape_rules_t fr_value_unescape_double
#define fr_box_uint32(_val)
int format(printf, 5, 0))
static size_t char ** out
fr_dict_t const * virtual_server_dict_by_name(char const *virtual_server)
Return the namespace for the named virtual server.
virtual_server_t const * virtual_server_find(char const *name)
Return virtual server matching the specified name.
CONF_SECTION * virtual_server_cs(virtual_server_t const *vs)
Return the configuration section for a virtual server.
int virtual_servers_init(void)
Performs global initialisation for the virtual server code.
int virtual_servers_free(void)
int virtual_servers_thread_instantiate(TALLOC_CTX *ctx, fr_event_list_t *el)
Perform thread instantiation for all process modules and listeners.
static TALLOC_CTX * xlat_ctx