X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=common.c;h=3688c9d9e758422864c2fcd4f0387e5faf53dde9;hb=8edd7234e1c30a16d914292dc652046ee581fa5b;hp=186ac43abf98d20c52149ac017e605fb86a12dff;hpb=cd6d97ab05dc231c35cf0dd38afaa43f0ab1fd99;p=apps%2Fpfixtools.git diff --git a/common.c b/common.c index 186ac43..3688c9d 100644 --- a/common.c +++ b/common.c @@ -31,6 +31,7 @@ /* * Copyright © 2007 Pierre Habouzit + * Copyright © 2008 Florent Bruneau */ #include @@ -47,18 +48,9 @@ static FILE *pidfile = NULL; void common_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; - } + sigint = true; return; case SIGHUP: @@ -88,7 +80,7 @@ static int setnonblock(int sock) return 0; } -int tcp_listen_nonblock(const struct sockaddr *addr, socklen_t len) +int tcp_bind(const struct sockaddr *addr, socklen_t len) { int sock; @@ -128,17 +120,32 @@ int tcp_listen_nonblock(const struct sockaddr *addr, socklen_t len) return -1; } - if (setnonblock(sock)) { + return sock; +} + +int tcp_listen(const struct sockaddr *addr, socklen_t len) +{ + int sock = tcp_bind(addr, len); + if (listen(sock, 0) < 0) { + UNIXERR("bind"); close(sock); return -1; } + return sock; +} +int tcp_listen_nonblock(const struct sockaddr *addr, socklen_t len) +{ + int sock = tcp_bind(addr, len); + if (setnonblock(sock)) { + close(sock); + return -1; + } if (listen(sock, 0) < 0) { UNIXERR("bind"); close(sock); return -1; } - return sock; } @@ -253,10 +260,34 @@ static void pidfile_close(void) } } -extern initcall_t __madinit[], __madexit[]; +int common_setup(const char* pidfilename, bool unsafe, const char* runas_user, + const char* runas_group, bool daemonize) +{ + if (pidfile_open(pidfilename) < 0) { + syslog(LOG_CRIT, "unable to write pidfile %s", pidfilename); + return EXIT_FAILURE; + } + + if (!unsafe && drop_privileges(runas_user, runas_group) < 0) { + syslog(LOG_CRIT, "unable to drop privileges"); + return EXIT_FAILURE; + } + + if (daemonize && daemon_detach() < 0) { + syslog(LOG_CRIT, "unable to fork"); + return EXIT_FAILURE; + } + + pidfile_refresh(); + return EXIT_SUCCESS; +} + +extern initcall_t __madinit[]; +extern exitcall_t __madexit[]; static void common_shutdown(void) { + syslog(LOG_INFO, "Stopping..."); pidfile_close(); for (int i = -1; __madexit[i]; i--) {