summaryrefslogtreecommitdiff
path: root/support
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2017-07-05 17:39:33 +0200
committerFlorian Weimer <fweimer@redhat.com>2017-07-05 19:04:40 +0200
commitcb3c27e87b914bde5ec00a02363536c76e08b850 (patch)
tree8a20c3b98ba3e0fb7ecac4d79d881f66971c905b /support
parentd4165eedf5b85bfda3ea6b251f69838857e44925 (diff)
support: Add resolver testing mode which does not patch _res
Diffstat (limited to 'support')
-rw-r--r--support/resolv_test.c37
-rw-r--r--support/resolv_test.h10
2 files changed, 45 insertions, 2 deletions
diff --git a/support/resolv_test.c b/support/resolv_test.c
index 050cd7154b..1625dcf43a 100644
--- a/support/resolv_test.c
+++ b/support/resolv_test.c
@@ -1004,6 +1004,29 @@ make_server_sockets (struct resolv_test_server *server)
}
}
+/* Like make_server_sockets, but the caller supplies the address to
+ use. */
+static void
+make_server_sockets_for_address (struct resolv_test_server *server,
+ const struct sockaddr *addr)
+{
+ server->socket_udp = xsocket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+ server->socket_tcp = xsocket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
+
+ if (addr->sa_family == AF_INET)
+ server->address = *(const struct sockaddr_in *) addr;
+ else
+ /* We cannot store the server address in the socket. This should
+ not matter if disable_redirect is used. */
+ server->address = (struct sockaddr_in) { .sin_family = 0, };
+
+ xbind (server->socket_udp,
+ (struct sockaddr *)&server->address, sizeof (server->address));
+ xbind (server->socket_tcp,
+ (struct sockaddr *)&server->address, sizeof (server->address));
+ xlisten (server->socket_tcp, 5);
+}
+
/* One-time initialization of NSS. */
static void
resolv_redirect_once (void)
@@ -1064,11 +1087,17 @@ resolv_test_start (struct resolv_redirect_config config)
.lock = PTHREAD_MUTEX_INITIALIZER,
};
- resolv_test_init ();
+ if (!config.disable_redirect)
+ resolv_test_init ();
/* Create all the servers, to reserve the necessary ports. */
for (int server_index = 0; server_index < config.nscount; ++server_index)
- make_server_sockets (obj->servers + server_index);
+ if (config.disable_redirect && config.server_address_overrides != NULL)
+ make_server_sockets_for_address
+ (obj->servers + server_index,
+ config.server_address_overrides[server_index]);
+ else
+ make_server_sockets (obj->servers + server_index);
/* Start server threads. Disable the server ports, as
requested. */
@@ -1095,6 +1124,9 @@ resolv_test_start (struct resolv_redirect_config config)
if (config.single_thread_udp)
start_server_thread_udp_single (obj);
+ if (config.disable_redirect)
+ return obj;
+
int timeout = 1;
/* Initialize libresolv. */
@@ -1129,6 +1161,7 @@ resolv_test_start (struct resolv_redirect_config config)
}
for (int server_index = 0; server_index < config.nscount; ++server_index)
{
+ TEST_VERIFY_EXIT (obj->servers[server_index].address.sin_port != 0);
_res.nsaddr_list[server_index] = obj->servers[server_index].address;
if (test_verbose)
{
diff --git a/support/resolv_test.h b/support/resolv_test.h
index 6498751569..b953dc1200 100644
--- a/support/resolv_test.h
+++ b/support/resolv_test.h
@@ -93,6 +93,16 @@ struct resolv_redirect_config
may results in more predictable ordering of queries and
responses. */
bool single_thread_udp;
+
+ /* Do not rewrite the _res variable or change NSS defaults. Use
+ server_address_overrides below to tell the testing framework on
+ which addresses to create the servers. */
+ bool disable_redirect;
+
+ /* Use these addresses for creating the DNS servers. The array must
+ have ns_count (or resolv_max_test_servers) sockaddr * elements if
+ not NULL. */
+ const struct sockaddr *const *server_address_overrides;
};
/* Configure NSS to use, nss_dns only for aplicable databases, and try