X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=postlicyd.c;h=051e83baef720a962058c61644f1cc26b20e18ac;hb=1ff926eac33152aee930a454ac1d3dec6e6e5faf;hp=d980d20f97e07a011665c08db2c640535e1a1d9b;hpb=9a4efa4f0dc893f243ee69d1b20f024666ca943d;p=apps%2Fpfixtools.git diff --git a/postlicyd.c b/postlicyd.c index d980d20..051e83b 100644 --- a/postlicyd.c +++ b/postlicyd.c @@ -1,5 +1,5 @@ /******************************************************************************/ -/* postlicyd: a postfix policy daemon with a lot of features */ +/* pfixtools: a collection of postfix related tools */ /* ~~~~~~~~~ */ /* ________________________________________________________________________ */ /* */ @@ -30,10 +30,77 @@ /******************************************************************************/ /* - * Copyright © 2006 Pierre Habouzit + * Copyright © 2006-2007 Pierre Habouzit */ -int main(void) +#include +#include +#include + +#include "common.h" + +volatile int nbthreads = 0; + +static int main_initialize(void) { + openlog("postlicyd", LOG_PID, LOG_MAIL); + signal(SIGPIPE, SIG_IGN); + signal(SIGINT, &common_sighandler); + signal(SIGTERM, &common_sighandler); + syslog(LOG_INFO, "Starting..."); return 0; } + +void *job_run(void *_fd) +{ + int fd = (intptr_t)_fd; + + close(fd); + return NULL; +} + +static void main_loop(void) +{ + int sock = -1; + + while (!sigint) { + int fd = accept(sock, NULL, 0); + pthread_attr_t attr; + pthread_t dummy; + + if (fd < 0) { + if (errno != EINTR || errno != EAGAIN) + UNIXERR("accept"); + continue; + } + + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + pthread_create(&dummy, &attr, job_run, (void *)(intptr_t)fd); + pthread_attr_destroy(&attr); + } + + cleanexit = true; + close(sock); +} + +static void main_shutdown(void) +{ + syslog(LOG_INFO, cleanexit ? "Stopping..." : "Unclean exit..."); + closelog(); +} + +module_init(main_initialize); +module_exit(main_shutdown); + +int main(void) +{ + if (atexit(common_shutdown)) { + fputs("Cannot hook my atexit function, quitting !\n", stderr); + return EXIT_FAILURE; + } + + common_initialize(); + main_loop(); + return EXIT_SUCCESS; +}