Mercurial > pidgin.yaz
diff libpurple/protocols/bonjour/mdns_avahi.c @ 29877:755219afed9f
Implementation of IPv6 support for Bonjour
* IPv6 buddy presences are preferred to IPv4 presences
* File Transfers currently don't support IPv6 (due to limitations in network.c)
Fixes #11290
author | Daniel Atallah <daniel.atallah@gmail.com> |
---|---|
date | Wed, 24 Feb 2010 05:00:09 +0000 |
parents | 9d6e1327f614 |
children | 7c871249318b |
line wrap: on
line diff
--- a/libpurple/protocols/bonjour/mdns_avahi.c Wed Feb 24 04:39:15 2010 +0000 +++ b/libpurple/protocols/bonjour/mdns_avahi.c Wed Feb 24 05:00:09 2010 +0000 @@ -189,8 +189,12 @@ bb->ips = g_slist_remove(bb->ips, rd->ip); g_free((gchar *) rd->ip); } - bb->ips = g_slist_prepend(bb->ips, g_strdup(ip)); - rd->ip = bb->ips->data; + rd->ip = g_strdup(ip); + /* IPv6 goes at the front of the list and IPv4 at the end so that we "prefer" IPv6, if present */ + if (protocol == AVAHI_PROTO_INET6) + bb->ips = g_slist_prepend(bb->ips, (gchar *) rd->ip); + else + bb->ips = g_slist_append(bb->ips, (gchar *) rd->ip); } bb->port_p2pj = port; @@ -249,7 +253,7 @@ /* Make sure it isn't us */ if (purple_utf8_strcasecmp(name, account->username) != 0) { if (!avahi_service_resolver_new(avahi_service_browser_get_client(b), - interface, protocol, name, type, domain, AVAHI_PROTO_INET, + interface, protocol, name, type, domain, protocol, 0, _resolver_callback, account)) { purple_debug_warning("bonjour", "_browser_callback -- Error initiating resolver: %s\n", avahi_strerror(avahi_client_errno(avahi_service_browser_get_client(b)))); @@ -448,14 +452,14 @@ case PUBLISH_START: publish_result = avahi_entry_group_add_service_strlst( idata->group, AVAHI_IF_UNSPEC, - AVAHI_PROTO_INET, 0, + AVAHI_PROTO_UNSPEC, 0, purple_account_get_username(data->account), LINK_LOCAL_RECORD_NAME, NULL, NULL, data->port_p2pj, lst); break; case PUBLISH_UPDATE: publish_result = avahi_entry_group_update_service_txt_strlst( idata->group, AVAHI_IF_UNSPEC, - AVAHI_PROTO_INET, 0, + AVAHI_PROTO_UNSPEC, 0, purple_account_get_username(data->account), LINK_LOCAL_RECORD_NAME, NULL, lst); break; @@ -487,7 +491,7 @@ g_return_val_if_fail(idata != NULL, FALSE); - idata->sb = avahi_service_browser_new(idata->client, AVAHI_IF_UNSPEC, AVAHI_PROTO_INET, LINK_LOCAL_RECORD_NAME, NULL, 0, _browser_callback, data->account); + idata->sb = avahi_service_browser_new(idata->client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, LINK_LOCAL_RECORD_NAME, NULL, 0, _browser_callback, data->account); if (!idata->sb) { purple_debug_error("bonjour", @@ -533,7 +537,7 @@ purple_account_get_username(data->account)); ret = avahi_entry_group_add_record(idata->buddy_icon_group, AVAHI_IF_UNSPEC, - AVAHI_PROTO_INET, flags, svc_name, + AVAHI_PROTO_UNSPEC, flags, svc_name, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_NULL, 120, avatar_data, avatar_len); g_free(svc_name); @@ -622,7 +626,7 @@ name = g_strdup_printf("%s." LINK_LOCAL_RECORD_NAME "local", buddy->name); idata->buddy_icon_rec_browser = avahi_record_browser_new(session_idata->client, AVAHI_IF_UNSPEC, - AVAHI_PROTO_INET, name, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_NULL, 0, + AVAHI_PROTO_UNSPEC, name, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_NULL, 0, _buddy_icon_record_cb, buddy); g_free(name);