On Mon, Feb 10, 2020 at 01:44:14PM -0600, Eric Blake wrote:
 A comment in the code mentioned something that didn't actually
work,
 but which can be useful for user-directed logging of what other
 callbacks they might want to implement.
 
 Signed-off-by: Eric Blake <eblake(a)redhat.com>
 ---
 
 I haven't pushed this one, becuase I'm not sure if we want it; but it
 was easy enough to whip together after an IRC question earlier today.
 
  plugins/eval/eval.c                 | 16 +++++++++++++---
  plugins/eval/nbdkit-eval-plugin.pod |  6 ++++++
  tests/test-eval.sh                  |  2 ++
  3 files changed, 21 insertions(+), 3 deletions(-)
 
 diff --git a/plugins/eval/eval.c b/plugins/eval/eval.c
 index 8f1eb6c..094cac5 100644
 --- a/plugins/eval/eval.c
 +++ b/plugins/eval/eval.c
 @@ -1,5 +1,5 @@
  /* nbdkit
 - * Copyright (C) 2018-2019 Red Hat Inc.
 + * Copyright (C) 2018-2020 Red Hat Inc.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions are
 @@ -169,6 +169,12 @@ create_script (const char *method, const char *value)
      return NULL;
    }
 
 +  /* Special case for user override of missing */
 +  if (missing && strcmp (script, missing) == 0 && unlink (script) == -1)
{
 +    nbdkit_error ("unlink: %m");
 +    return NULL;
 +  }
 +
    fp = fopen (script, "w");
    if (fp == NULL) {
      nbdkit_error ("fopen: %s: %m", script);
 @@ -216,7 +222,7 @@ eval_load (void)
 
    /* To make things easier, create a "missing" script which always
     * exits with code 2.  If a method is missing we call this script
 -   * instead.  It could even be overridden by the user.
 +   * instead.  It can even be overridden by the user.
     */
    missing = create_script ("missing", "exit 2\n");
    if (!missing)
 @@ -255,11 +261,15 @@ static int
  add_method (const char *key, const char *value)
  {
    char *script;
 +  char *tmp = missing; /* Needed to allow user override of missing */
 
 -  if (get_script (key) != missing) {
 +  missing = NULL;
 +  if (get_script (key) != NULL) {
 +    missing = tmp;
      nbdkit_error ("method %s defined more than once on the command line",
key);
      return -1;
    }
 +  missing = tmp; 
This leaks the missing global?
But yes the idea is fine, so ACK.
Rich.
    /* Do a bit of checking to make sure the key isn't malicious. 
This
     * duplicates work already done by nbdkit, but better safe than
 diff --git a/plugins/eval/nbdkit-eval-plugin.pod b/plugins/eval/nbdkit-eval-plugin.pod
 index 88c1488..cbb4133 100644
 --- a/plugins/eval/nbdkit-eval-plugin.pod
 +++ b/plugins/eval/nbdkit-eval-plugin.pod
 @@ -140,6 +140,12 @@ no longer see that key.
 
  All of these parameters are optional.
 
 +=item B<missing=>SCRIPT
 +
 +The parameter C<missing> defines a script that will be called in place
 +of any other callback not explicitly provided.  If omitted, this
 +defaults to the script "exit 2".
 +
  =back
 
  =head1 ENVIRONMENT VARIABLES
 diff --git a/tests/test-eval.sh b/tests/test-eval.sh
 index 206c680..4557b02 100755
 --- a/tests/test-eval.sh
 +++ b/tests/test-eval.sh
 @@ -42,7 +42,9 @@ cleanup_fn rm -f $files
  nbdkit -U - eval \
         get_size='echo 64M' \
         pread='dd if=/dev/zero count=$3 iflag=count_bytes' \
 +       missing='echo "in missing: $@" >> eval.out; exit 2' \
         --run 'qemu-img info $nbd' > eval.out
 
  cat eval.out
  grep '67108864 bytes' eval.out
 +grep 'in missing' eval.out
 -- 
 2.24.1
 
 _______________________________________________
 Libguestfs mailing list
 Libguestfs(a)redhat.com
 
https://www.redhat.com/mailman/listinfo/libguestfs 
-- 
Richard Jones, Virtualization Group, Red Hat 
http://people.redhat.com/~rjones
Read my programming and virtualization blog: 
http://rwmj.wordpress.com
virt-top is 'top' for virtual machines.  Tiny program with many
powerful monitoring features, net stats, disk stats, logging, etc.
http://people.redhat.com/~rjones/virt-top