summaryrefslogtreecommitdiff
path: root/ghc/lib/misc/cbits/connectSocket.c
diff options
context:
space:
mode:
authorsimonmar <unknown>1999-09-20 10:18:30 +0000
committersimonmar <unknown>1999-09-20 10:18:30 +0000
commitd82f41425562849cb77653bb690d2279e7a85586 (patch)
tree61ecaa1d28356c23c40a54d69430ea9355306250 /ghc/lib/misc/cbits/connectSocket.c
parent6b7c06e0715663168ed35ef00084e07e03cdd28b (diff)
downloadhaskell-d82f41425562849cb77653bb690d2279e7a85586.tar.gz
[project @ 1999-09-20 10:18:29 by simonmar]
- fix bug in setSocketOption__ which meant that trying to set SO_REUSEADDR on Linux (and possibly other OS's) didn't work. - add rudimentary non-blocking connect support.
Diffstat (limited to 'ghc/lib/misc/cbits/connectSocket.c')
-rw-r--r--ghc/lib/misc/cbits/connectSocket.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/ghc/lib/misc/cbits/connectSocket.c b/ghc/lib/misc/cbits/connectSocket.c
index 4874cb3bf8..961b6bbac8 100644
--- a/ghc/lib/misc/cbits/connectSocket.c
+++ b/ghc/lib/misc/cbits/connectSocket.c
@@ -18,7 +18,11 @@ connectSocket(I_ sockfd, A_ servaddr, I_ addrlen, I_ isUnixDomain)
int rc;
while ((rc = connect((int)sockfd, (struct sockaddr *)servaddr, (int)addrlen)) < 0) {
- if (errno != EINTR) {
+ if (errno == EINPROGRESS) {
+ errno = 0;
+ return FILEOBJ_BLOCKED_WRITE;
+
+ } else if (errno != EINTR) {
cvtErrno();
switch (ghc_errno) {
default:
@@ -44,7 +48,6 @@ connectSocket(I_ sockfd, A_ servaddr, I_ addrlen, I_ isUnixDomain)
ghc_errtype = ERR_INVALIDARGUMENT;
ghc_errstr = "Address cannot be used with socket";
break;
- case GHC_EINPROGRESS:
case GHC_EALREADY:
ghc_errtype = ERR_RESOURCEBUSY;
ghc_errstr = "Non-blocking socket, previous connection attempt not completed";
@@ -65,7 +68,6 @@ connectSocket(I_ sockfd, A_ servaddr, I_ addrlen, I_ isUnixDomain)
ghc_errtype = ERR_SYSTEMERROR;
ghc_errstr = "Specified size of structure not equal valid address for family";
break;
- break;
case GHC_ENETUNREACH:
ghc_errtype = ERR_PERMISSIONDENIED;
ghc_errstr = "Network not reachable from host";