summaryrefslogtreecommitdiff
path: root/libguile/socket.c
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2008-09-10 23:09:30 +0200
committerLudovic Courtès <ludo@gnu.org>2008-09-10 23:09:30 +0200
commit6f03035fe80d1c25ffadc42ec59c473402f65f60 (patch)
treea552a077bafe408ced8737674aecdf3007f31679 /libguile/socket.c
parent328efeb9a66dddcf78a24fad96d3db58e9c3375d (diff)
parentc5cd474d8c37bf32d7236e63d754a0eee9eb9071 (diff)
downloadguile-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.c18
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;