- fprintf(stderr, "cannot connect to host '%s' (%u) (error: %s)\n", ptr->hosts[x].hostname,
- ptr->hosts[x].port,
- strerror(errno));
- return MEMCACHED_HOST_LOCKUP_FAILURE;
+ memcached_return rc;
+
+ rc= set_hostinfo(ptr);
+ if (rc != MEMCACHED_SUCCESS)
+ return rc;
+ ptr->sockaddr_inited= MEMCACHED_ALLOCATED;
+ }
+
+ use= ptr->address_info;
+ /* Create the socket */
+ while (use != NULL)
+ {
+ if ((ptr->fd= socket(use->ai_family,
+ use->ai_socktype,
+ use->ai_protocol)) < 0)
+ {
+ ptr->cached_errno= errno;
+ WATCHPOINT_ERRNO(errno);
+ return MEMCACHED_CONNECTION_SOCKET_CREATE_FAILURE;
+ }
+
+ (void)set_socket_options(ptr);
+
+ /* connect to server */
+test_connect:
+ if (connect(ptr->fd,
+ use->ai_addr,
+ use->ai_addrlen) < 0)
+ {
+ switch (errno) {
+ /* We are spinning waiting on connect */
+ case EALREADY:
+ case EINPROGRESS:
+ {
+ struct pollfd fds[1];
+ int error;
+
+ memset(&fds, 0, sizeof(struct pollfd));
+ fds[0].fd= ptr->fd;
+ fds[0].events= POLLOUT | POLLERR;
+ error= poll(fds, 1, ptr->root->connect_timeout);
+
+ if (error != 1)
+ {
+ ptr->cached_errno= errno;
+ WATCHPOINT_ERRNO(ptr->cached_errno);
+ close(ptr->fd);
+ ptr->fd= -1;
+ return MEMCACHED_ERRNO;
+ }
+
+ break;
+ }
+ /* We are spinning waiting on connect */
+ case EINTR:
+ goto test_connect;
+ case EISCONN: /* We were spinning waiting on connect */
+ break;
+ default:
+ ptr->cached_errno= errno;
+ WATCHPOINT_ERRNO(ptr->cached_errno);
+ close(ptr->fd);
+ ptr->fd= -1;
+ }
+ }
+ else
+ {
+ WATCHPOINT_ASSERT(ptr->cursor_active == 0);
+ return MEMCACHED_SUCCESS;
+ }
+ use = use->ai_next;