64bits fixes.
[apps/pfixtools.git] / postlicyd / config.c
index e971e15..672faca 100644 (file)
@@ -72,9 +72,18 @@ config_param_register("ehlo_filter");
  */
 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;
 }
 
@@ -92,9 +101,17 @@ void config_delete(config_t **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)
 {
@@ -121,6 +138,11 @@ 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)                                                   \
@@ -128,6 +150,8 @@ static bool config_second_pass(config_t *config)
               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)
@@ -139,13 +163,14 @@ static bool config_second_pass(config_t *config)
           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;
@@ -163,7 +188,7 @@ static bool config_load(config_t *config)
 
     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;
@@ -174,8 +199,8 @@ static bool config_load(config_t *config)
     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__);                                     \
@@ -378,7 +403,7 @@ ok:
     return true;
 
 badeof:
-    syslog(LOG_ERR, "Unexpected end of file");
+    err("Unexpected end of file");
 
 error:
     if (filter.name) {
@@ -398,7 +423,7 @@ config_t *config_read(const char *file)
     config_t *config = config_new();
     config->filename = file;
     if (!config_reload(config)) {
-        p_delete(&config);
+        config_delete(&config);
         return NULL;
     }
     return config;