+memcached_return_t memcached_io_slurp(memcached_server_write_instance_st ptr)
+{
+ assert_msg(ptr, "Programmer error, invalid memcached_server_write_instance_st");
+
+ if (ptr->fd == INVALID_SOCKET)
+ {
+ assert_msg(int(ptr->state) <= int(MEMCACHED_SERVER_STATE_ADDRINFO), "Invalid socket state");
+ return MEMCACHED_CONNECTION_FAILURE;
+ }
+
+ ssize_t data_read;
+ char buffer[MEMCACHED_MAX_BUFFER];
+ do
+ {
+ data_read= recv(ptr->fd, ptr->read_buffer, sizeof(buffer), MSG_DONTWAIT);
+ if (data_read == SOCKET_ERROR)
+ {
+ switch (get_socket_errno())
+ {
+ case EINTR: // We just retry
+ continue;
+
+ case ETIMEDOUT: // OSX
+ case EWOULDBLOCK:
+#ifdef USE_EAGAIN
+ case EAGAIN:
+#endif
+#ifdef TARGET_OS_LINUX
+ case ERESTART:
+#endif
+ if (memcached_success(io_wait(ptr, MEM_READ)))
+ {
+ continue;
+ }
+ return MEMCACHED_IN_PROGRESS;
+
+ /* fall through */
+
+ case ENOTCONN: // Programmer Error
+ WATCHPOINT_ASSERT(0);
+ case ENOTSOCK:
+ WATCHPOINT_ASSERT(0);
+ case EBADF:
+ assert_msg(ptr->fd != INVALID_SOCKET, "Invalid socket state");
+ case EINVAL:
+ case EFAULT:
+ case ECONNREFUSED:
+ default:
+ return MEMCACHED_CONNECTION_FAILURE; // We want this!
+ }
+ }
+ } while (data_read > 0);
+
+ return MEMCACHED_CONNECTION_FAILURE;
+}
+