[master] 1f45a46 Turn daemonize() inside out, and don't let the original process die until we have started the child process.

Poul-Henning Kamp phk at FreeBSD.org
Thu Dec 22 23:17:05 CET 2016


commit 1f45a46516ec265fd983d8a2fca5f97deed96fc6
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Thu Dec 22 22:14:58 2016 +0000

    Turn daemonize() inside out, and don't let the original process
    die until we have started the child process.

diff --git a/bin/varnishd/mgt/mgt.h b/bin/varnishd/mgt/mgt.h
index 8565f82..99b4fc0 100644
--- a/bin/varnishd/mgt/mgt.h
+++ b/bin/varnishd/mgt/mgt.h
@@ -51,7 +51,7 @@ int MAC_sockets_ready(struct cli *);
 
 /* mgt_child.c */
 extern pid_t child_pid;
-void MGT_Run(void);
+int MGT_Run(void);
 void mgt_stop_child(void);
 void mgt_got_fd(int fd);
 void MGT_Child_Cli_Fail(void);
diff --git a/bin/varnishd/mgt/mgt_child.c b/bin/varnishd/mgt/mgt_child.c
index dded01e..5061af5 100644
--- a/bin/varnishd/mgt/mgt_child.c
+++ b/bin/varnishd/mgt/mgt_child.c
@@ -725,7 +725,7 @@ static struct cli_proto cli_child[] = {
  * and to reincarnate it in case of trouble.
  */
 
-void
+int
 MGT_Run(void)
 {
 	struct sigaction sac;
@@ -771,22 +771,15 @@ MGT_Run(void)
 		MGT_complain(C_ERR, "No VCL loaded yet");
 	else if (!d_flag) {
 		mgt_launch_child(NULL);
-		if (child_state != CH_RUNNING) {
-			// XXX correct? or 0?
-			exit_status = 2;
-			return;
-		}
+		if (child_state != CH_RUNNING)
+			return (2);
 	}
 
 	i = mgt_SHM_Commit();
 	if (i != 0) {
 		MGT_complain(C_ERR, "Could not commit SHM file");
-		return;
+		return (2);
 	}
 
-	i = vev_schedule(mgt_evb);
-	if (i != 0)
-		MGT_complain(C_ERR, "vev_schedule() = %d", i);
-
-	MGT_complain(C_INFO, "manager dies");
+	return(0);
 }
diff --git a/bin/varnishd/mgt/mgt_main.c b/bin/varnishd/mgt/mgt_main.c
index 95bc834..59982ec 100644
--- a/bin/varnishd/mgt/mgt_main.c
+++ b/bin/varnishd/mgt/mgt_main.c
@@ -60,8 +60,6 @@
 #include "vtim.h"
 #include "waiter/mgt_waiter.h"
 
-#include "compat/daemon.h"
-
 struct heritage		heritage;
 unsigned		d_flag = 0;
 pid_t			mgt_pid;
@@ -533,12 +531,54 @@ mgt_x_arg(const char *x_arg)
 		ARGV_ERR("Invalid -x argument\n");
 }
 
+
+/*--------------------------------------------------------------------*/
+
+#define ERIC_MAGIC 0x2246988a		/* Eric is not random */
+
+static int
+mgt_eric(void)
+{
+	int eric_pipes[2];
+	int fd;
+	unsigned u;
+	ssize_t sz;
+
+	AZ(pipe(eric_pipes));
+
+	switch (fork()) {
+	case -1:
+		fprintf(stderr, "Fork() failed: %s\n", strerror(errno));
+		exit(-1);
+	case 0:
+		AZ(close(eric_pipes[0]));
+		assert(setsid() > 1);
+
+		fd = open("/dev/null", O_RDWR, 0);
+		assert(fd > 0);
+		assert(dup2(fd, STDIN_FILENO) == STDIN_FILENO);
+		if (fd > STDIN_FILENO)
+			AZ(close(fd));
+		return (eric_pipes[1]);
+	default:
+		break;
+	}
+	AZ(close(eric_pipes[1]));
+	sz = read(eric_pipes[0], &u, sizeof u);
+	if (sz == sizeof u && u == ERIC_MAGIC)
+		exit(0);
+	else if (sz == sizeof u && u != 0)
+		exit(u);
+	else
+		exit(-1);
+}
+
 /*--------------------------------------------------------------------*/
 
 int
 main(int argc, char * const *argv)
 {
-	int o;
+	int o, eric_fd = -1;
 	unsigned C_flag = 0;
 	unsigned F_flag = 0;
 	const char *b_arg = NULL;
@@ -561,6 +601,7 @@ main(int argc, char * const *argv)
 	char **av;
 	char Cn_arg[] = "/tmp/varnishd_C_XXXXXXX";
 	const char * opt_spec = "a:b:Cdf:Fh:i:j:l:M:n:P:p:r:S:s:T:t:VW:x:";
+	unsigned u;
 
 	mgt_tests();
 
@@ -609,11 +650,6 @@ main(int argc, char * const *argv)
 	if (F_flag && C_flag)
 		ARGV_ERR("-F makes no sense with -C\n");
 
-
-	/* Set up the mgt counters */
-	memset(&static_VSC_C_mgt, 0, sizeof static_VSC_C_mgt);
-	VSC_C_mgt = &static_VSC_C_mgt;
-
 	/*
 	 * Start out by closing all unwanted file descriptors we might
 	 * have inherited from sloppy process control daemons.
@@ -623,6 +659,19 @@ main(int argc, char * const *argv)
 	setbuf(stdout, NULL);
 	setbuf(stderr, NULL);
 
+	/*
+	 * Have Eric Daemonize us if need be
+	 */
+	if (!C_flag && !d_flag && !F_flag) {
+		eric_fd = mgt_eric();
+		mgt_got_fd(eric_fd);
+		mgt_pid = getpid();
+	}
+
+	/* Set up the mgt counters */
+	memset(&static_VSC_C_mgt, 0, sizeof static_VSC_C_mgt);
+	VSC_C_mgt = &static_VSC_C_mgt;
+
 	VRND_SeedAll();
 
 	build_vident();
@@ -832,9 +881,6 @@ main(int argc, char * const *argv)
 		S_arg = make_secret(dirname);
 	AN(S_arg);
 
-	if (!d_flag && !F_flag)
-		AZ(varnish_daemon(1, 0));
-
 	/**************************************************************
 	 * After this point diagnostics will only be seen with -d
 	 */
@@ -843,8 +889,6 @@ main(int argc, char * const *argv)
 
 	MGT_complain(C_DEBUG, "Platform: %s", VSB_data(vident) + 1);
 
-	mgt_pid = getpid();	/* daemon() changed this */
-
 	if (d_flag)
 		mgt_cli_setup(0, 1, 1, "debug", cli_stdin_close, NULL);
 
@@ -859,8 +903,20 @@ main(int argc, char * const *argv)
 	/* Instantiate VSM */
 	mgt_SHM_Create();
 
-	MGT_Run();
+	u = MGT_Run();
+
+	if (eric_fd > 0) {
+		if (u == 0)
+			u = ERIC_MAGIC;
+		assert(write(eric_fd, &u, sizeof u) == sizeof u);
+		AZ(close(eric_fd));
+	}
+
+	o = vev_schedule(mgt_evb);
+	if (o != 0)
+		MGT_complain(C_ERR, "vev_schedule() = %d", o);
 
+	MGT_complain(C_INFO, "manager dies");
 	if (pfh != NULL)
 		(void)VPF_Remove(pfh);
 	exit(exit_status);



More information about the varnish-commit mailing list