[Libguestfs] [PATCH nbdkit] server: Add -D nbdkit.environ=1 to dump the environment

Richard W.M. Jones rjones at redhat.com
Tue May 9 09:47:18 UTC 2023


On Tue, May 09, 2023 at 08:56:47AM +0200, Laszlo Ersek wrote:
> On 5/8/23 23:33, Richard W.M. Jones wrote:
> > On Mon, May 08, 2023 at 08:54:48AM +0200, Laszlo Ersek wrote:
> >> On 5/7/23 12:43, Richard W.M. Jones wrote:
> >>> This is not secure so should not be used routinely.  Also we do not
> >>> attempt to filter environment variables, so even ones containing
> >>> multiple lines or special characters are all sent to nbdkit_debug.
> >>>
> >>> The reason for adding this is to allow for debugging the new
> >>> nbd_set_socket_activation_name(3) API added in libnbd 1.16.
> >>> ---
> >>>  docs/nbdkit.pod | 10 ++++++++++
> >>>  server/main.c   | 28 ++++++++++++++++++++++++++++
> >>>  2 files changed, 38 insertions(+)
> >>>
> >>> diff --git a/docs/nbdkit.pod b/docs/nbdkit.pod
> >>> index 83cf6a11c..22350cc08 100644
> >>> --- a/docs/nbdkit.pod
> >>> +++ b/docs/nbdkit.pod
> >>> @@ -619,6 +619,16 @@ are numerous and not usually very interesting.
> >>>  S<I<-D nbdkit.backend.controlpath=0>> suppresses the non-datapath
> >>>  commands (config, open, close, can_write, etc.)
> >>>  
> >>> +=item B<-D nbdkit.environ=1>
> >>> +
> >>> +(not Windows)
> >>> +
> >>> +Print nbdkit's environment variables in the debug output at start up.
> >>> +This is insecure because environment variables may contain both
> >>> +sensitive and user-controlled information, so it should not be used
> >>> +routinely.  But it is useful for tracking down problems related to
> >>> +environment variables.
> >>> +
> >>>  =item B<-D nbdkit.tls.log=>N
> >>>  
> >>>  Enable TLS logging.  C<N> can be in the range 0 (no logging) to 99.
> >>> diff --git a/server/main.c b/server/main.c
> >>> index 1df5d69ac..7b6adc3cc 100644
> >>> --- a/server/main.c
> >>> +++ b/server/main.c
> >>> @@ -210,6 +210,26 @@ dump_config (void)
> >>>  #endif
> >>>  }
> >>>  
> >>> +#ifndef WIN32
> >>> +
> >>> +/* -D nbdkit.environ=1 to dump the environment at start up. */
> >>> +NBDKIT_DLL_PUBLIC int nbdkit_debug_environ;
> >>> +
> >>> +#ifndef HAVE_ENVIRON_DECL
> >>> +extern char **environ;
> >>> +#endif
> >>> +
> >>> +static void
> >>> +dump_environment (void)
> >>> +{
> >>> +  size_t i;
> >>> +
> >>> +  for (i = 0; environ[i]; ++i)
> >>> +    nbdkit_debug ("%s", environ[i]);
> >>> +}
> >>> +
> >>> +#endif /* !WIN32 */
> >>> +
> >>>  int
> >>>  main (int argc, char *argv[])
> >>>  {
> >>> @@ -662,6 +682,14 @@ main (int argc, char *argv[])
> >>>    /* Check all debug flags were used, and free them. */
> >>>    free_debug_flags ();
> >>>  
> >>> +#ifndef WIN32
> >>> +  /* Dump the environment if asked.  This is the earliest we can do it
> >>> +   * because it uses a debug flag.
> >>> +   */
> >>> +  if (nbdkit_debug_environ && verbose)
> >>> +    dump_environment ();
> >>> +#endif
> >>> +
> >>>    if (help) {
> >>>      struct backend *b;
> >>>  
> >>
> >> I was surprised not to see any assignment to the new global variable,
> >> but then I found "server/debug-flags.c"; that's some serious wizardry.
> > 
> > With the side effect, as it turns out, that it's very hard to
> > implement for language plugins.  Rust is fine.  OCaml can be done by
> > adding a C object to the link.  Other languages, not really :-(
> 
> Hm. I didn't even realize it was being done like this for plugins' sake.
> I assumed it was there to avoid boilerplate code.

Yes it's there to avoid boilerplate code.  You can create a debug
variable in a plugin very simply by exporting a symbol with the
<pluginname>_debug_<name> pattern.

> I figure an alternative would be for -D to stash the flags in a
> dictionary (or list) in the main program, and then each plugin / filter
> could access that data structure (or even get a reference to it in (one
> of) the entry point function(s)).

We can't really change how it works now as it is baked into the ABI.

v2 coming up ...

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-p2v converts physical machines to virtual machines.  Boot with a
live CD or over the network (PXE) and turn machines into KVM guests.
http://libguestfs.org/virt-v2v


More information about the Libguestfs mailing list