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, int repeat) { char *command = argv[0]; int fd, j, retval = 0; sds cmd; config.raw_output = !strcasecmp(command,"info"); if (!strcasecmp(command,"help")) { showInteractiveHelp(); return 0; } if (!strcasecmp(command,"shutdown")) config.shutdown = 1; if (!strcasecmp(command,"monitor")) config.monitor_mode = 1; if (!strcasecmp(command,"subscribe") || !strcasecmp(command,"psubscribe")) config.pubsub_mode = 1; if ((fd = cliConnect(0)) == -1) return 1; /* Select db number */ retval = selectDb(fd); if (retval) { fprintf(stderr,"Error setting DB num\n"); return 1; } /* Build the command to send */ cmd = sdscatprintf(sdsempty(),"*%d\r\n",argc); for (j = 0; j < argc; j++) { cmd = sdscatprintf(cmd,"$%lu\r\n", (unsigned long)sdslen(argv[j])); cmd = sdscatlen(cmd,argv[j],sdslen(argv[j])); cmd = sdscatlen(cmd,"\r\n",2); } while(repeat--) { anetWrite(fd,cmd,sdslen(cmd)); while (config.monitor_mode) { if (cliReadSingleLineReply(fd,0)) exit(1); printf("\n"); } if (config.pubsub_mode) { printf("Reading messages... (press Ctrl-c to quit)\n"); while (1) { cliReadReply(fd); printf("\n\n"); } } retval = cliReadReply(fd); if (!config.raw_output && config.tty) printf("\n"); if (retval) return retval; } return 0; }
static int selectDb(int fd) { int retval; sds cmd; char type; if (config.dbnum == 0) return 0; cmd = sdsempty(); cmd = sdscatprintf(cmd,"SELECT %d\r\n",config.dbnum); anetWrite(fd,cmd,sdslen(cmd)); anetRead(fd,&type,1); if (type <= 0 || type != '+') return 1; retval = cliReadSingleLineReply(fd,1); if (retval) { return retval; } return 0; }
static int cliSendCommand(int argc, char **argv, int repeat) { struct redisCommand *rc = lookupCommand(argv[0]); int fd, j, retval = 0; sds cmd; if (!rc) { fprintf(stderr,"Unknown command '%s'\n",argv[0]); return 1; } config.raw_output = (rc->flags & CMDFLAG_RAWOUTPUT); 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 (!strcasecmp(rc->name,"shutdown")) config.shutdown = 1; if (!strcasecmp(rc->name,"monitor")) config.monitor_mode = 1; if (!strcasecmp(rc->name,"subscribe") || !strcasecmp(rc->name,"psubscribe")) config.pubsub_mode = 1; if ((fd = cliConnect()) == -1) return 1; /* Select db number */ retval = selectDb(fd); if (retval) { fprintf(stderr,"Error setting DB num\n"); return 1; } while(repeat--) { /* Build the command to send */ cmd = sdscatprintf(sdsempty(),"*%d\r\n",argc); for (j = 0; j < argc; j++) { cmd = sdscatprintf(cmd,"$%lu\r\n", (unsigned long)sdslen(argv[j])); cmd = sdscatlen(cmd,argv[j],sdslen(argv[j])); cmd = sdscatlen(cmd,"\r\n",2); } anetWrite(fd,cmd,sdslen(cmd)); sdsfree(cmd); while (config.monitor_mode) { cliReadSingleLineReply(fd,0); } if (config.pubsub_mode) { printf("Reading messages... (press Ctrl-c to quit)\n"); while (1) { cliReadReply(fd); printf("\n"); } } retval = cliReadReply(fd); if (retval) { return retval; } } return 0; }
static int cliSendCommand(int argc, char **argv) { struct redisCommand *rc = lookupCommand(argv[0]); int fd, j, retval = 0; int read_forever = 0; sds cmd; 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 (!strcasecmp(rc->name,"monitor")) read_forever = 1; if ((fd = cliConnect()) == -1) return 1; /* Select db number */ retval = selectDb(fd); if (retval) { fprintf(stderr,"Error setting DB num\n"); return 1; } while(config.repeat--) { /* Build the command to send */ cmd = sdsempty(); if (rc->flags & REDIS_CMD_MULTIBULK) { cmd = sdscatprintf(cmd,"*%d\r\n",argc); for (j = 0; j < argc; j++) { cmd = sdscatprintf(cmd,"$%lu\r\n", (unsigned long)sdslen(argv[j])); cmd = sdscatlen(cmd,argv[j],sdslen(argv[j])); cmd = sdscatlen(cmd,"\r\n",2); } } else { for (j = 0; j < argc; j++) { if (j != 0) cmd = sdscat(cmd," "); if (j == argc-1 && rc->flags & REDIS_CMD_BULK) { cmd = sdscatprintf(cmd,"%lu", (unsigned long)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 = sdscatlen(cmd,"\r\n",2); } } anetWrite(fd,cmd,sdslen(cmd)); sdsfree(cmd); while (read_forever) { cliReadSingleLineReply(fd,0); } retval = cliReadReply(fd); if (retval) { return retval; } } return 0; }