summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Wasserman <kevin.wasserman@painless-security.com>2012-04-20 11:36:13 -0400
committerSam Hartman <hartmans@mit.edu>2012-07-11 22:36:07 -0400
commitfc08c21ab33fcc0c8851a2a0fb0e55721ff975ea (patch)
treea4ad8213c3b731cea1ade84be42a3fac0f42a6a6
parent904368745815bfed9cfd5a5c0916488d16a029fe (diff)
downloadkrb5-fc08c21ab33fcc0c8851a2a0fb0e55721ff975ea.tar.gz
krb5-fc08c21ab33fcc0c8851a2a0fb0e55721ff975ea.tar.xz
krb5-fc08c21ab33fcc0c8851a2a0fb0e55721ff975ea.zip
Translate WinSock errors to Posix counterparts
MSVC 2010 defines both Posix and WinSock error values so we can no longer simply #define the Posix error values to be their WinSock counterpart. This patch explicitly #includes <errno.h> in port-sockets.h and still conditionally defines the Posix error values for compatibility with older MSVC but also translates WinSock errors to Posix for MSVC 2010 compatibility. The downside to this approach is that there are some Posix errors we do not currently detect (e.g. EADDRINUSE) that are neither #defined nor translated. If we use one of those in the future but fail to update TranslateWSAGetLastError() we'll once again be in the situation that the windows build will compile but fail to work, possibly only when some rare error condition occurs. Signed-off-by: Kevin Wasserman <kevin.wasserman@painless-security.com> ticket: 7197 (new) tags: pullup
-rw-r--r--src/include/port-sockets.h36
1 files changed, 35 insertions, 1 deletions
diff --git a/src/include/port-sockets.h b/src/include/port-sockets.h
index bb2b5173f..0ccc670e7 100644
--- a/src/include/port-sockets.h
+++ b/src/include/port-sockets.h
@@ -5,6 +5,7 @@
#include <winsock2.h>
#include <ws2tcpip.h>
+#include <errno.h>
/* Some of our own infrastructure where the WinSock stuff was too hairy
to dump into a clean Unix program... */
@@ -22,7 +23,7 @@ typedef WSABUF sg_buf;
#define SOCKET_INITIALIZE() 0
#define SOCKET_CLEANUP()
-#define SOCKET_ERRNO (WSAGetLastError())
+#define SOCKET_ERRNO (TranslatedWSAGetLastError())
#define SOCKET_SET_ERRNO(x) (WSASetLastError (x))
#define SOCKET_NFDS(f) (0) /* select()'s first arg is ignored */
#define SOCKET_READ(fd, b, l) (recv(fd, b, l, 0))
@@ -44,6 +45,10 @@ typedef WSABUF sg_buf;
#define SHUTDOWN_WRITE SD_SEND
#define SHUTDOWN_BOTH SD_BOTH
+/*
+ * Define any missing Posix socket errors
+ * This is for compatibiliy with older versions of msvc (pre-2010)
+ */
#ifndef EINPROGRESS
#define EINPROGRESS WSAEINPROGRESS
#endif
@@ -66,6 +71,35 @@ typedef WSABUF sg_buf;
#define ETIMEDOUT WSAETIMEDOUT
#endif
+/*
+ * Translate WinSock errors to their Posix counterparts.
+ * This is necessary for msvc 2010+, where both WinSock and Posix errors
+ * are defined.
+ */
+static __inline int TranslatedWSAGetLastError()
+{
+ int err = WSAGetLastError();
+ switch (err) {
+ case WSAEINPROGRESS:
+ err = EINPROGRESS; break;
+ case WSAEWOULDBLOCK:
+ err = EWOULDBLOCK; break;
+ case WSAECONNRESET:
+ err = ECONNRESET; break;
+ case WSAECONNABORTED:
+ err = ECONNABORTED; break;
+ case WSAECONNREFUSED:
+ err = ECONNREFUSED; break;
+ case WSAEHOSTUNREACH:
+ err = EHOSTUNREACH; break;
+ case WSAETIMEDOUT:
+ err = ETIMEDOUT; break;
+ default:
+ break;
+ }
+ return err;
+}
+
#elif defined(__palmos__)
/* If this source file requires it, define struct sockaddr_in