aboutsummaryrefslogtreecommitdiffstats
path: root/src/dumm/dumm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/dumm/dumm.c')
-rw-r--r--src/dumm/dumm.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/dumm/dumm.c b/src/dumm/dumm.c
index bc690c515..b8f0e0f2c 100644
--- a/src/dumm/dumm.c
+++ b/src/dumm/dumm.c
@@ -41,6 +41,38 @@ static guest_t* create_guest(private_dumm_t *this, char *name, char *master, int
static iterator_t* create_guest_iterator(private_dumm_t *this)
{
return this->guests->create_iterator(this->guests, TRUE);
+}
+
+/**
+ * Implementation of dumm_t.sigchild_handler.
+ */
+static void sigchild_handler(private_dumm_t *this, siginfo_t *info)
+{
+ switch (info->si_code)
+ {
+ case CLD_EXITED:
+ case CLD_KILLED:
+ case CLD_DUMPED:
+ case CLD_STOPPED:
+ {
+ iterator_t *iterator;
+ guest_t *guest;
+
+ iterator = this->guests->create_iterator(this->guests, TRUE);
+ while (iterator->iterate(iterator, (void**)&guest))
+ {
+ if (guest->get_pid(guest) == info->si_pid)
+ {
+ guest->sigchild(guest);
+ break;
+ }
+ }
+ iterator->destroy(iterator);
+ break;
+ }
+ default:
+ break;
+ }
}
static void destroy(private_dumm_t *this)
@@ -67,6 +99,7 @@ dumm_t *dumm_create()
{
private_dumm_t *this = malloc_thing(private_dumm_t);
+ this->public.sigchild_handler = (void(*)(dumm_t*, siginfo_t *info))sigchild_handler;
this->public.create_guest = (void*)create_guest;
this->public.create_guest_iterator = (void*)create_guest_iterator;
this->public.destroy = (void*)destroy;