char *namespace = NULL;
char const *packet_name = NULL;
- char *p;
+ char *p = NULL;
tmpl_t *vpt = NULL, *src_vpt = NULL, *dst_vpt = NULL;
/*
* If !tmpl_require_enum_prefix, '&' means "attribute reference".
+ *
+ * Or, bare word means "attribute reference".
*/
- if (name2[0] == '&') {
+ if ((name2[0] == '&') ||
+ (tmpl_require_enum_prefix && ((p = strchr(name2, ':')) == NULL))) {
size_t slen;
slen = tmpl_afrom_attr_substr(parent, NULL, &vpt,
goto get_packet_type;
}
+ /*
+ * subrequest foo::bar { ... }
+ *
+ * Change to dictionary "foo", packet type "bar".
+ */
+ if (p) {
+ if (p[1] != ':') {
+ cf_log_err(cs, "Invalid syntax in namespace::enum");
+ return NULL;
+ }
+
+ MEM(namespace = talloc_strdup(parent, name2)); /* get a modifiable copy */
+
+ p = namespace + (p - name2);
+ *p = '\0';
+ p += 2;
+ packet_name = p;
+
+ dict = fr_dict_by_protocol_name(namespace);
+ if (!dict) {
+ dict_ref = fr_dict_autoload_talloc(NULL, &dict, namespace);
+ if (!dict_ref) {
+ cf_log_err(cs, "Unknown namespace '%s'", namespace);
+ talloc_free(namespace);
+ return NULL;
+ }
+ }
+
+ goto get_packet_type;
+ }
+
/*
* subrequest foo { ... }
*
dict = unlang_ctx->rules->attr.dict_def;
packet_name = name2;
- } else {
+ } else if (!tmpl_require_enum_prefix) {
/*
* subrequest foo.bar { ... }
*
return NULL;
}
}
+
+ WARN("Deprecated syntax 'subrequest %s ...'", name2);
+ WARN(" please switch to 'subrequest %s::%s ...", namespace, packet_name);
+
+ } else {
+ /*
+ * We have tmpl_require_enum prefix, so bare word foo.bar is "attribute foo,
+ * sub-attribute bar"
+ */
+ dict = unlang_ctx->rules->attr.dict_def;
+ packet_name = name2;
}
/*