[Libguestfs] [nbdkit PATCH v2 5/6] python: Expose nbdkit_set_error to python script

Richard W.M. Jones rjones at redhat.com
Thu Jan 26 10:14:14 UTC 2017


On Wed, Jan 25, 2017 at 08:42:35PM -0600, Eric Blake wrote:
> In addition to calling python functions from C, we want to make
> script writing easier by exposing C functions to python.  For
> now, just wrap nbdkit_set_error(), as that will be needed for
> an optimal implementation of a zero() callback.

This one looks OK.  I didn't apply it because it requires
the previous patch.

Rich.

> Signed-off-by: Eric Blake <eblake at redhat.com>
> ---
>  plugins/python/nbdkit-python-plugin.pod | 27 +++++++++++++++++++++++----
>  plugins/python/python.c                 | 18 ++++++++++++++++++
>  2 files changed, 41 insertions(+), 4 deletions(-)
> 
> diff --git a/plugins/python/nbdkit-python-plugin.pod b/plugins/python/nbdkit-python-plugin.pod
> index 9b0f0ef..8b3d08c 100644
> --- a/plugins/python/nbdkit-python-plugin.pod
> +++ b/plugins/python/nbdkit-python-plugin.pod
> @@ -63,9 +63,22 @@ does not need to be executable.  In fact it's a good idea not to do
>  that, because running the plugin directly as a Python script won't
>  work.
> 
> +=head2 METHODS
> +
> +Your script may use C<import nbdkit> to have access to the following
> +methods in the C<nbdkit> module:
> +
> + nbdkit.set_error(I<err>)
> +
> +Record C<err> as the reason you are about to throw an exception. C<err>
> +should correspond to usual errno values, where it may help to
> +C<import errno>.
> +
>  =head2 EXCEPTIONS
> 
> -Python callbacks should throw exceptions to indicate errors.
> +Python callbacks should throw exceptions to indicate errors.  Remember
> +to use C<nbdkit.set_error> if you need to control which error is sent
> +back to the client.
> 
>  =head2 PYTHON CALLBACKS
> 
> @@ -158,7 +171,8 @@ disk starting at C<offset>.
> 
>  NBD only supports whole reads, so your function should try to read
>  the whole region (perhaps requiring a loop).  If the read fails or
> -is partial, your function should throw an exception.
> +is partial, your function should throw an exception, optionally using
> +C<nbdkit.set_error> first.
> 
>  =item C<pwrite>
> 
> @@ -174,7 +188,8 @@ C<offset>.
> 
>  NBD only supports whole writes, so your function should try to
>  write the whole region (perhaps requiring a loop).  If the write
> -fails or is partial, your function should throw an exception.
> +fails or is partial, your function should throw an exception,
> + optionally using C<nbdkit.set_error> first.
> 
>  =item C<flush>
> 
> @@ -186,6 +201,9 @@ fails or is partial, your function should throw an exception.
>  The body of your C<flush> function should do a L<sync(2)> or
>  L<fdatasync(2)> or equivalent on the backing store.
> 
> +If the flush fails, your function should throw an exception, optionally
> +using C<nbdkit.set_error> first.
> +
>  =item C<trim>
> 
>  (Optional)
> @@ -194,7 +212,8 @@ L<fdatasync(2)> or equivalent on the backing store.
>     # no return value
> 
>  The body of your C<trim> function should "punch a hole" in the
> -backing store.
> +backing store.  If the trim fails, your function should throw an
> +exception, optionally using C<nbdkit.set_error> first.
> 
>  =back
> 
> diff --git a/plugins/python/python.c b/plugins/python/python.c
> index 0504715..4a0ff50 100644
> --- a/plugins/python/python.c
> +++ b/plugins/python/python.c
> @@ -54,6 +54,23 @@
>  static const char *script;
>  static PyObject *module;
> 
> +static PyObject *
> +set_error (PyObject *self, PyObject *args)
> +{
> +  int err;
> +
> +  if (!PyArg_ParseTuple(args, "i", &err))
> +    return NULL;
> +  nbdkit_set_error (err);
> +  Py_RETURN_NONE;
> +}
> +
> +static PyMethodDef NbdkitMethods[] = {
> +  { "set_error", set_error, METH_VARARGS,
> +    "Store an errno value prior to throwing an exception" },
> +  { NULL }
> +};
> +
>  /* Is a callback defined? */
>  static int
>  callback_defined (const char *name, PyObject **obj_rtn)
> @@ -91,6 +108,7 @@ static void
>  py_load (void)
>  {
>    Py_Initialize ();
> +  Py_InitModule("nbdkit", NbdkitMethods);
>  }
> 
>  static void
> -- 
> 2.9.3
> 
> _______________________________________________
> 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
libguestfs lets you edit virtual machines.  Supports shell scripting,
bindings from many languages.  http://libguestfs.org




More information about the Libguestfs mailing list