aboutsummaryrefslogtreecommitdiffstats
path: root/tools/libxc/xtl_core.c
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2010-05-28 09:29:15 +0100
committerKeir Fraser <keir.fraser@citrix.com>2010-05-28 09:29:15 +0100
commit7f9a888af4b65cb8c22cea3c8295d30d0fedd623 (patch)
tree84001e50ab1b7f9fa6bb45494dab0d241cc72253 /tools/libxc/xtl_core.c
parent36cfb6aa84c1b5a5b5ac15883e34b10f32ab0ab8 (diff)
downloadxen-7f9a888af4b65cb8c22cea3c8295d30d0fedd623.tar.gz
xen-7f9a888af4b65cb8c22cea3c8295d30d0fedd623.tar.bz2
xen-7f9a888af4b65cb8c22cea3c8295d30d0fedd623.zip
xtl: New xentoollog mini-library.
We provide a new header file "xentoollog.h" which defines an interface that libraries and applications can use for logging. This avoids having to wrap each library's log callbacks up, massage arguments to log callbacks, and so on. The library's .o files are within libxc to avoid having to create a separate lib*.a, but callers do not need to #include xenctrl.h and it should be regarded as a separate API. Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
Diffstat (limited to 'tools/libxc/xtl_core.c')
-rw-r--r--tools/libxc/xtl_core.c69
1 files changed, 69 insertions, 0 deletions
diff --git a/tools/libxc/xtl_core.c b/tools/libxc/xtl_core.c
new file mode 100644
index 0000000000..2a6a53fc38
--- /dev/null
+++ b/tools/libxc/xtl_core.c
@@ -0,0 +1,69 @@
+/*
+ * xtl_core.c
+ *
+ * core code including functions for generating log messages
+ *
+ * Copyright (c) 2010 Citrix
+ * Part of a generic logging interface used by various dom0 userland libraries.
+ */
+
+#include "xentoollog.h"
+
+#include <assert.h>
+#include <errno.h>
+#include <limits.h>
+
+static const char *level_strings[XTL_NUM_LEVELS]= {
+ "[BUG:XTL_NONE]",
+ "debug", "verbose", "detail", /* normally off by default */
+ "progress", "info", "notice", /* not a problem */
+ "warning", "error", "critical" /* problems and errors */
+};
+
+const char *xtl_level_to_string(xentoollog_level level) {
+ assert(level >= 0 && level < XTL_NUM_LEVELS);
+ return level_strings[level];
+}
+
+void xtl_logv(struct xentoollog_logger *logger,
+ xentoollog_level level,
+ int errnoval /* or -1 */,
+ const char *context /* eg "xc", "xenstore", "xl" */,
+ const char *format /* does not contain \n */,
+ va_list al) {
+ int errno_save = errno;
+ assert(level > XTL_NONE && level < XTL_NUM_LEVELS);
+ logger->vmessage(logger,level,errnoval,context,format,al);
+ errno = errno_save;
+}
+
+void xtl_log(struct xentoollog_logger *logger,
+ xentoollog_level level,
+ int errnoval /* or -1 */,
+ const char *context /* eg "xc", "xenstore", "xl" */,
+ const char *format /* does not contain \n */,
+ ...) {
+ va_list al;
+ va_start(al,format);
+ xtl_logv(logger,level,errnoval,context,format,al);
+ va_end(al);
+}
+
+void xtl_progress(struct xentoollog_logger *logger,
+ const char *context, const char *doing_what,
+ unsigned long done, unsigned long total) {
+ int percent;
+
+ if (!logger->progress) return;
+
+ percent = (total < LONG_MAX/100)
+ ? (done * 100) / total
+ : done / ((total + 99) / 100);
+
+ logger->progress(logger, context, doing_what, percent, done, total);
+}
+
+void xtl_logger_destroy(struct xentoollog_logger *logger) {
+ if (!logger) return;
+ logger->destroy(logger);
+}