From 3a3bf07ded95b2c708a4058770485b8c332f1dd4 Mon Sep 17 00:00:00 2001 From: "Alan T. DeKok" Date: Mon, 6 Jan 2025 18:44:47 -0500 Subject: [PATCH] add callback to parse protocol-specific data types --- src/lib/util/dict.h | 2 ++ src/lib/util/dict_tokenize.c | 12 ++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/lib/util/dict.h b/src/lib/util/dict.h index 8d66cf2580..ca9b408efe 100644 --- a/src/lib/util/dict.h +++ b/src/lib/util/dict.h @@ -304,6 +304,7 @@ typedef enum { } fr_dict_attr_err_t; typedef bool (*fr_dict_attr_valid_func_t)(fr_dict_attr_t *da); +typedef bool (*fr_dict_attr_type_parse_t)(fr_type_t *type, fr_dict_attr_flags_t *flags, char const *name); /* * Forward declarations to avoid circular references. @@ -449,6 +450,7 @@ typedef struct { ///< Called when comparing attributes by their fields. } flags; + fr_dict_attr_type_parse_t type_parse; //!< parse unknown type names fr_dict_attr_valid_func_t valid; //!< Validation function to ensure that ///< new attributes are valid. } attr; diff --git a/src/lib/util/dict_tokenize.c b/src/lib/util/dict_tokenize.c index 03c2d4178f..8501728dc3 100644 --- a/src/lib/util/dict_tokenize.c +++ b/src/lib/util/dict_tokenize.c @@ -435,8 +435,16 @@ static int dict_process_type_field(dict_tokenize_ctx_t *dctx, char const *name, */ type = fr_type_from_str(name); if (fr_type_is_null(type)) { - fr_strerror_printf("Unknown data type '%s'", name); - return -1; + fr_dict_attr_t *da = *da_p; + + if (!da->dict->proto->attr.type_parse) { + fr_strerror_printf("Unknown data type '%s'", name); + return -1; + } + + if (!da->dict->proto->attr.type_parse(&type, &da->flags, name)) { + return -1; + } } return dict_attr_type_init(da_p, type); -- 2.47.3