X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=lib%2Fmemcached_connect.c;h=1b4a5fd5839a22373549f29d68c15634eb68b90b;hb=51aa1233e4981967f06dd3432cd3a6ed83a35607;hp=9d935e024cb0fbe22ae36b93b5c99be771bbc932;hpb=ff2976218215f2e11bca9fad46c9d917588aff96;p=awesomized%2Flibmemcached diff --git a/lib/memcached_connect.c b/lib/memcached_connect.c index 9d935e02..1b4a5fd5 100644 --- a/lib/memcached_connect.c +++ b/lib/memcached_connect.c @@ -1,4 +1,5 @@ #include "common.h" +#include static memcached_return set_hostinfo(memcached_server_st *server) { @@ -136,47 +137,6 @@ test_connect: { switch (errno) { case EINPROGRESS: - { - struct timeval tm = { ptr->root->connect_timeout, 0 }; - socklen_t len= sizeof(int); - fd_set wset; - int error=0, value; - - FD_ZERO(&wset); - FD_SET(ptr->fd, &wset); - - select(ptr->fd+1, NULL, &wset, NULL, &tm); - if (FD_ISSET(ptr->fd, &wset) != 0) - { - if (getsockopt(ptr->fd, SOL_SOCKET, SO_ERROR, &value, &len) == 0) - { - if (value) - { - error= 1; - } - } - else - { - error= 1; - } - } - else - { - error= 1; - } - - if (error) - { - 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 EALREADY: case EINTR: goto test_connect; @@ -237,6 +197,27 @@ test_connect: /* 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 */