In particular, any query that can be determined after getting gflags
from the server or after a response to NBD_OPT* can be now done
earlier than Connected, and any configuration that affects behavior
of NBD_OPT_* can be set later than rather just during Created.
In order to support this change: nbd_get_protocol also needs to hoist
the setting of h->protocol earlier in the state machine. Also,
whereas nbd_connect_uri used to unconditionally take precedence over
nbd_set_export_name, now nbd_set_export_name can be used during
negotiation to override the export name portion of a URI.
Of course, until a later patch actually lets us enter the NEGOTIATED
state, you can't test the differences yet.
---
generator/API.ml | 33 +++++++++++++++++++--------------
generator/states-newstyle.c | 12 ++++++------
2 files changed, 25 insertions(+), 20 deletions(-)
diff --git a/generator/API.ml b/generator/API.ml
index 0990d48..a363117 100644
--- a/generator/API.ml
+++ b/generator/API.ml
@@ -272,7 +272,7 @@ C<\"nbd2\">, etc.";
"set_export_name", {
default_call with
args = [ String "export_name" ]; ret = RErr;
- permitted_states = [ Created ];
+ permitted_states = [ Created; Negotiating ];
shortdesc = "set the export name";
longdesc = "\
For servers which require an export name or can serve different
@@ -287,7 +287,7 @@ The encoding of export names is always UTF-8.
This call may be skipped if using L<nbd_connect_uri(3)> to connect
to a URI that includes an export name.";
- see_also = [Link "get_export_name"; Link "connect_uri"];
+ see_also = [Link "get_export_name"; Link "connect_uri"];
};
"get_export_name", {
@@ -307,7 +307,7 @@ of an empty string C<\"\">)";
"set_full_info", {
default_call with
args = [Bool "request"]; ret = RErr;
- permitted_states = [ Created ];
+ permitted_states = [ Created; Negotiating ];
shortdesc = "control whether NBD_OPT_GO requests extra details";
longdesc = "\
By default, when connecting to an export, libnbd only requests the
@@ -441,7 +441,7 @@ on a particular connection use L<nbd_get_tls_negotiated(3)>
instead.";
"get_tls_negotiated", {
default_call with
args = []; ret = RBool;
- permitted_states = [ Connected; Closed ];
+ permitted_states = [ Negotiating; Connected; Closed ];
shortdesc = "find out if TLS was negotiated on a connection";
longdesc = "\
After connecting you may call this to find out if the
@@ -610,7 +610,7 @@ L<nbd_get_structured_replies_negotiated(3)> instead.";
"get_structured_replies_negotiated", {
default_call with
args = []; ret = RBool;
- permitted_states = [ Connected; Closed ];
+ permitted_states = [ Negotiating; Connected; Closed ];
shortdesc = "see if structured replies are in use";
longdesc = "\
After connecting you may call this to find out if the connection is
@@ -735,7 +735,7 @@ Return true if list exports mode was enabled on this handle.";
"get_nr_list_exports", {
default_call with
args = []; ret = RInt;
- permitted_states = [ Connected; Closed; Dead ];
+ permitted_states = [ Negotiating; Connected; Closed; Dead ];
shortdesc = "return the number of exports returned by the server";
longdesc = "\
If list exports mode was enabled on the handle and you connected
@@ -749,7 +749,7 @@ L<nbd_set_list_exports(3)>.";
"get_list_export_name", {
default_call with
args = [ Int "i" ]; ret = RString;
- permitted_states = [ Connected; Closed; Dead ];
+ permitted_states = [ Negotiating; Connected; Closed; Dead ];
shortdesc = "return the i'th export name";
longdesc = "\
If list exports mode was enabled on the handle and you connected
@@ -761,7 +761,7 @@ from the list returned by the server.";
"get_list_export_description", {
default_call with
args = [ Int "i" ]; ret = RString;
- permitted_states = [ Connected; Closed; Dead ];
+ permitted_states = [ Negotiating; Connected; Closed; Dead ];
shortdesc = "return the i'th export description";
longdesc = "\
If list exports mode was enabled on the handle and you connected
@@ -776,7 +776,7 @@ is set with I<-D>.";
"add_meta_context", {
default_call with
args = [ String "name" ]; ret = RErr;
- permitted_states = [ Created ];
+ permitted_states = [ Created; Negotiating ];
shortdesc = "ask server to negotiate metadata context";
longdesc = "\
During connection libnbd can negotiate zero or more metadata
@@ -885,10 +885,14 @@ parameter in NBD URIs is allowed.";
shortdesc = "connect to NBD URI";
longdesc = "\
Connect (synchronously) to an NBD server and export by specifying
-the NBD URI. This call parses the URI and may call
+the NBD URI. This call parses the URI and calls
L<nbd_set_export_name(3)> and L<nbd_set_tls(3)> and other
-calls as needed, followed by
-L<nbd_connect_tcp(3)> or L<nbd_connect_unix(3)>.
+calls as needed, followed by L<nbd_connect_tcp(3)> or
+L<nbd_connect_unix(3)>. However, it is possible to override the
+export name portion of a URI by using C<nbd_set_opt_mode> to
+enable option mode, then using L<nbd_set_export_name(3)> as part
+of later negotiation.
+
This call returns when the connection has been made.
=head2 Example URIs supported
@@ -1027,7 +1031,8 @@ test whether this is the case with L<nbd_supports_uri(3)>.
Support for URIs that require TLS will fail if libnbd was not
compiled with gnutls; you can test whether this is the case
with L<nbd_supports_tls(3)>.";
- see_also = [URLLink
"https://github.com/NetworkBlockDevice/nbd/blob/master/doc/uri.md"];
+ see_also = [URLLink
"https://github.com/NetworkBlockDevice/nbd/blob/master/doc/uri.md";
+ Link "set_export_name"; Link "set_tls"];
};
"connect_unix", {
@@ -1326,7 +1331,7 @@ are free to pass in other contexts."
"get_protocol", {
default_call with
args = []; ret = RStaticString;
- permitted_states = [ Connected; Closed ];
+ permitted_states = [ Negotiating; Connected; Closed ];
shortdesc = "return the NBD protocol variant";
longdesc = "\
Return the NBD protocol variant in use on the connection. At
diff --git a/generator/states-newstyle.c b/generator/states-newstyle.c
index 573f724..8da4617 100644
--- a/generator/states-newstyle.c
+++ b/generator/states-newstyle.c
@@ -1,5 +1,5 @@
/* nbd client library in userspace: state machine
- * Copyright (C) 2013-2019 Red Hat Inc.
+ * Copyright (C) 2013-2020 Red Hat Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -136,6 +136,11 @@ STATE_MACHINE {
return 0;
}
+ if ((h->gflags & LIBNBD_HANDSHAKE_FLAG_FIXED_NEWSTYLE) == 0)
+ h->protocol = "newstyle";
+ else
+ h->protocol = "newstyle-fixed";
+
cflags = h->gflags;
h->sbuf.cflags = htobe32 (cflags);
h->wbuf = &h->sbuf;
@@ -156,11 +161,6 @@ STATE_MACHINE {
return 0;
NEWSTYLE.FINISHED:
- if ((h->gflags & LIBNBD_HANDSHAKE_FLAG_FIXED_NEWSTYLE) == 0)
- h->protocol = "newstyle";
- else
- h->protocol = "newstyle-fixed";
-
SET_NEXT_STATE (%.READY);
return 0;
--
2.28.0