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 */