[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [PATCH v2 08/32] Introduce virStreamInData



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      |  6 ++++++
 src/libvirt-stream.c     | 43 +++++++++++++++++++++++++++++++++++++++++++
 src/libvirt_internal.h   |  3 +++
 src/libvirt_private.syms |  1 +
 4 files changed, 53 insertions(+)

diff --git a/src/driver-stream.h b/src/driver-stream.h
index e196b6d..5d84b9a 100644
--- a/src/driver-stream.h
+++ b/src/driver-stream.h
@@ -50,6 +50,11 @@ typedef int
                         unsigned long long *length);
 
 typedef int
+(*virDrvStreamInData)(virStreamPtr st,
+                      int *data,
+                      unsigned long long *length);
+
+typedef int
 (*virDrvStreamEventAddCallback)(virStreamPtr stream,
                                 int events,
                                 virStreamEventCallback cb,
@@ -78,6 +83,7 @@ struct _virStreamDriver {
     virDrvStreamRecvFlags streamRecvFlags;
     virDrvStreamSkip streamSkip;
     virDrvStreamHoleSize streamHoleSize;
+    virDrvStreamInData streamInData;
     virDrvStreamEventAddCallback streamEventAddCallback;
     virDrvStreamEventUpdateCallback streamEventUpdateCallback;
     virDrvStreamEventRemoveCallback streamEventRemoveCallback;
diff --git a/src/libvirt-stream.c b/src/libvirt-stream.c
index 707c0ed..2632d55 100644
--- a/src/libvirt-stream.c
+++ b/src/libvirt-stream.c
@@ -473,6 +473,49 @@ virStreamHoleSize(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 hold. 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).
+ *
+ * As a special case, there's an implicit hole at EOF. In this
+ * situation this function should set @data = false, @length = 0
+ * and return 0.
+ *
+ * Returns 0 on success,
+ *        -1 otherwise
+ */
+int
+virStreamInData(virStreamPtr stream,
+                int *data,
+                unsigned long long *length)
+{
+    VIR_DEBUG("stream=%p, data=%p, length=%p", stream, data, length);
+
+    /* No checks of arguments or error resetting. This is an
+     * internal function that just happen to live next to some
+     * public functions of ours. */
+
+    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
  * @handler: source callback for reading data from application
diff --git a/src/libvirt_internal.h b/src/libvirt_internal.h
index 96439d8..0e945aa 100644
--- a/src/libvirt_internal.h
+++ b/src/libvirt_internal.h
@@ -294,4 +294,7 @@ virTypedParameterValidateSet(virConnectPtr conn,
                              virTypedParameterPtr params,
                              int nparams);
 
+int virStreamInData(virStreamPtr stream,
+                    int *data,
+                    unsigned long long *lengtht);
 #endif
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index fb5b419..48d4258 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1017,6 +1017,7 @@ virStateCleanup;
 virStateInitialize;
 virStateReload;
 virStateStop;
+virStreamInData;
 
 
 # locking/domain_lock.h
-- 
2.8.3


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]