mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-05-07 07:18:03 +02:00
dns: merge branch 'bg/dnsmasq-rdns-bgo767174'
https://bugzilla.gnome.org/show_bug.cgi?id=767174
This commit is contained in:
commit
ff3cd5aaf5
7 changed files with 308 additions and 137 deletions
|
|
@ -308,8 +308,6 @@ libNetworkManager_la_SOURCES = \
|
||||||
dns-manager/nm-dns-manager.h \
|
dns-manager/nm-dns-manager.h \
|
||||||
dns-manager/nm-dns-plugin.c \
|
dns-manager/nm-dns-plugin.c \
|
||||||
dns-manager/nm-dns-plugin.h \
|
dns-manager/nm-dns-plugin.h \
|
||||||
dns-manager/nm-dns-utils.c \
|
|
||||||
dns-manager/nm-dns-utils.h \
|
|
||||||
\
|
\
|
||||||
dnsmasq-manager/nm-dnsmasq-manager.c \
|
dnsmasq-manager/nm-dnsmasq-manager.c \
|
||||||
dnsmasq-manager/nm-dnsmasq-manager.h \
|
dnsmasq-manager/nm-dnsmasq-manager.h \
|
||||||
|
|
|
||||||
|
|
@ -29,10 +29,11 @@
|
||||||
#include <linux/if.h>
|
#include <linux/if.h>
|
||||||
|
|
||||||
#include "nm-dns-dnsmasq.h"
|
#include "nm-dns-dnsmasq.h"
|
||||||
|
#include "nm-core-internal.h"
|
||||||
|
#include "nm-platform.h"
|
||||||
#include "nm-utils.h"
|
#include "nm-utils.h"
|
||||||
#include "nm-ip4-config.h"
|
#include "nm-ip4-config.h"
|
||||||
#include "nm-ip6-config.h"
|
#include "nm-ip6-config.h"
|
||||||
#include "nm-dns-utils.h"
|
|
||||||
#include "nm-bus-manager.h"
|
#include "nm-bus-manager.h"
|
||||||
#include "NetworkManagerUtils.h"
|
#include "NetworkManagerUtils.h"
|
||||||
|
|
||||||
|
|
@ -70,6 +71,70 @@ typedef struct {
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
static char **
|
||||||
|
get_ip4_rdns_domains (NMIP4Config *ip4)
|
||||||
|
{
|
||||||
|
char **strv;
|
||||||
|
GPtrArray *domains = NULL;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
g_return_val_if_fail (ip4 != NULL, NULL);
|
||||||
|
|
||||||
|
domains = g_ptr_array_sized_new (5);
|
||||||
|
|
||||||
|
for (i = 0; i < nm_ip4_config_get_num_addresses (ip4); i++) {
|
||||||
|
const NMPlatformIP4Address *address = nm_ip4_config_get_address (ip4, i);
|
||||||
|
|
||||||
|
nm_utils_get_reverse_dns_domains_ip4 (address->address, address->plen, domains);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < nm_ip4_config_get_num_routes (ip4); i++) {
|
||||||
|
const NMPlatformIP4Route *route = nm_ip4_config_get_route (ip4, i);
|
||||||
|
|
||||||
|
nm_utils_get_reverse_dns_domains_ip4 (route->network, route->plen, domains);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Terminating NULL so we can use g_strfreev() to free it */
|
||||||
|
g_ptr_array_add (domains, NULL);
|
||||||
|
|
||||||
|
/* Free the array and return NULL if the only element was the ending NULL */
|
||||||
|
strv = (char **) g_ptr_array_free (domains, (domains->len == 1));
|
||||||
|
|
||||||
|
return _nm_utils_strv_cleanup (strv, FALSE, FALSE, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static char **
|
||||||
|
get_ip6_rdns_domains (NMIP6Config *ip6)
|
||||||
|
{
|
||||||
|
char **strv;
|
||||||
|
GPtrArray *domains = NULL;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
g_return_val_if_fail (ip6 != NULL, NULL);
|
||||||
|
|
||||||
|
domains = g_ptr_array_sized_new (5);
|
||||||
|
|
||||||
|
for (i = 0; i < nm_ip6_config_get_num_addresses (ip6); i++) {
|
||||||
|
const NMPlatformIP6Address *address = nm_ip6_config_get_address (ip6, i);
|
||||||
|
|
||||||
|
nm_utils_get_reverse_dns_domains_ip6 (&address->address, address->plen, domains);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < nm_ip6_config_get_num_routes (ip6); i++) {
|
||||||
|
const NMPlatformIP6Route *route = nm_ip6_config_get_route (ip6, i);
|
||||||
|
|
||||||
|
nm_utils_get_reverse_dns_domains_ip6 (&route->network, route->plen, domains);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Terminating NULL so we can use g_strfreev() to free it */
|
||||||
|
g_ptr_array_add (domains, NULL);
|
||||||
|
|
||||||
|
/* Free the array and return NULL if the only element was the ending NULL */
|
||||||
|
strv = (char **) g_ptr_array_free (domains, (domains->len == 1));
|
||||||
|
|
||||||
|
return _nm_utils_strv_cleanup (strv, FALSE, FALSE, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
add_dnsmasq_nameserver (NMDnsDnsmasq *self,
|
add_dnsmasq_nameserver (NMDnsDnsmasq *self,
|
||||||
GVariantBuilder *servers,
|
GVariantBuilder *servers,
|
||||||
|
|
@ -139,7 +204,7 @@ add_ip4_config (NMDnsDnsmasq *self, GVariantBuilder *servers, NMIP4Config *ip4,
|
||||||
/* Ensure reverse-DNS works by directing queries for in-addr.arpa
|
/* Ensure reverse-DNS works by directing queries for in-addr.arpa
|
||||||
* domains to the split domain's nameserver.
|
* domains to the split domain's nameserver.
|
||||||
*/
|
*/
|
||||||
domains = nm_dns_utils_get_ip4_rdns_domains (ip4);
|
domains = get_ip4_rdns_domains (ip4);
|
||||||
if (domains) {
|
if (domains) {
|
||||||
for (iter = domains; iter && *iter; iter++)
|
for (iter = domains; iter && *iter; iter++)
|
||||||
add_dnsmasq_nameserver (self, servers, buf, *iter);
|
add_dnsmasq_nameserver (self, servers, buf, *iter);
|
||||||
|
|
@ -219,6 +284,8 @@ add_ip6_config (NMDnsDnsmasq *self, GVariantBuilder *servers, NMIP6Config *ip6,
|
||||||
nnameservers = nm_ip6_config_get_num_nameservers (ip6);
|
nnameservers = nm_ip6_config_get_num_nameservers (ip6);
|
||||||
|
|
||||||
if (split) {
|
if (split) {
|
||||||
|
char **domains, **iter;
|
||||||
|
|
||||||
if (nnameservers == 0)
|
if (nnameservers == 0)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
|
@ -248,6 +315,16 @@ add_ip6_config (NMDnsDnsmasq *self, GVariantBuilder *servers, NMIP6Config *ip6,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,105 +0,0 @@
|
||||||
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
|
|
||||||
/* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
* any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License along
|
|
||||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2010 Red Hat, Inc.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "nm-default.h"
|
|
||||||
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "nm-dns-utils.h"
|
|
||||||
#include "nm-platform.h"
|
|
||||||
#include "nm-utils.h"
|
|
||||||
|
|
||||||
static void
|
|
||||||
add_ip4_to_rdns_array (guint32 ip, GPtrArray *domains) /* network byte order */
|
|
||||||
{
|
|
||||||
guint32 defprefix;
|
|
||||||
guchar *p;
|
|
||||||
char *str = NULL;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
defprefix = nm_utils_ip4_get_default_prefix (ip);
|
|
||||||
|
|
||||||
/* Convert to host byte order, mask the host bits, and convert back */
|
|
||||||
ip = ntohl (ip);
|
|
||||||
ip &= 0xFFFFFFFF << (32 - defprefix);
|
|
||||||
ip = htonl (ip);
|
|
||||||
p = (guchar *) &ip;
|
|
||||||
|
|
||||||
if (defprefix == 8)
|
|
||||||
str = g_strdup_printf ("%u.in-addr.arpa", p[0] & 0xFF);
|
|
||||||
else if (defprefix == 16)
|
|
||||||
str = g_strdup_printf ("%u.%u.in-addr.arpa", p[1] & 0xFF, p[0] & 0xFF);
|
|
||||||
else if (defprefix == 24)
|
|
||||||
str = g_strdup_printf ("%u.%u.%u.in-addr.arpa", p[2] & 0xFF, p[1] & 0xFF, p[0] & 0xFF);
|
|
||||||
|
|
||||||
if (!str) {
|
|
||||||
g_return_if_fail (str != NULL);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Suppress duplicates */
|
|
||||||
for (i = 0; i < domains->len; i++) {
|
|
||||||
if (strcmp (str, g_ptr_array_index (domains, i)) == 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i == domains->len)
|
|
||||||
g_ptr_array_add (domains, str);
|
|
||||||
else
|
|
||||||
g_free (str);
|
|
||||||
}
|
|
||||||
|
|
||||||
char **
|
|
||||||
nm_dns_utils_get_ip4_rdns_domains (NMIP4Config *ip4)
|
|
||||||
{
|
|
||||||
GPtrArray *domains = NULL;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
g_return_val_if_fail (ip4 != NULL, NULL);
|
|
||||||
|
|
||||||
domains = g_ptr_array_sized_new (5);
|
|
||||||
|
|
||||||
/* To calculate the reverse DNS domains for this IP4 config, we take
|
|
||||||
* all the IP addresses and routes in the config, calculate the network
|
|
||||||
* portion, and convert that to classful, and use the network bits for
|
|
||||||
* the final domain. FIXME: better handle classless routing, which might
|
|
||||||
* require us to add multiple domains for each actual network prefix to
|
|
||||||
* cover all the separate networks in that block.
|
|
||||||
*/
|
|
||||||
|
|
||||||
for (i = 0; i < nm_ip4_config_get_num_addresses (ip4); i++) {
|
|
||||||
const NMPlatformIP4Address *address = nm_ip4_config_get_address (ip4, i);
|
|
||||||
|
|
||||||
add_ip4_to_rdns_array (address->address, domains);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < nm_ip4_config_get_num_routes (ip4); i++) {
|
|
||||||
const NMPlatformIP4Route *route = nm_ip4_config_get_route (ip4, i);
|
|
||||||
|
|
||||||
add_ip4_to_rdns_array (route->network, domains);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Terminating NULL so we can use g_strfreev() to free it */
|
|
||||||
g_ptr_array_add (domains, NULL);
|
|
||||||
|
|
||||||
/* Free the array and return NULL if the only element was the ending NULL */
|
|
||||||
return (char **) g_ptr_array_free (domains, (domains->len == 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,28 +0,0 @@
|
||||||
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
|
|
||||||
/* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
* any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License along
|
|
||||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2010 Red Hat, Inc.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __NETWORKMANAGER_DNS_UTILS_H__
|
|
||||||
#define __NETWORKMANAGER_DNS_UTILS_H__
|
|
||||||
|
|
||||||
#include "nm-ip4-config.h"
|
|
||||||
|
|
||||||
char **nm_dns_utils_get_ip4_rdns_domains (NMIP4Config *ip4);
|
|
||||||
|
|
||||||
#endif /* NM_DNS_UTILS_H */
|
|
||||||
|
|
||||||
|
|
@ -3270,3 +3270,108 @@ nm_utils_dnsmasq_status_to_string (int status, char *dest, gsize size)
|
||||||
g_snprintf (dest, size, "%s (%d)", msg, status);
|
g_snprintf (dest, size, "%s (%d)", msg, status);
|
||||||
return dest;
|
return dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* nm_utils_get_reverse_dns_domains_ip4:
|
||||||
|
* @addr: IP address in network order
|
||||||
|
* @plen: prefix length
|
||||||
|
* @domains: array for results
|
||||||
|
*
|
||||||
|
* Creates reverse DNS domains for the given address and prefix length, and
|
||||||
|
* append them to @domains.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
nm_utils_get_reverse_dns_domains_ip4 (guint32 addr, guint8 plen, GPtrArray *domains)
|
||||||
|
{
|
||||||
|
guint32 ip, ip2, mask;
|
||||||
|
guchar *p;
|
||||||
|
guint octets;
|
||||||
|
guint i;
|
||||||
|
gsize len0, len;
|
||||||
|
char *str, *s;
|
||||||
|
|
||||||
|
g_return_if_fail (domains);
|
||||||
|
g_return_if_fail (plen <= 32);
|
||||||
|
|
||||||
|
if (!plen)
|
||||||
|
return;
|
||||||
|
|
||||||
|
octets = (plen - 1) / 8 + 1;
|
||||||
|
ip = ntohl (addr);
|
||||||
|
mask = 0xFFFFFFFF << (32 - plen);
|
||||||
|
ip &= mask;
|
||||||
|
ip2 = ip;
|
||||||
|
|
||||||
|
len0 = NM_STRLEN ("in-addr.arpa") + (4 * octets) + 1;
|
||||||
|
while ((ip2 & mask) == ip) {
|
||||||
|
addr = htonl (ip2);
|
||||||
|
p = (guchar *) &addr;
|
||||||
|
|
||||||
|
len = len0;
|
||||||
|
str = s = g_malloc (len);
|
||||||
|
for (i = octets; i > 0; i--)
|
||||||
|
nm_utils_strbuf_append (&s, &len, "%u.", p[i - 1] & 0xff);
|
||||||
|
nm_utils_strbuf_append_str (&s, &len, "in-addr.arpa");
|
||||||
|
|
||||||
|
g_ptr_array_add (domains, str);
|
||||||
|
|
||||||
|
ip2 += 1 << ((32 - plen) & ~7);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* nm_utils_get_reverse_dns_domains_ip6:
|
||||||
|
* @addr: IPv6 address
|
||||||
|
* @plen: prefix length
|
||||||
|
* @domains: array for results
|
||||||
|
*
|
||||||
|
* Creates reverse DNS domains for the given address and prefix length, and
|
||||||
|
* append them to @domains.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
nm_utils_get_reverse_dns_domains_ip6 (const struct in6_addr *ip, guint8 plen, GPtrArray *domains)
|
||||||
|
{
|
||||||
|
struct in6_addr addr;
|
||||||
|
guint nibbles, bits, entries;
|
||||||
|
int i, j;
|
||||||
|
gsize len0, len;
|
||||||
|
char *str, *s;
|
||||||
|
|
||||||
|
g_return_if_fail (domains);
|
||||||
|
g_return_if_fail (plen <= 128);
|
||||||
|
|
||||||
|
if (!plen)
|
||||||
|
return;
|
||||||
|
|
||||||
|
memcpy (&addr, ip, sizeof (struct in6_addr));
|
||||||
|
nm_utils_ip6_address_clear_host_address (&addr, &addr, plen);
|
||||||
|
|
||||||
|
/* Number of nibbles to include in domains */
|
||||||
|
nibbles = (plen - 1) / 4 + 1;
|
||||||
|
/* Prefix length in nibble */
|
||||||
|
bits = plen - ((plen - 1) / 4 * 4);
|
||||||
|
/* Number of domains */
|
||||||
|
entries = 1 << (4 - bits);
|
||||||
|
|
||||||
|
len0 = NM_STRLEN ("ip6.arpa") + (2 * nibbles) + 1;
|
||||||
|
|
||||||
|
#define N_SHIFT(x) ((x) % 2 ? 0 : 4)
|
||||||
|
|
||||||
|
for (i = 0; i < entries; i++) {
|
||||||
|
len = len0;
|
||||||
|
str = s = g_malloc (len);
|
||||||
|
|
||||||
|
for (j = nibbles - 1; j >= 0; j--)
|
||||||
|
nm_utils_strbuf_append (&s,
|
||||||
|
&len,
|
||||||
|
"%x.",
|
||||||
|
(addr.s6_addr[j / 2] >> N_SHIFT (j)) & 0xf);
|
||||||
|
nm_utils_strbuf_append_str (&s, &len, "ip6.arpa");
|
||||||
|
|
||||||
|
g_ptr_array_add (domains, str);
|
||||||
|
|
||||||
|
addr.s6_addr[(nibbles - 1) / 2] += 1 << N_SHIFT (nibbles - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef N_SHIFT
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -406,4 +406,7 @@ gboolean nm_utils_ip4_address_is_link_local (in_addr_t addr);
|
||||||
|
|
||||||
const char *nm_utils_dnsmasq_status_to_string (int status, char *dest, gsize size);
|
const char *nm_utils_dnsmasq_status_to_string (int status, char *dest, gsize size);
|
||||||
|
|
||||||
|
void nm_utils_get_reverse_dns_domains_ip4 (guint32 ip, guint8 plen, GPtrArray *domains);
|
||||||
|
void nm_utils_get_reverse_dns_domains_ip6 (const struct in6_addr *ip, guint8 plen, GPtrArray *domains);
|
||||||
|
|
||||||
#endif /* __NM_CORE_UTILS_H__ */
|
#endif /* __NM_CORE_UTILS_H__ */
|
||||||
|
|
|
||||||
|
|
@ -1361,6 +1361,124 @@ test_duplicate_decl_specifier (void)
|
||||||
v_result[0] = TEST_MAX (v_const[0], nmtst_get_rand_int () % 5) + v2;
|
v_result[0] = TEST_MAX (v_const[0], nmtst_get_rand_int () % 5) + v2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_reverse_dns_ip4 (void)
|
||||||
|
{
|
||||||
|
guint32 addr;
|
||||||
|
GPtrArray *domains = g_ptr_array_new_full (8, g_free);
|
||||||
|
|
||||||
|
inet_pton (AF_INET, "7.2.3.0", &addr);
|
||||||
|
nm_utils_get_reverse_dns_domains_ip4 (addr, 27, domains);
|
||||||
|
g_assert_cmpuint (domains->len, ==, 32);
|
||||||
|
g_assert_cmpstr (domains->pdata[0], ==, "0.3.2.7.in-addr.arpa");
|
||||||
|
g_assert_cmpstr (domains->pdata[31], ==, "31.3.2.7.in-addr.arpa");
|
||||||
|
|
||||||
|
g_ptr_array_set_size (domains, 0);
|
||||||
|
|
||||||
|
inet_pton (AF_INET, "10.155.16.0", &addr);
|
||||||
|
nm_utils_get_reverse_dns_domains_ip4 (addr, 22, domains);
|
||||||
|
g_assert_cmpuint (domains->len, ==, 4);
|
||||||
|
g_assert_cmpstr (domains->pdata[0], ==, "16.155.10.in-addr.arpa");
|
||||||
|
g_assert_cmpstr (domains->pdata[1], ==, "17.155.10.in-addr.arpa");
|
||||||
|
g_assert_cmpstr (domains->pdata[2], ==, "18.155.10.in-addr.arpa");
|
||||||
|
g_assert_cmpstr (domains->pdata[3], ==, "19.155.10.in-addr.arpa");
|
||||||
|
|
||||||
|
g_ptr_array_set_size (domains, 0);
|
||||||
|
|
||||||
|
inet_pton (AF_INET, "4.5.6.7", &addr);
|
||||||
|
nm_utils_get_reverse_dns_domains_ip4 (addr, 32, domains);
|
||||||
|
g_assert_cmpuint (domains->len, ==, 1);
|
||||||
|
g_assert_cmpstr (domains->pdata[0], ==, "7.6.5.4.in-addr.arpa");
|
||||||
|
|
||||||
|
g_ptr_array_set_size (domains, 0);
|
||||||
|
|
||||||
|
inet_pton (AF_INET, "4.5.6.7", &addr);
|
||||||
|
nm_utils_get_reverse_dns_domains_ip4 (addr, 8, domains);
|
||||||
|
g_assert_cmpuint (domains->len, ==, 1);
|
||||||
|
g_assert_cmpstr (domains->pdata[0], ==, "4.in-addr.arpa");
|
||||||
|
|
||||||
|
g_ptr_array_set_size (domains, 0);
|
||||||
|
|
||||||
|
inet_pton (AF_INET, "4.180.6.7", &addr);
|
||||||
|
nm_utils_get_reverse_dns_domains_ip4 (addr, 9, domains);
|
||||||
|
g_assert_cmpuint (domains->len, ==, 128);
|
||||||
|
g_assert_cmpstr (domains->pdata[0], ==, "128.4.in-addr.arpa");
|
||||||
|
g_assert_cmpstr (domains->pdata[1], ==, "129.4.in-addr.arpa");
|
||||||
|
g_assert_cmpstr (domains->pdata[127], ==, "255.4.in-addr.arpa");
|
||||||
|
|
||||||
|
g_ptr_array_set_size (domains, 0);
|
||||||
|
|
||||||
|
inet_pton (AF_INET, "172.16.0.0", &addr);
|
||||||
|
nm_utils_get_reverse_dns_domains_ip4 (addr, 12, domains);
|
||||||
|
g_assert_cmpuint (domains->len, ==, 16);
|
||||||
|
g_assert_cmpstr (domains->pdata[0], ==, "16.172.in-addr.arpa");
|
||||||
|
g_assert_cmpstr (domains->pdata[1], ==, "17.172.in-addr.arpa");
|
||||||
|
g_assert_cmpstr (domains->pdata[14], ==, "30.172.in-addr.arpa");
|
||||||
|
g_assert_cmpstr (domains->pdata[15], ==, "31.172.in-addr.arpa");
|
||||||
|
|
||||||
|
g_ptr_array_set_size (domains, 0);
|
||||||
|
|
||||||
|
inet_pton (AF_INET, "1.2.3.4", &addr);
|
||||||
|
nm_utils_get_reverse_dns_domains_ip4 (addr, 0, domains);
|
||||||
|
g_assert_cmpuint (domains->len, ==, 0);
|
||||||
|
|
||||||
|
g_ptr_array_unref (domains);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_reverse_dns_ip6 (void)
|
||||||
|
{
|
||||||
|
struct in6_addr addr;
|
||||||
|
GPtrArray *domains = g_ptr_array_new_full (8, g_free);
|
||||||
|
|
||||||
|
inet_pton (AF_INET6, "1234::56", &addr);
|
||||||
|
nm_utils_get_reverse_dns_domains_ip6 (&addr, 16, domains);
|
||||||
|
g_assert_cmpuint (domains->len, ==, 1);
|
||||||
|
g_assert_cmpstr (domains->pdata[0], ==, "4.3.2.1.ip6.arpa");
|
||||||
|
|
||||||
|
g_ptr_array_set_size (domains, 0);
|
||||||
|
|
||||||
|
inet_pton (AF_INET6, "1234::56", &addr);
|
||||||
|
nm_utils_get_reverse_dns_domains_ip6 (&addr, 17, domains);
|
||||||
|
g_assert_cmpuint (domains->len, ==, 8);
|
||||||
|
g_assert_cmpstr (domains->pdata[0], ==, "0.4.3.2.1.ip6.arpa");
|
||||||
|
g_assert_cmpstr (domains->pdata[1], ==, "1.4.3.2.1.ip6.arpa");
|
||||||
|
g_assert_cmpstr (domains->pdata[7], ==, "7.4.3.2.1.ip6.arpa");
|
||||||
|
|
||||||
|
g_ptr_array_set_size (domains, 0);
|
||||||
|
|
||||||
|
inet_pton (AF_INET6, "2001:db8::", &addr);
|
||||||
|
nm_utils_get_reverse_dns_domains_ip6 (&addr, 29, domains);
|
||||||
|
g_assert_cmpuint (domains->len, ==, 8);
|
||||||
|
g_assert_cmpstr (domains->pdata[0], ==, "8.b.d.0.1.0.0.2.ip6.arpa");
|
||||||
|
g_assert_cmpstr (domains->pdata[1], ==, "9.b.d.0.1.0.0.2.ip6.arpa");
|
||||||
|
g_assert_cmpstr (domains->pdata[7], ==, "f.b.d.0.1.0.0.2.ip6.arpa");
|
||||||
|
|
||||||
|
g_ptr_array_set_size (domains, 0);
|
||||||
|
|
||||||
|
inet_pton (AF_INET6, "0123:4567:89ab:cdef::", &addr);
|
||||||
|
nm_utils_get_reverse_dns_domains_ip6 (&addr, 63, domains);
|
||||||
|
g_assert_cmpuint (domains->len, ==, 2);
|
||||||
|
g_assert_cmpstr (domains->pdata[0], ==, "e.e.d.c.b.a.9.8.7.6.5.4.3.2.1.0.ip6.arpa");
|
||||||
|
g_assert_cmpstr (domains->pdata[1], ==, "f.e.d.c.b.a.9.8.7.6.5.4.3.2.1.0.ip6.arpa");
|
||||||
|
|
||||||
|
g_ptr_array_set_size (domains, 0);
|
||||||
|
|
||||||
|
inet_pton (AF_INET6, "fec0:1234:5678:9ab0::", &addr);
|
||||||
|
nm_utils_get_reverse_dns_domains_ip6 (&addr, 61, domains);
|
||||||
|
g_assert_cmpuint (domains->len, ==, 8);
|
||||||
|
g_assert_cmpstr (domains->pdata[0], ==, "0.b.a.9.8.7.6.5.4.3.2.1.0.c.e.f.ip6.arpa");
|
||||||
|
g_assert_cmpstr (domains->pdata[7], ==, "7.b.a.9.8.7.6.5.4.3.2.1.0.c.e.f.ip6.arpa");
|
||||||
|
|
||||||
|
g_ptr_array_set_size (domains, 0);
|
||||||
|
|
||||||
|
inet_pton (AF_INET6, "0123:4567:89ab:cdee::", &addr);
|
||||||
|
nm_utils_get_reverse_dns_domains_ip6 (&addr, 0, domains);
|
||||||
|
g_assert_cmpuint (domains->len, ==, 0);
|
||||||
|
|
||||||
|
g_ptr_array_unref (domains);
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
NMTST_DEFINE ();
|
NMTST_DEFINE ();
|
||||||
|
|
@ -1397,6 +1515,9 @@ main (int argc, char **argv)
|
||||||
g_test_add_func ("/general/nm_match_spec_match_config", test_nm_match_spec_match_config);
|
g_test_add_func ("/general/nm_match_spec_match_config", test_nm_match_spec_match_config);
|
||||||
g_test_add_func ("/general/duplicate_decl_specifier", test_duplicate_decl_specifier);
|
g_test_add_func ("/general/duplicate_decl_specifier", test_duplicate_decl_specifier);
|
||||||
|
|
||||||
|
g_test_add_func ("/general/reverse_dns/ip4", test_reverse_dns_ip4);
|
||||||
|
g_test_add_func ("/general/reverse_dns/ip6", test_reverse_dns_ip6);
|
||||||
|
|
||||||
return g_test_run ();
|
return g_test_run ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue