Merge in all changes related to being able to read configuration files.
[awesomized/libmemcached] / libmemcached / protocol / ascii_handler.c
index 19aff1156d3c56698242627239714536a3eb0589..802b0859653351647b2ab2284ea21b1a1b3296c4 100644 (file)
@@ -34,7 +34,7 @@ static uint16_t parse_ascii_key(char **start)
 
   if (len == 0 || len > 240 || (*c != '\0' && *c != '\r' && iscntrl(*c)))
   {
-    return 0;
+    return EXIT_SUCCESS;
   }
 
   return len;
@@ -80,6 +80,7 @@ static void send_command_usage(memcached_protocol_client_st *client)
     [UNKNOWN_CMD]= "CLIENT_ERROR: Unknown command\r\n",
   };
 
+  client->mute = false;
   spool_string(client, errmsg[client->ascii_command]);
 }
 
@@ -91,10 +92,10 @@ static void send_command_usage(memcached_protocol_client_st *client)
  */
 static protocol_binary_response_status
 ascii_version_response_handler(const void *cookie,
-                         const void *text,
-                         uint32_t textlen)
+                               const void *text,
+                               uint32_t textlen)
 {
-  memcached_protocol_client_st *client= (void*)cookie;
+  memcached_protocol_client_st *client= (memcached_protocol_client_st*)cookie;
   spool_string(client, "VERSION ");
   client->root->spool(client, text, textlen);
   spool_string(client, "\r\n");
@@ -145,12 +146,12 @@ ascii_get_response_handler(const void *cookie,
 
   if (client->ascii_command == GETS_CMD)
   {
-    snprintf(dest, sizeof(buffer) - used, " %u %u %llu\r\n", flags,
-             flags, (unsigned long long)cas);
+    snprintf(dest, sizeof(buffer) - used, " %u %u %" PRIu64 "\r\n", flags,
+             bodylen, cas);
   }
   else
   {
-    snprintf(dest, sizeof(buffer) - used, " %u %u\r\n", flags, flags);
+    snprintf(dest, sizeof(buffer) - used, " %u %u\r\n", flags, bodylen);
   }
 
   client->root->spool(client, buffer, strlen(buffer));
@@ -385,7 +386,7 @@ static void process_delete(memcached_protocol_client_st *client,
   else
   {
     char msg[80];
-    snprintf(msg, sizeof(msg), "SERVER_ERROR: delete failed %u\r\n",(int)rval);
+    snprintf(msg, sizeof(msg), "SERVER_ERROR: delete failed %u\r\n",(uint32_t)rval);
     spool_string(client, msg);
   }
 }
@@ -439,8 +440,7 @@ static void process_arithmetic(memcached_protocol_client_st *client,
   if (rval == PROTOCOL_BINARY_RESPONSE_SUCCESS)
   {
     char buffer[80];
-    snprintf(buffer, sizeof(buffer), "%llu\r\n",
-             (unsigned long long)result);
+    snprintf(buffer, sizeof(buffer), "%"PRIu64"\r\n", result);
     spool_string(client, buffer);
   }
   else
@@ -558,7 +558,7 @@ static inline int process_storage_command(memcached_protocol_client_st *client,
   {
     /* Keep on reading */
     recover_tokenize_command(start, *end);
-    return 1;
+    return EXIT_FAILURE;
   }
 
   void *data= (*end) + 1;
@@ -658,7 +658,7 @@ static inline int process_storage_command(memcached_protocol_client_st *client,
 
   *end += nbytes + 2;
 
-  return 0;
+  return EXIT_SUCCESS;
 }
 
 static int process_cas_command(memcached_protocol_client_st *client,
@@ -832,9 +832,10 @@ memcached_protocol_event_t memcached_ascii_protocol_process_data(memcached_proto
       case REPLACE_CMD:
         error= process_replace_command(client, tokens, ntokens,
                                        ptr, &end, *length);
+        break;
       case CAS_CMD:
         error= process_cas_command(client, tokens, ntokens, ptr, &end, *length);
-       break;
+        break;
       case APPEND_CMD:
         error= process_append_command(client, tokens, ntokens,
                                       ptr, &end, *length);
@@ -852,18 +853,34 @@ memcached_protocol_event_t memcached_ascii_protocol_process_data(memcached_proto
         process_arithmetic(client, tokens, ntokens);
         break;
       case STATS_CMD:
-        recover_tokenize_command(ptr, end);
-        process_stats(client, ptr + 6, end);
+        if (client->mute)
+        {
+          send_command_usage(client);
+        }
+        else
+        {
+          recover_tokenize_command(ptr, end);
+          process_stats(client, ptr + 6, end);
+        }
         break;
       case FLUSH_ALL_CMD:
         process_flush(client, tokens, ntokens);
         break;
       case VERSION_CMD:
-        process_version(client, tokens, ntokens);
+        if (client->mute)
+        {
+          send_command_usage(client);
+        }
+        else
+        {
+          process_version(client, tokens, ntokens);
+        }
         break;
       case QUIT_CMD:
-        if (ntokens != 1)
+        if (ntokens != 1 || client->mute)
+        {
           send_command_usage(client);
+        }
         else
         {
           if (client->root->callback->interface.v1.quit != NULL)