diff options
author | Tobias Brunner <tobias@strongswan.org> | 2008-08-27 07:35:20 +0000 |
---|---|---|
committer | Tobias Brunner <tobias@strongswan.org> | 2008-08-27 07:35:20 +0000 |
commit | ca4f63383c8940660bed6ec69069bd9923a02227 (patch) | |
tree | 70e56b7ed07f20e99368a94ebdfe23992957079e /src | |
parent | 9f9d6ece398c6b1dedd6fadedca5f876d170c793 (diff) | |
download | strongswan-ca4f63383c8940660bed6ec69069bd9923a02227.tar.bz2 strongswan-ca4f63383c8940660bed6ec69069bd9923a02227.tar.xz |
* guest#running?
* guest?, iface? (also Guest.include? resp. guest.include?)
* easy accessors for guests and ifaces (Guest.sun instead of Guest["sun"] and guest.eth0 instead of guest["eth0"])
* if a block is given for iface#add or iface#del then the change is only temporary while executing the block and gets reverted afterwards
Diffstat (limited to 'src')
-rw-r--r-- | src/dumm/Makefile.am | 3 | ||||
-rw-r--r-- | src/dumm/ext/dumm.c | 86 | ||||
-rw-r--r-- | src/dumm/ext/lib/dumm.rb | 21 | ||||
-rw-r--r-- | src/dumm/ext/lib/dumm/guest.rb | 40 | ||||
-rw-r--r-- | src/dumm/guest.c | 1 |
5 files changed, 139 insertions, 12 deletions
diff --git a/src/dumm/Makefile.am b/src/dumm/Makefile.am index d82d5f5fc..11d65bba9 100644 --- a/src/dumm/Makefile.am +++ b/src/dumm/Makefile.am @@ -1,4 +1,5 @@ -EXTRA_DIST = ext/dumm.c ext/extconf.rb ext/README +EXTRA_DIST = ext/dumm.c ext/extconf.rb ext/README \ + ext/lib/dumm.rb ext/lib/dumm/guest.rb lib_LTLIBRARIES = libdumm.la ipsec_PROGRAMS = dumm irdumm diff --git a/src/dumm/ext/dumm.c b/src/dumm/ext/dumm.c index 6a34df967..3322c77da 100644 --- a/src/dumm/ext/dumm.c +++ b/src/dumm/ext/dumm.c @@ -87,14 +87,18 @@ static void sigchld_handler(int signal, siginfo_t *info, void* ptr) enumerator->destroy(enumerator); } + + /** * Guest bindings */ -static VALUE guest_get(VALUE class, VALUE key) +static VALUE guest_find(VALUE class, VALUE key) { enumerator_t *enumerator; guest_t *guest, *found = NULL; - + if (TYPE(key) == T_SYMBOL) { + key = rb_convert_type(key, T_STRING, "String", "to_s"); + } enumerator = dumm->create_guest_enumerator(dumm); while (enumerator->enumerate(enumerator, &guest)) { @@ -107,11 +111,26 @@ static VALUE guest_get(VALUE class, VALUE key) enumerator->destroy(enumerator); if (!found) { - rb_raise(rb_eRuntimeError, "guest not found"); + return Qnil; } return Data_Wrap_Struct(class, NULL, NULL, found); } +static VALUE guest_get(VALUE class, VALUE key) +{ + VALUE guest = guest_find(class, key); + if (NIL_P(guest)) + { + rb_raise(rb_eRuntimeError, "guest not found"); + } + return guest; +} + +static VALUE guest_exist(VALUE class, VALUE key) +{ + return NIL_P(guest_find(class, key)) ? Qfalse : Qtrue; +} + static VALUE guest_each(int argc, VALUE *argv, VALUE class) { enumerator_t *enumerator; @@ -174,6 +193,14 @@ static VALUE guest_stop(VALUE self) return self; } +static VALUE guest_running(VALUE self) +{ + guest_t *guest; + + Data_Get_Struct(self, guest_t, guest); + return guest->get_pid(guest) ? Qtrue : Qfalse; +} + static void exec_cb(void *data, char *buf) { rb_yield(rb_str_new2(buf)); @@ -209,12 +236,14 @@ static VALUE guest_add_iface(VALUE self, VALUE name) return Data_Wrap_Struct(rbc_iface, NULL, NULL, iface); } -static VALUE guest_get_iface(VALUE self, VALUE key) +static VALUE guest_find_iface(VALUE self, VALUE key) { enumerator_t *enumerator; iface_t *iface, *found = NULL; guest_t *guest; - + if (TYPE(key) == T_SYMBOL) { + key = rb_convert_type(key, T_STRING, "String", "to_s"); + } Data_Get_Struct(self, guest_t, guest); enumerator = guest->create_iface_enumerator(guest); while (enumerator->enumerate(enumerator, &iface)) @@ -228,11 +257,26 @@ static VALUE guest_get_iface(VALUE self, VALUE key) enumerator->destroy(enumerator); if (!found) { - rb_raise(rb_eRuntimeError, "interface not found"); + return Qnil; } return Data_Wrap_Struct(rbc_iface, NULL, NULL, iface); } +static VALUE guest_get_iface(VALUE self, VALUE key) +{ + VALUE iface = guest_find_iface(self, key); + if (NIL_P(iface)) + { + rb_raise(rb_eRuntimeError, "interface not found"); + } + return iface; +} + +static VALUE guest_exist_iface(VALUE self, VALUE key) +{ + return NIL_P(guest_find_iface(self, key)) ? Qfalse : Qtrue; +} + static VALUE guest_each_iface(int argc, VALUE *argv, VALUE self) { enumerator_t *enumerator; @@ -265,19 +309,26 @@ static VALUE guest_delete(VALUE self) static void guest_init() { rbc_guest = rb_define_class_under(rbm_dumm , "Guest", rb_cObject); + rb_include_module(rb_class_of(rbc_guest), rb_mEnumerable); + rb_include_module(rbc_guest, rb_mEnumerable); + rb_define_singleton_method(rbc_guest, "[]", guest_get, 1); rb_define_singleton_method(rbc_guest, "each", guest_each, -1); rb_define_singleton_method(rbc_guest, "new", guest_new, 4); + rb_define_singleton_method(rbc_guest, "include?", guest_exist, 1); + rb_define_singleton_method(rbc_guest, "guest?", guest_exist, 1); + rb_define_method(rbc_guest, "to_s", guest_to_s, 0); rb_define_method(rbc_guest, "start", guest_start, 0); rb_define_method(rbc_guest, "stop", guest_stop, 0); + rb_define_method(rbc_guest, "running?", guest_running, 0); rb_define_method(rbc_guest, "exec", guest_exec, 1); rb_define_method(rbc_guest, "add", guest_add_iface, 1); rb_define_method(rbc_guest, "[]", guest_get_iface, 1); rb_define_method(rbc_guest, "each", guest_each_iface, -1); + rb_define_method(rbc_guest, "include?", guest_exist_iface, 1); + rb_define_method(rbc_guest, "iface?", guest_exist_iface, 1); rb_define_method(rbc_guest, "delete", guest_delete, 0); - rb_include_module(rb_class_of(rbc_guest), rb_mEnumerable); - rb_include_module(rbc_guest, rb_mEnumerable); } /** @@ -376,14 +427,16 @@ static VALUE bridge_delete(VALUE self) static void bridge_init() { rbc_bridge = rb_define_class_under(rbm_dumm , "Bridge", rb_cObject); + rb_include_module(rb_class_of(rbc_bridge), rb_mEnumerable); + rb_include_module(rbc_bridge, rb_mEnumerable); + rb_define_singleton_method(rbc_bridge, "[]", bridge_get, 1); rb_define_singleton_method(rbc_bridge, "each", bridge_each, -1); rb_define_singleton_method(rbc_bridge, "new", bridge_new, 1); + rb_define_method(rbc_bridge, "to_s", bridge_to_s, 0); rb_define_method(rbc_bridge, "each", bridge_each_iface, -1); rb_define_method(rbc_bridge, "delete", bridge_delete, 0); - rb_include_module(rb_class_of(rbc_bridge), rb_mEnumerable); - rb_include_module(rbc_bridge, rb_mEnumerable); } /** @@ -438,8 +491,13 @@ static VALUE iface_add_addr(VALUE self, VALUE name) Data_Get_Struct(self, iface_t, iface); if (!iface->add_address(iface, addr)) { + addr->destroy(addr); rb_raise(rb_eRuntimeError, "adding address failed"); } + if (rb_block_given_p()) { + rb_yield(self); + iface->delete_address(iface, addr); + } addr->destroy(addr); return self; } @@ -482,6 +540,10 @@ static VALUE iface_del_addr(VALUE self, VALUE vaddr) addr->destroy(addr); rb_raise(rb_eRuntimeError, "address not found"); } + if (rb_block_given_p()) { + rb_yield(self); + iface->add_address(iface, addr); + } addr->destroy(addr); return self; } @@ -500,6 +562,8 @@ static VALUE iface_delete(VALUE self) static void iface_init() { rbc_iface = rb_define_class_under(rbm_dumm , "Iface", rb_cObject); + rb_include_module(rbc_iface, rb_mEnumerable); + rb_define_method(rbc_iface, "to_s", iface_to_s, 0); rb_define_method(rbc_iface, "connect", iface_connect, 1); rb_define_method(rbc_iface, "disconnect", iface_disconnect, 0); @@ -507,7 +571,6 @@ static void iface_init() rb_define_method(rbc_iface, "del", iface_del_addr, 1); rb_define_method(rbc_iface, "each", iface_each_addr, -1); rb_define_method(rbc_iface, "delete", iface_delete, 0); - rb_include_module(rbc_iface, rb_mEnumerable); } static VALUE template_load(VALUE class, VALUE name) @@ -531,6 +594,7 @@ static VALUE template_unload(VALUE class) static void template_init() { rbc_template = rb_define_class_under(rbm_dumm , "Template", rb_cObject); + rb_define_singleton_method(rbc_template, "load", template_load, 1); rb_define_singleton_method(rbc_template, "unload", template_unload, 0); } diff --git a/src/dumm/ext/lib/dumm.rb b/src/dumm/ext/lib/dumm.rb new file mode 100644 index 000000000..719af7658 --- /dev/null +++ b/src/dumm/ext/lib/dumm.rb @@ -0,0 +1,21 @@ +=begin + Copyright (C) 2008 Tobias Brunner + Hochschule fuer Technik Rapperswil + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2 of the License, or (at your + option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + $Id$ +=end + +require 'dumm.so' +require 'dumm/guest' + +# vim:sw=2 ts=2 et diff --git a/src/dumm/ext/lib/dumm/guest.rb b/src/dumm/ext/lib/dumm/guest.rb new file mode 100644 index 000000000..8485d1a08 --- /dev/null +++ b/src/dumm/ext/lib/dumm/guest.rb @@ -0,0 +1,40 @@ +=begin + Copyright (C) 2008 Tobias Brunner + Hochschule fuer Technik Rapperswil + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2 of the License, or (at your + option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + $Id$ +=end + +module Dumm + class Guest + # accessor for guests + # e.g. Guest.sun instead of Guest["sun"] + def self.method_missing(id, *args) + unless guest? id + super(id, *args) + end + Guest[id] + end + + # accessor for interfaces + # e.g. guest.eth0 instead of guest["eth0"] + def method_missing(id, *args) + unless iface? id + super(id, *args) + end + self[id] + end + end +end + +# vim:sw=2 ts=2 et diff --git a/src/dumm/guest.c b/src/dumm/guest.c index c1729d907..bf0d88dde 100644 --- a/src/dumm/guest.c +++ b/src/dumm/guest.c @@ -214,6 +214,7 @@ static void stop(private_guest_t *this, idle_function_t idle) } } unlinkat(this->dir, PID_FILE, 0); + this->pid = 0; } } |