summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorContinuous Integration <ci@tangent.org>2014-02-02 05:49:39 -0800
committerContinuous Integration <ci@tangent.org>2014-02-02 05:49:39 -0800
commit5356e466e864b310a0195b72ce232197827bbe4e (patch)
treeafb645b7346c4a0746a1ef5c4aacd9ac6f7e21fe
parent237efd60e77a7d59839af07e5382c1f941cf4d80 (diff)
parenteeb331250b498d8ba2c57d0646cb2953072a1a07 (diff)
downloadlibmemcached-5356e466e864b310a0195b72ce232197827bbe4e.tar.gz
Merge lp:~493pocbrcycmdw7yksonho9o2qzz-o18bz-d18ecat4t1b76tkfi3vttrkfngli/libmemcached/libmemcached Build: jenkins-Libmemcached-445
-rw-r--r--libmemcached-1.0/server.h3
-rw-r--r--libmemcached/io.cc9
-rw-r--r--libmemcached/server.cc18
3 files changed, 27 insertions, 3 deletions
diff --git a/libmemcached-1.0/server.h b/libmemcached-1.0/server.h
index 856c0e7e..abd0bfb9 100644
--- a/libmemcached-1.0/server.h
+++ b/libmemcached-1.0/server.h
@@ -104,6 +104,9 @@ LIBMEMCACHED_API
in_port_t memcached_server_port(const memcached_instance_st * self);
LIBMEMCACHED_API
+in_port_t memcached_server_srcport(const memcached_instance_st * self);
+
+LIBMEMCACHED_API
void memcached_instance_next_retry(const memcached_instance_st * self, const time_t absolute_time);
LIBMEMCACHED_API
diff --git a/libmemcached/io.cc b/libmemcached/io.cc
index 8796d503..e9d3ad39 100644
--- a/libmemcached/io.cc
+++ b/libmemcached/io.cc
@@ -342,6 +342,7 @@ static bool io_flush(memcached_instance_st* instance,
}
ssize_t sent_length= ::send(instance->fd, local_write_ptr, write_length, flags);
+ int local_errno= get_socket_errno(); // We cache in case memcached_quit_server() modifies errno
if (sent_length == SOCKET_ERROR)
{
@@ -381,14 +382,14 @@ static bool io_flush(memcached_instance_st* instance,
}
memcached_quit_server(instance, true);
- error= memcached_set_errno(*instance, get_socket_errno(), MEMCACHED_AT);
+ error= memcached_set_errno(*instance, local_errno, MEMCACHED_AT);
return false;
}
case ENOTCONN:
case EPIPE:
default:
memcached_quit_server(instance, true);
- error= memcached_set_errno(*instance, get_socket_errno(), MEMCACHED_AT);
+ error= memcached_set_errno(*instance, local_errno, MEMCACHED_AT);
WATCHPOINT_ASSERT(instance->fd == INVALID_SOCKET);
return false;
}
@@ -422,6 +423,8 @@ static memcached_return_t _io_fill(memcached_instance_st* instance)
do
{
data_read= ::recv(instance->fd, instance->read_buffer, MEMCACHED_MAX_BUFFER, MSG_NOSIGNAL);
+ int local_errno= get_socket_errno(); // We cache in case memcached_quit_server() modifies errno
+
if (data_read == SOCKET_ERROR)
{
switch (get_socket_errno())
@@ -460,7 +463,7 @@ static memcached_return_t _io_fill(memcached_instance_st* instance)
case ECONNREFUSED:
default:
memcached_quit_server(instance, true);
- memcached_set_errno(*instance, get_socket_errno(), MEMCACHED_AT);
+ memcached_set_errno(*instance, local_errno, MEMCACHED_AT);
break;
}
diff --git a/libmemcached/server.cc b/libmemcached/server.cc
index b38120ad..c4747ddc 100644
--- a/libmemcached/server.cc
+++ b/libmemcached/server.cc
@@ -213,6 +213,24 @@ in_port_t memcached_server_port(const memcached_instance_st * self)
return self->port();
}
+in_port_t memcached_server_srcport(const memcached_instance_st * self)
+{
+ WATCHPOINT_ASSERT(self);
+ if (self == NULL || self->fd == INVALID_SOCKET || (self->type != MEMCACHED_CONNECTION_TCP && self->type != MEMCACHED_CONNECTION_UDP))
+ {
+ return 0;
+ }
+
+ struct sockaddr_in sin;
+ socklen_t addrlen= sizeof(sin);
+ if (getsockname(self->fd, (struct sockaddr*)&sin, &addrlen) != -1)
+ {
+ return ntohs(sin.sin_port);
+ }
+
+ return -1;
+}
+
uint32_t memcached_server_response_count(const memcached_instance_st * self)
{
WATCHPOINT_ASSERT(self);