daemon.c: Fix race window for writing of the pid file The parent process should write the pid file such that the pid file will can be checked immediately following exit of the fork from the parent. This allows external monitoring applications to watch the daemon without having to add sleep calls to wait for the pid file be written on a busy system. Signed-off-by: Jason Wessel Upstream-Status: Pending --- daemon.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) --- a/daemon.c +++ b/daemon.c @@ -153,7 +153,7 @@ int get_socket_type(struct svc_req *rqst /* * write current pid to a file */ -static void create_pid_file(void) +static void create_pid_file(int pid) { char buf[16]; int fd, res, len; @@ -175,7 +175,7 @@ static void create_pid_file(void) } #endif - sprintf(buf, "%i\n", backend_getpid()); + sprintf(buf, "%i\n", pid); len = strlen(buf); res = backend_pwrite(fd, buf, len, 0); @@ -970,6 +970,10 @@ int main(int argc, char **argv) fprintf(stderr, "could not fork into background\n"); daemon_exit(0); } + if (pid) + create_pid_file(pid); + } else { + create_pid_file(backend_getpid()); } #endif /* WIN32 */ @@ -1006,8 +1010,10 @@ int main(int argc, char **argv) /* no umask to not screw up create modes */ umask(0); +#ifdef WIN32 /* create pid file if wanted */ - create_pid_file(); + create_pid_file(backend_getpid()); +#endif /* initialize internal stuff */ fh_cache_init();