On 04/28/2016 04:04 AM, Michal Privoznik wrote:
The former is a public API and registers a callback that
will be called whenever the other side of a stream calls
virStreamSkip. The latter is a wrapper that actually calls
the callback. It is not made public as it is intended to be
used purely internally.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
+/**
+ * virStreamSkipFunc:
+ * @stream: stream
+ * @offset: size of hole in bytes
Again, naming this 'length' makes more sense (you're not skipping TO a
particular offset, but OVER a given length).
+++ b/src/libvirt-stream.c
@@ -286,6 +286,76 @@ virStreamRecv(virStreamPtr stream,
/**
+ * virStreamRegisterSkip:
+ * @stream: stream
+ * @skipCb: callback function
+ * @opaque: optional application provided data
+ *
+ * This function registers callback that will be called whenever
s/callback/a callback/
+ * the other side of the @stream is willing to skip a hole in the
+ * stream.
+ *
+ * Returns 0 on success,
+ * -1 otherwise.
+ */
+int
+virStreamRegisterSkip(virStreamPtr stream,
+ virStreamSkipFunc skipCb,
+ void *opaque)
+{
+ VIR_DEBUG("stream=%p, skipCb=%p opaque=%p", stream, skipCb, opaque);
+
+ virResetLastError();
+
+ virCheckStreamReturn(stream, -1);
+ virCheckNonNullArgReturn(skipCb, -1);
+
+ if (stream->skipCb) {
+ virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+ _("A skip callback is already registered"));
+ return -1;
I guess that means we allow passing skipCb=NULL to deregister a
callback; does it need to be specifically documented? Are there
scenarios where you WANT to deregister before closing something else, to
make sure that a stale callback is not called during a race scenario?
+int
+virStreamSkipCallback(virStreamPtr stream,
+ unsigned long long offset)
+{
+ VIR_DEBUG("stream=%p, offset=%llu", stream, offset);
+
+ virCheckStreamReturn(stream, -1);
+
+ if (stream->skipCb) {
+ int ret;
+ ret = (stream->skipCb)(stream, offset, stream->skipCbOpaque);
I might have omitted the () around stream->skipCb, but I don't know if
we have a consistent style, and yours makes it obvious that we know we
are dereferencing a function pointer.
+++ b/src/libvirt_public.syms
@@ -735,6 +735,7 @@ LIBVIRT_1.3.3 {
LIBVIRT_1.3.5 {
global:
virStreamSkip;
+ virStreamRegisterSkip;
Worth keeping sorted?
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library
http://libvirt.org