1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-04-30 20:00:19 +02:00

Changes from arch/CVS synchronization

This commit is contained in:
Ludovic Courtès 2007-12-04 17:38:59 +00:00
parent 8e0ea2987d
commit a23c67bcef
4 changed files with 28 additions and 1 deletions

View file

@ -1,3 +1,7 @@
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.

1
NEWS
View file

@ -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)

View 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-19 Neil Jerram <neil@ossau.uklinux.net>
* eval.c (unmemoize_delay): Extend the environment before

View 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;