MEDIUM: config: enumerate full list of registered "bind" keywords upon error

When an unknown "bind" keyword is detected, dump the list of all
registered keywords. Unsupported default alternatives are also reported
as "not supported".
This commit is contained in:
Willy Tarreau 2012-09-18 18:01:17 +02:00
parent d0a895d25f
commit 8638f4850f
3 changed files with 40 additions and 2 deletions

View File

@ -114,6 +114,9 @@ void bind_register_keywords(struct bind_kw_list *kwl);
/* Return a pointer to the bind keyword <kw>, or NULL if not found. */ /* Return a pointer to the bind keyword <kw>, or NULL if not found. */
struct bind_kw *bind_find_kw(const char *kw); struct bind_kw *bind_find_kw(const char *kw);
/* Dumps all registered "bind" keywords to the <out> string pointer. */
void bind_dump_kws(char **out);
/* allocate an bind_conf struct for a bind line, and chain it to list head <lh>. /* allocate an bind_conf struct for a bind line, and chain it to list head <lh>.
* If <arg> is not NULL, it is duplicated into ->arg to store useful config * If <arg> is not NULL, it is duplicated into ->arg to store useful config
* information for error reporting. * information for error reporting.

View File

@ -1709,7 +1709,10 @@ int cfg_parse_listen(const char *file, int linenum, char **args, int kwm)
} }
cur_arg = 2; cur_arg = 2;
while (*(args[cur_arg])) { while (*(args[cur_arg])) {
static int bind_dumped;
struct bind_kw *kw; struct bind_kw *kw;
char *err;
kw = bind_find_kw(args[cur_arg]); kw = bind_find_kw(args[cur_arg]);
if (kw) { if (kw) {
char *err = NULL; char *err = NULL;
@ -1745,8 +1748,18 @@ int cfg_parse_listen(const char *file, int linenum, char **args, int kwm)
continue; continue;
} }
Alert("parsing [%s:%d] : '%s %s' only supports the 'transparent', 'accept-proxy', 'defer-accept', 'name', 'id', 'mss', 'mode', 'uid', 'gid', 'user', 'group' and 'interface' options.\n", err = NULL;
file, linenum, args[0], args[1]); if (!bind_dumped) {
bind_dump_kws(&err);
indent_msg(&err, 4);
bind_dumped = 1;
}
Alert("parsing [%s:%d] : '%s %s' unknown keyword '%s'.%s%s\n",
file, linenum, args[0], args[1], args[cur_arg],
err ? " Registered keywords :" : "", err ? err : "");
free(err);
err_code |= ERR_ALERT | ERR_FATAL; err_code |= ERR_ALERT | ERR_FATAL;
goto out; goto out;
} }

View File

@ -455,6 +455,28 @@ struct bind_kw *bind_find_kw(const char *kw)
return ret; return ret;
} }
/* Dumps all registered "bind" keywords to the <out> string pointer. The
* unsupported keywords are only dumped if their supported form was not
* found.
*/
void bind_dump_kws(char **out)
{
struct bind_kw_list *kwl;
int index;
*out = NULL;
list_for_each_entry(kwl, &bind_keywords.list, list) {
for (index = 0; kwl->kw[index].kw != NULL; index++) {
if (kwl->kw[index].parse ||
bind_find_kw(kwl->kw[index].kw) == &kwl->kw[index]) {
memprintf(out, "%s%s %s\n", *out ? *out : "",
kwl->kw[index].kw,
kwl->kw[index].parse ? "" : "(not supported)");
}
}
}
}
/************************************************************************/ /************************************************************************/
/* All supported ACL keywords must be declared here. */ /* All supported ACL keywords must be declared here. */
/************************************************************************/ /************************************************************************/