X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=main-postlicyd.c;h=fe4a8516ca180f60ad7850fc67d119dfd5920ac1;hb=1c42f5f8ed1972f13424197e9493bbed8e401576;hp=b81a813e3733640d7fa02fc1867f749623c880cd;hpb=083a49e2edd85f2aa4cc949f4cbf4e7b00cdb88c;p=apps%2Fpfixtools.git diff --git a/main-postlicyd.c b/main-postlicyd.c index b81a813..fe4a851 100644 --- a/main-postlicyd.c +++ b/main-postlicyd.c @@ -33,13 +33,12 @@ * Copyright © 2006-2007 Pierre Habouzit */ -#include -#include #include -#include "common.h" +#include "epoll.h" +#include "threads.h" -volatile int nbthreads = 0; +/* administrivia {{{ */ static int main_initialize(void) { @@ -52,55 +51,87 @@ static int main_initialize(void) return 0; } -void *job_run(void *_fd) +static void main_shutdown(void) { - int fd = (intptr_t)_fd; + closelog(); +} + +module_init(main_initialize); +module_exit(main_shutdown); +/* }}} */ + +void *job_run(int fd, void *data) +{ close(fd); return NULL; } -static void main_loop(void) +static int main_loop(void) { + int exitcode = EXIT_SUCCESS; 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); + thread_launch(job_run, fd, NULL); + threads_join(); } close(sock); + return exitcode; } -static void main_shutdown(void) +int main(int argc, char *argv[]) { - closelog(); -} + const char *pidfile = NULL; + FILE *f = NULL; + int res; + + for (int c = 0; (c = getopt(argc, argv, "h" "p:")) >= 0; ) { + switch (c) { + case 'p': + pidfile = optarg; + break; + default: + //usage(); + return EXIT_FAILURE; + } + } -module_init(main_initialize); -module_exit(main_shutdown); + if (pidfile) { + f = fopen(pidfile, "w"); + if (!f) { + syslog(LOG_CRIT, "unable to write pidfile %s", pidfile); + } + fprintf(f, "%d\n", getpid()); + fflush(f); + } -int main(void) -{ - if (atexit(common_shutdown)) { - fputs("Cannot hook my atexit function, quitting !\n", stderr); + if (daemon_detach() < 0) { + syslog(LOG_CRIT, "unable to fork"); return EXIT_FAILURE; } - common_initialize(); - main_loop(); - syslog(LOG_INFO, cleanexit ? "Stopping..." : "Unclean exit..."); - return EXIT_SUCCESS; + if (f) { + rewind(f); + ftruncate(fileno(f), 0); + fprintf(f, "%d\n", getpid()); + fflush(f); + } + res = main_loop(); + if (f) { + rewind(f); + ftruncate(fileno(f), 0); + fclose(f); + f = NULL; + } + syslog(LOG_INFO, "Stopping..."); + return res; }