From a23c67bcef98559be41f146820cedf132d71455d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Tue, 4 Dec 2007 17:38:59 +0000 Subject: [PATCH] Changes from arch/CVS synchronization --- ChangeLog | 4 ++++ NEWS | 1 + libguile/ChangeLog | 6 ++++++ libguile/socket.c | 18 +++++++++++++++++- 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index c5147bbfa..fa1dfa70d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2007-12-04 Ludovic Courtès + + * NEWS: Mention `accept' bug fix. + 2007-12-03 Ludovic Courtès * NEWS: Add SRFI-69. diff --git a/NEWS b/NEWS index a682b1a47..c163d0ba1 100644 --- a/NEWS +++ b/NEWS @@ -12,6 +12,7 @@ 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) diff --git a/libguile/ChangeLog b/libguile/ChangeLog index a45e2b121..2c9b1878c 100644 --- a/libguile/ChangeLog +++ b/libguile/ChangeLog @@ -1,3 +1,9 @@ +2007-12-04 Ludovic Courtès + + * socket.c (scm_accept): Leave guile mode using + `scm_std_select ()' before calling `accept(2)'. Reported by + dskr . + 2007-10-19 Neil Jerram * eval.c (unmemoize_delay): Extend the environment before diff --git a/libguile/socket.c b/libguile/socket.c index 1e839e0d1..bfac45207 100644 --- a/libguile/socket.c +++ b/libguile/socket.c @@ -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;