allow compositors to define the logging behavior

Signed-off-by: Giulio Camuffo <giuliocamuffo@gmail.com>
Reviewed-by: Quentin Glidic <sardemff7+git@sardemff7.net>
Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
diff --git a/src/log.c b/src/log.c
index 0302c8c..7d99a95 100644
--- a/src/log.c
+++ b/src/log.c
@@ -36,78 +36,33 @@
 
 #include "compositor.h"
 
-#include "os-compatibility.h"
+static log_func_t log_handler = 0;
+static log_func_t log_continue_handler = 0;
 
-static FILE *weston_logfile = NULL;
-
-static int cached_tm_mday = -1;
-
-static int weston_log_timestamp(void)
+/** Install the log handler
+ *
+ * The given functions will be called to output text as passed to the
+ * \a weston_log and \a weston_log_continue functions.
+ *
+ * \param log The log function. This function will be called when
+ *            \a weston_log is called, and should begin a new line,
+ *            with user defined line headers, if any.
+ * \param cont The continue log function. This function will be called
+ *             when \a weston_log_continue is called, and should append
+ *             its output to the current line, without any header or
+ *             other content in between.
+ */
+WL_EXPORT void
+weston_log_set_handler(log_func_t log, log_func_t cont)
 {
-	struct timeval tv;
-	struct tm *brokendown_time;
-	char string[128];
-
-	gettimeofday(&tv, NULL);
-
-	brokendown_time = localtime(&tv.tv_sec);
-	if (brokendown_time == NULL)
-		return fprintf(weston_logfile, "[(NULL)localtime] ");
-
-	if (brokendown_time->tm_mday != cached_tm_mday) {
-		strftime(string, sizeof string, "%Y-%m-%d %Z", brokendown_time);
-		fprintf(weston_logfile, "Date: %s\n", string);
-
-		cached_tm_mday = brokendown_time->tm_mday;
-	}
-
-	strftime(string, sizeof string, "%H:%M:%S", brokendown_time);
-
-	return fprintf(weston_logfile, "[%s.%03li] ", string, tv.tv_usec/1000);
-}
-
-static void
-custom_handler(const char *fmt, va_list arg)
-{
-	weston_log_timestamp();
-	fprintf(weston_logfile, "libwayland: ");
-	vfprintf(weston_logfile, fmt, arg);
-}
-
-void
-weston_log_file_open(const char *filename)
-{
-	wl_log_set_handler_server(custom_handler);
-
-	if (filename != NULL) {
-		weston_logfile = fopen(filename, "a");
-		if (weston_logfile)
-			os_fd_set_cloexec(fileno(weston_logfile));
-	}
-
-	if (weston_logfile == NULL)
-		weston_logfile = stderr;
-	else
-		setvbuf(weston_logfile, NULL, _IOLBF, 256);
-}
-
-void
-weston_log_file_close()
-{
-	if ((weston_logfile != stderr) && (weston_logfile != NULL))
-		fclose(weston_logfile);
-	weston_logfile = stderr;
+	log_handler = log;
+	log_continue_handler = cont;
 }
 
 WL_EXPORT int
 weston_vlog(const char *fmt, va_list ap)
 {
-	int l;
-
-	l = weston_log_timestamp();
-	l += vfprintf(weston_logfile, fmt, ap);
-
-	return l;
+	return log_handler(fmt, ap);
 }
 
 WL_EXPORT int
@@ -126,7 +81,7 @@
 WL_EXPORT int
 weston_vlog_continue(const char *fmt, va_list argp)
 {
-	return vfprintf(weston_logfile, fmt, argp);
+	return log_continue_handler(fmt, argp);
 }
 
 WL_EXPORT int