This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Patches to improve Hurd parts: include/sys/socket.h


We need two helper functions and should do some compile-time consistency
checks.

2008-12-17  Thomas Schwinge  <tschwinge@gnu.org>

	* include/sys/socket.h: Include <fcntl.h>.
	(COMPILE_TIME_ASSERT): New definition.  Use it for doing some
	consistency checks.
	(sock_to_o_flags, o_to_sock_flags): New always-inline functions.

diff --git a/include/sys/socket.h b/include/sys/socket.h
index df89278..7d783ca 100644
--- a/include/sys/socket.h
+++ b/include/sys/socket.h
@@ -160,5 +160,49 @@ extern int __have_sock_cloexec;
    unless it is really necessary.  */
 # define __have_paccept __have_sock_cloexec
 #endif
+
+#include <fcntl.h>
+
+/* Unless the condition is true, a compile-time error will be emitted.  */
+#define COMPILE_TIME_ASSERT(condition) \
+  extern int compile_time_assert[!!(condition) - 1]
+
+/* Do some compile-time checks for the SOCK_* constants, which we rely on.  */
+COMPILE_TIME_ASSERT (SOCK_CLOEXEC == O_CLOEXEC);
+#if defined (SOCK_MAX) && defined (SOCK_TYPE_MASK)
+COMPILE_TIME_ASSERT ((SOCK_MAX | SOCK_TYPE_MASK) == SOCK_TYPE_MASK);
+COMPILE_TIME_ASSERT ((SOCK_CLOEXEC & SOCK_TYPE_MASK) == 0);
+COMPILE_TIME_ASSERT ((SOCK_NONBLOCK & SOCK_TYPE_MASK) == 0);
+#endif
+
+#undef COMPILE_TIME_ASSERT
+
+__extern_always_inline
+int
+sock_to_o_flags (int in)
+{
+  int out = 0;
+
+  if (in & SOCK_NONBLOCK)
+    out |= O_NONBLOCK;
+  /* Others are passed through unfiltered.  */
+  out |= in & ~(SOCK_NONBLOCK);
+
+  return out;
+}
+
+__extern_always_inline
+int
+o_to_sock_flags (int in)
+{
+  int out = 0;
+
+  if (in & O_NONBLOCK)
+    out |= SOCK_NONBLOCK;
+  /* Others are passed through unfiltered.  */
+  out |= in & ~(O_NONBLOCK);
+
+  return out;
+}
 
 #endif

Some questions remain.  Note that all this is not Hurd-specific.

Are we allowed to include <fcntl.h> from include/sys/socket.h?

Where to put the COMPILE_TIME_ASSERT definition?  For sure into some
other file, but into which one?

Where to put these COMPILE_TIME_ASSERTs?  And where to put
sock_to_o_flags and o_to_sock_flags?

Attachment: signature.asc
Description: Digital signature


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]