From: phk Date: Sat, 16 Sep 2006 08:20:39 +0000 (+0000) Subject: Open and close the listen socket when we start and stop the child. X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ca7f217b9fd6dd8713a6396cdf8109f89043c7ea;p=varnish Open and close the listen socket when we start and stop the child. Make the listen address a parameter. git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@999 d4fa192b-c00b-0410-8231-f00ffab90ce4 --- diff --git a/varnish-cache/bin/varnishd/heritage.h b/varnish-cache/bin/varnishd/heritage.h index 5f5a4911..0c528377 100644 --- a/varnish-cache/bin/varnishd/heritage.h +++ b/varnish-cache/bin/varnishd/heritage.h @@ -56,6 +56,11 @@ struct params { /* VCL traces */ unsigned vcl_trace; + + /* Listen address */ + char *listen_address; + char *listen_host; + char *listen_port; }; extern struct params *params; diff --git a/varnish-cache/bin/varnishd/mgt_child.c b/varnish-cache/bin/varnishd/mgt_child.c index 1bf7113d..221328f4 100644 --- a/varnish-cache/bin/varnishd/mgt_child.c +++ b/varnish-cache/bin/varnishd/mgt_child.c @@ -102,6 +102,13 @@ start_child(void) if (child_state != CH_STOPPED && child_state != CH_DIED) return; + if (heritage.socket < 0) { + heritage.socket = + TCP_open(params->listen_host, params->listen_port, 1); + if (heritage.socket < 0) + return; + } + child_state = CH_STARTING; AZ(pipe(&heritage.fds[0])); @@ -179,6 +186,8 @@ stop_child(void) if (child_state != CH_RUNNING) return; + close(heritage.socket); + heritage.socket = -1; child_state = CH_STOPPING; if (ev_poker != NULL) { @@ -249,8 +258,11 @@ mgt_sigchld(struct ev *e, int what) if (child_state == CH_DIED && params->auto_restart) start_child(); - else if (child_state == CH_DIED) + else if (child_state == CH_DIED) { + close(heritage.socket); + heritage.socket = -1; child_state = CH_STOPPED; + } else if (child_state == CH_STOPPING) child_state = CH_STOPPED; return (0); diff --git a/varnish-cache/bin/varnishd/mgt_param.c b/varnish-cache/bin/varnishd/mgt_param.c index 298e1288..9a7e3f4e 100644 --- a/varnish-cache/bin/varnishd/mgt_param.c +++ b/varnish-cache/bin/varnishd/mgt_param.c @@ -249,11 +249,43 @@ tweak_vcl_trace(struct cli *cli, struct parspec *par, const char *arg) return; } } - cli_out(cli, params->vcl_trace ? "on" : "off"); + if (cli == NULL) + return; + cli_out(cli, params->vcl_trace ? "on\n" : "off\n"); } /*--------------------------------------------------------------------*/ +static void +tweak_listen_address(struct cli *cli, struct parspec *par, const char *arg) +{ + char *a, *p; + + (void)par; + if (arg != NULL) { + if (TCP_parse(arg, &a, &p) != 0) { + cli_out(cli, "Invalid listen address"); + cli_result(cli, CLIS_PARAM); + return; + } + free(params->listen_address); + free(params->listen_host); + free(params->listen_port); + params->listen_address = strdup(arg); + AN(params->listen_address); + params->listen_host = a; + if (p == NULL) { + p = strdup("http"); + AN(p); + } + params->listen_port = p; + } + if (cli == NULL) + return; + cli_out(cli, "%s", params->listen_address); +} +/*--------------------------------------------------------------------*/ + /* * Make sure to end all lines with either a space or newline of the * formatting will go haywire. @@ -332,6 +364,10 @@ static struct parspec parspec[] = { { "vcl_trace", tweak_vcl_trace, "Trace VCL execution in the shmlog\n" "Default is off", "off" }, + { "listen_address", tweak_listen_address, + "The network address/port where Varnish services requests.\n" + MUST_RESTART + "Default is \"0.0.0.0:80\"", "0.0.0.0:80" }, { NULL, NULL, NULL } }; diff --git a/varnish-cache/bin/varnishd/mgt_vcc.c b/varnish-cache/bin/varnishd/mgt_vcc.c index 0c90731e..a2496943 100644 --- a/varnish-cache/bin/varnishd/mgt_vcc.c +++ b/varnish-cache/bin/varnishd/mgt_vcc.c @@ -179,13 +179,13 @@ mgt_push_vcls_and_start(unsigned *status, char **p) TAILQ_FOREACH(vp, &vclhead, list) { if (mgt_cli_askchild(status, p, - "config.load %s %s\n", vp->name, vp->fname)) + "vcl.load %s %s\n", vp->name, vp->fname)) return (1); free(*p); if (!vp->active) continue; - if (mgt_cli_askchild(status, p, "config.use %s\n", - vp->name, vp->fname)) + if (mgt_cli_askchild(status, p, + "vcl.use %s\n", vp->name)) return (1); free(*p); } diff --git a/varnish-cache/bin/varnishd/varnishd.c b/varnish-cache/bin/varnishd/varnishd.c index 79d422a1..9f4ebdb3 100644 --- a/varnish-cache/bin/varnishd/varnishd.c +++ b/varnish-cache/bin/varnishd/varnishd.c @@ -321,7 +321,7 @@ main(int argc, char *argv[]) int o; unsigned d_flag = 0; char *addr, *port; - const char *a_arg = "0.0.0.0:http"; + const char *a_arg = NULL; const char *b_arg = NULL; const char *f_arg = NULL; const char *h_flag = "classic"; @@ -332,6 +332,7 @@ main(int argc, char *argv[]) setbuf(stdout, NULL); setbuf(stderr, NULL); + heritage.socket = -1; memset(¶m, 0, sizeof param); params = ¶m; mgt_vcc_init(); @@ -397,20 +398,19 @@ main(int argc, char *argv[]) setup_storage(s_arg); setup_hash(h_flag); - /* - * XXX: Lacking the suspend/resume facility (due to the socket API - * missing an unlisten(2) facility) we may want to push this into - * the child to limit the amount of time where the socket(s) exists - * but do not answer. That, on the other hand, would eliminate the - * possibility of doing a "no-glitch" restart of the child process. - */ - if (TCP_parse(a_arg, &addr, &port) != 0) - fprintf(stderr, "invalid listen address\n"); - heritage.socket = TCP_open(addr, port ? port : "http", 1); - free(addr); - free(port); - if (heritage.socket < 0) - exit (2); + if (a_arg != NULL) { + if (TCP_parse(a_arg, &addr, &port) != 0) { + fprintf(stderr, "invalid listen address\n"); + exit (2); + } + free(params->listen_address); + free(params->listen_host); + free(params->listen_port); + params->listen_address = strdup(a_arg); + AN(params->listen_address); + params->listen_host = addr; + params->listen_port = port; + } VSL_MgtInit(SHMLOG_FILENAME, 8*1024*1024);