Skip to contentSkip to conversation

Revert "net: Support inclusion of <linux/socket.h> before <sys/socket.h>"

PATCH In review Ben Hutchings 2 participants 5 messages Nov 12, 2009

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Revert "net: Support inclusion of <linux/socket.h> before <sys/socket.h>"

This reverts commit 9c501935a3cdcf6b1d35aaee3aa11c7a7051a305. That commit caused <linux/rtnetlink.h> to require that <sys/socket.h> is included first, breaking autoconf tests for <linux/rtnetlink.h> and presumably some real programs too.

---
Please apply this to net-2.6.

I'm not sure what the proper solution is; maybe make <linux/socket.h> include <sys/socket.h> if __KERNEL__ is not defined?

Ben.

 include/linux/socket.h |   21 ++++++++++++++++++---
 1 files changed, 18 insertions(+), 3 deletions(-)
include/linux/socket.h +18 -3
index 3273a0c..3b461df 100644
@@ -16,7 +16,7 @@ struct __kernel_sockaddr_storage {
 				/* _SS_MAXSIZE value minus size of ss_family */
 } __attribute__ ((aligned(_K_SS_ALIGNSIZE)));	/* force desired alignment */
 
-#ifdef __KERNEL__
+#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2)
 
 #include <asm/socket.h>			/* arch-dependent defines	*/
 #include <linux/sockios.h>		/* the SIOCxxx I/O controls	*/
@@ -101,6 +101,21 @@ struct cmsghdr {
 			      ((char *)(cmsg) - (char *)(mhdr)->msg_control)))
 
 /*
+ *	This mess will go away with glibc
+ */
+ 
+#ifdef __KERNEL__
+#define __KINLINE static inline
+#elif  defined(__GNUC__) 
+#define __KINLINE static __inline__
+#elif defined(__cplusplus)
+#define __KINLINE static inline
+#else
+#define __KINLINE static
+#endif
+
+
+/*
  *	Get the next cmsg header
  *
  *	PLEASE, do not touch this function. If you think, that it is
@@ -113,7 +128,7 @@ struct cmsghdr {
  *	ancillary object DATA.				--ANK (980731)
  */
  
-static inline struct cmsghdr * __cmsg_nxthdr(void *__ctl, __kernel_size_t __size,
+__KINLINE struct cmsghdr * __cmsg_nxthdr(void *__ctl, __kernel_size_t __size,
 					       struct cmsghdr *__cmsg)
 {
 	struct cmsghdr * __ptr;
@@ -125,7 +140,7 @@ static inline struct cmsghdr * __cmsg_nxthdr(void *__ctl, __kernel_size_t __size
 	return __ptr;
 }
 
-static inline struct cmsghdr * cmsg_nxthdr (struct msghdr *__msg, struct cmsghdr *__cmsg)
+__KINLINE struct cmsghdr * cmsg_nxthdr (struct msghdr *__msg, struct cmsghdr *__cmsg)
 {
 	return __cmsg_nxthdr(__msg->msg_control, __msg->msg_controllen, __cmsg);
 }
Signature · 1 line
1.6.5.2
maintainer
#1 lore raw

From: Ben Hutchings <[email protected]>
Date: Thu, 12 Nov 2009 02:00:05 +0000

Quoted 6 lines

This reverts commit 9c501935a3cdcf6b1d35aaee3aa11c7a7051a305. That commit caused <linux/rtnetlink.h> to require that <sys/socket.h> is included first, breaking autoconf tests for <linux/rtnetlink.h> and presumably some real programs too.

I'm not reverting this Ben. The dependency those programs and autoconf tests have is _dubious_ at best.

It means they were depending upon the libc5 checks passing, that's rediculious and not something we should cater to.

If you really want it to work that linux/rtnetlink.h is included first before sys/socket.h in userland, fix that specifically instead. But I believe such a dependency is reasonable and the userspace bits need fixing.

#2 lore raw
Quoted 8 lines · David Miller

From: Ben Hutchings <[email protected]>
Date: Thu, 12 Nov 2009 02:00:05 +0000

Quoted 5 lines

This reverts commit 9c501935a3cdcf6b1d35aaee3aa11c7a7051a305. That commit caused <linux/rtnetlink.h> to require that <sys/socket.h> is included first, breaking autoconf tests for <linux/rtnetlink.h> and presumably some real programs too.

Quoted 7 lines
Quoted 1 line

I'm not reverting this Ben. The dependency those programs and autoconf tests have is _dubious_ at best.

It means they were depending upon the libc5 checks passing, that's rediculious and not something we should cater to.

[...]

Sorry, I'm getting my headers mixed up. The problem is with <linux/netlink.h> not <linux/rtnetlink.h>.

<linux/netlink.h> will not compile for userland, because <linux/socket.h> is no longer defining sa_family_t. For userland, this should be defined by <sys/socket.h>.

Ben.

Signature · 3 lines
Ben Hutchings
Lowery's Law:
             If it jams, force it. If it breaks, it needed replacing anyway.
maintainer
#3 lore raw

From: Ben Hutchings <[email protected]>
Date: Thu, 12 Nov 2009 03:05:15 +0000

Quoted 3 lines

<linux/netlink.h> will not compile for userland, because <linux/socket.h> is no longer defining sa_family_t. For userland, this should be defined by <sys/socket.h>.

Still, you still essentially have two choices:

1) Tell userland, sorry you need to include sys/socket.h before other "socket stuff" and that means linux/netlink.h in particular

2) Put a !__KERNEL__ sys/socket.h include in there, but that's asking for trouble.

Ok?

#4 lore raw
Quoted 7 lines · David Miller

From: Ben Hutchings <[email protected]>
Date: Thu, 12 Nov 2009 03:05:15 +0000

Quoted 3 lines

<linux/netlink.h> will not compile for userland, because <linux/socket.h> is no longer defining sa_family_t. For userland, this should be defined by <sys/socket.h>.

Quoted 5 lines

Still, you still essentially have two choices:

1) Tell userland, sorry you need to include sys/socket.h before other "socket stuff" and that means linux/netlink.h in particular

Which is just nasty; headers should include everything they need.

Quoted 2 lines

2) Put a !__KERNEL__ sys/socket.h include in there, but that's asking for trouble.

Indeed.

Including <bits/sockaddr.h> would get us exactly what we need, but that's not meant to be included directly.

Ulrich, can you make any suggestions as to how we can resolve this?

Ben.

Signature · 3 lines
Ben Hutchings
Lowery's Law:
             If it jams, force it. If it breaks, it needed replacing anyway.