+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".
** 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)
+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
#include "libguile/validate.h"
#include "libguile/socket.h"
+#include "libguile/iselect.h"
+
#ifdef __MINGW32__
#include "win32-socket.h"
#endif
"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;