From bcd90daa5d3d303afe13832249fa20cad7303f8c Mon Sep 17 00:00:00 2001 From: Florent Bruneau Date: Thu, 18 Sep 2008 18:15:37 +0200 Subject: [PATCH] Add hook to refresh config on SIGHUP. Lock the pid file. Signed-off-by: Florent Bruneau --- common/common.c | 17 +++++++++++++++-- common/server.c | 9 ++++++++- common/server.h | 3 ++- pfix-srsd/main-srsd.c | 2 +- postlicyd/main-postlicyd.c | 2 +- 5 files changed, 27 insertions(+), 6 deletions(-) diff --git a/common/common.c b/common/common.c index 3688c9d..758e869 100644 --- a/common/common.c +++ b/common/common.c @@ -229,11 +229,20 @@ 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; - fprintf(pidfile, "%d\n", getpid()); + if (fcntl(fileno(pidfile), F_SETLK, &lock) == -1) { + syslog(LOG_ERR, "program already started"); + fclose(pidfile); + pidfile = NULL; + return -1; + } + fprintf(pidfile, "%d\n", getpid()); return fflush(pidfile); } return 0; @@ -252,10 +261,14 @@ 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); - fclose(pidfile); + fcntl(fileno(pidfile), F_SETLK, &lock); + fclose(pidfile); pidfile = NULL; } } diff --git a/common/server.c b/common/server.c index 73c2888..6ea1a9a 100644 --- a/common/server.c +++ b/common/server.c @@ -135,11 +135,18 @@ static int start_client(server_t *server, start_client_t starter, } int server_loop(start_client_t starter, delete_client_t deleter, - run_client_t runner, void* config) { + run_client_t runner, refresh_t refresh, void* config) { while (!sigint) { struct epoll_event evts[1024]; int n; + if (sighup && refresh) { + if (!refresh(config)) { + syslog(LOG_ERR, "error while refreshing configuration"); + return EXIT_FAILURE; + } + } + n = epoll_select(evts, countof(evts), -1); if (n < 0) { if (errno != EAGAIN && errno != EINTR) { diff --git a/common/server.h b/common/server.h index 9599b90..38289e6 100644 --- a/common/server.h +++ b/common/server.h @@ -44,6 +44,7 @@ typedef void *(*start_listener_t)(void); typedef void (*delete_client_t)(void*); typedef void *(*start_client_t)(server_t*); typedef int (*run_client_t)(server_t*, void*); +typedef bool (*refresh_t)(void*); struct server_t { unsigned listener : 1; @@ -57,6 +58,6 @@ struct server_t { int start_server(int port, start_listener_t starter, delete_client_t deleter); int server_loop(start_client_t starter, delete_client_t deleter, - run_client_t runner, void* config); + run_client_t runner, refresh_t refresh, void* config); #endif diff --git a/pfix-srsd/main-srsd.c b/pfix-srsd/main-srsd.c index a8e6ce9..e7f4906 100644 --- a/pfix-srsd/main-srsd.c +++ b/pfix-srsd/main-srsd.c @@ -321,5 +321,5 @@ int main(int argc, char *argv[]) || start_listener(port_dec, true) < 0) { return EXIT_FAILURE; } - return server_loop(srsd_starter, NULL, process_srs, &config); + return server_loop(srsd_starter, NULL, process_srs, NULL, &config); } diff --git a/postlicyd/main-postlicyd.c b/postlicyd/main-postlicyd.c index bc65920..5be638b 100644 --- a/postlicyd/main-postlicyd.c +++ b/postlicyd/main-postlicyd.c @@ -284,7 +284,7 @@ int main(int argc, char *argv[]) } { int res = server_loop(query_starter, (delete_client_t)query_delete, - policy_run, config); + policy_run, NULL, config); config_delete(&config); return res; } -- 2.20.1