+ if (memcached_server_response_count(ptr, x) &&
+ ptr->hosts[x].read_data_length < MEMCACHED_MAX_BUFFER )
+ {
+ size_t data_read;
+
+ data_read= read(ptr->hosts[x].fd,
+ ptr->hosts[x].read_ptr + ptr->hosts[x].read_data_length,
+ MEMCACHED_MAX_BUFFER - ptr->hosts[x].read_data_length);
+ if (data_read == -1)
+ continue;
+
+ ptr->hosts[x].read_buffer_length+= data_read;
+ ptr->hosts[x].read_data_length+= data_read;
+ }
+ }
+}
+#endif
+
+ssize_t memcached_io_read(memcached_server_st *ptr,
+ char *buffer, size_t length)
+{
+ char *buffer_ptr;
+
+ buffer_ptr= buffer;
+
+ while (length)
+ {
+ uint8_t found_eof= 0;
+ if (!ptr->read_buffer_length)
+ {
+ ssize_t data_read;
+
+ while (1)
+ {
+ data_read= read(ptr->fd,
+ ptr->read_buffer,
+ MEMCACHED_MAX_BUFFER);
+ if (data_read > 0)
+ break;
+ else if (data_read == -1)
+ {
+ ptr->cached_errno= errno;
+ switch (errno)
+ {
+ case EAGAIN:
+ {
+ memcached_return rc;
+
+ rc= io_wait(ptr, MEM_READ);
+
+ if (rc == MEMCACHED_SUCCESS)
+ continue;
+ }
+ /* fall trough */
+ default:
+ {
+ memcached_quit_server(ptr, 1);
+ return -1;
+ }
+ }
+ }
+ else
+ {
+ WATCHPOINT_ASSERT(0);
+ found_eof= 1;
+ break;
+ }
+ }
+
+ ptr->read_data_length= data_read;
+ ptr->read_buffer_length= data_read;
+ ptr->read_ptr= ptr->read_buffer;
+ }
+
+ if (length > 1)
+ {
+ size_t difference;
+
+ difference= (length > ptr->read_buffer_length) ? ptr->read_buffer_length : length;
+
+ memcpy(buffer_ptr, ptr->read_ptr, difference);
+ length -= difference;
+ ptr->read_ptr+= difference;
+ ptr->read_buffer_length-= difference;
+ buffer_ptr+= difference;
+ }
+ else
+ {
+ *buffer_ptr= *ptr->read_ptr;
+ ptr->read_ptr++;
+ ptr->read_buffer_length--;
+ buffer_ptr++;
+ break;
+ }
+
+ if (found_eof)
+ break;
+ }
+
+ return (size_t)(buffer_ptr - buffer);
+}
+
+ssize_t memcached_io_write(memcached_server_st *ptr,
+ char *buffer, size_t length, char with_flush)
+{
+ size_t original_length;
+ char* buffer_ptr;
+
+ original_length= length;
+ buffer_ptr= buffer;
+
+ while (length)
+ {
+ char *write_ptr;
+ size_t should_write;
+
+ should_write= MEMCACHED_MAX_BUFFER - ptr->write_buffer_offset;
+ write_ptr= ptr->write_buffer + ptr->write_buffer_offset;
+
+ should_write= (should_write < length) ? should_write : length;
+
+ memcpy(write_ptr, buffer_ptr, should_write);
+ ptr->write_buffer_offset+= should_write;
+ buffer_ptr+= should_write;
+ length-= should_write;
+