From: Nick Porter Date: Mon, 9 Jun 2025 15:47:47 +0000 (+0100) Subject: Add `keys` method to mruby PairList X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=eb031d56955aae8dc943366281b39b4e1fd771cc;p=thirdparty%2Ffreeradius-server.git Add `keys` method to mruby PairList To fetch a list of child attributes --- diff --git a/src/modules/rlm_mruby/mruby.c b/src/modules/rlm_mruby/mruby.c index 2acf107b153..a881f5e9426 100644 --- a/src/modules/rlm_mruby/mruby.c +++ b/src/modules/rlm_mruby/mruby.c @@ -184,6 +184,26 @@ static mrb_value mruby_pair_init(mrb_state *mrb, mrb_value self) return self; } +/** Fetch the list of children of a list + * + */ +static mrb_value mruby_pair_list_keys(mrb_state *mrb, mrb_value self) +{ + mruby_pair_t *pair; + mrb_value keys, key; + fr_pair_t *vp = NULL; + + pair = (mruby_pair_t *)DATA_PTR(self); + if (!pair) mrb_raise(mrb, E_RUNTIME_ERROR, "Failed to retrieve C data"); + + keys = mrb_ary_new(mrb); + for (vp = fr_pair_list_head(&pair->vp->vp_group); vp; vp = fr_pair_list_next(&pair->vp->vp_group, vp)) { + key = mrb_str_new(mrb, vp->da->name, strlen(vp->da->name)); + mrb_ary_push(mrb, keys, key); + } + return keys; +} + struct RClass *mruby_pair_list_class(mrb_state *mrb, struct RClass *parent) { struct RClass *pair_list; @@ -192,6 +212,7 @@ struct RClass *mruby_pair_list_class(mrb_state *mrb, struct RClass *parent) MRB_SET_INSTANCE_TT(pair_list, MRB_TT_DATA); mrb_define_method(mrb, pair_list, "initialize", mruby_pair_init, MRB_ARGS_ARG(5,1)); + mrb_define_method(mrb, pair_list, "keys", mruby_pair_list_keys, MRB_ARGS_REQ(0)); return pair_list; }