aboutsummaryrefslogtreecommitdiff
path: root/src/app
diff options
context:
space:
mode:
Diffstat (limited to 'src/app')
-rw-r--r--src/app/config/config.c9
-rw-r--r--src/app/config/confparse.c45
-rw-r--r--src/app/config/confparse.h4
3 files changed, 36 insertions, 22 deletions
diff --git a/src/app/config/config.c b/src/app/config/config.c
index 5f7a82d15a..d240a73fe6 100644
--- a/src/app/config/config.c
+++ b/src/app/config/config.c
@@ -960,8 +960,8 @@ set_options(or_options_t *new_val, char **msg)
for (i=0; options_format.vars[i].member.name; ++i) {
const config_var_t *var = &options_format.vars[i];
const char *var_name = var->member.name;
- if (var->member.type == CONFIG_TYPE_LINELIST_S ||
- var->member.type == CONFIG_TYPE_OBSOLETE) {
+ if (config_var_is_contained(var)) {
+ /* something else will check this var, or it doesn't need checking */
continue;
}
if (!config_is_same(&options_format, new_val, old_options, var_name)) {
@@ -2663,9 +2663,10 @@ list_torrc_options(void)
int i;
for (i = 0; option_vars_[i].member.name; ++i) {
const config_var_t *var = &option_vars_[i];
- if (var->member.type == CONFIG_TYPE_OBSOLETE ||
- var->member.type == CONFIG_TYPE_LINELIST_V)
+ if (! config_var_is_settable(var)) {
+ /* This variable cannot be set, or cannot be set by this name. */
continue;
+ }
printf("%s\n", var->member.name);
}
}
diff --git a/src/app/config/confparse.c b/src/app/config/confparse.c
index 2890d8c81b..0d19974d70 100644
--- a/src/app/config/confparse.c
+++ b/src/app/config/confparse.c
@@ -148,6 +148,24 @@ config_count_options(const config_format_t *fmt)
return i;
}
+bool
+config_var_is_cumulative(const config_var_t *var)
+{
+ return struct_var_is_cumulative(&var->member);
+}
+bool
+config_var_is_settable(const config_var_t *var)
+{
+ if (var->flags & CVFLAG_OBSOLETE)
+ return false;
+ return struct_var_is_settable(&var->member);
+}
+bool
+config_var_is_contained(const config_var_t *var)
+{
+ return struct_var_is_contained(&var->member);
+}
+
/*
* Functions to assign config options.
*/
@@ -183,14 +201,7 @@ config_mark_lists_fragile(const config_format_t *fmt, void *options)
for (i = 0; fmt->vars[i].member.name; ++i) {
const config_var_t *var = &fmt->vars[i];
- config_line_t *list;
- if (var->member.type != CONFIG_TYPE_LINELIST &&
- var->member.type != CONFIG_TYPE_LINELIST_V)
- continue;
-
- list = *(config_line_t **)STRUCT_VAR_P(options, var->member.offset);
- if (list)
- list->fragile = 1;
+ struct_var_mark_fragile(options, &var->member);
}
}
@@ -255,9 +266,7 @@ config_assign_line(const config_format_t *fmt, void *options,
if (!strlen(c->value)) {
/* reset or clear it, then return */
if (!clear_first) {
- if ((var->member.type == CONFIG_TYPE_LINELIST ||
- var->member.type == CONFIG_TYPE_LINELIST_S) &&
- c->command != CONFIG_LINE_CLEAR) {
+ if (config_var_is_cumulative(var) && c->command != CONFIG_LINE_CLEAR) {
/* We got an empty linelist from the torrc or command line.
As a special case, call this an error. Warn and ignore. */
log_warn(LD_CONFIG,
@@ -273,8 +282,7 @@ config_assign_line(const config_format_t *fmt, void *options,
config_reset(fmt, options, var, use_defaults); // LCOV_EXCL_LINE
}
- if (options_seen && (var->member.type != CONFIG_TYPE_LINELIST &&
- var->member.type != CONFIG_TYPE_LINELIST_S)) {
+ if (options_seen && ! config_var_is_cumulative(var)) {
/* We're tracking which options we've seen, and this option is not
* supposed to occur more than once. */
int var_index = (int)(var - fmt->vars);
@@ -562,10 +570,10 @@ config_dup(const config_format_t *fmt, const void *old)
newopts = config_new(fmt);
for (i=0; fmt->vars[i].member.name; ++i) {
- if (fmt->vars[i].member.type == CONFIG_TYPE_LINELIST_S)
- continue;
- if (fmt->vars[i].member.type == CONFIG_TYPE_OBSOLETE)
+ if (config_var_is_contained(&fmt->vars[i])) {
+ // Something else will copy this option, or it doesn't need copying.
continue;
+ }
if (struct_var_copy(newopts, old, &fmt->vars[i].member) < 0) {
// LCOV_EXCL_START
log_err(LD_BUG, "Unable to copy value for %s.",
@@ -629,9 +637,10 @@ config_dump(const config_format_t *fmt, const void *default_options,
elements = smartlist_new();
for (i=0; fmt->vars[i].member.name; ++i) {
int comment_option = 0;
- if (fmt->vars[i].member.type == CONFIG_TYPE_OBSOLETE ||
- fmt->vars[i].member.type == CONFIG_TYPE_LINELIST_S)
+ if (config_var_is_contained(&fmt->vars[i])) {
+ // Something else will dump this option, or it doesn't need dumping.
continue;
+ }
/* Don't save 'hidden' control variables. */
if (!strcmpstart(fmt->vars[i].member.name, "__"))
continue;
diff --git a/src/app/config/confparse.h b/src/app/config/confparse.h
index 6d63ba3e0e..c53e3224db 100644
--- a/src/app/config/confparse.h
+++ b/src/app/config/confparse.h
@@ -104,6 +104,10 @@ const char *config_expand_abbrev(const config_format_t *fmt,
int command_line, int warn_obsolete);
void warn_deprecated_option(const char *what, const char *why);
+bool config_var_is_cumulative(const config_var_t *var);
+bool config_var_is_settable(const config_var_t *var);
+bool config_var_is_contained(const config_var_t *var);
+
/* Helper macros to compare an option across two configuration objects */
#define CFG_EQ_BOOL(a,b,opt) ((a)->opt == (b)->opt)
#define CFG_EQ_INT(a,b,opt) ((a)->opt == (b)->opt)