From: Frédéric Lécaille <flecai...@haproxy.com>

With this patch the "server" lines do not parse anymore the bind address
for local peers.
We do not use anymore list_for_each_entry() to set the "peers" section
listeners parameter because there is only one listener by "peers" section.
---
 include/proto/server.h |  2 +-
 src/cfgparse-listen.c  |  2 +-
 src/cfgparse.c         | 58 ++++++++++++++++++++++++++++++++------------------
 src/server.c           | 10 ++++++---
 4 files changed, 46 insertions(+), 26 deletions(-)

diff --git a/include/proto/server.h b/include/proto/server.h
index b3a9b877..436ffb5d 100644
--- a/include/proto/server.h
+++ b/include/proto/server.h
@@ -39,7 +39,7 @@
 int srv_downtime(const struct server *s);
 int srv_lastsession(const struct server *s);
 int srv_getinter(const struct check *check);
-int parse_server(const char *file, int linenum, char **args, struct proxy 
*curproxy, struct proxy *defproxy);
+int parse_server(const char *file, int linenum, char **args, struct proxy 
*curproxy, struct proxy *defproxy, int parse_addr);
 int update_server_addr(struct server *s, void *ip, int ip_sin_family, const 
char *updater);
 const char *update_server_addr_port(struct server *s, const char *addr, const 
char *port, char *updater);
 struct server *server_find_by_id(struct proxy *bk, int id);
diff --git a/src/cfgparse-listen.c b/src/cfgparse-listen.c
index aa2d8608..fdbdfd34 100644
--- a/src/cfgparse-listen.c
+++ b/src/cfgparse-listen.c
@@ -677,7 +677,7 @@ int cfg_parse_listen(const char *file, int linenum, char 
**args, int kwm)
        if (!strcmp(args[0], "server")         ||
            !strcmp(args[0], "default-server") ||
            !strcmp(args[0], "server-template")) {
-               err_code |= parse_server(file, linenum, args, curproxy, 
&defproxy);
+               err_code |= parse_server(file, linenum, args, curproxy, 
&defproxy, 1);
                if (err_code & ERR_FATAL)
                        goto out;
        }
diff --git a/src/cfgparse.c b/src/cfgparse.c
index 2a6a4839..4d0a9ade 100644
--- a/src/cfgparse.c
+++ b/src/cfgparse.c
@@ -623,8 +623,7 @@ int cfg_parse_peers(const char *file, int linenum, char 
**args, int kwm)
                bind_conf = bind_conf_uniq_alloc(curpeers->peers_fe, file, 
linenum,
                                                 NULL, xprt_get(XPRT_RAW));
                if (*args[0] == 'b') {
-                       struct sockaddr_storage *sk;
-                       int port, port1, port2;
+                       struct listener *l;
 
                        if (peer_line) {
                                ha_alert("parsing [%s:%d] : mixing \"peer\" and 
\"bind\" line is forbidden\n", file, linenum);
@@ -632,13 +631,26 @@ int cfg_parse_peers(const char *file, int linenum, char 
**args, int kwm)
                                goto out;
                        }
 
-                       sk = str2sa_range(args[1], &port, &port1, &port2, 
&errmsg, NULL, NULL, 0);
-                       if (!sk) {
-                               ha_alert("parsing [%s:%d]: '%s %s': %s\n",
-                                                file, linenum, args[0], 
args[1], errmsg);
-                               err_code |= ERR_ALERT | ERR_FATAL;
+                       if (!str2listener(args[1], curpeers->peers_fe, 
bind_conf, file, linenum, &errmsg)) {
+                               if (errmsg && *errmsg) {
+                                       indent_msg(&errmsg, 2);
+                                       ha_alert("parsing +[%s:%d] : '%s %s' : 
%s\n", file, linenum, args[0], args[1], errmsg);
+                               }
+                               else
+                                       ha_alert("parsing [%s:%d] : '%s %s' : 
error encountered while parsing listening address %s.\n",
+                                                        file, linenum, 
args[0], args[1], args[2]);
+                               err_code |= ERR_FATAL;
                                goto out;
                        }
+                       l = LIST_ELEM(bind_conf->listeners.n, typeof(l), 
by_bind);
+                       l->maxaccept = 1;
+                       l->maxconn = curpeers->peers_fe->maxconn;
+                       l->backlog = curpeers->peers_fe->backlog;
+                       l->accept = session_accept_fd;
+                       l->analysers |=  curpeers->peers_fe->fe_req_ana;
+                       l->default_target = curpeers->peers_fe->default_target;
+                       l->options |= LI_O_UNLIMITED; /* don't make the peers 
subject to global limits */
+                       global.maxsock += l->maxconn;
 
                        bind_line = 1;
                        if (cfg_peers->local) {
@@ -655,7 +667,7 @@ int cfg_parse_peers(const char *file, int linenum, char 
**args, int kwm)
                                        goto out;
                                }
                        }
-                       newpeer->addr = *sk;
+                       newpeer->addr = l->addr;
                        newpeer->proto = 
protocol_by_family(newpeer->addr.ss_family);
                        cur_arg++;
                }
@@ -698,7 +710,7 @@ int cfg_parse_peers(const char *file, int linenum, char 
**args, int kwm)
                        err_code |= ERR_ALERT | ERR_ABORT;
                        goto out;
                }
-               err_code |= parse_server(file, linenum, args, 
curpeers->peers_fe, NULL);
+               err_code |= parse_server(file, linenum, args, 
curpeers->peers_fe, NULL, 0);
        }
        else if (strcmp(args[0], "peers") == 0) { /* new peers section */
                /* Initialize these static variables when entering a new 
"peers" section*/
@@ -792,7 +804,7 @@ int cfg_parse_peers(const char *file, int linenum, char 
**args, int kwm)
                }
 
                /* This initializes curpeer->peers->peers_fe->srv. */
-               err_code |= parse_server(file, linenum, args, 
curpeers->peers_fe, NULL);
+               err_code |= parse_server(file, linenum, args, 
curpeers->peers_fe, NULL, !local_peer);
                if (!curpeers->peers_fe->srv)
                        goto out;
 
@@ -807,12 +819,16 @@ int cfg_parse_peers(const char *file, int linenum, char 
**args, int kwm)
                        goto out;
                }
 
+               /* The lines above are reserved to "peer" lines. */
+               if (*args[0] == 's')
+                       goto out;
+
                bind_conf = bind_conf_uniq_alloc(curpeers->peers_fe, file, 
linenum, args[2], xprt_get(XPRT_RAW));
 
                if (!str2listener(args[2], curpeers->peers_fe, bind_conf, file, 
linenum, &errmsg)) {
                        if (errmsg && *errmsg) {
                                indent_msg(&errmsg, 2);
-                               ha_alert("parsing [%s:%d] : '%s %s' : %s\n", 
file, linenum, args[0], args[1], errmsg);
+                               ha_alert("parsing +[%s:%d] : '%s %s' : %s\n", 
file, linenum, args[0], args[1], errmsg);
                        }
                        else
                                ha_alert("parsing [%s:%d] : '%s %s' : error 
encountered while parsing listening address %s.\n",
@@ -820,16 +836,16 @@ int cfg_parse_peers(const char *file, int linenum, char 
**args, int kwm)
                        err_code |= ERR_FATAL;
                        goto out;
                }
-               list_for_each_entry(l, &bind_conf->listeners, by_bind) {
-                       l->maxaccept = 1;
-                       l->maxconn = curpeers->peers_fe->maxconn;
-                       l->backlog = curpeers->peers_fe->backlog;
-                       l->accept = session_accept_fd;
-                       l->analysers |=  curpeers->peers_fe->fe_req_ana;
-                       l->default_target = curpeers->peers_fe->default_target;
-                       l->options |= LI_O_UNLIMITED; /* don't make the peers 
subject to global limits */
-                       global.maxsock += l->maxconn;
-               }
+
+               l = LIST_ELEM(bind_conf->listeners.n, typeof(l), by_bind);
+               l->maxaccept = 1;
+               l->maxconn = curpeers->peers_fe->maxconn;
+               l->backlog = curpeers->peers_fe->backlog;
+               l->accept = session_accept_fd;
+               l->analysers |=  curpeers->peers_fe->fe_req_ana;
+               l->default_target = curpeers->peers_fe->default_target;
+               l->options |= LI_O_UNLIMITED; /* don't make the peers subject 
to global limits */
+               global.maxsock += l->maxconn;
        } /* neither "peer" nor "peers" */
        else if (!strcmp(args[0], "disabled")) {  /* disables this peers 
section */
                curpeers->state = PR_STSTOPPED;
diff --git a/src/server.c b/src/server.c
index 7f8b2855..f1327d8f 100644
--- a/src/server.c
+++ b/src/server.c
@@ -2077,7 +2077,7 @@ static int server_template_init(struct server *srv, 
struct proxy *px)
        return i - srv->tmpl_info.nb_low;
 }
 
-int parse_server(const char *file, int linenum, char **args, struct proxy 
*curproxy, struct proxy *defproxy)
+int parse_server(const char *file, int linenum, char **args, struct proxy 
*curproxy, struct proxy *defproxy, int parse_addr)
 {
        struct server *newsrv = NULL;
        const char *err = NULL;
@@ -2105,7 +2105,7 @@ int parse_server(const char *file, int linenum, char 
**args, struct proxy *curpr
                        err_code |= ERR_WARN;
 
                /* There is no mandatory first arguments for default server. */
-               if (srv) {
+               if (srv && parse_addr) {
                        if (!*args[2]) {
                                /* 'server' line number of argument check. */
                                ha_alert("parsing [%s:%d] : '%s' expects <name> 
and <addr>[:<port>] as arguments.\n",
@@ -2185,6 +2185,9 @@ int parse_server(const char *file, int linenum, char 
**args, struct proxy *curpr
                         *  - IP:+N => port=+N, relative
                         *  - IP:-N => port=-N, relative
                         */
+                       if (!parse_addr)
+                               goto skip_addr;
+
                        sk = str2sa_range(args[cur_arg], &port, &port1, &port2, 
&errmsg, NULL, &fqdn, 0);
                        if (!sk) {
                                ha_alert("parsing [%s:%d] : '%s %s' : %s\n", 
file, linenum, args[0], args[1], errmsg);
@@ -2241,10 +2244,11 @@ int parse_server(const char *file, int linenum, char 
**args, struct proxy *curpr
                                goto out;
                        }
 
+                       cur_arg++;
+ skip_addr:
                        /* Copy default server settings to new server settings. 
*/
                        srv_settings_cpy(newsrv, &curproxy->defsrv, 0);
                        HA_SPIN_INIT(&newsrv->lock);
-                       cur_arg++;
                } else {
                        newsrv = &curproxy->defsrv;
                        cur_arg = 1;
-- 
2.11.0

Reply via email to