[Libguestfs] [PATCH v6 1/7] daemon: expose file upload logic

Richard W.M. Jones rjones at redhat.com
Tue Apr 18 07:53:13 UTC 2017


On Thu, Apr 06, 2017 at 11:41:01PM +0300, Matteo Cafasso wrote:
> Allows other modules to use the same logic for uploading files.
> 
> Signed-off-by: Matteo Cafasso <noxdafox at gmail.com>
> ---
>  daemon/daemon.h |  3 +++
>  daemon/upload.c | 70 ++++++++++++++++++++++++++++++++-------------------------
>  2 files changed, 42 insertions(+), 31 deletions(-)
> 
> diff --git a/daemon/daemon.h b/daemon/daemon.h
> index abec087cd..797ec2dd9 100644
> --- a/daemon/daemon.h
> +++ b/daemon/daemon.h
> @@ -259,6 +259,9 @@ extern int64_t ntfs_minimum_size (const char *device);
>  extern int swap_set_uuid (const char *device, const char *uuid);
>  extern int swap_set_label (const char *device, const char *label);
> 
> +/*-- in upload.c --*/
> +extern int upload_to_fd (int fd);
> +
>  /* ordinary daemon functions use these to indicate errors
>   * NB: you don't need to prefix the string with the current command,
>   * it is added automatically by the client-side RPC stubs.
> diff --git a/daemon/upload.c b/daemon/upload.c
> index 655baf29d..144bb246c 100644
> --- a/daemon/upload.c
> +++ b/daemon/upload.c
> @@ -54,60 +54,68 @@ write_cb (void *data_vp, const void *buf, size_t len)
>    return 0;
>  }
> 
> +int
> +upload_to_fd (int fd)
> +{
> +  int ret = 0, err = 0;

Let's use 'r' instead of 'ret', since it's the same as what the
previous code used and you're not actually returning 'ret'.

> +  struct write_cb_data data = { .fd = fd, .written = 0 };
> +
> +  ret = receive_file (write_cb, &data);
> +  if (ret == -1) {		/* write error */
> +    err = errno;
> +    ret = cancel_receive ();
> +    errno = err;
> +    reply_with_error ("write error");

Compared to the old code:

> -    reply_with_error ("write error: %s", filename);

this loses the filename from the error message.  Pass the file name to
upload_to_fd to avoid losing information.

...
> -    r = cancel_receive ();
> +    cancel_receive ();
>      errno = err;
>      reply_with_perror ("%s", filename);
>      return -1;

and

>        err = errno;
> -      r = cancel_receive ();
> +      cancel_receive ();
>        errno = err;
>        reply_with_perror ("lseek: %s", filename);
>        return -1;

These changes are a separate bug, so they should be in a separate
commit.  More importantly than that, you should use ignore_value (...)
around cancel_receive, else Coverity will complain that the result is
not used.

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-p2v converts physical machines to virtual machines.  Boot with a
live CD or over the network (PXE) and turn machines into KVM guests.
http://libguestfs.org/virt-v2v




More information about the Libguestfs mailing list