We add IPv6 loopback address to resolv.conf if we have created
an IPv6 listening socket to port 53.
---
src/dnsproxy.c | 40 ++++++++++++++++++++++++++++++++--------
1 file changed, 32 insertions(+), 8 deletions(-)
diff --git a/src/dnsproxy.c b/src/dnsproxy.c
index 88f5840..4f08cca 100644
--- a/src/dnsproxy.c
+++ b/src/dnsproxy.c
@@ -2921,8 +2921,19 @@ static GIOChannel *get_listener(int family, int
protocol, int index)
return channel;
}
+#define UDP_IPv4_FAILED 0x01
+#define TCP_IPv4_FAILED 0x02
+#define UDP_IPv6_FAILED 0x04
+#define TCP_IPv6_FAILED 0x08
+#define UDP_FAILED (UDP_IPv4_FAILED | UDP_IPv6_FAILED)
+#define TCP_FAILED (TCP_IPv4_FAILED | TCP_IPv6_FAILED)
+#define IPv6_FAILED (UDP_IPv6_FAILED | TCP_IPv6_FAILED)
+#define IPv4_FAILED (UDP_IPv4_FAILED | TCP_IPv4_FAILED)
+
static int create_dns_listener(int protocol, struct listener_data *ifdata)
{
+ int ret = 0;
+
if (protocol == IPPROTO_TCP) {
ifdata->tcp4_listener_channel = get_listener(AF_INET, protocol,
ifdata->index);
@@ -2931,6 +2942,8 @@ static int create_dns_listener(int protocol, struct
listener_data *ifdata)
g_io_add_watch(ifdata->tcp4_listener_channel,
G_IO_IN, tcp4_listener_event,
(gpointer)ifdata);
+ else
+ ret |= TCP_IPv4_FAILED;
ifdata->tcp6_listener_channel = get_listener(AF_INET6, protocol,
ifdata->index);
@@ -2939,6 +2952,8 @@ static int create_dns_listener(int protocol, struct
listener_data *ifdata)
g_io_add_watch(ifdata->tcp6_listener_channel,
G_IO_IN, tcp6_listener_event,
(gpointer)ifdata);
+ else
+ ret |= TCP_IPv6_FAILED;
} else {
ifdata->udp4_listener_channel = get_listener(AF_INET, protocol,
ifdata->index);
@@ -2947,6 +2962,8 @@ static int create_dns_listener(int protocol, struct
listener_data *ifdata)
g_io_add_watch(ifdata->udp4_listener_channel,
G_IO_IN, udp4_listener_event,
(gpointer)ifdata);
+ else
+ ret |= UDP_IPv4_FAILED;
ifdata->udp6_listener_channel = get_listener(AF_INET6, protocol,
ifdata->index);
@@ -2955,9 +2972,11 @@ static int create_dns_listener(int protocol, struct
listener_data *ifdata)
g_io_add_watch(ifdata->udp6_listener_channel,
G_IO_IN, udp6_listener_event,
(gpointer)ifdata);
+ else
+ ret |= UDP_IPv6_FAILED;
}
- return 0;
+ return ret;
}
static void destroy_udp_listener(struct listener_data *ifdata)
@@ -2992,18 +3011,23 @@ static int create_listener(struct listener_data *ifdata)
int err, index;
err = create_dns_listener(IPPROTO_UDP, ifdata);
- if (err < 0)
- return err;
+ if ((err & UDP_FAILED) == UDP_FAILED)
+ return -EIO;
- err = create_dns_listener(IPPROTO_TCP, ifdata);
- if (err < 0) {
+ err |= create_dns_listener(IPPROTO_TCP, ifdata);
+ if ((err & TCP_FAILED) == TCP_FAILED) {
destroy_udp_listener(ifdata);
- return err;
+ return -EIO;
}
index = connman_inet_ifindex("lo");
- if (ifdata->index == index)
- __connman_resolvfile_append(index, NULL, "127.0.0.1");
+ if (ifdata->index == index) {
+ if ((err & IPv6_FAILED) != IPv6_FAILED)
+ __connman_resolvfile_append(index, NULL, "::1");
+
+ if ((err & IPv4_FAILED) != IPv4_FAILED)
+ __connman_resolvfile_append(index, NULL, "127.0.0.1");
+ }
return 0;
}
--
1.7.11.7
_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman