diff options
author | Ludovic Courtès <ludo@gnu.org> | 2008-09-10 23:09:30 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2008-09-10 23:09:30 +0200 |
commit | 6f03035fe80d1c25ffadc42ec59c473402f65f60 (patch) | |
tree | a552a077bafe408ced8737674aecdf3007f31679 /libguile/socket.c | |
parent | 328efeb9a66dddcf78a24fad96d3db58e9c3375d (diff) | |
parent | c5cd474d8c37bf32d7236e63d754a0eee9eb9071 (diff) | |
download | guile-6f03035fe80d1c25ffadc42ec59c473402f65f60.tar.gz |
Merge branch 'master' into boehm-demers-weiser-gc
Conflicts:
libguile/Makefile.am
libguile/coop-defs.h
libguile/gc-card.c
libguile/gc-freelist.c
libguile/gc-malloc.c
libguile/gc-mark.c
libguile/gc-segment.c
libguile/gc.c
libguile/gc.h
libguile/gc_os_dep.c
libguile/hashtab.c
libguile/hashtab.h
libguile/inline.h
libguile/private-gc.h
libguile/struct.c
libguile/struct.h
libguile/threads.c
libguile/threads.h
libguile/vectors.h
libguile/weaks.h
test-suite/tests/gc.test
Diffstat (limited to 'libguile/socket.c')
-rw-r--r-- | libguile/socket.c | 18 |
1 files changed, 17 insertions, 1 deletions
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; |