X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Fprotocol%2Fascii_handler.c;h=5e7307ae7cdcdbd50fc2fdfd4ab8f6326da2407d;hb=e7855e43bbc4dd0a5e8fcbfd4888181001dcd1ec;hp=19aff1156d3c56698242627239714536a3eb0589;hpb=0438a012ce75f5067aa95638519a30706494ab74;p=awesomized%2Flibmemcached diff --git a/libmemcached/protocol/ascii_handler.c b/libmemcached/protocol/ascii_handler.c index 19aff115..5e7307ae 100644 --- a/libmemcached/protocol/ascii_handler.c +++ b/libmemcached/protocol/ascii_handler.c @@ -1,10 +1,48 @@ -/* -*- Mode: C; tab-width: 2; c-basic-offset: 2; indent-tabs-mode: nil -*- */ -#include "libmemcached/protocol/common.h" +/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab: + * + * Libmemcached library + * + * Copyright (C) 2011 Data Differential, http://datadifferential.com/ + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * + * * The names of its contributors may not be used to endorse or + * promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "config.h" + +#include +#include #include -#include -#include #include +#include +#include /** * Try to parse a key from the string. @@ -80,6 +118,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 +130,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 +184,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 +424,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 +478,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 @@ -832,9 +870,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 +891,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)