From: Arran Cudbard-Bell Date: Sat, 21 May 2016 04:28:42 +0000 (-0400) Subject: Use C11 _Generic for type checks X-Git-Tag: branch_3_1_x~350 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=41260874d08e87ffa7f9435ea17c9e5f798e130b;p=thirdparty%2Ffreeradius-server.git Use C11 _Generic for type checks --- diff --git a/src/include/conffile.h b/src/include/conffile.h index 7b5c93f7317..0a033042d2d 100644 --- a/src/include/conffile.h +++ b/src/include/conffile.h @@ -45,6 +45,37 @@ typedef struct conf_data CONF_DATA; //!< #CONF_ITEM used to associate arbitrary ///< with a #CONF_PAIR or #CONF_SECTION. +typedef void _mismatch_vp_tmpl; //!< Dummy type used to indicate PW_TYPE_*/C type mismatch. +typedef void _mismatch_vp_tmpl_m; //!< Dummy type used to indicate PW_TYPE_*/C type mismatch. +typedef void _mismatch_char; //!< Dummy type used to indicate PW_TYPE_*/C type mismatch. +typedef void _mismatch_char_m; //!< Dummy type used to indicate PW_TYPE_*/C type mismatch. +typedef void _mismatch_bool; //!< Dummy type used to indicate PW_TYPE_*/C type mismatch. +typedef void _mismatch_bool_m; //!< Dummy type used to indicate PW_TYPE_*/C type mismatch. +typedef void _mismatch_uint32; //!< Dummy type used to indicate PW_TYPE_*/C type mismatch. +typedef void _mismatch_uint32_m; //!< Dummy type used to indicate PW_TYPE_*/C type mismatch. +typedef void _mismatch_fripaddr; //!< Dummy type used to indicate PW_TYPE_*/C type mismatch. +typedef void _mismatch_fripaddr_m; //!< Dummy type used to indicate PW_TYPE_*/C type mismatch. +typedef void _mismatch_time; //!< Dummy type used to indicate PW_TYPE_*/C type mismatch. +typedef void _mismatch_time_m; //!< Dummy type used to indicate PW_TYPE_*/C type mismatch. +typedef void _mismatch_abinary; //!< Dummy type used to indicate PW_TYPE_*/C type mismatch. +typedef void _mismatch_abinary_m; //!< Dummy type used to indicate PW_TYPE_*/C type mismatch. +typedef void _mismatch_uint8; //!< Dummy type used to indicate PW_TYPE_*/C type mismatch. +typedef void _mismatch_uint8_m; //!< Dummy type used to indicate PW_TYPE_*/C type mismatch. +typedef void _mismatch_uint8_m_m; //!< Dummy type used to indicate PW_TYPE_*/C type mismatch. +typedef void _mismatch_ifid; //!< Dummy type used to indicate PW_TYPE_*/C type mismatch. +typedef void _mismatch_ifid_m; //!< Dummy type used to indicate PW_TYPE_*/C type mismatch. +typedef void _mismatch_uint16; //!< Dummy type used to indicate PW_TYPE_*/C type mismatch. +typedef void _mismatch_uint16_m; //!< Dummy type used to indicate PW_TYPE_*/C type mismatch. +typedef void _mismatch_ethernet; //!< Dummy type used to indicate PW_TYPE_*/C type mismatch. +typedef void _mismatch_ethernet_m; //!< Dummy type used to indicate PW_TYPE_*/C type mismatch. +typedef void _mismatch_int32; //!< Dummy type used to indicate PW_TYPE_*/C type mismatch. +typedef void _mismatch_int32_m; //!< Dummy type used to indicate PW_TYPE_*/C type mismatch. +typedef void _mismatch_uint64; //!< Dummy type used to indicate PW_TYPE_*/C type mismatch. +typedef void _mismatch_uint64_m; //!< Dummy type used to indicate PW_TYPE_*/C type mismatch. +typedef void _mismatch_timeval; //!< Dummy type used to indicate PW_TYPE_*/C type mismatch. +typedef void _mismatch_timeval_m; //!< Dummy type used to indicate PW_TYPE_*/C type mismatch. +typedef void _mismatch_default; //!< Dummy type used to indicate PW_TYPE_*/C type mismatch. + typedef void conf_type_mismatch; //!< Dummy type used to indicate PW_TYPE_*/C type mismatch. typedef void conf_type_invalid; //!< Dummy type used to indicate invalid PW_TYPE_*. @@ -70,110 +101,97 @@ typedef struct timeval _timeval_t; * @param _p Pointer or offset. */ # define FR_CONF_TYPE_CHECK(_t, _ct, _p) \ - __builtin_choose_expr(((_t & PW_TYPE_TMPL) && (_t & PW_TYPE_MULTI)),\ - __builtin_choose_expr(__builtin_types_compatible_p(vp_tmpl_t ***, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((_t & PW_TYPE_TMPL),\ - __builtin_choose_expr(__builtin_types_compatible_p(vp_tmpl_t **, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_STRING) && (_t & PW_TYPE_MULTI),\ - __builtin_choose_expr(__builtin_types_compatible_p(char const ***, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_STRING),\ - __builtin_choose_expr(__builtin_types_compatible_p(char const **, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_BOOLEAN) && (_t & PW_TYPE_MULTI),\ - __builtin_choose_expr(__builtin_types_compatible_p(bool **, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_BOOLEAN),\ - __builtin_choose_expr(__builtin_types_compatible_p(bool *, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_SUBSECTION),\ - _p,\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_INTEGER) && (_t & PW_TYPE_MULTI),\ - __builtin_choose_expr(__builtin_types_compatible_p(uint32_t **, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_INTEGER),\ - __builtin_choose_expr(__builtin_types_compatible_p(uint32_t *, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_IPV4_ADDR) && (_t & PW_TYPE_MULTI),\ - __builtin_choose_expr(__builtin_types_compatible_p(fr_ipaddr_t **, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_IPV4_ADDR),\ - __builtin_choose_expr(__builtin_types_compatible_p(fr_ipaddr_t *, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_DATE) && (_t & PW_TYPE_MULTI),\ - __builtin_choose_expr(__builtin_types_compatible_p(uint32_t **, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_DATE),\ - __builtin_choose_expr(__builtin_types_compatible_p(uint32_t *, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_ABINARY) && (_t & PW_TYPE_MULTI),\ - __builtin_choose_expr(__builtin_types_compatible_p(size_t*[32/sizeof(size_t)], _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_ABINARY),\ - __builtin_choose_expr(__builtin_types_compatible_p(size_t[32/sizeof(size_t)], _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_OCTETS) && (_t & PW_TYPE_MULTI),\ - __builtin_choose_expr(__builtin_types_compatible_p(uint8_t **, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_OCTETS),\ - __builtin_choose_expr(__builtin_types_compatible_p(uint8_t *, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_IFID) && (_t & PW_TYPE_MULTI),\ - __builtin_choose_expr(__builtin_types_compatible_p(uint8_t*[8], _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_IFID),\ - __builtin_choose_expr(__builtin_types_compatible_p(uint8_t[8], _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_IPV6_ADDR) && (_t & PW_TYPE_MULTI),\ - __builtin_choose_expr(__builtin_types_compatible_p(fr_ipaddr_t **, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_IPV6_ADDR),\ - __builtin_choose_expr(__builtin_types_compatible_p(fr_ipaddr_t *, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_IPV6_PREFIX) && (_t & PW_TYPE_MULTI),\ - __builtin_choose_expr(__builtin_types_compatible_p(fr_ipaddr_t **, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_IPV6_PREFIX),\ - __builtin_choose_expr(__builtin_types_compatible_p(fr_ipaddr_t *, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_BYTE) && (_t & PW_TYPE_MULTI),\ - __builtin_choose_expr(__builtin_types_compatible_p(uint8_t **, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_BYTE),\ - __builtin_choose_expr(__builtin_types_compatible_p(uint8_t *, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_SHORT) && (_t & PW_TYPE_MULTI),\ - __builtin_choose_expr(__builtin_types_compatible_p(uint16_t **, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_SHORT),\ - __builtin_choose_expr(__builtin_types_compatible_p(uint16_t *, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_ETHERNET) && (_t & PW_TYPE_MULTI),\ - __builtin_choose_expr(__builtin_types_compatible_p(uint8_t*[6], _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_ETHERNET),\ - __builtin_choose_expr(__builtin_types_compatible_p(uint8_t[6], _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_SIGNED) && (_t & PW_TYPE_MULTI),\ - __builtin_choose_expr(__builtin_types_compatible_p(int32_t **, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_SIGNED),\ - __builtin_choose_expr(__builtin_types_compatible_p(int32_t *, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_COMBO_IP_ADDR) && (_t & PW_TYPE_MULTI),\ - __builtin_choose_expr(__builtin_types_compatible_p(fr_ipaddr_t **, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_COMBO_IP_ADDR),\ - __builtin_choose_expr(__builtin_types_compatible_p(fr_ipaddr_t *, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_INTEGER64) && (_t & PW_TYPE_MULTI),\ - __builtin_choose_expr(__builtin_types_compatible_p(uint64_t **, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_INTEGER64),\ - __builtin_choose_expr(__builtin_types_compatible_p(uint64_t *, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_IPV4_PREFIX) && (_t & PW_TYPE_MULTI),\ - __builtin_choose_expr(__builtin_types_compatible_p(fr_ipaddr_t **, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_IPV4_PREFIX),\ - __builtin_choose_expr(__builtin_types_compatible_p(fr_ipaddr_t *, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_TIMEVAL) && (_t & PW_TYPE_MULTI),\ - __builtin_choose_expr(__builtin_types_compatible_p(_timeval_t **, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_TIMEVAL),\ - __builtin_choose_expr(__builtin_types_compatible_p(_timeval_t *, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_COMBO_IP_PREFIX) && (_t & PW_TYPE_MULTI),\ - __builtin_choose_expr(__builtin_types_compatible_p(fr_ipaddr_t **, _ct), _p, (conf_type_mismatch) 0),\ - __builtin_choose_expr((((_t) & 0xff) == PW_TYPE_COMBO_IP_PREFIX),\ - __builtin_choose_expr(__builtin_types_compatible_p(fr_ipaddr_t *, _ct), _p, (conf_type_mismatch) 0),\ - (conf_type_invalid) 0\ - ))))))))))))))))))))))))))))))))))))))))) +__builtin_choose_expr((_t) & PW_TYPE_SUBSECTION, _p, \ +_Generic((_ct), \ + vp_tmpl_t ** : __builtin_choose_expr(((_t) & PW_TYPE_TMPL) && !((_t) & PW_TYPE_MULTI), \ + _p, (_mismatch_vp_tmpl) 0), \ + vp_tmpl_t *** : __builtin_choose_expr(((_t) & PW_TYPE_TMPL) && ((_t) & PW_TYPE_MULTI), \ + _p, (_mismatch_vp_tmpl_m) 0), \ + const char ** : __builtin_choose_expr((PW_BASE_TYPE(_t) == PW_TYPE_STRING) && !((_t) & PW_TYPE_MULTI), \ + _p, (_mismatch_char) 0), \ + const char *** : __builtin_choose_expr((PW_BASE_TYPE(_t) == PW_TYPE_STRING) && ((_t) & PW_TYPE_MULTI), \ + _p, (_mismatch_char_m) 0), \ + bool * : __builtin_choose_expr((PW_BASE_TYPE(_t) == PW_TYPE_BOOLEAN) && !((_t) & PW_TYPE_MULTI), \ + _p, (_mismatch_bool) 0), \ + bool ** : __builtin_choose_expr((PW_BASE_TYPE(_t) == PW_TYPE_BOOLEAN) && ((_t) & PW_TYPE_MULTI), \ + _p, (_mismatch_bool_m) 0), \ + uint32_t * : __builtin_choose_expr((PW_BASE_TYPE(_t) == PW_TYPE_INTEGER) && !((_t) & PW_TYPE_MULTI), \ + _p, (_mismatch_uint32) 0), \ + uint32_t ** : __builtin_choose_expr((PW_BASE_TYPE(_t) == PW_TYPE_INTEGER) && ((_t) & PW_TYPE_MULTI), \ + _p, (_mismatch_uint32_m) 0), \ + fr_ipaddr_t * : __builtin_choose_expr(((PW_BASE_TYPE(_t) == PW_TYPE_IPV4_ADDR) || \ + (PW_BASE_TYPE(_t) == PW_TYPE_IPV4_PREFIX) || \ + (PW_BASE_TYPE(_t) == PW_TYPE_IPV6_ADDR) || \ + (PW_BASE_TYPE(_t) == PW_TYPE_IPV6_PREFIX) || \ + (PW_BASE_TYPE(_t) == PW_TYPE_COMBO_IP_ADDR)) || \ + !((_t) & PW_TYPE_MULTI), _p, (_mismatch_fripaddr) 0), \ + fr_ipaddr_t ** : __builtin_choose_expr(((PW_BASE_TYPE(_t) == PW_TYPE_IPV4_ADDR) || \ + (PW_BASE_TYPE(_t) == PW_TYPE_IPV4_PREFIX) || \ + (PW_BASE_TYPE(_t) == PW_TYPE_IPV6_ADDR) || \ + (PW_BASE_TYPE(_t) == PW_TYPE_IPV6_PREFIX) || \ + (PW_BASE_TYPE(_t) == PW_TYPE_COMBO_IP_ADDR)) && \ + ((_t) & PW_TYPE_MULTI), _p, (_mismatch_fripaddr_m) 0), \ + time_t * : __builtin_choose_expr((PW_BASE_TYPE(_t) == PW_TYPE_DATE) && !((_t) & PW_TYPE_MULTI), \ + _p, (_mismatch_time) 0), \ + time_t ** : __builtin_choose_expr((PW_BASE_TYPE(_t) == PW_TYPE_DATE) && ((_t) & PW_TYPE_MULTI), \ + _p, (_mismatch_time_m) 0), \ + size_t[32/sizeof(size_t)] : __builtin_choose_expr((PW_BASE_TYPE(_t) == PW_TYPE_ABINARY) && !((_t) & PW_TYPE_MULTI), \ + _p, (_mismatch_abinary) 0), \ + size_t*[32/sizeof(size_t)] : __builtin_choose_expr((PW_BASE_TYPE(_t) == PW_TYPE_ABINARY) && ((_t) & PW_TYPE_MULTI), \ + _p, (_mismatch_abinary_m) 0), \ + uint8_t const * : __builtin_choose_expr((PW_BASE_TYPE(_t) == PW_TYPE_OCTETS) && !((_t) & PW_TYPE_MULTI), \ + _p, (_mismatch_uint8) 0), \ + uint8_t const **: __builtin_choose_expr((PW_BASE_TYPE(_t) == PW_TYPE_OCTETS) && ((_t) & PW_TYPE_MULTI), \ + _p, (_mismatch_uint8_m) 0), \ + uint8_t * : __builtin_choose_expr((PW_BASE_TYPE(_t) == PW_TYPE_BYTE) && !((_t) & PW_TYPE_MULTI), \ + _p, (_mismatch_uint8) 0), \ + uint8_t ** : __builtin_choose_expr((PW_BASE_TYPE(_t) == PW_TYPE_BYTE) && ((_t) & PW_TYPE_MULTI), \ + _p, (_mismatch_uint8_m) 0), \ + uint8_t[8] : __builtin_choose_expr((PW_BASE_TYPE(_t) == PW_TYPE_IFID) && !(_t & PW_TYPE_MULTI), \ + _p, (_mismatch_ifid) 0), \ + uint8_t*[8] : __builtin_choose_expr((PW_BASE_TYPE(_t) == PW_TYPE_IFID) && ((_t) & PW_TYPE_MULTI), \ + _p, (_mismatch_ifid_m) 0), \ + uint16_t * : __builtin_choose_expr((PW_BASE_TYPE(_t) == PW_TYPE_SHORT) && !((_t) & PW_TYPE_MULTI), \ + _p, (_mismatch_uint16) 0), \ + uint16_t ** : __builtin_choose_expr((PW_BASE_TYPE(_t) == PW_TYPE_SHORT) && ((_t) & PW_TYPE_MULTI), \ + _p, (_mismatch_uint16_m) 0), \ + uint8_t[6] : __builtin_choose_expr((PW_BASE_TYPE(_t) == PW_TYPE_ETHERNET) && !((_t) & PW_TYPE_MULTI), \ + _p, (_mismatch_ethernet) 0), \ + uint8_t*[6] : __builtin_choose_expr((PW_BASE_TYPE(_t) == PW_TYPE_ETHERNET) && ((_t) & PW_TYPE_MULTI), \ + _p, (_mismatch_ethernet_m) 0), \ + int32_t * : __builtin_choose_expr((PW_BASE_TYPE(_t) == PW_TYPE_SIGNED) && !((_t) & PW_TYPE_MULTI), \ + _p, (_mismatch_int32) 0), \ + int32_t ** : __builtin_choose_expr((PW_BASE_TYPE(_t) == PW_TYPE_SIGNED) && ((_t) & PW_TYPE_MULTI), \ + _p, (_mismatch_int32_m) 0), \ + uint64_t * : __builtin_choose_expr((PW_BASE_TYPE(_t) == PW_TYPE_INTEGER64) && !((_t) & PW_TYPE_MULTI), \ + _p, (_mismatch_uint64) 0), \ + uint64_t ** : __builtin_choose_expr((PW_BASE_TYPE(_t) == PW_TYPE_INTEGER64) && ((_t) & PW_TYPE_MULTI), \ + _p, (_mismatch_uint64_m) 0), \ + _timeval_t * : __builtin_choose_expr((PW_BASE_TYPE(_t) == PW_TYPE_TIMEVAL) && !((_t) & PW_TYPE_MULTI), \ + _p, (_mismatch_timeval) 0), \ + _timeval_t ** : __builtin_choose_expr((PW_BASE_TYPE(_t) == PW_TYPE_TIMEVAL) && ((_t) & PW_TYPE_MULTI), \ + _p, (_mismatch_timeval_m) 0), \ + default: (conf_type_mismatch)0)) # define FR_CONF_OFFSET(_n, _t, _s, _f) \ .name = _n, \ .type = _t, \ - .offset = FR_CONF_TYPE_CHECK((_t), __typeof__(&(((_s *)NULL)->_f)), offsetof(_s, _f)) + .offset = FR_CONF_TYPE_CHECK((_t), &(((_s *)NULL)->_f), offsetof(_s, _f)) # define FR_CONF_IS_SET_OFFSET(_n, _t, _s, _f) \ .name = _n, \ .type = (_t) | PW_TYPE_IS_SET, \ - .offset = FR_CONF_TYPE_CHECK((_t), __typeof__(&(((_s *)NULL)->_f)), offsetof(_s, _f)), \ + .offset = FR_CONF_TYPE_CHECK((_t), &(((_s *)NULL)->_f), offsetof(_s, _f)), \ .is_set_offset = offsetof(_s, _f ## _is_set) # define FR_CONF_POINTER(_n, _t, _p) \ .name = _n, \ .type = _t, \ - .data = FR_CONF_TYPE_CHECK((_t), __typeof__(_p), _p) + .data = FR_CONF_TYPE_CHECK((_t), (_p), _p) # define FR_CONF_IS_SET_POINTER(_n, _t, _p) \ .name = _n, \ .type = (_t) | PW_TYPE_IS_SET, \ - .data = FR_CONF_TYPE_CHECK((_t), __typeof__(_p), _p), \ + .data = FR_CONF_TYPE_CHECK((_t), (_p), _p), \ .is_set_ptr = _p ## _is_set -# define FR_ITEM_POINTER(_t, _p) _t, FR_CONF_TYPE_CHECK((_t), __typeof__(_p), _p) +# define FR_ITEM_POINTER(_t, _p) _t, FR_CONF_TYPE_CHECK((_t), (_p), _p) #else # define FR_CONF_OFFSET(_n, _t, _s, _f) \ .name = _n, \ diff --git a/src/modules/rlm_test/rlm_test.c b/src/modules/rlm_test/rlm_test.c index 2c8622f6025..dbd981177bc 100644 --- a/src/modules/rlm_test/rlm_test.c +++ b/src/modules/rlm_test/rlm_test.c @@ -38,20 +38,127 @@ RCSID("$Id$") * be used as the instance handle. */ typedef struct rlm_test_t { - bool boolean; - uint32_t value; + vp_tmpl_t *tmpl; + vp_tmpl_t **tmpl_m; char const *string; + char const **string_m; + + bool boolean; + bool *boolean_m; + + uint32_t integer; + uint32_t *integer_m; + + fr_ipaddr_t ipv4_addr; + fr_ipaddr_t ipv4_prefix; + + fr_ipaddr_t ipv6_addr; + fr_ipaddr_t ipv6_prefix; + + fr_ipaddr_t combo_ipaddr; + + fr_ipaddr_t *ipv4_addr_m; + fr_ipaddr_t *ipv4_prefix_m; + + fr_ipaddr_t *ipv6_addr_m; + fr_ipaddr_t *ipv6_prefix_m; + + fr_ipaddr_t *combo_ipaddr_m; + fr_ipaddr_t ipaddr; + + time_t date; + time_t *date_m; + + size_t abinary[32/sizeof(size_t)]; + size_t abinary_m[32/sizeof(size_t)]; + + uint8_t const *octets; + uint8_t const **octets_m; + + uint8_t byte; + uint8_t *byte_m; + + uint8_t ifid[8]; + uint8_t *ifid_m[8]; + + uint16_t shortint; + uint16_t shortint_m; + + uint8_t ethernet[6]; + uint8_t ethernet_m[6]; + + int32_t sinteger; + int32_t *sinteger_m; + + uint64_t integer64; + uint64_t *integer64_m; + + _timeval_t timeval; + _timeval_t *timeval_m; } rlm_test_t; /* * A mapping of configuration file names to internal variables. */ static const CONF_PARSER module_config[] = { - { FR_CONF_OFFSET("integer", PW_TYPE_INTEGER, rlm_test_t, value), .dflt = "1" }, - { FR_CONF_OFFSET("boolean", PW_TYPE_BOOLEAN, rlm_test_t, boolean), .dflt = "no" }, + { FR_CONF_OFFSET("tmpl", PW_TYPE_TMPL, rlm_test_t, tmpl), .dflt = "&User-Name", .quote = T_BARE_WORD }, + { FR_CONF_OFFSET("tmpl_m", PW_TYPE_TMPL | PW_TYPE_MULTI, rlm_test_t, tmpl_m), .dflt = "%{User-Name}", .quote = T_DOUBLE_QUOTED_STRING }, + { FR_CONF_OFFSET("string", PW_TYPE_STRING, rlm_test_t, string) }, - { FR_CONF_OFFSET("ipaddr", PW_TYPE_IPV4_ADDR, rlm_test_t, ipaddr), .dflt = "*" }, + { FR_CONF_OFFSET("string_m", PW_TYPE_STRING | PW_TYPE_MULTI, rlm_test_t, string_m) }, + + { FR_CONF_OFFSET("boolean", PW_TYPE_BOOLEAN, rlm_test_t, boolean), .dflt = "no" }, + { FR_CONF_OFFSET("boolean_m", PW_TYPE_BOOLEAN | PW_TYPE_MULTI, rlm_test_t, boolean_m), .dflt = "no" }, + + { FR_CONF_OFFSET("integer", PW_TYPE_INTEGER, rlm_test_t, integer), .dflt = "1" }, + { FR_CONF_OFFSET("integer_m", PW_TYPE_INTEGER | PW_TYPE_MULTI, rlm_test_t, integer_m), .dflt = "2" }, + + { FR_CONF_OFFSET("ipv4_addr", PW_TYPE_IPV4_ADDR, rlm_test_t, ipv4_addr), .dflt = "*" }, + { FR_CONF_OFFSET("ipv4_addr_m", PW_TYPE_IPV4_ADDR | PW_TYPE_MULTI, rlm_test_t, ipv4_addr_m), .dflt = "*" }, + + { FR_CONF_OFFSET("ipv4_prefix", PW_TYPE_IPV4_PREFIX, rlm_test_t, ipv4_addr), .dflt = "192.168.0.1/24" }, + { FR_CONF_OFFSET("ipv4_prefix_m", PW_TYPE_IPV4_PREFIX | PW_TYPE_MULTI, rlm_test_t, ipv4_addr_m), .dflt = "192.168.0.1/24" }, + + { FR_CONF_OFFSET("ipv6_addr", PW_TYPE_IPV6_ADDR, rlm_test_t, ipv6_addr), .dflt = "*" }, + { FR_CONF_OFFSET("ipv6_addr_m", PW_TYPE_IPV6_ADDR | PW_TYPE_MULTI, rlm_test_t, ipv6_addr_m), .dflt = "*" }, + + { FR_CONF_OFFSET("ipv6_prefix", PW_TYPE_IPV6_PREFIX, rlm_test_t, ipv6_prefix), .dflt = "::1/128" }, + { FR_CONF_OFFSET("ipv6_prefix_m", PW_TYPE_IPV6_PREFIX | PW_TYPE_MULTI, rlm_test_t, ipv6_prefix_m), .dflt = "::1/128" }, + + { FR_CONF_OFFSET("combo", PW_TYPE_COMBO_IP_ADDR, rlm_test_t, combo_ipaddr), .dflt = "::1/128" }, + { FR_CONF_OFFSET("combo_m", PW_TYPE_COMBO_IP_ADDR | PW_TYPE_MULTI, rlm_test_t, combo_ipaddr_m), .dflt = "::1/128" }, + + { FR_CONF_OFFSET("date", PW_TYPE_DATE, rlm_test_t, date) }, + { FR_CONF_OFFSET("date_m", PW_TYPE_DATE | PW_TYPE_MULTI, rlm_test_t, date_m) }, + + { FR_CONF_OFFSET("abinary", PW_TYPE_ABINARY, rlm_test_t, abinary) }, + { FR_CONF_OFFSET("abinary_m", PW_TYPE_ABINARY | PW_TYPE_MULTI, rlm_test_t, abinary_m) }, + + { FR_CONF_OFFSET("octets", PW_TYPE_OCTETS, rlm_test_t, octets) }, + { FR_CONF_OFFSET("octets_m", PW_TYPE_OCTETS | PW_TYPE_MULTI, rlm_test_t, octets_m) }, + + { FR_CONF_OFFSET("bytes", PW_TYPE_BYTE, rlm_test_t, byte) }, + { FR_CONF_OFFSET("bytes_m", PW_TYPE_BYTE | PW_TYPE_MULTI, rlm_test_t, byte_m) }, + + { FR_CONF_OFFSET("ifid", PW_TYPE_IFID, rlm_test_t, ifid) }, + { FR_CONF_OFFSET("ifid_m", PW_TYPE_IFID | PW_TYPE_MULTI, rlm_test_t, ifid_m) }, + + { FR_CONF_OFFSET("short", PW_TYPE_SHORT, rlm_test_t, shortint) }, + { FR_CONF_OFFSET("short_m", PW_TYPE_SHORT | PW_TYPE_MULTI, rlm_test_t, shortint_m) }, + + { FR_CONF_OFFSET("ethernet", PW_TYPE_ETHERNET, rlm_test_t, ethernet) }, + { FR_CONF_OFFSET("ethernet_m", PW_TYPE_ETHERNET | PW_TYPE_MULTI, rlm_test_t, ethernet_m) }, + + { FR_CONF_OFFSET("signed", PW_TYPE_SIGNED, rlm_test_t, sinteger) }, + { FR_CONF_OFFSET("signed_m", PW_TYPE_SIGNED | PW_TYPE_MULTI, rlm_test_t, sinteger_m) }, + + { FR_CONF_OFFSET("uint64", PW_TYPE_INTEGER64, rlm_test_t, integer64) }, + { FR_CONF_OFFSET("uint64_m", PW_TYPE_INTEGER64 | PW_TYPE_MULTI, rlm_test_t, integer64_m) }, + + { FR_CONF_OFFSET("timeval", PW_TYPE_TIMEVAL, rlm_test_t, timeval) }, + { FR_CONF_OFFSET("timeval_m", PW_TYPE_TIMEVAL | PW_TYPE_MULTI, rlm_test_t, timeval_m) }, + CONF_PARSER_TERMINATOR };