uint8_t found_eof= 0;
if (!ptr->read_buffer_length)
{
- size_t data_read;
+ ssize_t data_read;
while (1)
{
data_read= read(ptr->fd,
ptr->read_buffer,
MEMCACHED_MAX_BUFFER);
- if (data_read == -1)
+ if (data_read > 0)
+ break;
+ else if (data_read == -1)
{
+ ptr->cached_errno= errno;
switch (errno)
{
case EAGAIN:
if (rc == MEMCACHED_SUCCESS)
continue;
-
- memcached_quit_server(ptr, 1);
- return -1;
}
+ /* fall trough */
default:
{
memcached_quit_server(ptr, 1);
- ptr->cached_errno= errno;
return -1;
}
}
}
- else if (data_read)
- break;
- /* If zero, just keep looping unless testing, then assert() */
else
{
WATCHPOINT_ASSERT(0);
else
{
*buffer_ptr= *ptr->read_ptr;
- length--;
ptr->read_ptr++;
ptr->read_buffer_length--;
buffer_ptr++;
+ break;
}
if (found_eof)
ssize_t memcached_io_write(memcached_server_st *ptr,
char *buffer, size_t length, char with_flush)
{
- unsigned long long x;
+ size_t original_length;
+ char* buffer_ptr;
+
+ original_length= length;
+ buffer_ptr= buffer;
- for (x= 0; x < length; x++)
+ while (length)
{
- ptr->write_buffer[ptr->write_buffer_offset]= buffer[x];
- ptr->write_buffer_offset++;
- WATCHPOINT_ASSERT(ptr->write_buffer_offset <= MEMCACHED_MAX_BUFFER);
+ 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;
if (ptr->write_buffer_offset == MEMCACHED_MAX_BUFFER)
{
return -1;
}
- return length;
+ return original_length;
}
memcached_return memcached_io_close(memcached_server_st *ptr)
if ((ssize_t)(sent_length= write(ptr->fd, local_write_ptr,
write_length)) == -1)
{
- WATCHPOINT_STRING("Error in write occurred");
switch (errno)
{
case ENOBUFS: