diff options
author | Tobias Brunner <tobias@strongswan.org> | 2012-01-23 13:38:48 +0100 |
---|---|---|
committer | Tobias Brunner <tobias@strongswan.org> | 2012-05-02 14:45:38 +0200 |
commit | d724fcd6240b56359fede1ff6ecd7f0c576dbd0d (patch) | |
tree | 4c295a0e139239a59f8a02ac25ab2851a79dc87a | |
parent | 4d21000cf71c9f89d81c1c54a0fc11be7a0c04b2 (diff) | |
download | strongswan-d724fcd6240b56359fede1ff6ecd7f0c576dbd0d.tar.bz2 strongswan-d724fcd6240b56359fede1ff6ecd7f0c576dbd0d.tar.xz |
Ensure that multi-line log messages are not torn apart.
-rw-r--r-- | src/libcharon/bus/listeners/file_logger.c | 10 | ||||
-rw-r--r-- | src/libcharon/bus/listeners/sys_logger.c | 10 | ||||
-rw-r--r-- | src/libcharon/plugins/android/android_logger.c | 11 |
3 files changed, 30 insertions, 1 deletions
diff --git a/src/libcharon/bus/listeners/file_logger.c b/src/libcharon/bus/listeners/file_logger.c index 2927340fb..c8c853482 100644 --- a/src/libcharon/bus/listeners/file_logger.c +++ b/src/libcharon/bus/listeners/file_logger.c @@ -20,6 +20,7 @@ #include "file_logger.h" +#include <threading/mutex.h> typedef struct private_file_logger_t private_file_logger_t; @@ -52,6 +53,11 @@ struct private_file_logger_t { * Print the name/# of the IKE_SA? */ bool ike_name; + + /** + * Mutex to ensure multi-line log messages are not torn apart + */ + mutex_t *mutex; }; METHOD(logger_t, log_, void, @@ -93,6 +99,7 @@ METHOD(logger_t, log_, void, vsnprintf(buffer, sizeof(buffer), format, args); /* prepend a prefix in front of every line */ + this->mutex->lock(this->mutex); while (current) { next = strchr(current, '\n'); @@ -112,6 +119,7 @@ METHOD(logger_t, log_, void, } current = next; } + this->mutex->unlock(this->mutex); } } @@ -138,6 +146,7 @@ METHOD(file_logger_t, destroy, void, { fclose(this->out); } + this->mutex->destroy(this->mutex); free(this); } @@ -159,6 +168,7 @@ file_logger_t *file_logger_create(FILE *out, char *time_format, bool ike_name) .out = out, .time_format = time_format, .ike_name = ike_name, + .mutex = mutex_create(MUTEX_TYPE_DEFAULT), ); set_level(this, DBG_ANY, LEVEL_SILENT); diff --git a/src/libcharon/bus/listeners/sys_logger.c b/src/libcharon/bus/listeners/sys_logger.c index f47c9aee8..440fda0d9 100644 --- a/src/libcharon/bus/listeners/sys_logger.c +++ b/src/libcharon/bus/listeners/sys_logger.c @@ -20,6 +20,7 @@ #include "sys_logger.h" +#include <threading/mutex.h> typedef struct private_sys_logger_t private_sys_logger_t; @@ -47,6 +48,11 @@ struct private_sys_logger_t { * Print the name/# of the IKE_SA? */ bool ike_name; + + /** + * Mutex to ensure multi-line log messages are not torn apart + */ + mutex_t *mutex; }; METHOD(logger_t, log_, void, @@ -78,6 +84,7 @@ METHOD(logger_t, log_, void, } /* do a syslog for every line */ + this->mutex->lock(this->mutex); while (current) { next = strchr(current, '\n'); @@ -89,6 +96,7 @@ METHOD(logger_t, log_, void, thread, groupstr, namestr, current); current = next; } + this->mutex->unlock(this->mutex); } } @@ -112,6 +120,7 @@ METHOD(sys_logger_t, destroy, void, private_sys_logger_t *this) { closelog(); + this->mutex->destroy(this->mutex); free(this); } @@ -132,6 +141,7 @@ sys_logger_t *sys_logger_create(int facility, bool ike_name) }, .facility = facility, .ike_name = ike_name, + .mutex = mutex_create(MUTEX_TYPE_DEFAULT), ); set_level(this, DBG_ANY, LEVEL_SILENT); diff --git a/src/libcharon/plugins/android/android_logger.c b/src/libcharon/plugins/android/android_logger.c index fbc2a93ce..845d3071e 100644 --- a/src/libcharon/plugins/android/android_logger.c +++ b/src/libcharon/plugins/android/android_logger.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010 Tobias Brunner + * Copyright (C) 2010-2012 Tobias Brunner * Hochschule fuer Technik Rapperswil * * This program is free software; you can redistribute it and/or modify it @@ -20,6 +20,7 @@ #include <library.h> #include <daemon.h> +#include <threading/mutex.h> typedef struct private_android_logger_t private_android_logger_t; @@ -38,6 +39,10 @@ struct private_android_logger_t { */ int level; + /** + * Mutex to ensure multi-line log messages are not torn apart + */ + mutex_t *mutex; }; @@ -52,6 +57,7 @@ METHOD(logger_t, log_, void, char *current = buffer, *next; snprintf(sgroup, sizeof(sgroup), "%N", debug_names, group); vsnprintf(buffer, sizeof(buffer), format, args); + this->mutex->lock(this->mutex); while (current) { /* log each line separately */ next = strchr(current, '\n'); @@ -63,12 +69,14 @@ METHOD(logger_t, log_, void, thread, sgroup, current); current = next; } + this->mutex->unlock(this->mutex); } } METHOD(android_logger_t, destroy, void, private_android_logger_t *this) { + this->mutex->destroy(this->mutex); free(this); } @@ -86,6 +94,7 @@ android_logger_t *android_logger_create() }, .destroy = _destroy, }, + .mutex = mutex_create(MUTEX_TYPE_DEFAULT), .level = lib->settings->get_int(lib->settings, "charon.plugins.android.loglevel", 1), ); |