Now that the export name can affect contents, we should let --run favor connecting to the preferred export name passed to nbdkit via the -e command line option. In addition to exposing $exportname, update the recently-added $uri to include the exportname, but leave the older $nbd alone.
Signed-off-by: Eric Blake <[email protected]> --- docs/nbdkit-captive.pod | 12 ++++++++++-- server/captive.c | 22 ++++++++++++++++++---- tests/test-long-name.sh | 20 ++++++++++++++++++++ 3 files changed, 48 insertions(+), 6 deletions(-) diff --git a/docs/nbdkit-captive.pod b/docs/nbdkit-captive.pod index 0adf0a0b..9c7044f1 100644 --- a/docs/nbdkit-captive.pod +++ b/docs/nbdkit-captive.pod @@ -45,12 +45,14 @@ The following shell variables are available in the I<--run> argument: =item C<$uri> A URI that refers to the nbdkit port or socket in the preferred form -documented by the NBD project. +documented by the NBD project. If nbdkit was started with the B<-e> +option to set the preferred export name, this is included in the URI. =item C<$nbd> An older URL that refers to the nbdkit port or socket in a manner -specific to certain tools. +specific to certain tools. This form does not include an export name, +even if B<-e> was used. Note there is some magic here, since qemu and guestfish URLs have a different format, so nbdkit tries to guess which you are running. If @@ -64,6 +66,12 @@ If E<ne> "", the port number that nbdkit is listening on. If E<ne> "", the Unix domain socket that nbdkit is listening on. +=item C<$exportname> + +The default export name (which may be "") that nbdkit will advertise +in response to NBD_OPT_LIST. This comes from the B<-e> +(B<--exportname>) command line option. + =back I<--run> implies I<--foreground>. It is not possible, and probably diff --git a/server/captive.c b/server/captive.c index 90e42050..c4cec238 100644 --- a/server/captive.c +++ b/server/captive.c @@ -71,12 +71,26 @@ run_command (void) if (port) { fprintf (fp, "nbd://localhost:"); shell_quote (port, fp); + if (exportname) { + putc ('/', fp); + uri_quote (exportname, fp); + } } else if (unixsocket) { - fprintf (fp, "nbd+unix://\\?socket="); + fprintf (fp, "nbd+unix://"); + if (exportname) { + putc ('/', fp); + uri_quote (exportname, fp); + } + fprintf (fp, "\\?socket="); uri_quote (unixsocket, fp); } - fprintf (fp, "\n"); + putc ('\n', fp); + + /* Expose $exportname. */ + fprintf (fp, "exportname="); + shell_quote (exportname, fp); + putc ('\n', fp); /* Construct older $nbd "URL". Unfortunately guestfish and qemu take * different syntax, so try to guess which one we need. @@ -106,13 +120,13 @@ run_command (void) else abort (); } - fprintf (fp, "\n"); + putc ('\n', fp); /* Construct $port and $unixsocket. */ fprintf (fp, "port="); if (port) shell_quote (port, fp); - fprintf (fp, "\n"); + putc ('\n', fp); fprintf (fp, "unixsocket="); if (unixsocket) shell_quote (unixsocket, fp); diff --git a/tests/test-long-name.sh b/tests/test-long-name.sh index 214a5e7a..7b0b43ad 100755 --- a/tests/test-long-name.sh +++ b/tests/test-long-name.sh @@ -51,6 +51,26 @@ almost4k=${name4k%8$name16} nbdkit -U - -e $name4k null --run true || fail=1 nbdkit -U - -e a$name4k null --run true && fail=1 +# Test that $exportname and $uri reflect the name +out=$(nbdkit -U - -e $name4k null --run 'echo $exportname') +if test "$name4k" != "$out"; then + echo "$0: \$exportname contains wrong contents" >&2 + fail=1 +fi +out=$(nbdkit -U - -e $name4k null --run 'echo $uri') +case $out in + nbd+unix:///$name4k\?socket=*) ;; + *) echo "$0: \$uri contains wrong contents" >&2 + fail=1 ;; +esac +pick_unused_port +out=$(nbdkit -i localhost -p $port -e $name4k null --run 'echo $uri') +case $out in + nbd://localhost:$port/$name4k) ;; + *) echo "$0: \$uri contains wrong contents" >&2 + fail=1 ;; +esac + # The rest of this test uses the ‘qemu-nbd --list’ option added in qemu 4.0. if ! qemu-nbd --help | grep -sq -- --list; then echo "$0: skipping because qemu-nbd does not support the --list option" -- 2.21.0 _______________________________________________ Libguestfs mailing list [email protected] https://www.redhat.com/mailman/listinfo/libguestfs
