[project @ 1998-02-02 17:27:26 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 "rtsdefs.h"
14 #include "ghcSockets.h"
15
16 StgInt
17 getPeerName(I_ sockfd, A_ peer, A_ namelen)
18 {
19     StgInt name;
20     
21     while ((name = getpeername((int) sockfd, (struct sockaddr *) peer, (int *) namelen)) < 0) {
22       if (errno != EINTR) {
23           cvtErrno();
24           switch (ghc_errno) {
25           default:
26               stdErrno();
27               break;
28           case GHC_EBADF:
29               ghc_errtype = ERR_INVALIDARGUMENT;
30               ghc_errstr  = "Not a valid write descriptor";
31               break;
32           case GHC_EFAULT:
33               ghc_errtype = ERR_INVALIDARGUMENT;
34               ghc_errstr  = "Data not in writeable part of user address space";
35               break;
36           case GHC_ENOBUFS:
37               ghc_errtype = ERR_RESOURCEEXHAUSTED;
38               ghc_errstr  = "Insuffcient resources";
39               break;
40           case GHC_ENOTCONN:
41               ghc_errtype = ERR_INVALIDARGUMENT;
42               ghc_errstr  = "Socket not connected";
43               break;
44           case GHC_ENOTSOCK:
45               ghc_errtype = ERR_INVALIDARGUMENT;
46               ghc_errstr  = "Descriptor is not a socket";
47               break;
48           }
49           return -1;
50       }
51     }
52     return name;
53 }