diff options
author | simonmar <unknown> | 1999-09-20 10:18:30 +0000 |
---|---|---|
committer | simonmar <unknown> | 1999-09-20 10:18:30 +0000 |
commit | d82f41425562849cb77653bb690d2279e7a85586 (patch) | |
tree | 61ecaa1d28356c23c40a54d69430ea9355306250 /ghc/lib/misc/cbits/connectSocket.c | |
parent | 6b7c06e0715663168ed35ef00084e07e03cdd28b (diff) | |
download | haskell-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.c | 8 |
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"; |