diff --git a/server/core/listener.cc b/server/core/listener.cc index 3a6e3d4f6..2a278737c 100644 --- a/server/core/listener.cc +++ b/server/core/listener.cc @@ -41,6 +41,7 @@ #include #include #include +#include static RSA* rsa_512 = NULL; static RSA* rsa_1024 = NULL; @@ -81,17 +82,6 @@ SERV_LISTENER::~SERV_LISTENER() SSL_LISTENER_free(ssl); } -/** - * Create a new listener structure - * - * @param protocol The name of the protocol module - * @param address The address to listen with - * @param port The port to listen on - * @param authenticator Name of the authenticator to be used - * @param options Authenticator options - * @param ssl SSL configuration - * @return New listener object or NULL if unable to allocate - */ SERV_LISTENER* listener_alloc(SERVICE* service, const char* name, const char* protocol, @@ -124,16 +114,52 @@ SERV_LISTENER* listener_alloc(SERVICE* service, auth_options, auth_instance, ssl); } -/** - * @brief Free a listener - * - * @param listener Listener to free - */ void listener_free(SERV_LISTENER* listener) { delete listener; } +void listener_destroy(SERV_LISTENER* listener) +{ + listener_set_active(listener, false); + listener_stop(listener); + + // TODO: This is not pretty but it works, revise when listeners are refactored. This is + // thread-safe as the listener is freed on the same thread that closes the socket. + close(listener->listener->fd); + listener->listener->fd = -1; +} + +bool listener_stop(SERV_LISTENER* listener) +{ + bool rval = false; + mxb_assert(listener->listener); + + if (listener->listener->session->state == SESSION_STATE_LISTENER + && poll_remove_dcb(listener->listener) == 0) + { + listener->listener->session->state = SESSION_STATE_LISTENER_STOPPED; + rval = true; + } + + return rval; +} + +bool listener_start(SERV_LISTENER* listener) +{ + bool rval = true; + mxb_assert(listener->listener); + + if (listener->listener->session->state == SESSION_STATE_LISTENER_STOPPED + && poll_add_dcb(listener->listener) == 0) + { + listener->listener->session->state = SESSION_STATE_LISTENER; + rval = true; + } + + return rval; +} + /** * Set the maximum SSL/TLS version the listener will support * @param ssl_listener Listener data to configure diff --git a/server/core/service.cc b/server/core/service.cc index e8c7eceee..d212b0288 100644 --- a/server/core/service.cc +++ b/server/core/service.cc @@ -596,9 +596,8 @@ bool serviceStopListener(SERVICE* svc, const char* name) { if (listener_is_active(listener) && listener->name == name) { - if (poll_remove_dcb(listener->listener) == 0) + if (listener_stop(listener)) { - listener->listener->session->state = SESSION_STATE_LISTENER_STOPPED; rval = true; } break; @@ -619,10 +618,8 @@ bool serviceStartListener(SERVICE* svc, const char* name) { if (listener_is_active(listener) && listener->name == name) { - if (listener->listener && listener->listener->session->state == SESSION_STATE_LISTENER_STOPPED - && poll_add_dcb(listener->listener) == 0) + if (listener_start(listener)) { - listener->listener->session->state = SESSION_STATE_LISTENER; rval = true; } break; @@ -672,14 +669,9 @@ bool serviceStop(SERVICE* service) for (SERV_LISTENER* listener = listener_iterator_init(service, &iter); listener; listener = listener_iterator_next(&iter)) { - if (listener_is_active(listener) - && listener->listener && listener->listener->session->state == SESSION_STATE_LISTENER) + if (listener_is_active(listener) && listener_stop(listener)) { - if (poll_remove_dcb(listener->listener) == 0) - { - listener->listener->session->state = SESSION_STATE_LISTENER_STOPPED; - listeners++; - } + listeners++; } } @@ -708,14 +700,9 @@ bool serviceStart(SERVICE* service) for (SERV_LISTENER* listener = listener_iterator_init(service, &iter); listener; listener = listener_iterator_next(&iter)) { - if (listener_is_active(listener) - && listener->listener && listener->listener->session->state == SESSION_STATE_LISTENER_STOPPED) + if (listener_is_active(listener) && listener_start(listener)) { - if (poll_add_dcb(listener->listener) == 0) - { - listener->listener->session->state = SESSION_STATE_LISTENER; - listeners++; - } + listeners++; } } @@ -754,18 +741,8 @@ bool service_remove_listener(Service* service, const char* target) { if (listener_is_active(listener) && listener->name == target) { - listener_set_active(listener, false); - - if (poll_remove_dcb(listener->listener) == 0) - { - listener->listener->session->state = SESSION_STATE_LISTENER_STOPPED; - rval = true; - - // TODO: This is not pretty but it works, revise when listeners are refactored. This is - // thread-safe as the listener is freed on the same thread that closes the socket. - close(listener->listener->fd); - listener->listener->fd = -1; - } + listener_destroy(listener); + rval = true; break; } }