First pass through fixing SASL.
[m6w6/libmemcached] / libmemcached / connect.cc
index 65be51a07f9a2c509f7dba7bc6c11043e358bc1a..7efdd8fe6d52f3a5b89e9ddaaf94e91d4064a557 100644 (file)
 #include <libmemcached/common.h>
 
 #include <cassert>
-#include <ctime>
-#include <sys/time.h>
 
 #ifndef SOCK_CLOEXEC 
 #  define SOCK_CLOEXEC 0
 #endif
 
 #ifndef SOCK_NONBLOCK 
-#  define SOCK_NONBLOCK 0
+# define SOCK_NONBLOCK 0
 #endif
 
 #ifndef FD_CLOEXEC
@@ -95,7 +93,7 @@ static memcached_return_t connect_poll(org::libmemcached::Instance* server)
           {
             int err;
             socklen_t len= sizeof(err);
-            if (getsockopt(server->fd, SOL_SOCKET, SO_ERROR, &err, &len) == 0)
+            if (getsockopt(server->fd, SOL_SOCKET, SO_ERROR, (char*)&err, &len) == 0)
             {
               if (err == 0)
               {
@@ -126,7 +124,7 @@ static memcached_return_t connect_poll(org::libmemcached::Instance* server)
     {
       int err;
       socklen_t len= sizeof (err);
-      if (getsockopt(fds[0].fd, SOL_SOCKET, SO_ERROR, &err, &len) == 0)
+      if (getsockopt(fds[0].fd, SOL_SOCKET, SO_ERROR, (char*)&err, &len) == 0)
       {
         // We check the value to see what happened wth the socket.
         if (err == 0)
@@ -300,7 +298,7 @@ static void set_socket_options(org::libmemcached::Instance* server)
     waittime.tv_usec= server->root->snd_timeout % 1000000;
 
     int error= setsockopt(server->fd, SOL_SOCKET, SO_SNDTIMEO,
-                          &waittime, (socklen_t)sizeof(struct timeval));
+                          (char*)&waittime, (socklen_t)sizeof(struct timeval));
     (void)error;
     assert(error == 0);
   }
@@ -315,7 +313,7 @@ static void set_socket_options(org::libmemcached::Instance* server)
     waittime.tv_usec= server->root->rcv_timeout % 1000000;
 
     int error= setsockopt(server->fd, SOL_SOCKET, SO_RCVTIMEO,
-                          &waittime, (socklen_t)sizeof(struct timeval));
+                          (char*)&waittime, (socklen_t)sizeof(struct timeval));
     (void)(error);
     assert(error == 0);
   }
@@ -346,7 +344,7 @@ static void set_socket_options(org::libmemcached::Instance* server)
     linger.l_onoff= 1;
     linger.l_linger= 0; /* By default on close() just drop the socket */
     int error= setsockopt(server->fd, SOL_SOCKET, SO_LINGER,
-                          &linger, (socklen_t)sizeof(struct linger));
+                          (char*)&linger, (socklen_t)sizeof(struct linger));
     (void)(error);
     assert(error == 0);
   }
@@ -356,7 +354,7 @@ static void set_socket_options(org::libmemcached::Instance* server)
     int flag= 1;
 
     int error= setsockopt(server->fd, IPPROTO_TCP, TCP_NODELAY,
-                          &flag, (socklen_t)sizeof(int));
+                          (char*)&flag, (socklen_t)sizeof(int));
     (void)(error);
     assert(error == 0);
   }
@@ -366,7 +364,7 @@ static void set_socket_options(org::libmemcached::Instance* server)
     int flag= 1;
 
     int error= setsockopt(server->fd, SOL_SOCKET, SO_KEEPALIVE,
-                      &flag, (socklen_t)sizeof(int));
+                          (char*)&flag, (socklen_t)sizeof(int));
     (void)(error);
     assert(error == 0);
   }
@@ -375,7 +373,7 @@ static void set_socket_options(org::libmemcached::Instance* server)
   if (server->root->tcp_keepidle > 0)
   {
     int error= setsockopt(server->fd, IPPROTO_TCP, TCP_KEEPIDLE,
-                          &server->root->tcp_keepidle, (socklen_t)sizeof(int));
+                          (char*)&server->root->tcp_keepidle, (socklen_t)sizeof(int));
     (void)(error);
     assert(error == 0);
   }
@@ -384,7 +382,7 @@ static void set_socket_options(org::libmemcached::Instance* server)
   if (server->root->send_size > 0)
   {
     int error= setsockopt(server->fd, SOL_SOCKET, SO_SNDBUF,
-                          &server->root->send_size, (socklen_t)sizeof(int));
+                          (char*)&server->root->send_size, (socklen_t)sizeof(int));
     (void)(error);
     assert(error == 0);
   }
@@ -392,7 +390,7 @@ static void set_socket_options(org::libmemcached::Instance* server)
   if (server->root->recv_size > 0)
   {
     int error= setsockopt(server->fd, SOL_SOCKET, SO_RCVBUF,
-                          &server->root->recv_size, (socklen_t)sizeof(int));
+                          (char*)&server->root->recv_size, (socklen_t)sizeof(int));
     (void)(error);
     assert(error == 0);
   }
@@ -512,13 +510,16 @@ static memcached_return_t network_connect(org::libmemcached::Instance* server)
       type|= SOCK_NONBLOCK;
     }
 
-    if ((server->fd= socket(server->address_info_next->ai_family,
-                            type,
-                            server->address_info_next->ai_protocol)) < 0)
+    server->fd= socket(server->address_info_next->ai_family,
+                       type,
+                       server->address_info_next->ai_protocol);
+
+    if (int(server->fd) == SOCKET_ERROR)
     {
       return memcached_set_errno(*server, get_socket_errno(), NULL);
     }
 
+#ifdef HAVE_FCNTL
     // If SOCK_CLOEXEC exists then we don't need to call the following
     if (SOCK_CLOEXEC == 0)
     {
@@ -531,6 +532,7 @@ static memcached_return_t network_connect(org::libmemcached::Instance* server)
         } while (rval == -1 && (errno == EINTR or errno == EAGAIN));
       }
     }
+#endif
 
     set_socket_options(server);
 
@@ -732,6 +734,7 @@ static memcached_return_t _memcached_connect(org::libmemcached::Instance* server
       if (server->fd != INVALID_SOCKET and server->root->sasl.callbacks)
       {
         rc= memcached_sasl_authenticate_connection(server);
+        fprintf(stderr, "%s:%d %s\n", __FILE__, __LINE__, memcached_strerror(NULL, rc));
         if (memcached_failed(rc) and server->fd != INVALID_SOCKET)
         {
           WATCHPOINT_ASSERT(server->fd != INVALID_SOCKET);