]> git.saurik.com Git - redis.git/commitdiff
Merge pull request #97 from jvain/redis-cli
authorSalvatore Sanfilippo <antirez@gmail.com>
Wed, 21 Sep 2011 20:32:24 +0000 (13:32 -0700)
committerSalvatore Sanfilippo <antirez@gmail.com>
Wed, 21 Sep 2011 20:32:24 +0000 (13:32 -0700)
redis-cli segfaults with single numeric argument greater than zero

1  2 
src/redis-cli.c

diff --combined src/redis-cli.c
index 328cd3df207e1561e2e5f9bc3e517b75c94b9534,d01b1ed508a6c7738310745c0f2f86b7cf8510b9..b129df612d04700b55547b8a889580ad5dec6dbe
@@@ -61,7 -61,6 +61,7 @@@ static struct config 
      int shutdown;
      int monitor_mode;
      int pubsub_mode;
 +    int latency_mode;
      int stdinarg; /* get last arg from stdin. (-x option) */
      char *auth;
      int raw_output; /* output mode per command */
@@@ -568,8 -567,6 +568,8 @@@ static int parseOptions(int argc, char 
              i++;
          } else if (!strcmp(argv[i],"--raw")) {
              config.raw_output = 1;
 +        } else if (!strcmp(argv[i],"--latency")) {
 +            config.latency_mode = 1;
          } else if (!strcmp(argv[i],"-d") && !lastarg) {
              sdsfree(config.mb_delim);
              config.mb_delim = sdsnew(argv[i+1]);
@@@ -620,7 -617,6 +620,7 @@@ static void usage() 
  "  -x               Read last argument from STDIN\n"
  "  -d <delimiter>   Multi-bulk delimiter in for raw formatting (default: \\n)\n"
  "  --raw            Use raw formatting for replies (default when STDOUT is not a tty)\n"
 +"  --latency        Enter a special mode continuously sampling latency.\n"
  "  --help           Output this help and exit\n"
  "  --version        Output version and exit\n"
  "\n"
@@@ -697,7 -693,7 +697,7 @@@ static void repl() 
                      int repeat, skipargs = 0;
  
                      repeat = atoi(argv[0]);
-                     if (repeat) {
+                     if (argc > 1 && repeat) {
                          skipargs = 1;
                      } else {
                          repeat = 1;
@@@ -743,38 -739,6 +743,38 @@@ static int noninteractive(int argc, cha
      return retval;
  }
  
 +static void latencyMode(void) {
 +    redisReply *reply;
 +    long long start, latency, min, max, tot, count = 0;
 +    double avg;
 +
 +    if (!context) exit(1);
 +    while(1) {
 +        start = mstime();
 +        reply = redisCommand(context,"PING");
 +        if (reply == NULL) {
 +            fprintf(stderr,"\nI/O error\n");
 +            exit(1);
 +        }
 +        latency = mstime()-start;
 +        freeReplyObject(reply);
 +        count++;
 +        if (count == 1) {
 +            min = max = tot = latency;
 +            avg = (double) latency;
 +        } else {
 +            if (latency < min) min = latency;
 +            if (latency > max) max = latency;
 +            tot += latency;
 +            avg = (double) tot/count;
 +        }
 +        printf("\x1b[0G\x1b[2Kmin: %lld, max: %lld, avg: %.2f (%lld samples)",
 +            min, max, avg, count);
 +        fflush(stdout);
 +        usleep(10000);
 +    }
 +}
 +
  int main(int argc, char **argv) {
      int firstarg;
  
      config.shutdown = 0;
      config.monitor_mode = 0;
      config.pubsub_mode = 0;
 +    config.latency_mode = 0;
      config.stdinarg = 0;
      config.auth = NULL;
      config.raw_output = !isatty(fileno(stdout)) && (getenv("FAKETTY") == NULL);
      argc -= firstarg;
      argv += firstarg;
  
 +    /* Start in latency mode if appropriate */
 +    if (config.latency_mode) {
 +        cliConnect(0);
 +        latencyMode();
 +    }
 +
      /* Start interactive mode when no command is provided */
      if (argc == 0) {
          /* Note that in repl mode we don't abort on connection error.