[project @ 1996-06-27 16:13:29 by partain]
[ghc-hetmet.git] / ghc / runtime / io / acceptSocket.lc
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1996
3 %
4 \subsection[acceptSocket.lc]{Server wait for client to connect}
5
6 \begin{code}
7
8 #include "rtsdefs.h"
9 #include "stgio.h"
10
11 #ifdef HAVE_SYS_TYPES_H
12 #include <sys/types.h>
13 #endif
14
15 #ifdef HAVE_SYS_SOCKET_H
16 #include <sys/socket.h>
17 #endif
18
19 StgInt
20 acceptSocket(I_ sockfd, A_ peer, A_ addrlen)
21 {
22     StgInt fd;
23     
24     while ((fd = accept((int)sockfd, (struct sockaddr *)peer, (int *)addrlen)) < 0) {
25       if (errno != EINTR) {
26           cvtErrno();
27           switch (ghc_errno) {
28           default:
29               stdErrno();
30               break;
31           case GHC_EBADF:
32               ghc_errtype = ERR_INVALIDARGUMENT;
33               ghc_errstr  = "Not a valid descriptor";
34               break;
35           case GHC_EFAULT:
36               ghc_errtype = ERR_INVALIDARGUMENT;
37               ghc_errstr  = "Address not in writeable part of user address space";
38               break;
39           case GHC_ENOTSOCK:
40               ghc_errtype = ERR_INVALIDARGUMENT;
41               ghc_errstr  = "Descriptor not a socket";
42               break;
43           case GHC_EOPNOTSUPP:
44               ghc_errtype = ERR_INVALIDARGUMENT;
45               ghc_errstr  = "Socket not of type that supports listen";
46               break;
47           case GHC_EWOULDBLOCK:
48               ghc_errtype = ERR_OTHERERROR;
49               ghc_errstr  = "No sockets are present to be accepted";
50               break;
51           }
52           return -1;
53       }
54     }
55     return fd;
56 }
57
58 \end{code}