On Wed, Aug 1, 2018 at 2:14 PM Richard W.M. Jones
<rjones(a)redhat.com> wrote:
> Currently this adds two useful header files containing functions which
> will be consumed by filters in later commits.
> ---
> Makefile.am | 5 +++-
> common/include/Makefile.am | 39 ++++++++++++++++++++++++
> common/include/ispowerof2.h | 50 +++++++++++++++++++++++++++++++
> common/include/iszero.h | 60 +++++++++++++++++++++++++++++++++++++
> configure.ac | 1 +
> 5 files changed, 154 insertions(+), 1 deletion(-)
>
> diff --git a/Makefile.am b/Makefile.am
> index 6a3a377..09dbdb9 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -53,7 +53,10 @@ SUBDIRS = \
> src
>
> if HAVE_PLUGINS
> -SUBDIRS += plugins filters
> +SUBDIRS += \
> + common/include \
> + plugins \
> + filters
> endif
>
> SUBDIRS += tests
> diff --git a/common/include/Makefile.am b/common/include/Makefile.am
> new file mode 100644
> index 0000000..4ce1723
> --- /dev/null
> +++ b/common/include/Makefile.am
> @@ -0,0 +1,39 @@
> +# nbdkit
> +# Copyright (C) 2018 Red Hat Inc.
> +# All rights reserved.
> +#
> +# Redistribution and use in source and binary forms, with or without
> +# modification, are permitted provided that the following conditions are
> +# met:
> +#
> +# * Redistributions of source code must retain the above copyright
> +# notice, this list of conditions and the following disclaimer.
> +#
> +# * Redistributions in binary form must reproduce the above copyright
> +# notice, this list of conditions and the following disclaimer in the
> +# documentation and/or other materials provided with the distribution.
> +#
> +# * Neither the name of Red Hat nor the names of its contributors may be
> +# used to endorse or promote products derived from this software without
> +# specific prior written permission.
> +#
> +# THIS SOFTWARE IS PROVIDED BY RED HAT AND CONTRIBUTORS ''AS IS''
AND
> +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
> +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
> +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RED HAT OR
> +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
> +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
> +# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
> +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
> +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
> +# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> +# SUCH DAMAGE.
> +
> +include $(top_srcdir)/common-rules.mk
> +
> +# These headers contain only common code shared by plugins and
> +# filters. They are not installed.
> +EXTRA_DIST = \
> + ispowerof2.h \
> + iszero.h
> diff --git a/common/include/ispowerof2.h b/common/include/ispowerof2.h
> new file mode 100644
> index 0000000..41844b3
> --- /dev/null
> +++ b/common/include/ispowerof2.h
> @@ -0,0 +1,50 @@
> +/* nbdkit
> + * Copyright (C) 2018 Red Hat Inc.
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions are
> + * met:
> + *
> + * * Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + *
> + * * Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * * Neither the name of Red Hat nor the names of its contributors may be
> + * used to endorse or promote products derived from this software without
> + * specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY RED HAT AND CONTRIBUTORS ''AS IS''
AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
> + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
> + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RED HAT OR
> + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
> + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
> + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
> + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
> + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
> + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +#ifndef NBDKIT_ISPOWEROF2_H
> +#define NBDKIT_ISPOWEROF2_H
> +
> +#include <stdbool.h>
> +
> +/* Returns true if v is a power of 2.
> + *
> + * Uses the algorithm described at
> + *
>
http://graphics.stanford.edu/~seander/bithacks.html#DetermineIfPowerOf2
> + */
> +static inline bool
> +is_power_of_2 (unsigned long v)
> +{
> + return v && ((v & (v - 1)) == 0);
> +}
> +
> +#endif /* NBDKIT_ISPOWEROF2_H */
> diff --git a/common/include/iszero.h b/common/include/iszero.h
> new file mode 100644
> index 0000000..331614c
> --- /dev/null
> +++ b/common/include/iszero.h
> @@ -0,0 +1,60 @@
> +/* nbdkit
> + * Copyright (C) 2018 Red Hat Inc.
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions are
> + * met:
> + *
> + * * Redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer.
> + *
> + * * Redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution.
> + *
> + * * Neither the name of Red Hat nor the names of its contributors may be
> + * used to endorse or promote products derived from this software without
> + * specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY RED HAT AND CONTRIBUTORS ''AS IS''
AND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
> + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
> + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RED HAT OR
> + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
> + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
> + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
> + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
> + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
> + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> + * SUCH DAMAGE.
> + */
> +
> +#ifndef NBDKIT_ISZERO_H
> +#define NBDKIT_ISZERO_H
> +
> +#include <string.h>
> +#include <stdbool.h>
> +
> +/* Return true iff the buffer is all zero bytes.
> + *
> + * The clever approach here was suggested by Eric Blake. See:
> + *
https://www.redhat.com/archives/libguestfs/2017-April/msg00171.html
It would be nice to mention the original author:
http://rusty.ozlabs.org/?p=560
Thanks - I didn't know that. I will add the link to the comment.
Rich.
--
Richard Jones, Virtualization Group, Red Hat
libguestfs lets you edit virtual machines. Supports shell scripting,
bindings from many languages.