X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=common%2Fcommon.c;h=1b8cd980b681040703db3717f756e676870d1b5b;hb=d622febc1fb702194f7ac3f95bfa6cba448dcc5b;hp=af95efa7378d96b383a3b27951b7eb4a6466aa1b;hpb=520b2f3bb198bfbb88b90b058ef610f0a9b980c6;p=apps%2Fpfixtools.git diff --git a/common/common.c b/common/common.c index af95efa..1b8cd98 100644 --- a/common/common.c +++ b/common/common.c @@ -41,33 +41,23 @@ #include "common.h" -sig_atomic_t sigint = false; -sig_atomic_t sighup = false; - -bool daemon_process = true; -int log_level = LOG_INFO; +bool daemon_process = true; +int log_level = LOG_INFO; +bool log_syslog = false; +const char *log_state = ""; static FILE *pidfile = NULL; void common_sighandler(int sig) { switch (sig) { - case SIGTERM: - case SIGINT: - sigint = true; - return; - - case SIGHUP: - sighup = true; - return; - default: - err("Killed (got signal %d)...", sig); + err("Killed (got signal %d)...", sig); exit(-1); } } -static int setnonblock(int sock) +int setnonblock(int sock) { int res = fcntl(sock, F_GETFL); @@ -199,11 +189,11 @@ int daemon_detach(void) pid = fork(); if (pid < 0) { return -1; - } + } if (pid) { - daemon_process = false; + daemon_process = false; exit(0); - } + } setsid(); return 0; @@ -236,20 +226,11 @@ int drop_privileges(const char *user, const char *group) int pidfile_open(const char *name) { - struct flock lock; - p_clear(&lock, 1); - lock.l_type = F_WRLCK; if (name) { pidfile = fopen(name, "w"); if (!pidfile) return -1; - if (fcntl(fileno(pidfile), F_SETLK, &lock) == -1) { - crit("program already started"); - fclose(pidfile); - pidfile = NULL; - return -1; - } - fprintf(pidfile, "%d\n", getpid()); + fprintf(pidfile, "%d\n", getpid()); return fflush(pidfile); } return 0; @@ -268,14 +249,12 @@ int pidfile_refresh(void) static void pidfile_close(void) { - struct flock lock; - p_clear(&lock, 1); - lock.l_type = F_UNLCK; if (pidfile) { - rewind(pidfile); - ftruncate(fileno(pidfile), 0); - fcntl(fileno(pidfile), F_SETLK, &lock); - fclose(pidfile); + if (daemon_process) { + rewind(pidfile); + ftruncate(fileno(pidfile), 0); + } + fclose(pidfile); pidfile = NULL; } } @@ -283,6 +262,11 @@ static void pidfile_close(void) int common_setup(const char* pidfilename, bool unsafe, const char* runas_user, const char* runas_group, bool daemonize) { + if (pidfile_open(pidfilename) < 0) { + crit("unable to write pidfile %s", pidfilename); + return EXIT_FAILURE; + } + if (!unsafe && drop_privileges(runas_user, runas_group) < 0) { crit("unable to drop privileges"); return EXIT_FAILURE; @@ -293,41 +277,45 @@ int common_setup(const char* pidfilename, bool unsafe, const char* runas_user, return EXIT_FAILURE; } - if (pidfile_open(pidfilename) < 0) { - crit("unable to write pidfile %s", pidfilename); - return EXIT_FAILURE; - } - pidfile_refresh(); return EXIT_SUCCESS; } -extern initcall_t __madinit[]; -extern exitcall_t __madexit[]; +#include "array.h" + +ARRAY(exitcall_t) + +static A(exitcall_t) __exit = ARRAY_INIT; + +void common_register_exit(exitcall_t exitcall) +{ + array_add(__exit, exitcall); +} static void common_shutdown(void) { - if (daemon_process) { - info("stopping..."); - } - pidfile_close(); - for (int i = -1; __madexit[i]; i--) { - (*__madexit[i])(); + log_state = "stopping "; + if (daemon_process && log_syslog) { + info(""); + } + pidfile_close(); + for (int i = array_len(__exit) - 1 ; i >= 0 ; --i) { + array_elt(__exit, i)(); } + array_wipe(__exit); } -static void __attribute__((__constructor__,__used__)) -common_initialize(void) +void common_init(void) { + static bool __ran = false; + if (__ran) { + return; + } + log_state = "starting "; if (atexit(common_shutdown)) { fputs("Cannot hook my atexit function, quitting !\n", stderr); abort(); } - - for (int i = 0; __madinit[i]; i++) { - if ((*__madinit[i])()) { - exit(EXIT_FAILURE); - } - } + __ran = true; }