We have now resolved some TODO entries, making nbdinfo --list able to
use a single connection except when doing content probing.
---
info/nbdinfo.pod | 2 ++
TODO | 13 -----------
info/nbdinfo.c | 56 +++++++++++++++++++++++++++---------------------
3 files changed, 34 insertions(+), 37 deletions(-)
diff --git a/info/nbdinfo.pod b/info/nbdinfo.pod
index d0d20a9..19305bf 100644
--- a/info/nbdinfo.pod
+++ b/info/nbdinfo.pod
@@ -156,6 +156,8 @@ L<qemu-nbd(8)>.
Richard W.M. Jones
+Eric Blake
+
=head1 COPYRIGHT
Copyright (C) 2020 Red Hat Inc.
diff --git a/TODO b/TODO
index 239e0b0..4a0cd22 100644
--- a/TODO
+++ b/TODO
@@ -9,12 +9,8 @@ Example code integrating with ppoll, pollfd, APR pollset (and others?).
Example command line utils to copy in/out (like qemu-img convert).
-NBD_OPT_INFO mode (like qemu-nbd -L).
-
NBD resize extension.
-NBD_INFO_BLOCK_SIZE.
-
TLS should properly shut down the session (calling gnutls_bye).
Performance: Chart it over various buffer sizes and threads, as that
@@ -71,12 +67,3 @@ Suggested API improvements:
maybe nbd_shutdown should wait for the subprocess or there
should be another API to do this
- capture error message when nbd_connect_command fails
-
- list exports
- - It should be possible to get details from each export without
- needing to reconnect. This would make nbdinfo --list much more
- efficient. This involves issuing an NBD_OPT_INFO request per
- export (but only in list mode). See how qemu-nbd -L is
- implemented. The main difficulty is how to express this through
- the API since we can no longer user nbd_can_* and nbd_is_* to
- unpack the flags.
diff --git a/info/nbdinfo.c b/info/nbdinfo.c
index bd3615e..cdff958 100644
--- a/info/nbdinfo.c
+++ b/info/nbdinfo.c
@@ -209,11 +209,12 @@ main (int argc, char *argv[])
fprintf (stderr, "%s\n", nbd_get_error ());
exit (EXIT_FAILURE);
}
- /* Disconnect from the server to move the handle into a closed
- * state, in case the server serializes further connections.
- * But we can ignore errors in this case.
- */
- nbd_opt_abort (nbd);
+ if (probe_content)
+ /* Disconnect from the server to move the handle into a closed
+ * state, in case the server serializes further connections.
+ * But we can ignore errors in this case.
+ */
+ nbd_opt_abort (nbd);
}
if (size_only) {
@@ -456,9 +457,6 @@ list_one_export (struct nbd_handle *nbd, const char *desc,
free (export_name);
}
-/* XXX Inefficient and hacky. See TODO for a suggestion on how to
- * improve this.
- */
static void
list_all_exports (struct nbd_handle *nbd1, const char *uri)
{
@@ -468,31 +466,41 @@ list_all_exports (struct nbd_handle *nbd1, const char *uri)
printf ("\t\"exports\": []\n");
for (i = 0; i < export_list.len; ++i) {
- const char *name;
+ const char *name = export_list.names[i];
struct nbd_handle *nbd2;
- /* Connect to the original URI, but using opt mode to alter the export. */
- name = export_list.names[i];
- nbd2 = nbd_create ();
- if (nbd2 == NULL) {
- fprintf (stderr, "%s\n", nbd_get_error ());
- exit (EXIT_FAILURE);
- }
- nbd_set_uri_allow_local_file (nbd2, true); /* Allow ?tls-psk-file. */
- nbd_set_opt_mode (nbd2, true);
+ if (probe_content) {
+ /* Connect to the original URI, but using opt mode to alter the export. */
+ nbd2 = nbd_create ();
+ if (nbd2 == NULL) {
+ fprintf (stderr, "%s\n", nbd_get_error ());
+ exit (EXIT_FAILURE);
+ }
+ nbd_set_uri_allow_local_file (nbd2, true); /* Allow ?tls-psk-file. */
+ nbd_set_opt_mode (nbd2, true);
- if (nbd_connect_uri (nbd2, uri) == -1 ||
- nbd_set_export_name (nbd2, name) == -1 ||
- nbd_opt_go (nbd2) == -1) {
- fprintf (stderr, "%s\n", nbd_get_error ());
- exit (EXIT_FAILURE);
+ if (nbd_connect_uri (nbd2, uri) == -1 ||
+ nbd_set_export_name (nbd2, name) == -1 ||
+ nbd_opt_go (nbd2) == -1) {
+ fprintf (stderr, "%s\n", nbd_get_error ());
+ exit (EXIT_FAILURE);
+ }
+ }
+ else { /* ! probe_content */
+ if (nbd_set_export_name (nbd1, name) == -1 ||
+ nbd_opt_info (nbd1) == -1) {
+ fprintf (stderr, "%s\n", nbd_get_error ());
+ exit (EXIT_FAILURE);
+ }
+ nbd2 = nbd1;
}
/* List the metadata of this export. */
list_one_export (nbd2, export_list.descs[i], i == 0,
i + 1 == export_list.len);
- nbd_close (nbd2);
+ if (probe_content)
+ nbd_close (nbd2);
}
}
--
2.28.0