[MEDIUM] modularize the "timeout" keyword configuration parser

The "timeout" keyword already relied on an external parser, let's
make use of the new keyword registration mechanism.
This commit is contained in:
Willy Tarreau 2008-07-09 20:34:27 +02:00
parent 39f23b6c7e
commit 9de1bbd004
3 changed files with 22 additions and 26 deletions

View File

@ -38,8 +38,6 @@ const char *proxy_cap_str(int cap);
const char *proxy_mode_str(int mode);
struct proxy *findproxy(const char *name, int mode, int cap);
struct server *findserver(const struct proxy *px, const char *name);
int proxy_parse_timeout(const char **args, struct proxy *proxy,
struct proxy *defpx, char *err, int errlen);
/*
* This function returns a string containing the type of the proxy in a format

View File

@ -1087,27 +1087,6 @@ int cfg_parse_listen(const char *file, int linenum, char **args, int inv)
return -1;
}
}
else if (!strcmp(args[0], "contimeout") || !strcmp(args[0], "clitimeout") ||
!strcmp(args[0], "srvtimeout") || !strcmp(args[0], "timeout")) {
/* either we have {con|srv|cli}timeout <value> or we have the
* new form: timeout <type> <value>. The parser needs the word
* preceeding the value.
*/
const char **start_arg = (const char **)args;
if (strcmp(args[0], "timeout") == 0)
start_arg++;
snprintf(trash, sizeof(trash), "error near '%s'", args[0]);
rc = proxy_parse_timeout(start_arg, curproxy, &defproxy, trash, sizeof(trash));
if (rc < 0) {
Alert("parsing [%s:%d] : %s\n", file, linenum, trash);
return -1;
}
if (rc > 0)
Warning("parsing [%s:%d] : %s\n", file, linenum, trash);
}
else if (!strcmp(args[0], "retries")) { /* connection retries */
if (warnifnotcap(curproxy, PR_CAP_BE, file, linenum, args[0], NULL))
return 0;

View File

@ -18,6 +18,7 @@
#include <sys/stat.h>
#include <common/defaults.h>
#include <common/cfgparse.h>
#include <common/compat.h>
#include <common/config.h>
#include <common/errors.h>
@ -80,11 +81,11 @@ const char *proxy_mode_str(int mode) {
* return zero, it may write an error message into the <err> buffer, for at
* most <errlen> bytes, trailing zero included. The trailing '\n' must not
* be written. The function must be called with <args> pointing to the first
* word after "timeout", with <proxy> pointing to the proxy being parsed, and
* command line word, with <proxy> pointing to the proxy being parsed, and
* <defpx> to the default proxy or NULL. As a special case for compatibility
* with older configs, it also accepts "{cli|srv|con}timeout" in args[0].
*/
int proxy_parse_timeout(const char **args, struct proxy *proxy,
static int proxy_parse_timeout(char **args, int section, struct proxy *proxy,
struct proxy *defpx, char *err, int errlen)
{
unsigned timeout;
@ -94,6 +95,11 @@ int proxy_parse_timeout(const char **args, struct proxy *proxy,
int *td = NULL;
retval = 0;
/* simply skip "timeout" but remain compatible with old form */
if (strcmp(args[0], "timeout") == 0)
args++;
name = args[0];
if (!strcmp(args[0], "client") || !strcmp(args[0], "clitimeout")) {
name = "client";
@ -500,6 +506,19 @@ void listen_proxies(void)
}
}
static struct cfg_kw_list cfg_kws = {{ },{
{ CFG_LISTEN, "timeout", proxy_parse_timeout },
{ CFG_LISTEN, "clitimeout", proxy_parse_timeout },
{ CFG_LISTEN, "contimeout", proxy_parse_timeout },
{ CFG_LISTEN, "srvtimeout", proxy_parse_timeout },
{ 0, NULL, NULL },
}};
__attribute__((constructor))
static void __proxy_module_init(void)
{
cfg_register_keywords(&cfg_kws);
}
/*
* Local variables: