X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=lib%2Fmemcached_response.c;h=31b5911737f2820a39d4d1f36c0ab55c9e23e344;hb=2c213592852ceb196be1b1760d17284150fc0678;hp=19fa640076045faa1bdf0cdd5cbfbbad092e9cd1;hpb=d4dc795f136a3a652c5b13b4d818345c6080bceb;p=m6w6%2Flibmemcached diff --git a/lib/memcached_response.c b/lib/memcached_response.c index 19fa6400..31b59117 100644 --- a/lib/memcached_response.c +++ b/lib/memcached_response.c @@ -8,9 +8,9 @@ #include "common.h" #include "memcached_io.h" -memcached_return memcached_response(memcached_st *ptr, +memcached_return memcached_response(memcached_server_st *ptr, char *buffer, size_t buffer_length, - unsigned int server_key) + memcached_result_st *result) { unsigned int x; size_t send_length; @@ -18,21 +18,35 @@ memcached_return memcached_response(memcached_st *ptr, unsigned int max_messages; - memset(buffer, 0, buffer_length); send_length= 0; + /* UDP at the moment is odd...*/ + if (ptr->type == MEMCACHED_CONNECTION_UDP) + { + char buffer[8]; + ssize_t read_length; + + return MEMCACHED_SUCCESS; + + read_length= memcached_io_read(ptr, buffer, 8); + } - max_messages= memcached_server_response_count(ptr, server_key); - for (x= 0; x <= max_messages; x++) + /* We may have old commands in the buffer not set, first purge */ + if (ptr->root->flags & MEM_NO_BLOCK) + (void)memcached_io_write(ptr, NULL, 0, 1); + + max_messages= memcached_server_response_count(ptr); + for (x= 0; x < max_messages; x++) { size_t total_length= 0; buffer_ptr= buffer; + while (1) { - unsigned int read_length; + ssize_t read_length; - read_length= memcached_io_read(ptr, server_key, - buffer_ptr, 1); + read_length= memcached_io_read(ptr, buffer_ptr, 1); + WATCHPOINT_ASSERT(isgraph(*buffer_ptr) || isspace(*buffer_ptr)); if (read_length != 1) return MEMCACHED_UNKNOWN_READ_FAILURE; @@ -43,29 +57,62 @@ memcached_return memcached_response(memcached_st *ptr, buffer_ptr++; total_length++; - WATCHPOINT_ASSERT(total_length < buffer_length); + WATCHPOINT_ASSERT(total_length <= buffer_length); + + if (total_length >= buffer_length) + return MEMCACHED_PROTOCOL_ERROR; } + buffer_ptr++; + *buffer_ptr= 0; - if (memcached_server_response_count(ptr, server_key)) - memcached_server_response_decrement(ptr, server_key); + memcached_server_response_decrement(ptr); } switch(buffer[0]) { - case 'V': /* VALUE */ - return MEMCACHED_SUCCESS; + case 'V': /* VALUE || VERSION */ + if (buffer[1] == 'A') /* VALUE */ + { + memcached_return rc; + + /* We add back in one because we will need to search for END */ + memcached_server_response_increment(ptr); + if (result) + rc= value_fetch(ptr, buffer, result); + else + rc= value_fetch(ptr, buffer, &ptr->root->result); + + return rc; + } + else if (buffer[1] == 'E') /* VERSION */ + { + return MEMCACHED_SUCCESS; + } + else + { + WATCHPOINT_STRING(buffer); + WATCHPOINT_ASSERT(0); + return MEMCACHED_UNKNOWN_READ_FAILURE; + } case 'O': /* OK */ return MEMCACHED_SUCCESS; case 'S': /* STORED STATS SERVER_ERROR */ { if (buffer[2] == 'A') /* STORED STATS */ + { + memcached_server_response_increment(ptr); return MEMCACHED_STAT; + } else if (buffer[1] == 'E') return MEMCACHED_SERVER_ERROR; else if (buffer[1] == 'T') return MEMCACHED_STORED; else + { + WATCHPOINT_STRING(buffer); + WATCHPOINT_ASSERT(0); return MEMCACHED_UNKNOWN_READ_FAILURE; + } } case 'D': /* DELETED */ return MEMCACHED_DELETED;