At the same time register RECV_STOP_AT_HOLE constant.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
Changes | 2 ++
Virt.xs | 13 ++++++++++---
lib/Sys/Virt/Stream.pm | 20 ++++++++++++++++----
3 files changed, 28 insertions(+), 7 deletions(-)
diff --git a/Changes b/Changes
index 2e4a99e..b4a493c 100644
--- a/Changes
+++ b/Changes
@@ -4,6 +4,8 @@ Revision history for perl module Sys::Virt
- Add LIST_CAP_MDEV & LIST_CAP_MDEV_TYPES constants
- Fix send_all() callback helper
+ - Introduce flags to Stream::recv() and
+ register RECV_STOP_AT_HOLE constant
3.3.0 2017-05-08
diff --git a/Virt.xs b/Virt.xs
index a041c95..498e711 100644
--- a/Virt.xs
+++ b/Virt.xs
@@ -7874,16 +7874,21 @@ send(st, data, nbytes)
int
-recv(st, data, nbytes)
+recv(st, data, nbytes, flags=0)
virStreamPtr st;
SV *data;
size_t nbytes;
+ unsigned int flags;
PREINIT:
char *rawdata;
CODE:
Newx(rawdata, nbytes, char);
- if ((RETVAL = virStreamRecv(st, rawdata, nbytes)) < 0 &&
- RETVAL != -2) {
+ if (flags)
+ RETVAL = virStreamRecvFlags(st, rawdata, nbytes, flags);
+ else
+ RETVAL = virStreamRecv(st, rawdata, nbytes);
+
+ if (RETVAL != -2 && RETVAL != -3) {
Safefree(rawdata);
_croak_error();
}
@@ -9010,6 +9015,8 @@ BOOT:
REGISTER_CONSTANT(VIR_STREAM_EVENT_ERROR, EVENT_ERROR);
REGISTER_CONSTANT(VIR_STREAM_EVENT_HANGUP, EVENT_HANGUP);
+ REGISTER_CONSTANT(VIR_STREAM_RECV_STOP_AT_HOLE, RECV_STOP_AT_HOLE);
+
stash = gv_stashpv( "Sys::Virt::Error", TRUE );
diff --git a/lib/Sys/Virt/Stream.pm b/lib/Sys/Virt/Stream.pm
index 4022c84..069895e 100644
--- a/lib/Sys/Virt/Stream.pm
+++ b/lib/Sys/Virt/Stream.pm
@@ -69,11 +69,23 @@ be called on any stream which has been activated
Complete I/O on the stream. Either this function or C<abort> must
be called on any stream which has been activated
-=item $rv = $st->recv($data, $nbytes)
+=item $rv = $st->recv($data, $nbytes, $flags=0)
-Receive upto C<$nbytes> worth of data, copying into C<$data>.
-Returns the number of bytes read, or -2 if I/O would block,
-or -1 on error.
+Receive up to C<$nbytes> worth of data, copying into C<$data>.
+Returns the number of bytes read, or -3 if hole is reached and
+C<$flags> contains RECV_STOP_AT_HOLE, or -2 if I/O would block,
+or -1 on error. The C<$flags> parameter accepts the following
+flags:
+
+=over 4
+
+=item Sys::Virt::Stream::RECV_STOP_AT_HOLE
+
+If this flag is set, the C<recv> function will stop reading from
+stream if it has reached a hole. In that case, -3 is returned and
+C<recvHole> should be called to get the hole size.
+
+=back
=item $rv = $st->send($data, $nbytes)
--
2.13.0