diff options
author | Max Kellermann <max@musicpd.org> | 2019-02-25 13:01:42 +0100 |
---|---|---|
committer | Max Kellermann <max@musicpd.org> | 2019-02-25 13:08:33 +0100 |
commit | 44422b2b2f0a0bf29ffadfac0814b9bcd17db564 (patch) | |
tree | 119cbf3fecf2a3b313a8b04d3225bcc6ebb280ff | |
parent | f10afd38b5b94c7767e00701337d8f6aa5bf5222 (diff) |
event/ServerSocket, config/Net: abstract socket support
-rw-r--r-- | NEWS | 1 | ||||
-rw-r--r-- | doc/user.rst | 6 | ||||
-rw-r--r-- | src/config/Net.cxx | 4 | ||||
-rw-r--r-- | src/event/ServerSocket.cxx | 16 | ||||
-rw-r--r-- | src/event/ServerSocket.hxx | 12 |
5 files changed, 39 insertions, 0 deletions
@@ -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 |