aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMartin Willi <martin@strongswan.org>2009-04-07 14:22:02 +0000
committerMartin Willi <martin@strongswan.org>2009-04-07 14:22:02 +0000
commitc4087a8e7092695f9b0e0eaec3fa585d2019f889 (patch)
treef73028f2ec62d3025d00bf25a14dec3aee73577f /src
parent28970d596764450a939bb87f2986f748ff696a35 (diff)
downloadstrongswan-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.c65
-rw-r--r--src/dumm/ext/lib/dumm.rb13
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