Build fixes for the memcached_get.c file.
[m6w6/libmemcached] / libmemcached / memcached_response.c
index 845052db865d3e058b791a4ffe5f0ffe58779d76..ba0691b504a39590c67184d830e2c1753222cec4 100644 (file)
@@ -179,7 +179,7 @@ static memcached_return textual_value_fetch(memcached_server_st *ptr,
   if (rrc != MEMCACHED_SUCCESS)
     return rrc;
 
-  if (read_length != (size_t)(value_length + 2))
+  if (read_length != (ssize_t)(value_length + 2))
   {
     goto read_error;
   }
@@ -237,8 +237,34 @@ static memcached_return textual_read_one_response(memcached_server_st *ptr,
         memcached_server_response_increment(ptr);
         return MEMCACHED_STAT;
       }
-      else if (buffer[1] == 'E')
-        return MEMCACHED_SERVER_ERROR;
+      else if (buffer[1] == 'E') /* SERVER_ERROR */ 
+       {
+          char *rel_ptr;
+         char *startptr= buffer + 13, *endptr= startptr;
+
+         while (*endptr != '\r' && *endptr != '\n') endptr++;
+
+          /* 
+            Yes, we could make this "efficent" but to do that we would need
+            to maintain more state for the size of the buffer. Why waste
+            memory in the struct, which is important, for something that
+            rarely should happen?
+          */
+         rel_ptr= (char *)ptr->root->call_realloc(ptr->root, ptr->cached_server_error, endptr - startptr + 1);
+
+          if (rel_ptr == NULL)
+          {
+            /* If we happened to have some memory, we just null it since we don't know the size */
+            if (ptr->cached_server_error)
+              ptr->cached_server_error[0]= 0;
+            return MEMCACHED_SERVER_ERROR;
+          }
+         ptr->cached_server_error= rel_ptr;
+
+         memcpy(ptr->cached_server_error, startptr, endptr - startptr);
+         ptr->cached_server_error[endptr - startptr]= 0;
+         return MEMCACHED_SERVER_ERROR;
+       }
       else if (buffer[1] == 'T')
         return MEMCACHED_STORED;
       else
@@ -270,6 +296,10 @@ static memcached_return textual_read_one_response(memcached_server_st *ptr,
       else
         return MEMCACHED_UNKNOWN_READ_FAILURE;
     }
+  case 'I': /* CLIENT ERROR */
+      /* We add back in one because we will need to search for END */
+      memcached_server_response_increment(ptr);
+    return MEMCACHED_ITEM;
   case 'C': /* CLIENT ERROR */
     return MEMCACHED_CLIENT_ERROR;
   default:
@@ -391,13 +421,11 @@ static memcached_return binary_read_one_response(memcached_server_st *ptr,
         WATCHPOINT_ASSERT(bodylen == 0);
         return MEMCACHED_SUCCESS;
       } 
-      break;
     case PROTOCOL_BINARY_CMD_NOOP:
       {
         WATCHPOINT_ASSERT(bodylen == 0);
         return MEMCACHED_END;
       }
-      break;
     case PROTOCOL_BINARY_CMD_STAT:
       {
         if (bodylen == 0)