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_addr);
+int parse_server(const char *file, int linenum, char **args, struct proxy *curproxy, struct proxy *defproxy, int parse_addr, int in_peers_section);
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);
if (!strcmp(args[0], "server") ||
!strcmp(args[0], "default-server") ||
!strcmp(args[0], "server-template")) {
- err_code |= parse_server(file, linenum, args, curproxy, &defproxy, 1);
+ err_code |= parse_server(file, linenum, args, curproxy, &defproxy, 1, 0);
if (err_code & ERR_FATAL)
goto out;
}
err_code |= ERR_ALERT | ERR_ABORT;
goto out;
}
- err_code |= parse_server(file, linenum, args, curpeers->peers_fe, NULL, 0);
+ err_code |= parse_server(file, linenum, args, curpeers->peers_fe, NULL, 0, 1);
}
else if (strcmp(args[0], "log") == 0) {
if (init_peers_frontend(file, linenum, NULL, curpeers) != 0) {
* The server address is parsed only if we are parsing a "peer" line,
* or if we are parsing a "server" line and the current peer is not the local one.
*/
- err_code |= parse_server(file, linenum, args, curpeers->peers_fe, NULL, peer || !local_peer);
- if (!curpeers->peers_fe->srv)
+ err_code |= parse_server(file, linenum, args, curpeers->peers_fe, NULL, peer || !local_peer, 1);
+ if (!curpeers->peers_fe->srv) {
+ /* Remove the newly allocated peer. */
+ if (newpeer != curpeers->local) {
+ struct peer *p;
+
+ p = curpeers->remote;
+ curpeers->remote = curpeers->remote->next;
+ free(p->id);
+ free(p);
+ }
goto out;
+ }
/* If the peer address has just been parsed, let's copy it to <newpeer>
* and initializes ->proto.
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_addr)
+int parse_server(const char *file, int linenum, char **args, struct proxy *curproxy, struct proxy *defproxy, int parse_addr, int in_peers_section)
{
struct server *newsrv = NULL;
const char *err = NULL;
/* There is no mandatory first arguments for default server. */
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",
- file, linenum, args[0]);
- err_code |= ERR_ALERT | ERR_FATAL;
- goto out;
+ if (in_peers_section) {
+ return 0;
+ }
+ else {
+ /* 'server' line number of argument check. */
+ ha_alert("parsing [%s:%d] : '%s' expects <name> and <addr>[:<port>] as arguments.\n",
+ file, linenum, args[0]);
+ err_code |= ERR_ALERT | ERR_FATAL;
+ goto out;
+ }
}
err = invalid_char(args[1]);