--- plugins/eval/nbdkit-eval-plugin.pod | 2 ++ plugins/sh/nbdkit-sh-plugin.pod | 4 ++++ plugins/sh/methods.h | 1 + plugins/eval/eval.c | 2 ++ plugins/sh/methods.c | 25 +++++++++++++++++++++++++ plugins/sh/sh.c | 1 + tests/test-eval.sh | 1 + 7 files changed, 36 insertions(+) diff --git a/plugins/eval/nbdkit-eval-plugin.pod b/plugins/eval/nbdkit-eval-plugin.pod index a3601333..602fd3aa 100644 --- a/plugins/eval/nbdkit-eval-plugin.pod +++ b/plugins/eval/nbdkit-eval-plugin.pod @@ -100,6 +100,8 @@ features): =item B<flush=>SCRIPT +=item B<get_ready=>SCRIPT + =item B<get_size=>SCRIPT =item B<is_rotational=>SCRIPT diff --git a/plugins/sh/nbdkit-sh-plugin.pod b/plugins/sh/nbdkit-sh-plugin.pod index 2f265b05..ffd0310f 100644 --- a/plugins/sh/nbdkit-sh-plugin.pod +++ b/plugins/sh/nbdkit-sh-plugin.pod @@ -246,6 +246,10 @@ actually gets selected. If an error occurs, the script should output an error message and exit with status C<1>; unrecognized output is ignored. +=item C<get_ready> + + /path/to/script get_ready + =item C<preconnect> /path/to/script preconnect <readonly> <exportname> diff --git a/plugins/sh/methods.h b/plugins/sh/methods.h index 8a8f179c..f11e67e7 100644 --- a/plugins/sh/methods.h +++ b/plugins/sh/methods.h @@ -41,6 +41,7 @@ extern const char *get_script (const char *method); extern void sh_dump_plugin (void); extern int sh_thread_model (void); +extern int sh_get_ready (void); extern int sh_preconnect (int readonly); extern void *sh_open (int readonly); extern void sh_close (void *handle); diff --git a/plugins/eval/eval.c b/plugins/eval/eval.c index 9071b8c7..f09e49f3 100644 --- a/plugins/eval/eval.c +++ b/plugins/eval/eval.c @@ -70,6 +70,7 @@ static const char *known_methods[] = { "dump_plugin", "extents", "flush", + "get_ready", "get_size", "is_rotational", "missing", @@ -409,6 +410,7 @@ static struct nbdkit_plugin plugin = { .config_complete = eval_config_complete, .config_help = eval_config_help, .thread_model = sh_thread_model, + .get_ready = sh_get_ready, .preconnect = sh_preconnect, .open = sh_open, diff --git a/plugins/sh/methods.c b/plugins/sh/methods.c index e8011284..56e2d410 100644 --- a/plugins/sh/methods.c +++ b/plugins/sh/methods.c @@ -139,6 +139,31 @@ sh_thread_model (void) } } +int +sh_get_ready (void) +{ + const char *method = "get_ready"; + const char *script = get_script (method); + const char *args[] = { script, method, NULL }; + + switch (call (args)) { + case OK: + case MISSING: + return 0; + + case ERROR: + return -1; + + case RET_FALSE: + nbdkit_error ("%s: %s method returned unexpected code (3/false)", + script, method); + errno = EIO; + return -1; + + default: abort (); + } +} + int sh_preconnect (int readonly) { diff --git a/plugins/sh/sh.c b/plugins/sh/sh.c index 0d24edb4..736b8ef0 100644 --- a/plugins/sh/sh.c +++ b/plugins/sh/sh.c @@ -310,6 +310,7 @@ static struct nbdkit_plugin plugin = { .config_help = sh_config_help, .magic_config_key = "script", .thread_model = sh_thread_model, + .get_ready = sh_get_ready, .preconnect = sh_preconnect, .open = sh_open, diff --git a/tests/test-eval.sh b/tests/test-eval.sh index 868452f3..da7b8861 100755 --- a/tests/test-eval.sh +++ b/tests/test-eval.sh @@ -59,6 +59,7 @@ grep 'in missing: config_complete' eval.missing grep 'in missing: thread_model' eval.missing grep 'in missing: can_write' eval.missing grep 'in missing: is_rotational' eval.missing +grep 'in missing: get_ready' eval.missing grep 'in missing: preconnect' eval.missing grep 'in missing: open' eval.missing grep 'in missing: close' eval.missing -- 2.25.0