X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=postlicyd%2Fmain-postlicyd.c;h=e75965f0a703c2c630f6e905c52f13ca643a4514;hb=9fc48ba2176a71585c13cd346968bdba499e80de;hp=7d6970de1e37c482f2cb14cb511e6fcf613f3e84;hpb=9b993811fe1fd208afd954e86c0bfc81a78af04f;p=apps%2Fpfixtools.git diff --git a/postlicyd/main-postlicyd.c b/postlicyd/main-postlicyd.c index 7d6970d..e75965f 100644 --- a/postlicyd/main-postlicyd.c +++ b/postlicyd/main-postlicyd.c @@ -42,6 +42,7 @@ #include "policy_tokens.h" #include "server.h" #include "query.h" +#include "config.h" #define DAEMON_NAME "postlicyd" #define DEFAULT_PORT 10000 @@ -66,6 +67,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; @@ -86,7 +88,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); @@ -165,25 +167,37 @@ static void policy_answer(server_t *pcy, const char *fmt, ...) epoll_modify(pcy->fd, EPOLLIN | EPOLLOUT, pcy); } -static bool policy_run_filter(const query_t* query, void* filter, void* conf) -{ - return false; -} - -static void policy_process(server_t *pcy) +static void policy_process(server_t *pcy, config_t *config) { const query_t* query = pcy->data; - if (!policy_run_filter(query, NULL, NULL)) { + filter_t *filter; + if (config->entry_points[query->state] == -1) { + syslog(LOG_WARNING, "no filter defined for current protocol_state (%d)", query->state); policy_answer(pcy, "DUNNO"); + return; + } + filter = array_ptr(config->filters, config->entry_points[query->state]); + while (true) { + filter_hook_t *hook = filter_run(filter, query); + if (hook == NULL) { + policy_answer(pcy, "DUNNO"); + return; + } else if (hook->postfix) { + policy_answer(pcy, "%s", hook->value); + return; + } else { + filter = array_ptr(config->filters, hook->filter_id); + } } } -static int policy_run(server_t *pcy, void* config) +static int policy_run(server_t *pcy, void* vconfig) { ssize_t search_offs = MAX(0, pcy->ibuf.len - 1); int nb = buffer_read(&pcy->ibuf, pcy->fd, -1); const char *eoq; - query_t* query = pcy->data; + query_t *query = pcy->data; + config_t *config = vconfig; if (nb < 0) { if (errno == EAGAIN || errno == EINTR) @@ -204,7 +218,7 @@ static int policy_run(server_t *pcy, void* config) return -1; query->eoq = eoq + strlen("\n\n"); epoll_modify(pcy->fd, 0, pcy); - policy_process(pcy); + policy_process(pcy, config); return 0; } @@ -260,11 +274,20 @@ int main(int argc, char *argv[]) return EXIT_FAILURE; } + config_t *config = config_read(argv[optind]); + if (config == NULL) { + return EXIT_FAILURE; + } + if (common_setup(pidfile, false, RUNAS_USER, RUNAS_GROUP, daemonize) != EXIT_SUCCESS || start_listener(port) < 0) { 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); + config_delete(&config); + return res; + } }