[v2] Coordinate if.h definitions for Linux and glibc (BZ #21367)

Submitted by Aurelien Jarno on April 9, 2017, 9:43 p.m.

Details

Message ID 20170409214351.5733-1-aurelien@aurel32.net
State New
Headers show

Commit Message

Aurelien Jarno April 9, 2017, 9:43 p.m.
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

Comments

Dmitry V. Levin April 10, 2017, 12:48 a.m.
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.
Aurelien Jarno April 10, 2017, 7:02 a.m.
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.

Patch hide | download patch | download mbox

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 */