loudmouth/lm-sock.c
changeset 308 7e2050a6df75
parent 304 9b04f9ac2265
child 342 ea543fec7afd
--- a/loudmouth/lm-sock.c	Tue Oct 30 23:22:09 2007 +0100
+++ b/loudmouth/lm-sock.c	Tue Oct 30 23:27:30 2007 +0100
@@ -32,6 +32,7 @@
 #include <netinet/in.h>
 #include <netinet/ip.h>
 #include <netinet/tcp.h>
+#include <arpa/inet.h>
 #define LM_SHUTDOWN SHUT_RDWR
 
 #else  /* G_OS_WIN32 */
@@ -46,6 +47,8 @@
 #include "lm-sock.h"
 #include "lm-debug.h"
 
+#define IPV6_MAX_ADDRESS_LEN 46 /* 45 + '\0' */
+
 static gboolean initialised = FALSE;
 
 gboolean
@@ -323,3 +326,37 @@
 }
 #endif /* USE_TCP_KEEPALIVES */
 
+gchar *
+_lm_sock_get_local_host (LmSocketT sock)
+{
+	struct sockaddr      addr_info;
+	void                *sock_addr;
+	socklen_t            namelen;
+	char                 addrbuf[IPV6_MAX_ADDRESS_LEN];
+	const char          *host;
+
+	namelen = sizeof (struct sockaddr);
+	if (getsockname (sock, &addr_info, &namelen)) {
+		return NULL;
+	}
+
+	switch (addr_info.sa_family) {
+		case AF_INET: 
+			
+			sock_addr = & (((struct sockaddr_in *) &addr_info)->sin_addr);
+			break;
+		case AF_INET6:
+			sock_addr = & (((struct sockaddr_in6 *) &addr_info)->sin6_addr);
+			break;
+		default:
+			return NULL;
+	}
+	/* inet_ntoa has been obsoleted in favour of inet_ntop */
+	host = inet_ntop (addr_info.sa_family,
+			  sock_addr,
+			  addrbuf,
+			  IPV6_MAX_ADDRESS_LEN);
+
+	return g_strdup (host);
+}
+