libpurple/protocols/bonjour/jabber.c

changeset 35676
d9fdd45925ec
parent 35578
e0826e3b631b
child 35885
e5cc097d6c82
child 37130
7ed9e7b31bad
--- a/libpurple/protocols/bonjour/jabber.c	Mon Mar 31 23:58:05 2014 +0200
+++ b/libpurple/protocols/bonjour/jabber.c	Thu Apr 03 00:47:13 2014 +0200
@@ -705,14 +705,14 @@
 }
 
 static int
-start_serversocket_listening(int port, int socket, struct sockaddr *addr, size_t addr_size, gboolean ip6, gboolean allow_port_fallback)
+start_serversocket_listening(int port, int socket, common_sockaddr_t *addr, size_t addr_size, gboolean ip6, gboolean allow_port_fallback)
 {
 	int ret_port = port;
 
 	purple_debug_info("bonjour", "Attempting to bind IPv%d socket to port %d.\n", ip6 ? 6 : 4, port);
 
 	/* Try to use the specified port - if it isn't available, use a random port */
-	if (bind(socket, addr, addr_size) != 0) {
+	if (bind(socket, &addr->sa, addr_size) != 0) {
 
 		purple_debug_info("bonjour", "Unable to bind to specified "
 				"port %i: %s\n", port, g_strerror(errno));
@@ -723,12 +723,12 @@
 		}
 #ifdef PF_INET6
 		if (ip6)
-			((struct sockaddr_in6 *) addr)->sin6_port = 0;
+			addr->in6.sin6_port = 0;
 		else
 #endif
-		((struct sockaddr_in *) addr)->sin_port = 0;
+			addr->in.sin_port = 0;
 
-		if (bind(socket, addr, addr_size) != 0) {
+		if (bind(socket, &addr->sa, addr_size) != 0) {
 			purple_debug_error("bonjour", "Unable to bind IPv%d socket to port: %s\n", ip6 ? 6 : 4, g_strerror(errno));
 			return -1;
 		}
@@ -774,16 +774,17 @@
 
 #ifdef PF_INET6
 	if (jdata->socket6 != -1) {
-		struct sockaddr_in6 addr6;
+		common_sockaddr_t addr6;
 #ifdef IPV6_V6ONLY
 		int on = 1;
 		setsockopt(jdata->socket6, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof(on));
 #endif
-	        memset(&addr6, 0, sizeof(addr6));
-		addr6.sin6_family = AF_INET6;
-		addr6.sin6_port = htons(jdata->port);
-      		addr6.sin6_addr = in6addr_any;
-		ipv6_port = start_serversocket_listening(jdata->port, jdata->socket6, (struct sockaddr *) &addr6, sizeof(addr6), TRUE, TRUE);
+		memset(&addr6, 0, sizeof(addr6));
+		addr6.in6.sin6_family = AF_INET6;
+		addr6.in6.sin6_port = htons(jdata->port);
+		addr6.in6.sin6_addr = in6addr_any;
+		ipv6_port = start_serversocket_listening(jdata->port,
+			jdata->socket6, &addr6, sizeof(addr6), TRUE, TRUE);
 		/* Open a watcher in the socket we have just opened */
 		if (ipv6_port > 0) {
 			jdata->watcher_id6 = purple_input_add(jdata->socket6, PURPLE_INPUT_READ, _server_socket_handler, jdata);
@@ -796,11 +797,12 @@
 	}
 #endif
 	if (jdata->socket != -1) {
-		struct sockaddr_in addr4;
+		common_sockaddr_t addr4;
 		memset(&addr4, 0, sizeof(addr4));
-		addr4.sin_family = AF_INET;
-		addr4.sin_port = htons(jdata->port);
-		ipv4_port = start_serversocket_listening(jdata->port, jdata->socket, (struct sockaddr *) &addr4, sizeof(addr4), FALSE, ipv6_port != -1);
+		addr4.in.sin_family = AF_INET;
+		addr4.in.sin_port = htons(jdata->port);
+		ipv4_port = start_serversocket_listening(jdata->port, jdata->socket,
+			&addr4, sizeof(addr4), FALSE, ipv6_port != -1);
 		/* Open a watcher in the socket we have just opened */
 		if (ipv4_port > 0) {
 			jdata->watcher_id = purple_input_add(jdata->socket, PURPLE_INPUT_READ, _server_socket_handler, jdata);
@@ -1367,7 +1369,7 @@
 #ifdef HAVE_GETIFADDRS /* This is required for IPv6 */
 	{
 	struct ifaddrs *ifap, *ifa;
-	struct sockaddr *addr;
+	common_sockaddr_t addr;
 	char addrstr[INET6_ADDRSTRLEN];
 
 	ret = getifaddrs(&ifap);
@@ -1381,23 +1383,25 @@
 		if (!(ifa->ifa_flags & IFF_RUNNING) || (ifa->ifa_flags & IFF_LOOPBACK) || ifa->ifa_addr == NULL)
 			continue;
 
-		addr = ifa->ifa_addr;
+		memcpy(&addr, ifa->ifa_addr, sizeof(addr));
 		address_text = NULL;
-		switch (addr->sa_family) {
+		switch (addr.sa.sa_family) {
 			case AF_INET:
-				address_text = inet_ntop(addr->sa_family, &((struct sockaddr_in *)addr)->sin_addr,
+				address_text = inet_ntop(addr.sa.sa_family,
+					&addr.in.sin_addr,
 					addrstr, sizeof(addrstr));
 				break;
 #ifdef PF_INET6
 			case AF_INET6:
-				address_text = inet_ntop(addr->sa_family, &((struct sockaddr_in6 *)addr)->sin6_addr,
+				address_text = inet_ntop(addr.sa.sa_family,
+					&addr.in6.sin6_addr,
 					addrstr, sizeof(addrstr));
 				break;
 #endif
 		}
 
 		if (address_text != NULL) {
-			if (addr->sa_family == AF_INET)
+			if (addr.sa.sa_family == AF_INET)
 				ips = g_slist_append(ips, g_strdup(address_text));
 			else
 				ips = g_slist_prepend(ips, g_strdup(address_text));

mercurial