In the master/worker model the master may not have permission to re-open the pidfile. So just keep its file descriptor open.
This has a few side effects: * Changes to the pid file will not be honoured on reinitialisation. - In practice this probably isn't possible in a number of situations. + If privileges have been dropped + If chrooted the new pidfile would end up inside the chroot * If the pid file is unlinked by some other process then it won't be replaced on reinitialisation - I don't really think this is a case we ought to worry about * There is a rave if haproxy truncates the pidfile while another process was reading it - There were races anyway. e.g. if a process opens the pid file just after haproxy creates it and is reading it while haproxy is writing to it. - I don't think we need to worry about this either. --- src/haproxy.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/haproxy.c b/src/haproxy.c index 8c9053f..8a50f8c 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -1056,7 +1056,7 @@ void run(int argc, char **argv) { int err, retry; struct rlimit limit; - FILE *pidfile = NULL; + static FILE *pidfile = NULL; char errmsg[100]; socket_cache_make_all_available(); @@ -1075,7 +1075,7 @@ void run(int argc, char **argv) signal_register_fct(SIGPIPE, NULL, 0); /* open log & pid files before the chroot */ - if (global.mode & MODE_DAEMON && global.pidfile != NULL) { + if (!pidfile && global.mode & MODE_DAEMON && global.pidfile != NULL) { int pidfd; unlink(global.pidfile); pidfd = open(global.pidfile, O_CREAT | O_WRONLY | O_TRUNC, 0644); @@ -1088,6 +1088,7 @@ void run(int argc, char **argv) } pidfile = fdopen(pidfd, "w"); } + free(global.pidfile); global.pidfile = NULL; #ifdef CONFIG_HAP_CTTPROXY if (global.last_checks & LSTCHK_CTTPROXY) { @@ -1281,7 +1282,6 @@ void run(int argc, char **argv) /* We won't ever use this anymore */ free(oldpids); oldpids = NULL; - free(global.pidfile); global.pidfile = NULL; /* we might have to unbind some proxies from some processes */ px = proxy; -- 1.7.2.3