static int cliReadReply(int fd) { char type; if (anetRead(fd,&type,1) <= 0) { if (config.shutdown) return 0; exit(1); } switch(type) { case '-': printf("(error) "); cliReadSingleLineReply(fd,0); return 1; case '+': return cliReadSingleLineReply(fd,0); case ':': printf("(integer) "); return cliReadSingleLineReply(fd,0); case '$': return cliReadBulkReply(fd); case '*': return cliReadMultiBulkReply(fd); default: printf("protocol error, got '%c' as reply type byte\n", type); return 1; } }
static int cliReadReply(int fd) { char type; int nread; if ((nread = anetRead(fd,&type,1)) <= 0) { if (config.shutdown) return 0; if (config.interactive && (nread == 0 || (nread == -1 && errno == ECONNRESET))) { return ECONNRESET; } else { printf("I/O error while reading from socket: %s",strerror(errno)); exit(1); } } switch(type) { case '-': if (config.tty) printf("(error) "); cliReadSingleLineReply(fd,0); return 1; case '+': return cliReadSingleLineReply(fd,0); case ':': if (config.tty) printf("(integer) "); return cliReadSingleLineReply(fd,0); case '$': return cliReadBulkReply(fd); case '*': return cliReadMultiBulkReply(fd); default: printf("protocol error, got '%c' as reply type byte", type); return 1; } }
static int cliSendCommand(int argc, char **argv) { struct redisCommand *rc = lookupCommand(argv[0]); int fd, j, retval = 0; sds cmd = sdsempty(); if (!rc) { fprintf(stderr,"Unknown command '%s'\n",argv[0]); return 1; } if ((rc->arity > 0 && argc != rc->arity) || (rc->arity < 0 && argc < -rc->arity)) { fprintf(stderr,"Wrong number of arguments for '%s'\n",rc->name); return 1; } if ((fd = cliConnect()) == -1) return 1; /* Build the command to send */ for (j = 0; j < argc; j++) { if (j != 0) cmd = sdscat(cmd," "); if (j == argc-1 && rc->flags & REDIS_CMD_BULK) { cmd = sdscatprintf(cmd,"%d",sdslen(argv[j])); } else { cmd = sdscatlen(cmd,argv[j],sdslen(argv[j])); } } cmd = sdscat(cmd,"\r\n"); if (rc->flags & REDIS_CMD_BULK) { cmd = sdscatlen(cmd,argv[argc-1],sdslen(argv[argc-1])); cmd = sdscat(cmd,"\r\n"); } anetWrite(fd,cmd,sdslen(cmd)); if (rc->flags & REDIS_CMD_INTREPLY) { retval = cliReadInlineReply(fd,REDIS_CMD_INTREPLY); } else if (rc->flags & REDIS_CMD_RETCODEREPLY) { retval = cliReadInlineReply(fd,REDIS_CMD_RETCODEREPLY); } else if (rc->flags & REDIS_CMD_SINGLELINEREPLY) { retval = cliReadInlineReply(fd,REDIS_CMD_SINGLELINEREPLY); } else if (rc->flags & REDIS_CMD_BULKREPLY) { retval = cliReadBulkReply(fd,0); } else if (rc->flags & REDIS_CMD_MULTIBULKREPLY) { retval = cliReadMultiBulkReply(fd); } if (retval) { close(fd); return retval; } close(fd); return 0; }
static int cliReadMultiBulkReply(int fd) { sds replylen = cliReadLine(fd); int elements, c = 1; if (replylen == NULL) return 1; if (strcmp(replylen,"nil") == 0) { sdsfree(replylen); printf("(nil)\n"); return 0; } elements = atoi(replylen); while(elements--) { printf("%d. ", c); if (cliReadBulkReply(fd,1)) return 1; printf("\n"); c++; } return 0; }