Re: [libvirt] [PATCH v3 10/31] Introduce virStreamInData

2017-05-17 Thread Michal Privoznik
On 05/17/2017 12:00 AM, John Ferlan wrote:
> 
> 
> On 05/16/2017 10:03 AM, Michal Privoznik wrote:
>> 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 
>> ---
>>  src/driver-stream.h  |  6 ++
>>  src/libvirt-stream.c | 48 
>> 
>>  src/libvirt_internal.h   |  4 
>>  src/libvirt_private.syms |  1 +
>>  4 files changed, 59 insertions(+)
>>
> 
> [...]
> 
>> diff --git a/src/libvirt-stream.c b/src/libvirt-stream.c
>> index 4cbe5eee1..30c305035 100644
>> --- a/src/libvirt-stream.c
>> +++ b/src/libvirt-stream.c
>> @@ -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);
>> +
>> +/* No checks of arguments or error resetting. This is an
>> + * internal function that just happen to live next to some
>> + * public functions of ours. */
> 
> Well... If it's publicly accessible... @data and @length should probably
> be checked for non NULL.

It's not publicly accessible. It's private. But sure, checks would be
harmless. I can add them.

Michal

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH v3 10/31] Introduce virStreamInData

2017-05-16 Thread John Ferlan


On 05/16/2017 10:03 AM, Michal Privoznik wrote:
> 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 
> ---
>  src/driver-stream.h  |  6 ++
>  src/libvirt-stream.c | 48 
> 
>  src/libvirt_internal.h   |  4 
>  src/libvirt_private.syms |  1 +
>  4 files changed, 59 insertions(+)
> 

[...]

> diff --git a/src/libvirt-stream.c b/src/libvirt-stream.c
> index 4cbe5eee1..30c305035 100644
> --- a/src/libvirt-stream.c
> +++ b/src/libvirt-stream.c
> @@ -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);
> +
> +/* No checks of arguments or error resetting. This is an
> + * internal function that just happen to live next to some
> + * public functions of ours. */

Well... If it's publicly accessible... @data and @length should probably
be checked for non NULL.

I looked at a couple of other "libvirt_internal.h" functions and they
have some parameter checking.

I'll put the R-b on anyway, I would suggest adding parameter checks for
non null values though. It'd be stupid user death fairly quickly
otherwise...

Reviewed-by: John Ferlan 

John

[have to stop for the evening, will pick this up again tomorrow]

[...]

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v3 10/31] Introduce virStreamInData

2017-05-16 Thread Michal Privoznik
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 
---
 src/driver-stream.h  |  6 ++
 src/libvirt-stream.c | 48 
 src/libvirt_internal.h   |  4 
 src/libvirt_private.syms |  1 +
 4 files changed, 59 insertions(+)

diff --git a/src/driver-stream.h b/src/driver-stream.h
index 0fb56ebd2..f207bf0eb 100644
--- a/src/driver-stream.h
+++ b/src/driver-stream.h
@@ -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;
diff --git a/src/libvirt-stream.c b/src/libvirt-stream.c
index 4cbe5eee1..30c305035 100644
--- a/src/libvirt-stream.c
+++ b/src/libvirt-stream.c
@@ -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);
+
+/* 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
diff --git a/src/libvirt_internal.h b/src/libvirt_internal.h
index 96439d840..62f490a7d 100644
--- a/src/libvirt_internal.h
+++ b/src/libvirt_internal.h
@@ -294,4 +294,8 @@ virTypedParameterValidateSet(virConnectPtr conn,
  virTypedParameterPtr params,
  int nparams);
 
+int virStreamInData(virStreamPtr stream,
+int *data,
+long long *length);
+
 #endif
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 4102a002b..a1447eb44 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1124,6 +1124,7 @@ virStateCleanup;
 virStateInitialize;
 virStateReload;
 virStateStop;
+virStreamInData;
 
 
 # locking/domain_lock.h
-- 
2.13.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list