diff --git a/include/libvirt/libvirt-stream.h b/include/libvirt/libvirt-stream.h index 14c9af1429..feaa8ad648 100644 --- a/include/libvirt/libvirt-stream.h +++ b/include/libvirt/libvirt-stream.h @@ -54,6 +54,10 @@ int virStreamSendHole(virStreamPtr st, long long length, unsigned int flags); +int virStreamRecvHole(virStreamPtr, + long long *length, + unsigned int flags); + /** * virStreamSourceFunc: diff --git a/src/driver-stream.h b/src/driver-stream.h index 0a52014312..0fb56ebd23 100644 --- a/src/driver-stream.h +++ b/src/driver-stream.h @@ -46,6 +46,11 @@ typedef int long long length, unsigned int flags); +typedef int +(*virDrvStreamRecvHole)(virStreamPtr st, + long long *length, + unsigned int flags); + typedef int (*virDrvStreamEventAddCallback)(virStreamPtr stream, int events, @@ -74,6 +79,7 @@ struct _virStreamDriver { virDrvStreamRecv streamRecv; virDrvStreamRecvFlags streamRecvFlags; virDrvStreamSendHole streamSendHole; + virDrvStreamRecvHole streamRecvHole; virDrvStreamEventAddCallback streamEventAddCallback; virDrvStreamEventUpdateCallback streamEventUpdateCallback; virDrvStreamEventRemoveCallback streamEventRemoveCallback; diff --git a/src/libvirt-stream.c b/src/libvirt-stream.c index a09896dcdf..dc0dc9ea37 100644 --- a/src/libvirt-stream.c +++ b/src/libvirt-stream.c @@ -405,6 +405,50 @@ virStreamSendHole(virStreamPtr stream, } +/** + * virStreamRecvHole: + * @stream: pointer to the stream object + * @length: number of bytes to skip + * @flags: extra flags; not used yet, so callers should always pass 0 + * + * This API is used to determine the @length in bytes of the + * empty space to be created in a @stream's target file when + * uploading or downloading sparsely populated files. This is the + * counterpart to virStreamSendHole(). + * + * Returns 0 on success, + * -1 on error or when there's currently no hole in the stream + */ +int +virStreamRecvHole(virStreamPtr stream, + long long *length, + unsigned int flags) +{ + VIR_DEBUG("stream=%p, length=%p flags=%x", + stream, length, flags); + + virResetLastError(); + + virCheckStreamReturn(stream, -1); + virCheckNonNullArgReturn(length, -1); + + if (stream->driver && + stream->driver->streamRecvHole) { + int ret; + ret = (stream->driver->streamRecvHole)(stream, length, flags); + if (ret < 0) + goto error; + return ret; + } + + virReportUnsupportedError(); + + error: + virDispatchError(stream->conn); + return -1; +} + + /** * virStreamSendAll: * @stream: pointer to the stream object diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms index 3be7cc6a0b..b73cc8af1e 100644 --- a/src/libvirt_public.syms +++ b/src/libvirt_public.syms @@ -762,6 +762,7 @@ LIBVIRT_3.1.0 { LIBVIRT_3.4.0 { global: virStreamRecvFlags; + virStreamRecvHole; virStreamSendHole; } LIBVIRT_3.1.0;