diff --git a/include/proto/proxy.h b/include/proto/proxy.h index f00f64697..6247c010b 100644 --- a/include/proto/proxy.h +++ b/include/proto/proxy.h @@ -30,6 +30,7 @@ int start_proxies(int verbose); void maintain_proxies(struct timeval *next); void soft_stop(void); void pause_proxy(struct proxy *p); +void stop_proxy(struct proxy *p); void pause_proxies(void); void listen_proxies(void); diff --git a/src/cfgparse.c b/src/cfgparse.c index 32f5d65df..5c525bf33 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -2609,6 +2609,8 @@ int readcfgfile(const char *file) struct listener *listener; if (curproxy->state == PR_STSTOPPED) { + /* ensure we don't keep listeners uselessly bound */ + stop_proxy(curproxy); curproxy = curproxy->next; continue; } diff --git a/src/proxy.c b/src/proxy.c index 7fe78c785..621992062 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -316,15 +316,7 @@ void maintain_proxies(struct timeval *next) if (t == 0) { Warning("Proxy %s stopped.\n", p->id); send_log(p, LOG_WARNING, "Proxy %s stopped.\n", p->id); - - for (l = p->listen; l != NULL; l = l->next) { - unbind_listener(l); - if (l->state >= LI_ASSIGNED) { - delete_listener(l); - listeners--; - } - } - p->state = PR_STSTOPPED; + stop_proxy(p); /* try to free more memory */ pool_gc2(); } @@ -386,6 +378,28 @@ void pause_proxy(struct proxy *p) } } + +/* + * This function completely stops a proxy and releases its listeners. It has + * to be called when going down in order to release the ports so that another + * process may bind to them. It must also be called on disabled proxies at the + * end of start-up. When all listeners are closed, the proxy is set to the + * PR_STSTOPPED state. + */ +void stop_proxy(struct proxy *p) +{ + struct listener *l; + + for (l = p->listen; l != NULL; l = l->next) { + unbind_listener(l); + if (l->state >= LI_ASSIGNED) { + delete_listener(l); + listeners--; + } + } + p->state = PR_STSTOPPED; +} + /* * This function temporarily disables listening so that another new instance * can start listening. It is designed to be called upon reception of a