#include "envtoconfitems.h"
#include "ccache.h"
+enum handle_conf_result {
+ HANDLE_CONF_OK,
+ HANDLE_CONF_UNKNOWN,
+ HANDLE_CONF_FAIL
+};
+
static const struct conf_item *
find_conf(const char *name)
{
return envtoconfitems_get(name, strlen(name));
}
-static bool
+static enum handle_conf_result
handle_conf_setting(struct conf *conf, const char *key, const char *value,
char **errmsg, bool from_env_variable, bool negate_boolean,
const char *origin)
{
const struct conf_item *item = find_conf(key);
if (!item) {
- *errmsg = format("unknown configuration option \"%s\"", key);
- return false;
+ return HANDLE_CONF_UNKNOWN;
}
if (from_env_variable && item->parser == confitem_parse_bool) {
}
if (!item->parser(value, (char *)conf + item->offset, errmsg)) {
- return false;
+ return HANDLE_CONF_FAIL;
}
if (item->verifier && !item->verifier((char *)conf + item->offset, errmsg)) {
- return false;
+ return HANDLE_CONF_FAIL;
}
out:
conf->item_origins[item->number] = origin;
- return true;
+ return HANDLE_CONF_OK;
}
static bool
char *key;
char *value;
char *errmsg2;
+ enum handle_conf_result hcr = HANDLE_CONF_OK;
bool ok = parse_line(buf, &key, &value, &errmsg2);
if (ok && key) { // key == NULL if comment or blank line.
- ok = handle_conf_setting(conf, key, value, &errmsg2, false, false, path);
+ hcr =
+ handle_conf_setting(conf, key, value, &errmsg2, false, false, path);
+ ok = hcr != HANDLE_CONF_FAIL; // unknown is OK
}
free(key);
free(value);
}
char *errmsg2;
- bool ok = handle_conf_setting(
+ enum handle_conf_result hcr = handle_conf_setting(
conf, env_to_conf_item->conf_name, q, &errmsg2, true, negate,
"environment");
- if (!ok) {
+ if (hcr != HANDLE_CONF_OK) {
*errmsg = format("%s: %s", key, errmsg2);
free(errmsg2);
free(key);
conf_free(conf);
}
-TEST(conf_read_with_bad_config_key)
+TEST(conf_read_with_unknown_config_key)
{
struct conf *conf = conf_create();
char *errmsg;
create_file("ccache.conf", "# Comment\nfoo = bar");
- CHECK(!conf_read(conf, "ccache.conf", &errmsg));
- CHECK_INT_EQ(errno, 0);
- CHECK_STR_EQ_FREE2("ccache.conf:2: unknown configuration option \"foo\"",
- errmsg);
+ CHECK(conf_read(conf, "ccache.conf", &errmsg));
conf_free(conf);
}
CHECK_STR_EQ_FREE2("path = vanilla\nstats = chocolate\n", data);
}
+TEST(conf_set_unknown_option)
+{
+ char *errmsg;
+ char *data;
+
+ create_file("ccache.conf", "path = chocolate\nstats = chocolate\n");
+ CHECKM(!conf_set_value_in_file("ccache.conf", "foo", "bar", &errmsg),
+ errmsg);
+ CHECK_STR_EQ_FREE2("unknown configuration option \"foo\"", errmsg);
+
+ data = read_text_file("ccache.conf", 0);
+ CHECK(data);
+ CHECK_STR_EQ_FREE2("path = chocolate\nstats = chocolate\n", data);
+}
+
TEST(conf_print_existing_value)
{
struct conf *conf = conf_create();