[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.
diff --git a/include/proto/proxy.h b/include/proto/proxy.h
index 78f6120..4707e9a 100644
--- a/include/proto/proxy.h
+++ b/include/proto/proxy.h
@@ -38,8 +38,6 @@
 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
diff --git a/src/cfgparse.c b/src/cfgparse.c
index 91e6c55..b2af648 100644
--- a/src/cfgparse.c
+++ b/src/cfgparse.c
@@ -1087,27 +1087,6 @@
 			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;
diff --git a/src/proxy.c b/src/proxy.c
index e597fc5..f9589ec 100644
--- a/src/proxy.c
+++ b/src/proxy.c
@@ -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,12 +81,12 @@
  * 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,
-			struct proxy *defpx, char *err, int errlen)
+static int proxy_parse_timeout(char **args, int section, struct proxy *proxy,
+			       struct proxy *defpx, char *err, int errlen)
 {
 	unsigned timeout;
 	int retval, cap;
@@ -94,6 +95,11 @@
 	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 @@
 	}
 }
 
+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: