/* void adns_getaddr(struct irc_inaddr *addr, int aftype, * struct DNSQuery *req, int arpa_type); * Input: An address, an address family, a DNSQuery structure. * arpa_type is used for deciding on using ip6.int or ip6.arpa * 0 is ip6.arpa and 1 is ip6.int, of course this applies to ipv6 * connections only and has no effect on ipv4. * Output: None * Side effects: Sets up a query entry and sends it to the DNS server to * resolve an IP address to a domain name. */ void adns_getaddr(struct irc_inaddr *addr, int aftype, struct DNSQuery *req, int arpa_type) { struct irc_sockaddr ipn; #ifdef IPV6 char *domain; #endif memset(&ipn, 0, sizeof(struct irc_sockaddr)); assert(dns_state->nservers > 0); #ifdef IPV6 if (aftype == AF_INET6) { if(!arpa_type) domain = "ip6.arpa"; else domain = "ip6.int"; ipn.sins.sin6.sin6_family = AF_INET6; ipn.sins.sin6.sin6_port = 0; memcpy(&ipn.sins.sin6.sin6_addr.s6_addr, &addr->sins.sin6.s6_addr, sizeof(struct in6_addr)); adns_submit_reverse_ip6(dns_state,(struct sockaddr *)&ipn.sins.sin6,domain, adns_r_ptr_ip6, adns_qf_owner|adns_qf_cname_loose|adns_qf_quoteok_anshost, req, &req->query); } else { ipn.sins.sin.sin_family = AF_INET; ipn.sins.sin.sin_port = 0; ipn.sins.sin.sin_addr.s_addr = addr->sins.sin.s_addr; adns_submit_reverse(dns_state, (struct sockaddr *)&ipn.sins.sin, adns_r_ptr, adns_qf_owner|adns_qf_cname_loose|adns_qf_quoteok_anshost, req, &req->query); } #else ipn.sins.sin.sin_family = AF_INET; ipn.sins.sin.sin_port = 0; ipn.sins.sin.sin_addr.s_addr = addr->sins.sin.s_addr; adns_submit_reverse(dns_state, (struct sockaddr *)&ipn.sins.sin, adns_r_ptr, adns_qf_owner|adns_qf_cname_loose|adns_qf_quoteok_anshost, req, &req->query); #endif }
/* int adns_getaddr(struct irc_inaddr *addr, int aftype, * struct DNSQuery *req, int arpa_type); * Input: An address, an address family, a DNSQuery structure. * Output: None * Side effects: Sets up a query entry and sends it to the DNS server to * resolve an IP address to a domain name. */ int adns_getaddr(struct sockaddr *addr, int aftype, struct DNSQuery *req) { int result; int flags = adns_r_ptr; assert(dns_state->nservers > 0); #ifdef IPV6 if(addr->sa_family == AF_INET6) flags = adns_r_ptr_ip6; #endif result = adns_submit_reverse(dns_state, (struct sockaddr *) addr, flags, adns_qf_owner | adns_qf_cname_loose | adns_qf_quoteok_anshost, req, &req->query); dns_select(); return result; }