[v2] Coordinate if.h definitions for Linux and glibc (BZ #21367)
Commit Message
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
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.
@@ -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
@@ -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 */