+ } else if (!strcasecmp(c->argv[2]->ptr,"slave-read-only")) {
+ int yn = yesnotoi(o->ptr);
+
+ if (yn == -1) goto badfmt;
+ server.repl_slave_ro = yn;
+ } else if (!strcasecmp(c->argv[2]->ptr,"dir")) {
+ if (chdir((char*)o->ptr) == -1) {
+ addReplyErrorFormat(c,"Changing directory: %s", strerror(errno));
+ return;
+ }
+ } else if (!strcasecmp(c->argv[2]->ptr,"hash-max-ziplist-entries")) {
+ if (getLongLongFromObject(o,&ll) == REDIS_ERR || ll < 0) goto badfmt;
+ server.hash_max_ziplist_entries = ll;
+ } else if (!strcasecmp(c->argv[2]->ptr,"hash-max-ziplist-value")) {
+ if (getLongLongFromObject(o,&ll) == REDIS_ERR || ll < 0) goto badfmt;
+ server.hash_max_ziplist_value = ll;
+ } else if (!strcasecmp(c->argv[2]->ptr,"list-max-ziplist-entries")) {
+ if (getLongLongFromObject(o,&ll) == REDIS_ERR || ll < 0) goto badfmt;
+ server.list_max_ziplist_entries = ll;
+ } else if (!strcasecmp(c->argv[2]->ptr,"list-max-ziplist-value")) {
+ if (getLongLongFromObject(o,&ll) == REDIS_ERR || ll < 0) goto badfmt;
+ server.list_max_ziplist_value = ll;
+ } else if (!strcasecmp(c->argv[2]->ptr,"set-max-intset-entries")) {
+ if (getLongLongFromObject(o,&ll) == REDIS_ERR || ll < 0) goto badfmt;
+ server.set_max_intset_entries = ll;
+ } else if (!strcasecmp(c->argv[2]->ptr,"zset-max-ziplist-entries")) {
+ if (getLongLongFromObject(o,&ll) == REDIS_ERR || ll < 0) goto badfmt;
+ server.zset_max_ziplist_entries = ll;
+ } else if (!strcasecmp(c->argv[2]->ptr,"zset-max-ziplist-value")) {
+ if (getLongLongFromObject(o,&ll) == REDIS_ERR || ll < 0) goto badfmt;
+ server.zset_max_ziplist_value = ll;
+ } else if (!strcasecmp(c->argv[2]->ptr,"lua-time-limit")) {
+ if (getLongLongFromObject(o,&ll) == REDIS_ERR || ll < 0) goto badfmt;
+ server.lua_time_limit = ll;
+ } else if (!strcasecmp(c->argv[2]->ptr,"slowlog-log-slower-than")) {
+ if (getLongLongFromObject(o,&ll) == REDIS_ERR) goto badfmt;
+ server.slowlog_log_slower_than = ll;
+ } else if (!strcasecmp(c->argv[2]->ptr,"slowlog-max-len")) {
+ if (getLongLongFromObject(o,&ll) == REDIS_ERR || ll < 0) goto badfmt;
+ server.slowlog_max_len = (unsigned)ll;
+ } else if (!strcasecmp(c->argv[2]->ptr,"loglevel")) {
+ if (!strcasecmp(o->ptr,"warning")) {
+ server.verbosity = REDIS_WARNING;
+ } else if (!strcasecmp(o->ptr,"notice")) {
+ server.verbosity = REDIS_NOTICE;
+ } else if (!strcasecmp(o->ptr,"verbose")) {
+ server.verbosity = REDIS_VERBOSE;
+ } else if (!strcasecmp(o->ptr,"debug")) {
+ server.verbosity = REDIS_DEBUG;
+ } else {
+ goto badfmt;
+ }
+ } else if (!strcasecmp(c->argv[2]->ptr,"client-output-buffer-limit")) {
+ int vlen, j;
+ sds *v = sdssplitlen(o->ptr,sdslen(o->ptr)," ",1,&vlen);
+
+ /* We need a multiple of 4: <class> <hard> <soft> <soft_seconds> */
+ if (vlen % 4) {
+ sdsfreesplitres(v,vlen);
+ goto badfmt;
+ }
+
+ /* Sanity check of single arguments, so that we either refuse the
+ * whole configuration string or accept it all, even if a single
+ * error in a single client class is present. */
+ for (j = 0; j < vlen; j++) {
+ char *eptr;
+ long val;
+
+ if ((j % 4) == 0) {
+ if (getClientLimitClassByName(v[j]) == -1) {
+ sdsfreesplitres(v,vlen);
+ goto badfmt;
+ }
+ } else {
+ val = strtoll(v[j], &eptr, 10);
+ if (eptr[0] != '\0' || val < 0) {
+ sdsfreesplitres(v,vlen);
+ goto badfmt;
+ }
+ }
+ }
+ /* Finally set the new config */
+ for (j = 0; j < vlen; j += 4) {
+ int class;
+ unsigned long long hard, soft;
+ int soft_seconds;
+
+ class = getClientLimitClassByName(v[j]);
+ hard = strtoll(v[j+1],NULL,10);
+ soft = strtoll(v[j+2],NULL,10);
+ soft_seconds = strtoll(v[j+3],NULL,10);
+
+ server.client_obuf_limits[class].hard_limit_bytes = hard;
+ server.client_obuf_limits[class].soft_limit_bytes = soft;
+ server.client_obuf_limits[class].soft_limit_seconds = soft_seconds;
+ }
+ sdsfreesplitres(v,vlen);
+ } else if (!strcasecmp(c->argv[2]->ptr,"stop-writes-on-bgsave-error")) {
+ int yn = yesnotoi(o->ptr);
+
+ if (yn == -1) goto badfmt;
+ server.stop_writes_on_bgsave_err = yn;
+ } else if (!strcasecmp(c->argv[2]->ptr,"repl-ping-slave-period")) {
+ if (getLongLongFromObject(o,&ll) == REDIS_ERR || ll <= 0) goto badfmt;
+ server.repl_ping_slave_period = ll;
+ } else if (!strcasecmp(c->argv[2]->ptr,"repl-timeout")) {
+ if (getLongLongFromObject(o,&ll) == REDIS_ERR || ll <= 0) goto badfmt;
+ server.repl_timeout = ll;
+ } else if (!strcasecmp(c->argv[2]->ptr,"watchdog-period")) {
+ if (getLongLongFromObject(o,&ll) == REDIS_ERR || ll < 0) goto badfmt;
+ if (ll)
+ enableWatchdog(ll);
+ else
+ disableWatchdog();
+ } else if (!strcasecmp(c->argv[2]->ptr,"rdbcompression")) {
+ int yn = yesnotoi(o->ptr);
+
+ if (yn == -1) goto badfmt;
+ server.rdb_compression = yn;
+ } else if (!strcasecmp(c->argv[2]->ptr,"rdbchecksum")) {
+ int yn = yesnotoi(o->ptr);
+
+ if (yn == -1) goto badfmt;
+ server.rdb_checksum = yn;