]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
add function to export aliases
authorAlan T. DeKok <aland@freeradius.org>
Sat, 22 Mar 2025 08:07:16 +0000 (15:07 +0700)
committerAlan T. DeKok <aland@freeradius.org>
Sat, 22 Mar 2025 08:07:16 +0000 (15:07 +0700)
src/lib/util/dict.h
src/lib/util/dict_print.c

index c8c6fc63de4bc84116fcccd103f272f1a60fbecb..a9f19a9a518f8ad99fadb08ea24235108f62fb9b 100644 (file)
@@ -685,6 +685,8 @@ void                        fr_dict_attr_debug(FILE *fp, fr_dict_attr_t const *da);
 void                   fr_dict_debug(FILE *fp, fr_dict_t const *dict);
 
 void                   fr_dict_export(FILE *fp, fr_dict_t const *dict);
+
+void                   fr_dict_alias_export(FILE *fp, fr_dict_attr_t const *parent);
 /** @} */
 
 /** @name Attribute lineage
index d2cb1e54ed7fa41c625d9a91228a4dc19c8d2d01..c614652478fdfdc7ae3d2e631565bd65d5453e7e 100644 (file)
@@ -277,10 +277,10 @@ static int dict_attr_export(fr_dict_attr_t const *da, void *uctx)
                                      NULL, da, false);
        (void) fr_dict_attr_oid_print(&FR_SBUFF_OUT(ctx->oid, sizeof(ctx->oid)),
                                      NULL, da, true);
+
        *ctx->flags = 0;        /* some attributes don't have flags */
        fr_dict_attr_flags_print(&FR_SBUFF_OUT(ctx->flags, sizeof(ctx->flags)),
                                 ctx->dict, da->type, &da->flags);
-
        fprintf(ctx->fp, "ATTRIBUTE\t%-40s\t%-20s\t%s\t%s\n",
                ctx->prefix,
                ctx->oid,
@@ -309,3 +309,38 @@ void fr_dict_export(FILE *fp, fr_dict_t const *dict)
 {
        fr_dict_attr_export(fp, fr_dict_root(dict));
 }
+
+void fr_dict_alias_export(FILE *fp, fr_dict_attr_t const *parent)
+{
+       fr_hash_table_t         *namespace;
+       fr_hash_iter_t          iter;
+       fr_dict_attr_t          *da;
+       char buffer             [256];
+
+       namespace = dict_attr_namespace(parent);
+       if (!namespace) {
+               fprintf(fp, "%s does not have namespace\n", parent->name);
+               return;
+       }
+
+       for (da = fr_hash_table_iter_init(namespace, &iter);
+            da;
+            da = fr_hash_table_iter_next(namespace, &iter)) {
+               fr_dict_attr_t const *ref;
+
+               if (!da->flags.is_alias) continue;
+
+               if (!fr_type_is_leaf(da->type)) continue;
+
+               ref = fr_dict_attr_ref(da);
+               if (!ref) continue;
+
+               if (da->depth == ref->depth) continue;
+
+               (void) fr_dict_attr_oid_print(&FR_SBUFF_OUT(buffer, sizeof(buffer)),
+                                             NULL, ref, false);
+
+               fprintf(fp, "%-40s\t%s\n", da->name, buffer);
+       }
+}
+