THRIFT-1031 Patch to compile Thrift for vc++ 9.0 and 10.0
Patch: James Dickson and Alexandre Parenteau

git-svn-id: https://svn.apache.org/repos/asf/thrift/trunk@1171777 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lib/cpp/src/transport/TServerSocket.cpp b/lib/cpp/src/transport/TServerSocket.cpp
index efe08fe..dfa55b4 100644
--- a/lib/cpp/src/transport/TServerSocket.cpp
+++ b/lib/cpp/src/transport/TServerSocket.cpp
@@ -52,6 +52,24 @@
 #define AF_LOCAL AF_UNIX
 #endif
 
+#ifndef SOCKOPT_CAST_T
+#   ifndef _WIN32
+#       define SOCKOPT_CAST_T void
+#   else
+#       define SOCKOPT_CAST_T char
+#   endif // _WIN32
+#endif
+
+template<class T>
+inline const SOCKOPT_CAST_T* const_cast_sockopt(const T* v) {
+    return reinterpret_cast<const SOCKOPT_CAST_T*>(v);
+}
+
+template<class T>
+inline SOCKOPT_CAST_T* cast_sockopt(T* v) {
+    return reinterpret_cast<SOCKOPT_CAST_T*>(v);
+}
+
 namespace apache { namespace thrift { namespace transport {
 
 using namespace std;
@@ -182,7 +200,7 @@
   // Set reusaddress to prevent 2MSL delay on accept
   int one = 1;
   if (-1 == setsockopt(serverSocket_, SOL_SOCKET, SO_REUSEADDR,
-                       &one, sizeof(one))) {
+                       cast_sockopt(&one), sizeof(one))) {
     int errno_copy = errno;
     GlobalOutput.perror("TServerSocket::listen() setsockopt() SO_REUSEADDR ", errno_copy);
     close();
@@ -192,7 +210,7 @@
   // Set TCP buffer sizes
   if (tcpSendBuffer_ > 0) {
     if (-1 == setsockopt(serverSocket_, SOL_SOCKET, SO_SNDBUF,
-                         &tcpSendBuffer_, sizeof(tcpSendBuffer_))) {
+                         cast_sockopt(&tcpSendBuffer_), sizeof(tcpSendBuffer_))) {
       int errno_copy = errno;
       GlobalOutput.perror("TServerSocket::listen() setsockopt() SO_SNDBUF ", errno_copy);
       close();
@@ -202,7 +220,7 @@
 
   if (tcpRecvBuffer_ > 0) {
     if (-1 == setsockopt(serverSocket_, SOL_SOCKET, SO_RCVBUF,
-                         &tcpRecvBuffer_, sizeof(tcpRecvBuffer_))) {
+                         cast_sockopt(&tcpRecvBuffer_), sizeof(tcpRecvBuffer_))) {
       int errno_copy = errno;
       GlobalOutput.perror("TServerSocket::listen() setsockopt() SO_RCVBUF ", errno_copy);
       close();
@@ -225,7 +243,7 @@
   if (res->ai_family == AF_INET6 && path_.empty()) {
     int zero = 0;
     if (-1 == setsockopt(serverSocket_, IPPROTO_IPV6, IPV6_V6ONLY, 
-          &zero, sizeof(zero))) {
+          cast_sockopt(&zero), sizeof(zero))) {
       GlobalOutput.perror("TServerSocket::listen() IPV6_V6ONLY ", errno);
     }
   }
@@ -234,7 +252,7 @@
   // Turn linger off, don't want to block on calls to close
   struct linger ling = {0, 0};
   if (-1 == setsockopt(serverSocket_, SOL_SOCKET, SO_LINGER,
-                       &ling, sizeof(ling))) {
+                       cast_sockopt(&ling), sizeof(ling))) {
     int errno_copy = errno;
     GlobalOutput.perror("TServerSocket::listen() setsockopt() SO_LINGER ", errno_copy);
     close();
@@ -245,7 +263,7 @@
   if (path_.empty()) {
     // TCP Nodelay, speed over bandwidth
     if (-1 == setsockopt(serverSocket_, IPPROTO_TCP, TCP_NODELAY,
-                         &one, sizeof(one))) {
+                         cast_sockopt(&one), sizeof(one))) {
       int errno_copy = errno;
       GlobalOutput.perror("TServerSocket::listen() setsockopt() TCP_NODELAY ", errno_copy);
       close();
@@ -273,6 +291,9 @@
   int retries = 0;
 
   if (! path_.empty()) {
+
+#ifndef _WIN32
+
     // Unix Domain Socket
     struct sockaddr_un address;
     socklen_t len;
@@ -303,6 +324,12 @@
 
     // free addrinfo
     freeaddrinfo(res0);
+
+#else
+      GlobalOutput.perror("TSocket::open() Unix Domain socket path not supported on windows", -99);
+      throw TTransportException(TTransportException::NOT_OPEN, " Unix Domain socket path not supported");
+#endif
+
   }
 
   // throw an error if we failed to bind properly
@@ -368,7 +395,7 @@
       // Check for an interrupt signal
       if (intSock2_ >= 0 && (fds[1].revents & POLLIN)) {
         int8_t buf;
-        if (-1 == recv(intSock2_, &buf, sizeof(int8_t), 0)) {
+        if (-1 == recv(intSock2_, cast_sockopt(&buf), sizeof(int8_t), 0)) {
           GlobalOutput.perror("TServerSocket::acceptImpl() recv() interrupt ", errno);
         }
         throw TTransportException(TTransportException::INTERRUPTED);
@@ -429,7 +456,7 @@
 void TServerSocket::interrupt() {
   if (intSock1_ >= 0) {
     int8_t byte = 0;
-    if (-1 == send(intSock1_, &byte, sizeof(int8_t), 0)) {
+    if (-1 == send(intSock1_, cast_sockopt(&byte), sizeof(int8_t), 0)) {
       GlobalOutput.perror("TServerSocket::interrupt() send() ", errno);
     }
   }
@@ -437,11 +464,18 @@
 
 void TServerSocket::close() {
   if (serverSocket_ >= 0) {
-    shutdown(serverSocket_, SHUT_RDWR);
-    ::close(serverSocket_);
+
+#ifdef _WIN32
+      shutdown(serverSocket_, SD_BOTH);
+      ::closesocket(serverSocket_);
+#else
+      shutdown(serverSocket_, SHUT_RDWR);
+      ::close(serverSocket_);
+#endif
+
   }
   if (intSock1_ >= 0) {
-    ::close(intSock1_);
+      ::close(intSock1_);
   }
   if (intSock2_ >= 0) {
     ::close(intSock2_);