From 212a947e776e7a25c1f2259615f461179bcb3663 Mon Sep 17 00:00:00 2001
From: Alexander Kanavin <alex@linutronix.de>
Date: Wed, 23 Nov 2022 21:38:38 +0100
Subject: [PATCH] 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.

Upstream-Status: Submitted [https://github.com/unfs3/unfs3/pull/28]
Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
Signed-off-by: Alexander Kanavin <alex@linutronix.de>
---
 daemon.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/daemon.c b/daemon.c
index ff53b7a..13b06a4 100644
--- a/daemon.c
+++ b/daemon.c
@@ -166,7 +166,7 @@ int get_socket_type(struct svc_req *rqstp)
 /*
  * 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;
@@ -188,7 +188,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);
@@ -1122,6 +1122,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 */
 
@@ -1161,8 +1165,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();
-- 
2.30.2

