aboutsummaryrefslogtreecommitdiffstats
path: root/src/libcharon
diff options
context:
space:
mode:
Diffstat (limited to 'src/libcharon')
-rwxr-xr-xsrc/libcharon/Makefile.am1
-rw-r--r--src/libcharon/bus/bus.c291
-rw-r--r--src/libcharon/bus/bus.h28
-rw-r--r--src/libcharon/bus/listeners/file_logger.c15
-rw-r--r--src/libcharon/bus/listeners/file_logger.h6
-rw-r--r--src/libcharon/bus/listeners/listener.h27
-rw-r--r--src/libcharon/bus/listeners/logger.h53
-rw-r--r--src/libcharon/bus/listeners/sys_logger.c19
-rw-r--r--src/libcharon/bus/listeners/sys_logger.h6
-rw-r--r--src/libcharon/control/controller.c82
-rw-r--r--src/libcharon/plugins/android/android_logger.c6
-rw-r--r--src/libcharon/plugins/android/android_logger.h4
-rw-r--r--src/libcharon/plugins/android/android_plugin.c4
-rw-r--r--src/libcharon/plugins/sql/sql_logger.c20
-rw-r--r--src/libcharon/plugins/sql/sql_logger.h4
-rw-r--r--src/libcharon/plugins/sql/sql_plugin.c4
16 files changed, 279 insertions, 291 deletions
diff --git a/src/libcharon/Makefile.am b/src/libcharon/Makefile.am
index a322b0cce..f97984317 100755
--- a/src/libcharon/Makefile.am
+++ b/src/libcharon/Makefile.am
@@ -3,6 +3,7 @@ ipseclib_LTLIBRARIES = libcharon.la
libcharon_la_SOURCES = \
bus/bus.c bus/bus.h \
bus/listeners/listener.h \
+bus/listeners/logger.h \
bus/listeners/file_logger.c bus/listeners/file_logger.h \
bus/listeners/sys_logger.c bus/listeners/sys_logger.h \
config/backend_manager.c config/backend_manager.h config/backend.h \
diff --git a/src/libcharon/bus/bus.c b/src/libcharon/bus/bus.c
index df15afbe4..4f1a4ce3f 100644
--- a/src/libcharon/bus/bus.c
+++ b/src/libcharon/bus/bus.c
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011 Tobias Brunner
+ * Copyright (C) 2011-2012 Tobias Brunner
* Copyright (C) 2006 Martin Willi
* Hochschule fuer Technik Rapperswil
*
@@ -21,6 +21,7 @@
#include <threading/thread.h>
#include <threading/thread_value.h>
#include <threading/mutex.h>
+#include <threading/rwlock.h>
typedef struct private_bus_t private_bus_t;
@@ -34,24 +35,24 @@ struct private_bus_t {
bus_t public;
/**
- * List of registered listeners as entry_t's
+ * List of registered listeners as entry_t.
*/
linked_list_t *listeners;
/**
- * List of registered listeners implementing listener_t.log() as entry_t
+ * List of registered loggers.
*/
linked_list_t *loggers;
/**
- * mutex for the list of listeners, recursively
+ * Mutex for the list of listeners, recursively.
*/
mutex_t *mutex;
/**
- * mutex for the list of loggers
+ * Read-write lock for the list of loggers.
*/
- mutex_t *log_mutex;
+ rwlock_t *log_lock;
/**
* Thread local storage the threads IKE_SA
@@ -76,61 +77,27 @@ struct entry_t {
*/
int calling;
- /**
- * are we currently logging on this listener
- */
- int logging;
-
- /**
- * TRUE if this listener is active (we use this for the loggers)
- */
- bool enabled;
};
-/**
- * create a listener entry
- */
-static entry_t *entry_create(listener_t *listener)
+METHOD(bus_t, add_listener, void,
+ private_bus_t *this, listener_t *listener)
{
- entry_t *this;
+ entry_t *entry;
- INIT(this,
+ INIT(entry,
.listener = listener,
- .enabled = TRUE,
);
- return this;
-}
-
-/**
- * destroy an entry_t
- */
-static void entry_destroy(entry_t *entry)
-{
- free(entry);
-}
-
-METHOD(bus_t, add_listener, void,
- private_bus_t *this, listener_t *listener)
-{
- entry_t *entry = entry_create(listener);
this->mutex->lock(this->mutex);
this->listeners->insert_last(this->listeners, entry);
this->mutex->unlock(this->mutex);
-
- if (listener->log)
- {
- this->log_mutex->lock(this->log_mutex);
- this->loggers->insert_last(this->loggers, entry);
- this->log_mutex->unlock(this->log_mutex);
- }
}
METHOD(bus_t, remove_listener, void,
private_bus_t *this, listener_t *listener)
{
enumerator_t *enumerator;
- entry_t *entry, *found = NULL;
+ entry_t *entry;
this->mutex->lock(this->mutex);
enumerator = this->listeners->create_enumerator(this->listeners);
@@ -139,33 +106,29 @@ METHOD(bus_t, remove_listener, void,
if (entry->listener == listener)
{
this->listeners->remove_at(this->listeners, enumerator);
- found = entry;
+ free(entry);
break;
}
}
enumerator->destroy(enumerator);
this->mutex->unlock(this->mutex);
-
- if (found)
- {
- this->log_mutex->lock(this->log_mutex);
- this->loggers->remove(this->loggers, found, NULL);
- this->log_mutex->unlock(this->log_mutex);
- entry_destroy(found);
- }
}
-typedef struct cleanup_data_t cleanup_data_t;
+METHOD(bus_t, add_logger, void,
+ private_bus_t *this, logger_t *logger)
+{
+ this->log_lock->write_lock(this->log_lock);
+ this->loggers->insert_last(this->loggers, logger);
+ this->log_lock->unlock(this->log_lock);
+}
-/**
- * data to remove a listener using thread_cleanup_t handler
- */
-struct cleanup_data_t {
- /** bus instance */
- private_bus_t *this;
- /** listener entry */
- entry_t *entry;
-};
+METHOD(bus_t, remove_logger, void,
+ private_bus_t *this, logger_t *logger)
+{
+ this->log_lock->write_lock(this->log_lock);
+ this->loggers->remove(this->loggers, logger, NULL);
+ this->log_lock->unlock(this->log_lock);
+}
METHOD(bus_t, set_sa, void,
private_bus_t *this, ike_sa_t *ike_sa)
@@ -198,29 +161,16 @@ typedef struct {
} log_data_t;
/**
- * listener->log() invocation as a list remove callback
+ * logger->log() invocation as a invoke_function callback
*/
-static bool log_cb(entry_t *entry, log_data_t *data)
+static void log_cb(logger_t *logger, log_data_t *data)
{
va_list args;
- if (entry->logging)
- { /* avoid recursive calls */
- return FALSE;
- }
- entry->logging = TRUE;
-
va_copy(args, data->args);
- if (!entry->listener->log(entry->listener, data->group, data->level,
- data->thread, data->ike_sa, data->format, args))
- {
- entry->enabled = FALSE;
- va_end(args);
- return TRUE;
- }
+ logger->log(logger, data->group, data->level, data->thread, data->ike_sa,
+ data->format, args);
va_end(args);
- entry->logging = FALSE;
- return FALSE;
}
METHOD(bus_t, vlog, void,
@@ -236,11 +186,9 @@ METHOD(bus_t, vlog, void,
data.format = format;
va_copy(data.args, args);
- this->log_mutex->lock(this->log_mutex);
- /* We use the remove() method to invoke all listeners. This is cheap and
- * does not require an allocation for this performance critical function. */
- this->loggers->remove(this->loggers, &data, (void*)log_cb);
- this->log_mutex->unlock(this->log_mutex);
+ this->log_lock->read_lock(this->log_lock);
+ this->loggers->invoke_function(this->loggers, (void*)log_cb, &data);
+ this->log_lock->unlock(this->log_lock);
va_end(data.args);
}
@@ -258,14 +206,11 @@ METHOD(bus_t, log_, void,
/**
* unregister a listener
*/
-static void unregister_listener(private_bus_t *this, entry_t *entry,
- enumerator_t *enumerator)
+static inline void unregister_listener(private_bus_t *this, entry_t *entry,
+ enumerator_t *enumerator)
{
this->listeners->remove_at(this->listeners, enumerator);
- this->log_mutex->lock(this->log_mutex);
- this->loggers->remove(this->loggers, entry, NULL);
- this->log_mutex->unlock(this->log_mutex);
- entry_destroy(entry);
+ free(entry);
}
METHOD(bus_t, alert, void,
@@ -287,15 +232,12 @@ METHOD(bus_t, alert, void,
{
continue;
}
- if (entry->enabled)
- {
- entry->calling++;
- va_start(args, alert);
- keep = entry->listener->alert(entry->listener, ike_sa, alert, args);
- va_end(args);
- entry->calling--;
- }
- if (!entry->enabled || !keep)
+ entry->calling++;
+ va_start(args, alert);
+ keep = entry->listener->alert(entry->listener, ike_sa, alert, args);
+ va_end(args);
+ entry->calling--;
+ if (!keep)
{
unregister_listener(this, entry, enumerator);
}
@@ -319,13 +261,10 @@ METHOD(bus_t, ike_state_change, void,
{
continue;
}
- if (entry->enabled)
- {
- entry->calling++;
- keep = entry->listener->ike_state_change(entry->listener, ike_sa, state);
- entry->calling--;
- }
- if (!entry->enabled || !keep)
+ entry->calling++;
+ keep = entry->listener->ike_state_change(entry->listener, ike_sa, state);
+ entry->calling--;
+ if (!keep)
{
unregister_listener(this, entry, enumerator);
}
@@ -352,14 +291,11 @@ METHOD(bus_t, child_state_change, void,
{
continue;
}
- if (entry->enabled)
- {
- entry->calling++;
- keep = entry->listener->child_state_change(entry->listener, ike_sa,
- child_sa, state);
- entry->calling--;
- }
- if (!entry->enabled || !keep)
+ entry->calling++;
+ keep = entry->listener->child_state_change(entry->listener, ike_sa,
+ child_sa, state);
+ entry->calling--;
+ if (!keep)
{
unregister_listener(this, entry, enumerator);
}
@@ -386,14 +322,11 @@ METHOD(bus_t, message, void,
{
continue;
}
- if (entry->enabled)
- {
- entry->calling++;
- keep = entry->listener->message(entry->listener, ike_sa,
- message, incoming, plain);
- entry->calling--;
- }
- if (!entry->enabled || !keep)
+ entry->calling++;
+ keep = entry->listener->message(entry->listener, ike_sa,
+ message, incoming, plain);
+ entry->calling--;
+ if (!keep)
{
unregister_listener(this, entry, enumerator);
}
@@ -419,14 +352,11 @@ METHOD(bus_t, ike_keys, void,
{
continue;
}
- if (entry->enabled)
- {
- entry->calling++;
- keep = entry->listener->ike_keys(entry->listener, ike_sa, dh, dh_other,
- nonce_i, nonce_r, rekey, shared);
- entry->calling--;
- }
- if (!entry->enabled || !keep)
+ entry->calling++;
+ keep = entry->listener->ike_keys(entry->listener, ike_sa, dh, dh_other,
+ nonce_i, nonce_r, rekey, shared);
+ entry->calling--;
+ if (!keep)
{
unregister_listener(this, entry, enumerator);
}
@@ -454,14 +384,11 @@ METHOD(bus_t, child_keys, void,
{
continue;
}
- if (entry->enabled)
- {
- entry->calling++;
- keep = entry->listener->child_keys(entry->listener, ike_sa,
- child_sa, initiator, dh, nonce_i, nonce_r);
- entry->calling--;
- }
- if (!entry->enabled || !keep)
+ entry->calling++;
+ keep = entry->listener->child_keys(entry->listener, ike_sa,
+ child_sa, initiator, dh, nonce_i, nonce_r);
+ entry->calling--;
+ if (!keep)
{
unregister_listener(this, entry, enumerator);
}
@@ -488,14 +415,11 @@ METHOD(bus_t, child_updown, void,
{
continue;
}
- if (entry->enabled)
- {
- entry->calling++;
- keep = entry->listener->child_updown(entry->listener,
- ike_sa, child_sa, up);
- entry->calling--;
- }
- if (!entry->enabled || !keep)
+ entry->calling++;
+ keep = entry->listener->child_updown(entry->listener,
+ ike_sa, child_sa, up);
+ entry->calling--;
+ if (!keep)
{
unregister_listener(this, entry, enumerator);
}
@@ -522,14 +446,11 @@ METHOD(bus_t, child_rekey, void,
{
continue;
}
- if (entry->enabled)
- {
- entry->calling++;
- keep = entry->listener->child_rekey(entry->listener, ike_sa,
- old, new);
- entry->calling--;
- }
- if (!entry->enabled || !keep)
+ entry->calling++;
+ keep = entry->listener->child_rekey(entry->listener, ike_sa,
+ old, new);
+ entry->calling--;
+ if (!keep)
{
unregister_listener(this, entry, enumerator);
}
@@ -553,13 +474,10 @@ METHOD(bus_t, ike_updown, void,
{
continue;
}
- if (entry->enabled)
- {
- entry->calling++;
- keep = entry->listener->ike_updown(entry->listener, ike_sa, up);
- entry->calling--;
- }
- if (!entry->enabled || !keep)
+ entry->calling++;
+ keep = entry->listener->ike_updown(entry->listener, ike_sa, up);
+ entry->calling--;
+ if (!keep)
{
unregister_listener(this, entry, enumerator);
}
@@ -597,13 +515,10 @@ METHOD(bus_t, ike_rekey, void,
{
continue;
}
- if (entry->enabled)
- {
- entry->calling++;
- keep = entry->listener->ike_rekey(entry->listener, old, new);
- entry->calling--;
- }
- if (!entry->enabled || !keep)
+ entry->calling++;
+ keep = entry->listener->ike_rekey(entry->listener, old, new);
+ entry->calling--;
+ if (!keep)
{
unregister_listener(this, entry, enumerator);
}
@@ -630,14 +545,11 @@ METHOD(bus_t, authorize, bool,
{
continue;
}
- if (entry->enabled)
- {
- entry->calling++;
- keep = entry->listener->authorize(entry->listener, ike_sa,
- final, &success);
- entry->calling--;
- }
- if (!entry->enabled || !keep)
+ entry->calling++;
+ keep = entry->listener->authorize(entry->listener, ike_sa,
+ final, &success);
+ entry->calling--;
+ if (!keep)
{
unregister_listener(this, entry, enumerator);
}
@@ -670,14 +582,11 @@ METHOD(bus_t, narrow, void,
{
continue;
}
- if (entry->enabled)
- {
- entry->calling++;
- keep = entry->listener->narrow(entry->listener, ike_sa, child_sa,
- type, local, remote);
- entry->calling--;
- }
- if (!entry->enabled || !keep)
+ entry->calling++;
+ keep = entry->listener->narrow(entry->listener, ike_sa, child_sa,
+ type, local, remote);
+ entry->calling--;
+ if (!keep)
{
unregister_listener(this, entry, enumerator);
}
@@ -689,11 +598,11 @@ METHOD(bus_t, narrow, void,
METHOD(bus_t, destroy, void,
private_bus_t *this)
{
+ this->listeners->destroy_function(this->listeners, (void*)free);
+ this->loggers->destroy(this->loggers);
this->thread_sa->destroy(this->thread_sa);
- this->log_mutex->destroy(this->log_mutex);
+ this->log_lock->destroy(this->log_lock);
this->mutex->destroy(this->mutex);
- this->listeners->destroy_function(this->listeners, (void*)entry_destroy);
- this->loggers->destroy(this->loggers);
free(this);
}
@@ -708,6 +617,8 @@ bus_t *bus_create()
.public = {
.add_listener = _add_listener,
.remove_listener = _remove_listener,
+ .add_logger = _add_logger,
+ .remove_logger = _remove_logger,
.set_sa = _set_sa,
.get_sa = _get_sa,
.log = _log_,
@@ -729,7 +640,7 @@ bus_t *bus_create()
.listeners = linked_list_create(),
.loggers = linked_list_create(),
.mutex = mutex_create(MUTEX_TYPE_RECURSIVE),
- .log_mutex = mutex_create(MUTEX_TYPE_RECURSIVE),
+ .log_lock = rwlock_create(RWLOCK_TYPE_DEFAULT),
.thread_sa = thread_value_create(NULL),
);
diff --git a/src/libcharon/bus/bus.h b/src/libcharon/bus/bus.h
index d5eb73a54..d6e4a678e 100644
--- a/src/libcharon/bus/bus.h
+++ b/src/libcharon/bus/bus.h
@@ -1,4 +1,5 @@
/*
+ * Copyright (C) 2012 Tobias Brunner
* Copyright (C) 2006-2009 Martin Willi
* Hochschule fuer Technik Rapperswil
*
@@ -31,6 +32,7 @@ typedef struct bus_t bus_t;
#include <sa/ike_sa.h>
#include <sa/child_sa.h>
#include <processing/jobs/job.h>
+#include <bus/listeners/logger.h>
#include <bus/listeners/listener.h>
/* undefine the definitions from libstrongswan */
@@ -118,12 +120,7 @@ enum narrow_hook_t {
/**
* The bus receives events and sends them to all registered listeners.
*
- * Calls to bus_t.log() are handled seperately from calls to other event
- * functions. This means that listeners have to be aware that calls to
- * listener_t.log() can happen concurrently with calls to one of the other
- * callbacks. Due to this unregistering from the log() callback is not fully
- * in sync with the other callbacks, thus, one of these might be called before
- * the listener is finally unregistered.
+ * Loggers are handled separately.
*/
struct bus_t {
@@ -146,6 +143,25 @@ struct bus_t {
void (*remove_listener) (bus_t *this, listener_t *listener);
/**
+ * Register a logger with the bus.
+ *
+ * The logger is passive; the thread which emitted the event
+ * processes the logger routine. This routine may be called concurrently
+ * by multiple threads. Recursive calls are not prevented, so logger that
+ * may cause recursive calls are responsible to avoid infinite loops.
+ *
+ * @param logger logger to register.
+ */
+ void (*add_logger) (bus_t *this, logger_t *logger);
+
+ /**
+ * Unregister a logger from the bus.
+ *
+ * @param logger logger to unregister.
+ */
+ void (*remove_logger) (bus_t *this, logger_t *logger);
+
+ /**
* Set the IKE_SA the calling thread is using.
*
* To associate a received log message with an IKE_SA without passing it as
diff --git a/src/libcharon/bus/listeners/file_logger.c b/src/libcharon/bus/listeners/file_logger.c
index 36d18619a..2927340fb 100644
--- a/src/libcharon/bus/listeners/file_logger.c
+++ b/src/libcharon/bus/listeners/file_logger.c
@@ -1,4 +1,5 @@
/*
+ * Copyright (C) 2012 Tobias Brunner
* Copyright (C) 2006 Martin Willi
* Hochschule fuer Technik Rapperswil
*
@@ -53,9 +54,9 @@ struct private_file_logger_t {
bool ike_name;
};
-METHOD(listener_t, log_, bool,
- private_file_logger_t *this, debug_t group, level_t level, int thread,
- ike_sa_t* ike_sa, char *format, va_list args)
+METHOD(logger_t, log_, void,
+ private_file_logger_t *this, debug_t group, level_t level, int thread,
+ ike_sa_t* ike_sa, char *format, va_list args)
{
if (level <= this->levels[group])
{
@@ -112,12 +113,10 @@ METHOD(listener_t, log_, bool,
current = next;
}
}
- /* always stay registered */
- return TRUE;
}
METHOD(file_logger_t, set_level, void,
- private_file_logger_t *this, debug_t group, level_t level)
+ private_file_logger_t *this, debug_t group, level_t level)
{
if (group < DBG_ANY)
{
@@ -133,7 +132,7 @@ METHOD(file_logger_t, set_level, void,
}
METHOD(file_logger_t, destroy, void,
- private_file_logger_t *this)
+ private_file_logger_t *this)
{
if (this->out != stdout && this->out != stderr)
{
@@ -151,7 +150,7 @@ file_logger_t *file_logger_create(FILE *out, char *time_format, bool ike_name)
INIT(this,
.public = {
- .listener = {
+ .logger = {
.log = _log_,
},
.set_level = _set_level,
diff --git a/src/libcharon/bus/listeners/file_logger.h b/src/libcharon/bus/listeners/file_logger.h
index d02f1701d..85a2690a2 100644
--- a/src/libcharon/bus/listeners/file_logger.h
+++ b/src/libcharon/bus/listeners/file_logger.h
@@ -21,7 +21,7 @@
#ifndef FILE_LOGGER_H_
#define FILE_LOGGER_H_
-#include <bus/listeners/listener.h>
+#include <bus/listeners/logger.h>
typedef struct file_logger_t file_logger_t;
@@ -31,9 +31,9 @@ typedef struct file_logger_t file_logger_t;
struct file_logger_t {
/**
- * Implements the listener_t interface.
+ * Implements the logger_t interface.
*/
- listener_t listener;
+ logger_t logger;
/**
* Set the loglevel for a debug group.
diff --git a/src/libcharon/bus/listeners/listener.h b/src/libcharon/bus/listeners/listener.h
index a5673057d..703e85289 100644
--- a/src/libcharon/bus/listeners/listener.h
+++ b/src/libcharon/bus/listeners/listener.h
@@ -31,33 +31,6 @@ typedef struct listener_t listener_t;
struct listener_t {
/**
- * Log a debugging message.
- *
- * The implementing signal function returns TRUE to stay registered
- * to the bus, or FALSE to unregister itself.
- *
- * Calling bus_t.log() inside of a registered listener is possible
- * from all listener_t callbacks, but recursive calls from log() itself
- * are ignored.
- *
- * Note that calls to bus_t.log() are handled seperately from calls to
- * other functions, thus this callback may be called concurrently with
- * some of the others. Because of this unregistering from this callback
- * does not happen in sync with the other callbacks, thus, one of the other
- * callbacks might be called before the listener is finally unregistered.
- *
- * @param group kind of the signal (up, down, rekeyed, ...)
- * @param level verbosity level of the signal
- * @param thread ID of the thread raised this signal
- * @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
- */
- bool (*log)(listener_t *this, debug_t group, level_t level, int thread,
- ike_sa_t *ike_sa, char* format, va_list args);
-
- /**
* Hook called if a critical alert is risen.
*
* @param ike_sa IKE_SA associated to the alert, if any
diff --git a/src/libcharon/bus/listeners/logger.h b/src/libcharon/bus/listeners/logger.h
new file mode 100644
index 000000000..9918e29bd
--- /dev/null
+++ b/src/libcharon/bus/listeners/logger.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2012 Tobias Brunner
+ * Hochschule fuer Technik Rapperswil
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+
+/**
+ * @defgroup logger logger
+ * @{ @ingroup listeners
+ */
+
+#ifndef LOGGER_H_
+#define LOGGER_H_
+
+typedef struct logger_t logger_t;
+
+#include <bus/bus.h>
+
+/**
+ * Logger interface, listens for log events on the bus.
+ */
+struct logger_t {
+
+ /**
+ * Log a debugging message.
+ *
+ * @note Calls to bus_t.log() are handled seperately from calls to
+ * other functions. This callback may be called concurrently by
+ * multiple threads. Also recurisve calls are not prevented, logger that
+ * may cause recursive calls are responsible to avoid infinite loops.
+ *
+ * @param group kind of the signal (up, down, rekeyed, ...)
+ * @param level verbosity level of the signal
+ * @param thread ID of the thread raised this signal
+ * @param ike_sa IKE_SA associated to the event
+ * @param format printf() style format string
+ * @param args vprintf() style argument list
+ */
+ void (*log)(logger_t *this, debug_t group, level_t level, int thread,
+ ike_sa_t *ike_sa, char* format, va_list args);
+
+};
+
+#endif /** LOGGER_H_ @}*/
diff --git a/src/libcharon/bus/listeners/sys_logger.c b/src/libcharon/bus/listeners/sys_logger.c
index c29c9f2e4..f47c9aee8 100644
--- a/src/libcharon/bus/listeners/sys_logger.c
+++ b/src/libcharon/bus/listeners/sys_logger.c
@@ -1,4 +1,5 @@
/*
+ * Copyright (C) 2012 Tobias Brunner
* Copyright (C) 2006 Martin Willi
* Hochschule fuer Technik Rapperswil
*
@@ -48,9 +49,9 @@ struct private_sys_logger_t {
bool ike_name;
};
-METHOD(listener_t, log_, bool,
- private_sys_logger_t *this, debug_t group, level_t level, int thread,
- ike_sa_t* ike_sa, char *format, va_list args)
+METHOD(logger_t, log_, void,
+ private_sys_logger_t *this, debug_t group, level_t level, int thread,
+ ike_sa_t* ike_sa, char *format, va_list args)
{
if (level <= this->levels[group])
{
@@ -59,7 +60,7 @@ METHOD(listener_t, log_, bool,
/* write in memory buffer first */
vsnprintf(buffer, sizeof(buffer), format, args);
- /* cache group name */
+ /* cache group name and optional name string */
snprintf(groupstr, sizeof(groupstr), "%N", debug_names, group);
if (this->ike_name && ike_sa)
@@ -76,7 +77,7 @@ METHOD(listener_t, log_, bool,
}
}
- /* do a syslog with every line */
+ /* do a syslog for every line */
while (current)
{
next = strchr(current, '\n');
@@ -89,12 +90,10 @@ METHOD(listener_t, log_, bool,
current = next;
}
}
- /* always stay registered */
- return TRUE;
}
METHOD(sys_logger_t, set_level, void,
- private_sys_logger_t *this, debug_t group, level_t level)
+ private_sys_logger_t *this, debug_t group, level_t level)
{
if (group < DBG_ANY)
{
@@ -110,7 +109,7 @@ METHOD(sys_logger_t, set_level, void,
}
METHOD(sys_logger_t, destroy, void,
- private_sys_logger_t *this)
+ private_sys_logger_t *this)
{
closelog();
free(this);
@@ -125,7 +124,7 @@ sys_logger_t *sys_logger_create(int facility, bool ike_name)
INIT(this,
.public = {
- .listener = {
+ .logger = {
.log = _log_,
},
.set_level = _set_level,
diff --git a/src/libcharon/bus/listeners/sys_logger.h b/src/libcharon/bus/listeners/sys_logger.h
index d83715a6a..fcb6655ca 100644
--- a/src/libcharon/bus/listeners/sys_logger.h
+++ b/src/libcharon/bus/listeners/sys_logger.h
@@ -21,7 +21,7 @@
#ifndef SYS_LOGGER_H_
#define SYS_LOGGER_H_
-#include <bus/listeners/listener.h>
+#include <bus/listeners/logger.h>
typedef struct sys_logger_t sys_logger_t;
@@ -31,9 +31,9 @@ typedef struct sys_logger_t sys_logger_t;
struct sys_logger_t {
/**
- * Implements the listener_t interface.
+ * Implements the logger_t interface.
*/
- listener_t listener;
+ logger_t logger;
/**
* Set the loglevel for a debug group.
diff --git a/src/libcharon/control/controller.c b/src/libcharon/control/controller.c
index 84adce073..7ba4747ac 100644
--- a/src/libcharon/control/controller.c
+++ b/src/libcharon/control/controller.c
@@ -29,6 +29,7 @@
typedef struct private_controller_t private_controller_t;
typedef struct interface_listener_t interface_listener_t;
+typedef struct interface_logger_t interface_logger_t;
/**
* Private data of an stroke_t object.
@@ -42,19 +43,18 @@ struct private_controller_t {
};
/**
- * helper struct to map listener callbacks to interface callbacks
+ * helper struct for the logger interface
*/
-struct interface_listener_t {
-
+struct interface_logger_t {
/**
- * public bus listener interface
+ * public logger interface
*/
- listener_t public;
+ logger_t public;
/**
- * status of the operation, return to method callers
+ * reference to the listener
*/
- status_t status;
+ interface_listener_t *listener;
/**
* interface callback (listener gets redirected to here)
@@ -65,6 +65,27 @@ struct interface_listener_t {
* user parameter to pass to callback
*/
void *param;
+};
+
+/**
+ * helper struct to map listener callbacks to interface callbacks
+ */
+struct interface_listener_t {
+
+ /**
+ * public bus listener interface
+ */
+ listener_t public;
+
+ /**
+ * logger interface
+ */
+ interface_logger_t logger;
+
+ /**
+ * status of the operation, return to method callers
+ */
+ status_t status;
/**
* child configuration, used for initiate
@@ -135,6 +156,7 @@ static inline bool listener_done(interface_listener_t *listener)
static void listener_cleanup(interface_listener_t *listener)
{
charon->bus->remove_listener(charon->bus, &listener->public);
+ charon->bus->remove_logger(charon->bus, &listener->logger.public);
listener->done->destroy(listener->done);
}
@@ -156,6 +178,7 @@ static bool wait_for_listener(interface_listener_t *listener, job_t *job,
listener->done = semaphore_create(0);
+ charon->bus->add_logger(charon->bus, &listener->logger.public);
charon->bus->add_listener(charon->bus, &listener->public);
lib->processor->queue_job(lib->processor, job);
@@ -174,19 +197,18 @@ static bool wait_for_listener(interface_listener_t *listener, job_t *job,
return timed_out;
}
-METHOD(listener_t, listener_log, bool,
- interface_listener_t *this, debug_t group, level_t level, int thread,
+METHOD(logger_t, listener_log, void,
+ interface_logger_t *this, debug_t group, level_t level, int thread,
ike_sa_t *ike_sa, char* format, va_list args)
{
- if (this->ike_sa == ike_sa)
+ if (this->listener->ike_sa == ike_sa)
{
if (!this->callback(this->param, group, level, ike_sa, format, args))
{
- this->status = NEED_MORE;
- return listener_done(this);
+ this->listener->status = NEED_MORE;
+ listener_done(this->listener);
}
}
- return TRUE;
}
METHOD(job_t, get_priority_medium, job_priority_t,
@@ -322,12 +344,16 @@ METHOD(controller_t, initiate, status_t,
interface_job_t job = {
.listener = {
.public = {
- .log = _listener_log,
.ike_state_change = _ike_state_change,
.child_state_change = _child_state_change,
},
- .callback = callback,
- .param = param,
+ .logger = {
+ .public = {
+ .log = _listener_log,
+ },
+ .callback = callback,
+ .param = param,
+ },
.status = FAILED,
.child_cfg = child_cfg,
.peer_cfg = peer_cfg,
@@ -338,6 +364,8 @@ METHOD(controller_t, initiate, status_t,
.destroy = _recheckin,
},
};
+ job.listener.logger.listener = &job.listener;
+
if (callback == NULL)
{
initiate_execute(&job);
@@ -382,12 +410,16 @@ METHOD(controller_t, terminate_ike, status_t,
interface_job_t job = {
.listener = {
.public = {
- .log = _listener_log,
.ike_state_change = _ike_state_change,
.child_state_change = _child_state_change,
},
- .callback = callback,
- .param = param,
+ .logger = {
+ .public = {
+ .log = _listener_log,
+ },
+ .callback = callback,
+ .param = param,
+ },
.status = FAILED,
.id = unique_id,
},
@@ -397,6 +429,7 @@ METHOD(controller_t, terminate_ike, status_t,
.destroy = _recheckin,
},
};
+ job.listener.logger.listener = &job.listener;
ike_sa = charon->ike_sa_manager->checkout_by_id(charon->ike_sa_manager,
unique_id, FALSE);
@@ -455,12 +488,16 @@ METHOD(controller_t, terminate_child, status_t,
interface_job_t job = {
.listener = {
.public = {
- .log = _listener_log,
.ike_state_change = _ike_state_change,
.child_state_change = _child_state_change,
},
- .callback = callback,
- .param = param,
+ .logger = {
+ .public = {
+ .log = _listener_log,
+ },
+ .callback = callback,
+ .param = param,
+ },
.status = FAILED,
.id = reqid,
},
@@ -470,6 +507,7 @@ METHOD(controller_t, terminate_child, status_t,
.destroy = _recheckin,
},
};
+ job.listener.logger.listener = &job.listener;
ike_sa = charon->ike_sa_manager->checkout_by_id(charon->ike_sa_manager,
reqid, TRUE);
diff --git a/src/libcharon/plugins/android/android_logger.c b/src/libcharon/plugins/android/android_logger.c
index f7624b2c7..fbc2a93ce 100644
--- a/src/libcharon/plugins/android/android_logger.c
+++ b/src/libcharon/plugins/android/android_logger.c
@@ -41,7 +41,7 @@ struct private_android_logger_t {
};
-METHOD(listener_t, log_, bool,
+METHOD(logger_t, log_, void,
private_android_logger_t *this, debug_t group, level_t level,
int thread, ike_sa_t* ike_sa, char *format, va_list args)
{
@@ -64,8 +64,6 @@ METHOD(listener_t, log_, bool,
current = next;
}
}
- /* always stay registered */
- return TRUE;
}
METHOD(android_logger_t, destroy, void,
@@ -83,7 +81,7 @@ android_logger_t *android_logger_create()
INIT(this,
.public = {
- .listener = {
+ .logger = {
.log = _log_,
},
.destroy = _destroy,
diff --git a/src/libcharon/plugins/android/android_logger.h b/src/libcharon/plugins/android/android_logger.h
index c6fe5aff3..15abbb43f 100644
--- a/src/libcharon/plugins/android/android_logger.h
+++ b/src/libcharon/plugins/android/android_logger.h
@@ -31,9 +31,9 @@ typedef struct android_logger_t android_logger_t;
struct android_logger_t {
/**
- * Implements bus_listener_t interface
+ * Implements logger_t interface
*/
- listener_t listener;
+ logger_t logger;
/**
* Destroy the logger.
diff --git a/src/libcharon/plugins/android/android_plugin.c b/src/libcharon/plugins/android/android_plugin.c
index 091f34a8e..bad8bc042 100644
--- a/src/libcharon/plugins/android/android_plugin.c
+++ b/src/libcharon/plugins/android/android_plugin.c
@@ -68,7 +68,7 @@ METHOD(plugin_t, destroy, void,
hydra->attributes->remove_handler(hydra->attributes,
&this->handler->handler);
lib->credmgr->remove_set(lib->credmgr, &this->creds->set);
- charon->bus->remove_listener(charon->bus, &this->logger->listener);
+ charon->bus->remove_logger(charon->bus, &this->logger->logger);
this->creds->destroy(this->creds);
this->handler->destroy(this->handler);
this->logger->destroy(this->logger);
@@ -98,7 +98,7 @@ plugin_t *android_plugin_create()
this->service = android_service_create(this->creds);
this->handler = android_handler_create(this->service != NULL);
- charon->bus->add_listener(charon->bus, &this->logger->listener);
+ charon->bus->add_logger(charon->bus, &this->logger->logger);
lib->credmgr->add_set(lib->credmgr, &this->creds->set);
hydra->attributes->add_handler(hydra->attributes, &this->handler->handler);
diff --git a/src/libcharon/plugins/sql/sql_logger.c b/src/libcharon/plugins/sql/sql_logger.c
index 10ceacb00..e693bac48 100644
--- a/src/libcharon/plugins/sql/sql_logger.c
+++ b/src/libcharon/plugins/sql/sql_logger.c
@@ -18,6 +18,7 @@
#include "sql_logger.h"
#include <daemon.h>
+#include <threading/thread_value.h>
typedef struct private_sql_logger_t private_sql_logger_t;
@@ -42,20 +43,20 @@ struct private_sql_logger_t {
int level;
/**
- * avoid recursive logging
+ * avoid recursive calls by the same thread
*/
- bool recursive;
+ thread_value_t *recursive;
};
-METHOD(listener_t, log_, bool,
+METHOD(logger_t, log_, void,
private_sql_logger_t *this, debug_t group, level_t level, int thread,
ike_sa_t* ike_sa, char *format, va_list args)
{
- if (this->recursive)
+ if (this->recursive->get(this->recursive))
{
- return TRUE;
+ return;
}
- this->recursive = TRUE;
+ this->recursive->set(this->recursive, this->recursive);
if (ike_sa && level <= this->level)
{
@@ -108,9 +109,7 @@ METHOD(listener_t, log_, bool,
DB_BLOB, local_spi, DB_INT, group, DB_INT, level,
DB_TEXT, buffer);
}
- this->recursive = FALSE;
- /* always stay registered */
- return TRUE;
+ this->recursive->set(this->recursive, NULL);
}
METHOD(sql_logger_t, destroy, void,
@@ -128,12 +127,13 @@ sql_logger_t *sql_logger_create(database_t *db)
INIT(this,
.public = {
- .listener = {
+ .logger = {
.log = _log_,
},
.destroy = _destroy,
},
.db = db,
+ .recursive = thread_value_create(NULL),
.level = lib->settings->get_int(lib->settings,
"charon.plugins.sql.loglevel", -1),
);
diff --git a/src/libcharon/plugins/sql/sql_logger.h b/src/libcharon/plugins/sql/sql_logger.h
index a933705da..62dc3f361 100644
--- a/src/libcharon/plugins/sql/sql_logger.h
+++ b/src/libcharon/plugins/sql/sql_logger.h
@@ -32,9 +32,9 @@ typedef struct sql_logger_t sql_logger_t;
struct sql_logger_t {
/**
- * Implements bus_listener_t interface
+ * Implements logger_t interface
*/
- listener_t listener;
+ logger_t logger;
/**
* Destry the backend.
diff --git a/src/libcharon/plugins/sql/sql_plugin.c b/src/libcharon/plugins/sql/sql_plugin.c
index d915d4696..fc05fa547 100644
--- a/src/libcharon/plugins/sql/sql_plugin.c
+++ b/src/libcharon/plugins/sql/sql_plugin.c
@@ -64,7 +64,7 @@ METHOD(plugin_t, destroy, void,
{
charon->backends->remove_backend(charon->backends, &this->config->backend);
lib->credmgr->remove_set(lib->credmgr, &this->cred->set);
- charon->bus->remove_listener(charon->bus, &this->logger->listener);
+ charon->bus->remove_logger(charon->bus, &this->logger->logger);
this->config->destroy(this->config);
this->cred->destroy(this->cred);
this->logger->destroy(this->logger);
@@ -110,7 +110,7 @@ plugin_t *sql_plugin_create()
charon->backends->add_backend(charon->backends, &this->config->backend);
lib->credmgr->add_set(lib->credmgr, &this->cred->set);
- charon->bus->add_listener(charon->bus, &this->logger->listener);
+ charon->bus->add_logger(charon->bus, &this->logger->logger);
return &this->public.plugin;
}