]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Introduce virStreamInData
authorMichal Privoznik <mprivozn@redhat.com>
Sat, 21 May 2016 12:25:14 +0000 (14:25 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Thu, 18 May 2017 05:42:13 +0000 (07:42 +0200)
This is just an internal API, that calls corresponding function
in stream driver. This function will set @data = 1 if the
underlying file is in data section, or @data = 0 if it is in a
hole. At any rate, @length is set to number of bytes remaining in
the section the file currently is.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
src/driver-stream.h
src/libvirt-stream.c
src/libvirt_internal.h
src/libvirt_private.syms

index 0fb56ebd236791c1f58be95825023c2bf089c3ad..f207bf0ebd374eef03272f98fd2a37f45962a86c 100644 (file)
@@ -51,6 +51,11 @@ typedef int
                         long long *length,
                         unsigned int flags);
 
+typedef int
+(*virDrvStreamInData)(virStreamPtr st,
+                      int *data,
+                      long long *length);
+
 typedef int
 (*virDrvStreamEventAddCallback)(virStreamPtr stream,
                                 int events,
@@ -80,6 +85,7 @@ struct _virStreamDriver {
     virDrvStreamRecvFlags streamRecvFlags;
     virDrvStreamSendHole streamSendHole;
     virDrvStreamRecvHole streamRecvHole;
+    virDrvStreamInData streamInData;
     virDrvStreamEventAddCallback streamEventAddCallback;
     virDrvStreamEventUpdateCallback streamEventUpdateCallback;
     virDrvStreamEventRemoveCallback streamEventRemoveCallback;
index c7ca1cc47776ce65cdbba3302ee810d716544860..ed0ed7325d78a8021736bafb27f8d7fb9e841a3d 100644 (file)
@@ -481,6 +481,54 @@ virStreamRecvHole(virStreamPtr stream,
 }
 
 
+/**
+ * virStreamInData:
+ * @stream: stream
+ * @data: are we in data or hole
+ * @length: length to next section
+ *
+ * This function checks the underlying stream (typically a file)
+ * to learn whether the current stream position lies within a
+ * data section or a hole. Upon return @data is set to a nonzero
+ * value if former is the case, or to zero if @stream is in a
+ * hole. Moreover, @length is updated to tell caller how many
+ * bytes can be read from @stream until current section changes
+ * (from data to a hole or vice versa).
+ *
+ * NB: there's an implicit hole at EOF. In this situation this
+ * function should set @data = false, @length = 0 and return 0.
+ *
+ * To sum it up:
+ *
+ * data section: @data = true,  @length > 0
+ * hole:         @data = false, @length > 0
+ * EOF:          @data = false, @length = 0
+ *
+ * Returns 0 on success,
+ *        -1 otherwise
+ */
+int
+virStreamInData(virStreamPtr stream,
+                int *data,
+                long long *length)
+{
+    VIR_DEBUG("stream=%p, data=%p, length=%p", stream, data, length);
+
+    virResetLastError();
+    virCheckNonNullArgReturn(data, -1);
+    virCheckNonNullArgReturn(length, -1);
+
+    if (stream->driver->streamInData) {
+        int ret;
+        ret = (stream->driver->streamInData)(stream, data, length);
+        return ret;
+    }
+
+    virReportUnsupportedError();
+    return -1;
+}
+
+
 /**
  * virStreamSendAll:
  * @stream: pointer to the stream object
index 96439d840baa02f27a59915062cb7612433cf168..62f490a7dfd5feb66f52506c4f2a98b1426cf1e1 100644 (file)
@@ -294,4 +294,8 @@ virTypedParameterValidateSet(virConnectPtr conn,
                              virTypedParameterPtr params,
                              int nparams);
 
+int virStreamInData(virStreamPtr stream,
+                    int *data,
+                    long long *length);
+
 #endif
index 4102a002ba3e06dbd8aab89ec71c1826e857951c..a1447eb445d94cb289d236ab337168bb6d185ed9 100644 (file)
@@ -1124,6 +1124,7 @@ virStateCleanup;
 virStateInitialize;
 virStateReload;
 virStateStop;
+virStreamInData;
 
 
 # locking/domain_lock.h