aboutsummaryrefslogtreecommitdiff
path: root/server.c
diff options
context:
space:
mode:
Diffstat (limited to 'server.c')
-rw-r--r--server.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/server.c b/server.c
index 1d30f35..3b4c0dc 100644
--- a/server.c
+++ b/server.c
@@ -101,11 +101,27 @@ server_shutdown(void)
int
server_privinit(struct server *srv)
{
+ struct server *s;
+
if (srv->srv_conf.flags & SRVFLAG_LOCATION)
return (0);
log_debug("%s: adding server %s", __func__, srv->srv_conf.name);
+ /*
+ * There's no need to open a new socket if a server with the
+ * same address already exists.
+ */
+ TAILQ_FOREACH(s, env->sc_servers, srv_entry) {
+ if (s != srv && s->srv_s != -1 &&
+ s->srv_conf.port == srv->srv_conf.port &&
+ sockaddr_cmp((struct sockaddr *)&s->srv_conf.ss,
+ (struct sockaddr *)&srv->srv_conf.ss,
+ s->srv_conf.prefixlen) == 0)
+ return (0);
+ }
+
+ /* Open listening socket in the privileged process */
if ((srv->srv_s = server_socket_listen(&srv->srv_conf.ss,
srv->srv_conf.port, &srv->srv_conf)) == -1)
return (-1);
@@ -277,7 +293,8 @@ server_purge(struct server *srv)
if (evtimer_initialized(&srv->srv_evt))
evtimer_del(&srv->srv_evt);
- close(srv->srv_s);
+ if (srv->srv_s != -1)
+ close(srv->srv_s);
TAILQ_REMOVE(env->sc_servers, srv, srv_entry);
/* cleanup sessions */