Organize C functions by module / class
This commit is contained in:
parent
073c7f465b
commit
f95ea4e8f4
5 changed files with 120 additions and 97 deletions
44
ext/hbsdctl.rb/feature.c
Normal file
44
ext/hbsdctl.rb/feature.c
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
#include <libhbsdcontrol.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include "include/feature.h"
|
||||||
|
static VALUE get_rb_eError(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* BSD::Control::Feature#set!
|
||||||
|
**/
|
||||||
|
VALUE
|
||||||
|
feature_set(VALUE self, VALUE path, VALUE state)
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
char *cpath;
|
||||||
|
VALUE name;
|
||||||
|
|
||||||
|
if (getuid() != 0) {
|
||||||
|
rb_raise(get_rb_eError(), "This operation requires root privileges.");
|
||||||
|
}
|
||||||
|
Check_Type(path, T_STRING);
|
||||||
|
Check_Type(state, T_FIXNUM);
|
||||||
|
cpath = RSTRING_PTR(path);
|
||||||
|
name = rb_funcall(self, rb_intern("name"), 0);
|
||||||
|
Check_Type(name, T_STRING);
|
||||||
|
r = hbsdcontrol_set_feature_state(
|
||||||
|
cpath,
|
||||||
|
RSTRING_PTR(name),
|
||||||
|
NUM2INT(state)
|
||||||
|
);
|
||||||
|
if (r == 0) {
|
||||||
|
return (Qtrue);
|
||||||
|
} else {
|
||||||
|
rb_raise(get_rb_eError(), "hbsdcontrol_set_feature_state failed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
get_rb_eError(void)
|
||||||
|
{
|
||||||
|
VALUE rb_mBSD = rb_const_get(rb_cObject, rb_intern("BSD")),
|
||||||
|
rb_mControl = rb_const_get(rb_mBSD, rb_intern("Control")),
|
||||||
|
rb_eError = rb_const_get(rb_mControl, rb_intern("Error"));
|
||||||
|
return (rb_eError);
|
||||||
|
}
|
68
ext/hbsdctl.rb/ffi.c
Normal file
68
ext/hbsdctl.rb/ffi.c
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
#include <libhbsdcontrol.h>
|
||||||
|
#include <ruby.h>
|
||||||
|
#include "include/ffi.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* BSD::Control::FFI.available_features
|
||||||
|
**/
|
||||||
|
VALUE
|
||||||
|
ffi_available_features(VALUE self)
|
||||||
|
{
|
||||||
|
const struct pax_feature_entry *entry = &pax_features[0];
|
||||||
|
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")),
|
||||||
|
features = rb_ary_new(),
|
||||||
|
feature = 0;
|
||||||
|
|
||||||
|
while (entry->feature != NULL)
|
||||||
|
{
|
||||||
|
feature = rb_funcall(
|
||||||
|
rb_cFeature,
|
||||||
|
rb_intern("new"),
|
||||||
|
3,
|
||||||
|
rb_str_new2(entry->feature),
|
||||||
|
rb_str_new2(entry->extattr[1]),
|
||||||
|
rb_str_new2(entry->extattr[0])
|
||||||
|
);
|
||||||
|
rb_ary_push(features, feature);
|
||||||
|
entry++;
|
||||||
|
}
|
||||||
|
return (features);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* BSD::Control::FFI.reset!
|
||||||
|
**/
|
||||||
|
VALUE
|
||||||
|
ffi_reset(VALUE self, VALUE rb_feature, VALUE rb_path)
|
||||||
|
{
|
||||||
|
VALUE rb_enable_flag, rb_disable_flag;
|
||||||
|
char *enable_flag, *disable_flag, *path;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
rb_enable_flag = rb_funcall(rb_feature, rb_intern("enable"), 0);
|
||||||
|
rb_disable_flag = rb_funcall(rb_feature, rb_intern("disable"), 0);
|
||||||
|
Check_Type(rb_path, T_STRING);
|
||||||
|
Check_Type(rb_enable_flag, T_STRING);
|
||||||
|
Check_Type(rb_disable_flag, T_STRING);
|
||||||
|
path = RSTRING_PTR(rb_path);
|
||||||
|
enable_flag = RSTRING_PTR(rb_enable_flag);
|
||||||
|
disable_flag = RSTRING_PTR(rb_disable_flag);
|
||||||
|
r = hbsdcontrol_extattr_rm_attr(path, disable_flag);
|
||||||
|
r &= hbsdcontrol_extattr_rm_attr(path, enable_flag);
|
||||||
|
return (r == 0 ? Qtrue : Qfalse);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* BSD::Control::FFI.library_version
|
||||||
|
**/
|
||||||
|
VALUE
|
||||||
|
ffi_library_version(VALUE self)
|
||||||
|
{
|
||||||
|
const char *ver;
|
||||||
|
ver = hbsdcontrol_get_version();
|
||||||
|
return (rb_str_new2(ver));
|
||||||
|
}
|
|
@ -1,101 +1,6 @@
|
||||||
#include <ruby.h>
|
#include <ruby.h>
|
||||||
#include <libhbsdcontrol.h>
|
#include "include/ffi.h"
|
||||||
#include <unistd.h>
|
#include "include/feature.h"
|
||||||
|
|
||||||
static VALUE
|
|
||||||
get_rb_eError(void)
|
|
||||||
{
|
|
||||||
VALUE rb_mBSD = rb_const_get(rb_cObject, rb_intern("BSD")),
|
|
||||||
rb_mControl = rb_const_get(rb_mBSD, rb_intern("Control")),
|
|
||||||
rb_eError = rb_const_get(rb_mControl, rb_intern("Error"));
|
|
||||||
return (rb_eError);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static VALUE
|
|
||||||
ffi_library_version(VALUE self)
|
|
||||||
{
|
|
||||||
const char *ver;
|
|
||||||
ver = hbsdcontrol_get_version();
|
|
||||||
return (rb_str_new2(ver));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static VALUE
|
|
||||||
ffi_available_features(VALUE self)
|
|
||||||
{
|
|
||||||
const struct pax_feature_entry *entry = &pax_features[0];
|
|
||||||
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")),
|
|
||||||
features = rb_ary_new(),
|
|
||||||
feature = 0;
|
|
||||||
|
|
||||||
while (entry->feature != NULL)
|
|
||||||
{
|
|
||||||
feature = rb_funcall(
|
|
||||||
rb_cFeature,
|
|
||||||
rb_intern("new"),
|
|
||||||
3,
|
|
||||||
rb_str_new2(entry->feature),
|
|
||||||
rb_str_new2(entry->extattr[1]),
|
|
||||||
rb_str_new2(entry->extattr[0])
|
|
||||||
);
|
|
||||||
rb_ary_push(features, feature);
|
|
||||||
entry++;
|
|
||||||
}
|
|
||||||
return (features);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static VALUE
|
|
||||||
ffi_reset(VALUE self, VALUE rb_feature, VALUE rb_path)
|
|
||||||
{
|
|
||||||
VALUE rb_enable_flag, rb_disable_flag;
|
|
||||||
char *enable_flag, *disable_flag, *path;
|
|
||||||
int r;
|
|
||||||
|
|
||||||
rb_enable_flag = rb_funcall(rb_feature, rb_intern("enable"), 0);
|
|
||||||
rb_disable_flag = rb_funcall(rb_feature, rb_intern("disable"), 0);
|
|
||||||
Check_Type(rb_path, T_STRING);
|
|
||||||
Check_Type(rb_enable_flag, T_STRING);
|
|
||||||
Check_Type(rb_disable_flag, T_STRING);
|
|
||||||
path = RSTRING_PTR(rb_path);
|
|
||||||
enable_flag = RSTRING_PTR(rb_enable_flag);
|
|
||||||
disable_flag = RSTRING_PTR(rb_disable_flag);
|
|
||||||
r = hbsdcontrol_extattr_rm_attr(path, disable_flag);
|
|
||||||
r &= hbsdcontrol_extattr_rm_attr(path, enable_flag);
|
|
||||||
return (r == 0 ? Qtrue : Qfalse);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static VALUE
|
|
||||||
feature_set(VALUE self, VALUE path, VALUE state)
|
|
||||||
{
|
|
||||||
int r;
|
|
||||||
char *cpath;
|
|
||||||
VALUE name;
|
|
||||||
|
|
||||||
if (getuid() != 0) {
|
|
||||||
rb_raise(get_rb_eError(), "This operation requires root privileges.");
|
|
||||||
}
|
|
||||||
Check_Type(path, T_STRING);
|
|
||||||
Check_Type(state, T_FIXNUM);
|
|
||||||
cpath = RSTRING_PTR(path);
|
|
||||||
name = rb_funcall(self, rb_intern("name"), 0);
|
|
||||||
Check_Type(name, T_STRING);
|
|
||||||
r = hbsdcontrol_set_feature_state(
|
|
||||||
cpath,
|
|
||||||
RSTRING_PTR(name),
|
|
||||||
NUM2INT(state)
|
|
||||||
);
|
|
||||||
if (r == 0) {
|
|
||||||
return (Qtrue);
|
|
||||||
} else {
|
|
||||||
rb_raise(get_rb_eError(), "hbsdcontrol_set_feature_state failed");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Init_hbsdctl(void)
|
Init_hbsdctl(void)
|
||||||
|
|
2
ext/hbsdctl.rb/include/feature.h
Normal file
2
ext/hbsdctl.rb/include/feature.h
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
#include <ruby.h>
|
||||||
|
VALUE feature_set(VALUE, VALUE, VALUE);
|
4
ext/hbsdctl.rb/include/ffi.h
Normal file
4
ext/hbsdctl.rb/include/ffi.h
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
#include <ruby.h>
|
||||||
|
VALUE ffi_library_version(VALUE);
|
||||||
|
VALUE ffi_available_features(VALUE);
|
||||||
|
VALUE ffi_reset(VALUE, VALUE, VALUE);
|
Loading…
Reference in a new issue