On 05/16/2017 10:03 AM, Michal Privoznik wrote:
This is just a wrapper over new function that have been just
introduced: virStreamSendHole() . It's very similar to
virStreamSendAll() except it handles sparse streams well.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
include/libvirt/libvirt-stream.h | 65 +++++++++++++++-
src/libvirt-stream.c | 159 +++++++++++++++++++++++++++++++++++++++
src/libvirt_public.syms | 1 +
3 files changed, 222 insertions(+), 3 deletions(-)
[...]
diff --git a/src/libvirt-stream.c b/src/libvirt-stream.c
index 6bf4c4f29..4cbe5eee1 100644
--- a/src/libvirt-stream.c
+++ b/src/libvirt-stream.c
@@ -574,6 +574,165 @@ virStreamSendAll(virStreamPtr stream,
}
+/**
+ * virStreamSparseSendAll:
+ * @stream: pointer to the stream object
+ * @handler: source callback for reading data from application
+ * @holeHandler: source callback for determining holes
+ * @skipHandler: skip holes as reported by @holeHandler
+ * @opaque: application defined data
+ *
+ * Send the entire data stream, reading the data from the
+ * requested data source. This is simply a convenient alternative
+ * to virStreamSend, for apps that do blocking-I/O.
+ *
+ * An example using this with a hypothetical file upload
+ * API looks like
+ *
+ * int mysource(virStreamPtr st, char *buf, int nbytes, void *opaque) {
+ * int *fd = opaque;
+ *
+ * return read(*fd, buf, nbytes);
+ * }
+ *
+ * int myskip(virStreamPtr st, long long offset, void *opaque) {
+ * int *fd = opaque;
+ *
+ * return lseek(*fd, offset, SEEK_CUR) == (off_t) -1 ? -1 : 0;
+ * }
Similar notations here regarding "long long" values that are being used
in/for lseek() which expects "off_t"...
+ *
+ * int myindata(virStreamPtr st, int *inData,
+ * long long *offset, void *opaque) {
+ * int *fd = opaque;
+ *
+ * if (@fd in hole) {
+ * *inData = 0;
+ * *offset = holeSize;
+ * } else {
+ * *inData = 1;
+ * *offset = dataSize;
+ * }
+ *
+ * return 0;
+ * }
+ *
+ * virStreamPtr st = virStreamNew(conn, 0);
+ * int fd = open("demo.iso", O_RDONLY);
+ *
+ * virConnectUploadFile(conn, st);
^^ This doesn't exist either and is a straight copy from
virStreamSendAll... Should it also have the "Sparse" though?
Reviewed-by: John Ferlan <jferlan(a)redhat.com>
John