aboutsummaryrefslogtreecommitdiffstats
path: root/src/charon/bus
diff options
context:
space:
mode:
Diffstat (limited to 'src/charon/bus')
-rw-r--r--src/charon/bus/bus.c9
-rw-r--r--src/charon/bus/bus.h5
-rw-r--r--src/charon/bus/listeners/file_logger.c6
-rw-r--r--src/charon/bus/listeners/sys_logger.c6
4 files changed, 19 insertions, 7 deletions
diff --git a/src/charon/bus/bus.c b/src/charon/bus/bus.c
index afed16656..740663d5c 100644
--- a/src/charon/bus/bus.c
+++ b/src/charon/bus/bus.c
@@ -180,7 +180,7 @@ static int get_thread_number(private_bus_t *this)
static void add_listener(private_bus_t *this, bus_listener_t *listener)
{
pthread_mutex_lock(&this->mutex);
- this->listeners->insert_last(this->listeners, (void*)listener);
+ this->listeners->insert_last(this->listeners, listener);
pthread_mutex_unlock(&this->mutex);
}
@@ -301,7 +301,12 @@ static void vsignal(private_bus_t *this, signal_t signal, level_t level,
va_list args_copy;
va_copy(args_copy, args);
- listener->signal(listener, signal, level, thread, ike_sa, format, args_copy);
+ if (!listener->signal(listener, signal, level, thread,
+ ike_sa, format, args_copy))
+ {
+ /* unregister listener if requested */
+ iterator->remove(iterator);
+ }
va_end(args_copy);
}
iterator->destroy(iterator);
diff --git a/src/charon/bus/bus.h b/src/charon/bus/bus.h
index 974d460b9..200525fb7 100644
--- a/src/charon/bus/bus.h
+++ b/src/charon/bus/bus.h
@@ -224,6 +224,8 @@ struct bus_listener_t {
* an additional informational or error message with a printf() like
* variable argument list. This is in the va_list form, as forwarding
* a "..." parameters to functions is not (cleanly) possible.
+ * The implementing signal function returns TRUE to stay registered
+ * to the bus, or FALSE to unregister itself.
*
* @param this listener
* @param singal kind of the signal (up, down, rekeyed, ...)
@@ -232,8 +234,9 @@ struct bus_listener_t {
* @param ike_sa IKE_SA associated to the event
* @param format printf() style format string
* @param args vprintf() style va_list argument list
+ " @return TRUE to stay registered, FALSE to unregister
*/
- void (*signal) (bus_listener_t *this, signal_t signal, level_t level,
+ bool (*signal) (bus_listener_t *this, signal_t signal, level_t level,
int thread, ike_sa_t *ike_sa, char* format, va_list args);
};
diff --git a/src/charon/bus/listeners/file_logger.c b/src/charon/bus/listeners/file_logger.c
index 4c9e13b3f..14f9f72cf 100644
--- a/src/charon/bus/listeners/file_logger.c
+++ b/src/charon/bus/listeners/file_logger.c
@@ -53,7 +53,7 @@ struct private_file_logger_t {
/**
* Implementation of bus_listener_t.signal.
*/
-static void signal_(private_file_logger_t *this, signal_t signal, level_t level,
+static bool signal_(private_file_logger_t *this, signal_t signal, level_t level,
int thread, ike_sa_t* ike_sa, char *format, va_list args)
{
if (level <= this->levels[SIG_TYPE(signal)])
@@ -76,6 +76,8 @@ static void signal_(private_file_logger_t *this, signal_t signal, level_t level,
current = next;
}
}
+ /* always stay registered */
+ return TRUE;
}
/**
@@ -114,7 +116,7 @@ file_logger_t *file_logger_create(FILE *out)
private_file_logger_t *this = malloc_thing(private_file_logger_t);
/* public functions */
- this->public.listener.signal = (void(*)(bus_listener_t*,signal_t,level_t,int,ike_sa_t*,char*,va_list))signal_;
+ this->public.listener.signal = (bool(*)(bus_listener_t*,signal_t,level_t,int,ike_sa_t*,char*,va_list))signal_;
this->public.set_level = (void(*)(file_logger_t*,signal_t,level_t))set_level;
this->public.destroy = (void(*)(file_logger_t*))destroy;
diff --git a/src/charon/bus/listeners/sys_logger.c b/src/charon/bus/listeners/sys_logger.c
index 58c59c4f7..d26d14dc0 100644
--- a/src/charon/bus/listeners/sys_logger.c
+++ b/src/charon/bus/listeners/sys_logger.c
@@ -54,7 +54,7 @@ struct private_sys_logger_t {
/**
* Implementation of bus_listener_t.signal.
*/
-static void signal_(private_sys_logger_t *this, signal_t signal, level_t level,
+static bool signal_(private_sys_logger_t *this, signal_t signal, level_t level,
int thread, ike_sa_t* ike_sa, char *format, va_list args)
{
if (level <= this->levels[SIG_TYPE(signal)])
@@ -78,6 +78,8 @@ static void signal_(private_sys_logger_t *this, signal_t signal, level_t level,
current = next;
}
}
+ /* always stay registered */
+ return TRUE;
}
/**
@@ -117,7 +119,7 @@ sys_logger_t *sys_logger_create(int facility)
private_sys_logger_t *this = malloc_thing(private_sys_logger_t);
/* public functions */
- this->public.listener.signal = (void(*)(bus_listener_t*,signal_t,level_t,int,ike_sa_t*,char*,va_list))signal_;
+ this->public.listener.signal = (bool(*)(bus_listener_t*,signal_t,level_t,int,ike_sa_t*,char*,va_list))signal_;
this->public.set_level = (void(*)(sys_logger_t*,signal_t,level_t))set_level;
this->public.destroy = (void(*)(sys_logger_t*))destroy;