|
|
|
@@ -241,11 +241,16 @@ typedef struct typeInterface {
|
|
|
|
|
typedef struct standardConfig {
|
|
|
|
|
const char *name; /* The user visible name of this config */
|
|
|
|
|
const char *alias; /* An alias that can also be used for this config */
|
|
|
|
|
const int modifiable; /* Can this value be updated by CONFIG SET? */
|
|
|
|
|
const unsigned int flags; /* Flags for this specific config */
|
|
|
|
|
typeInterface interface; /* The function pointers that define the type interface */
|
|
|
|
|
typeData data; /* The type specific data exposed used by the interface */
|
|
|
|
|
} standardConfig;
|
|
|
|
|
|
|
|
|
|
#define MODIFIABLE_CONFIG 0 /* This is the implied default for a standard
|
|
|
|
|
* config, which is mutable. */
|
|
|
|
|
#define IMMUTABLE_CONFIG (1ULL<<0) /* Can this value only be set at startup? */
|
|
|
|
|
#define SENSITIVE_CONFIG (1ULL<<1) /* Does this value contain sensitive information */
|
|
|
|
|
|
|
|
|
|
standardConfig configs[];
|
|
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
|
|
@@ -712,9 +717,13 @@ void configSetCommand(client *c) {
|
|
|
|
|
|
|
|
|
|
/* Iterate the configs that are standard */
|
|
|
|
|
for (standardConfig *config = configs; config->name != NULL; config++) {
|
|
|
|
|
if(config->modifiable && (!strcasecmp(c->argv[2]->ptr,config->name) ||
|
|
|
|
|
if (!(config->flags & IMMUTABLE_CONFIG) &&
|
|
|
|
|
(!strcasecmp(c->argv[2]->ptr,config->name) ||
|
|
|
|
|
(config->alias && !strcasecmp(c->argv[2]->ptr,config->alias))))
|
|
|
|
|
{
|
|
|
|
|
if (config->flags & SENSITIVE_CONFIG) {
|
|
|
|
|
preventCommandLogging(c);
|
|
|
|
|
}
|
|
|
|
|
if (!config->interface.set(config->data,o->ptr,1,&errstr)) {
|
|
|
|
|
goto badfmt;
|
|
|
|
|
}
|
|
|
|
@@ -1709,13 +1718,10 @@ int rewriteConfig(char *path, int force_all) {
|
|
|
|
|
#define LOADBUF_SIZE 256
|
|
|
|
|
static char loadbuf[LOADBUF_SIZE];
|
|
|
|
|
|
|
|
|
|
#define MODIFIABLE_CONFIG 1
|
|
|
|
|
#define IMMUTABLE_CONFIG 0
|
|
|
|
|
|
|
|
|
|
#define embedCommonConfig(config_name, config_alias, is_modifiable) \
|
|
|
|
|
#define embedCommonConfig(config_name, config_alias, config_flags) \
|
|
|
|
|
.name = (config_name), \
|
|
|
|
|
.alias = (config_alias), \
|
|
|
|
|
.modifiable = (is_modifiable),
|
|
|
|
|
.flags = (config_flags),
|
|
|
|
|
|
|
|
|
|
#define embedConfigInterface(initfn, setfn, getfn, rewritefn) .interface = { \
|
|
|
|
|
.init = (initfn), \
|
|
|
|
@@ -1766,8 +1772,8 @@ static void boolConfigRewrite(typeData data, const char *name, struct rewriteCon
|
|
|
|
|
rewriteConfigYesNoOption(state, name,*(data.yesno.config), data.yesno.default_value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define createBoolConfig(name, alias, modifiable, config_addr, default, is_valid, update) { \
|
|
|
|
|
embedCommonConfig(name, alias, modifiable) \
|
|
|
|
|
#define createBoolConfig(name, alias, flags, config_addr, default, is_valid, update) { \
|
|
|
|
|
embedCommonConfig(name, alias, flags) \
|
|
|
|
|
embedConfigInterface(boolConfigInit, boolConfigSet, boolConfigGet, boolConfigRewrite) \
|
|
|
|
|
.data.yesno = { \
|
|
|
|
|
.config = &(config_addr), \
|
|
|
|
@@ -1839,8 +1845,8 @@ static void sdsConfigRewrite(typeData data, const char *name, struct rewriteConf
|
|
|
|
|
#define ALLOW_EMPTY_STRING 0
|
|
|
|
|
#define EMPTY_STRING_IS_NULL 1
|
|
|
|
|
|
|
|
|
|
#define createStringConfig(name, alias, modifiable, empty_to_null, config_addr, default, is_valid, update) { \
|
|
|
|
|
embedCommonConfig(name, alias, modifiable) \
|
|
|
|
|
#define createStringConfig(name, alias, flags, empty_to_null, config_addr, default, is_valid, update) { \
|
|
|
|
|
embedCommonConfig(name, alias, flags) \
|
|
|
|
|
embedConfigInterface(stringConfigInit, stringConfigSet, stringConfigGet, stringConfigRewrite) \
|
|
|
|
|
.data.string = { \
|
|
|
|
|
.config = &(config_addr), \
|
|
|
|
@@ -1851,8 +1857,8 @@ static void sdsConfigRewrite(typeData data, const char *name, struct rewriteConf
|
|
|
|
|
} \
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define createSDSConfig(name, alias, modifiable, empty_to_null, config_addr, default, is_valid, update) { \
|
|
|
|
|
embedCommonConfig(name, alias, modifiable) \
|
|
|
|
|
#define createSDSConfig(name, alias, flags, empty_to_null, config_addr, default, is_valid, update) { \
|
|
|
|
|
embedCommonConfig(name, alias, flags) \
|
|
|
|
|
embedConfigInterface(sdsConfigInit, sdsConfigSet, sdsConfigGet, sdsConfigRewrite) \
|
|
|
|
|
.data.sds = { \
|
|
|
|
|
.config = &(config_addr), \
|
|
|
|
@@ -1907,8 +1913,8 @@ static void enumConfigRewrite(typeData data, const char *name, struct rewriteCon
|
|
|
|
|
rewriteConfigEnumOption(state, name,*(data.enumd.config), data.enumd.enum_value, data.enumd.default_value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define createEnumConfig(name, alias, modifiable, enum, config_addr, default, is_valid, update) { \
|
|
|
|
|
embedCommonConfig(name, alias, modifiable) \
|
|
|
|
|
#define createEnumConfig(name, alias, flags, enum, config_addr, default, is_valid, update) { \
|
|
|
|
|
embedCommonConfig(name, alias, flags) \
|
|
|
|
|
embedConfigInterface(enumConfigInit, enumConfigSet, enumConfigGet, enumConfigRewrite) \
|
|
|
|
|
.data.enumd = { \
|
|
|
|
|
.config = &(config_addr), \
|
|
|
|
@@ -2061,8 +2067,8 @@ static void numericConfigRewrite(typeData data, const char *name, struct rewrite
|
|
|
|
|
#define INTEGER_CONFIG 0
|
|
|
|
|
#define MEMORY_CONFIG 1
|
|
|
|
|
|
|
|
|
|
#define embedCommonNumericalConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) { \
|
|
|
|
|
embedCommonConfig(name, alias, modifiable) \
|
|
|
|
|
#define embedCommonNumericalConfig(name, alias, flags, lower, upper, config_addr, default, memory, is_valid, update) { \
|
|
|
|
|
embedCommonConfig(name, alias, flags) \
|
|
|
|
|
embedConfigInterface(numericConfigInit, numericConfigSet, numericConfigGet, numericConfigRewrite) \
|
|
|
|
|
.data.numeric = { \
|
|
|
|
|
.lower_bound = (lower), \
|
|
|
|
@@ -2072,71 +2078,71 @@ static void numericConfigRewrite(typeData data, const char *name, struct rewrite
|
|
|
|
|
.update_fn = (update), \
|
|
|
|
|
.is_memory = (memory),
|
|
|
|
|
|
|
|
|
|
#define createIntConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
embedCommonNumericalConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
#define createIntConfig(name, alias, flags, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
embedCommonNumericalConfig(name, alias, flags, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
.numeric_type = NUMERIC_TYPE_INT, \
|
|
|
|
|
.config.i = &(config_addr) \
|
|
|
|
|
} \
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define createUIntConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
embedCommonNumericalConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
#define createUIntConfig(name, alias, flags, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
embedCommonNumericalConfig(name, alias, flags, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
.numeric_type = NUMERIC_TYPE_UINT, \
|
|
|
|
|
.config.ui = &(config_addr) \
|
|
|
|
|
} \
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define createLongConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
embedCommonNumericalConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
#define createLongConfig(name, alias, flags, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
embedCommonNumericalConfig(name, alias, flags, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
.numeric_type = NUMERIC_TYPE_LONG, \
|
|
|
|
|
.config.l = &(config_addr) \
|
|
|
|
|
} \
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define createULongConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
embedCommonNumericalConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
#define createULongConfig(name, alias, flags, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
embedCommonNumericalConfig(name, alias, flags, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
.numeric_type = NUMERIC_TYPE_ULONG, \
|
|
|
|
|
.config.ul = &(config_addr) \
|
|
|
|
|
} \
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define createLongLongConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
embedCommonNumericalConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
#define createLongLongConfig(name, alias, flags, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
embedCommonNumericalConfig(name, alias, flags, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
.numeric_type = NUMERIC_TYPE_LONG_LONG, \
|
|
|
|
|
.config.ll = &(config_addr) \
|
|
|
|
|
} \
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define createULongLongConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
embedCommonNumericalConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
#define createULongLongConfig(name, alias, flags, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
embedCommonNumericalConfig(name, alias, flags, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
.numeric_type = NUMERIC_TYPE_ULONG_LONG, \
|
|
|
|
|
.config.ull = &(config_addr) \
|
|
|
|
|
} \
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define createSizeTConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
embedCommonNumericalConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
#define createSizeTConfig(name, alias, flags, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
embedCommonNumericalConfig(name, alias, flags, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
.numeric_type = NUMERIC_TYPE_SIZE_T, \
|
|
|
|
|
.config.st = &(config_addr) \
|
|
|
|
|
} \
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define createSSizeTConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
embedCommonNumericalConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
#define createSSizeTConfig(name, alias, flags, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
embedCommonNumericalConfig(name, alias, flags, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
.numeric_type = NUMERIC_TYPE_SSIZE_T, \
|
|
|
|
|
.config.sst = &(config_addr) \
|
|
|
|
|
} \
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define createTimeTConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
embedCommonNumericalConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
#define createTimeTConfig(name, alias, flags, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
embedCommonNumericalConfig(name, alias, flags, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
.numeric_type = NUMERIC_TYPE_TIME_T, \
|
|
|
|
|
.config.tt = &(config_addr) \
|
|
|
|
|
} \
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define createOffTConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
embedCommonNumericalConfig(name, alias, modifiable, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
#define createOffTConfig(name, alias, flags, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
embedCommonNumericalConfig(name, alias, flags, lower, upper, config_addr, default, memory, is_valid, update) \
|
|
|
|
|
.numeric_type = NUMERIC_TYPE_OFF_T, \
|
|
|
|
|
.config.ot = &(config_addr) \
|
|
|
|
|
} \
|
|
|
|
@@ -2429,7 +2435,7 @@ standardConfig configs[] = {
|
|
|
|
|
createStringConfig("unixsocket", NULL, IMMUTABLE_CONFIG, EMPTY_STRING_IS_NULL, server.unixsocket, NULL, NULL, NULL),
|
|
|
|
|
createStringConfig("pidfile", NULL, IMMUTABLE_CONFIG, EMPTY_STRING_IS_NULL, server.pidfile, NULL, NULL, NULL),
|
|
|
|
|
createStringConfig("replica-announce-ip", "slave-announce-ip", MODIFIABLE_CONFIG, EMPTY_STRING_IS_NULL, server.slave_announce_ip, NULL, NULL, NULL),
|
|
|
|
|
createStringConfig("masteruser", NULL, MODIFIABLE_CONFIG, EMPTY_STRING_IS_NULL, server.masteruser, NULL, NULL, NULL),
|
|
|
|
|
createStringConfig("masteruser", NULL, MODIFIABLE_CONFIG | SENSITIVE_CONFIG, EMPTY_STRING_IS_NULL, server.masteruser, NULL, NULL, NULL),
|
|
|
|
|
createStringConfig("cluster-announce-ip", NULL, MODIFIABLE_CONFIG, EMPTY_STRING_IS_NULL, server.cluster_announce_ip, NULL, NULL, NULL),
|
|
|
|
|
createStringConfig("syslog-ident", NULL, IMMUTABLE_CONFIG, ALLOW_EMPTY_STRING, server.syslog_ident, "redis", NULL, NULL),
|
|
|
|
|
createStringConfig("dbfilename", NULL, MODIFIABLE_CONFIG, ALLOW_EMPTY_STRING, server.rdb_filename, "dump.rdb", isValidDBfilename, NULL),
|
|
|
|
@@ -2442,8 +2448,8 @@ standardConfig configs[] = {
|
|
|
|
|
createStringConfig("proc-title-template", NULL, MODIFIABLE_CONFIG, ALLOW_EMPTY_STRING, server.proc_title_template, CONFIG_DEFAULT_PROC_TITLE_TEMPLATE, isValidProcTitleTemplate, updateProcTitleTemplate),
|
|
|
|
|
|
|
|
|
|
/* SDS Configs */
|
|
|
|
|
createSDSConfig("masterauth", NULL, MODIFIABLE_CONFIG, EMPTY_STRING_IS_NULL, server.masterauth, NULL, NULL, NULL),
|
|
|
|
|
createSDSConfig("requirepass", NULL, MODIFIABLE_CONFIG, EMPTY_STRING_IS_NULL, server.requirepass, NULL, NULL, updateRequirePass),
|
|
|
|
|
createSDSConfig("masterauth", NULL, MODIFIABLE_CONFIG | SENSITIVE_CONFIG, EMPTY_STRING_IS_NULL, server.masterauth, NULL, NULL, NULL),
|
|
|
|
|
createSDSConfig("requirepass", NULL, MODIFIABLE_CONFIG | SENSITIVE_CONFIG, EMPTY_STRING_IS_NULL, server.requirepass, NULL, NULL, updateRequirePass),
|
|
|
|
|
|
|
|
|
|
/* Enum Configs */
|
|
|
|
|
createEnumConfig("supervised", NULL, IMMUTABLE_CONFIG, supervised_mode_enum, server.supervised_mode, SUPERVISED_NONE, NULL, NULL),
|
|
|
|
|