[libvirt] [PATCH RFC 29/48] fdstream: Implement seek

Michal Privoznik mprivozn at redhat.com
Wed Jun 22 14:43:46 UTC 2016


Implement virStreamSkip and virStreamInData callbacks. These
callbacks do no magic, just skip a hole or detect whether we are
in a data section of a file or in a hole and how much bytes can
we read until section changes.

Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
---
 src/fdstream.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 48 insertions(+)

diff --git a/src/fdstream.c b/src/fdstream.c
index bebeac3..be94325 100644
--- a/src/fdstream.c
+++ b/src/fdstream.c
@@ -504,11 +504,59 @@ static int virFDStreamRead(virStreamPtr st, char *bytes, size_t nbytes)
 }
 
 
+static int
+virFDStreamSkip(virStreamPtr st,
+                unsigned long long length)
+{
+    virFDStreamDataPtr fdst = st->privateData;
+    off_t off;
+    int ret = -1;
+
+    virObjectLock(fdst);
+    if (fdst->length) {
+        if (fdst->offset + length > fdst->length) {
+            virReportSystemError(ENOSPC, "%s",
+                                 _("cannot write to stream"));
+            goto cleanup;
+        }
+        fdst->offset += length;
+    }
+
+    off = lseek(fdst->fd, length, SEEK_CUR);
+    if (off == (off_t) -1) {
+        virReportSystemError(errno, "%s",
+                             _("unable to seek"));
+        goto cleanup;
+    }
+    ret = 0;
+ cleanup:
+    virObjectUnlock(fdst);
+    return ret;
+}
+
+
+static int
+virFDStreamInData(virStreamPtr st,
+                  int *inData,
+                  unsigned long long *length)
+{
+    virFDStreamDataPtr fdst = st->privateData;
+    int ret = -1;
+
+    virObjectLock(fdst);
+    ret = virFileInData(fdst->fd, inData, length);
+    virObjectUnlock(fdst);
+    return ret;
+}
+
+
 static virStreamDriver virFDStreamDrv = {
     .streamSend = virFDStreamWrite,
     .streamRecv = virFDStreamRead,
     .streamFinish = virFDStreamClose,
     .streamAbort = virFDStreamAbort,
+    .streamSkip = virFDStreamSkip,
+    .streamInData = virFDStreamInData,
     .streamEventAddCallback = virFDStreamAddCallback,
     .streamEventUpdateCallback = virFDStreamUpdateCallback,
     .streamEventRemoveCallback = virFDStreamRemoveCallback
-- 
2.8.4




More information about the libvir-list mailing list