MINOR: haproxy: add a registration for post-check functions

There's a significant amount of late initialization calls which are
performed after the point where we exit in check mode. These calls
are used to allocate resource and perform certain slow operations.
Let's have a way to register some functions which need to be called
there instead of having this multitude of #ifdef in the init path.
diff --git a/src/haproxy.c b/src/haproxy.c
index cd537ac..780ca3c 100644
--- a/src/haproxy.c
+++ b/src/haproxy.c
@@ -273,6 +273,19 @@
 	int must_free;
 };
 
+/* These functions are called just after the point where the program exits
+ * after a config validity check, so they are generally suited for resource
+ * allocation and slow initializations that should be skipped during basic
+ * config checks. The functions must return 0 on success, or a combination
+ * of ERR_* flags (ERR_WARN, ERR_ABORT, ERR_FATAL, ...). The 2 latter cause
+ * and immediate exit, so the function must have emitted any useful error.
+ */
+struct list post_check_list = LIST_HEAD_INIT(post_check_list);
+struct post_check_fct {
+	struct list list;
+	int (*fct)();
+};
+
 /*********************************************************************/
 /*  general purpose functions  ***************************************/
 /*********************************************************************/
@@ -294,6 +307,20 @@
 	LIST_ADDQ(&build_opts_list, &b->list);
 }
 
+/* used to register some initialization functions to call after the checks. */
+void hap_register_post_check(int (*fct)())
+{
+	struct post_check_fct *b;
+
+	b = calloc(1, sizeof(*b));
+	if (!b) {
+		fprintf(stderr, "out of memory\n");
+		exit(1);
+	}
+	b->fct = fct;
+	LIST_ADDQ(&post_check_list, &b->list);
+}
+
 static void display_version()
 {
 	printf("HA-Proxy version " HAPROXY_VERSION " " HAPROXY_DATE"\n");
@@ -584,6 +611,7 @@
 	char *progname;
 	char *change_dir = NULL;
 	struct proxy *px;
+	struct post_check_fct *pcf;
 
 	chunk_init(&trash, malloc(global.tune.bufsize), global.tune.bufsize);
 	alloc_trash_buffers(global.tune.bufsize);
@@ -921,6 +949,12 @@
 	if (start_checks() < 0)
 		exit(1);
 
+	list_for_each_entry(pcf, &post_check_list, list) {
+		err_code |= pcf->fct();
+		if (err_code & (ERR_ABORT|ERR_FATAL))
+			exit(1);
+	}
+
 	if (cfg_maxconn > 0)
 		global.maxconn = cfg_maxconn;