mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-05-14 15:28:06 +02:00
dnsmasq: does handle more than one nameserver per domain
dnsmasq should query per-domain nameservers non-deterministically in the normal dnsmasq manner. Currently it queries them in order, the same way as if --strict-order was set. Simon Kelley plans to correct this, but either way, dnsmasq does handle more than one nameserver per domain. https://bugs.launchpad.net/ubuntu/+source/network-manager/+bug/1003842/comments/58 https://bugs.launchpad.net/ubuntu/+source/network-manager/+bug/1003842/comments/55
This commit is contained in:
parent
7cc7a38288
commit
f9494db7c1
1 changed files with 63 additions and 65 deletions
|
|
@ -72,63 +72,62 @@ static gboolean
|
|||
add_ip4_config (GString *str, NMIP4Config *ip4, gboolean split)
|
||||
{
|
||||
char buf[INET_ADDRSTRLEN + 1];
|
||||
struct in_addr addr;
|
||||
int n, i;
|
||||
in_addr_t addr;
|
||||
int nnameservers, i_nameserver, n, i;
|
||||
gboolean added = FALSE;
|
||||
|
||||
nnameservers = nm_ip4_config_get_num_nameservers (ip4);
|
||||
|
||||
if (split) {
|
||||
char **domains, **iter;
|
||||
|
||||
if (nm_ip4_config_get_num_nameservers (ip4) == 0)
|
||||
if (nnameservers == 0)
|
||||
return FALSE;
|
||||
|
||||
/* FIXME: it appears that dnsmasq can only handle one nameserver
|
||||
* per domain (and the manpage says this too) so only use the first
|
||||
* nameserver here.
|
||||
*/
|
||||
addr.s_addr = nm_ip4_config_get_nameserver (ip4, 0);
|
||||
memset (&buf[0], 0, sizeof (buf));
|
||||
if (!inet_ntop (AF_INET, &addr, buf, sizeof (buf)))
|
||||
return FALSE;
|
||||
for (i_nameserver = 0; i_nameserver < nnameservers; i_nameserver++) {
|
||||
addr = nm_ip4_config_get_nameserver (ip4, i_nameserver);
|
||||
memset (&buf[0], 0, sizeof (buf));
|
||||
if (!inet_ntop (AF_INET, &addr, buf, sizeof (buf)))
|
||||
return FALSE;
|
||||
|
||||
/* searches are preferred over domains */
|
||||
n = nm_ip4_config_get_num_searches (ip4);
|
||||
for (i = 0; i < n; i++) {
|
||||
g_string_append_printf (str, "server=/%s/%s\n",
|
||||
nm_ip4_config_get_search (ip4, i),
|
||||
buf);
|
||||
added = TRUE;
|
||||
}
|
||||
|
||||
if (n == 0) {
|
||||
/* If not searches, use any domains */
|
||||
n = nm_ip4_config_get_num_domains (ip4);
|
||||
/* searches are preferred over domains */
|
||||
n = nm_ip4_config_get_num_searches (ip4);
|
||||
for (i = 0; i < n; i++) {
|
||||
g_string_append_printf (str, "server=/%s/%s\n",
|
||||
nm_ip4_config_get_domain (ip4, i),
|
||||
buf);
|
||||
nm_ip4_config_get_search (ip4, i),
|
||||
buf);
|
||||
added = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/* Ensure reverse-DNS works by directing queries for in-addr.arpa
|
||||
* domains to the split domain's nameserver.
|
||||
*/
|
||||
domains = nm_dns_utils_get_ip4_rdns_domains (ip4);
|
||||
if (domains) {
|
||||
for (iter = domains; iter && *iter; iter++)
|
||||
g_string_append_printf (str, "server=/%s/%s\n", *iter, buf);
|
||||
g_strfreev (domains);
|
||||
added = TRUE;
|
||||
if (n == 0) {
|
||||
/* If not searches, use any domains */
|
||||
n = nm_ip4_config_get_num_domains (ip4);
|
||||
for (i = 0; i < n; i++) {
|
||||
g_string_append_printf (str, "server=/%s/%s\n",
|
||||
nm_ip4_config_get_domain (ip4, i),
|
||||
buf);
|
||||
added = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/* Ensure reverse-DNS works by directing queries for in-addr.arpa
|
||||
* domains to the split domain's nameserver.
|
||||
*/
|
||||
domains = nm_dns_utils_get_ip4_rdns_domains (ip4);
|
||||
if (domains) {
|
||||
for (iter = domains; iter && *iter; iter++)
|
||||
g_string_append_printf (str, "server=/%s/%s\n", *iter, buf);
|
||||
g_strfreev (domains);
|
||||
added = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* If no searches or domains, just add the namservers */
|
||||
if (!added) {
|
||||
n = nm_ip4_config_get_num_nameservers (ip4);
|
||||
for (i = 0; i < n; i++) {
|
||||
for (i = 0; i < nnameservers; i++) {
|
||||
memset (&buf[0], 0, sizeof (buf));
|
||||
addr.s_addr = nm_ip4_config_get_nameserver (ip4, i);
|
||||
addr = nm_ip4_config_get_nameserver (ip4, i);
|
||||
if (inet_ntop (AF_INET, &addr, buf, sizeof (buf)))
|
||||
g_string_append_printf (str, "server=%s\n", buf);
|
||||
}
|
||||
|
|
@ -186,45 +185,45 @@ static gboolean
|
|||
add_ip6_config (GString *str, NMIP6Config *ip6, gboolean split)
|
||||
{
|
||||
const struct in6_addr *addr;
|
||||
char *buf;
|
||||
int n, i;
|
||||
char *buf = NULL;
|
||||
int nnameservers, i_nameserver, n, i;
|
||||
gboolean added = FALSE;
|
||||
const char *iface;
|
||||
|
||||
nnameservers = nm_ip6_config_get_num_nameservers (ip6);
|
||||
|
||||
iface = g_object_get_data (G_OBJECT (ip6), IP_CONFIG_IFACE_TAG);
|
||||
g_assert (iface);
|
||||
|
||||
if (split) {
|
||||
if (nm_ip6_config_get_num_nameservers (ip6) == 0)
|
||||
if (nnameservers == 0)
|
||||
return FALSE;
|
||||
|
||||
/* FIXME: it appears that dnsmasq can only handle one nameserver
|
||||
* per domain (at least the manpage seems to indicate that) so only use
|
||||
* the first nameserver here.
|
||||
*/
|
||||
addr = nm_ip6_config_get_nameserver (ip6, 0);
|
||||
buf = ip6_addr_to_string (addr, iface);
|
||||
if (!buf)
|
||||
return FALSE;
|
||||
for (i_nameserver = 0; i_nameserver < nnameservers; i_nameserver++) {
|
||||
addr = nm_ip6_config_get_nameserver (ip6, i_nameserver);
|
||||
buf = ip6_addr_to_string (addr, iface);
|
||||
if (!buf)
|
||||
return FALSE;
|
||||
|
||||
/* searches are preferred over domains */
|
||||
n = nm_ip6_config_get_num_searches (ip6);
|
||||
for (i = 0; i < n; i++) {
|
||||
g_string_append_printf (str, "server=/%s/%s\n",
|
||||
nm_ip6_config_get_search (ip6, i),
|
||||
buf);
|
||||
added = TRUE;
|
||||
}
|
||||
|
||||
if (n == 0) {
|
||||
/* If not searches, use any domains */
|
||||
n = nm_ip6_config_get_num_domains (ip6);
|
||||
/* searches are preferred over domains */
|
||||
n = nm_ip6_config_get_num_searches (ip6);
|
||||
for (i = 0; i < n; i++) {
|
||||
g_string_append_printf (str, "server=/%s/%s\n",
|
||||
nm_ip6_config_get_domain (ip6, i),
|
||||
buf);
|
||||
nm_ip6_config_get_search (ip6, i),
|
||||
buf);
|
||||
added = TRUE;
|
||||
}
|
||||
|
||||
if (n == 0) {
|
||||
/* If not searches, use any domains */
|
||||
n = nm_ip6_config_get_num_domains (ip6);
|
||||
for (i = 0; i < n; i++) {
|
||||
g_string_append_printf (str, "server=/%s/%s\n",
|
||||
nm_ip6_config_get_domain (ip6, i),
|
||||
buf);
|
||||
added = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
g_free (buf);
|
||||
|
|
@ -232,8 +231,7 @@ add_ip6_config (GString *str, NMIP6Config *ip6, gboolean split)
|
|||
|
||||
/* If no searches or domains, just add the namservers */
|
||||
if (!added) {
|
||||
n = nm_ip6_config_get_num_nameservers (ip6);
|
||||
for (i = 0; i < n; i++) {
|
||||
for (i = 0; i < nnameservers; i++) {
|
||||
addr = nm_ip6_config_get_nameserver (ip6, i);
|
||||
buf = ip6_addr_to_string (addr, iface);
|
||||
if (buf) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue