#include <libmemcached/common.h>
-#include <cassert>
#include <ctime>
#include <sys/time.h>
size_t loop_max= 5;
- while (--loop_max) // Should only loop on cases of ERESTART or EINTR
+ if (ptr->root->poll_timeout == 0)
{
- int error;
- if (ptr->root->poll_timeout)
- {
- error= poll(fds, 1, ptr->root->connect_timeout);
- }
- else
- {
- error= 0;
- }
+ return memcached_set_error(*ptr, MEMCACHED_TIMEOUT, MEMCACHED_AT);
+ }
+ while (--loop_max) // Should only loop on cases of ERESTART or EINTR
+ {
+ int error= poll(fds, 1, ptr->root->connect_timeout);
switch (error)
{
case 1:
int err;
socklen_t len= sizeof (err);
(void)getsockopt(ptr->fd, SOL_SOCKET, SO_ERROR, &err, &len);
- ptr->cached_errno= (err == 0) ? get_socket_errno() : err;
+ memcached_set_errno(*ptr, (err == 0) ? get_socket_errno() : err, MEMCACHED_AT);
}
else
{
- ptr->cached_errno= get_socket_errno();
+ memcached_set_errno(*ptr, get_socket_errno(), MEMCACHED_AT);
}
+ WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
(void)closesocket(ptr->fd);
ptr->fd= INVALID_SOCKET;
ptr->state= MEMCACHED_SERVER_STATE_NEW;
static memcached_return_t set_hostinfo(memcached_server_st *server)
{
- assert(! server->address_info); // We cover the case where a programming mistake has been made.
+ WATCHPOINT_ASSERT(not server->address_info); // We cover the case where a programming mistake has been made.
if (server->address_info)
{
freeaddrinfo(server->address_info);
char str_port[NI_MAXSERV];
int length= snprintf(str_port, NI_MAXSERV, "%u", (uint32_t)server->port);
if (length >= NI_MAXSERV || length < 0)
+ {
return MEMCACHED_FAILURE;
+ }
struct addrinfo hints;
memset(&hints, 0, sizeof(struct addrinfo));
default:
{
WATCHPOINT_STRING(server->hostname);
- WATCHPOINT_STRING(gai_strerror(e));
+ WATCHPOINT_STRING(gai_strerror(errcode));
return memcached_set_error(*server, MEMCACHED_HOST_LOOKUP_FAILURE, MEMCACHED_AT, memcached_string_make_from_cstr(gai_strerror(errcode)));
}
}
if ((ptr->fd= socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
{
- return memcached_set_errno(*ptr, errno, NULL);
+ memcached_set_errno(*ptr, errno, NULL);
+ return MEMCACHED_CONNECTION_FAILURE;
}
struct sockaddr_un servAddr;
default:
WATCHPOINT_ERRNO(errno);
- return memcached_set_errno(*ptr, errno, MEMCACHED_AT);
+ memcached_set_errno(*ptr, errno, MEMCACHED_AT);
+ return MEMCACHED_CONNECTION_FAILURE;
}
}
} while (0);
break;
case EINTR: // Special case, we retry ai_addr
+ WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
(void)closesocket(ptr->fd);
ptr->fd= INVALID_SOCKET;
- ptr->state= MEMCACHED_SERVER_STATE_NEW;
continue;
default:
break;
}
+ WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
(void)closesocket(ptr->fd);
ptr->fd= INVALID_SOCKET;
ptr->address_info_next= ptr->address_info_next->ai_next;
memcached_return_t rc= MEMCACHED_NO_SERVERS;
if (ptr->fd != INVALID_SOCKET)
+ {
return MEMCACHED_SUCCESS;
+ }
LIBMEMCACHED_MEMCACHED_CONNECT_START();
case MEMCACHED_CONNECTION_TCP:
rc= network_connect(ptr);
#ifdef LIBMEMCACHED_WITH_SASL_SUPPORT
- if (ptr->fd != INVALID_SOCKET && ptr->root->sasl.callbacks)
+ if (ptr->fd != INVALID_SOCKET and ptr->root->sasl.callbacks)
{
rc= memcached_sasl_authenticate_connection(ptr);
- if (memcached_failed(rc))
+ if (memcached_failed(rc) and ptr->fd != INVALID_SOCKET)
{
+ WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
(void)closesocket(ptr->fd);
ptr->fd= INVALID_SOCKET;
}