[Libguestfs] [nbdkit PATCH] eval: Allow user override of 'missing'
Richard W.M. Jones
rjones at redhat.com
Mon Feb 10 21:10:43 UTC 2020
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 at 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 at 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
More information about the Libguestfs
mailing list