diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2010-05-28 09:29:15 +0100 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2010-05-28 09:29:15 +0100 |
commit | 7f9a888af4b65cb8c22cea3c8295d30d0fedd623 (patch) | |
tree | 84001e50ab1b7f9fa6bb45494dab0d241cc72253 /tools/libxc/xtl_core.c | |
parent | 36cfb6aa84c1b5a5b5ac15883e34b10f32ab0ab8 (diff) | |
download | xen-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.c | 69 |
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); +} |