Changes from arch/CVS synchronization
authorLudovic Courtès <ludo@gnu.org>
Tue, 4 Dec 2007 17:32:59 +0000 (17:32 +0000)
committerLudovic Courtès <ludo@gnu.org>
Tue, 4 Dec 2007 17:32:59 +0000 (17:32 +0000)
ChangeLog
NEWS
libguile/ChangeLog
libguile/socket.c

index 2bc7288..a68a368 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2007-12-04  Ludovic Courtès  <ludo@gnu.org>
+
+       * NEWS: Mention `accept' bug fix.
+
+2007-12-03  Ludovic Courtès  <ludo@gnu.org>
+
+       * NEWS: Add SRFI-69.
+
 2007-10-24  Neil Jerram  <neil@ossau.uklinux.net>
 
        * .cvsignore: Add "lib".
diff --git a/NEWS b/NEWS
index 6e8fe09..341fefe 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -43,6 +43,11 @@ Changes in 1.8.4 (since 1.8.3)
 ** CR (ASCII 0x0d) is (again) recognized as a token delimiter by the reader
 ** Fixed a segmentation fault which occurred when displaying the
 backtrace of a stack with a promise object (made by `delay') in it.
+** Make `accept' leave guile mode while blocking
+
+* New modules (see the manual for details)
+
+** `(srfi srfi-69)'
 
 \f
 Changes in 1.8.3 (since 1.8.2)
index d59bc98..7a68d54 100644 (file)
@@ -1,3 +1,9 @@
+2007-12-04  Ludovic Courtès  <ludo@gnu.org>
+
+       * socket.c (scm_accept): Leave guile mode using
+       `scm_std_select ()' before calling `accept(2)'.  Reported by
+       dskr <dskr@mac.com>.
+
 2007-10-27  Ludovic Courtès  <ludo@gnu.org>
 
        * fports.c (scm_i_evict_port): Expect a port, rather than a pair
index 1e839e0..bfac452 100644 (file)
@@ -36,6 +36,8 @@
 #include "libguile/validate.h"
 #include "libguile/socket.h"
 
+#include "libguile/iselect.h"
+
 #ifdef __MINGW32__
 #include "win32-socket.h"
 #endif
@@ -1321,16 +1323,30 @@ SCM_DEFINE (scm_accept, "accept", 1, 0, 0,
            "connection and will continue to accept new requests.")
 #define FUNC_NAME s_scm_accept
 {
-  int fd;
+  int fd, selected;
   int newfd;
   SCM address;
   SCM newsock;
+  SELECT_TYPE readfds, exceptfds;
   socklen_t addr_size = MAX_ADDR_SIZE;
   scm_t_max_sockaddr addr;
 
   sock = SCM_COERCE_OUTPORT (sock);
   SCM_VALIDATE_OPFPORT (1, sock);
   fd = SCM_FPORT_FDES (sock);
+
+  FD_ZERO (&readfds);
+  FD_ZERO (&exceptfds);
+  FD_SET (fd, &readfds);
+  FD_SET (fd, &exceptfds);
+
+  /* Block until something happens on FD, leaving guile mode while
+     waiting.  */
+  selected = scm_std_select (fd + 1, &readfds, NULL, &exceptfds,
+                            NULL);
+  if (selected < 0)
+    SCM_SYSERROR;
+
   newfd = accept (fd, (struct sockaddr *) &addr, &addr_size);
   if (newfd == -1)
     SCM_SYSERROR;