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:
Max Kellermann 2009-06-10 08:01:07 +02:00
parent 5bb8a5eeef
commit d5ddecb15a
2 changed files with 26 additions and 3 deletions

1
NEWS
View File

@ -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

View File

@ -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);