diff --git a/src/driver-stream.h b/src/driver-stream.h index 0fb56ebd236791c1f58be95825023c2bf089c3ad..f207bf0ebd374eef03272f98fd2a37f45962a86c 100644 --- a/src/driver-stream.h +++ b/src/driver-stream.h @@ -51,6 +51,11 @@ typedef int long long *length, unsigned int flags); +typedef int +(*virDrvStreamInData)(virStreamPtr st, + int *data, + long long *length); + typedef int (*virDrvStreamEventAddCallback)(virStreamPtr stream, int events, @@ -80,6 +85,7 @@ struct _virStreamDriver { virDrvStreamRecvFlags streamRecvFlags; virDrvStreamSendHole streamSendHole; virDrvStreamRecvHole streamRecvHole; + virDrvStreamInData streamInData; virDrvStreamEventAddCallback streamEventAddCallback; virDrvStreamEventUpdateCallback streamEventUpdateCallback; virDrvStreamEventRemoveCallback streamEventRemoveCallback; diff --git a/src/libvirt-stream.c b/src/libvirt-stream.c index c7ca1cc47776ce65cdbba3302ee810d716544860..ed0ed7325d78a8021736bafb27f8d7fb9e841a3d 100644 --- a/src/libvirt-stream.c +++ b/src/libvirt-stream.c @@ -481,6 +481,54 @@ virStreamRecvHole(virStreamPtr stream, } +/** + * virStreamInData: + * @stream: stream + * @data: are we in data or hole + * @length: length to next section + * + * This function checks the underlying stream (typically a file) + * to learn whether the current stream position lies within a + * data section or a hole. Upon return @data is set to a nonzero + * value if former is the case, or to zero if @stream is in a + * hole. Moreover, @length is updated to tell caller how many + * bytes can be read from @stream until current section changes + * (from data to a hole or vice versa). + * + * NB: there's an implicit hole at EOF. In this situation this + * function should set @data = false, @length = 0 and return 0. + * + * To sum it up: + * + * data section: @data = true, @length > 0 + * hole: @data = false, @length > 0 + * EOF: @data = false, @length = 0 + * + * Returns 0 on success, + * -1 otherwise + */ +int +virStreamInData(virStreamPtr stream, + int *data, + long long *length) +{ + VIR_DEBUG("stream=%p, data=%p, length=%p", stream, data, length); + + virResetLastError(); + virCheckNonNullArgReturn(data, -1); + virCheckNonNullArgReturn(length, -1); + + if (stream->driver->streamInData) { + int ret; + ret = (stream->driver->streamInData)(stream, data, length); + return ret; + } + + virReportUnsupportedError(); + return -1; +} + + /** * virStreamSendAll: * @stream: pointer to the stream object diff --git a/src/libvirt_internal.h b/src/libvirt_internal.h index 96439d840baa02f27a59915062cb7612433cf168..62f490a7dfd5feb66f52506c4f2a98b1426cf1e1 100644 --- a/src/libvirt_internal.h +++ b/src/libvirt_internal.h @@ -294,4 +294,8 @@ virTypedParameterValidateSet(virConnectPtr conn, virTypedParameterPtr params, int nparams); +int virStreamInData(virStreamPtr stream, + int *data, + long long *length); + #endif diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 4102a002ba3e06dbd8aab89ec71c1826e857951c..a1447eb445d94cb289d236ab337168bb6d185ed9 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1124,6 +1124,7 @@ virStateCleanup; virStateInitialize; virStateReload; virStateStop; +virStreamInData; # locking/domain_lock.h