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