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.
This commit is contained in:
Johan Wikman
2018-03-07 13:16:26 +02:00
parent 7ae3931511
commit 5f328bc017

View File

@ -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++;
}