[project @ 1996-06-27 16:13:29 by partain]
[ghc-hetmet.git] / ghc / runtime / io / getPeerName.lc
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1996
3 %
4 \subsection[getPeerName.lc]{Return name of peer process}
5
6 Returns name of peer process connected to a socket.
7
8 \begin{code}
9
10 #include "rtsdefs.h"
11 #include "stgio.h"
12
13 #ifdef HAVE_SYS_TYPES_H
14 #include <sys/types.h>
15 #endif
16
17 #ifdef HAVE_SYS_SOCKET_H
18 #include <sys/socket.h>
19 #endif
20
21 StgInt
22 getPeerName(int sockfd, struct sockaddr *peer, int *namelen)
23 {
24     StgInt name;
25     
26     while ((name = getpeername(sockfd, peer, namelen)) < 0) {
27       if (errno != EINTR) {
28           cvtErrno();
29           switch (ghc_errno) {
30           default:
31               stdErrno();
32               break;
33           case GHC_EBADF:
34               ghc_errtype = ERR_INVALIDARGUMENT;
35               ghc_errstr  = "Not a valid write descriptor";
36               break;
37           case GHC_EFAULT:
38               ghc_errtype = ERR_INVALIDARGUMENT;
39               ghc_errstr  = "Data not in writeable part of user address space";
40               break;
41           case GHC_ENOBUFS:
42               ghc_errtype = ERR_RESOURCEEXHAUSTED;
43               ghc_errstr  = "Insuffcient resources";
44               break;
45           case GHC_ENOTCONN:
46               ghc_errtype = ERR_INVALIDARGUMENT;
47               ghc_errstr  = "Socket not connected";
48               break;
49           case GHC_ENOTSOCK:
50               ghc_errtype = ERR_INVALIDARGUMENT;
51               ghc_errstr  = "Descriptor is not a socket";
52               break;
53           }
54           return -1;
55       }
56     }
57     return name;
58 }
59
60 \end{code}