From f7f3d87ed7206f8b5f8cdb2b2de6f3d657ca6426 Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Tue, 6 Jul 2010 16:09:06 +0200 Subject: [PATCH] All kernel listener hooks are optional. --- src/libcharon/kernel/kernel_interface.c | 14 +++++++++----- src/libcharon/kernel/kernel_listener.h | 2 ++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/libcharon/kernel/kernel_interface.c b/src/libcharon/kernel/kernel_interface.c index 98ec37cde..fffde68ae 100644 --- a/src/libcharon/kernel/kernel_interface.c +++ b/src/libcharon/kernel/kernel_interface.c @@ -376,7 +376,8 @@ METHOD(kernel_interface_t, acquire, void, enumerator = this->listeners->create_enumerator(this->listeners); while (enumerator->enumerate(enumerator, &listener)) { - if (!listener->acquire(listener, reqid, src_ts, dst_ts)) + if (listener->acquire && + !listener->acquire(listener, reqid, src_ts, dst_ts)) { this->listeners->remove_at(this->listeners, enumerator); } @@ -395,7 +396,8 @@ METHOD(kernel_interface_t, expire, void, enumerator = this->listeners->create_enumerator(this->listeners); while (enumerator->enumerate(enumerator, &listener)) { - if (!listener->expire(listener, reqid, protocol, spi, hard)) + if (listener->expire && + !listener->expire(listener, reqid, protocol, spi, hard)) { this->listeners->remove_at(this->listeners, enumerator); } @@ -414,7 +416,8 @@ METHOD(kernel_interface_t, mapping, void, enumerator = this->listeners->create_enumerator(this->listeners); while (enumerator->enumerate(enumerator, &listener)) { - if (!listener->mapping(listener, reqid, spi, remote)) + if (listener->mapping && + !listener->mapping(listener, reqid, spi, remote)) { this->listeners->remove_at(this->listeners, enumerator); } @@ -434,7 +437,8 @@ METHOD(kernel_interface_t, migrate, void, enumerator = this->listeners->create_enumerator(this->listeners); while (enumerator->enumerate(enumerator, &listener)) { - if (!listener->migrate(listener, reqid, src_ts, dst_ts, direction, + if (listener->migrate && + !listener->migrate(listener, reqid, src_ts, dst_ts, direction, local, remote)) { this->listeners->remove_at(this->listeners, enumerator); @@ -446,7 +450,7 @@ METHOD(kernel_interface_t, migrate, void, static bool call_roam(kernel_listener_t *listener, bool *roam) { - return !listener->roam(listener, *roam); + return listener->roam && !listener->roam(listener, *roam); } METHOD(kernel_interface_t, roam, void, diff --git a/src/libcharon/kernel/kernel_listener.h b/src/libcharon/kernel/kernel_listener.h index e0a911a16..b69bed66f 100644 --- a/src/libcharon/kernel/kernel_listener.h +++ b/src/libcharon/kernel/kernel_listener.h @@ -29,6 +29,8 @@ typedef struct kernel_listener_t kernel_listener_t; /** * Interface for components interested in kernel events. + * + * All hooks are optional. */ struct kernel_listener_t {