X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=postlicyd.c;h=bd887e45a1ba9e6888545de8859f87e62d59c0d5;hb=79ff3ad0aaa667dc9ce658460632177c8ffcf39e;hp=03675ad3bd382c246dd576bde4a2ccb50d75df6e;hpb=cde61dd0b59b0f3f3b3afefafd045f8d75b32975;p=apps%2Fpfixtools.git diff --git a/postlicyd.c b/postlicyd.c index 03675ad..bd887e4 100644 --- a/postlicyd.c +++ b/postlicyd.c @@ -30,39 +30,99 @@ /******************************************************************************/ /* - * Copyright © 2006 Pierre Habouzit + * Copyright © 2006-2007 Pierre Habouzit */ -#include -#include -#include -#include +#include +#include +#include -#include "job.h" +#include "postlicyd.h" -bool cleanexit = false; +static sig_atomic_t cleanexit = false; +static sig_atomic_t sigint = false; +static volatile int nbthreads = 0; -void shutdown(void) +static void main_sighandler(int sig) +{ + static time_t lastintr = 0; + time_t now = time(NULL); + + switch (sig) { + case SIGINT: + if (sigint) { + if (now - lastintr >= 1) + break; + } else { + lastintr = now; + sigint = true; + } + return; + + case SIGTERM: + break; + + default: + return; + } + + syslog(LOG_ERR, "Killed..."); + exit(-1); +} + +static void main_initialize(void) +{ + openlog("postlicyd", LOG_PID, LOG_MAIL); + signal(SIGPIPE, SIG_IGN); + signal(SIGINT, &main_sighandler); + signal(SIGTERM, &main_sighandler); + syslog(LOG_INFO, "Starting..."); +} + +void *job_run(void *_fd) +{ + int fd = (intptr_t)_fd; + + close(fd); + return NULL; +} + +static void main_loop(void) +{ + while (!sigint) { + int fd = accept(-1, 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); + } +} + +static void main_shutdown(void) { syslog(LOG_INFO, cleanexit ? "Stopping..." : "Unclean exit..."); - job_shutdown(); closelog(); } int main(void) { - if (atexit(shutdown)) { + if (atexit(main_shutdown)) { fputs("Cannot hook my atexit function, quitting !\n", stderr); - return EX_CONFIG; + return EXIT_FAILURE; } - openlog("postlicyd", LOG_PID, LOG_MAIL); - job_initialize(); - syslog(LOG_INFO, "Starting..."); - - job_loop(); - + main_initialize(); + main_loop(); cleanexit = true; - shutdown(); - return 0; + main_shutdown(); + return EXIT_SUCCESS; }