{
struct pollfd fds[1];
fds[0].fd= server->fd;
- fds[0].events= POLLOUT;
+ fds[0].events= server->events();
+ fds[0].revents= 0;
size_t loop_max= 5;
return memcached_set_error(*server, MEMCACHED_TIMEOUT, MEMCACHED_AT);
}
+#if 0
+ server->revents(fds[0].revents);
+#endif
+
if (fds[0].revents & POLLERR or
fds[0].revents & POLLHUP or
fds[0].revents & POLLNVAL)
break;
case EAI_AGAIN:
- if (server->address_info)
- {
- freeaddrinfo(server->address_info);
- server->address_info= NULL;
- server->address_info_next= NULL;
- }
return memcached_set_error(*server, MEMCACHED_TIMEOUT, MEMCACHED_AT, memcached_string_make_from_cstr(gai_strerror(errcode)));
case EAI_SYSTEM:
#endif
-#if defined(__MACH__) && defined(__APPLE__) || defined(__FreeBSD__)
+#if defined(SO_NOSIGPIPE)
if (SO_NOSIGPIPE)
{
int set= 1;
#ifndef WIN32
WATCHPOINT_ASSERT(server->fd == INVALID_SOCKET);
- int type= SOCK_STREAM;
- if (SOCK_CLOEXEC)
- {
- type|= SOCK_CLOEXEC;
- }
+ do {
+ int type= SOCK_STREAM;
+ if (SOCK_CLOEXEC)
+ {
+ type|= SOCK_CLOEXEC;
+ }
- if (SOCK_NONBLOCK)
- {
- type|= SOCK_NONBLOCK;
- }
+ if (SOCK_NONBLOCK)
+ {
+ type|= SOCK_NONBLOCK;
+ }
- if ((server->fd= socket(AF_UNIX, type, 0)) < 0)
- {
- memcached_set_errno(*server, errno, NULL);
- return MEMCACHED_CONNECTION_FAILURE;
- }
+ if ((server->fd= socket(AF_UNIX, type, 0)) < 0)
+ {
+ return memcached_set_errno(*server, errno, NULL);
+ }
- struct sockaddr_un servAddr;
+ struct sockaddr_un servAddr;
- memset(&servAddr, 0, sizeof (struct sockaddr_un));
- servAddr.sun_family= AF_UNIX;
- strncpy(servAddr.sun_path, server->hostname, sizeof(servAddr.sun_path)); /* Copy filename */
+ memset(&servAddr, 0, sizeof (struct sockaddr_un));
+ servAddr.sun_family= AF_UNIX;
+ strncpy(servAddr.sun_path, server->hostname, sizeof(servAddr.sun_path)); /* Copy filename */
- do {
if (connect(server->fd, (struct sockaddr *)&servAddr, sizeof(servAddr)) < 0)
{
switch (errno)
{
case EINPROGRESS:
case EALREADY:
+ server->events(POLLOUT);
+ break;
+
case EINTR:
+ (void)closesocket(server->fd);
+ server->fd= INVALID_SOCKET;
continue;
case EISCONN: /* We were spinning waiting on connect */
{
assert(0); // Programmer error
- break;
+ (void)closesocket(server->fd);
+ server->fd= INVALID_SOCKET;
+ continue;
}
default:
WATCHPOINT_ERRNO(errno);
- memcached_set_errno(*server, errno, MEMCACHED_AT);
- return MEMCACHED_CONNECTION_FAILURE;
+ (void)closesocket(server->fd);
+ server->fd= INVALID_SOCKET;
+ return memcached_set_errno(*server, errno, MEMCACHED_AT);
}
}
} while (0);
case EINPROGRESS: // nonblocking mode - first return
case EALREADY: // nonblocking mode - subsequent returns
{
+ server->events(POLLOUT);
server->state= MEMCACHED_SERVER_STATE_IN_PROGRESS;
memcached_return_t rc= connect_poll(server);
server->fd= INVALID_SOCKET;
continue;
+ case ECONNREFUSED:
+ // Probably not running service
+
default:
break;
}
return rc;
}
-memcached_return_t memcached_connect_try(org::libmemcached::Instance* server)
-{
- if (server and server->root and server->root->state.is_parsing)
- {
- return MEMCACHED_SUCCESS;
- }
-
- return _memcached_connect(server, false);
-}
-
memcached_return_t memcached_connect(org::libmemcached::Instance* server)
{
return _memcached_connect(server, true);