summary refs log tree commit diff
path: root/hurd/hurdselect.c
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>2002-04-02 04:43:06 +0000
committerRoland McGrath <roland@gnu.org>2002-04-02 04:43:06 +0000
commitdb6b51ada724d76d2d8a4b80dfbc20235fcdb0e7 (patch)
tree9e2e39ac4a7cce6940f61c195ccdd26dc4895ae0 /hurd/hurdselect.c
parent96c4df505528ff3a5ca8f9377481bc928be547de (diff)
downloadglibc-db6b51ada724d76d2d8a4b80dfbc20235fcdb0e7.tar.gz
glibc-db6b51ada724d76d2d8a4b80dfbc20235fcdb0e7.tar.xz
glibc-db6b51ada724d76d2d8a4b80dfbc20235fcdb0e7.zip
* hurd/hurdselect.c (_hurd_select): Fix
	MACH_MSG_TYPE_INTEGER_T -> integer_t in sizeof.
	Use a union rather than casts to compare mach_msg_type_t as int.

2002-03-25  Roland McGrath  <roland@frob.com>

	* hurd/hurdchdir.c (_hurd_change_directory_port_from_name): Don't
	check off the end of NAME when it's shorter than 2 chars.
	Reported by Ognyan Kulev <ogi@fmi.uni-sofia.bg>.

2002-03-17  Roland McGrath  <roland@frob.com>

	* sysdeps/mach/hurd/i386/sys/io.h: New file.
	* sysdeps/mach/hurd/i386/ioperm.c: New file.
	* sysdeps/mach/hurd/i386/Dist: Add them.
	* sysdeps/mach/hurd/i386/Versions
	(libc: GLIBC_2.2.6): New set, add ioperm.
	* sysdeps/mach/configure.in: New check to set HAVE_I386_IO_PERM_MODIFY.
	(mach_interface_list): Check for mach_i386.defs.
	* config.h.in (HAVE_I386_IO_PERM_MODIFY): #undef it.
	* sysdeps/mach/configure: Regenerated.
Diffstat (limited to 'hurd/hurdselect.c')
-rw-r--r--hurd/hurdselect.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/hurd/hurdselect.c b/hurd/hurdselect.c
index 68dc746925..544eee9cb5 100644
--- a/hurd/hurdselect.c
+++ b/hurd/hurdselect.c
@@ -64,6 +64,14 @@ _hurd_select (int nfds,
     } d[nfds];
   sigset_t oset;
 
+  union typeword		/* Use this to avoid unkosher casts.  */
+    {
+      mach_msg_type_t type;
+      uint32_t word;
+    };
+  assert (sizeof (union typeword) == sizeof (mach_msg_type_t));
+  assert (sizeof (uint32_t) == sizeof (mach_msg_type_t));
+
   if (sigmask && __sigprocmask (SIG_SETMASK, sigmask, &oset))
     return -1;
 
@@ -298,15 +306,15 @@ _hurd_select (int nfds,
 	  struct
 	    {
 	      mach_msg_header_t head;
-	      mach_msg_type_t err_type;
+	      union typeword err_type;
 	      error_t err;
 	    } error;
 	  struct
 	    {
 	      mach_msg_header_t head;
-	      mach_msg_type_t err_type;
+	      union typeword err_type;
 	      error_t err;
-	      mach_msg_type_t result_type;
+	      union typeword result_type;
 	      int result;
 	    } success;
 #endif
@@ -321,15 +329,16 @@ _hurd_select (int nfds,
 	  /* We got a message.  Decode it.  */
 #define IO_SELECT_REPLY_MSGID (21012 + 100) /* XXX */
 #ifdef MACH_MSG_TYPE_BIT
-	  const mach_msg_type_t inttype =
-	    { MACH_MSG_TYPE_INTEGER_T, sizeof (MACH_MSG_TYPE_INTEGER_T) * 8,
-	      1, 1, 0, 0 };
+	  const union typeword inttype =
+	  { type:
+	    { MACH_MSG_TYPE_INTEGER_T, sizeof (integer_t) * 8, 1, 1, 0, 0 }
+	  };
 #endif
-	  if (msg.head.msgh_id == IO_SELECT_REPLY_MSGID
-	      && msg.head.msgh_size >= sizeof msg.error
-	      && !(msg.head.msgh_bits & MACH_MSGH_BITS_COMPLEX)
+	  if (msg.head.msgh_id == IO_SELECT_REPLY_MSGID &&
+	      msg.head.msgh_size >= sizeof msg.error &&
+	      !(msg.head.msgh_bits & MACH_MSGH_BITS_COMPLEX) &&
 #ifdef MACH_MSG_TYPE_BIT
-	      && *(int *) &msg.error.err_type == *(int *) &inttype
+	      msg.error.err_type.word == inttype.word
 #endif
 	      )
 	    {
@@ -346,7 +355,7 @@ _hurd_select (int nfds,
 	      if (msg.error.err ||
 		  msg.head.msgh_size != sizeof msg.success ||
 #ifdef MACH_MSG_TYPE_BIT
-		  *(int *) &msg.success.result_type != *(int *) &inttype ||
+		  msg.success.result_type.word != inttype.word ||
 #endif
 		  (msg.success.result & SELECT_ALL) == 0)
 		{