This id can be used to identify an error with an id when logging.
Signed-off-by: Thomas Egerer <[email protected]>
---
src/libcharon/bus/bus.c | 6 +++++-
src/libcharon/bus/listeners/file_logger.c | 18 ++++++++++++------
src/libcharon/bus/listeners/logger.h | 3 ++-
src/libcharon/bus/listeners/sys_logger.c | 18 ++++++++++++------
src/libcharon/control/controller.c | 6 +++---
src/libcharon/control/controller.h | 6 ++++--
.../plugins/android_log/android_log_logger.c | 17 +++++++++++------
src/libcharon/plugins/smp/smp.c | 7 ++++++-
src/libcharon/plugins/sql/sql_logger.c | 3 ++-
src/libcharon/plugins/stroke/stroke_control.c | 10 +++++++++-
.../processing/jobs/initiate_mediation_job.c | 4 +++-
11 files changed, 69 insertions(+), 29 deletions(-)
diff --git a/src/libcharon/bus/bus.c b/src/libcharon/bus/bus.c
index b5cdaaa..f395431 100644
--- a/src/libcharon/bus/bus.c
+++ b/src/libcharon/bus/bus.c
@@ -270,6 +270,8 @@ typedef struct {
level_t level;
/** message */
char *message;
+ /** error id */
+ u_int64_t id;
} log_data_t;
/**
@@ -282,7 +284,8 @@ static void log_cb(log_entry_t *entry, log_data_t *data)
return;
}
entry->logger->log(entry->logger, data->group, data->level,
- data->thread, data->ike_sa, data->message);
+ data->thread, data->ike_sa, data->message,
+ data->id);
}
METHOD(bus_t, vlog, void,
@@ -303,6 +306,7 @@ METHOD(bus_t, vlog, void,
data.group = group;
data.level = level;
data.message = buf;
+ data.id = 0;
va_copy(copy, args);
len = vsnprintf(data.message, sizeof(buf), format, copy);
diff --git a/src/libcharon/bus/listeners/file_logger.c b/src/libcharon/bus/listeners/file_logger.c
index 68a386d..d5b7a92 100644
--- a/src/libcharon/bus/listeners/file_logger.c
+++ b/src/libcharon/bus/listeners/file_logger.c
@@ -20,6 +20,7 @@
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
+#include <inttypes.h>
#include "file_logger.h"
@@ -77,9 +78,9 @@ struct private_file_logger_t {
METHOD(logger_t, log_, void,
private_file_logger_t *this, debug_t group, level_t level, int thread,
- ike_sa_t* ike_sa, const char *message)
+ ike_sa_t* ike_sa, const char *message, u_int64_t id)
{
- char timestr[128], namestr[128] = "";
+ char timestr[128], namestr[128] = "", idstr[128] = "";
const char *current = message, *next;
struct tm tm;
time_t t;
@@ -114,6 +115,11 @@ METHOD(logger_t, log_, void,
namestr[0] = '\0';
}
+ if (0 != id)
+ {
+ snprintf(idstr, sizeof(idstr), ":%05"PRIu64, id);
+ }
+
/* prepend a prefix in front of every line */
this->mutex->lock(this->mutex);
while (TRUE)
@@ -121,13 +127,13 @@ METHOD(logger_t, log_, void,
next = strchr(current, '\n');
if (this->time_format)
{
- fprintf(this->out, "%s %.2d[%N]%s ",
- timestr, thread, debug_names, group, namestr);
+ fprintf(this->out, "%s %.2d[%N]%s%s ",
+ timestr, thread, debug_names, group, namestr, idstr);
}
else
{
- fprintf(this->out, "%.2d[%N]%s ",
- thread, debug_names, group, namestr);
+ fprintf(this->out, "%.2d[%N]%s%s ",
+ thread, debug_names, group, namestr, idstr);
}
if (next == NULL)
{
diff --git a/src/libcharon/bus/listeners/logger.h b/src/libcharon/bus/listeners/logger.h
index 3b99e7d..ca6ae6b 100644
--- a/src/libcharon/bus/listeners/logger.h
+++ b/src/libcharon/bus/listeners/logger.h
@@ -43,9 +43,10 @@ struct logger_t {
* @param thread ID of the thread raised this signal
* @param ike_sa IKE_SA associated to the event
* @param message log message
+ * @param id unique error id
*/
void (*log)(logger_t *this, debug_t group, level_t level, int thread,
- ike_sa_t *ike_sa, const char *message);
+ ike_sa_t *ike_sa, const char *message, u_int64_t id);
/**
* Get the desired log level for a debug group. This is called during
diff --git a/src/libcharon/bus/listeners/sys_logger.c b/src/libcharon/bus/listeners/sys_logger.c
index 82e2c8e..afd79ad 100644
--- a/src/libcharon/bus/listeners/sys_logger.c
+++ b/src/libcharon/bus/listeners/sys_logger.c
@@ -17,6 +17,7 @@
#include <stdio.h>
#include <string.h>
#include <syslog.h>
+#include <inttypes.h>
#include "sys_logger.h"
@@ -63,9 +64,9 @@ struct private_sys_logger_t {
METHOD(logger_t, log_, void,
private_sys_logger_t *this, debug_t group, level_t level, int thread,
- ike_sa_t* ike_sa, const char *message)
+ ike_sa_t* ike_sa, const char *message, u_int64_t id)
{
- char groupstr[4], namestr[128] = "";
+ char groupstr[4], namestr[128] = "", idstr[128] = "";
const char *current = message, *next;
/* cache group name and optional name string */
@@ -87,6 +88,11 @@ METHOD(logger_t, log_, void,
}
this->lock->unlock(this->lock);
+ if (0 != id)
+ {
+ snprintf(idstr, sizeof(idstr), ":%05"PRIu64, id);
+ }
+
/* do a syslog for every line */
this->mutex->lock(this->mutex);
while (TRUE)
@@ -94,12 +100,12 @@ METHOD(logger_t, log_, void,
next = strchr(current, '\n');
if (next == NULL)
{
- syslog(this->facility | LOG_INFO, "%.2d[%s]%s %s\n",
- thread, groupstr, namestr, current);
+ syslog(this->facility | LOG_INFO, "%.2d[%s]%s%s %s\n",
+ thread, groupstr, namestr, idstr, current);
break;
}
- syslog(this->facility | LOG_INFO, "%.2d[%s]%s %.*s\n",
- thread, groupstr, namestr, (int)(next - current), current);
+ syslog(this->facility | LOG_INFO, "%.2d[%s]%s%s %.*s\n",
+ thread, groupstr, namestr, idstr, (int)(next - current), current);
current = next + 1;
}
this->mutex->unlock(this->mutex);
diff --git a/src/libcharon/control/controller.c b/src/libcharon/control/controller.c
index 77d73db..0cdcc29 100644
--- a/src/libcharon/control/controller.c
+++ b/src/libcharon/control/controller.c
@@ -209,7 +209,7 @@ static bool wait_for_listener(interface_job_t *job, u_int timeout)
METHOD(logger_t, listener_log, void,
interface_logger_t *this, debug_t group, level_t level, int thread,
- ike_sa_t *ike_sa, const char *message)
+ ike_sa_t *ike_sa, const char *message, u_int64_t id)
{
ike_sa_t *target;
@@ -219,7 +219,7 @@ METHOD(logger_t, listener_log, void,
if (target == ike_sa)
{
- if (!this->callback(this->param, group, level, ike_sa, message))
+ if (!this->callback(this->param, group, level, ike_sa, message, id))
{
this->listener->status = NEED_MORE;
listener_done(this->listener);
@@ -627,7 +627,7 @@ METHOD(controller_t, terminate_child, status_t,
* See header
*/
bool controller_cb_empty(void *param, debug_t group, level_t level,
- ike_sa_t *ike_sa, const char *message)
+ ike_sa_t *ike_sa, const char *message, u_int64_t id)
{
return TRUE;
}
diff --git a/src/libcharon/control/controller.h b/src/libcharon/control/controller.h
index 222285c..fb82a95 100644
--- a/src/libcharon/control/controller.h
+++ b/src/libcharon/control/controller.h
@@ -31,10 +31,12 @@
* @param level verbosity level
* @param ike_sa associated IKE_SA, if any
* @param message log message
+ * @param id unique error id
* @return FALSE to return from called controller method
*/
typedef bool (*controller_cb_t)(void* param, debug_t group, level_t level,
- ike_sa_t* ike_sa, const char *message);
+ ike_sa_t* ike_sa, const char *message,
+ u_int64_t id);
/**
* Empty callback function for controller_t methods.
@@ -43,7 +45,7 @@ typedef bool (*controller_cb_t)(void* param, debug_t group, level_t level,
* this function to the controller methods.
*/
bool controller_cb_empty(void *param, debug_t group, level_t level,
- ike_sa_t *ike_sa, const char *message);
+ ike_sa_t *ike_sa, const char *message, u_int64_t id);
typedef struct controller_t controller_t;
diff --git a/src/libcharon/plugins/android_log/android_log_logger.c b/src/libcharon/plugins/android_log/android_log_logger.c
index 48bcaa5..eb6b5aa 100644
--- a/src/libcharon/plugins/android_log/android_log_logger.c
+++ b/src/libcharon/plugins/android_log/android_log_logger.c
@@ -47,24 +47,29 @@ struct private_android_log_logger_t {
METHOD(logger_t, log_, void,
private_android_log_logger_t *this, debug_t group, level_t level,
- int thread, ike_sa_t* ike_sa, const char *message)
+ int thread, ike_sa_t* ike_sa, const char *message, u_int64_t id)
{
int prio = level > 1 ? ANDROID_LOG_DEBUG : ANDROID_LOG_INFO;
- char sgroup[16];
+ char sgroup[16], idstr[22] = "";
const char *current = message, *next;
snprintf(sgroup, sizeof(sgroup), "%N", debug_names, group);
+ if (0 != id)
+ {
+ snprintf(idstr, sizeof(idstr), "%05"PRIu64, id);
+ }
this->mutex->lock(this->mutex);
while (TRUE)
{ /* log each line separately */
next = strchr(current, '\n');
if (next == NULL)
{
- __android_log_print(prio, "charon", "%.2d[%s] %s\n",
- thread, sgroup, current);
+ __android_log_print(prio, "charon", "%.2d[%s]%s %s\n",
+ thread, sgroup, idstr, current);
break;
}
- __android_log_print(prio, "charon", "%.2d[%s] %.*s\n",
- thread, sgroup, (int)(next - current), current);
+ __android_log_print(prio, "charon", "%.2d[%s]%s %.*s\n",
+ thread, sgroup, idstr, (int)(next - current),
+ current);
current = next + 1;
}
this->mutex->unlock(this->mutex);
diff --git a/src/libcharon/plugins/smp/smp.c b/src/libcharon/plugins/smp/smp.c
index db52952..ae7d8d1 100644
--- a/src/libcharon/plugins/smp/smp.c
+++ b/src/libcharon/plugins/smp/smp.c
@@ -26,6 +26,7 @@
#include <signal.h>
#include <libxml/xmlreader.h>
#include <libxml/xmlwriter.h>
+#include <inttypes.h>
#include <library.h>
#include <daemon.h>
@@ -346,7 +347,7 @@ static void request_query_config(xmlTextReaderPtr reader, xmlTextWriterPtr write
* callback which logs to a XML writer
*/
static bool xml_callback(xmlTextWriterPtr writer, debug_t group, level_t level,
- ike_sa_t* ike_sa, char* message)
+ ike_sa_t* ike_sa, char* message, u_int64_t id)
{
if (level <= 1)
{
@@ -355,6 +356,10 @@ static bool xml_callback(xmlTextWriterPtr writer, debug_t group, level_t level,
xmlTextWriterWriteFormatAttribute(writer, "level", "%d", level);
xmlTextWriterWriteFormatAttribute(writer, "source", "%N", debug_names, group);
xmlTextWriterWriteFormatAttribute(writer, "thread", "%u", thread_current_id());
+ if (0 != id)
+ {
+ xmlTextWriterWriteFormatAttribute(writer, "id", "%"PRIu64, id);
+ }
xmlTextWriterWriteString(writer, message);
xmlTextWriterEndElement(writer);
/* </item> */
diff --git a/src/libcharon/plugins/sql/sql_logger.c b/src/libcharon/plugins/sql/sql_logger.c
index 547e769..30681c9 100644
--- a/src/libcharon/plugins/sql/sql_logger.c
+++ b/src/libcharon/plugins/sql/sql_logger.c
@@ -50,8 +50,9 @@ struct private_sql_logger_t {
METHOD(logger_t, log_, void,
private_sql_logger_t *this, debug_t group, level_t level, int thread,
- ike_sa_t* ike_sa, const char *message)
+ ike_sa_t* ike_sa, const char *message, u_int64_t id)
{
+ (void)id;
if (this->recursive->get(this->recursive))
{
return;
diff --git a/src/libcharon/plugins/stroke/stroke_control.c b/src/libcharon/plugins/stroke/stroke_control.c
index 233d408..8c52c4e 100644
--- a/src/libcharon/plugins/stroke/stroke_control.c
+++ b/src/libcharon/plugins/stroke/stroke_control.c
@@ -17,6 +17,7 @@
#include <hydra.h>
#include <daemon.h>
+#include <inttypes.h>
#include <processing/jobs/delete_ike_sa_job.h>
#include <processing/jobs/rekey_ike_sa_job.h>
@@ -58,10 +59,17 @@ struct stroke_log_info_t {
* logging to the stroke interface
*/
static bool stroke_log(stroke_log_info_t *info, debug_t group, level_t level,
- ike_sa_t *ike_sa, char *message)
+ ike_sa_t *ike_sa, char *message, u_int64_t id)
{
if (level <= info->level)
{
+ if (0 != id)
+ {
+ if (fprintf(info->out, "%05"PRIu64": ", id) < 0)
+ {
+ return FALSE;
+ }
+ }
if (fprintf(info->out, "%s", message) < 0 ||
fprintf(info->out, "\n") < 0 ||
fflush(info->out) != 0)
diff --git a/src/libcharon/processing/jobs/initiate_mediation_job.c b/src/libcharon/processing/jobs/initiate_mediation_job.c
index 17ab830..93361f3 100644
--- a/src/libcharon/processing/jobs/initiate_mediation_job.c
+++ b/src/libcharon/processing/jobs/initiate_mediation_job.c
@@ -54,8 +54,10 @@ METHOD(job_t, destroy, void,
*/
static bool initiate_callback(private_initiate_mediation_job_t *this,
debug_t group, level_t level, ike_sa_t *ike_sa,
- char *message)
+ char *message, u_int64_t id)
{
+ (void)id;
+
if (ike_sa && !this->mediation_sa_id)
{
this->mediation_sa_id = ike_sa->get_id(ike_sa);
_______________________________________________
Dev mailing list
[email protected]
https://lists.strongswan.org/mailman/listinfo/dev