dns: merge IPv4 and IPv6 versions of add_ip_config() (part 1)
This commit is contained in:
@@ -201,144 +201,146 @@ add_global_config (NMDnsDnsmasq *self, GVariantBuilder *dnsmasq_servers, const N
|
|||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
add_ip4_config (NMDnsDnsmasq *self, GVariantBuilder *servers, NMIP4Config *ip4,
|
add_ip_config (NMDnsDnsmasq *self,
|
||||||
const char *iface, gboolean split)
|
GVariantBuilder *servers,
|
||||||
|
NMIPConfig *ip_config,
|
||||||
|
const char *iface,
|
||||||
|
gboolean split)
|
||||||
{
|
{
|
||||||
char buf[INET_ADDRSTRLEN + 1 + IFNAMSIZ];
|
int addr_family = nm_ip_config_get_addr_family (ip_config);
|
||||||
char buf2[INET_ADDRSTRLEN];
|
|
||||||
in_addr_t addr;
|
|
||||||
int nnameservers, i_nameserver, n, i;
|
|
||||||
gboolean added = FALSE;
|
|
||||||
|
|
||||||
g_return_val_if_fail (iface, FALSE);
|
if (addr_family == AF_INET) {
|
||||||
nnameservers = nm_ip4_config_get_num_nameservers (ip4);
|
NMIP4Config *ip4 = (NMIP4Config *) ip_config;
|
||||||
|
char buf[INET_ADDRSTRLEN + 1 + IFNAMSIZ];
|
||||||
|
char buf2[INET_ADDRSTRLEN];
|
||||||
|
in_addr_t addr;
|
||||||
|
int nnameservers, i_nameserver, n, i;
|
||||||
|
gboolean added = FALSE;
|
||||||
|
|
||||||
if (split) {
|
g_return_val_if_fail (iface, FALSE);
|
||||||
char **domains, **iter;
|
nnameservers = nm_ip4_config_get_num_nameservers (ip4);
|
||||||
|
|
||||||
if (nnameservers == 0)
|
if (split) {
|
||||||
return FALSE;
|
char **domains, **iter;
|
||||||
|
|
||||||
for (i_nameserver = 0; i_nameserver < nnameservers; i_nameserver++) {
|
if (nnameservers == 0)
|
||||||
addr = nm_ip4_config_get_nameserver (ip4, i_nameserver);
|
return FALSE;
|
||||||
g_snprintf (buf, sizeof (buf), "%s@%s",
|
|
||||||
nm_utils_inet4_ntop (addr, buf2), iface);
|
|
||||||
|
|
||||||
/* searches are preferred over domains */
|
for (i_nameserver = 0; i_nameserver < nnameservers; i_nameserver++) {
|
||||||
n = nm_ip4_config_get_num_searches (ip4);
|
addr = nm_ip4_config_get_nameserver (ip4, i_nameserver);
|
||||||
for (i = 0; i < n; i++) {
|
g_snprintf (buf, sizeof (buf), "%s@%s",
|
||||||
add_dnsmasq_nameserver (self,
|
nm_utils_inet4_ntop (addr, buf2), iface);
|
||||||
servers,
|
|
||||||
buf,
|
|
||||||
nm_ip4_config_get_search (ip4, i));
|
|
||||||
added = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (n == 0) {
|
/* searches are preferred over domains */
|
||||||
/* If not searches, use any domains */
|
n = nm_ip4_config_get_num_searches (ip4);
|
||||||
n = nm_ip4_config_get_num_domains (ip4);
|
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
add_dnsmasq_nameserver (self,
|
add_dnsmasq_nameserver (self,
|
||||||
servers,
|
servers,
|
||||||
buf,
|
buf,
|
||||||
nm_ip4_config_get_domain (ip4, i));
|
nm_ip4_config_get_search (ip4, i));
|
||||||
added = TRUE;
|
added = TRUE;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/* Ensure reverse-DNS works by directing queries for in-addr.arpa
|
if (n == 0) {
|
||||||
* domains to the split domain's nameserver.
|
/* If not searches, use any domains */
|
||||||
*/
|
n = nm_ip4_config_get_num_domains (ip4);
|
||||||
domains = get_ip4_rdns_domains (ip4);
|
for (i = 0; i < n; i++) {
|
||||||
if (domains) {
|
add_dnsmasq_nameserver (self,
|
||||||
for (iter = domains; iter && *iter; iter++)
|
servers,
|
||||||
add_dnsmasq_nameserver (self, servers, buf, *iter);
|
buf,
|
||||||
g_strfreev (domains);
|
nm_ip4_config_get_domain (ip4, i));
|
||||||
}
|
added = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If no searches or domains, just add the nameservers */
|
/* Ensure reverse-DNS works by directing queries for in-addr.arpa
|
||||||
if (!added) {
|
* domains to the split domain's nameserver.
|
||||||
for (i = 0; i < nnameservers; i++) {
|
*/
|
||||||
addr = nm_ip4_config_get_nameserver (ip4, i);
|
domains = get_ip4_rdns_domains (ip4);
|
||||||
g_snprintf (buf, sizeof (buf), "%s@%s",
|
if (domains) {
|
||||||
nm_utils_inet4_ntop (addr, buf2), iface);
|
for (iter = domains; iter && *iter; iter++)
|
||||||
add_dnsmasq_nameserver (self, servers, buf, NULL);
|
add_dnsmasq_nameserver (self, servers, buf, *iter);
|
||||||
}
|
g_strfreev (domains);
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
add_ip6_config (NMDnsDnsmasq *self, GVariantBuilder *servers, NMIP6Config *ip6,
|
|
||||||
const char *iface, gboolean split)
|
|
||||||
{
|
|
||||||
const struct in6_addr *addr;
|
|
||||||
char *buf = NULL;
|
|
||||||
int nnameservers, i_nameserver, n, i;
|
|
||||||
gboolean added = FALSE;
|
|
||||||
|
|
||||||
g_return_val_if_fail (iface, FALSE);
|
|
||||||
nnameservers = nm_ip6_config_get_num_nameservers (ip6);
|
|
||||||
|
|
||||||
if (split) {
|
|
||||||
char **domains, **iter;
|
|
||||||
|
|
||||||
if (nnameservers == 0)
|
|
||||||
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);
|
|
||||||
|
|
||||||
/* searches are preferred over domains */
|
|
||||||
n = nm_ip6_config_get_num_searches (ip6);
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
add_dnsmasq_nameserver (self,
|
|
||||||
servers,
|
|
||||||
buf,
|
|
||||||
nm_ip6_config_get_search (ip6, i));
|
|
||||||
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++) {
|
|
||||||
add_dnsmasq_nameserver (self,
|
|
||||||
servers,
|
|
||||||
buf,
|
|
||||||
nm_ip6_config_get_domain (ip6, i));
|
|
||||||
added = TRUE;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Ensure reverse-DNS works by directing queries for ip6.arpa
|
|
||||||
* domains to the split domain's nameserver.
|
|
||||||
*/
|
|
||||||
domains = get_ip6_rdns_domains (ip6);
|
|
||||||
if (domains) {
|
|
||||||
for (iter = domains; iter && *iter; iter++)
|
|
||||||
add_dnsmasq_nameserver (self, servers, buf, *iter);
|
|
||||||
g_strfreev (domains);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_free (buf);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/* If no searches or domains, just add the nameservers */
|
/* If no searches or domains, just add the nameservers */
|
||||||
if (!added) {
|
if (!added) {
|
||||||
for (i = 0; i < nnameservers; i++) {
|
for (i = 0; i < nnameservers; i++) {
|
||||||
addr = nm_ip6_config_get_nameserver (ip6, i);
|
addr = nm_ip4_config_get_nameserver (ip4, i);
|
||||||
buf = ip6_addr_to_string (addr, iface);
|
g_snprintf (buf, sizeof (buf), "%s@%s",
|
||||||
if (buf) {
|
nm_utils_inet4_ntop (addr, buf2), iface);
|
||||||
add_dnsmasq_nameserver (self, servers, buf, NULL);
|
add_dnsmasq_nameserver (self, servers, buf, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
NMIP6Config *ip6 = (NMIP6Config *) ip_config;
|
||||||
|
const struct in6_addr *addr;
|
||||||
|
char *buf = NULL;
|
||||||
|
int nnameservers, i_nameserver, n, i;
|
||||||
|
gboolean added = FALSE;
|
||||||
|
|
||||||
|
g_return_val_if_fail (iface, FALSE);
|
||||||
|
nnameservers = nm_ip6_config_get_num_nameservers (ip6);
|
||||||
|
|
||||||
|
if (split) {
|
||||||
|
char **domains, **iter;
|
||||||
|
|
||||||
|
if (nnameservers == 0)
|
||||||
|
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);
|
||||||
|
|
||||||
|
/* searches are preferred over domains */
|
||||||
|
n = nm_ip6_config_get_num_searches (ip6);
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
add_dnsmasq_nameserver (self,
|
||||||
|
servers,
|
||||||
|
buf,
|
||||||
|
nm_ip6_config_get_search (ip6, i));
|
||||||
|
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++) {
|
||||||
|
add_dnsmasq_nameserver (self,
|
||||||
|
servers,
|
||||||
|
buf,
|
||||||
|
nm_ip6_config_get_domain (ip6, i));
|
||||||
|
added = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Ensure reverse-DNS works by directing queries for ip6.arpa
|
||||||
|
* domains to the split domain's nameserver.
|
||||||
|
*/
|
||||||
|
domains = get_ip6_rdns_domains (ip6);
|
||||||
|
if (domains) {
|
||||||
|
for (iter = domains; iter && *iter; iter++)
|
||||||
|
add_dnsmasq_nameserver (self, servers, buf, *iter);
|
||||||
|
g_strfreev (domains);
|
||||||
|
}
|
||||||
|
|
||||||
g_free (buf);
|
g_free (buf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If no searches or domains, just add the nameservers */
|
||||||
|
if (!added) {
|
||||||
|
for (i = 0; i < nnameservers; i++) {
|
||||||
|
addr = nm_ip6_config_get_nameserver (ip6, i);
|
||||||
|
buf = ip6_addr_to_string (addr, iface);
|
||||||
|
if (buf) {
|
||||||
|
add_dnsmasq_nameserver (self, servers, buf, NULL);
|
||||||
|
g_free (buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@@ -347,20 +349,11 @@ add_ip6_config (NMDnsDnsmasq *self, GVariantBuilder *servers, NMIP6Config *ip6,
|
|||||||
static gboolean
|
static gboolean
|
||||||
add_ip_config_data (NMDnsDnsmasq *self, GVariantBuilder *servers, const NMDnsIPConfigData *data)
|
add_ip_config_data (NMDnsDnsmasq *self, GVariantBuilder *servers, const NMDnsIPConfigData *data)
|
||||||
{
|
{
|
||||||
if (NM_IS_IP4_CONFIG (data->config)) {
|
return add_ip_config (self,
|
||||||
return add_ip4_config (self,
|
servers,
|
||||||
servers,
|
data->config,
|
||||||
(NMIP4Config *) data->config,
|
data->iface,
|
||||||
data->iface,
|
data->type == NM_DNS_IP_CONFIG_TYPE_VPN);
|
||||||
data->type == NM_DNS_IP_CONFIG_TYPE_VPN);
|
|
||||||
} else if (NM_IS_IP6_CONFIG (data->config)) {
|
|
||||||
return add_ip6_config (self,
|
|
||||||
servers,
|
|
||||||
(NMIP6Config *) data->config,
|
|
||||||
data->iface,
|
|
||||||
data->type == NM_DNS_IP_CONFIG_TYPE_VPN);
|
|
||||||
} else
|
|
||||||
g_return_val_if_reached (FALSE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Reference in New Issue
Block a user