[libvirt] [PATCH 1/4] storage: factor out large integer reads

Daniel P. Berrange berrange at redhat.com
Thu Feb 7 14:53:52 UTC 2013


On Wed, Feb 06, 2013 at 10:10:17PM -0700, Eric Blake wrote:
> This makes code easier to read, by avoiding lines longer than
> 80 columns and removing the repetition from the callers.
> 
> * src/util/virstoragefile.c (virRead64BE, virRead64LE)
> (virRead32BE, virRead32LE): New helper functions.
> (qedGetHeaderUL, qedGetHeaderULL): Delete in favor of more generic
> name.
> (qcow2GetBackingStoreFormat, qcowXGetBackingStore)
> (qedGetBackingStore, virStorageFileMatchesVersion)
> (virStorageFileGetMetadataInternal): Use them.
> ---
>  src/util/virstoragefile.c | 159 +++++++++++++++++++++-------------------------
>  1 file changed, 72 insertions(+), 87 deletions(-)
> 
> diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
> index 6e2d61e..e7ab226 100644
> --- a/src/util/virstoragefile.c
> +++ b/src/util/virstoragefile.c
> @@ -208,6 +208,58 @@ static struct FileTypeInfo const fileTypeInfo[] = {
>  };
>  verify(ARRAY_CARDINALITY(fileTypeInfo) == VIR_STORAGE_FILE_LAST);
> 
> +/* Read 8 bytes at BUF as a big-endian 64-bit number.  Caller is
> +   responsible to avoid reading beyond array bounds.  */
> +static unsigned long long
> +virRead64BE(const unsigned char *buf)
> +{
> +    return (((uint64_t)buf[0] << 56) |
> +            ((uint64_t)buf[1] << 48) |
> +            ((uint64_t)buf[2] << 40) |
> +            ((uint64_t)buf[3] << 32) |
> +            ((uint64_t)buf[4] << 24) |
> +            ((uint64_t)buf[5] << 16) |
> +            ((uint64_t)buf[6] << 8) |
> +            (uint64_t)buf[7]);
> +}
> +
> +/* Read 8 bytes at BUF as a little-endian 64-bit number.  Caller is
> +   responsible to avoid reading beyond array bounds.  */
> +static unsigned long long
> +virRead64LE(const unsigned char *buf)
> +{
> +    return ((uint64_t)buf[0] |
> +            ((uint64_t)buf[1] << 8) |
> +            ((uint64_t)buf[2] << 16) |
> +            ((uint64_t)buf[3] << 24) |
> +            ((uint64_t)buf[4] << 32) |
> +            ((uint64_t)buf[5] << 40) |
> +            ((uint64_t)buf[6] << 48) |
> +            ((uint64_t)buf[7] << 56));
> +}
> +
> +/* Read 4 bytes at BUF as a big-endian 32-bit number.  Caller is
> +   responsible to avoid reading beyond array bounds.  */
> +static unsigned int
> +virRead32BE(const unsigned char *buf)
> +{
> +    return ((buf[0] << 24) |
> +            (buf[1] << 16) |
> +            (buf[2] << 8) |
> +            buf[3]);
> +}
> +
> +/* Read 4 bytes at BUF as a little-endian 32-bit number.  Caller is
> +   responsible to avoid reading beyond array bounds.  */
> +static unsigned int
> +virRead32LE(const unsigned char *buf)
> +{
> +    return (buf[0] |
> +            (buf[1] << 8) |
> +            (buf[2] << 16) |
> +            (buf[3] << 24));
> +}

How about putting these helpful APIs in some other src/util/ file
as macros. Either virutil.h, or perhaps  virinttypes.h or virendian.h ?
Probably with a name like "virReadBufInt{32,64}{BE,LE}"


ACK to this patch regardless though.

Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list