[Libguestfs] [PATCH nbdkit 4/6] eval, sh: Implement block_size method

Eric Blake eblake at redhat.com
Wed Feb 16 18:16:57 UTC 2022


On Wed, Feb 16, 2022 at 04:20:39PM +0000, Richard W.M. Jones wrote:
> The main reason to implement block_size in these plugins first is so
> we then have an easy way to implement tests of the feature.
> ---
>  plugins/eval/nbdkit-eval-plugin.pod |  2 +
>  plugins/sh/nbdkit-sh-plugin.pod     | 10 +++++
>  plugins/sh/methods.h                |  3 ++
>  plugins/eval/eval.c                 |  2 +
>  plugins/sh/methods.c                | 66 +++++++++++++++++++++++++++++
>  plugins/sh/sh.c                     |  1 +
>  6 files changed, 84 insertions(+)
> 
> +int
> +sh_block_size (void *handle,
> +               uint32_t *minimum, uint32_t *preferred, uint32_t *maximum)
> +{
> +  const char *method = "block_size";
> +  const char *script = get_script (method);
> +  struct sh_handle *h = handle;
> +  const char *args[] = { script, method, h->h, NULL };
> +  CLEANUP_FREE char *s = NULL;
> +  size_t slen;
> +  const char *delim = " \t\n";
> +  char *sp, *p;
> +  int64_t r;
> +
> +  switch (call_read (&s, &slen, args)) {
> +  case OK:
> +    if ((p = strtok_r (s, delim, &sp)) == NULL) {
> +    parse_error:
> +      nbdkit_error ("%s: %s method cannot be parsed", script, method);
> +      return -1;
> +    }
> +    r = nbdkit_parse_size (p);
> +    if (r == -1 || r > UINT32_MAX)
> +      goto parse_error;
> +    *minimum = r;
> +
> +    if ((p = strtok_r (NULL, delim, &sp)) == NULL)
> +      goto parse_error;
> +    r = nbdkit_parse_size (p);
> +    if (r == -1 || r > UINT32_MAX)
> +      goto parse_error;
> +    *preferred = r;
> +
> +    if ((p = strtok_r (NULL, delim, &sp)) == NULL)
> +      goto parse_error;
> +    r = nbdkit_parse_size (p);
> +    if (r == -1 || r > UINT32_MAX)
> +      goto parse_error;
> +    *maximum = r;
> +
> +#if 0
> +    nbdkit_debug ("setting block_size: "
> +                  "minimum=%" PRIu32 " "
> +                  "preferred=%" PRIu32 " "
> +                  "maximum=%" PRIu32,
> +                  *minimum, *preferred, *maximum);
> +#endif
> +    return 0;

Do we care about checking that there is no trailing garbage after the
three numbers?

Otherwise, yes, this makes a good first plugin for an implementation ;)

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org




More information about the Libguestfs mailing list