[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