From 7adfea8ca268162f10f9b1e1ec3a3322f14928a0 Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@duempel.org>
Date: Mon, 4 Nov 2013 18:39:42 +0100
Subject: [PATCH] system/resolver: return path of UNIX domain sockets

getnameinfo() doesn't work well - it always returns "localhost".
---
 NEWS                    |  2 ++
 src/system/Resolver.cxx | 22 +++++++++++++++-------
 2 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/NEWS b/NEWS
index 316226ea3..64529812e 100644
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,8 @@
 ver 0.18.1 (2013/11/??)
 * protocol:
   - always ignore whitespace at the end of the line
+* networking:
+  - log UNIX domain path names instead of "localhost"
 * filter:
   - autoconvert: fix "volume_normalization" with mp3 files
 * add missing files to source tarball
diff --git a/src/system/Resolver.cxx b/src/system/Resolver.cxx
index 656de1349..5e6ea590b 100644
--- a/src/system/Resolver.cxx
+++ b/src/system/Resolver.cxx
@@ -32,6 +32,10 @@
 #include <winsock.h>
 #endif
 
+#ifdef HAVE_UN
+#include <sys/un.h>
+#endif
+
 #include <string.h>
 #include <stdio.h>
 
@@ -40,6 +44,17 @@ const Domain resolver_domain("resolver");
 char *
 sockaddr_to_string(const struct sockaddr *sa, size_t length, Error &error)
 {
+#ifdef HAVE_UN
+	if (sa->sa_family == AF_UNIX) {
+		/* return path of UNIX domain sockets */
+		const sockaddr_un &s_un = *(const sockaddr_un *)sa;
+		if (length < sizeof(s_un) || s_un.sun_path[0] == 0)
+			return g_strdup("local");
+
+		return g_strdup(s_un.sun_path);
+	}
+#endif
+
 #if defined(HAVE_IPV6) && defined(IN6_IS_ADDR_V4MAPPED)
 	const struct sockaddr_in6 *a6 = (const struct sockaddr_in6 *)sa;
 	struct sockaddr_in a4;
@@ -70,13 +85,6 @@ sockaddr_to_string(const struct sockaddr *sa, size_t length, Error &error)
 		return NULL;
 	}
 
-#ifdef HAVE_UN
-	if (sa->sa_family == AF_UNIX)
-		/* "serv" contains corrupt information with unix
-		   sockets */
-		return g_strdup(host);
-#endif
-
 #ifdef HAVE_IPV6
 	if (strchr(host, ':') != NULL)
 		return g_strconcat("[", host, "]:", serv, NULL);