config->root_cs = cf_section_alloc(config, NULL, "main", NULL);
cf_section_set_unlang(config->root_cs);
- if ((cf_file_read(config->root_cs, filename) < 0) || (cf_section_pass2(config->root_cs) < 0)) {
+ if ((cf_file_read(config->root_cs, filename, true) < 0) || (cf_section_pass2(config->root_cs) < 0)) {
fprintf(stderr, "unit_test_map: Failed parsing %s\n", filename);
return EXIT_FAILURE;
}
/*
* Bootstrap a config file.
*/
-int cf_file_read(CONF_SECTION *cs, char const *filename)
+int cf_file_read(CONF_SECTION *cs, char const *filename, bool root)
{
int i;
- char *p;
- CONF_PAIR *cp;
fr_rb_tree_t *tree;
cf_stack_t stack;
cf_stack_frame_t *frame;
- cp = cf_pair_alloc(cs, "confdir", filename, T_OP_EQ, T_BARE_WORD, T_SINGLE_QUOTED_STRING);
- if (!cp) return -1;
+ /*
+ * Only add the default config directory if we're loading a top-level configuration file.
+ */
+ if (root) {
+ char *p;
+ CONF_PAIR *cp;
+
+ /*
+ * For compatibility, this goes first. And we don't care if there are too many '/'.
+ */
+ cp = cf_pair_alloc(cs, "raddbdir", filename, T_OP_EQ, T_BARE_WORD, T_SINGLE_QUOTED_STRING);
+ if (!cp) return -1;
- p = strrchr(cp->value, FR_DIR_SEP);
- if (p) *p = '\0';
+ /*
+ * This goes second, and we try to be nice about too many '/'.
+ */
+ cp = cf_pair_alloc(cs, "confdir", filename, T_OP_EQ, T_BARE_WORD, T_SINGLE_QUOTED_STRING);
+ if (!cp) return -1;
+
+ p = strrchr(cp->value, FR_DIR_SEP);
+ if (p) *p = '\0';
+ }
MEM(tree = fr_rb_inline_talloc_alloc(cs, cf_file_t, node, _inode_cmp, NULL));
/*
* Config file parsing
*/
-int cf_file_read(CONF_SECTION *cs, char const *file);
+int cf_file_read(CONF_SECTION *cs, char const *file, bool root);
int cf_section_pass2(CONF_SECTION *cs);
void cf_file_free(CONF_SECTION *cs);
cs = cf_section_alloc(NULL, NULL, "main", NULL);
if (!cs) return NULL;
- if ((cf_file_read(cs, filename) < 0) || (cf_section_pass2(cs) < 0)) {
+ if ((cf_file_read(cs, filename, false) < 0) || (cf_section_pass2(cs) < 0)) {
talloc_free(cs);
return NULL;
}
/* Read the configuration file */
snprintf(buffer, sizeof(buffer), "%.200s/%.50s.conf", config->confdir, config->name);
- if (cf_file_read(cs, buffer) < 0) {
+ if (cf_file_read(cs, buffer, true) < 0) {
ERROR("Error reading or parsing %s", buffer);
goto failure;
}
cs = cf_section_alloc(autofree, NULL, "main", NULL);
if (!cs) fr_exit_now(EXIT_FAILURE);
- if ((cf_file_read(cs, io_buffer) < 0) || (cf_section_pass2(cs) < 0)) {
+ if ((cf_file_read(cs, io_buffer, true) < 0) || (cf_section_pass2(cs) < 0)) {
fprintf(stderr, "%s: Errors reading or parsing %s\n", progname, io_buffer);
error:
fr_exit_now(EXIT_FAILURE);
/*
* Read configuration files if necessary.
*/
- if (filename && (cf_file_read(conf->cs, filename) < 0 || (cf_section_pass2(conf->cs) < 0))) {
+ if (filename && (cf_file_read(conf->cs, filename, true) < 0 || (cf_section_pass2(conf->cs) < 0))) {
fr_exit_now(EXIT_FAILURE);
}