MEDIUM: server: add a new init-addr server line setting

This new setting supports a comma-delimited list of methods used to
resolve the server's FQDN to an IP address. Currently supported methods
are "libc" (use the regular libc's resolver) and "last" (use the last
known valid address found in the state file).

The list is implemented in a 32-bit integer, because each init-addr
method only requires 3 bits. The last one must always be SRV_IADDR_END
(0), allowing to store up to 10 methods in a single 32 bit integer.

Note: the doc is provided at the end of this series.
diff --git a/src/server.c b/src/server.c
index f2e419d..9da8b27 100644
--- a/src/server.c
+++ b/src/server.c
@@ -1113,6 +1113,8 @@
 			       curproxy->defsrv.dns_opts.pref_net,
 			       sizeof(newsrv->dns_opts.pref_net));
 			newsrv->dns_opts.pref_net_nb = curproxy->defsrv.dns_opts.pref_net_nb;
+			newsrv->init_addr_methods = curproxy->defsrv.init_addr_methods;
+			newsrv->init_addr         = curproxy->defsrv.init_addr;
 
 			cur_arg = 3;
 		} else {
@@ -1161,6 +1163,40 @@
 				newsrv->cklen = strlen(args[cur_arg + 1]);
 				cur_arg += 2;
 			}
+			else if (!strcmp(args[cur_arg], "init-addr")) {
+				char *p, *end;
+				int done;
+
+				newsrv->init_addr_methods = 0;
+				memset(&newsrv->init_addr, 0, sizeof(newsrv->init_addr));
+
+				for (p = args[cur_arg + 1]; *p; p = end) {
+					/* cut on next comma */
+					for (end = p; *end && *end != ','; end++);
+					if (*end)
+						*(end++) = 0;
+
+					if (!strcmp(p, "libc")) {
+						done = srv_append_initaddr(&newsrv->init_addr_methods, SRV_IADDR_LIBC);
+					}
+					else if (!strcmp(p, "last")) {
+						done = srv_append_initaddr(&newsrv->init_addr_methods, SRV_IADDR_LAST);
+					}
+					else {
+						Alert("parsing [%s:%d]: '%s' : unknown init-addr method '%s', supported methods are 'libc', 'last'.\n",
+							file, linenum, args[cur_arg], p);
+						err_code |= ERR_ALERT | ERR_FATAL;
+						goto out;
+					}
+					if (!done) {
+						Alert("parsing [%s:%d]: '%s' : too many init-addr methods when trying to add '%s'\n",
+							file, linenum, args[cur_arg], p);
+						err_code |= ERR_ALERT | ERR_FATAL;
+						goto out;
+					}
+				}
+				cur_arg += 2;
+			}
 			else if (!defsrv && !strcmp(args[cur_arg], "redir")) {
 				newsrv->rdr_pfx = strdup(args[cur_arg + 1]);
 				newsrv->rdr_len = strlen(args[cur_arg + 1]);