diff --git a/src/redis-cli.c b/src/redis-cli.c index a37131b944cb77e6b61c18200807155b517469c8..ab6383c64f04349960ba66f5b0a9ea434134805a 100644 --- a/src/redis-cli.c +++ b/src/redis-cli.c @@ -94,6 +94,7 @@ static struct config { } config; static void usage(); +static void slaveMode(void); char *redisGitSHA1(void); char *redisGitDirty(void); @@ -599,6 +600,8 @@ static int cliSendCommand(int argc, char **argv, int repeat) { if (!strcasecmp(command,"monitor")) config.monitor_mode = 1; if (!strcasecmp(command,"subscribe") || !strcasecmp(command,"psubscribe")) config.pubsub_mode = 1; + if (!strcasecmp(command,"sync") || + !strcasecmp(command,"psync")) config.slave_mode = 1; /* Setup argument length */ argvlen = malloc(argc*sizeof(size_t)); @@ -620,6 +623,13 @@ static int cliSendCommand(int argc, char **argv, int repeat) { } } + if (config.slave_mode) { + printf("Entering slave output mode... (press Ctrl-C to quit)\n"); + slaveMode(); + config.slave_mode = 0; + return REDIS_ERR; /* Error = slaveMode lost connection to master */ + } + if (cliReadReply(output_raw) != REDIS_OK) { free(argvlen); return REDIS_ERR; @@ -1060,6 +1070,7 @@ static void slaveMode(void) { int fd = context->fd; unsigned long long payload = sendSync(fd); char buf[1024]; + int original_output = config.output; fprintf(stderr,"SYNC with master, discarding %llu " "bytes of bulk transfer...\n", payload); @@ -1080,6 +1091,7 @@ static void slaveMode(void) { /* Now we can use hiredis to read the incoming protocol. */ config.output = OUTPUT_CSV; while (cliReadReply(0) == REDIS_OK); + config.output = original_output; } /* This function implements --rdb, so it uses the replication protocol in order