i_unreached();
ctx = i_new(struct dns_cache_lookup, 1);
ctx->key = i_strdup(entry->cache_key);
- if (dns_client_lookup_ptr(client, &ip,
+ if (dns_client_lookup_ptr(client, &ip, client->conn.event,
dns_client_cache_callback,
ctx, &lookup) < 0) {
e_debug(client->conn.event,
ctx = i_new(struct dns_cache_lookup, 1);
ctx->key = i_strdup(entry->cache_key);
if (dns_client_lookup(client, entry->cache_key + 1,
+ client->conn.event,
dns_client_cache_callback,
ctx, &lookup) < 0) {
e_debug(client->conn.event,
client = dns_client_init(set);
event_add_category(client->conn.event, &event_category_dns);
client->deinit_client_at_free = TRUE;
- return dns_client_lookup(client, host, callback, context, lookup_r);
+ return dns_client_lookup(client, host, client->conn.event, callback,
+ context, lookup_r);
}
int dns_lookup_ptr(const struct ip_addr *ip,
client = dns_client_init(set);
event_add_category(client->conn.event, &event_category_dns);
client->deinit_client_at_free = TRUE;
- return dns_client_lookup_ptr(client, ip, callback, context, lookup_r);
+ return dns_client_lookup_ptr(client, ip, client->conn.event,
+ callback, context, lookup_r);
}
static void dns_client_idle_timeout(struct dns_client *client)
static int
dns_client_lookup_common(struct dns_client *client,
const char *cmd, const char *param, bool ptr_lookup,
+ struct event *event,
dns_lookup_callback_t *callback, void *context,
struct dns_lookup **lookup_r)
{
lookup->context = context;
lookup->ptr_lookup = ptr_lookup;
lookup->result.ret = EAI_FAIL;
- lookup->event = event_create(client->conn.event);
+ lookup->event = event_create(event);
+ event_add_category(lookup->event, &event_category_dns);
lookup->cache_key = p_strdup_printf(lookup->pool, "%c%s",
ptr_lookup ? 'I' : 'N', param);
event_set_append_log_prefix(lookup->event, t_strconcat("dns(", param, "): ", NULL));
}
int dns_client_lookup(struct dns_client *client, const char *host,
+ struct event *event,
dns_lookup_callback_t *callback, void *context,
struct dns_lookup **lookup_r)
{
- return dns_client_lookup_common(client, "IP", host, FALSE,
+ return dns_client_lookup_common(client, "IP", host, FALSE, event,
callback, context, lookup_r);
}
int dns_client_lookup_ptr(struct dns_client *client, const struct ip_addr *ip,
+ struct event *event,
dns_lookup_callback_t *callback, void *context,
struct dns_lookup **lookup_r)
{
return dns_client_lookup_common(client, "NAME", net_ip2addr(ip), TRUE,
- callback, context, lookup_r);
+ event, callback, context, lookup_r);
}
void dns_client_switch_ioloop(struct dns_client *client)
/* Connect immediately to the dns-lookup socket. */
int dns_client_connect(struct dns_client *client, const char **error_r);
int dns_client_lookup(struct dns_client *client, const char *host,
+ struct event *event,
dns_lookup_callback_t *callback, void *context,
struct dns_lookup **lookup_r) ATTR_NULL(4);
-#define dns_client_lookup(client, host, callback, context, lookup_r) \
+#define dns_client_lookup(client, host, event, callback, context, lookup_r) \
dns_client_lookup(client, host - \
CALLBACK_TYPECHECK(callback, void (*)( \
const struct dns_lookup_result *, typeof(context))), \
- (dns_lookup_callback_t *)callback, context, lookup_r)
+ event, (dns_lookup_callback_t *)callback, context, lookup_r)
int dns_client_lookup_ptr(struct dns_client *client, const struct ip_addr *ip,
+ struct event *event,
dns_lookup_callback_t *callback, void *context,
struct dns_lookup **lookup_r) ATTR_NULL(4);
-#define dns_client_lookup_ptr(client, host, callback, context, lookup_r) \
- dns_client_lookup_ptr(client, host - \
+#define dns_client_lookup_ptr(client, ip, event, callback, context, lookup_r) \
+ dns_client_lookup_ptr(client, ip - \
CALLBACK_TYPECHECK(callback, void (*)( \
const struct dns_lookup_result *, typeof(context))), \
- (dns_lookup_callback_t *)callback, context, lookup_r)
+ event, (dns_lookup_callback_t *)callback, context, lookup_r)
/* Returns true if the DNS client has any pending queries */
bool dns_client_has_pending_queries(struct dns_client *client);
struct test_expect_result ctx;
struct dns_lookup *lookup;
struct timeout *to;
+ struct event *event = event_create(NULL);
test_begin("dns lookup (cached)");
create_dns_server(&test_server);
.ioloop = test_server.loop,
.timeout_msecs = 1000,
.cache_ttl_secs = 4,
+ .event_parent = event,
};
ctx.ret = 0;
/* should cause only one lookup */
- test_assert(dns_client_lookup(client, "localhost", test_callback_ips,
- &ctx, &lookup) == 0);
+ test_assert(dns_client_lookup(client, "localhost", event,
+ test_callback_ips, &ctx, &lookup) == 0);
io_loop_run(current_ioloop);
- test_assert(dns_client_lookup(client, "localhost", test_callback_ips,
- &ctx, &lookup) == 0);
+ test_assert(dns_client_lookup(client, "localhost", event,
+ test_callback_ips, &ctx, &lookup) == 0);
io_loop_run(current_ioloop);
test_assert_cmp(test_server.lookup_counter, ==, 1);
timeout_remove(&to);
/* entry should get refreshed */
- test_assert(dns_client_lookup(client, "localhost", test_callback_ips,
- &ctx, &lookup) == 0);
+ test_assert(dns_client_lookup(client, "localhost", event,
+ test_callback_ips, &ctx, &lookup) == 0);
io_loop_run(current_ioloop);
while (dns_client_has_pending_queries(client)) {
io_loop_handler_run(current_ioloop);
io_loop_run(current_ioloop);
timeout_remove(&to);
- test_assert(dns_client_lookup(client, "localhost", test_callback_ips,
- &ctx, &lookup) == 0);
+ test_assert(dns_client_lookup(client, "localhost", event,
+ test_callback_ips, &ctx, &lookup) == 0);
io_loop_run(current_ioloop);
test_assert_cmp(test_server.lookup_counter, ==, 3);
/* Ensure failures do not get cached */
ctx.result = NULL;
ctx.ret = -1;
- test_assert(dns_client_lookup(client, "failhost", test_callback_ips,
- &ctx, &lookup) == 0);
+ test_assert(dns_client_lookup(client, "failhost", event,
+ test_callback_ips, &ctx, &lookup) == 0);
io_loop_run(current_ioloop);
test_assert_cmp(test_server.lookup_counter, ==, 4);
- test_assert(dns_client_lookup(client, "failhost", test_callback_ips,
- &ctx, &lookup) == 0);
+ test_assert(dns_client_lookup(client, "failhost", event,
+ test_callback_ips, &ctx, &lookup) == 0);
io_loop_run(current_ioloop);
test_assert_cmp(test_server.lookup_counter, ==, 5);
dns_client_deinit(&client);
destroy_dns_server(&test_server);
+ event_unref(&event);
test_end();
}
if (cctx->dns_client != NULL) {
e_debug(hshared->event, "Performing asynchronous DNS lookup");
(void)dns_client_lookup(cctx->dns_client, hshared->name,
+ hshared->event,
http_client_host_shared_dns_callback,
hshared, &hshared->dns_lookup);
} else if (cctx->dns_client_socket_path != NULL) {
e_debug(conn->event, "Performing asynchronous DNS lookup");
(void)dns_client_lookup(
conn->set.dns_client, conn->host,
+ conn->event,
smtp_client_connection_dns_callback, conn,
&conn->dns_lookup);
} else if (conn->set.dns_client_socket_path != NULL) {