Add some logging methods to Context to provide easy use of the
Contenxt's xentoollog_logger. These are not exported, but the LogLevel
type is so that a later commit can allow the Context's log level to be
configurable.
Becuase cgo does not support calling C functions with variable
arguments, e.g. xtl_log, add an xtl_log_wrap function to the cgo preamble
that accepts an already formatted string, and handle the formatting in
Go.
Signed-off-by: Nick Rosbrook <rosbrookn@ainfosec.com>
---
tools/golang/xenlight/xenlight.go | 45 +++++++++++++++++++++++++++++++
1 file changed, 45 insertions(+)
diff --git a/tools/golang/xenlight/xenlight.go b/tools/golang/xenlight/xenlight.go
index fc3eb0bf3f..f68d7b6e97 100644
--- a/tools/golang/xenlight/xenlight.go
+++ b/tools/golang/xenlight/xenlight.go
@@ -32,6 +32,15 @@ static const libxl_childproc_hooks childproc_hooks = { .chldowner = libxl_sigchl
void xenlight_set_chldproc(libxl_ctx *ctx) {
libxl_childproc_setmode(ctx, &childproc_hooks, NULL);
}
+
+void xtl_log_wrap(struct xentoollog_logger *logger,
+ xentoollog_level level,
+ int errnoval,
+ const char *context,
+ const char *msg)
+{
+ xtl_log(logger, level, errnoval, context, "%s", msg);
+}
*/
import "C"
@@ -192,6 +201,42 @@ func (ctx *Context) Close() error {
return nil
}
+// LogLevel represents an xentoollog_level, and can be used to configre the log
+// level of a Context's logger.
+type LogLevel int
+
+const (
+ //LogLevelNone LogLevel = C.XTL_NONE
+ LogLevelDebug LogLevel = C.XTL_DEBUG
+ LogLevelVerbose LogLevel = C.XTL_VERBOSE
+ LogLevelDetail LogLevel = C.XTL_DETAIL
+ LogLevelProgress LogLevel = C.XTL_PROGRESS
+ LogLevelInfo LogLevel = C.XTL_INFO
+ LogLevelNotice LogLevel = C.XTL_NOTICE
+ LogLevelWarn LogLevel = C.XTL_WARN
+ LogLevelError LogLevel = C.XTL_ERROR
+ LogLevelCritical LogLevel = C.XTL_CRITICAL
+ //LogLevelNumLevels LogLevel = C.XTL_NUM_LEVELS
+)
+
+func (ctx *Context) log(lvl LogLevel, errnoval int, format string, a ...interface{}) {
+ msg := C.CString(fmt.Sprintf(format, a...))
+ defer C.free(unsafe.Pointer(msg))
+ context := C.CString("xenlight")
+ defer C.free(unsafe.Pointer(context))
+
+ C.xtl_log_wrap((*C.xentoollog_logger)(unsafe.Pointer(ctx.logger)),
+ C.xentoollog_level(lvl), C.int(errnoval), context, msg)
+}
+
+func (ctx *Context) logd(format string, a ...interface{}) {
+ ctx.log(LogLevelDebug, -1, format, a...)
+}
+
+func (ctx *Context) logw(format string, a ...interface{}) {
+ ctx.log(LogLevelWarn, -1, format, a...)
+}
+
/*
* Types: Builtins
*/
--
2.17.1
Contenxt's xentoollog_logger. These are not exported, but the LogLevel
type is so that a later commit can allow the Context's log level to be
configurable.
Becuase cgo does not support calling C functions with variable
arguments, e.g. xtl_log, add an xtl_log_wrap function to the cgo preamble
that accepts an already formatted string, and handle the formatting in
Go.
Signed-off-by: Nick Rosbrook <rosbrookn@ainfosec.com>
---
tools/golang/xenlight/xenlight.go | 45 +++++++++++++++++++++++++++++++
1 file changed, 45 insertions(+)
diff --git a/tools/golang/xenlight/xenlight.go b/tools/golang/xenlight/xenlight.go
index fc3eb0bf3f..f68d7b6e97 100644
--- a/tools/golang/xenlight/xenlight.go
+++ b/tools/golang/xenlight/xenlight.go
@@ -32,6 +32,15 @@ static const libxl_childproc_hooks childproc_hooks = { .chldowner = libxl_sigchl
void xenlight_set_chldproc(libxl_ctx *ctx) {
libxl_childproc_setmode(ctx, &childproc_hooks, NULL);
}
+
+void xtl_log_wrap(struct xentoollog_logger *logger,
+ xentoollog_level level,
+ int errnoval,
+ const char *context,
+ const char *msg)
+{
+ xtl_log(logger, level, errnoval, context, "%s", msg);
+}
*/
import "C"
@@ -192,6 +201,42 @@ func (ctx *Context) Close() error {
return nil
}
+// LogLevel represents an xentoollog_level, and can be used to configre the log
+// level of a Context's logger.
+type LogLevel int
+
+const (
+ //LogLevelNone LogLevel = C.XTL_NONE
+ LogLevelDebug LogLevel = C.XTL_DEBUG
+ LogLevelVerbose LogLevel = C.XTL_VERBOSE
+ LogLevelDetail LogLevel = C.XTL_DETAIL
+ LogLevelProgress LogLevel = C.XTL_PROGRESS
+ LogLevelInfo LogLevel = C.XTL_INFO
+ LogLevelNotice LogLevel = C.XTL_NOTICE
+ LogLevelWarn LogLevel = C.XTL_WARN
+ LogLevelError LogLevel = C.XTL_ERROR
+ LogLevelCritical LogLevel = C.XTL_CRITICAL
+ //LogLevelNumLevels LogLevel = C.XTL_NUM_LEVELS
+)
+
+func (ctx *Context) log(lvl LogLevel, errnoval int, format string, a ...interface{}) {
+ msg := C.CString(fmt.Sprintf(format, a...))
+ defer C.free(unsafe.Pointer(msg))
+ context := C.CString("xenlight")
+ defer C.free(unsafe.Pointer(context))
+
+ C.xtl_log_wrap((*C.xentoollog_logger)(unsafe.Pointer(ctx.logger)),
+ C.xentoollog_level(lvl), C.int(errnoval), context, msg)
+}
+
+func (ctx *Context) logd(format string, a ...interface{}) {
+ ctx.log(LogLevelDebug, -1, format, a...)
+}
+
+func (ctx *Context) logw(format string, a ...interface{}) {
+ ctx.log(LogLevelWarn, -1, format, a...)
+}
+
/*
* Types: Builtins
*/
--
2.17.1