*/
config_param_register("verify_filter");
+
+/* Where to bind the server.
+ */
+config_param_register("port");
+
+
+static config_t *global_config = NULL;
+
static inline config_t *config_new(void)
{
config_t *config = p_new(config_t, 1);
+ global_config = config;
return config;
}
if (*config) {
config_close(*config);
p_delete(config);
+ global_config = NULL;
}
}
+static void config_exit()
+{
+ if (global_config) {
+ config_delete(&global_config);
+ }
+}
+module_exit(config_exit);
static bool config_second_pass(config_t *config)
{
}
ok = false;
+#define PARSE_CHECK(Expr, Fmt, ...) \
+ if (!(Expr)) { \
+ err(Fmt, ##__VA_ARGS__); \
+ return false; \
+ }
foreach (filter_param_t *param, config->params) {
switch (param->type) {
#define CASE(Param, State) \
ok = true; \
config->entry_points[SMTP_ ## State] \
= filter_find_with_name(&config->filters, param->value); \
+ PARSE_CHECK(config->entry_points[SMTP_ ## State] >= 0, \
+ "invalid filter name %s", param->value); \
break;
CASE(CLIENT, CONNECT)
CASE(EHLO, EHLO)
CASE(VERIFY, VRFY)
CASE(ETRN, ETRN)
#undef CASE
+ FILTER_PARAM_PARSE_INT(PORT, config->port);
default: break;
}
}}
array_deep_wipe(config->params, filter_params_wipe);
if (!ok) {
- syslog(LOG_ERR, "no entry point defined");
+ err("no entry point defined");
}
return ok;
char key[BUFSIZ];
char value[BUFSIZ];
- ssize_t key_len, value_len;
+ int key_len, value_len;
if (!file_map_open(&map, config->filename, false)) {
return false;
linep = p = map.map;
#define READ_LOG(Lev, Fmt, ...) \
- syslog(LOG_ ## Lev, "config file %s:%d:%d: " Fmt, config->filename, \
- line + 1, p - linep + 1, ##__VA_ARGS__)
+ __log(LOG_ ## Lev, "config file %s:%d:%d: " Fmt, config->filename, \
+ line + 1, (int)(p - linep + 1), ##__VA_ARGS__)
#define READ_ERROR(Fmt, ...) \
do { \
READ_LOG(ERR, Fmt, ##__VA_ARGS__); \
return true;
badeof:
- syslog(LOG_ERR, "Unexpected end of file");
+ err("Unexpected end of file");
error:
if (filter.name) {
config_t *config = config_new();
config->filename = file;
if (!config_reload(config)) {
- p_delete(&config);
+ config_delete(&config);
return NULL;
}
return config;