bsdcontrol.rb/ext/hbsdctl.rb/context.c

68 lines
1.7 KiB
C

#include <ruby.h>
#include <libhbsdcontrol.h>
#include "context.h"
#include "glue.h"
static int FLAGS = HBSDCTRL_FEATURE_STATE_FLAG_NONE;
static const char *NAMESPACE = LIBHBSDCONTROL_DEFAULT_NAMESPACE;
static void bsdcontrol_context_free(struct bsdcontrol_ctx_t *);
VALUE
bsdcontrol_context_alloc(VALUE klass)
{
hbsdctrl_ctx_t *ctx;
struct bsdcontrol_ctx_t *rbctx;
ctx = hbsdctrl_ctx_new(FLAGS, NAMESPACE);
rbctx = calloc(1, sizeof(struct bsdcontrol_ctx_t));
if (ctx == NULL || rbctx == NULL)
{
rb_raise(rb_eRuntimeError, "...");
}
rbctx->ctx = ctx;
return Data_Wrap_Struct(klass, NULL, bsdcontrol_context_free, rbctx);
}
static void
bsdcontrol_context_free(struct bsdcontrol_ctx_t *rbctx)
{
hbsdctrl_ctx_free(&rbctx->ctx);
free(rbctx);
}
/*
* BSD::Control::Context#available_features
* BSD::Control.available_features
* BSD::Control::Feature.available
*/
VALUE
bsdcontrol_context_available_features(VALUE self)
{
VALUE rb_mBSD = rb_const_get(rb_cObject, rb_intern("BSD")),
rb_mControl = rb_const_get(rb_mBSD, rb_intern("Control")),
rb_cFeature = rb_const_get(rb_mControl, rb_intern("Feature")),
feature = 0, features = rb_ary_new();
hbsdctrl_ctx_t *ctx;
char **name;
ctx = bsdcontrol_unwrap(self);
name = hbsdctrl_ctx_all_feature_names(ctx);
while (*name != NULL)
{
feature = rb_funcall(
rb_cFeature, rb_intern("new"), 2, rb_str_new2(*name), self);
rb_ary_push(features, feature);
name++;
}
return features;
}
/*
* BSD::Control::Context#library_version
* BSD::Control.library_version
*/
VALUE
bsdcontrol_context_library_version(VALUE self)
{
hbsdctrl_ctx_t *ctx;
ctx = bsdcontrol_unwrap(self);
return ULONG2NUM(ctx->hc_version);
}