On 02/11/2014 12:49 AM, Eric Blake wrote:
On 02/10/2014 03:38 PM, Laine Stump wrote:
> In order to make a client-only build successful on RHEL4, commit
> 3ed2e54 modified src/util/virnetdev.c so that the functional version
> of virNetDevGetVLanID() was only compiled if GET_VLAN_VID_CMD was
> defined. However, it is *never* defined, but is only an enum value, so
> the proper version was no longer compiled even on platforms that
> support it. This resulted in the vlan tag not being properly set for
> guest traffic on VEPA mode guest macvtap interfaces that were bound to
> a vlan interface (that's the only place that libvirt currently uses
> virNetDevGetVLanID)
>
> Since there is no way to compile conditionally based on the presence
> of an enum value, this patch modifies configure.ac to check for said
> enum value with AC_CHECK_DECLS(), which #defines HAVE_GET_VLAN_VID_CMD
> if it's successful compiling a test program that uses
> GET_VLAN_VID_CMD. We can then make the compilation of
> virNetDevGetVLanID() conditional on that #define instead.
> ---
>
> Difference from V1:
>
> Use the amazingly compact AC_CHECK_DECLS() instead
> of deprecated AC_TRY_COMPILE() + extra trappings.
>
> configure.ac | 2 ++
> src/util/virnetdev.c | 4 ++--
> 2 files changed, 4 insertions(+), 2 deletions(-)
Almost!
>
> -#if defined(SIOCGIFVLAN) && defined(HAVE_STRUCT_IFREQ) &&
defined(GET_VLAN_VID_CMD)
> +#if defined(SIOCGIFVLAN) && defined(HAVE_STRUCT_IFREQ) &&
defined(HAVE_GET_VLAN_VID_CMD)
s/defined(HAVE_GET_VLAN_VID_CMD)/HAVE_GET_VLAN_VID_CMD/
As a matter of fact, "HAVE_DECL_GET_VLAN_VID_CMD". I fixed that and
pushed. Thanks for the tutorial :-)
AC_CHECK_DECLS unconditionally defines the variable to either 0 or 1, so
checking if it is defined will still fail to compile on older headers
that lack the enum;
Well, it would have compiled successfully, but compiled the wrong code :-)
what you want is to check that it has a non-zero value.
Now that I've seen this, it bugs me that all HAVE_* #defines aren't
consistent about this - some are undefined if the capability is missing,
and some are #defined, but to 0.