See the earlier commit "Add Extent64 arg type" for rationale in
supporting a new generator arg type.  This patch adds the Go bindings
for use of Extent64, which required adding a counterpart Go type and
introducing a helper function for copying from the C array to an
actual Go object, very similar to the existing copy_uint32_array
helper for 32-bit extents.

Signed-off-by: Eric Blake <ebl...@redhat.com>
---

v4: split out of larger patch [Laszlo], avoid awkward slice since we
can't use copy() anyway [Laszlo]
---
 generator/GoLang.ml | 23 +++++++++++++++++++++++
 golang/handle.go    |  6 ++++++
 2 files changed, 29 insertions(+)

diff --git a/generator/GoLang.ml b/generator/GoLang.ml
index cc7d78b6..7a516366 100644
--- a/generator/GoLang.ml
+++ b/generator/GoLang.ml
@@ -528,6 +528,21 @@ let
     }
     return ret
 }
+
+func copy_extent_array(entries *C.nbd_extent, count C.size_t) []LibnbdExtent {
+    if (uint64(count) > 64*1024*1024) {
+        panic(\"violation of state machine guarantee\")
+    }
+    ret := make([]LibnbdExtent, count)
+    addr := uintptr(unsafe.Pointer(entries))
+    for i := 0; i < int(count); i++ {
+        ptr := (*C.nbd_extent)(unsafe.Pointer(addr))
+        ret[i].Length = uint64((*ptr).length)
+        ret[i].Flags = uint64((*ptr).flags)
+        addr += unsafe.Sizeof(*ptr)
+    }
+    return ret
+}
 ";

   List.iter (
@@ -542,6 +557,8 @@ let
           match cbarg with
           | CBArrayAndLen (UInt32 n, _) ->
              pr "%s []uint32" n;
+          | CBArrayAndLen (Extent64 n, _) ->
+             pr "%s []LibnbdExtent" n;
           | CBBytesIn (n, len) ->
              pr "%s []byte" n;
           | CBInt n ->
@@ -568,6 +585,8 @@ let
           match cbarg with
           | CBArrayAndLen (UInt32 n, count) ->
              pr "%s *C.uint32_t, %s C.size_t" n count
+          | CBArrayAndLen (Extent64 n, count) ->
+             pr "%s *C.nbd_extent, %s C.size_t" n count
           | CBBytesIn (n, len) ->
              pr "%s unsafe.Pointer, %s C.size_t" n len
           | CBInt n ->
@@ -610,6 +629,8 @@ let
           match cbarg with
           | CBArrayAndLen (UInt32 n, count) ->
              pr "copy_uint32_array(%s, %s)" n count
+          | CBArrayAndLen (Extent64 n, count) ->
+             pr "copy_extent_array(%s, %s)" n count
           | CBBytesIn (n, len) ->
              pr "C.GoBytes(%s, C.int(%s))" n len
           | CBInt n ->
@@ -760,6 +781,8 @@ let
            match cbarg with
            | CBArrayAndLen (UInt32 n, count) ->
               pr "uint32_t *%s, size_t %s" n count
+           | CBArrayAndLen (Extent64 n, count) ->
+              pr "nbd_extent *%s, size_t %s" n count
            | CBBytesIn (n, len) ->
               pr "void *%s, size_t %s" n len
            | CBInt n ->
diff --git a/golang/handle.go b/golang/handle.go
index 5fe4ed4f..2b0ee6d5 100644
--- a/golang/handle.go
+++ b/golang/handle.go
@@ -58,6 +58,12 @@ func (h *Libnbd) String() string {
        return "&Libnbd{}"
 }

+/* Used for block status callback. */
+type LibnbdExtent struct {
+       Length uint64 // length of the extent
+       Flags  uint64 // flags describing properties of the extent
+}
+
 /* All functions (except Close) return ([result,] LibnbdError). */
 type LibnbdError struct {
        Op     string        // operation which failed
-- 
2.41.0

_______________________________________________
Libguestfs mailing list
Libguestfs@redhat.com
https://listman.redhat.com/mailman/listinfo/libguestfs

Reply via email to