Ensure that multi-line log messages are not torn apart.
This commit is contained in:
@@ -20,6 +20,7 @@
|
|||||||
|
|
||||||
#include "file_logger.h"
|
#include "file_logger.h"
|
||||||
|
|
||||||
|
#include <threading/mutex.h>
|
||||||
|
|
||||||
typedef struct private_file_logger_t private_file_logger_t;
|
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?
|
* Print the name/# of the IKE_SA?
|
||||||
*/
|
*/
|
||||||
bool ike_name;
|
bool ike_name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mutex to ensure multi-line log messages are not torn apart
|
||||||
|
*/
|
||||||
|
mutex_t *mutex;
|
||||||
};
|
};
|
||||||
|
|
||||||
METHOD(logger_t, log_, void,
|
METHOD(logger_t, log_, void,
|
||||||
@@ -93,6 +99,7 @@ METHOD(logger_t, log_, void,
|
|||||||
vsnprintf(buffer, sizeof(buffer), format, args);
|
vsnprintf(buffer, sizeof(buffer), format, args);
|
||||||
|
|
||||||
/* prepend a prefix in front of every line */
|
/* prepend a prefix in front of every line */
|
||||||
|
this->mutex->lock(this->mutex);
|
||||||
while (current)
|
while (current)
|
||||||
{
|
{
|
||||||
next = strchr(current, '\n');
|
next = strchr(current, '\n');
|
||||||
@@ -112,6 +119,7 @@ METHOD(logger_t, log_, void,
|
|||||||
}
|
}
|
||||||
current = next;
|
current = next;
|
||||||
}
|
}
|
||||||
|
this->mutex->unlock(this->mutex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -138,6 +146,7 @@ METHOD(file_logger_t, destroy, void,
|
|||||||
{
|
{
|
||||||
fclose(this->out);
|
fclose(this->out);
|
||||||
}
|
}
|
||||||
|
this->mutex->destroy(this->mutex);
|
||||||
free(this);
|
free(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -159,6 +168,7 @@ file_logger_t *file_logger_create(FILE *out, char *time_format, bool ike_name)
|
|||||||
.out = out,
|
.out = out,
|
||||||
.time_format = time_format,
|
.time_format = time_format,
|
||||||
.ike_name = ike_name,
|
.ike_name = ike_name,
|
||||||
|
.mutex = mutex_create(MUTEX_TYPE_DEFAULT),
|
||||||
);
|
);
|
||||||
|
|
||||||
set_level(this, DBG_ANY, LEVEL_SILENT);
|
set_level(this, DBG_ANY, LEVEL_SILENT);
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
|
|
||||||
#include "sys_logger.h"
|
#include "sys_logger.h"
|
||||||
|
|
||||||
|
#include <threading/mutex.h>
|
||||||
|
|
||||||
typedef struct private_sys_logger_t private_sys_logger_t;
|
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?
|
* Print the name/# of the IKE_SA?
|
||||||
*/
|
*/
|
||||||
bool ike_name;
|
bool ike_name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mutex to ensure multi-line log messages are not torn apart
|
||||||
|
*/
|
||||||
|
mutex_t *mutex;
|
||||||
};
|
};
|
||||||
|
|
||||||
METHOD(logger_t, log_, void,
|
METHOD(logger_t, log_, void,
|
||||||
@@ -78,6 +84,7 @@ METHOD(logger_t, log_, void,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* do a syslog for every line */
|
/* do a syslog for every line */
|
||||||
|
this->mutex->lock(this->mutex);
|
||||||
while (current)
|
while (current)
|
||||||
{
|
{
|
||||||
next = strchr(current, '\n');
|
next = strchr(current, '\n');
|
||||||
@@ -89,6 +96,7 @@ METHOD(logger_t, log_, void,
|
|||||||
thread, groupstr, namestr, current);
|
thread, groupstr, namestr, current);
|
||||||
current = next;
|
current = next;
|
||||||
}
|
}
|
||||||
|
this->mutex->unlock(this->mutex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -112,6 +120,7 @@ METHOD(sys_logger_t, destroy, void,
|
|||||||
private_sys_logger_t *this)
|
private_sys_logger_t *this)
|
||||||
{
|
{
|
||||||
closelog();
|
closelog();
|
||||||
|
this->mutex->destroy(this->mutex);
|
||||||
free(this);
|
free(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -132,6 +141,7 @@ sys_logger_t *sys_logger_create(int facility, bool ike_name)
|
|||||||
},
|
},
|
||||||
.facility = facility,
|
.facility = facility,
|
||||||
.ike_name = ike_name,
|
.ike_name = ike_name,
|
||||||
|
.mutex = mutex_create(MUTEX_TYPE_DEFAULT),
|
||||||
);
|
);
|
||||||
|
|
||||||
set_level(this, DBG_ANY, LEVEL_SILENT);
|
set_level(this, DBG_ANY, LEVEL_SILENT);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2010 Tobias Brunner
|
* Copyright (C) 2010-2012 Tobias Brunner
|
||||||
* Hochschule fuer Technik Rapperswil
|
* Hochschule fuer Technik Rapperswil
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
@@ -20,6 +20,7 @@
|
|||||||
|
|
||||||
#include <library.h>
|
#include <library.h>
|
||||||
#include <daemon.h>
|
#include <daemon.h>
|
||||||
|
#include <threading/mutex.h>
|
||||||
|
|
||||||
typedef struct private_android_logger_t private_android_logger_t;
|
typedef struct private_android_logger_t private_android_logger_t;
|
||||||
|
|
||||||
@@ -38,6 +39,10 @@ struct private_android_logger_t {
|
|||||||
*/
|
*/
|
||||||
int level;
|
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;
|
char *current = buffer, *next;
|
||||||
snprintf(sgroup, sizeof(sgroup), "%N", debug_names, group);
|
snprintf(sgroup, sizeof(sgroup), "%N", debug_names, group);
|
||||||
vsnprintf(buffer, sizeof(buffer), format, args);
|
vsnprintf(buffer, sizeof(buffer), format, args);
|
||||||
|
this->mutex->lock(this->mutex);
|
||||||
while (current)
|
while (current)
|
||||||
{ /* log each line separately */
|
{ /* log each line separately */
|
||||||
next = strchr(current, '\n');
|
next = strchr(current, '\n');
|
||||||
@@ -63,12 +69,14 @@ METHOD(logger_t, log_, void,
|
|||||||
thread, sgroup, current);
|
thread, sgroup, current);
|
||||||
current = next;
|
current = next;
|
||||||
}
|
}
|
||||||
|
this->mutex->unlock(this->mutex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(android_logger_t, destroy, void,
|
METHOD(android_logger_t, destroy, void,
|
||||||
private_android_logger_t *this)
|
private_android_logger_t *this)
|
||||||
{
|
{
|
||||||
|
this->mutex->destroy(this->mutex);
|
||||||
free(this);
|
free(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,6 +94,7 @@ android_logger_t *android_logger_create()
|
|||||||
},
|
},
|
||||||
.destroy = _destroy,
|
.destroy = _destroy,
|
||||||
},
|
},
|
||||||
|
.mutex = mutex_create(MUTEX_TYPE_DEFAULT),
|
||||||
.level = lib->settings->get_int(lib->settings,
|
.level = lib->settings->get_int(lib->settings,
|
||||||
"charon.plugins.android.loglevel", 1),
|
"charon.plugins.android.loglevel", 1),
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user