diff options
Diffstat (limited to 'src/charon/bus')
-rw-r--r-- | src/charon/bus/bus.c | 9 | ||||
-rw-r--r-- | src/charon/bus/bus.h | 5 | ||||
-rw-r--r-- | src/charon/bus/listeners/file_logger.c | 6 | ||||
-rw-r--r-- | src/charon/bus/listeners/sys_logger.c | 6 |
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; |