From a92ae7774052ebdb305249ac548d5ed4f7887b82 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 | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/redis.c b/src/redis.c index 33369294..393b4225 100644 --- a/src/redis.c +++ b/src/redis.c @@ -2403,6 +2403,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); @@ -2411,6 +2412,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); @@ -2446,26 +2448,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")) { - 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) { - addReplyError(c, "Unknown subcommand."); - return; - } else { + 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 { + addReplyError(c, "Unknown subcommand."); + return; } }