From 0a6649a7c0c63115fab98d5c811fc75690156f7e Mon Sep 17 00:00:00 2001 From: antirez Date: Fri, 27 Jun 2014 12:05:54 +0200 Subject: [PATCH] COMMAND: fix argument parsing. This fixes detection of wrong subcommand (that resulted in the default all-commands output instead) and allows COMMAND INFO to be called without arguments (resulting into an empty array) which is useful in programmtically generated calls like the following (in Ruby): redis.commands("command","info",*mycommands) Note: mycommands may be empty. --- src/redis.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/redis.c b/src/redis.c index 3a57fd3b..3dd468d4 100644 --- a/src/redis.c +++ b/src/redis.c @@ -2267,6 +2267,7 @@ void timeCommand(redisClient *c) { } +/* Helper function for addReplyCommand() to output flags. */ int addReplyCommandFlag(redisClient *c, struct redisCommand *cmd, int f, char *reply) { if (cmd->flags & f) { addReplyStatus(c, reply); @@ -2275,6 +2276,7 @@ int addReplyCommandFlag(redisClient *c, struct redisCommand *cmd, int f, char *r return 0; } +/* Output the representation of a Redis command. Used by the COMMAND command. */ void addReplyCommand(redisClient *c, struct redisCommand *cmd) { if (!cmd) { addReply(c, shared.nullbulk); @@ -2310,26 +2312,27 @@ void addReplyCommand(redisClient *c, struct redisCommand *cmd) { } } +/* COMMAND */ void commandCommand(redisClient *c) { dictIterator *di; dictEntry *de; - if (c->argc > 2 && !strcasecmp(c->argv[1]->ptr, "info")) { + if (c->argc == 1) { + addReplyMultiBulkLen(c, dictSize(server.commands)); + di = dictGetIterator(server.commands); + while ((de = dictNext(di)) != NULL) { + addReplyCommand(c, dictGetVal(de)); + } + dictReleaseIterator(di); + } else if (!strcasecmp(c->argv[1]->ptr, "info")) { int i; addReplyMultiBulkLen(c, c->argc-2); for (i = 2; i < c->argc; i++) { addReplyCommand(c, dictFetchValue(server.commands, c->argv[i]->ptr)); } - } else if (c->argc > 2) { + } else { addReplyError(c, "Unknown subcommand."); return; - } else { - addReplyMultiBulkLen(c, dictSize(server.commands)); - di = dictGetIterator(server.commands); - while ((de = dictNext(di)) != NULL) { - addReplyCommand(c, dictGetVal(de)); - } - dictReleaseIterator(di); } } -- GitLab