diff --git a/NEWS b/NEWS index df06c6ca6..664b9fb38 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,7 @@ ver 0.21.6 (not yet released) * input - cdio_paranoia: fix build failure due to missing #include +* support abstract sockets on Linux ver 0.21.5 (2019/02/22) * protocol diff --git a/doc/user.rst b/doc/user.rst index b16956fc3..9bc049d8e 100644 --- a/doc/user.rst +++ b/doc/user.rst @@ -531,6 +531,12 @@ choice:: bind_to_address "/var/run/mpd/socket" +On Linux, local sockets can be bound to a name without a socket inode +on the filesystem; MPD implements this by prepending ``@`` to the +address:: + + bind_to_address "@mpd" + If no port is specified, the default port is 6600. This default can be changed with the port setting:: diff --git a/src/config/Net.cxx b/src/config/Net.cxx index 4c0e6f3b5..afba81f9d 100644 --- a/src/config/Net.cxx +++ b/src/config/Net.cxx @@ -29,6 +29,10 @@ ServerSocketAddGeneric(ServerSocket &server_socket, const char *address, unsigne server_socket.AddPort(port); } else if (address[0] == '/' || address[0] == '~') { server_socket.AddPath(ParsePath(address)); +#ifdef __linux__ + } else if (address[0] == '@') { + server_socket.AddAbstract(address); +#endif } else { server_socket.AddHost(address, port); } diff --git a/src/event/ServerSocket.cxx b/src/event/ServerSocket.cxx index 6f675dddc..73e070c9e 100644 --- a/src/event/ServerSocket.cxx +++ b/src/event/ServerSocket.cxx @@ -396,3 +396,19 @@ ServerSocket::AddPath(AllocatedPath &&path) #endif /* !HAVE_UN */ } + +#ifdef __linux__ + +void +ServerSocket::AddAbstract(const char *name) +{ + assert(name != nullptr); + assert(*name == '@'); + + AllocatedSocketAddress address; + address.SetLocal(name); + + AddAddress(std::move(address)); +} + +#endif diff --git a/src/event/ServerSocket.hxx b/src/event/ServerSocket.hxx index 22edff428..8a36dded7 100644 --- a/src/event/ServerSocket.hxx +++ b/src/event/ServerSocket.hxx @@ -99,6 +99,18 @@ public: */ void AddPath(AllocatedPath &&path); +#ifdef __linux__ + /** + * Add a listener on an abstract local socket (Linux specific). + * + * Throws on error. + * + * @param name the abstract socket name, starting with a '@' + * instead of a null byte + */ + void AddAbstract(const char *name); +#endif + /** * Add a socket descriptor that is accepting connections. After this * has been called, don't call server_socket_open(), because the