listen: bind() failure on secondary address is non-fatal
Several users had problems with binding MPD to "localhost". The cause was duplicate /etc/hosts entries: the resolver library returns 127.0.0.1 twice, and of course, MPD attempts to bind to "both" of them. This patch makes failures non-fatal, given that at least one address was bound successfully. This is a workaround; users should rather fix their /etc/hosts file.
This commit is contained in:
parent
5bb8a5eeef
commit
d5ddecb15a
1
NEWS
1
NEWS
|
@ -68,6 +68,7 @@ ver 0.15 (200?/??/??)
|
|||
* pause when all audio outputs fail to play
|
||||
* daemon: ignore "user" setting if already running as that user
|
||||
* listen: fix broken client IP addresses in log
|
||||
* listen: bind failure on secondary address is non-fatal
|
||||
* 24/32 bit audio support
|
||||
* print available protocols in --version
|
||||
* fill buffer after seeking
|
||||
|
|
28
src/listen.c
28
src/listen.c
|
@ -247,10 +247,32 @@ listen_add_host(const char *hostname, unsigned port, GError **error_r)
|
|||
}
|
||||
|
||||
for (i = ai; i != NULL; i = i->ai_next) {
|
||||
GError *error = NULL;
|
||||
|
||||
success = listen_add_address(i->ai_family, i->ai_addr,
|
||||
i->ai_addrlen, error_r);
|
||||
if (!success)
|
||||
return false;
|
||||
i->ai_addrlen, &error);
|
||||
if (!success) {
|
||||
if (i == ai) {
|
||||
/* first bind has failed: fatal
|
||||
error */
|
||||
g_propagate_error(error_r, error);
|
||||
return false;
|
||||
} else {
|
||||
char *address_string =
|
||||
sockaddr_to_string(i->ai_addr,
|
||||
i->ai_addrlen,
|
||||
NULL);
|
||||
if (address_string == NULL)
|
||||
address_string = g_strdup("[unknown]");
|
||||
|
||||
g_warning("bind to %s failed: %s "
|
||||
"(continuing anyway, because at "
|
||||
"least one address is bound)",
|
||||
address_string, error->message);
|
||||
g_free(address_string);
|
||||
g_error_free(error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
freeaddrinfo(ai);
|
||||
|
|
Loading…
Reference in New Issue