]> err.no Git - varnish/commitdiff
Open and close the listen socket when we start and stop the child.
authorphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Sat, 16 Sep 2006 08:20:39 +0000 (08:20 +0000)
committerphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Sat, 16 Sep 2006 08:20:39 +0000 (08:20 +0000)
Make the listen address a parameter.

git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@999 d4fa192b-c00b-0410-8231-f00ffab90ce4

varnish-cache/bin/varnishd/heritage.h
varnish-cache/bin/varnishd/mgt_child.c
varnish-cache/bin/varnishd/mgt_param.c
varnish-cache/bin/varnishd/mgt_vcc.c
varnish-cache/bin/varnishd/varnishd.c

index 5f5a4911a555dca9c2fd9d5fff8008f91f7c113f..0c528377df93a590abbd5b033fc0f96c1d53eaf7 100644 (file)
@@ -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;
index 1bf7113d559462b9216ae2319447c497473ef2eb..221328f4aee1cc04fa02203940e87ef72d7d84c1 100644 (file)
@@ -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);
index 298e12884321736a7f9888e4d7937f09ac5a79a4..9a7e3f4e93e589d43b27b0311e585554ceec00ac 100644 (file)
@@ -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 }
 };
 
index 0c90731ec82f901ec5dad9a9606b0ff663f8cdc6..a24969437fe3a063d4dcb01facfdd842312d707c 100644 (file)
@@ -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);
        }
index 79d422a1127266ac43314e36381cae9caf0c9829..9f4ebdb31a859bb44a88f7734d0cb08e1bba4e08 100644 (file)
@@ -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);