event/ServerSocket, config/Net: abstract socket support
This commit is contained in:
		
							
								
								
									
										1
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								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 | ||||
|   | ||||
| @@ -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:: | ||||
|  | ||||
|   | ||||
| @@ -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); | ||||
| 	} | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Max Kellermann
					Max Kellermann