Message ID | 20170409214351.5733-1-aurelien@aurel32.net |
---|---|
State | New |
Headers | show |
On Sun, Apr 09, 2017 at 11:43:51PM +0200, Aurelien Jarno wrote: > This commit coordinates the definition of structures and enum already > defined the Linux kernel UAPI headers, following the procedure described > on https://sourceware.org/glibc/wiki/Synchronizing_Headers. > > With this change, it is safe to include <net/if.h> and <linux/if.h> in > any order in a a userspace application. > > Note: this as been fixed in commit 4a91cb61bb995 on the Linux side. > > Changelog: > [BZ #21367] > * sysdeps/gnu/net/if.h: wrap IFF_* enums in > !defined __UAPI_DEF_IF_NET_DEVICE_FLAGS defines. > (struct ifmap): Wrap in !defined __UAPI_DEF_IF_IFMAP defines. > (struct ifreq): Wrap in !defined __UAPI_DEF_IF_IFREQ defines. > (struct ifconf): Wrap in !defined __UAPI_DEF_IF_IFCONF defines. > --- > ChangeLog | 9 +++++++++ > sysdeps/gnu/net/if.h | 9 +++++++++ > 2 files changed, 18 insertions(+) > > Changes v1 -> v2: > Use '#ifndef' instead of '#if !' so that it also works with -Werror=undef Please try to include this patched <net/if.h> after <linux/xattr.h> and see what's going to be defined.
On 2017-04-10 03:48, Dmitry V. Levin wrote: > On Sun, Apr 09, 2017 at 11:43:51PM +0200, Aurelien Jarno wrote: > > This commit coordinates the definition of structures and enum already > > defined the Linux kernel UAPI headers, following the procedure described > > on https://sourceware.org/glibc/wiki/Synchronizing_Headers. > > > > With this change, it is safe to include <net/if.h> and <linux/if.h> in > > any order in a a userspace application. > > > > Note: this as been fixed in commit 4a91cb61bb995 on the Linux side. > > > > Changelog: > > [BZ #21367] > > * sysdeps/gnu/net/if.h: wrap IFF_* enums in > > !defined __UAPI_DEF_IF_NET_DEVICE_FLAGS defines. > > (struct ifmap): Wrap in !defined __UAPI_DEF_IF_IFMAP defines. > > (struct ifreq): Wrap in !defined __UAPI_DEF_IF_IFREQ defines. > > (struct ifconf): Wrap in !defined __UAPI_DEF_IF_IFCONF defines. > > --- > > ChangeLog | 9 +++++++++ > > sysdeps/gnu/net/if.h | 9 +++++++++ > > 2 files changed, 18 insertions(+) > > > > Changes v1 -> v2: > > Use '#ifndef' instead of '#if !' so that it also works with -Werror=undef > > Please try to include this patched <net/if.h> after <linux/xattr.h> > and see what's going to be defined. Indeed you are correct. It seems that the way it's done on the Linux side doesn't allow for any detection on the glibc side. Even worse checking for _LINUX_IF_H in the glibc header doesn't work if the include sequence is <linux/libc-compat.h>, <net/if.h> and <linux/if.h>. I'll see what can be done on the kernel side first.
diff --git a/ChangeLog b/ChangeLog index b72d52164e..21b96bb35e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2017-04-09 Aurelien Jarno <aurelien@aurel32.net> + + [BZ #21367] + * sysdeps/gnu/net/if.h: wrap IFF_* enums in + !defined __UAPI_DEF_IF_NET_DEVICE_FLAGS defines. + (struct ifmap): Wrap in !defined __UAPI_DEF_IF_IFMAP defines. + (struct ifreq): Wrap in !defined __UAPI_DEF_IF_IFREQ defines. + (struct ifconf): Wrap in !defined __UAPI_DEF_IF_IFCONF defines. + 2017-04-07 H.J. Lu <hongjiu.lu@intel.com> * sysdeps/i386/fpu/fclrexcpt.c (__feclearexcept): Use diff --git a/sysdeps/gnu/net/if.h b/sysdeps/gnu/net/if.h index 0afce08238..a330fe0755 100644 --- a/sysdeps/gnu/net/if.h +++ b/sysdeps/gnu/net/if.h @@ -39,6 +39,7 @@ struct if_nameindex #ifdef __USE_MISC /* Standard interface flags. */ +# ifndef __UAPI_DEF_IF_NET_DEVICE_FLAGS enum { IFF_UP = 0x1, /* Interface is up. */ @@ -79,6 +80,7 @@ enum IFF_DYNAMIC = 0x8000 /* Dialup device with changing addresses. */ # define IFF_DYNAMIC IFF_DYNAMIC }; +# endif /* !defined __UAPI_DEF_IF_NET_DEVICE_FLAGS */ /* The ifaddr structure contains information about one address of an interface. They are maintained by the different address families, @@ -108,6 +110,7 @@ struct ifaddr handy for debugging things. The set side is fine for now and being very small might be worth keeping for clean configuration. */ +# ifndef __UAPI_DEF_IF_IFMAP struct ifmap { unsigned long int mem_start; @@ -118,11 +121,13 @@ struct ifmap unsigned char port; /* 3 bytes spare */ }; +# endif /* !defined __UAPI_DEF_IF_IFMAP */ /* Interface request structure used for socket ioctl's. All interface ioctl's must have parameter definitions which begin with ifr_name. The remainder may be interface specific. */ +# ifndef __UAPI_DEF_IF_IFREQ struct ifreq { # define IFHWADDRLEN 6 @@ -148,6 +153,8 @@ struct ifreq __caddr_t ifru_data; } ifr_ifru; }; +# endif /* !__UAPI_DEF_IF_IFREQ */ + # define ifr_name ifr_ifrn.ifrn_name /* interface name */ # define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address */ # define ifr_addr ifr_ifru.ifru_addr /* address */ @@ -173,6 +180,7 @@ struct ifreq configuration for machine (useful for programs which must know all networks accessible). */ +# ifndef __UAPI_DEF_IF_IFCONF struct ifconf { int ifc_len; /* Size of buffer. */ @@ -182,6 +190,7 @@ struct ifconf struct ifreq *ifcu_req; } ifc_ifcu; }; +# endif /* !defined __UAPI_DEF_IF_IFCONF */ # define ifc_buf ifc_ifcu.ifcu_buf /* Buffer address. */ # define ifc_req ifc_ifcu.ifcu_req /* Array of structures. */ # define _IOT_ifconf _IOT(_IOTS(struct ifconf),1,0,0,0,0) /* not right */