Esempio n. 1
0
/* 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
}
Esempio n. 2
0
/* 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;
}