{
int err;
socklen_t len= sizeof (err);
- (void)getsockopt(ptr->fd, SOL_SOCKET, SO_ERROR, &err, &len);
- memcached_set_errno(*ptr, (err == 0) ? get_socket_errno() : err, MEMCACHED_AT);
+ if (getsockopt(ptr->fd, SOL_SOCKET, SO_ERROR, &err, &len) == 0)
+ {
+ if (err == 0)
+ {
+ continue;
+ }
+ errno= err;
+ }
}
else
{
memcached_set_errno(*ptr, get_socket_errno(), MEMCACHED_AT);
}
+ int local_errno= get_socket_errno(); // We cache in case memcached_quit_server() modifies errno
memcached_quit_server(ptr, true);
- return memcached_set_errno(*ptr, get_socket_errno(), MEMCACHED_AT);
+ return memcached_set_errno(*ptr, local_errno, MEMCACHED_AT);
}
}
}
return -1;
}
}
- ssize_t sent_length;
size_t return_length;
char *local_write_ptr= ptr->write_buffer;
size_t write_length= ptr->write_buffer_offset;
WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
// UDP Sanity check, make sure that we are not sending somthing too big
- if (ptr->type == MEMCACHED_CONNECTION_UDP && write_length > MAX_UDP_DATAGRAM_LENGTH)
+ if (memcached_is_udp(ptr->root) and write_length > MAX_UDP_DATAGRAM_LENGTH)
{
*error= MEMCACHED_WRITE_FAILURE;
return -1;
}
- if (ptr->write_buffer_offset == 0 || (ptr->type == MEMCACHED_CONNECTION_UDP
- && ptr->write_buffer_offset == UDP_DATAGRAM_HEADER_LENGTH))
+ if (ptr->write_buffer_offset == 0 or (memcached_is_udp(ptr->root) and ptr->write_buffer_offset == UDP_DATAGRAM_HEADER_LENGTH))
{
return 0;
}
{
WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
WATCHPOINT_ASSERT(write_length > 0);
- sent_length= 0;
- if (ptr->type == MEMCACHED_CONNECTION_UDP)
+ if (memcached_is_udp(ptr->root))
+ {
increment_udp_message_id(ptr);
+ }
+ ssize_t sent_length= 0;
WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
if (with_flush)
{
- sent_length= send(ptr->fd, local_write_ptr, write_length, MSG_NOSIGNAL|MSG_DONTWAIT);
+ sent_length= ::send(ptr->fd, local_write_ptr, write_length, MSG_NOSIGNAL|MSG_DONTWAIT);
}
else
{
- sent_length= send(ptr->fd, local_write_ptr, write_length, MSG_NOSIGNAL|MSG_DONTWAIT|MSG_MORE);
+ sent_length= ::send(ptr->fd, local_write_ptr, write_length, MSG_NOSIGNAL|MSG_DONTWAIT|MSG_MORE);
}
if (sent_length == SOCKET_ERROR)
* buffer for more data and retry the write before
* waiting..
*/
- if (repack_input_buffer(ptr) or
- process_input_buffer(ptr))
+ if (repack_input_buffer(ptr) or process_input_buffer(ptr))
{
continue;
}
}
}
- if (ptr->type == MEMCACHED_CONNECTION_UDP and
- (size_t)sent_length != write_length)
+ if (memcached_is_udp(ptr->root) and size_t(sent_length) != write_length)
{
memcached_quit_server(ptr, true);
*error= memcached_set_error(*ptr, MEMCACHED_WRITE_FAILURE, MEMCACHED_AT);
return -1;
}
- ptr->io_bytes_sent += (uint32_t) sent_length;
+ ptr->io_bytes_sent+= uint32_t(sent_length);
local_write_ptr+= sent_length;
- write_length-= (uint32_t) sent_length;
- return_length+= (uint32_t) sent_length;
+ write_length-= uint32_t(sent_length);
+ return_length+= uint32_t(sent_length);
}
WATCHPOINT_ASSERT(write_length == 0);
// if we are a udp server, the begining of the buffer is reserverd for
// the upd frame header
- if (ptr->type == MEMCACHED_CONNECTION_UDP)
+ if (memcached_is_udp(ptr->root))
+ {
ptr->write_buffer_offset= UDP_DATAGRAM_HEADER_LENGTH;
+ }
else
+ {
ptr->write_buffer_offset= 0;
+ }
return (ssize_t) return_length;
}
if (ptr->fd == INVALID_SOCKET)
{
+#if 0
assert_msg(int(ptr->state) <= int(MEMCACHED_SERVER_STATE_ADDRINFO), "Programmer error, invalid socket state");
+#endif
return MEMCACHED_CONNECTION_FAILURE;
}
}
}
- ptr->server_failure_counter= 0;
*nread = (ssize_t)(buffer_ptr - (char*)buffer);
+
return MEMCACHED_SUCCESS;
}
static ssize_t _io_write(memcached_server_write_instance_st ptr,
const void *buffer, size_t length, bool with_flush)
{
- size_t original_length;
- const char* buffer_ptr;
-
WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
- original_length= length;
- buffer_ptr= static_cast<const char *>(buffer);
+ size_t original_length= length;
+ const char *buffer_ptr= static_cast<const char *>(buffer);
while (length)
{
size_t should_write;
size_t buffer_end;
- if (ptr->type == MEMCACHED_CONNECTION_UDP)
+ if (memcached_is_udp(ptr->root))
{
//UDP does not support partial writes
buffer_end= MAX_UDP_DATAGRAM_LENGTH;
buffer_ptr+= should_write;
length-= should_write;
- if (ptr->write_buffer_offset == buffer_end && ptr->type != MEMCACHED_CONNECTION_UDP)
+ if (ptr->write_buffer_offset == buffer_end and memcached_is_udp(ptr->root) == false)
{
WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
return _io_write(ptr, buffer, length, with_flush);
}
+size_t io_vector_total_size(libmemcached_io_vector_st* vector, const size_t number_of)
+{
+ ssize_t total= 0;
+
+ for (size_t x= 0; x < number_of; x++)
+ {
+ total+= vector->length;
+ }
+
+ return total;
+}
+
ssize_t memcached_io_writev(memcached_server_write_instance_st ptr,
const struct libmemcached_io_vector_st *vector,
size_t number_of, bool with_flush)
{
ssize_t returnable;
- if ((returnable= _io_write(ptr, vector->buffer, vector->length, false)) == -1)
+ if (vector->length)
{
- return -1;
+ if ((returnable= _io_write(ptr, vector->buffer, vector->length, false)) == -1)
+ {
+ return -1;
+ }
+ total+= returnable;
}
- total+= returnable;
}
if (with_flush)
total_nr= 0;
bool line_complete= false;
- while (not line_complete)
+ while (line_complete == false)
{
if (ptr->read_buffer_length == 0)
{
}
if (*buffer_ptr == '\n')
+ {
line_complete= true;
+ }
++buffer_ptr;
++total_nr;
{
*buffer_ptr = *ptr->read_ptr;
if (*buffer_ptr == '\n')
+ {
line_complete = true;
+ }
--ptr->read_buffer_length;
++ptr->read_ptr;
++total_nr;
}
if (total_nr == size)
+ {
return MEMCACHED_PROTOCOL_ERROR;
+ }
}
return MEMCACHED_SUCCESS;
memcached_return_t memcached_io_init_udp_header(memcached_server_write_instance_st ptr, uint16_t thread_id)
{
if (thread_id > UDP_REQUEST_ID_MAX_THREAD_ID)
+ {
return MEMCACHED_FAILURE;
+ }
struct udp_datagram_header_st *header= (struct udp_datagram_header_st *)ptr->write_buffer;
header->request_id= htons((uint16_t) (generate_udp_request_thread_id(thread_id)));