MINOR: server: Extract the code responsible of copying default-server settings.

This patch moves the code responsible of copying default server settings
to a new server instance from parse_server() function to new defsrv_*_cpy()
functions which may be used both during server lines parsing and during server
templates initializations to come.

These defsrv_*_cpy() do not make any reference to anything else than default
server settings.
diff --git a/src/server.c b/src/server.c
index 63569cf..fb99131 100644
--- a/src/server.c
+++ b/src/server.c
@@ -1575,6 +1575,193 @@
 		      file, linenum, args[0], args[1], args[cur_arg]);
 }
 
+static void srv_conn_src_sport_range_cpy(struct server *srv,
+                                            struct server *src)
+{
+	int range_sz;
+
+	range_sz = src->conn_src.sport_range->size;
+	if (range_sz > 0) {
+		srv->conn_src.sport_range = port_range_alloc_range(range_sz);
+		if (srv->conn_src.sport_range != NULL) {
+			int i;
+
+			for (i = 0; i < range_sz; i++) {
+				srv->conn_src.sport_range->ports[i] =
+					src->conn_src.sport_range->ports[i];
+			}
+		}
+	}
+}
+
+/*
+ * Copy <src> server connection source settings to <srv> server everything needed.
+ */
+static void srv_conn_src_cpy(struct server *srv, struct server *src)
+{
+	srv->conn_src.opts = src->conn_src.opts;
+	srv->conn_src.source_addr = src->conn_src.source_addr;
+
+	/* Source port range copy. */
+	if (src->conn_src.sport_range != NULL)
+		srv_conn_src_sport_range_cpy(srv, src);
+
+#ifdef CONFIG_HAP_TRANSPARENT
+	if (src->conn_src.bind_hdr_name != NULL) {
+		srv->conn_src.bind_hdr_name = strdup(src->conn_src.bind_hdr_name);
+		srv->conn_src.bind_hdr_len = strlen(src->conn_src.bind_hdr_name);
+	}
+	srv->conn_src.bind_hdr_occ = src->conn_src.bind_hdr_occ;
+	srv->conn_src.tproxy_addr  = src->conn_src.tproxy_addr;
+#endif
+	if (src->conn_src.iface_name != NULL)
+		srv->conn_src.iface_name = strdup(src->conn_src.iface_name);
+}
+
+/*
+ * Copy <src> server SSL settings to <srv> server allocating
+ * everything needed.
+ */
+#if defined(USE_OPENSSL)
+static void srv_ssl_settings_cpy(struct server *srv, struct server *src)
+{
+	if (src->ssl_ctx.ca_file != NULL)
+		srv->ssl_ctx.ca_file = strdup(src->ssl_ctx.ca_file);
+	if (src->ssl_ctx.crl_file != NULL)
+		srv->ssl_ctx.crl_file = strdup(src->ssl_ctx.crl_file);
+	if (src->ssl_ctx.client_crt != NULL)
+		srv->ssl_ctx.client_crt = strdup(src->ssl_ctx.client_crt);
+
+	srv->ssl_ctx.verify = src->ssl_ctx.verify;
+
+	if (src->ssl_ctx.verify_host != NULL)
+		srv->ssl_ctx.verify_host = strdup(src->ssl_ctx.verify_host);
+	if (src->ssl_ctx.ciphers != NULL)
+		srv->ssl_ctx.ciphers = strdup(src->ssl_ctx.ciphers);
+	if (src->sni_expr != NULL)
+		srv->sni_expr = strdup(src->sni_expr);
+}
+#endif
+
+/*
+ * Copy <src> server settings to <srv> server allocating
+ * everything needed.
+ */
+static void srv_settings_cpy(struct server *srv, struct server *src)
+{
+	/* Connection source settings copy */
+	srv_conn_src_cpy(srv, src);
+
+	srv->pp_opts = src->pp_opts;
+	if (src->rdr_pfx != NULL) {
+		srv->rdr_pfx = strdup(src->rdr_pfx);
+		srv->rdr_len = src->rdr_len;
+	}
+	if (src->cookie != NULL) {
+		srv->cookie = strdup(src->cookie);
+		srv->cklen  = src->cklen;
+	}
+	srv->use_ssl                  = src->use_ssl;
+	srv->check.addr = srv->agent.addr = src->check.addr;
+	srv->check.use_ssl            = src->check.use_ssl;
+	srv->check.port               = src->check.port;
+	/* Note: 'flags' field has potentially been already initialized. */
+	srv->flags                   |= src->flags;
+	srv->do_check                 = src->do_check;
+	srv->do_agent                 = src->do_agent;
+	if (srv->check.port)
+		srv->flags |= SRV_F_CHECKPORT;
+	srv->check.inter              = src->check.inter;
+	srv->check.fastinter          = src->check.fastinter;
+	srv->check.downinter          = src->check.downinter;
+	srv->agent.use_ssl            = src->agent.use_ssl;
+	srv->agent.port               = src->agent.port;
+	if (src->agent.send_string != NULL)
+		srv->agent.send_string = strdup(src->agent.send_string);
+	srv->agent.send_string_len    = src->agent.send_string_len;
+	srv->agent.inter              = src->agent.inter;
+	srv->agent.fastinter          = src->agent.fastinter;
+	srv->agent.downinter          = src->agent.downinter;
+	srv->maxqueue                 = src->maxqueue;
+	srv->minconn                  = src->minconn;
+	srv->maxconn                  = src->maxconn;
+	srv->slowstart                = src->slowstart;
+	srv->observe                  = src->observe;
+	srv->onerror                  = src->onerror;
+	srv->onmarkeddown             = src->onmarkeddown;
+	srv->onmarkedup               = src->onmarkedup;
+	if (src->trackit != NULL)
+		srv->trackit = strdup(src->trackit);
+	srv->consecutive_errors_limit = src->consecutive_errors_limit;
+	srv->uweight = srv->iweight   = src->iweight;
+
+	srv->check.send_proxy         = src->check.send_proxy;
+	/* health: up, but will fall down at first failure */
+	srv->check.rise = srv->check.health = src->check.rise;
+	srv->check.fall               = src->check.fall;
+
+	/* Here we check if 'disabled' is the default server state */
+	if (src->admin & (SRV_ADMF_CMAINT | SRV_ADMF_FMAINT)) {
+		srv->admin |= SRV_ADMF_CMAINT | SRV_ADMF_FMAINT;
+		srv->state        = SRV_ST_STOPPED;
+		srv->check.state |= CHK_ST_PAUSED;
+		srv->check.health = 0;
+	}
+
+	/* health: up but will fall down at first failure */
+	srv->agent.rise	= srv->agent.health = src->agent.rise;
+	srv->agent.fall	              = src->agent.fall;
+
+	if (src->resolvers_id != NULL)
+		srv->resolvers_id = strdup(src->resolvers_id);
+	srv->dns_opts.family_prio = src->dns_opts.family_prio;
+	if (srv->dns_opts.family_prio == AF_UNSPEC)
+		srv->dns_opts.family_prio = AF_INET6;
+	memcpy(srv->dns_opts.pref_net,
+	       src->dns_opts.pref_net,
+	       sizeof srv->dns_opts.pref_net);
+	srv->dns_opts.pref_net_nb     = src->dns_opts.pref_net_nb;
+
+	srv->init_addr_methods        = src->init_addr_methods;
+	srv->init_addr                = src->init_addr;
+#if defined(USE_OPENSSL)
+	srv_ssl_settings_cpy(srv, src);
+#endif
+#ifdef TCP_USER_TIMEOUT
+	srv->tcp_ut = src->tcp_ut;
+#endif
+}
+
+static struct server *new_server(struct proxy *proxy)
+{
+	struct server *srv;
+
+	srv = calloc(1, sizeof *srv);
+	if (!srv)
+		return NULL;
+
+	srv->obj_type = OBJ_TYPE_SERVER;
+	srv->proxy = proxy;
+	LIST_INIT(&srv->actconns);
+	LIST_INIT(&srv->pendconns);
+	LIST_INIT(&srv->priv_conns);
+	LIST_INIT(&srv->idle_conns);
+	LIST_INIT(&srv->safe_conns);
+
+	srv->state = SRV_ST_RUNNING; /* early server setup */
+	srv->last_change = now.tv_sec;
+
+	srv->check.status = HCHK_STATUS_INI;
+	srv->check.server = srv;
+	srv->check.tcpcheck_rules = &proxy->tcpcheck_rules;
+
+	srv->agent.status = HCHK_STATUS_INI;
+	srv->agent.server = srv;
+	srv->xprt  = srv->check.xprt = srv->agent.xprt = xprt_get(XPRT_RAW);
+
+	return srv;
+}
+
 int parse_server(const char *file, int linenum, char **args, struct proxy *curproxy, struct proxy *defproxy)
 {
 	struct server *newsrv = NULL;
@@ -1617,7 +1804,8 @@
 			struct protocol *proto;
 			struct dns_resolution *curr_resolution;
 
-			if ((newsrv = calloc(1, sizeof(*newsrv))) == NULL) {
+			newsrv = new_server(curproxy);
+			if (!newsrv) {
 				Alert("parsing [%s:%d] : out of memory.\n", file, linenum);
 				err_code |= ERR_ALERT | ERR_ABORT;
 				goto out;
@@ -1626,20 +1814,8 @@
 			/* the servers are linked backwards first */
 			newsrv->next = curproxy->srv;
 			curproxy->srv = newsrv;
-			newsrv->proxy = curproxy;
 			newsrv->conf.file = strdup(file);
 			newsrv->conf.line = linenum;
-
-			newsrv->obj_type = OBJ_TYPE_SERVER;
-			LIST_INIT(&newsrv->actconns);
-			LIST_INIT(&newsrv->pendconns);
-			LIST_INIT(&newsrv->priv_conns);
-			LIST_INIT(&newsrv->idle_conns);
-			LIST_INIT(&newsrv->safe_conns);
-			newsrv->flags = 0;
-			newsrv->admin = 0;
-			newsrv->state = SRV_ST_RUNNING; /* early server setup */
-			newsrv->last_change = now.tv_sec;
 			newsrv->id = strdup(args[1]);
 
 			/* several ways to check the port component :
@@ -1707,7 +1883,6 @@
  skip_name_resolution:
 			newsrv->addr = *sk;
 			newsrv->svc_port = port;
-			newsrv->xprt  = newsrv->check.xprt = newsrv->agent.xprt = xprt_get(XPRT_RAW);
 
 			if (!newsrv->hostname && !protocol_by_family(newsrv->addr.ss_family)) {
 				Alert("parsing [%s:%d] : Unknown protocol family %d '%s'\n",
@@ -1715,136 +1890,9 @@
 				err_code |= ERR_ALERT | ERR_FATAL;
 				goto out;
 			}
-
-			/*
-			 * In this section we copy default-server connection source settings to
-			 * the new server object connection source
-			 * (newsrv->conn_src <- curproxy->defsrv.conn_src).
-			 */
-			newsrv->conn_src.opts = curproxy->defsrv.conn_src.opts;
-			newsrv->conn_src.source_addr = curproxy->defsrv.conn_src.source_addr;
-			if (curproxy->defsrv.conn_src.sport_range != NULL) {
-				int i, def_sport_range_sz;
-				struct server *default_srv;
-
-				default_srv = &curproxy->defsrv;
-				def_sport_range_sz = default_srv->conn_src.sport_range->size;
-				if (def_sport_range_sz > 0) {
-					newsrv->conn_src.sport_range = port_range_alloc_range(def_sport_range_sz);
-					if (newsrv->conn_src.sport_range) {
-						for (i = 0; i < def_sport_range_sz; i++)
-							newsrv->conn_src.sport_range->ports[i] = default_srv->conn_src.sport_range->ports[i];
-					}
-				}
-			}
-#ifdef CONFIG_HAP_TRANSPARENT
-			if (curproxy->defsrv.conn_src.bind_hdr_name != NULL) {
-				newsrv->conn_src.bind_hdr_name = strdup(curproxy->defsrv.conn_src.bind_hdr_name);
-				newsrv->conn_src.bind_hdr_len = strlen(curproxy->defsrv.conn_src.bind_hdr_name);
-			}
-			newsrv->conn_src.bind_hdr_occ = curproxy->defsrv.conn_src.bind_hdr_occ;
-			newsrv->conn_src.tproxy_addr = curproxy->defsrv.conn_src.tproxy_addr;
-#endif
-			if (curproxy->defsrv.conn_src.iface_name != NULL)
-				newsrv->conn_src.iface_name = strdup(curproxy->defsrv.conn_src.iface_name);
-
-			newsrv->pp_opts		= curproxy->defsrv.pp_opts;
-			if (curproxy->defsrv.rdr_pfx != NULL) {
-				newsrv->rdr_pfx = strdup(curproxy->defsrv.rdr_pfx);
-				newsrv->rdr_len = curproxy->defsrv.rdr_len;
-			}
-			if (curproxy->defsrv.cookie != NULL) {
-				newsrv->cookie = strdup(curproxy->defsrv.cookie);
-				newsrv->cklen = curproxy->defsrv.cklen;
-			}
-			newsrv->use_ssl		= curproxy->defsrv.use_ssl;
-			newsrv->check.addr = newsrv->agent.addr = curproxy->defsrv.check.addr;
-			newsrv->check.use_ssl	= curproxy->defsrv.check.use_ssl;
-			newsrv->check.port	= curproxy->defsrv.check.port;
-			/* Note: 'flags' field has potentially been already initialized. */
-			newsrv->flags       |= curproxy->defsrv.flags;
-			newsrv->do_check    = curproxy->defsrv.do_check;
-			newsrv->do_agent    = curproxy->defsrv.do_agent;
-			if (newsrv->check.port)
-				newsrv->flags |= SRV_F_CHECKPORT;
-			newsrv->check.inter	= curproxy->defsrv.check.inter;
-			newsrv->check.fastinter	= curproxy->defsrv.check.fastinter;
-			newsrv->check.downinter	= curproxy->defsrv.check.downinter;
-			newsrv->agent.use_ssl	= curproxy->defsrv.agent.use_ssl;
-			newsrv->agent.port	= curproxy->defsrv.agent.port;
-			if (curproxy->defsrv.agent.send_string != NULL)
-				newsrv->agent.send_string = strdup(curproxy->defsrv.agent.send_string);
-			newsrv->agent.send_string_len = curproxy->defsrv.agent.send_string_len;
-			newsrv->agent.inter	= curproxy->defsrv.agent.inter;
-			newsrv->agent.fastinter	= curproxy->defsrv.agent.fastinter;
-			newsrv->agent.downinter	= curproxy->defsrv.agent.downinter;
-			newsrv->maxqueue	= curproxy->defsrv.maxqueue;
-			newsrv->minconn		= curproxy->defsrv.minconn;
-			newsrv->maxconn		= curproxy->defsrv.maxconn;
-			newsrv->slowstart	= curproxy->defsrv.slowstart;
-			newsrv->observe         = curproxy->defsrv.observe;
-			newsrv->onerror		= curproxy->defsrv.onerror;
-			newsrv->onmarkeddown    = curproxy->defsrv.onmarkeddown;
-			newsrv->onmarkedup      = curproxy->defsrv.onmarkedup;
-			if (curproxy->defsrv.trackit != NULL)
-				newsrv->trackit = strdup(curproxy->defsrv.trackit);
-			newsrv->consecutive_errors_limit
-						= curproxy->defsrv.consecutive_errors_limit;
-			newsrv->uweight = newsrv->iweight
-						= curproxy->defsrv.iweight;
-
-			newsrv->check.status	= HCHK_STATUS_INI;
-			newsrv->check.send_proxy = curproxy->defsrv.check.send_proxy;
-			newsrv->check.rise	= curproxy->defsrv.check.rise;
-			newsrv->check.fall	= curproxy->defsrv.check.fall;
-			newsrv->check.health	= newsrv->check.rise;	/* up, but will fall down at first failure */
-			/* Here we check if 'disabled' is the default server state */
-			if (curproxy->defsrv.admin & (SRV_ADMF_CMAINT | SRV_ADMF_FMAINT)) {
-				newsrv->admin |= SRV_ADMF_CMAINT | SRV_ADMF_FMAINT;
-				newsrv->state = SRV_ST_STOPPED;
-				newsrv->check.state |= CHK_ST_PAUSED;
-				newsrv->check.health = 0;
-			}
-			newsrv->check.server	= newsrv;
-			newsrv->check.tcpcheck_rules	= &curproxy->tcpcheck_rules;
-
-			newsrv->agent.status	= HCHK_STATUS_INI;
-			newsrv->agent.rise	= curproxy->defsrv.agent.rise;
-			newsrv->agent.fall	= curproxy->defsrv.agent.fall;
-			newsrv->agent.health	= newsrv->agent.rise;	/* up, but will fall down at first failure */
-			newsrv->agent.server	= newsrv;
-			if (curproxy->defsrv.resolvers_id != NULL)
-				newsrv->resolvers_id = strdup(curproxy->defsrv.resolvers_id);
-			newsrv->dns_opts.family_prio = curproxy->defsrv.dns_opts.family_prio;
-			if (newsrv->dns_opts.family_prio == AF_UNSPEC)
-				newsrv->dns_opts.family_prio = AF_INET6;
-			memcpy(newsrv->dns_opts.pref_net,
-			       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;
-#if defined(USE_OPENSSL)
-			/* SSL config. */
-			if (curproxy->defsrv.ssl_ctx.ca_file != NULL)
-				newsrv->ssl_ctx.ca_file = strdup(curproxy->defsrv.ssl_ctx.ca_file);
-			if (curproxy->defsrv.ssl_ctx.crl_file != NULL)
-				newsrv->ssl_ctx.crl_file = strdup(curproxy->defsrv.ssl_ctx.crl_file);
-			if (curproxy->defsrv.ssl_ctx.client_crt != NULL)
-				newsrv->ssl_ctx.client_crt = strdup(curproxy->defsrv.ssl_ctx.client_crt);
-			newsrv->ssl_ctx.verify = curproxy->defsrv.ssl_ctx.verify;
-			if (curproxy->defsrv.ssl_ctx.verify_host != NULL)
-				newsrv->ssl_ctx.verify_host = strdup(curproxy->defsrv.ssl_ctx.verify_host);
-			if (curproxy->defsrv.ssl_ctx.ciphers != NULL)
-				newsrv->ssl_ctx.ciphers = strdup(curproxy->defsrv.ssl_ctx.ciphers);
-			if (curproxy->defsrv.sni_expr != NULL)
-				newsrv->sni_expr = strdup(curproxy->defsrv.sni_expr);
-#endif
-
-#ifdef TCP_USER_TIMEOUT
-			newsrv->tcp_ut = curproxy->defsrv.tcp_ut;
-#endif
 
+			/* Copy default server settings to new server settings. */
+			srv_settings_cpy(newsrv, &curproxy->defsrv);
 			cur_arg = 3;
 		} else {
 			newsrv = &curproxy->defsrv;