diff options
author | Martin Willi <martin@strongswan.org> | 2009-04-07 14:22:02 +0000 |
---|---|---|
committer | Martin Willi <martin@strongswan.org> | 2009-04-07 14:22:02 +0000 |
commit | c4087a8e7092695f9b0e0eaec3fa585d2019f889 (patch) | |
tree | f73028f2ec62d3025d00bf25a14dec3aee73577f /src | |
parent | 28970d596764450a939bb87f2986f748ff696a35 (diff) | |
download | strongswan-c4087a8e7092695f9b0e0eaec3fa585d2019f889.tar.bz2 strongswan-c4087a8e7092695f9b0e0eaec3fa585d2019f889.tar.xz |
added a reset() method to Dumm and each client
identation cleanups
Diffstat (limited to 'src')
-rw-r--r-- | src/dumm/ext/dumm.c | 65 | ||||
-rw-r--r-- | src/dumm/ext/lib/dumm.rb | 13 |
2 files changed, 61 insertions, 17 deletions
diff --git a/src/dumm/ext/dumm.c b/src/dumm/ext/dumm.c index adb89d632..222c57c81 100644 --- a/src/dumm/ext/dumm.c +++ b/src/dumm/ext/dumm.c @@ -24,6 +24,7 @@ #include <library.h> #include <dumm.h> #include <debug.h> +#include <utils/linked_list.h> #undef PACKAGE_NAME #undef PACKAGE_TARNAME @@ -84,8 +85,6 @@ static void sigchld_handler(int signal, siginfo_t *info, void* ptr) enumerator->destroy(enumerator); } - - /** * Guest bindings */ @@ -127,15 +126,15 @@ static VALUE guest_each(int argc, VALUE *argv, VALUE class) { enumerator_t *enumerator; guest_t *guest; - + if (!rb_block_given_p()) - { + { rb_raise(rb_eArgError, "must be called with a block"); } enumerator = dumm->create_guest_enumerator(dumm); while (enumerator->enumerate(enumerator, &guest)) { - rb_yield(Data_Wrap_Struct(class, NULL, NULL, guest)); + rb_yield(Data_Wrap_Struct(class, NULL, NULL, guest)); } enumerator->destroy(enumerator); return class; @@ -285,26 +284,57 @@ static VALUE guest_each_iface(int argc, VALUE *argv, VALUE self) enumerator_t *enumerator; guest_t *guest; iface_t *iface; - + if (!rb_block_given_p()) - { + { rb_raise(rb_eArgError, "must be called with a block"); } Data_Get_Struct(self, guest_t, guest); enumerator = guest->create_iface_enumerator(guest); while (enumerator->enumerate(enumerator, &iface)) { - rb_yield(Data_Wrap_Struct(rbc_iface, NULL, NULL, iface)); + rb_yield(Data_Wrap_Struct(rbc_iface, NULL, NULL, iface)); } enumerator->destroy(enumerator); return self; } +static VALUE guest_reset(VALUE self) +{ + linked_list_t *list; + enumerator_t *enumerator; + guest_t *guest; + iface_t *iface; + + Data_Get_Struct(self, guest_t, guest); + if (!guest->get_pid(guest)) + { + rb_raise(rb_eRuntimeError, "guest is not running"); + } + list = linked_list_create(); + enumerator = guest->create_iface_enumerator(guest); + while (enumerator->enumerate(enumerator, &iface)) + { + list->insert_last(list, iface); + } + enumerator->destroy(enumerator); + while (list->remove_last(list, (void**)&iface) == SUCCESS) + { + guest->destroy_iface(guest, iface); + } + list->destroy(list); + return self; +} + static VALUE guest_delete(VALUE self) { guest_t *guest; Data_Get_Struct(self, guest_t, guest); + if (guest->get_pid(guest)) + { + rb_raise(rb_eRuntimeError, "guest is running"); + } dumm->delete_guest(dumm, guest); return Qnil; } @@ -332,6 +362,7 @@ static void guest_init() rb_define_method(rbc_guest, "each", guest_each_iface, -1); rb_define_method(rbc_guest, "include?", guest_find_iface, 1); rb_define_method(rbc_guest, "iface?", guest_find_iface, 1); + rb_define_method(rbc_guest, "reset", guest_reset, 0); rb_define_method(rbc_guest, "delete", guest_delete, 0); } @@ -364,15 +395,15 @@ static VALUE bridge_each(int argc, VALUE *argv, VALUE class) { enumerator_t *enumerator; bridge_t *bridge; - + if (!rb_block_given_p()) - { + { rb_raise(rb_eArgError, "must be called with a block"); } enumerator = dumm->create_bridge_enumerator(dumm); while (enumerator->enumerate(enumerator, &bridge)) { - rb_yield(Data_Wrap_Struct(class, NULL, NULL, bridge)); + rb_yield(Data_Wrap_Struct(class, NULL, NULL, bridge)); } enumerator->destroy(enumerator); return class; @@ -404,16 +435,16 @@ static VALUE bridge_each_iface(int argc, VALUE *argv, VALUE self) enumerator_t *enumerator; bridge_t *bridge; iface_t *iface; - + if (!rb_block_given_p()) - { + { rb_raise(rb_eArgError, "must be called with a block"); } Data_Get_Struct(self, bridge_t, bridge); enumerator = bridge->create_iface_enumerator(bridge); while (enumerator->enumerate(enumerator, &iface)) { - rb_yield(Data_Wrap_Struct(rbc_iface, NULL, NULL, iface)); + rb_yield(Data_Wrap_Struct(rbc_iface, NULL, NULL, iface)); } enumerator->destroy(enumerator); return self; @@ -512,9 +543,9 @@ static VALUE iface_each_addr(int argc, VALUE *argv, VALUE self) iface_t *iface; host_t *addr; char buf[64]; - + if (!rb_block_given_p()) - { + { rb_raise(rb_eArgError, "must be called with a block"); } Data_Get_Struct(self, iface_t, iface); @@ -522,7 +553,7 @@ static VALUE iface_each_addr(int argc, VALUE *argv, VALUE self) while (enumerator->enumerate(enumerator, &addr)) { snprintf(buf, sizeof(buf), "%H", addr); - rb_yield(rb_str_new2(buf)); + rb_yield(rb_str_new2(buf)); } enumerator->destroy(enumerator); return self; diff --git a/src/dumm/ext/lib/dumm.rb b/src/dumm/ext/lib/dumm.rb index 719af7658..f7d72f5b4 100644 --- a/src/dumm/ext/lib/dumm.rb +++ b/src/dumm/ext/lib/dumm.rb @@ -18,4 +18,17 @@ require 'dumm.so' require 'dumm/guest' +module Dumm + # unload templates, reset all guests and delete bridges + def reset + Template.unload + Guest.each { |guest| + guest.reset if guest.running? + } + Bridge.each { |bridge| + bridge.delete + } + end +end + # vim:sw=2 ts=2 et |