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

Reply via email to