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 <[email protected]> --- 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; /* 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 [email protected] https://www.redhat.com/mailman/listinfo/libguestfs
