This patch is adding the virStreamRecvFlags as a variant to the
virStreamRecv function in order to allow for future expansion of
functionality for processing sparse streams using a @flags
argument.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
include/libvirt/libvirt-stream.h | 5 ++++
src/driver-stream.h | 7 +++++
src/libvirt-stream.c | 59 ++++++++++++++++++++++++++++++++++++++++
src/libvirt_public.syms | 5 ++++
4 files changed, 76 insertions(+)
diff --git a/include/libvirt/libvirt-stream.h b/include/libvirt/libvirt-stream.h
index 831640d56..bee25168b 100644
--- a/include/libvirt/libvirt-stream.h
+++ b/include/libvirt/libvirt-stream.h
@@ -45,6 +45,11 @@ int virStreamRecv(virStreamPtr st,
char *data,
size_t nbytes);
+int virStreamRecvFlags(virStreamPtr st,
+ char *data,
+ size_t nbytes,
+ unsigned int flags);
+
/**
* virStreamSourceFunc:
diff --git a/src/driver-stream.h b/src/driver-stream.h
index 85b4e3bc7..d4b048018 100644
--- a/src/driver-stream.h
+++ b/src/driver-stream.h
@@ -35,6 +35,12 @@ typedef int
char *data,
size_t nbytes);
+typedef int
+(*virDrvStreamRecvFlags)(virStreamPtr st,
+ char *data,
+ size_t nbytes,
+ unsigned int flags);
+
typedef int
(*virDrvStreamEventAddCallback)(virStreamPtr stream,
int events,
@@ -61,6 +67,7 @@ typedef virStreamDriver *virStreamDriverPtr;
struct _virStreamDriver {
virDrvStreamSend streamSend;
virDrvStreamRecv streamRecv;
+ virDrvStreamRecvFlags streamRecvFlags;
virDrvStreamEventAddCallback streamEventAddCallback;
virDrvStreamEventUpdateCallback streamEventUpdateCallback;
virDrvStreamEventRemoveCallback streamEventRemoveCallback;
diff --git a/src/libvirt-stream.c b/src/libvirt-stream.c
index 8384b3720..7535deb3c 100644
--- a/src/libvirt-stream.c
+++ b/src/libvirt-stream.c
@@ -285,6 +285,65 @@ virStreamRecv(virStreamPtr stream,
}
+/**
+ * virStreamRecvFlags:
+ * @stream: pointer to the stream object
+ * @data: buffer to read into from stream
+ * @nbytes: size of @data buffer
+ * @flags: extra flags; not used yet, so callers should always pass 0
+ *
+ * Reads a series of bytes from the stream. This method may
+ * block the calling application for an arbitrary amount
+ * of time.
+ *
+ * This is just like virStreamRecv except this one has extra
+ * @flags. Calling this function with no @flags set (equal to
+ * zero) is equivalent to calling virStreamRecv(stream, data, nbytes).
+ *
+ * Returns 0 when the end of the stream is reached, at
+ * which time the caller should invoke virStreamFinish()
+ * to get confirmation of stream completion.
+ *
+ * Returns -1 upon error, at which time the stream will
+ * be marked as aborted, and the caller should now release
+ * the stream with virStreamFree.
+ *
+ * Returns -2 if there is no data pending to be read & the
+ * stream is marked as non-blocking.
+ */
+int
+virStreamRecvFlags(virStreamPtr stream,
+ char *data,
+ size_t nbytes,
+ unsigned int flags)
+{
+ VIR_DEBUG("stream=%p, data=%p, nbytes=%zu flags=%x",
+ stream, data, nbytes, flags);
+
+ virResetLastError();
+
+ virCheckStreamReturn(stream, -1);
+ virCheckNonNullArgGoto(data, error);
+
+ if (stream->driver &&
+ stream->driver->streamRecvFlags) {
+ int ret;
+ ret = (stream->driver->streamRecvFlags)(stream, data, nbytes, flags);
+ if (ret == -2)
+ return -2;
+ 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 428cf2e19..d50b36a24 100644
--- a/src/libvirt_public.syms
+++ b/src/libvirt_public.syms
@@ -759,4 +759,9 @@ LIBVIRT_3.1.0 {
virDomainSetVcpu;
} LIBVIRT_3.0.0;
+LIBVIRT_3.4.0 {
+ global:
+ virStreamRecvFlags;
+} LIBVIRT_3.1.0;
+
# .... define new API here using predicted next version number ....
--
2.13.0