X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Fconnect.c;h=96f26fb80e07f6116435eb4ef9259f4d9db14134;hb=7c986323bd4eece0d805f4df17eb03ea094f84f6;hp=24328f4c4bb7c244b2bc358faeef953317af7207;hpb=7c7750f02368b570353ea109f23a0ea26d226e02;p=m6w6%2Flibmemcached diff --git a/libmemcached/connect.c b/libmemcached/connect.c index 24328f4c..96f26fb8 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,6 +107,8 @@ 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) @@ -110,6 +118,8 @@ static memcached_return_t set_socket_options(memcached_server_st *ptr) 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) @@ -119,6 +129,8 @@ static memcached_return_t set_socket_options(memcached_server_st *ptr) 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, @@ -322,7 +335,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 +358,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); }