]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Define mruby data types and functions for accessing C data pointers
authorNick Porter <nick@portercomputing.co.uk>
Mon, 9 Jun 2025 15:14:15 +0000 (16:14 +0100)
committerNick Porter <nick@portercomputing.co.uk>
Mon, 9 Jun 2025 15:25:30 +0000 (16:25 +0100)
src/modules/rlm_mruby/mruby.c
src/modules/rlm_mruby/rlm_mruby.h

index 99b63b77557430995b83fa96f1a555785689f6cf..aac88873ce9401fdb3239cb369ba8aa67f51abd9 100644 (file)
@@ -65,3 +65,60 @@ struct RClass *mruby_request_class(mrb_state *mrb, struct RClass *parent)
 
        return request;
 }
+
+/*
+ *     Structures used to identify C data types in mruby pointers
+ */
+static const struct mrb_data_type mruby_inst_type = {
+       .struct_name = "Inst",
+       .dfree = NULL
+};
+
+static const struct mrb_data_type mruby_request_type = {
+       .struct_name = "Request",
+       .dfree = NULL
+};
+
+static const struct mrb_data_type mruby_dict_attr_type = {
+       .struct_name = "DictAttr",
+       .dfree = NULL
+};
+
+static const struct mrb_data_type mruby_value_pair_type = {
+       .struct_name = "ValuePair",
+       .dfree = NULL
+};
+
+static const struct mrb_data_type mruby_ruby_pair_type = {
+       .struct_name = "RubyPair",
+       .dfree = NULL
+};
+
+/*
+ *     Helper functions to return C data type pointers as mruby values
+ */
+mrb_value mruby_inst_object(mrb_state *mrb, struct RClass *klass, rlm_mruby_t const *inst)
+{
+       return mrb_obj_value(Data_Wrap_Struct(mrb, klass, &mruby_inst_type, UNCONST(void *, inst)));
+}
+
+mrb_value mruby_request_object(mrb_state *mrb, struct RClass *klass, request_t *request)
+{
+       return mrb_obj_value(Data_Wrap_Struct(mrb, klass, &mruby_request_type, (void *)request));
+}
+
+mrb_value mruby_dict_attr_object(mrb_state *mrb, struct RClass *klass, fr_dict_attr_t const *da)
+{
+       return mrb_obj_value(Data_Wrap_Struct(mrb, klass, &mruby_dict_attr_type, UNCONST(void *,da)));
+}
+
+mrb_value mruby_value_pair_object(mrb_state *mrb, struct RClass *klass, fr_pair_t *vp)
+{
+       return mrb_obj_value(Data_Wrap_Struct(mrb, klass, &mruby_value_pair_type, (void *)vp));
+}
+
+static mrb_value mruby_ruby_pair_object(mrb_state *mrb, struct RClass *klass, mruby_pair_t *pair)
+{
+       return mrb_obj_value(Data_Wrap_Struct(mrb, klass, &mruby_ruby_pair_type, (void *)pair));
+}
+
index 9b78ce30cca32d5589078a6f37177a3e5eb0f585..328724eb888ec80ef0e88b3b93c780d2478e7f68 100644 (file)
@@ -32,8 +32,11 @@ DIAG_OFF(documentation)
 #include <mruby/numeric.h>
 #include <mruby/string.h>
 #include <mruby/variable.h>
+#include <mruby/data.h>
 DIAG_ON(documentation)
 DIAG_ON(DIAG_UNKNOWN_PRAGMAS)
+#include <freeradius-devel/server/base.h>
+
 typedef struct {
        char const *filename;
        char const *module_name;
@@ -49,3 +52,7 @@ typedef struct {
 } rlm_mruby_t;
 
 struct RClass *mruby_request_class(mrb_state *mrb, struct RClass *parent);
+mrb_value mruby_inst_object(mrb_state *mrb, struct RClass *klass, rlm_mruby_t const *inst);
+mrb_value mruby_request_object(mrb_state *mrb, struct RClass *klass, request_t *request);
+mrb_value mruby_value_pair_object(mrb_state *mrb, struct RClass *klass, fr_pair_t *vp);
+mrb_value mruby_dict_attr_object(mrb_state *mrb, struct RClass *klass, fr_dict_attr_t const *da);