dns-lookup.c revision 1b75b342eca820e52ca27e6bc33e0062d63eece3
5a580c3a38ced62d4bcc95b8ac7c4f2935b5d294Timo Sirainen/* Copyright (c) 2010-2013 Dovecot authors, see the included COPYING file */
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen#include "lib.h"
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen#include "ioloop.h"
bdd36cfdba3ff66d25570a9ff568d69e1eb543cfTimo Sirainen#include "net.h"
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen#include "istream.h"
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen#include "write-full.h"
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen#include "time-util.h"
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen#include "dns-lookup.h"
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen#include <stdio.h>
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen#include <unistd.h>
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen#define MAX_INBUF_SIZE 512
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainenstruct dns_lookup {
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen int fd;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen char *path;
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen bool ptr_lookup;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen struct istream *input;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen struct io *io;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen struct timeout *to;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen struct timeval start_time;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen unsigned int warn_msecs;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen struct dns_lookup_result result;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen struct ip_addr *ips;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen unsigned int ip_idx;
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen char *name;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen dns_lookup_callback_t *callback;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen void *context;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen};
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainenstatic void dns_lookup_free(struct dns_lookup **_lookup);
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen
1b75b342eca820e52ca27e6bc33e0062d63eece3Timo Sirainenstatic void dns_lookup_close(struct dns_lookup *lookup)
1b75b342eca820e52ca27e6bc33e0062d63eece3Timo Sirainen{
1b75b342eca820e52ca27e6bc33e0062d63eece3Timo Sirainen if (lookup->to != NULL)
1b75b342eca820e52ca27e6bc33e0062d63eece3Timo Sirainen timeout_remove(&lookup->to);
1b75b342eca820e52ca27e6bc33e0062d63eece3Timo Sirainen if (lookup->io != NULL)
1b75b342eca820e52ca27e6bc33e0062d63eece3Timo Sirainen io_remove(&lookup->io);
1b75b342eca820e52ca27e6bc33e0062d63eece3Timo Sirainen if (lookup->input != NULL)
1b75b342eca820e52ca27e6bc33e0062d63eece3Timo Sirainen i_stream_destroy(&lookup->input);
1b75b342eca820e52ca27e6bc33e0062d63eece3Timo Sirainen if (lookup->fd != -1) {
1b75b342eca820e52ca27e6bc33e0062d63eece3Timo Sirainen if (close(lookup->fd) < 0)
1b75b342eca820e52ca27e6bc33e0062d63eece3Timo Sirainen i_error("close(%s) failed: %m", lookup->path);
1b75b342eca820e52ca27e6bc33e0062d63eece3Timo Sirainen lookup->fd = -1;
1b75b342eca820e52ca27e6bc33e0062d63eece3Timo Sirainen }
1b75b342eca820e52ca27e6bc33e0062d63eece3Timo Sirainen}
1b75b342eca820e52ca27e6bc33e0062d63eece3Timo Sirainen
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainenstatic int dns_lookup_input_line(struct dns_lookup *lookup, const char *line)
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen{
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen struct dns_lookup_result *result = &lookup->result;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen if (result->ips_count == 0) {
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen if (lookup->ptr_lookup) {
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen /* <ret> [<name>] */
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen if (strncmp(line, "0 ", 2) == 0) {
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen result->name = lookup->name =
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen i_strdup(line + 2);
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen result->ret = 0;
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen } else {
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen if (str_to_int(line, &result->ret) < 0) {
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen return -1;
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen }
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen result->error = net_gethosterror(result->ret);
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen }
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen return 1;
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen }
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen /* first line: <ret> <ip count> */
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen if (sscanf(line, "%d %u", &result->ret,
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen &result->ips_count) == 0)
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen return -1;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen if (result->ret != 0) {
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen result->error = net_gethosterror(result->ret);
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen return 1;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen }
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen if (result->ips_count == 0)
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen return -1;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen result->ips = lookup->ips =
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen i_new(struct ip_addr, result->ips_count);
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen } else {
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen if (net_addr2ip(line, &lookup->ips[lookup->ip_idx]) < 0)
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen return -1;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen if (++lookup->ip_idx == result->ips_count) {
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen result->ret = 0;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen return 1;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen }
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen }
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen return 0;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen}
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainenstatic void dns_lookup_save_msecs(struct dns_lookup *lookup)
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen{
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen struct timeval now;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen int diff;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen if (gettimeofday(&now, NULL) < 0)
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen i_fatal("gettimeofday() failed: %m");
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen diff = timeval_diff_msecs(&now, &lookup->start_time);
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen if (diff > 0)
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen lookup->result.msecs = diff;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen}
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainenstatic void dns_lookup_input(struct dns_lookup *lookup)
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen{
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen const char *line;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen struct dns_lookup_result *result = &lookup->result;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen int ret = 0;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen while ((line = i_stream_read_next_line(lookup->input)) != NULL) {
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen ret = dns_lookup_input_line(lookup, line);
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen if (ret > 0)
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen break;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen if (ret < 0) {
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen result->error = t_strdup_printf(
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen "Invalid input from %s", lookup->path);
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen break;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen }
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen }
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen if (result->error != NULL) {
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen /* already got the error */
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen } else if (lookup->input->stream_errno != 0) {
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen result->error = t_strdup_printf("read(%s) failed: %m",
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen lookup->path);
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen ret = -1;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen } else if (lookup->input->eof) {
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen result->error = t_strdup_printf("Unexpected EOF from %s",
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen lookup->path);
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen ret = -1;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen }
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen if (ret != 0) {
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen dns_lookup_save_msecs(lookup);
1b75b342eca820e52ca27e6bc33e0062d63eece3Timo Sirainen dns_lookup_close(lookup);
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen lookup->callback(result, lookup->context);
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen dns_lookup_free(&lookup);
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen }
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen}
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainenstatic void dns_lookup_timeout(struct dns_lookup *lookup)
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen{
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen lookup->result.error = "DNS lookup timed out";
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen
1b75b342eca820e52ca27e6bc33e0062d63eece3Timo Sirainen dns_lookup_close(lookup);
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen lookup->callback(&lookup->result, lookup->context);
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen dns_lookup_free(&lookup);
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen}
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainenstatic int
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainendns_lookup_common(const char *cmd, bool ptr_lookup,
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen const struct dns_lookup_settings *set,
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen dns_lookup_callback_t *callback, void *context,
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen struct dns_lookup **lookup_r)
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen{
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen struct dns_lookup *lookup;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen struct dns_lookup_result result;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen int fd;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen memset(&result, 0, sizeof(result));
ebbb3d4af58b5166867f756db5bfd7cdad53ce2eTimo Sirainen result.ret = EAI_FAIL;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen fd = net_connect_unix(set->dns_client_socket_path);
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen if (fd == -1) {
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen result.error = t_strdup_printf("connect(%s) failed: %m",
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen set->dns_client_socket_path);
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen callback(&result, context);
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen return -1;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen }
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen if (write_full(fd, cmd, strlen(cmd)) < 0) {
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen result.error = t_strdup_printf("write(%s) failed: %m",
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen set->dns_client_socket_path);
4307c886579381dbb1897ea1388ae6978c96f560Timo Sirainen i_close_fd(&fd);
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen callback(&result, context);
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen return -1;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen }
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen lookup = i_new(struct dns_lookup, 1);
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen lookup->ptr_lookup = ptr_lookup;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen lookup->fd = fd;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen lookup->path = i_strdup(set->dns_client_socket_path);
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen lookup->input = i_stream_create_fd(fd, MAX_INBUF_SIZE, FALSE);
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen lookup->io = io_add(fd, IO_READ, dns_lookup_input, lookup);
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen if (set->timeout_msecs != 0) {
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen lookup->to = timeout_add(set->timeout_msecs,
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen dns_lookup_timeout, lookup);
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen }
ebbb3d4af58b5166867f756db5bfd7cdad53ce2eTimo Sirainen lookup->result.ret = EAI_FAIL;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen lookup->callback = callback;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen lookup->context = context;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen if (gettimeofday(&lookup->start_time, NULL) < 0)
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen i_fatal("gettimeofday() failed: %m");
7d102c66eb1755e1894cf56e3594cd744e855238Timo Sirainen
7d102c66eb1755e1894cf56e3594cd744e855238Timo Sirainen *lookup_r = lookup;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen return 0;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen}
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen#undef dns_lookup
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainenint dns_lookup(const char *host, const struct dns_lookup_settings *set,
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen dns_lookup_callback_t *callback, void *context,
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen struct dns_lookup **lookup_r)
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen{
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen return dns_lookup_common(t_strconcat("IP\t", host, "\n", NULL), FALSE,
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen set, callback, context, lookup_r);
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen}
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen#undef dns_lookup_ptr
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainenint dns_lookup_ptr(const struct ip_addr *ip,
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen const struct dns_lookup_settings *set,
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen dns_lookup_callback_t *callback, void *context,
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen struct dns_lookup **lookup_r)
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen{
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen const char *cmd = t_strconcat("NAME\t", net_ip2addr(ip), "\n", NULL);
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen return dns_lookup_common(cmd, TRUE, set, callback, context, lookup_r);
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen}
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainenstatic void dns_lookup_free(struct dns_lookup **_lookup)
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen{
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen struct dns_lookup *lookup = *_lookup;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen *_lookup = NULL;
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen
1b75b342eca820e52ca27e6bc33e0062d63eece3Timo Sirainen dns_lookup_close(lookup);
d29c3ac4da9857ffcce57eec726d042c292e2becTimo Sirainen i_free(lookup->name);
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen i_free(lookup->ips);
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen i_free(lookup->path);
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen i_free(lookup);
17fc2a887a5683b2e1bbd6bd9fdf0cdb97b509fbTimo Sirainen}
7d102c66eb1755e1894cf56e3594cd744e855238Timo Sirainen
7d102c66eb1755e1894cf56e3594cd744e855238Timo Sirainenvoid dns_lookup_abort(struct dns_lookup **lookup)
7d102c66eb1755e1894cf56e3594cd744e855238Timo Sirainen{
7d102c66eb1755e1894cf56e3594cd744e855238Timo Sirainen dns_lookup_free(lookup);
7d102c66eb1755e1894cf56e3594cd744e855238Timo Sirainen}
96e3a90451b495d8bedbe5dd731539269cb8c08dStephan Bosch
96e3a90451b495d8bedbe5dd731539269cb8c08dStephan Boschvoid dns_lookup_switch_ioloop(struct dns_lookup *lookup)
96e3a90451b495d8bedbe5dd731539269cb8c08dStephan Bosch{
96e3a90451b495d8bedbe5dd731539269cb8c08dStephan Bosch if (lookup->to != NULL)
96e3a90451b495d8bedbe5dd731539269cb8c08dStephan Bosch lookup->to = io_loop_move_timeout(&lookup->to);
96e3a90451b495d8bedbe5dd731539269cb8c08dStephan Bosch lookup->io = io_loop_move_io(&lookup->io);
96e3a90451b495d8bedbe5dd731539269cb8c08dStephan Bosch}