static fr_dict_attr_t const *attr_request_processing_stage;
static fr_dict_attr_t const *attr_virtual_server;
static fr_dict_attr_t const *attr_module_return_code;
+fr_dict_attr_t const *tmpl_attr_unspec;
static fr_dict_attr_autoload_t tmpl_dict_attr[] = {
{ .out = &attr_client_ip_address, .name = "Client-IP-Address", .type = FR_TYPE_IPV4_ADDR, .dict = &dict_freeradius },
int tmpl_global_init(void)
{
+ fr_dict_attr_t *da;
+
if (fr_dict_autoload(tmpl_dict) < 0) {
PERROR("%s", __FUNCTION__);
return -1;
return -1;
}
+ da = fr_dict_unknown_attr_afrom_num(NULL, fr_dict_root(dict_freeradius), 0);
+ fr_assert(da != NULL);
+
+ da->type = FR_TYPE_NULL;
+ tmpl_attr_unspec = da;
+
return 0;
}
void tmpl_global_free(void)
{
fr_dict_autofree(tmpl_dict);
+
+ fr_dict_unknown_free(&tmpl_attr_unspec);
}
FR_SBUFF_SET_RETURN(name, &our_name);
}
+extern fr_dict_attr_t const *tmpl_attr_unspec;
+
static inline CC_HINT(nonnull(3,4))
fr_slen_t tmpl_attr_ref_from_unspecified_substr(tmpl_attr_t *ar, tmpl_attr_error_t *err,
tmpl_t *vpt,
*ar = (tmpl_attr_t){
.ar_num = NUM_UNSPEC, /* May be changed by tmpl_attr_parse_filter */
.ar_type = TMPL_ATTR_TYPE_UNSPEC,
+ .ar_da = tmpl_attr_unspec,
};
slen = tmpl_attr_parse_filter(err, ar, name, t_rules);
file, line);
}
+ if (tmpl_attr_tail_da(vpt) == tmpl_attr_unspec) {
+ fr_assert(vpt->rules.cast == FR_TYPE_NULL);
+ break;
+ }
+
if (tmpl_attr_tail_da(vpt)->flags.is_unknown) {
if (tmpl_attr_tail_da(vpt) != tmpl_attr_tail_unknown(vpt)) {
fr_fatal_assert_fail("CONSISTENCY CHECK FAILED %s[%u]: TMPL_TYPE_ATTR "