Replace $letrec with $rec
[bpt/guile.git] / libguile / poll.c
index e4d430c..9ea846b 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2010 Free Software Foundation, Inc.
+/* Copyright (C) 2010, 2013 Free Software Foundation, Inc.
  * 
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public License
@@ -25,6 +25,8 @@
 #  include <config.h>
 #endif
 
+#include <poll.h>
+
 #include "libguile/_scm.h"
 #include "libguile/bytevectors.h"
 #include "libguile/numbers.h"
 #include "libguile/poll.h"
 
 \f
-#ifdef HAVE_POLL_H
-#include <poll.h>
-#endif
-
-\f
 
 /* {Poll}
  */
@@ -73,7 +70,6 @@
    If timeout is given and is non-negative, the poll will return after that
    number of milliseconds if no fd became active.
    */
-#ifdef HAVE_POLL
 static SCM
 scm_primitive_poll (SCM pollfds, SCM nfds, SCM ports, SCM timeout)
 #define FUNC_NAME "primitive-poll"
@@ -151,20 +147,29 @@ scm_primitive_poll (SCM pollfds, SCM nfds, SCM ports, SCM timeout)
                 if (pt->read_pos < pt->read_end)
                   /* Buffered input waiting to be read. */
                   revents |= POLLIN;
-                if (pt->write_pos < pt->write_end)
+                if (SCM_OUTPUT_PORT_P (port) && pt->write_pos < pt->write_end)
                   /* Buffered output possible. */
                   revents |= POLLOUT;
               }
           }
 
-        if ((fds[i].revents = revents & fds[i].events))
-          rv++;
+        /* Mask in the events we are interested, and test if any are
+           interesting. */
+        if ((revents &= fds[i].events))
+          {
+            /* Could be the underlying fd is also ready for reading.  */
+            if (!fds[i].revents)
+              rv++;
+
+            /* In any case, add these events to whatever the syscall
+               set. */
+            fds[i].revents |= revents;
+          }
       }
 
   return scm_from_int (rv);
 }
 #undef FUNC_NAME
-#endif /* HAVE_POLL */
 
 
 \f
@@ -172,11 +177,8 @@ scm_primitive_poll (SCM pollfds, SCM nfds, SCM ports, SCM timeout)
 static void
 scm_init_poll (void)
 {
-#if HAVE_POLL
   scm_c_define_gsubr ("primitive-poll", 4, 0, 0, scm_primitive_poll);
-#else
-  scm_misc_error ("%init-poll", "`poll' unavailable on this platform", SCM_EOL);
-#endif
+  scm_c_define ("%sizeof-struct-pollfd", scm_from_size_t (sizeof (struct pollfd)));
 
 #ifdef POLLIN
   scm_c_define ("POLLIN", scm_from_int (POLLIN));