Permalink
Browse files

code generating the CLIENT LIST output refactored to have a function …

…that is able to render a single client into a client info string.
  • Loading branch information...
1 parent 0b1531e commit f3ac12aac2f42633166aa610dedc14043328680a @antirez committed Nov 21, 2011
Showing with 39 additions and 29 deletions.
  1. +39 −29 src/networking.c
View
@@ -883,46 +883,56 @@ void getClientsMaxBuffers(unsigned long *longest_output_list,
*biggest_input_buffer = bib;
}
+/* Turn a Redis client into an sds string representing its state. */
+sds getClientInfoString(redisClient *client) {
+ char ip[32], flags[16], *p;
+ int port;
+ time_t now = time(NULL);
+
+ if (anetPeerToString(client->fd,ip,&port) == -1) {
+ ip[0] = '?';
+ ip[1] = '\0';
+ port = 0;
+ }
+ p = flags;
+ if (client->flags & REDIS_SLAVE) {
+ if (client->flags & REDIS_MONITOR)
+ *p++ = 'O';
+ else
+ *p++ = 'S';
+ }
+ if (client->flags & REDIS_MASTER) *p++ = 'M';
+ if (p == flags) *p++ = 'N';
+ if (client->flags & REDIS_MULTI) *p++ = 'x';
+ if (client->flags & REDIS_BLOCKED) *p++ = 'b';
+ if (client->flags & REDIS_IO_WAIT) *p++ = 'i';
+ if (client->flags & REDIS_DIRTY_CAS) *p++ = 'd';
+ if (client->flags & REDIS_CLOSE_AFTER_REPLY) *p++ = 'c';
+ if (client->flags & REDIS_UNBLOCKED) *p++ = 'u';
+ *p++ = '\0';
+ return sdscatprintf(sdsempty(),
+ "addr=%s:%d fd=%d idle=%ld flags=%s db=%d sub=%d psub=%d",
+ ip,port,client->fd,
+ (long)(now - client->lastinteraction),
+ flags,
+ client->db->id,
+ (int) dictSize(client->pubsub_channels),
+ (int) listLength(client->pubsub_patterns));
+}
+
void clientCommand(redisClient *c) {
listNode *ln;
listIter li;
redisClient *client;
if (!strcasecmp(c->argv[1]->ptr,"list") && c->argc == 2) {
sds o = sdsempty();
- time_t now = time(NULL);
listRewind(server.clients,&li);
while ((ln = listNext(&li)) != NULL) {
- char ip[32], flags[16], *p;
- int port;
-
client = listNodeValue(ln);
- if (anetPeerToString(client->fd,ip,&port) == -1) continue;
- p = flags;
- if (client->flags & REDIS_SLAVE) {
- if (client->flags & REDIS_MONITOR)
- *p++ = 'O';
- else
- *p++ = 'S';
- }
- if (client->flags & REDIS_MASTER) *p++ = 'M';
- if (p == flags) *p++ = 'N';
- if (client->flags & REDIS_MULTI) *p++ = 'x';
- if (client->flags & REDIS_BLOCKED) *p++ = 'b';
- if (client->flags & REDIS_IO_WAIT) *p++ = 'i';
- if (client->flags & REDIS_DIRTY_CAS) *p++ = 'd';
- if (client->flags & REDIS_CLOSE_AFTER_REPLY) *p++ = 'c';
- if (client->flags & REDIS_UNBLOCKED) *p++ = 'u';
- *p++ = '\0';
- o = sdscatprintf(o,
- "addr=%s:%d fd=%d idle=%ld flags=%s db=%d sub=%d psub=%d\n",
- ip,port,client->fd,
- (long)(now - client->lastinteraction),
- flags,
- client->db->id,
- (int) dictSize(client->pubsub_channels),
- (int) listLength(client->pubsub_patterns));
+ o = sdscatsds(o,getClientInfoString(client));
+ o = sdscatlen(o,"\n",1);
}
addReplyBulkCBuffer(c,o,sdslen(o));
sdsfree(o);

0 comments on commit f3ac12a

Please sign in to comment.