- Handle ipv6 link-local addresses better in network:/// (#212565)
parent
073d12291e
commit
2f191e0fd0
@ -0,0 +1,72 @@
|
|||||||
|
--- gnome-vfs-2.16.2/libgnomevfs/gnome-vfs-dns-sd.c.ipv6 2006-11-30 13:40:48.000000000 +0100
|
||||||
|
+++ gnome-vfs-2.16.2/libgnomevfs/gnome-vfs-dns-sd.c 2006-11-30 14:28:48.000000000 +0100
|
||||||
|
@@ -1959,6 +1959,7 @@
|
||||||
|
struct sync_resolve_data {
|
||||||
|
AvahiSimplePoll *poll;
|
||||||
|
gboolean got_data;
|
||||||
|
+ gboolean got_link_local_ipv6;
|
||||||
|
char *host;
|
||||||
|
int port;
|
||||||
|
char *text;
|
||||||
|
@@ -1997,6 +1998,13 @@
|
||||||
|
|
||||||
|
data = user_data;
|
||||||
|
if (event == AVAHI_RESOLVER_FOUND) {
|
||||||
|
+ if (address->proto == AVAHI_PROTO_INET6 &&
|
||||||
|
+ address->data.ipv6.address[0] == 0xfe &&
|
||||||
|
+ address->data.ipv6.address[1] == 0x80) {
|
||||||
|
+ data->got_link_local_ipv6 = TRUE;
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
data->got_data = TRUE;
|
||||||
|
avahi_address_snprint (a, sizeof(a), address);
|
||||||
|
data->host = g_strdup (a);
|
||||||
|
@@ -2005,7 +2013,7 @@
|
||||||
|
data->text = g_malloc (data->text_len);
|
||||||
|
avahi_string_list_serialize (txt, data->text, data->text_len);
|
||||||
|
}
|
||||||
|
-
|
||||||
|
+ out:
|
||||||
|
avahi_service_resolver_free (r);
|
||||||
|
avahi_simple_poll_quit (data->poll);
|
||||||
|
}
|
||||||
|
@@ -2090,8 +2098,13 @@
|
||||||
|
AvahiClient *client = NULL;
|
||||||
|
AvahiServiceResolver *sr;
|
||||||
|
int error;
|
||||||
|
+ AvahiProtocol protocol;
|
||||||
|
struct sync_resolve_data resolve_data = {0};
|
||||||
|
|
||||||
|
+ protocol = AVAHI_PROTO_UNSPEC;
|
||||||
|
+
|
||||||
|
+ retry:
|
||||||
|
+
|
||||||
|
simple_poll = avahi_simple_poll_new ();
|
||||||
|
resolve_data.poll = simple_poll;
|
||||||
|
if (simple_poll == NULL) {
|
||||||
|
@@ -2109,7 +2122,8 @@
|
||||||
|
return GNOME_VFS_ERROR_GENERIC;
|
||||||
|
}
|
||||||
|
|
||||||
|
- sr = avahi_service_resolver_new (client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC,
|
||||||
|
+ resolve_data.got_link_local_ipv6 = FALSE;
|
||||||
|
+ sr = avahi_service_resolver_new (client, AVAHI_IF_UNSPEC, protocol,
|
||||||
|
name, type, domain, AVAHI_PROTO_UNSPEC,
|
||||||
|
0, avahi_resolve_sync_callback, &resolve_data);
|
||||||
|
if (sr == NULL) {
|
||||||
|
@@ -2127,6 +2141,14 @@
|
||||||
|
avahi_client_free (client);
|
||||||
|
avahi_simple_poll_free (simple_poll);
|
||||||
|
|
||||||
|
+
|
||||||
|
+ if (resolve_data.got_link_local_ipv6) {
|
||||||
|
+ /* We ignore non-routable ipv6 link-local addresses here, because our
|
||||||
|
+ api doesn't give the iface, so they are useless. Prefer ipv4 address instead */
|
||||||
|
+ protocol = AVAHI_PROTO_INET;
|
||||||
|
+ goto retry;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (resolve_data.got_data) {
|
||||||
|
*host = resolve_data.host;
|
||||||
|
*port = resolve_data.port;
|
Loading…
Reference in new issue