X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Fconnect.c;h=6d08eb709065f35b02303e209ac666316a8e7950;hb=55b5455291498ef63c1c34976552d58708a74732;hp=24328f4c4bb7c244b2bc358faeef953317af7207;hpb=7c7750f02368b570353ea109f23a0ea26d226e02;p=m6w6%2Flibmemcached diff --git a/libmemcached/connect.c b/libmemcached/connect.c index 24328f4c..6d08eb70 100644 --- a/libmemcached/connect.c +++ b/libmemcached/connect.c @@ -10,7 +10,7 @@ static memcached_return_t set_hostinfo(memcached_server_st *server) int e; char str_port[NI_MAXSERV]; - sprintf(str_port, "%u", server->port); + snprintf(str_port, NI_MAXSERV, "%u", (uint32_t)server->port); memset(&hints, 0, sizeof(hints)); @@ -63,6 +63,8 @@ static memcached_return_t set_socket_options(memcached_server_st *ptr) error= setsockopt(ptr->fd, SOL_SOCKET, SO_SNDTIMEO, &waittime, (socklen_t)sizeof(struct timeval)); WATCHPOINT_ASSERT(error == 0); + if (error) + return MEMCACHED_FAILURE; } #endif @@ -78,6 +80,8 @@ static memcached_return_t set_socket_options(memcached_server_st *ptr) error= setsockopt(ptr->fd, SOL_SOCKET, SO_RCVTIMEO, &waittime, (socklen_t)sizeof(struct timeval)); WATCHPOINT_ASSERT(error == 0); + if (error) + return MEMCACHED_FAILURE; } #endif @@ -91,6 +95,8 @@ static memcached_return_t set_socket_options(memcached_server_st *ptr) error= setsockopt(ptr->fd, SOL_SOCKET, SO_LINGER, &linger, (socklen_t)sizeof(struct linger)); WATCHPOINT_ASSERT(error == 0); + if (error) + return MEMCACHED_FAILURE; } if (ptr->root->flags.tcp_nodelay) @@ -101,24 +107,30 @@ static memcached_return_t set_socket_options(memcached_server_st *ptr) error= setsockopt(ptr->fd, IPPROTO_TCP, TCP_NODELAY, &flag, (socklen_t)sizeof(int)); WATCHPOINT_ASSERT(error == 0); + if (error) + return MEMCACHED_FAILURE; } - if (ptr->root->send_size) + if (ptr->root->send_size > 0) { int error; error= setsockopt(ptr->fd, SOL_SOCKET, SO_SNDBUF, &ptr->root->send_size, (socklen_t)sizeof(int)); WATCHPOINT_ASSERT(error == 0); + if (error) + return MEMCACHED_FAILURE; } - if (ptr->root->recv_size) + if (ptr->root->recv_size > 0) { int error; error= setsockopt(ptr->fd, SOL_SOCKET, SO_RCVBUF, &ptr->root->recv_size, (socklen_t)sizeof(int)); WATCHPOINT_ASSERT(error == 0); + if (error) + return MEMCACHED_FAILURE; } /* libmemcached will always use nonblocking IO to avoid write deadlocks */ @@ -129,7 +141,9 @@ static memcached_return_t set_socket_options(memcached_server_st *ptr) while (flags == -1 && (errno == EINTR || errno == EAGAIN)); unlikely (flags == -1) + { return MEMCACHED_CONNECTION_FAILURE; + } else if ((flags & O_NONBLOCK) == 0) { int rval; @@ -139,7 +153,9 @@ static memcached_return_t set_socket_options(memcached_server_st *ptr) while (rval == -1 && (errno == EINTR || errno == EAGAIN)); unlikely (rval == -1) + { return MEMCACHED_CONNECTION_FAILURE; + } } return MEMCACHED_SUCCESS; @@ -148,7 +164,6 @@ static memcached_return_t set_socket_options(memcached_server_st *ptr) static memcached_return_t unix_socket_connect(memcached_server_st *ptr) { struct sockaddr_un servAddr; - socklen_t addrlen; if (ptr->fd == -1) { @@ -162,8 +177,6 @@ static memcached_return_t unix_socket_connect(memcached_server_st *ptr) servAddr.sun_family= AF_UNIX; strcpy(servAddr.sun_path, ptr->hostname); /* Copy filename */ - addrlen= (socklen_t) (strlen(servAddr.sun_path) + sizeof(servAddr.sun_family)); - test_connect: if (connect(ptr->fd, (struct sockaddr *)&servAddr, @@ -195,7 +208,9 @@ static memcached_return_t network_connect(memcached_server_st *ptr) { struct addrinfo *use; - if (!ptr->sockaddr_inited || + WATCHPOINT_ASSERT(ptr->cursor_active == 0); + + if (! ptr->options.sockaddr_inited || (!(ptr->root->flags.use_cache_lookups))) { memcached_return_t rc; @@ -203,7 +218,7 @@ static memcached_return_t network_connect(memcached_server_st *ptr) rc= set_hostinfo(ptr); if (rc != MEMCACHED_SUCCESS) return rc; - ptr->sockaddr_inited= true; + ptr->options.sockaddr_inited= true; } use= ptr->address_info; @@ -269,7 +284,6 @@ static memcached_return_t network_connect(memcached_server_st *ptr) if (ptr->fd != -1) { - WATCHPOINT_ASSERT(ptr->cursor_active == 0); ptr->server_failure_counter= 0; return MEMCACHED_SUCCESS; } @@ -322,7 +336,9 @@ memcached_return_t memcached_connect(memcached_server_st *ptr) if (curr_time.tv_sec < ptr->next_retry) { if (memcached_behavior_get(ptr->root, MEMCACHED_BEHAVIOR_AUTO_EJECT_HOSTS)) + { run_distribution(ptr->root); + } ptr->root->last_disconnected_server = ptr; return MEMCACHED_SERVER_MARKED_DEAD; @@ -343,6 +359,7 @@ memcached_return_t memcached_connect(memcached_server_st *ptr) case MEMCACHED_CONNECTION_UNIX_SOCKET: rc= unix_socket_connect(ptr); break; + case MEMCACHED_CONNECTION_MAX: default: WATCHPOINT_ASSERT(0); }