From a65094dae811770c904f9ec5bb54c41caf5d9f66 Mon Sep 17 00:00:00 2001 From: "zhaozhao.zz" Date: Wed, 13 Feb 2019 11:47:10 +0800 Subject: [PATCH 1/2] ACL: fix cat type format warning --- src/acl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/acl.c b/src/acl.c index e4122fd2..2a1b2cbc 100644 --- a/src/acl.c +++ b/src/acl.c @@ -1446,7 +1446,7 @@ void aclCommand(client *c) { } else if (!strcasecmp(sub,"cat") && c->argc == 3) { uint64_t cflag = ACLGetCommandCategoryFlagByName(c->argv[2]->ptr); if (cflag == 0) { - addReplyErrorFormat(c, "Unknown category '%s'", c->argv[2]->ptr); + addReplyErrorFormat(c, "Unknown category '%s'", (char*)c->argv[2]->ptr); return; } int arraylen = 0; From 14507457a08acb6886dc8ae37dba8511ffc18939 Mon Sep 17 00:00:00 2001 From: "zhaozhao.zz" Date: Thu, 14 Feb 2019 00:12:10 +0800 Subject: [PATCH 2/2] ACL: show categories in COMMAND reply Adding another new filed categories at the end of command reply, it's easy to read and distinguish flags and categories, also compatible with old format. --- src/acl.c | 12 ++++++++++++ src/server.c | 6 ++++-- src/server.h | 1 + 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/acl.c b/src/acl.c index 2a1b2cbc..407d8673 100644 --- a/src/acl.c +++ b/src/acl.c @@ -1480,3 +1480,15 @@ NULL addReplySubcommandSyntaxError(c); } } + +void addReplyCommandCategories(client *c, struct redisCommand *cmd) { + int flagcount = 0; + void *flaglen = addReplyDeferredLen(c); + for (int j = 0; ACLCommandCategories[j].flag != 0; j++) { + if (cmd->flags & ACLCommandCategories[j].flag) { + addReplyStatusFormat(c, "@%s", ACLCommandCategories[j].name); + flagcount++; + } + } + setDeferredSetLen(c, flaglen, flagcount); +} diff --git a/src/server.c b/src/server.c index 1a6c277e..7d78efca 100644 --- a/src/server.c +++ b/src/server.c @@ -3698,8 +3698,8 @@ void addReplyCommand(client *c, struct redisCommand *cmd) { if (!cmd) { addReplyNull(c); } else { - /* We are adding: command name, arg count, flags, first, last, offset */ - addReplyArrayLen(c, 6); + /* We are adding: command name, arg count, flags, first, last, offset, categories */ + addReplyArrayLen(c, 7); addReplyBulkCString(c, cmd->name); addReplyLongLong(c, cmd->arity); @@ -3729,6 +3729,8 @@ void addReplyCommand(client *c, struct redisCommand *cmd) { addReplyLongLong(c, cmd->firstkey); addReplyLongLong(c, cmd->lastkey); addReplyLongLong(c, cmd->keystep); + + addReplyCommandCategories(c,cmd); } } diff --git a/src/server.h b/src/server.h index a396e1cf..99495265 100644 --- a/src/server.h +++ b/src/server.h @@ -1748,6 +1748,7 @@ char *ACLSetUserStringError(void); int ACLLoadConfiguredUsers(void); sds ACLDescribeUser(user *u); void ACLLoadUsersAtStartup(void); +void addReplyCommandCategories(client *c, struct redisCommand *cmd); /* Sorted sets data type */