On Wed, Aug 02, 2023 at 08:50:23PM -0500, Eric Blake wrote:
See the earlier commit "Add Extent64 arg type" for
rationale in
supporting a new generator arg type. This patch adds the C bindings
for use of Extent64: it exposes a new 'struct nbd_extent' in
<libnbd.h>, as well as the code to generate the C bindings for passing
an extent64_closure once a new API uses the type in an upcoming patch.
Note that 'struct nbd_block_descriptor_64' in lib/nbd-protocol.h is
exactly the same as what we want to use in C. But it is easier to
stick a new public type in <libnbd.h> than to figure out how to expose
just part of a header we only want to use internally, and leaves us
free to alter nbd-protocol.h (which is shared with nbdkit) without
affecting public API.
Signed-off-by: Eric Blake <eblake(a)redhat.com>
---
v4: split out of larger patch [Laszlo]
---
generator/API.mli | 2 +-
generator/C.ml | 12 ++++++++++++
2 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/generator/API.mli b/generator/API.mli
index 80633018..96626c9b 100644
--- a/generator/API.mli
+++ b/generator/API.mli
@@ -52,7 +52,7 @@ and
| BytesPersistOut of string * string
| Closure of closure (** function pointer + void *opaque *)
| Enum of string * enum (** enum/union type, int in C *)
-| Extent64 of string (** extent descriptor *)
+| Extent64 of string (** extent descriptor, struct nbd_extent in C *)
With an improved comment / the comment change hunk here dropped (see
my review of the prior commit):
Reviewed-by: Richard W.M. Jones <rjones(a)redhat.com>
| Fd of string (** file descriptor *)
| Flags of string * flags (** flags, uint32_t in C *)
| Int of string (** small int *)
diff --git a/generator/C.ml b/generator/C.ml
index 606ba1e0..e5a2879b 100644
--- a/generator/C.ml
+++ b/generator/C.ml
@@ -308,6 +308,11 @@ and
pr "%s, " n;
if types then pr "size_t ";
pr "%s" len
+ | CBArrayAndLen (Extent64 n, len) ->
+ if types then pr "nbd_extent *";
+ pr "%s, " n;
+ if types then pr "size_t ";
+ pr "%s" len
| CBArrayAndLen _ -> assert false
| CBBytesIn (n, len) ->
if types then pr "const void *";
@@ -488,6 +493,13 @@ let
pr "extern int nbd_get_errno (void);\n";
pr "#define LIBNBD_HAVE_NBD_GET_ERRNO 1\n";
pr "\n";
+ pr "/* This is used in the callback for nbd_block_status_64.\n";
+ pr " */\n";
+ pr "typedef struct {\n";
+ pr " uint64_t length;\n";
+ pr " uint64_t flags;\n";
+ pr "} nbd_extent;\n";
+ pr "\n";
print_closure_structs ();
List.iter (
fun (name, { args; optargs; ret }) ->
Rich.
--
Richard Jones, Virtualization Group, Red Hat
http://people.redhat.com/~rjones
Read my programming and virtualization blog:
http://rwmj.wordpress.com
libguestfs lets you edit virtual machines. Supports shell scripting,
bindings from many languages.
http://libguestfs.org