diff --git a/server/core/internal/service.hh b/server/core/internal/service.hh index 147cd4fbc..b1ff7db03 100644 --- a/server/core/internal/service.hh +++ b/server/core/internal/service.hh @@ -337,6 +337,14 @@ SListener service_find_listener(Service* service, */ bool service_port_is_used(int port); +/** + * @brief Check if a MaxScale service listens on a Unix domain socket + * + * @param path The socket path to check + * @return True if a MaxScale service uses the socket + */ +bool service_socket_is_used(const std::string& socket_path); + /** * @brief Check if the service has a listener with a matching name * diff --git a/server/core/server.cc b/server/core/server.cc index 174bf32ee..f1e9ade9d 100644 --- a/server/core/server.cc +++ b/server/core/server.cc @@ -914,10 +914,17 @@ bool SERVER::is_mxs_service() bool rval = false; /** Do a coarse check for local server pointing to a MaxScale service */ - if (strcmp(address, "127.0.0.1") == 0 - || strcmp(address, "::1") == 0 - || strcmp(address, "localhost") == 0 - || strcmp(address, "localhost.localdomain") == 0) + if (address[0] == '/') + { + if (service_socket_is_used(address)) + { + rval = true; + } + } + else if (strcmp(address, "127.0.0.1") == 0 + || strcmp(address, "::1") == 0 + || strcmp(address, "localhost") == 0 + || strcmp(address, "localhost.localdomain") == 0) { if (service_port_is_used(port)) { diff --git a/server/core/service.cc b/server/core/service.cc index c58571975..1c3d3b9db 100644 --- a/server/core/service.cc +++ b/server/core/service.cc @@ -1559,6 +1559,31 @@ bool service_port_is_used(int port) return rval; } +bool service_socket_is_used(const std::string& socket_path) +{ + bool rval = false; + LockGuard guard(this_unit.lock); + + for (Service* service : this_unit.services) + { + for (const auto& listener : listener_find_by_service(service)) + { + if (listener->address() == socket_path) + { + rval = true; + break; + } + } + + if (rval) + { + break; + } + } + + return rval; +} + static const char* service_state_to_string(int state) { switch (state)