Commit 2545bb4b authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Open and close the listen socket when we start and stop the child.

Make the listen address a parameter.



git-svn-id: http://www.varnish-cache.org/svn/trunk/varnish-cache@999 d4fa192b-c00b-0410-8231-f00ffab90ce4
parent eec8b3ba
......@@ -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;
......
......@@ -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);
......
......@@ -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 }
};
......
......@@ -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);
}
......
......@@ -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(&param, 0, sizeof param);
params = &param;
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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment