From: phk Date: Sat, 16 Sep 2006 09:01:21 +0000 (+0000) Subject: Generalize parameter setting at start up. X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2e47fc0e8239517045225fc445533dcfdb22ee08;p=varnish Generalize parameter setting at start up. 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 --- diff --git a/varnish-cache/bin/varnishd/common.h b/varnish-cache/bin/varnishd/common.h index 8ba463c1..56c2ef07 100644 --- a/varnish-cache/bin/varnishd/common.h +++ b/varnish-cache/bin/varnishd/common.h @@ -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); + diff --git a/varnish-cache/bin/varnishd/mgt.h b/varnish-cache/bin/varnishd/mgt.h index 2dedf627..4a7e73c6 100644 --- a/varnish-cache/bin/varnishd/mgt.h +++ b/varnish-cache/bin/varnishd/mgt.h @@ -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); diff --git a/varnish-cache/bin/varnishd/mgt_param.c b/varnish-cache/bin/varnishd/mgt_param.c index 9a7e3f4e..abca995e 100644 --- a/varnish-cache/bin/varnishd/mgt_param.c +++ b/varnish-cache/bin/varnishd/mgt_param.c @@ -2,6 +2,7 @@ * $Id$ */ +#include #include #include #include @@ -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); } diff --git a/varnish-cache/bin/varnishd/tcp.c b/varnish-cache/bin/varnishd/tcp.c index 209daa91..f3764a59 100644 --- a/varnish-cache/bin/varnishd/tcp.c +++ b/varnish-cache/bin/varnishd/tcp.c @@ -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) { diff --git a/varnish-cache/bin/varnishd/varnishd.c b/varnish-cache/bin/varnishd/varnishd.c index 9f4ebdb3..2923e5c5 100644 --- a/varnish-cache/bin/varnishd/varnishd.c +++ b/varnish-cache/bin/varnishd/varnishd.c @@ -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(¶m, 0, sizeof param); params = ¶m; 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);