* [PATCH v3 1/1] golang/xenlight: add NameToDomid and DomidToName util functions
2020-05-13 0:55 [PATCH v3 0/1] More wrappers for xenlight Go package Nick Rosbrook
@ 2020-05-13 0:55 ` Nick Rosbrook
2020-05-13 10:15 ` George Dunlap
0 siblings, 1 reply; 3+ messages in thread
From: Nick Rosbrook @ 2020-05-13 0:55 UTC (permalink / raw)
To: xen-devel; +Cc: Nick Rosbrook, Ian Jackson, George Dunlap, Wei Liu
Many exported functions in xenlight require a domid as an argument. Make
it easier for package users to use these functions by adding wrappers
for the libxl utility functions libxl_name_to_domid and
libxl_domid_to_name.
Signed-off-by: Nick Rosbrook <rosbrookn@ainfosec.com>
---
tools/golang/xenlight/xenlight.go | 40 ++++++++++++++++++++++++++++++-
1 file changed, 39 insertions(+), 1 deletion(-)
diff --git a/tools/golang/xenlight/xenlight.go b/tools/golang/xenlight/xenlight.go
index 6b4f492550..742e5e11f1 100644
--- a/tools/golang/xenlight/xenlight.go
+++ b/tools/golang/xenlight/xenlight.go
@@ -21,13 +21,15 @@ package xenlight
#cgo LDFLAGS: -lxenlight -lyajl -lxentoollog
#include <stdlib.h>
#include <libxl.h>
+#include <libxl_utils.h>
+
+#define INVALID_DOMID_TYPED ((uint32_t) INVALID_DOMID)
static const libxl_childproc_hooks childproc_hooks = { .chldowner = libxl_sigchld_owner_mainloop };
void xenlight_set_chldproc(libxl_ctx *ctx) {
libxl_childproc_setmode(ctx, &childproc_hooks, NULL);
}
-
*/
import "C"
@@ -75,6 +77,10 @@ var libxlErrors = map[Error]string{
ErrorFeatureRemoved: "Feature removed",
}
+const (
+ DomidInvalid Domid = Domid(C.INVALID_DOMID_TYPED)
+)
+
func (e Error) Error() string {
if s, ok := libxlErrors[e]; ok {
return s
@@ -190,6 +196,38 @@ func (ctx *Context) Close() error {
type Domid uint32
+// NameToDomid returns the Domid for a domain, given its name, if it exists.
+//
+// NameToDomid does not guarantee that the domid associated with name at
+// the time NameToDomid is called is the same as the domid associated with
+// name at the time NameToDomid returns.
+func (Ctx *Context) NameToDomid(name string) (Domid, error) {
+ var domid C.uint32_t
+
+ cname := C.CString(name)
+ defer C.free(unsafe.Pointer(cname))
+
+ if ret := C.libxl_name_to_domid(Ctx.ctx, cname, &domid); ret != 0 {
+ return DomidInvalid, Error(ret)
+ }
+
+ return Domid(domid), nil
+}
+
+// DomidToName returns the name for a domain, given its domid. If there
+// is no domain with the given domid, DomidToName will return the empty
+// string.
+//
+// DomidToName does not guarantee that the name (if any) associated with domid
+// at the time DomidToName is called is the same as the name (if any) associated
+// with domid at the time DomidToName returns.
+func (Ctx *Context) DomidToName(domid Domid) string {
+ cname := C.libxl_domid_to_name(Ctx.ctx, C.uint32_t(domid))
+ defer C.free(unsafe.Pointer(cname))
+
+ return C.GoString(cname)
+}
+
// Devid is a device ID.
type Devid int
--
2.17.1
^ permalink raw reply related [flat|nested] 3+ messages in thread