aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/osmocom/core/logging.h18
-rw-r--r--src/logging.c5
2 files changed, 21 insertions, 2 deletions
diff --git a/include/osmocom/core/logging.h b/include/osmocom/core/logging.h
index 3da9d336..581ebcec 100644
--- a/include/osmocom/core/logging.h
+++ b/include/osmocom/core/logging.h
@@ -207,13 +207,29 @@ struct log_target {
};
/*! \brief call-back function to be called when the logging framework
- * wants to log somethnig.
+ * wants to log a fully formatted string
* \param[in] target logging target
* \param[in] level log level of currnet message
* \param[in] string the string that is to be written to the log
*/
void (*output) (struct log_target *target, unsigned int level,
const char *string);
+
+ /*! \brief alternative call-back function to which the logging
+ * framework passes the unfortmatted input arguments,
+ * i.e. bypassing the internal string formatter
+ * \param[in] target logging target
+ * \param[in] subsys logging sub-system
+ * \param[in] level logging level
+ * \param[in] file soure code file name
+ * \param[in] line source code file line number
+ * \param[in] cont continuation of previous statement?
+ * \param[in] format format string
+ * \param[in] ap vararg list of printf arguments
+ */
+ void (*raw_output)(struct log_target *target, int subsys,
+ unsigned int level, const char *file, int line,
+ int cont, const char *format, va_list ap);
};
/* use the above macros */
diff --git a/src/logging.c b/src/logging.c
index 9e30d5f8..165d8229 100644
--- a/src/logging.c
+++ b/src/logging.c
@@ -385,7 +385,10 @@ void osmo_vlogp(int subsys, int level, const char *file, int line,
* in undefined state. Since _output uses vsnprintf and it may
* be called several times, we have to pass a copy of ap. */
va_copy(bp, ap);
- _output(tar, subsys, level, file, line, cont, format, bp);
+ if (tar->raw_output)
+ tar->raw_output(tar, subsys, level, file, line, cont, format, bp);
+ else
+ _output(tar, subsys, level, file, line, cont, format, bp);
va_end(bp);
}
}