CFG_PARSER *cfg_parser_alloc(const char *pname) { const char *myname = "cfg_parser_alloc"; CFG_PARSER *parser; DICT *dict; if (pname == 0 || *pname == 0) msg_fatal("%s: null parser name", myname); parser = (CFG_PARSER *) mymalloc(sizeof(*parser)); parser->name = mystrdup(pname); if (*parser->name == '/' || *parser->name == '.') { if (dict_load_file_xt(parser->name, parser->name) == 0) { myfree(parser->name); myfree((void *) parser); return (0); } parser->get_str = get_dict_str; parser->get_int = get_dict_int; parser->get_bool = get_dict_bool; dict = dict_handle(parser->name); } else { parser->get_str = get_main_str; parser->get_int = get_main_int; parser->get_bool = get_main_bool; dict = dict_handle(CONFIG_DICT); /* XXX Use proper API */ } if (dict == 0) msg_panic("%s: dict_handle failed", myname); parser->owner = dict->owner; return (parser); }
void mail_conf_suck(void) { char *config_dir; char *path; /* * Permit references to unknown configuration variable names. We rely on * a separate configuration checking tool to spot misspelled names and * other kinds of trouble. Enter the configuration directory into the * default dictionary. */ if (var_config_dir) myfree(var_config_dir); if ((config_dir = getenv(CONF_ENV_PATH)) == 0) config_dir = DEF_CONFIG_DIR; var_config_dir = mystrdup(config_dir); set_mail_conf_str(VAR_CONFIG_DIR, var_config_dir); /* * If the configuration directory name comes from a different trust * domain, require that it is listed in the default main.cf file. */ if (strcmp(var_config_dir, DEF_CONFIG_DIR) != 0 /* non-default */ && safe_getenv(CONF_ENV_PATH) == 0 /* non-default */ && geteuid() != 0) /* untrusted */ mail_conf_checkdir(var_config_dir); path = concatenate(var_config_dir, "/", "main.cf", (char *) 0); if (dict_load_file_xt(CONFIG_DICT, path) == 0) msg_fatal("open %s: %m", path); myfree(path); }
void pcf_read_parameters(void) { char *path; /* * A direct rip-off of mail_conf_read(). XXX Avoid code duplication by * better code decomposition. */ pcf_set_config_dir(); path = concatenate(var_config_dir, "/", MAIN_CONF_FILE, (char *) 0); if (dict_load_file_xt(CONFIG_DICT, path) == 0) msg_fatal("open %s: %m", path); myfree(path); }