]> err.no Git - varnish/commitdiff
Generalize parameter setting at start up.
authorphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Sat, 16 Sep 2006 09:01:21 +0000 (09:01 +0000)
committerphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Sat, 16 Sep 2006 09:01:21 +0000 (09:01 +0000)
Give the managers main a struct cli and use that to call into
the paramter stuff for setting listen address.  More params to follow.

When setting the listen address, check that getaddrinfo() doesn't
hate it.

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

varnish-cache/bin/varnishd/common.h
varnish-cache/bin/varnishd/mgt.h
varnish-cache/bin/varnishd/mgt_param.c
varnish-cache/bin/varnishd/tcp.c
varnish-cache/bin/varnishd/varnishd.c

index 8ba463c12e4f497b56cc27e252f00c0df57abc28..56c2ef079078ad596ffcd9c3ab972b7580d0efbe 100644 (file)
@@ -2,6 +2,7 @@
  * $Id$
  */
 
+struct cli;
 struct sockaddr;
 
 /* shmlog.c */
@@ -17,3 +18,5 @@ void TCP_name(struct sockaddr *addr, unsigned l, char *abuf, unsigned alen, char
 void TCP_myname(int sock, char *abuf, unsigned alen, char *pbuf, unsigned plen);
 int TCP_parse(const char *str, char **addr, char **port);
 int TCP_open(const char *addr, const char *port, int http);
+void TCP_check(struct cli *cli, const char *addr, const char *port);
+
index 2dedf627edcd382401269080013638631e748823..4a7e73c624e0692fc23bfbfd01f7281f3a324964 100644 (file)
@@ -7,6 +7,8 @@
 
 #include "libvarnish.h"
 
+struct cli;
+
 extern struct evbase   *mgt_evb;
 
 /* mgt_child.c */
@@ -23,7 +25,8 @@ void mgt_cli_stop_child(void);
 int mgt_cli_telnet(const char *T_arg);
 
 /* mgt_param.c */
-void MCF_ParamInit(void);
+void MCF_ParamInit(struct cli *);
+void MCF_ParamSet(struct cli *, const char *param, const char *val);
 
 /* mgt_vcc.c */
 void mgt_vcc_init(void);
index 9a7e3f4e93e589d43b27b0311e585554ceec00ac..abca995e25412fb59cb6c4f5f9424676dc5d0467 100644 (file)
@@ -2,6 +2,7 @@
  * $Id$
  */
 
+#include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 #include <unistd.h>
@@ -9,9 +10,11 @@
 
 #include "cli.h"
 #include "cli_priv.h"
+#include "cli_common.h"
 #include "mgt.h"
 #include "mgt_cli.h"
 
+#include "vsb.h"
 #include "heritage.h"
 
 struct parspec;
@@ -40,10 +43,8 @@ tweak_generic_timeout(struct cli *cli, unsigned *dst, const char *arg)
                        return;
                }
                *dst = u;
-       }
-       if (cli == NULL)
-               return;
-       cli_out(cli, "%u [seconds]\n", *dst);
+       } else
+               cli_out(cli, "%u [seconds]\n", *dst);
 }
 
 /*--------------------------------------------------------------------*/
@@ -55,9 +56,8 @@ tweak_default_ttl(struct cli *cli, struct parspec *par, const char *arg)
        (void)par;
        if (arg != NULL)
                params->default_ttl = strtoul(arg, NULL, 0);
-       if (cli == NULL)
-               return;
-       cli_out(cli, "%u [seconds]\n", params->default_ttl);
+       else
+               cli_out(cli, "%u [seconds]\n", params->default_ttl);
 }
 
 /*--------------------------------------------------------------------*/
@@ -76,10 +76,8 @@ tweak_thread_pool_min(struct cli *cli, struct parspec *par, const char *arg)
                        return;
                }
                params->wthread_min = u;
-       }
-       if (cli == NULL)
-               return;
-       cli_out(cli, "%u [threads]\n", params->wthread_min);
+       } else
+               cli_out(cli, "%u [threads]\n", params->wthread_min);
 }
 
 /*--------------------------------------------------------------------*/
@@ -99,8 +97,6 @@ tweak_thread_pool_max(struct cli *cli, struct parspec *par, const char *arg)
                }
                params->wthread_max = u;
        }
-       if (cli == NULL)
-               return;
        if (params->wthread_max == UINT_MAX) 
                cli_out(cli, "unlimited\n");
        else 
@@ -133,10 +129,8 @@ tweak_http_workspace(struct cli *cli, struct parspec *par, const char *arg)
                        return;
                }
                params->mem_workspace = u;
-       }
-       if (cli == NULL)
-               return;
-       cli_out(cli, "%u [bytes]\n", params->mem_workspace);
+       } else
+               cli_out(cli, "%u [bytes]\n", params->mem_workspace);
 }
 
 /*--------------------------------------------------------------------*/
@@ -182,10 +176,8 @@ tweak_auto_restart(struct cli *cli, struct parspec *par, const char *arg)
                        return;
                }
                params->auto_restart = u;
-       }
-       if (cli == NULL)
-               return;
-       cli_out(cli, "%u {1 = yes, 0 = no}\n", params->auto_restart);
+       } else
+               cli_out(cli, "%u {1 = yes, 0 = no}\n", params->auto_restart);
 }
 
 /*--------------------------------------------------------------------*/
@@ -199,10 +191,8 @@ tweak_fetch_chunksize(struct cli *cli, struct parspec *par, const char *arg)
        if (arg != NULL) {
                u = strtoul(arg, NULL, 0);
                params->fetch_chunksize = u * 1024;
-       }
-       if (cli == NULL)
-               return;
-       cli_out(cli, "%u [kb]\n", params->fetch_chunksize * 1024);
+       } else
+               cli_out(cli, "%u [kb]\n", params->fetch_chunksize * 1024);
 }
 
 #ifdef HAVE_SENDFILE
@@ -217,10 +207,8 @@ tweak_sendfile_threshold(struct cli *cli, struct parspec *par, const char *arg)
        if (arg != NULL) {
                u = strtoul(arg, NULL, 0);
                params->sendfile_threshold = u;
-       }
-       if (cli == NULL)
-               return;
-       cli_out(cli, "%u [bytes]\n", params->sendfile_threshold);
+       } else
+               cli_out(cli, "%u [bytes]\n", params->sendfile_threshold);
 }
 #endif /* HAVE_SENDFILE */
 
@@ -248,10 +236,8 @@ tweak_vcl_trace(struct cli *cli, struct parspec *par, const char *arg)
                        cli_result(cli, CLIS_PARAM);
                        return;
                }
-       }
-       if (cli == NULL)
-               return;
-       cli_out(cli, params->vcl_trace ? "on\n" : "off\n");
+       } else
+               cli_out(cli, params->vcl_trace ? "on\n" : "off\n");
 }
 
 /*--------------------------------------------------------------------*/
@@ -268,21 +254,22 @@ tweak_listen_address(struct cli *cli, struct parspec *par, const char *arg)
                        cli_result(cli, CLIS_PARAM);
                        return;
                }
+               if (p == NULL) {
+                       p = strdup("http");
+                       AN(p);
+               }
+               TCP_check(cli, a, p);
+               if (cli->result != CLIS_OK)
+                       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);
+       } else 
+               cli_out(cli, "%s\n", params->listen_address);
 }
 /*--------------------------------------------------------------------*/
 
@@ -429,31 +416,38 @@ mcf_param_show(struct cli *cli, char **av, void *priv)
 /*--------------------------------------------------------------------*/
 
 void
-mcf_param_set(struct cli *cli, char **av, void *priv)
+MCF_ParamSet(struct cli *cli, const char *param, const char *val)
 {
        struct parspec *pp;
 
-       (void)priv;
        for (pp = parspec; pp->name != NULL; pp++) {
-               if (!strcmp(pp->name, av[2])) {
-                       cli_out(cli, "%-20s ", pp->name);
-                       pp->func(cli, pp, av[3]);
+               if (!strcmp(pp->name, param)) {
+                       pp->func(cli, pp, val);
                        return;
                }
        }
-       if (av[2] != NULL) {
-               cli_result(cli, CLIS_PARAM);
-               cli_out(cli, "Unknown paramter \"%s\".", av[2]);
-       }
+       cli_result(cli, CLIS_PARAM);
+       cli_out(cli, "Unknown paramter \"%s\".", param);
+}
+
+
+/*--------------------------------------------------------------------*/
+
+void
+mcf_param_set(struct cli *cli, char **av, void *priv)
+{
+
+       (void)priv;
+       MCF_ParamSet(cli, av[2], av[3]);
 }
 
 /*--------------------------------------------------------------------*/
 
 void
-MCF_ParamInit(void)
+MCF_ParamInit(struct cli *cli)
 {
        struct parspec *pp;
 
        for (pp = parspec; pp->name != NULL; pp++)
-               pp->func(NULL, pp, pp->def);
+               pp->func(cli, pp, pp->def);
 }
index 209daa91ae50432447d77103b0d68ccf8362a56a..f3764a59ed88c11bbae70c0509a7dc5721b48879 100644 (file)
@@ -22,6 +22,8 @@
 #endif
 
 #include "mgt.h"
+#include "cli.h"
+#include "cli_priv.h"
 
 /*--------------------------------------------------------------------*/
 
@@ -109,6 +111,27 @@ TCP_parse(const char *str, char **addr, char **port)
        return (0);
 }
 
+/*--------------------------------------------------------------------*/
+
+void
+TCP_check(struct cli *cli, const char *addr, const char *port)
+{
+       struct addrinfo hints, *res;
+       int ret;
+
+       memset(&hints, 0, sizeof hints);
+       hints.ai_socktype = SOCK_STREAM;
+       hints.ai_flags = AI_PASSIVE;
+       ret = getaddrinfo(addr, port, &hints, &res);
+       if (ret == 0) {
+               freeaddrinfo(res);
+               return;
+       }
+       cli_out(cli, "getaddrinfo(%s, %s): %s\n",
+           addr, port, gai_strerror(ret));
+       cli_result(cli, CLIS_PARAM);
+}
+
 int
 TCP_open(const char *addr, const char *port, int http)
 {
index 9f4ebdb31a859bb44a88f7734d0cb08e1bba4e08..2923e5c54c0dcfda44bd5059657e5506bb0d3b18 100644 (file)
@@ -313,6 +313,20 @@ DebugStunt(void)
 }
 
 
+/*--------------------------------------------------------------------*/
+
+static void
+cli_check(struct cli *cli)
+{
+       if (cli->result == CLIS_OK) {
+               vsb_clear(cli->sb);
+               return;
+       }
+       vsb_finish(cli->sb);
+       fprintf(stderr, "Error:\n%s\n", vsb_data(cli->sb));
+       exit (2);
+}
+
 /*--------------------------------------------------------------------*/
 
 int
@@ -320,7 +334,6 @@ main(int argc, char *argv[])
 {
        int o;
        unsigned d_flag = 0;
-       char *addr, *port;
        const char *a_arg = NULL;
        const char *b_arg = NULL;
        const char *f_arg = NULL;
@@ -328,16 +341,23 @@ main(int argc, char *argv[])
        const char *s_arg = "file";
        const char *T_arg = NULL;
        struct params param;
+       struct cli cli[1];
 
        setbuf(stdout, NULL);
        setbuf(stderr, NULL);
 
+       memset(cli, 0, sizeof cli);
+       cli->sb = vsb_new(NULL, NULL, 0, VSB_AUTOEXTEND);
+       XXXAN(cli->sb);
+       cli->result = CLIS_OK;
+
        heritage.socket = -1;
        memset(&param, 0, sizeof param);
        params = &param;
        mgt_vcc_init(); 
 
-       MCF_ParamInit();
+       MCF_ParamInit(cli);
+       cli_check(cli);
 
        while ((o = getopt(argc, argv, "a:b:df:h:s:t:T:Vw:")) != -1)
                switch (o) {
@@ -398,19 +418,9 @@ main(int argc, char *argv[])
        setup_storage(s_arg);
        setup_hash(h_flag);
 
-       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;
-       }
+       if (a_arg != NULL)
+               MCF_ParamSet(cli, "listen_address", a_arg);
+       cli_check(cli);
 
        VSL_MgtInit(SHMLOG_FILENAME, 8*1024*1024);