string_ptr= memcached_string_create(ptr, &ptr->result_buffer, 0);
WATCHPOINT_ASSERT(string_ptr);
ptr->poll_timeout= -1;
- ptr->distribution= MEMCACHED_DISTRIBUTION_MODULUS;
+ ptr->distribution= MEMCACHED_DISTRIBUTION_MODULO;
return ptr;
}
void memcached_free(memcached_st *ptr)
{
- if (ptr->hosts)
- {
- memcached_quit(ptr);
- memcached_server_list_free(ptr->hosts);
- ptr->hosts= NULL;
- }
-
+ /* If we have anything open, lets close it now */
+ memcached_quit(ptr);
+ memcached_server_list_free(ptr->hosts);
memcached_string_free(&ptr->result_buffer);
if (ptr->is_allocated == MEMCACHED_ALLOCATED)
if (ptr == NULL)
return memcached_create(clone);
+
+ if (ptr->is_allocated == MEMCACHED_USED)
+ {
+ WATCHPOINT_ASSERT(0);
+ return NULL;
+ }
new_clone= memcached_create(clone);
#include <sys/un.h>
#include <netinet/tcp.h>
#include <netdb.h>
+#include <netinet/in.h>
static memcached_return set_hostinfo(memcached_server_st *server)
{
- struct hostent *h;
-#ifdef HAVE_GETHOSTBYNAME_R
- struct hostent h_static;
- char buffer[SMALL_STRING_LEN];
- int tmp_error;
-
- if (gethostbyname_r(server->hostname,
- &h_static, buffer, SMALL_STRING_LEN,
- &h, &tmp_error))
- {
- WATCHPOINT_STRING(server->hostname);
- WATCHPOINT_STRING(hstrerror(tmp_error));
- return MEMCACHED_HOST_LOOKUP_FAILURE;
- }
-#else
- if ((h= gethostbyname(server->hostname)) == NULL)
+ struct addrinfo *ai;
+ struct addrinfo hints;
+ int e;
+ char str_port[NI_MAXSERV];
+
+ sprintf(str_port, "%u", server->port);
+
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family= AF_INET;
+ hints.ai_socktype= SOCK_STREAM;
+ hints.ai_protocol= 0;
+
+ e= getaddrinfo(server->hostname, str_port, &hints, &ai);
+ if (e != 0)
{
WATCHPOINT_STRING(server->hostname);
- WATCHPOINT_STRING(hstrerror(h_errno));
+ WATCHPOINT_STRING(gai_strerror(e));
return MEMCACHED_HOST_LOOKUP_FAILURE;
}
-#endif
-
- server->servAddr.sin_family= h->h_addrtype;
- memcpy((char *) &server->servAddr.sin_addr.s_addr, h->h_addr_list[0], h->h_length);
- server->servAddr.sin_port = htons(server->port);
+ if (server->address_info)
+ freeaddrinfo(server->address_info);
+ server->address_info= ai;
return MEMCACHED_SUCCESS;
}
case EISCONN: /* We were spinning waiting on connect */
break;
default:
+ WATCHPOINT_ERRNO(errno);
ptr->cached_errno= errno;
return MEMCACHED_ERRNO;
}
{
/* Old connection junk still is in the structure */
WATCHPOINT_ASSERT(ptr->hosts[server_key].stack_responses == 0);
+ struct addrinfo *use;
if (ptr->hosts[server_key].sockaddr_inited == MEMCACHED_NOT_ALLOCATED ||
(!(ptr->flags & MEM_USE_CACHE_LOOKUPS)))
return rc;
ptr->hosts[server_key].sockaddr_inited= MEMCACHED_ALLOCATED;
}
+ use= ptr->hosts[server_key].address_info;
/* Create the socket */
- if ((ptr->hosts[server_key].fd= socket(AF_INET, SOCK_STREAM, 0)) < 0)
+ if ((ptr->hosts[server_key].fd= socket(use->ai_family,
+ use->ai_socktype,
+ use->ai_protocol)) < 0)
{
ptr->cached_errno= errno;
return MEMCACHED_CONNECTION_SOCKET_CREATE_FAILURE;
/* connect to server */
test_connect:
if (connect(ptr->hosts[server_key].fd,
- (struct sockaddr *)&ptr->hosts[server_key].servAddr,
- sizeof(struct sockaddr)) < 0)
+ use->ai_addr,
+ use->ai_addrlen) < 0)
{
switch (errno) {
/* We are spinning waiting on connect */
break;
default:
ptr->cached_errno= errno;
+ WATCHPOINT_ERRNO(ptr->cached_errno);
return MEMCACHED_ERRNO;
}
ptr->connected++;