[Libguestfs] [libnbd PATCH] api: Add nbd_get_structured_replies_negotiated

Eric Blake eblake at redhat.com
Tue Sep 17 13:15:33 UTC 2019


Similar to nbd_get_tls_negotiated, for observing what we actually
settled on with the server, rather than what was requested.
---
 generator/generator          | 30 +++++++++++++++++++++++++-----
 lib/handle.c                 |  6 ++++++
 tests/meta-base-allocation.c | 15 +++++++++++++++
 tests/oldstyle.c             |  7 ++++++-
 4 files changed, 52 insertions(+), 6 deletions(-)

diff --git a/generator/generator b/generator/generator
index 5f538b2..3b63665 100755
--- a/generator/generator
+++ b/generator/generator
@@ -1312,6 +1312,7 @@ rather than find a way to alter the server to fail the negotiation
 request.";
     see_also = ["L<nbd_get_request_structured_replies(3)>";
                 "L<nbd_set_handshake_flags(3)>";
+                "L<nbd_get_structured_replies_negotiated(3)>";
                 "L<nbd_can_meta_context(3)>"; "L<nbd_can_df(3)>"];
   };

@@ -1322,10 +1323,26 @@ request.";
     shortdesc = "see if structured replies are attempted";
     longdesc = "\
 Return the state of the request structured replies flag on this
-handle.  Note that this only reports whether the client attempts
-to negotiate structured replies, and not whether the server was
-able to honor that request";
-    see_also = ["L<nbd_set_request_structured_replies(3)>"];
+handle.
+
+B<Note:> If you want to find out if structured replies were actually
+negotiated on a particular connection use
+C<nbd_get_structured_replies_negotiated> instead.";
+    see_also = ["L<nbd_set_request_structured_replies(3)>";
+                "L<nbd_get_structured_replies_negotiated(3)>"];
+  };
+
+  "get_structured_replies_negotiated", {
+    default_call with
+    args = []; ret = RBool;
+    permitted_states = [ Connected; Closed ];
+    shortdesc = "see if structured replies are in use";
+    longdesc = "\
+After connecting you may call this to find out if the connection is
+using structured replies.";
+    see_also = ["L<nbd_set_request_structured_replies(3)>";
+                "L<nbd_get_request_structured_replies(3)>";
+                "L<nbd_get_protocol(3)>"];
   };

   "set_handshake_flags", {
@@ -1673,7 +1690,9 @@ be returned in the future.
 Most modern NBD servers use C<\"newstyle-fixed\">.
 "
 ^ non_blocking_test_call_description;
-    see_also = ["L<nbd_get_handshake_flags(3)>"];
+    see_also = ["L<nbd_get_handshake_flags(3)>";
+                "L<nbd_get_structured_replies_negotiated(3)>";
+                "L<nbd_get_tls_negotiated(3)>"];
   };

   "get_size", {
@@ -2654,6 +2673,7 @@ let first_version = [
   "can_fast_zero", (1, 2);
   "set_request_structured_replies", (1, 2);
   "get_request_structured_replies", (1, 2);
+  "get_structured_replies_negotiated", (1, 2);
   "get_tls_negotiated", (1, 2);
   "get_protocol", (1, 2);
   "set_handshake_flags", (1, 2);
diff --git a/lib/handle.c b/lib/handle.c
index 36e6434..2af25fe 100644
--- a/lib/handle.c
+++ b/lib/handle.c
@@ -260,6 +260,12 @@ nbd_unlocked_get_request_structured_replies (struct nbd_handle *h)
   return h->request_sr;
 }

+int
+nbd_unlocked_get_structured_replies_negotiated (struct nbd_handle *h)
+{
+  return h->structured_replies;
+}
+
 int
 nbd_unlocked_set_handshake_flags (struct nbd_handle *h,
                                   uint32_t flags)
diff --git a/tests/meta-base-allocation.c b/tests/meta-base-allocation.c
index f6be463..3de4c34 100644
--- a/tests/meta-base-allocation.c
+++ b/tests/meta-base-allocation.c
@@ -41,6 +41,8 @@ main (int argc, char *argv[])
   struct nbd_handle *nbd;
   char plugin_path[256];
   int id;
+  int r;
+  const char *s;

   snprintf (plugin_path, sizeof plugin_path, "%s/meta-base-allocation.sh",
             getenv ("srcdir") ? : ".");
@@ -77,6 +79,19 @@ main (int argc, char *argv[])
     exit (EXIT_FAILURE);
   }

+  /* Protocol should be "newstyle-fixed", with structured replies. */
+  s = nbd_get_protocol (nbd);
+  if (strcmp (s, "newstyle-fixed") != 0) {
+    fprintf (stderr,
+             "incorrect protocol \"%s\", expected \"newstyle-fixed\"\n", s);
+    exit (EXIT_FAILURE);
+  }
+  if ((r = nbd_get_structured_replies_negotiated (nbd)) != 1) {
+    fprintf (stderr,
+             "incorrect structured replies %d, expected 1\n", r);
+    exit (EXIT_FAILURE);
+  }
+
   switch (nbd_can_meta_context (nbd, "x-libnbd:nosuch")) {
   case -1:
     fprintf (stderr, "%s\n", nbd_get_error ());
diff --git a/tests/oldstyle.c b/tests/oldstyle.c
index b90b775..c9c01f8 100644
--- a/tests/oldstyle.c
+++ b/tests/oldstyle.c
@@ -115,13 +115,18 @@ main (int argc, char *argv[])
     exit (EXIT_FAILURE);
   }

-  /* Protocol should be "oldstyle". */
+  /* Protocol should be "oldstyle", with no structured replies. */
   s = nbd_get_protocol (nbd);
   if (strcmp (s, "oldstyle") != 0) {
     fprintf (stderr,
              "incorrect protocol \"%s\", expected \"oldstyle\"\n", s);
     exit (EXIT_FAILURE);
   }
+  if ((r = nbd_get_structured_replies_negotiated (nbd)) != 0) {
+    fprintf (stderr,
+             "incorrect structured replies %" PRId64 ", expected 0\n", r);
+    exit (EXIT_FAILURE);
+  }

   if ((r = nbd_get_size (nbd)) == -1) {
     fprintf (stderr, "%s\n", nbd_get_error ());
-- 
2.21.0




More information about the Libguestfs mailing list