]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
xlat: Expose the protocol xlat registraiton function
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Thu, 15 Jun 2023 15:17:11 +0000 (11:17 -0400)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Thu, 15 Jun 2023 15:17:11 +0000 (11:17 -0400)
src/lib/unlang/xlat.h
src/lib/unlang/xlat_builtin.c

index f9aba933c28c57d6df950971f4a622ff2d4f5585..3d41debe192f3985a44b741919ce66bad6834587 100644 (file)
@@ -502,6 +502,7 @@ xlat_action_t       unlang_xlat_yield(request_t *request,
 /*
  *     xlat_builtin.c
  */
+int            xlat_protocols_register(void);
 int            xlat_init(void);
 void           xlat_free(void);
 
index d9e909e234b04d6b41afd7390c6c36fe76a06710..d9076f51d4cd97ea4682e740ddb7d44b77cf187d 100644 (file)
@@ -3191,6 +3191,9 @@ static int xlat_protocol_register(fr_dict_t const *dict)
        if (tp_decode) {
                snprintf(buffer, sizeof(buffer), "%s.decode", name);
 
+               /* May be called multiple times, so just skip protocols we've already registered */
+               if (xlat_func_find(buffer, -1)) return 1;
+
                if (unlikely((xlat = xlat_func_register(NULL, buffer, protocol_decode_xlat, FR_TYPE_UINT32)) == NULL)) return -1;
                xlat_func_args_set(xlat, protocol_decode_xlat_args);
                /* coverity[suspicious_sizeof] */
@@ -3206,6 +3209,8 @@ static int xlat_protocol_register(fr_dict_t const *dict)
        if (tp_encode) {
                snprintf(buffer, sizeof(buffer), "%s.encode", name);
 
+               if (xlat_func_find(buffer, -1)) return 1;
+
                if (unlikely((xlat = xlat_func_register(NULL, buffer, protocol_encode_xlat, FR_TYPE_OCTETS)) == NULL)) return -1;
                xlat_func_args_set(xlat, protocol_encode_xlat_args);
                /* coverity[suspicious_sizeof] */
@@ -3216,7 +3221,9 @@ static int xlat_protocol_register(fr_dict_t const *dict)
        return 0;
 }
 
-static int xlat_protocol_init(void)
+/** Register xlats for any loaded dictionaries
+ */
+int xlat_protocols_register(void)
 {
        fr_dict_t *dict;
        fr_dict_global_ctx_iter_t iter;