Skip to content

Commit

Permalink
First round of conf_parser_t simplifications
Browse files Browse the repository at this point in the history
  • Loading branch information
arr2036 committed Nov 23, 2023
1 parent e7c4789 commit 444f8f9
Show file tree
Hide file tree
Showing 125 changed files with 1,193 additions and 1,149 deletions.
2 changes: 1 addition & 1 deletion .clang-format
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ SortIncludes: false
# after the opening brace, and before the closing brace.
#
# static conf_parser_t group_config[] = {
# { FR_CONF_OFFSET("filter", FR_TYPE_STRING, 0, rlm_ldap_t, groupobj_filter) }
# { FR_CONF_OFFSET("filter", rlm_ldap_t, groupobj_filter) }
# };
#
ContinuationIndentWidth: 8
Expand Down
32 changes: 16 additions & 16 deletions src/lib/curl/base.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,36 +52,36 @@ static fr_table_num_sorted_t const fr_curl_sslcode_table[] = {
static size_t fr_curl_sslcode_table_len = NUM_ELEMENTS(fr_curl_sslcode_table);

conf_parser_t fr_curl_tls_config[] = {
{ FR_CONF_OFFSET("ca_file", FR_TYPE_STRING, CONF_FLAG_FILE_INPUT, fr_curl_tls_t, ca_file) },
{ FR_CONF_OFFSET("ca_issuer_file", FR_TYPE_STRING, CONF_FLAG_FILE_INPUT, fr_curl_tls_t, ca_issuer_file) },
{ FR_CONF_OFFSET("ca_path", FR_TYPE_STRING, CONF_FLAG_FILE_INPUT, fr_curl_tls_t, ca_path) },
{ FR_CONF_OFFSET("certificate_file", FR_TYPE_STRING, CONF_FLAG_FILE_INPUT, fr_curl_tls_t, certificate_file) },
{ FR_CONF_OFFSET("private_key_file", FR_TYPE_STRING, CONF_FLAG_FILE_INPUT, fr_curl_tls_t, private_key_file) },
{ FR_CONF_OFFSET("private_key_password", FR_TYPE_STRING, CONF_FLAG_SECRET, fr_curl_tls_t, private_key_password) },
{ FR_CONF_OFFSET("random_file", FR_TYPE_STRING, 0, fr_curl_tls_t, random_file) },
{ FR_CONF_OFFSET("require_cert", FR_TYPE_VOID, 0, fr_curl_tls_t, require_cert),
{ FR_CONF_OFFSET_FLAGS("ca_file", FR_TYPE_STRING, CONF_FLAG_FILE_INPUT, fr_curl_tls_t, ca_file) },
{ FR_CONF_OFFSET_FLAGS("ca_issuer_file", FR_TYPE_STRING, CONF_FLAG_FILE_INPUT, fr_curl_tls_t, ca_issuer_file) },
{ FR_CONF_OFFSET_FLAGS("ca_path", FR_TYPE_STRING, CONF_FLAG_FILE_INPUT, fr_curl_tls_t, ca_path) },
{ FR_CONF_OFFSET_FLAGS("certificate_file", FR_TYPE_STRING, CONF_FLAG_FILE_INPUT, fr_curl_tls_t, certificate_file) },
{ FR_CONF_OFFSET_FLAGS("private_key_file", FR_TYPE_STRING, CONF_FLAG_FILE_INPUT, fr_curl_tls_t, private_key_file) },
{ FR_CONF_OFFSET_FLAGS("private_key_password", FR_TYPE_STRING, CONF_FLAG_SECRET, fr_curl_tls_t, private_key_password) },
{ FR_CONF_OFFSET("random_file", fr_curl_tls_t, random_file) },
{ FR_CONF_OFFSET_FLAGS("require_cert", FR_TYPE_VOID, 0, fr_curl_tls_t, require_cert),
.func = cf_table_parse_int,
.uctx = &(cf_table_parse_ctx_t){
.table = fr_curl_sslcode_table,
.len = &fr_curl_sslcode_table_len
},
.dflt = "allow" },
{ FR_CONF_OFFSET("check_cert", FR_TYPE_BOOL, 0, fr_curl_tls_t, check_cert), .dflt = "yes" },
{ FR_CONF_OFFSET("check_cert_cn", FR_TYPE_BOOL, 0, fr_curl_tls_t, check_cert_cn), .dflt = "yes" },
{ FR_CONF_OFFSET("extract_cert_attrs", FR_TYPE_BOOL, 0, fr_curl_tls_t, extract_cert_attrs), .dflt = "no" },
{ FR_CONF_OFFSET("check_cert", fr_curl_tls_t, check_cert), .dflt = "yes" },
{ FR_CONF_OFFSET("check_cert_cn", fr_curl_tls_t, check_cert_cn), .dflt = "yes" },
{ FR_CONF_OFFSET("extract_cert_attrs", fr_curl_tls_t, extract_cert_attrs), .dflt = "no" },
CONF_PARSER_TERMINATOR
};

static conf_parser_t reuse_curl_conn_config[] = {
{ FR_CONF_OFFSET("min", FR_TYPE_UINT32, 0, fr_slab_config_t, min_elements), .dflt = "10" },
{ FR_CONF_OFFSET("max", FR_TYPE_UINT32, 0, fr_slab_config_t, max_elements), .dflt = "100" },
{ FR_CONF_OFFSET("cleanup_interval", FR_TYPE_TIME_DELTA, 0, fr_slab_config_t, interval), .dflt = "30s" },
{ FR_CONF_OFFSET("min", fr_slab_config_t, min_elements), .dflt = "10" },
{ FR_CONF_OFFSET("max", fr_slab_config_t, max_elements), .dflt = "100" },
{ FR_CONF_OFFSET("cleanup_interval", fr_slab_config_t, interval), .dflt = "30s" },
CONF_PARSER_TERMINATOR
};

conf_parser_t fr_curl_conn_config[] = {
{ FR_CONF_OFFSET("reuse", 0, CONF_FLAG_SUBSECTION, fr_curl_conn_config_t, reuse), .subcs = (void const *) reuse_curl_conn_config },
{ FR_CONF_OFFSET("connect_timeout", FR_TYPE_TIME_DELTA, 0, fr_curl_conn_config_t, connect_timeout), .dflt = "3.0" },
{ FR_CONF_OFFSET_SUBSECTION("reuse", 0, fr_curl_conn_config_t, reuse, reuse_curl_conn_config) },
{ FR_CONF_OFFSET("connect_timeout", fr_curl_conn_config_t, connect_timeout), .dflt = "3.0" },
CONF_PARSER_TERMINATOR
};

Expand Down
16 changes: 7 additions & 9 deletions src/lib/json/json.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,23 +49,21 @@ static fr_json_format_t const default_json_format = {
};

static conf_parser_t const json_format_attr_config[] = {
{ FR_CONF_OFFSET("prefix", FR_TYPE_STRING, 0, fr_json_format_attr_t, prefix) },
{ FR_CONF_OFFSET("prefix", fr_json_format_attr_t, prefix) },
CONF_PARSER_TERMINATOR
};

static conf_parser_t const json_format_value_config[] = {
{ FR_CONF_OFFSET("single_value_as_array", FR_TYPE_BOOL, 0, fr_json_format_value_t, value_is_always_array), .dflt = "no" },
{ FR_CONF_OFFSET("enum_as_integer", FR_TYPE_BOOL, 0, fr_json_format_value_t, enum_as_int), .dflt = "no" },
{ FR_CONF_OFFSET("always_string", FR_TYPE_BOOL, 0, fr_json_format_value_t, always_string), .dflt = "no" },
{ FR_CONF_OFFSET("single_value_as_array", fr_json_format_value_t, value_is_always_array), .dflt = "no" },
{ FR_CONF_OFFSET("enum_as_integer", fr_json_format_value_t, enum_as_int), .dflt = "no" },
{ FR_CONF_OFFSET("always_string", fr_json_format_value_t, always_string), .dflt = "no" },
CONF_PARSER_TERMINATOR
};

conf_parser_t const fr_json_format_config[] = {
{ FR_CONF_OFFSET("output_mode", FR_TYPE_STRING, 0, fr_json_format_t, output_mode_str), .dflt = "object" },
{ FR_CONF_OFFSET("attribute", 0, CONF_FLAG_SUBSECTION, fr_json_format_t, attr),
.subcs = (void const *) json_format_attr_config },
{ FR_CONF_OFFSET("value", 0, CONF_FLAG_SUBSECTION, fr_json_format_t, value),
.subcs = (void const *) json_format_value_config },
{ FR_CONF_OFFSET("output_mode", fr_json_format_t, output_mode_str), .dflt = "object" },
{ FR_CONF_OFFSET_SUBSECTION("attribute", 0, fr_json_format_t, attr, json_format_attr_config) },
{ FR_CONF_OFFSET_SUBSECTION("value", 0, fr_json_format_t, value, json_format_value_config) },

CONF_PARSER_TERMINATOR
};
Expand Down
4 changes: 2 additions & 2 deletions src/lib/ldap/base.c
Original file line number Diff line number Diff line change
Expand Up @@ -97,8 +97,8 @@ static fr_libldap_global_config_t libldap_global_config = {
};

static conf_parser_t const ldap_global_config[] = {
{ FR_CONF_OFFSET("random_file", FR_TYPE_STRING, CONF_FLAG_FILE_EXISTS, fr_libldap_global_config_t, tls_random_file) },
{ FR_CONF_OFFSET("ldap_debug", FR_TYPE_UINT32, 0, fr_libldap_global_config_t, ldap_debug), .dflt = "0x0000" },
{ FR_CONF_OFFSET_FLAGS("random_file", FR_TYPE_STRING, CONF_FLAG_FILE_EXISTS, fr_libldap_global_config_t, tls_random_file) },
{ FR_CONF_OFFSET("ldap_debug", fr_libldap_global_config_t, ldap_debug), .dflt = "0x0000" },
CONF_PARSER_TERMINATOR
};

Expand Down
48 changes: 24 additions & 24 deletions src/lib/ldap/conf.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@ RCSID("$Id$")
#include <freeradius-devel/ldap/conf.h>

conf_parser_t const fr_ldap_sasl_mech_static[] = {
{ FR_CONF_OFFSET("mech", FR_TYPE_STRING, CONF_FLAG_NOT_EMPTY, fr_ldap_sasl_t, mech) },
{ FR_CONF_OFFSET("proxy", FR_TYPE_STRING, 0, fr_ldap_sasl_t, proxy) },
{ FR_CONF_OFFSET("realm", FR_TYPE_STRING, 0, fr_ldap_sasl_t, realm) },
{ FR_CONF_OFFSET_FLAGS("mech", FR_TYPE_STRING, CONF_FLAG_NOT_EMPTY, fr_ldap_sasl_t, mech) },
{ FR_CONF_OFFSET("proxy", fr_ldap_sasl_t, proxy) },
{ FR_CONF_OFFSET("realm", fr_ldap_sasl_t, realm) },
CONF_PARSER_TERMINATOR
};

Expand All @@ -41,22 +41,22 @@ conf_parser_t const fr_ldap_tls_config[] = {
/*
* Deprecated attributes
*/
{ FR_CONF_OFFSET("ca_file", FR_TYPE_STRING, CONF_FLAG_FILE_INPUT, fr_ldap_config_t, tls_ca_file) },
{ FR_CONF_OFFSET_FLAGS("ca_file", FR_TYPE_STRING, CONF_FLAG_FILE_INPUT, fr_ldap_config_t, tls_ca_file) },

{ FR_CONF_OFFSET("ca_path", FR_TYPE_STRING, CONF_FLAG_FILE_INPUT, fr_ldap_config_t, tls_ca_path) },
{ FR_CONF_OFFSET_FLAGS("ca_path", FR_TYPE_STRING, CONF_FLAG_FILE_INPUT, fr_ldap_config_t, tls_ca_path) },

{ FR_CONF_OFFSET("certificate_file", FR_TYPE_STRING, CONF_FLAG_FILE_INPUT, fr_ldap_config_t, tls_certificate_file) },
{ FR_CONF_OFFSET_FLAGS("certificate_file", FR_TYPE_STRING, CONF_FLAG_FILE_INPUT, fr_ldap_config_t, tls_certificate_file) },

{ FR_CONF_OFFSET("private_key_file", FR_TYPE_STRING, CONF_FLAG_FILE_INPUT, fr_ldap_config_t, tls_private_key_file) },
{ FR_CONF_OFFSET_FLAGS("private_key_file", FR_TYPE_STRING, CONF_FLAG_FILE_INPUT, fr_ldap_config_t, tls_private_key_file) },

/*
* LDAP Specific TLS attributes
*/
{ FR_CONF_OFFSET("start_tls", FR_TYPE_BOOL, 0, fr_ldap_config_t, start_tls), .dflt = "no" },
{ FR_CONF_OFFSET("start_tls", fr_ldap_config_t, start_tls), .dflt = "no" },

{ FR_CONF_OFFSET("require_cert", FR_TYPE_STRING, 0, fr_ldap_config_t, tls_require_cert_str) },
{ FR_CONF_OFFSET("require_cert", fr_ldap_config_t, tls_require_cert_str) },

{ FR_CONF_OFFSET("tls_min_version", FR_TYPE_STRING, 0, fr_ldap_config_t, tls_min_version_str) },
{ FR_CONF_OFFSET("tls_min_version", fr_ldap_config_t, tls_min_version_str) },

CONF_PARSER_TERMINATOR
};
Expand All @@ -70,43 +70,43 @@ conf_parser_t const fr_ldap_option_config[] = {
/*
* Pool config items
*/
{ FR_CONF_OFFSET("chase_referrals", FR_TYPE_BOOL, 0, fr_ldap_config_t, chase_referrals) },
{ FR_CONF_OFFSET("chase_referrals", fr_ldap_config_t, chase_referrals) },

{ FR_CONF_OFFSET("use_referral_credentials", FR_TYPE_BOOL, 0, fr_ldap_config_t, use_referral_credentials), .dflt = "no" },
{ FR_CONF_OFFSET("use_referral_credentials", fr_ldap_config_t, use_referral_credentials), .dflt = "no" },

{ FR_CONF_OFFSET("referral_depth", FR_TYPE_UINT16, 0, fr_ldap_config_t, referral_depth), .dflt = "5" },
{ FR_CONF_OFFSET("referral_depth", fr_ldap_config_t, referral_depth), .dflt = "5" },

{ FR_CONF_OFFSET("rebind", FR_TYPE_BOOL, 0, fr_ldap_config_t, rebind) },
{ FR_CONF_OFFSET("rebind", fr_ldap_config_t, rebind) },

{ FR_CONF_OFFSET("sasl_secprops", FR_TYPE_STRING, 0, fr_ldap_config_t, sasl_secprops) },
{ FR_CONF_OFFSET("sasl_secprops", fr_ldap_config_t, sasl_secprops) },

/*
* We use this config option to populate libldap's LDAP_OPT_NETWORK_TIMEOUT -
* timeout on network activity - specifically libldap's initial call to "connect"
* Must be non-zero for async connections to start correctly.
*/
{ FR_CONF_OFFSET("net_timeout", FR_TYPE_TIME_DELTA, 0, fr_ldap_config_t, net_timeout), .dflt = "10" },
{ FR_CONF_OFFSET("net_timeout", fr_ldap_config_t, net_timeout), .dflt = "10" },

{ FR_CONF_OFFSET("idle", FR_TYPE_TIME_DELTA, 0, fr_ldap_config_t, keepalive_idle), .dflt = "60" },
{ FR_CONF_OFFSET("idle", fr_ldap_config_t, keepalive_idle), .dflt = "60" },

{ FR_CONF_OFFSET("probes", FR_TYPE_UINT32, 0, fr_ldap_config_t, keepalive_probes), .dflt = "3" },
{ FR_CONF_OFFSET("probes", fr_ldap_config_t, keepalive_probes), .dflt = "3" },

{ FR_CONF_OFFSET("interval", FR_TYPE_TIME_DELTA, 0, fr_ldap_config_t, keepalive_interval), .dflt = "30" },
{ FR_CONF_OFFSET("interval", fr_ldap_config_t, keepalive_interval), .dflt = "30" },

{ FR_CONF_OFFSET("dereference", FR_TYPE_STRING, 0, fr_ldap_config_t, dereference_str) },
{ FR_CONF_OFFSET("dereference", fr_ldap_config_t, dereference_str) },

/* allow server unlimited time for search (server-side limit) */
{ FR_CONF_OFFSET("srv_timelimit", FR_TYPE_TIME_DELTA, 0, fr_ldap_config_t, srv_timelimit), .dflt = "20" },
{ FR_CONF_OFFSET("srv_timelimit", fr_ldap_config_t, srv_timelimit), .dflt = "20" },

/*
* Instance config items
*/
/* timeout for search results */
{ FR_CONF_OFFSET("res_timeout", FR_TYPE_TIME_DELTA, 0, fr_ldap_config_t, res_timeout), .dflt = "20" },
{ FR_CONF_OFFSET("res_timeout", fr_ldap_config_t, res_timeout), .dflt = "20" },

{ FR_CONF_OFFSET("idle_timeout", FR_TYPE_TIME_DELTA, 0, fr_ldap_config_t, idle_timeout), .dflt = "300" },
{ FR_CONF_OFFSET("idle_timeout", fr_ldap_config_t, idle_timeout), .dflt = "300" },

{ FR_CONF_OFFSET("reconnection_delay", FR_TYPE_TIME_DELTA, 0, fr_ldap_config_t, reconnection_delay), .dflt = "10" },
{ FR_CONF_OFFSET("reconnection_delay", fr_ldap_config_t, reconnection_delay), .dflt = "10" },

CONF_PARSER_TERMINATOR
};
12 changes: 6 additions & 6 deletions src/lib/ldap/conf.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ extern conf_parser_t const fr_ldap_option_config[];
/*
* Macro for including common LDAP configuration items
*/
#define FR_LDAP_COMMON_CONF(_conf) { FR_CONF_OFFSET("port", FR_TYPE_UINT16, 0, _conf, handle_config.port) }, \
{ FR_CONF_OFFSET("identity", FR_TYPE_STRING, 0, _conf, handle_config.admin_identity) }, \
{ FR_CONF_OFFSET("password", FR_TYPE_STRING, CONF_FLAG_SECRET, _conf, handle_config.admin_password) }, \
{ FR_CONF_OFFSET("sasl", 0, CONF_FLAG_SUBSECTION, _conf, handle_config.admin_sasl), .subcs = (void const *) fr_ldap_sasl_mech_static }, \
{ FR_CONF_OFFSET("options", 0, CONF_FLAG_SUBSECTION, _conf, handle_config), .subcs = (void const *) fr_ldap_option_config }, \
{ FR_CONF_OFFSET("tls", 0, CONF_FLAG_SUBSECTION, _conf, handle_config), .subcs = (void const *) fr_ldap_tls_config }
#define FR_LDAP_COMMON_CONF(_conf) { FR_CONF_OFFSET("port", _conf, handle_config.port) }, \
{ FR_CONF_OFFSET("identity", _conf, handle_config.admin_identity) }, \
{ FR_CONF_OFFSET_FLAGS("password", FR_TYPE_STRING, CONF_FLAG_SECRET, _conf, handle_config.admin_password) }, \
{ FR_CONF_OFFSET_SUBSECTION("sasl", 0, _conf, handle_config.admin_sasl, fr_ldap_sasl_mech_static) }, \
{ FR_CONF_OFFSET_SUBSECTION("options", 0, _conf, handle_config, fr_ldap_option_config) }, \
{ FR_CONF_OFFSET_SUBSECTION("tls", 0, _conf, handle_config, fr_ldap_tls_config) }
20 changes: 10 additions & 10 deletions src/lib/redis/base.h
Original file line number Diff line number Diff line change
Expand Up @@ -131,16 +131,16 @@ typedef struct {
} fr_redis_conf_t;

#define REDIS_COMMON_CONFIG \
{ FR_CONF_OFFSET("server", FR_TYPE_STRING, CONF_FLAG_REQUIRED | CONF_FLAG_MULTI, fr_redis_conf_t, hostname) }, \
{ FR_CONF_OFFSET("port", FR_TYPE_UINT16, 0, fr_redis_conf_t, port), .dflt = "6379" }, \
{ FR_CONF_OFFSET("database", FR_TYPE_UINT32, 0, fr_redis_conf_t, database), .dflt = "0" }, \
{ FR_CONF_OFFSET("use_tls", FR_TYPE_BOOL, 0, fr_redis_conf_t, use_tls), .dflt = "no" }, \
{ FR_CONF_OFFSET("use_cluster_map", FR_TYPE_BOOL, 0, fr_redis_conf_t, use_cluster_map), .dflt = "yes" }, \
{ FR_CONF_OFFSET("username", FR_TYPE_STRING, 0, fr_redis_conf_t, username) }, \
{ FR_CONF_OFFSET("password", FR_TYPE_STRING, CONF_FLAG_SECRET, fr_redis_conf_t, password) }, \
{ FR_CONF_OFFSET("max_nodes", FR_TYPE_UINT8, 0, fr_redis_conf_t, max_nodes), .dflt = "20" }, \
{ FR_CONF_OFFSET("max_alt", FR_TYPE_UINT32, 0, fr_redis_conf_t, max_alt), .dflt = "3" }, \
{ FR_CONF_OFFSET("max_redirects", FR_TYPE_UINT32, 0, fr_redis_conf_t, max_redirects), .dflt = "2" }
{ FR_CONF_OFFSET_FLAGS("server", FR_TYPE_STRING, CONF_FLAG_REQUIRED | CONF_FLAG_MULTI, fr_redis_conf_t, hostname) }, \
{ FR_CONF_OFFSET("port", fr_redis_conf_t, port), .dflt = "6379" }, \
{ FR_CONF_OFFSET("database", fr_redis_conf_t, database), .dflt = "0" }, \
{ FR_CONF_OFFSET("use_tls", fr_redis_conf_t, use_tls), .dflt = "no" }, \
{ FR_CONF_OFFSET("use_cluster_map", fr_redis_conf_t, use_cluster_map), .dflt = "yes" }, \
{ FR_CONF_OFFSET("username", fr_redis_conf_t, username) }, \
{ FR_CONF_OFFSET_FLAGS("password", FR_TYPE_STRING, CONF_FLAG_SECRET, fr_redis_conf_t, password) }, \
{ FR_CONF_OFFSET("max_nodes", fr_redis_conf_t, max_nodes), .dflt = "20" }, \
{ FR_CONF_OFFSET("max_alt", fr_redis_conf_t, max_alt), .dflt = "3" }, \
{ FR_CONF_OFFSET("max_redirects", fr_redis_conf_t, max_redirects), .dflt = "2" }

void fr_redis_version_print(void);

Expand Down
64 changes: 59 additions & 5 deletions src/lib/server/cf_parse.h
Original file line number Diff line number Diff line change
Expand Up @@ -187,15 +187,70 @@ _Generic((_ct), \
# define FR_CONF_FLAG_CHECK(_type, _flags, _c_type, _ptr_or_offset) _ptr_or_offset
#endif

#define CONF_CTYPE_TO_FLAGS(_ct) \
_Generic(&(_ct), \
tmpl_t ** : CONF_FLAG_TMPL, \
tmpl_t *** : CONF_FLAG_TMPL | CONF_FLAG_MULTI, \
xlat_t ** : CONF_FLAG_XLAT, \
xlat_t *** : CONF_FLAG_XLAT | CONF_FLAG_MULTI, \
fr_ethernet_t * : 0, \
fr_ethernet_t ** : CONF_FLAG_MULTI, \
fr_ifid_t * : 0, \
fr_ifid_t ** : CONF_FLAG_MULTI, \
fr_time_t * : 0, \
fr_time_t ** : CONF_FLAG_MULTI, \
fr_time_delta_t * : 0, \
fr_time_delta_t ** : CONF_FLAG_MULTI, \
char const ** : 0, \
char const *** : CONF_FLAG_MULTI, \
bool * : 0, \
bool ** : CONF_FLAG_MULTI, \
uint8_t const ** : 0, \
uint8_t const *** : CONF_FLAG_MULTI, \
uint8_t * : 0, \
uint8_t ** : CONF_FLAG_MULTI, \
uint16_t * : 0, \
uint16_t ** : CONF_FLAG_MULTI, \
uint32_t * : 0, \
uint32_t ** : CONF_FLAG_MULTI, \
uint64_t * : 0, \
uint64_t ** : CONF_FLAG_MULTI, \
int8_t * : 0, \
int8_t ** : CONF_FLAG_MULTI, \
int16_t * : 0, \
int16_t ** : CONF_FLAG_MULTI, \
int32_t * : 0, \
int32_t ** : CONF_FLAG_MULTI, \
int64_t * : 0, \
int64_t ** : CONF_FLAG_MULTI, \
float * : 0, \
float ** : CONF_FLAG_MULTI, \
double * : 0, \
double ** : CONF_FLAG_MULTI)

/** conf_parser_t which parses a single CONF_PAIR, writing the result to a field in a struct
*
* @param[in] _name of the CONF_PAIR to search for.
* @param[in] _struct contaning the field to write the result to.
* @param[in] _field to write the result to.
*/
# define FR_CONF_OFFSET(_name, _struct, _field) \
FR_CONF_OFFSET_FLAGS(_name, \
FR_CTYPE_TO_TYPE((((_struct *)NULL)->_field)), \
CONF_CTYPE_TO_FLAGS((((_struct *)NULL)->_field)),\
_struct, _field)

/** conf_parser_t which parses a single CONF_PAIR, writing the result to a field in a struct
*
* This variant takes output type and flags manually, instead of determining them automatically.
*
* @param[in] _name of the CONF_PAIR to search for.
* @param[in] _type to parse the CONF_PAIR as.
* @param[in] _flags controlling parsing behaviour.
* @param[in] _struct contaning the field to write the result to.
* @param[in] _field to write the result to.
*/
# define FR_CONF_OFFSET(_name, _type, _flags, _struct, _field) \
# define FR_CONF_OFFSET_FLAGS(_name, _type, _flags, _struct, _field) \
.name1 = _name, \
.type = (_type), \
.flags = (_flags), \
Expand Down Expand Up @@ -314,10 +369,9 @@ _Generic((_ct), \
* @param[in] _struct where the result was previously written.
* @param[in] _field in the struct where the result was previously written.
*/
#define FR_CONF_DEPRECATED(_name, _type, _flags, _struct, _field) \
#define FR_CONF_DEPRECATED(_name, _struct, _field) \
.name1 = _name, \
.type = (_type ), \
.flags = (_flags) | CONF_FLAG_DEPRECATED
.flags = CONF_FLAG_DEPRECATED

/*
* It's a developer option and should be used carefully.
Expand Down Expand Up @@ -478,7 +532,7 @@ typedef int (*cf_dflt_t)(CONF_PAIR **out, void *parent, CONF_SECTION *cs, fr_tok
* Example with #FR_CONF_OFFSET :
@code{.c}
static conf_parser_t module_config[] = {
{ FR_CONF_OFFSET("example", FR_TYPE_STRING | CONF_FLAG_NOT_EMPTY, 0, 0, example_instance_t, example), .dflt = "default_value" },
{ FR_CONF_OFFSET_FLAGS("example", FR_TYPE_STRING | CONF_FLAG_NOT_EMPTY, 0, 0, example_instance_t, example), .dflt = "default_value" },
CONF_PARSER_TERMINATOR
}
@endcode
Expand Down
Loading

0 comments on commit 444f8f9

Please sign in to comment.