X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=postlicyd%2Fmain-postlicyd.c;h=5f46e76e2377171cd1d242f6e3976fcccdb1c4f1;hb=96cc004ee0a3dd1f32cf8386f1c10577d423eec9;hp=ad6102908c37f83932b2b443db47eb8715f02c89;hpb=86bf8f7a016cfd8475ffc363a4cac0a29a4aacfd;p=apps%2Fpfixtools.git diff --git a/postlicyd/main-postlicyd.c b/postlicyd/main-postlicyd.c index ad61029..5f46e76 100644 --- a/postlicyd/main-postlicyd.c +++ b/postlicyd/main-postlicyd.c @@ -56,6 +56,11 @@ static void *query_starter(server_t* server) return query_new(); } +static bool config_refresh(void *config) +{ + return config_reload(config); +} + static int postfix_parsejob(query_t *query, char *p) { #define PARSE_CHECK(expr, error, ...) \ @@ -67,6 +72,7 @@ static int postfix_parsejob(query_t *query, char *p) } while (0) p_clear(query, 1); + query->state = SMTP_UNKNOWN; while (*p != '\n') { char *k, *v; int klen, vlen, vtk; @@ -87,7 +93,7 @@ static int postfix_parsejob(query_t *query, char *p) vtk = policy_tokenize(v, vlen); switch (policy_tokenize(k, klen)) { -#define CASE(up, low) case PTK_##up: query->low = v; v[vlen] = '\0'; break; +#define CASE(up, low) case PTK_##up: query->low = v; v[vlen] = '\0'; syslog(LOG_DEBUG, "%s = %s", ptokens[PTK_##up], query->low); break; CASE(HELO_NAME, helo_name); CASE(QUEUE_ID, queue_id); CASE(SENDER, sender); @@ -166,18 +172,23 @@ static void policy_answer(server_t *pcy, const char *fmt, ...) epoll_modify(pcy->fd, EPOLLIN | EPOLLOUT, pcy); } -static void policy_process(server_t *pcy, config_t *config) +static bool policy_process(server_t *pcy, const config_t *config) { const query_t* query = pcy->data; - filter_t *filter = array_ptr(config->filters, config->entry_point); + const filter_t *filter; + if (config->entry_points[query->state] == -1) { + syslog(LOG_WARNING, "no filter defined for current protocol_state (%d)", query->state); + return false; + } + filter = array_ptr(config->filters, config->entry_points[query->state]); while (true) { - filter_hook_t *hook = filter_run(filter, query); + const filter_hook_t *hook = filter_run(filter, query); if (hook == NULL) { - policy_answer(pcy, "DUNNO"); - return; + syslog(LOG_WARNING, "request aborted"); + return false; } else if (hook->postfix) { policy_answer(pcy, "%s", hook->value); - return; + return true; } else { filter = array_ptr(config->filters, hook->filter_id); } @@ -186,11 +197,11 @@ static void policy_process(server_t *pcy, config_t *config) static int policy_run(server_t *pcy, void* vconfig) { - ssize_t search_offs = MAX(0, pcy->ibuf.len - 1); + ssize_t search_offs = MAX(0, (ssize_t)(pcy->ibuf.len - 1)); int nb = buffer_read(&pcy->ibuf, pcy->fd, -1); const char *eoq; query_t *query = pcy->data; - config_t *config = vconfig; + const config_t *config = vconfig; if (nb < 0) { if (errno == EAGAIN || errno == EINTR) @@ -211,8 +222,7 @@ static int policy_run(server_t *pcy, void* vconfig) return -1; query->eoq = eoq + strlen("\n\n"); epoll_modify(pcy->fd, 0, pcy); - policy_process(pcy, config); - return 0; + return policy_process(pcy, config) ? 0 : -1; } int start_listener(int port) @@ -241,6 +251,7 @@ int main(int argc, char *argv[]) const char *pidfile = NULL; bool daemonize = true; int port = DEFAULT_PORT; + bool port_from_cli = false; for (int c = 0; (c = getopt(argc, argv, "hf" "l:p:")) >= 0; ) { switch (c) { @@ -252,6 +263,7 @@ int main(int argc, char *argv[]) break; case 'l': port = atoi(optarg); + port_from_cli = true; break; case 'f': daemonize = false; @@ -271,12 +283,20 @@ int main(int argc, char *argv[]) if (config == NULL) { return EXIT_FAILURE; } + if (port_from_cli || config->port == 0) { + config->port = port; + } if (common_setup(pidfile, false, RUNAS_USER, RUNAS_GROUP, daemonize) != EXIT_SUCCESS - || start_listener(port) < 0) { + || start_listener(config->port) < 0) { + config_delete(&config); return EXIT_FAILURE; } - return server_loop(query_starter, (delete_client_t)query_delete, - policy_run, NULL); + { + int res = server_loop(query_starter, (delete_client_t)query_delete, + policy_run, config_refresh, config); + config_delete(&config); + return res; + } }