[project @ 1998-12-02 13:17:09 by simonm]
[ghc-hetmet.git] / ghc / lib / misc / cbits / getPeerName.c
index 1166b5c..a083b34 100644 (file)
@@ -10,8 +10,9 @@ Returns name of peer process connected to a socket.
 #endif
 
 #define NON_POSIX_SOURCE
-#include "rtsdefs.h"
+#include "Rts.h"
 #include "ghcSockets.h"
+#include "stgio.h"
 
 StgInt
 getPeerName(I_ sockfd, A_ peer, A_ namelen)
@@ -21,7 +22,31 @@ getPeerName(I_ sockfd, A_ peer, A_ namelen)
     while ((name = getpeername((int) sockfd, (struct sockaddr *) peer, (int *) namelen)) < 0) {
       if (errno != EINTR) {
          cvtErrno();
-         stdErrno();
+         switch (ghc_errno) {
+         default:
+             stdErrno();
+             break;
+         case GHC_EBADF:
+                     ghc_errtype = ERR_INVALIDARGUMENT;
+              ghc_errstr  = "Not a valid write descriptor";
+             break;
+         case GHC_EFAULT:
+                     ghc_errtype = ERR_INVALIDARGUMENT;
+              ghc_errstr  = "Data not in writeable part of user address space";
+             break;
+         case GHC_ENOBUFS:
+             ghc_errtype = ERR_RESOURCEEXHAUSTED;
+             ghc_errstr  = "Insuffcient resources";
+             break;
+         case GHC_ENOTCONN:
+             ghc_errtype = ERR_INVALIDARGUMENT;
+             ghc_errstr  = "Socket not connected";
+             break;
+         case GHC_ENOTSOCK:
+             ghc_errtype = ERR_INVALIDARGUMENT;
+             ghc_errstr  = "Descriptor is not a socket";
+             break;
+         }
          return -1;
       }
     }