[libvirt] [PATCH v3 09/31] Introduce virStreamSparseSendAll
John Ferlan
jferlan at redhat.com
Tue May 16 21:46:56 UTC 2017
On 05/16/2017 10:03 AM, Michal Privoznik wrote:
> This is just a wrapper over new function that have been just
> introduced: virStreamSendHole() . It's very similar to
> virStreamSendAll() except it handles sparse streams well.
>
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
> include/libvirt/libvirt-stream.h | 65 +++++++++++++++-
> src/libvirt-stream.c | 159 +++++++++++++++++++++++++++++++++++++++
> src/libvirt_public.syms | 1 +
> 3 files changed, 222 insertions(+), 3 deletions(-)
>
[...]
> diff --git a/src/libvirt-stream.c b/src/libvirt-stream.c
> index 6bf4c4f29..4cbe5eee1 100644
> --- a/src/libvirt-stream.c
> +++ b/src/libvirt-stream.c
> @@ -574,6 +574,165 @@ virStreamSendAll(virStreamPtr stream,
> }
>
>
> +/**
> + * virStreamSparseSendAll:
> + * @stream: pointer to the stream object
> + * @handler: source callback for reading data from application
> + * @holeHandler: source callback for determining holes
> + * @skipHandler: skip holes as reported by @holeHandler
> + * @opaque: application defined data
> + *
> + * Send the entire data stream, reading the data from the
> + * requested data source. This is simply a convenient alternative
> + * to virStreamSend, for apps that do blocking-I/O.
> + *
> + * An example using this with a hypothetical file upload
> + * API looks like
> + *
> + * int mysource(virStreamPtr st, char *buf, int nbytes, void *opaque) {
> + * int *fd = opaque;
> + *
> + * return read(*fd, buf, nbytes);
> + * }
> + *
> + * int myskip(virStreamPtr st, long long offset, void *opaque) {
> + * int *fd = opaque;
> + *
> + * return lseek(*fd, offset, SEEK_CUR) == (off_t) -1 ? -1 : 0;
> + * }
Similar notations here regarding "long long" values that are being used
in/for lseek() which expects "off_t"...
> + *
> + * int myindata(virStreamPtr st, int *inData,
> + * long long *offset, void *opaque) {
> + * int *fd = opaque;
> + *
> + * if (@fd in hole) {
> + * *inData = 0;
> + * *offset = holeSize;
> + * } else {
> + * *inData = 1;
> + * *offset = dataSize;
> + * }
> + *
> + * return 0;
> + * }
> + *
> + * virStreamPtr st = virStreamNew(conn, 0);
> + * int fd = open("demo.iso", O_RDONLY);
> + *
> + * virConnectUploadFile(conn, st);
^^ This doesn't exist either and is a straight copy from
virStreamSendAll... Should it also have the "Sparse" though?
Reviewed-by: John Ferlan <jferlan at redhat.com>
John
More information about the libvir-list
mailing list