]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Use C11 _Generic for type checks
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Sat, 21 May 2016 04:28:42 +0000 (00:28 -0400)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Sun, 22 May 2016 04:00:41 +0000 (00:00 -0400)
src/include/conffile.h
src/modules/rlm_test/rlm_test.c

index 7b5c93f73177b2e677ad1aba02cbc5ae8c5c3701..0a033042d2d27171811c6acd5dd63fc518cd0e7e 100644 (file)
@@ -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, \
index 2c8622f60252911da0a01bf65a81e23cb22cda68..dbd981177bc4008c30b16c21c01993e44d7487fd 100644 (file)
@@ -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
 };