Re: [libvirt] [PATCH v3 10/31] Introduce virStreamInData
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
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
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