From: Ralf Habacker Date: Fri, 30 Jan 2015 19:19:01 +0000 (+0100) Subject: Fix 'dbus-daemon on Windows: Failed to bind socket "localhost:xxxx": Address already... X-Git-Tag: dbus-1.8.18~14 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b8bb0119ef84e396e3b5a156312b45d0e3094ae0;p=thirdparty%2Fdbus.git Fix 'dbus-daemon on Windows: Failed to bind socket "localhost:xxxx": Address already in use'. Bug: https://bugs.freedesktop.org/show_bug.cgi?id=87999 Reviewed-by: Simon McVittie (cherry picked from commit 795ea3007ed211e50249e2f886023a8701dd76a9) --- diff --git a/dbus/dbus-sysdeps-win.c b/dbus/dbus-sysdeps-win.c index 00848363a..75f07e9c4 100644 --- a/dbus/dbus-sysdeps-win.c +++ b/dbus/dbus-sysdeps-win.c @@ -1714,10 +1714,19 @@ _dbus_listen_tcp_socket (const char *host, if (bind (fd, (struct sockaddr*) tmp->ai_addr, tmp->ai_addrlen) == SOCKET_ERROR) { DBUS_SOCKET_SET_ERRNO (); + closesocket (fd); + if (errno == WSAEADDRINUSE) + { + /* Calling this function with port=0 tries to + * bind the same port twice, so we should + * ignore the second bind. + */ + tmp = tmp->ai_next; + continue; + } dbus_set_error (error, _dbus_error_from_errno (errno), "Failed to bind socket \"%s:%s\": %s", host ? host : "*", port, _dbus_strerror_from_errno ()); - closesocket (fd); goto failed; } @@ -1763,7 +1772,10 @@ _dbus_listen_tcp_socket (const char *host, host ? host : "*", port, _dbus_strerror_from_errno()); goto failed; } - snprintf( portbuf, sizeof( portbuf ) - 1, "%d", addr.AddressIn.sin_port ); + if (addr.AddressIn.sin_family = AF_INET) + snprintf( portbuf, sizeof( portbuf ) - 1, "%d", ntohs(addr.AddressIn.sin_port) ); + else + snprintf( portbuf, sizeof( portbuf ) - 1, "%d", ntohs(addr.AddressIn6.sin6_port) ); if (!_dbus_string_append(retport, portbuf)) { dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);