--- a/ext/bsdjail.c Thu Dec 25 07:33:20 2008 +0000
+++ b/ext/bsdjail.c Thu Dec 25 08:35:46 2008 +0000
@@ -1,6 +1,9 @@
/*
+ *
* bsdjail.c - Ruby jparallel
* $Id$
+ *
+ * vim: set nosta noet ts=4 sw=4:
*
* Authors:
* * Michael Granger <ged@FaerieMUD.org>
@@ -15,15 +18,7 @@
*
*/
-#include <ruby.h>
-#include <intern.h>
-
-#include <stdio.h>
-#include <sys/param.h>
-#include <sys/jail.h>
-#include <sys/types.h>
-#include <unistd.h>
-
+#include "bsdjail.h"
VALUE rbjail_mBSD;
VALUE rbjail_cBSDJail;
@@ -38,93 +33,6 @@
};
*/
-/*
- * Allocation function
- */
-static jail *
-rbjail_jail_alloc()
-{
- jail *ptr = ALLOC( jail );
-
- ptr->version = 0;
- ptr->path = NULL;
- ptr->hostname = NULL;
- ptr->ip_number = 0;
-
- debugMsg(( "Initialized a jail pointer <%p>", ptr ));
- return ptr;
-}
-
-
-/*
- * GC Free function
- */
-static void
-rbjail_jail_gc_free( ptr )
- jail *ptr;
-{
- if ( ptr ) {
- ptr->path = NULL;
- ptr->hostname = NULL;
- xfree( ptr );
- }
-
- else {
- debugMsg(( "Not freeing an uninitialized rlink_SENTENCE" ));
- }
-}
-
-
-/*
- * Object validity checker. Returns the data pointer.
- */
-static rlink_SENTENCE *
-check_sentence( self )
- VALUE self;
-{
- debugMsg(( "Checking a LinkParser::Sentence object (%d).", self ));
- Check_Type( self, T_DATA );
-
- if ( !IsSentence(self) ) {
- rb_raise( rb_eTypeError, "wrong argument type %s (expected LinkParser::Sentence)",
- rb_class2name(CLASS_OF( self )) );
- }
-
- return DATA_PTR( self );
-}
-
-
-/*
- * Fetch the data pointer and check it for sanity.
- */
-static rlink_SENTENCE *
-get_sentence( self )
- VALUE self;
-{
- rlink_SENTENCE *ptr = check_sentence( self );
-
- debugMsg(( "Fetching a Sentence (%p).", ptr ));
- if ( !ptr )
- rb_raise( rb_eRuntimeError, "uninitialized Sentence" );
-
- return ptr;
-}
-
-
-/*
- * Publicly-usable sentence-fetcher
- */
-rlink_SENTENCE *
-rlink_get_sentence( self )
- VALUE self;
-{
- return get_sentence( self );
-}
-
-
-
-
-
static void
rbjail_do_jail_attach( int jid )
@@ -137,12 +45,12 @@
static VALUE
rbjail_attach_block( int jid )
{
- int pid;
+ int pid;
- rb_secure(2);
+ rb_secure(2);
- fflush(stdout);
- fflush(stderr);
+ fflush(stdout);
+ fflush(stderr);
switch ( pid = fork() ) {
case 0:
@@ -170,65 +78,65 @@
{
VALUE jidnum, rval;
int jid;
-
+
rb_scan_args( argc, argv, "1", &jidnum );
jid = NUM2INT( jidnum );
if ( rb_block_given_p() ) {
rval = rbjail_attach_block( jid );
}
-
+
else {
rbjail_do_jail_attach( jid );
rval = Qtrue;
}
-
+
return rval;
}
static VALUE
- rbjail_list( VALUE self )
+rbjail_list( VALUE self )
{
- struct kinfo_prison *sxp, *xp;
+ struct xprison *xp;
struct in_addr in;
size_t i, len;
- if (sysctlbyname("jail.list", NULL, &len, NULL, 0) == -1)
- rb_sys_fail("sysctlbyname(): jail.list");
-
- xp = ALLOCA_N( kinfo_prison, 1 );
+ /* Get the size of the xprison and allocate memory to it. */
+ if ( sysctlbyname("security.jail.list", NULL, &len, NULL, 0) == -1 )
+ rb_sys_fail("sysctlbyname(): security.jail.list");
+ xp = ALLOCA_N( struct xprison, 1 );
- if (sysctlbyname("jail.list", xp, &len, NULL, 0) == -1) {
- rb_sys_fail("sysctlbyname(): jail.list");
+ /* Get and sanity check the current prison list */
+ if ( sysctlbyname("security.jail.list", xp, &len, NULL, 0) == -1 ) {
+ rb_sys_fail("sysctlbyname(): security.jail.list");
}
-
- if (len < sizeof(*xp) || len % sizeof(*xp) ||
- xp->pr_version != KINFO_PRISON_VERSION)
+ if ( len < sizeof(*xp) || len % sizeof(*xp) ||
+ xp->pr_version != XPRISON_VERSION )
rb_fatal("Kernel and userland out of sync");
len /= sizeof(*xp);
printf(" JID IP Address Hostname Path\n");
- for (i = 0; i < len; i++) {
- in.s_addr = ntohl(xp->pr_ip);
+ for ( i = 0; i < len; i++ ) {
+ in.s_addr = ntohl( xp->pr_ip );
printf("%6d %-15.15s %-29.29s %.74s\n",
- xp->pr_id, inet_ntoa(in), xp->pr_host, xp->pr_path);
+ xp->pr_id, inet_ntoa(in), xp->pr_host, xp->pr_path);
xp++;
}
- free(sxp);
- exit(0);
-
+ return self;
}
void
Init_bsdjail( void )
{
rbjail_mBSD = rb_define_module( "BSD" );
- rbjail_cBSDJail = rb_define_class_under( rbjail_mBSD, "Jail" );
+ rbjail_cBSDJail = rb_define_class_under( rbjail_mBSD, "Jail", rb_cObject );
rb_define_singleton_method( rbjail_cBSDJail, "list", rbjail_list, 0 );
- rb_define_alloc_function( rbjail_cBSDJail, )
-
+
+ /*
+ rb_define_alloc_function( rbjail_cBSDJail, );
+
rb_define_method( rbjail_cBSDJail, "attach", rbjail_attach, -1 );
-
+ */
}