mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-20 11:35:19 +00:00
Introduce VIR_STREAM_RECV_STOP_AT_HOLE flag
Add a new flag to virStreamRecvFlags in order to handle being able to stop reading from the stream so that the consumer can generate a "hole" in stream target. Generation of a hole replaces the need to receive and handle a sequence of zero bytes for sparse stream targets. Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
b6aedd2f05
commit
87e4a842b7
@ -45,6 +45,10 @@ int virStreamRecv(virStreamPtr st,
|
|||||||
char *data,
|
char *data,
|
||||||
size_t nbytes);
|
size_t nbytes);
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
VIR_STREAM_RECV_STOP_AT_HOLE = (1 << 0),
|
||||||
|
} virStreamRecvFlagsValues;
|
||||||
|
|
||||||
int virStreamRecvFlags(virStreamPtr st,
|
int virStreamRecvFlags(virStreamPtr st,
|
||||||
char *data,
|
char *data,
|
||||||
size_t nbytes,
|
size_t nbytes,
|
||||||
|
@ -290,7 +290,7 @@ virStreamRecv(virStreamPtr stream,
|
|||||||
* @stream: pointer to the stream object
|
* @stream: pointer to the stream object
|
||||||
* @data: buffer to read into from stream
|
* @data: buffer to read into from stream
|
||||||
* @nbytes: size of @data buffer
|
* @nbytes: size of @data buffer
|
||||||
* @flags: extra flags; not used yet, so callers should always pass 0
|
* @flags: bitwise-OR of virStreamRecvFlagsValues
|
||||||
*
|
*
|
||||||
* Reads a series of bytes from the stream. This method may
|
* Reads a series of bytes from the stream. This method may
|
||||||
* block the calling application for an arbitrary amount
|
* block the calling application for an arbitrary amount
|
||||||
@ -300,6 +300,33 @@ virStreamRecv(virStreamPtr stream,
|
|||||||
* @flags. Calling this function with no @flags set (equal to
|
* @flags. Calling this function with no @flags set (equal to
|
||||||
* zero) is equivalent to calling virStreamRecv(stream, data, nbytes).
|
* zero) is equivalent to calling virStreamRecv(stream, data, nbytes).
|
||||||
*
|
*
|
||||||
|
* If flag VIR_STREAM_RECV_STOP_AT_HOLE is set, this function
|
||||||
|
* will stop reading from stream if it has reached a hole. In
|
||||||
|
* that case, -3 is returned and virStreamRecvHole() should be
|
||||||
|
* called to get the hole size. An example using this flag might
|
||||||
|
* look like this:
|
||||||
|
*
|
||||||
|
* while (1) {
|
||||||
|
* char buf[4096];
|
||||||
|
*
|
||||||
|
* int ret = virStreamRecvFlags(st, buf, len, VIR_STREAM_STOP_AT_HOLE);
|
||||||
|
* if (ret < 0) {
|
||||||
|
* if (ret == -3) {
|
||||||
|
* long long len;
|
||||||
|
* ret = virStreamRecvHole(st, &len, 0);
|
||||||
|
* if (ret < 0) {
|
||||||
|
* ...error..
|
||||||
|
* } else {
|
||||||
|
* ...seek len bytes in target...
|
||||||
|
* }
|
||||||
|
* } else {
|
||||||
|
* return -1;
|
||||||
|
* }
|
||||||
|
* } else {
|
||||||
|
* ...write buf to target...
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
*
|
||||||
* Returns 0 when the end of the stream is reached, at
|
* Returns 0 when the end of the stream is reached, at
|
||||||
* which time the caller should invoke virStreamFinish()
|
* which time the caller should invoke virStreamFinish()
|
||||||
* to get confirmation of stream completion.
|
* to get confirmation of stream completion.
|
||||||
@ -310,6 +337,9 @@ virStreamRecv(virStreamPtr stream,
|
|||||||
*
|
*
|
||||||
* Returns -2 if there is no data pending to be read & the
|
* Returns -2 if there is no data pending to be read & the
|
||||||
* stream is marked as non-blocking.
|
* stream is marked as non-blocking.
|
||||||
|
*
|
||||||
|
* Returns -3 if there is a hole in stream and caller requested
|
||||||
|
* to stop at a hole.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
virStreamRecvFlags(virStreamPtr stream,
|
virStreamRecvFlags(virStreamPtr stream,
|
||||||
@ -331,6 +361,8 @@ virStreamRecvFlags(virStreamPtr stream,
|
|||||||
ret = (stream->driver->streamRecvFlags)(stream, data, nbytes, flags);
|
ret = (stream->driver->streamRecvFlags)(stream, data, nbytes, flags);
|
||||||
if (ret == -2)
|
if (ret == -2)
|
||||||
return -2;
|
return -2;
|
||||||
|
if (ret == -3)
|
||||||
|
return -3;
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto error;
|
goto error;
|
||||||
return ret;
|
return ret;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user