/** Address to hostname lookup wrapper */ struct evdns_request * evdns_getnameinfo(struct evdns_base *base, const struct sockaddr *addr, int flags, evdns_callback_type callback, void *data) { if (addr->sa_family == AF_INET) { const struct sockaddr_in *a = (const struct sockaddr_in *) addr; #if SSL_DEBUG_LEVEL > 1 errputs(stdout, "Remote connection is IPv4."); #endif return evdns_base_resolve_reverse(base, &a->sin_addr, flags, callback, data); } else if (addr->sa_family == AF_INET6) { const struct sockaddr_in6 *a = (const struct sockaddr_in6 *) addr; #if SSL_DEBUG_LEVEL > 1 errputs(stdout, "Remote connection is IPv6."); #endif return evdns_base_resolve_reverse_ipv6(base, &a->sin6_addr, flags, callback, data); } else { errprintf(stdout, "ssl_slave: Attempt to resolve unknown socket family %d\n", addr->sa_family); return NULL; } }
/** Address to hostname lookup wrapper */ static struct evdns_request * evdns_getnameinfo(struct evdns_base *base, const struct sockaddr *addr, int flags, evdns_callback_type callback, void *data) { if (addr->sa_family == AF_INET) { const struct sockaddr_in *a = (const struct sockaddr_in *) addr; return evdns_base_resolve_reverse(base, &a->sin_addr, flags, callback, data); } else if (addr->sa_family == AF_INET6) { const struct sockaddr_in6 *a = (const struct sockaddr_in6 *) addr; if (IN6_IS_ADDR_V4MAPPED(&a->sin6_addr)) { struct in_addr *a4 = (struct in_addr *) (a->sin6_addr.s6_addr + 12); return evdns_base_resolve_reverse(base, a4, flags, callback, data); } else return evdns_base_resolve_reverse_ipv6(base, &a->sin6_addr, flags, callback, data); } else { lock_file(stderr); fprintf(stderr, "info_slave: Attempt to resolve unknown socket family %d\n", addr->sa_family); unlock_file(stderr); return NULL; } }
static void dns_server(void) { evutil_socket_t sock=-1; struct sockaddr_in my_addr; struct evdns_server_port *port=NULL; struct in_addr resolve_addr; struct in6_addr resolve_addr6; struct evdns_base *base=NULL; struct evdns_request *req=NULL; dns_ok = 1; base = evdns_base_new(NULL, 0); /* Add ourself as the only nameserver, and make sure we really are * the only nameserver. */ evdns_base_nameserver_ip_add(base, "127.0.0.1:35353"); tt_int_op(evdns_base_count_nameservers(base), ==, 1); /* Now configure a nameserver port. */ sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock<0) { tt_abort_perror("socket"); } evutil_make_socket_nonblocking(sock); memset(&my_addr, 0, sizeof(my_addr)); my_addr.sin_family = AF_INET; my_addr.sin_port = htons(35353); my_addr.sin_addr.s_addr = htonl(0x7f000001UL); if (bind(sock, (struct sockaddr*)&my_addr, sizeof(my_addr)) < 0) { tt_abort_perror("bind"); } port = evdns_add_server_port(sock, 0, dns_server_request_cb, NULL); /* Send some queries. */ evdns_base_resolve_ipv4(base, "zz.example.com", DNS_QUERY_NO_SEARCH, dns_server_gethostbyname_cb, NULL); evdns_base_resolve_ipv6(base, "zz.example.com", DNS_QUERY_NO_SEARCH, dns_server_gethostbyname_cb, NULL); resolve_addr.s_addr = htonl(0xc0a80b0bUL); /* 192.168.11.11 */ evdns_base_resolve_reverse(base, &resolve_addr, 0, dns_server_gethostbyname_cb, NULL); memcpy(resolve_addr6.s6_addr, "\xff\xf0\x00\x00\x00\x00\xaa\xaa" "\x11\x11\x00\x00\x00\x00\xef\xef", 16); evdns_base_resolve_reverse_ipv6(base, &resolve_addr6, 0, dns_server_gethostbyname_cb, (void*)6); req = evdns_base_resolve_ipv4(base, "drop.example.com", DNS_QUERY_NO_SEARCH, dns_server_gethostbyname_cb, (void*)(char*)90909); evdns_cancel_request(base, req); event_dispatch(); tt_assert(dns_got_cancel); test_ok = dns_ok; end: if (port) evdns_close_server_port(port); if (sock >= 0) EVUTIL_CLOSESOCKET(sock); if (base) evdns_base_free(base, 0); }