Re: [Libguestfs] [nbdkit PATCH 1/5] api: Add .default_export

Eric Blake
2020-08-26T13:26:21Z

On 8/25/20 10:46 AM, Eric Blake wrote:
> I'm about to add an 'exportname' filter, and in the process, I
noticed
> a few shortcomings in our API.  Time to fix those before the 1.22
> release locks our API in stone.  Overloading .list_exports in order to
> determine a canonical export name at .open time is awkward; the two
> uses (answering NBD_OPT_LIST for a full list, vs. remapping a client's
> "" into a canonical name during .open) are orthogonal enough to
> warrant separate plugin callbacks.  This will also make it easier to
> express the notion of no default export (connecting to "" is an
error)
> at the same time as listing other exports.  Another consideration is
> that when tls=1, the choice of export to expose pre-TLS vs. post-TLS
> may differ, but without a call to .open yet, our just-added
> nbdkit_is_tls() does not fit our preferred lifecycle, so this has to
> be a parameter to the new .default_export.  We will alter the
> signature of .list_exports soon; in the meantime, the bool
> default_only parameter is now ignored.
>

> +++ b/server/plugins.c

> @@ -282,15 +283,29 @@ static int
>   plugin_list_exports (struct backend *b, int readonly, int default_only,
>                        struct nbdkit_exports *exports)
>   {
> -  GET_CONN;
>     struct backend_plugin *p = container_of (b, struct backend_plugin,
backend);
>
> -  if (!p->plugin.list_exports)
> -    return nbdkit_add_export (exports, "", NULL);
> +  if (!p->plugin.list_exports) {
> +    const char *def = backend_default_export (b, readonly);
> +    if (def == NULL)
> +      return 0;
> +    return nbdkit_add_export (exports, def, NULL);
> +  }

This makes sense, but it is hard to replicate in language plugins.  As
submitted in this round of patches, patch 5/5 causes test-eflags.sh to
fail, because the sh plugin can't access the caching
backend_default_export(), but instead called sh_default_export(), but
the test was checking for proper caching.

My solution is to add nbdkit_add_default(exports), which tells nbdkit to
append .default_export to the list at a later point in the process.
I'll post v2 shortly.

--
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3226
Virtualization:  qemu.org | libvirt.org