From 5f328bc0178e506fdd9ddb5badcdc63dba68d82b Mon Sep 17 00:00:00 2001 From: Johan Wikman Date: Wed, 7 Mar 2018 13:16:26 +0200 Subject: [PATCH] MXS-1689 Add better error messages If a listener section specifies both a 'socket' and a 'port' the creation will fail with a clear error message. If 'address' and 'socket' is specified, there will be a warning that the address is meaningless. --- server/core/config.cc | 122 ++++++++++++++++++++++++------------------ 1 file changed, 70 insertions(+), 52 deletions(-) diff --git a/server/core/config.cc b/server/core/config.cc index c50c7f874..8908f08dd 100644 --- a/server/core/config.cc +++ b/server/core/config.cc @@ -3449,67 +3449,85 @@ int create_new_listener(CONFIG_CONTEXT *obj) if (raw_service_name && protocol && (socket || port)) { - char service_name[strlen(raw_service_name) + 1]; - strcpy(service_name, raw_service_name); - fix_section_name(service_name); - - SERVICE *service = service_find(service_name); - if (service) + if (socket && port) { - SERV_LISTENER *listener; - SSL_LISTENER *ssl_info = make_ssl_structure(obj, true, &error_count); - if (socket) - { - listener = service_find_listener(service, socket, NULL, 0); - - if (listener) - { - MXS_ERROR("Creation of listener '%s' for service '%s' failed, because " - "listener '%s' already listens on the socket '%s'.", - obj->object, raw_service_name, listener->name, socket); - error_count++; - } - else - { - serviceCreateListener(service, obj->object, protocol, socket, 0, - authenticator, authenticator_options, ssl_info); - } - } - - if (port) - { - listener = service_find_listener(service, NULL, address, atoi(port)); - - if (listener) - { - MXS_ERROR("Creation of listener '%s' for service '%s' failed, because " - "listener '%s' already listens on the port %s.", - obj->object, raw_service_name, listener->name, port); - error_count++; - } - else - { - serviceCreateListener(service, obj->object, protocol, address, atoi(port), - authenticator, authenticator_options, ssl_info); - } - } - - if (ssl_info && error_count) - { - free_ssl_structure(ssl_info); - } + MXS_ERROR("Creation of listener '%s' for service '%s' failed, because " + "both 'socket' and 'port' are defined. Only either one is allowed.", + obj->object, raw_service_name); + error_count++; } else { - MXS_ERROR("Listener '%s', service '%s' not found.", obj->object, - service_name); - error_count++; + char service_name[strlen(raw_service_name) + 1]; + strcpy(service_name, raw_service_name); + fix_section_name(service_name); + + SERVICE *service = service_find(service_name); + if (service) + { + SERV_LISTENER *listener; + SSL_LISTENER *ssl_info = make_ssl_structure(obj, true, &error_count); + if (socket) + { + if (address) + { + MXS_WARNING("In the definition of the listener `%s', the value of " + "'address' lacks meaning as the listener listens on a " + "domain socket ('%s') and not on a port.", + obj->object, socket); + } + + listener = service_find_listener(service, socket, NULL, 0); + + if (listener) + { + MXS_ERROR("Creation of listener '%s' for service '%s' failed, because " + "listener '%s' already listens on the socket '%s'.", + obj->object, raw_service_name, listener->name, socket); + error_count++; + } + else + { + serviceCreateListener(service, obj->object, protocol, socket, 0, + authenticator, authenticator_options, ssl_info); + } + } + + if (port) + { + listener = service_find_listener(service, NULL, address, atoi(port)); + + if (listener) + { + MXS_ERROR("Creation of listener '%s' for service '%s' failed, because " + "listener '%s' already listens on the port %s.", + obj->object, raw_service_name, listener->name, port); + error_count++; + } + else + { + serviceCreateListener(service, obj->object, protocol, address, atoi(port), + authenticator, authenticator_options, ssl_info); + } + } + + if (ssl_info && error_count) + { + free_ssl_structure(ssl_info); + } + } + else + { + MXS_ERROR("Listener '%s', service '%s' not found.", obj->object, + service_name); + error_count++; + } } } else { MXS_ERROR("Listener '%s' is missing a required parameter. A Listener " - "must have a service, port and protocol defined.", obj->object); + "must have a service, protocol and port (or socket) defined.", obj->object); error_count++; }