Ensure that multi-line log messages are not torn apart.
authorTobias Brunner <tobias@strongswan.org>
Mon, 23 Jan 2012 12:38:48 +0000 (13:38 +0100)
committerTobias Brunner <tobias@strongswan.org>
Wed, 2 May 2012 12:45:38 +0000 (14:45 +0200)
src/libcharon/bus/listeners/file_logger.c
src/libcharon/bus/listeners/sys_logger.c
src/libcharon/plugins/android/android_logger.c

index 2927340..c8c8534 100644 (file)
@@ -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);
index f47c9ae..440fda0 100644 (file)
@@ -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);
index fbc2a93..845d307 100644 (file)
@@ -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),
        );