Fix boolean_t/B_FALSE/B_TRUE compilation issue
[kopensolaris-gnu/glibc.git] / hurd / hurdselect.c
index e65def5..544eee9 100644 (file)
@@ -1,21 +1,22 @@
 /* Guts of both `select' and `poll' for Hurd.
-   Copyright (C) 1991,92,93,94,95,96,97,98 Free Software Foundation, Inc.
+   Copyright (C) 1991,92,93,94,95,96,97,98,99,2001
+       Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Library General Public License as
-   published by the Free Software Foundation; either version 2 of the
-   License, or (at your option) any later version.
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
 
    The GNU C Library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Library General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU Library General Public
-   License along with the GNU C Library; see the file COPYING.LIB.  If not,
-   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
 
 #include <sys/types.h>
 #include <sys/poll.h>
@@ -63,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;
 
@@ -172,8 +181,9 @@ _hurd_select (int nfds,
                {
                  /* If one descriptor is bogus, we fail completely.  */
                  while (i-- > 0)
-                   _hurd_port_free (&d[i].cell->port, &d[i].ulink,
-                                    d[i].io_port);
+                   if (d[i].type != 0)
+                     _hurd_port_free (&d[i].cell->port, &d[i].ulink,
+                                      d[i].io_port);
                  break;
                }
              lastfd = i;
@@ -277,20 +287,37 @@ _hurd_select (int nfds,
       union
        {
          mach_msg_header_t head;
+#ifdef MACH_MSG_TRAILER_MINIMUM_SIZE
+         struct
+           {
+             mach_msg_header_t head;
+             NDR_record_t ndr;
+             error_t err;
+           } error;
+         struct
+           {
+             mach_msg_header_t head;
+             NDR_record_t ndr;
+             error_t err;
+             int result;
+             mach_msg_trailer_t trailer;
+           } success;
+#else
          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
        } msg;
       mach_msg_option_t options = (timeout == NULL ? 0 : MACH_RCV_TIMEOUT);
       error_t msgerr;
@@ -301,13 +328,19 @@ _hurd_select (int nfds,
        {
          /* We got a message.  Decode it.  */
 #define IO_SELECT_REPLY_MSGID (21012 + 100) /* XXX */
-         const mach_msg_type_t inttype =
-           { MACH_MSG_TYPE_INTEGER_T, sizeof (MACH_MSG_TYPE_INTEGER_T) * 8,
-             1, 1, 0, 0 };
+#ifdef MACH_MSG_TYPE_BIT
+         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) &&
-             *(int *) &msg.error.err_type == *(int *) &inttype)
+#ifdef MACH_MSG_TYPE_BIT
+             msg.error.err_type.word == inttype.word
+#endif
+             )
            {
              /* This is a properly formatted message so far.
                 See if it is a success or a failure.  */
@@ -321,7 +354,9 @@ _hurd_select (int nfds,
                }
              if (msg.error.err ||
                  msg.head.msgh_size != sizeof msg.success ||
-                 *(int *) &msg.success.result_type != *(int *) &inttype ||
+#ifdef MACH_MSG_TYPE_BIT
+                 msg.success.result_type.word != inttype.word ||
+#endif
                  (msg.success.result & SELECT_ALL) == 0)
                {
                  /* Error or bogus reply.  Simulate readiness.  */
@@ -394,15 +429,18 @@ _hurd_select (int nfds,
     /* Fill in the `revents' members of the user's array.  */
     for (i = 0; i < nfds; ++i)
       {
-       const int type = d[i].type;
+       int type = d[i].type;
        int_fast16_t revents = 0;
 
-       if (type & SELECT_READ)
-         revents |= POLLIN;
-       if (type & SELECT_WRITE)
-         revents |= POLLOUT;
-       if (type & SELECT_URG)
-         revents |= POLLPRI;
+       if (type & SELECT_RETURNED)
+         {
+           if (type & SELECT_READ)
+             revents |= POLLIN;
+           if (type & SELECT_WRITE)
+             revents |= POLLOUT;
+           if (type & SELECT_URG)
+             revents |= POLLPRI;
+         }
 
        pollfds[i].revents = revents;
       }