/**
* returns the native sockaddr representation from the rdf.
* \param[in] rd the ldns_rdf to operate on
+ * \param[in] port what port to use. 0 means; use default (53)
* \return struct sockaddr* the address in the format so other
* functions can use it (sendto)
*/
-struct sockaddr_storage * ldns_rdf2native_sockaddr_storage(ldns_rdf *rd);
+struct sockaddr_storage * ldns_rdf2native_sockaddr_storage(ldns_rdf *rd, uint16_t port);
/* misc */
/**
/* loop through all defined nameservers */
for (i = 0; i < ldns_resolver_nameserver_count(r); i++) {
- ns = ldns_rdf2native_sockaddr_storage(ns_rand_array[i]);
+ ns = ldns_rdf2native_sockaddr_storage(ns_rand_array[i],
+ ldns_resolver_port(r));
if ((ns->ss_family == AF_INET &&
ldns_resolver_ip6(r) == LDNS_RESOLV_INET6)
}
struct sockaddr_storage *
-ldns_rdf2native_sockaddr_storage(ldns_rdf *rd)
+ldns_rdf2native_sockaddr_storage(ldns_rdf *rd, uint16_t port)
{
struct sockaddr_storage *data;
struct sockaddr_in *data_in;
return NULL;
}
+ if (port == 0) {
+ port = LDNS_PORT;
+ }
+
switch(ldns_rdf_get_type(rd)) {
case LDNS_RDF_TYPE_A:
data->ss_family = AF_INET;
data_in = (struct sockaddr_in*) data;
- data_in->sin_port = htons(LDNS_PORT);
+ data_in->sin_port = htons(port);
memcpy(&(data_in->sin_addr), ldns_rdf_data(rd), ldns_rdf_size(rd));
return data;
case LDNS_RDF_TYPE_AAAA:
data->ss_family = AF_INET6;
data_in6 = (struct sockaddr_in6*) data;
- data_in6->sin6_port = htons(LDNS_PORT);
+ data_in6->sin6_port = htons(port);
memcpy(&data_in6->sin6_addr, ldns_rdf_data(rd), ldns_rdf_size(rd));
return data;
ldns_buffer *query_wire;
struct sockaddr_storage *ns;
- struct sockaddr_in *ns4;
- struct sockaddr_in6 *ns6;
socklen_t ns_len = 0;
ldns_status status;
return LDNS_STATUS_ADDRESS_ERR;
}
/* For AXFR, we have to make the connection ourselves */
- ns = ldns_rdf2native_sockaddr_storage(resolver->_nameservers[0]);
+ ns = ldns_rdf2native_sockaddr_storage(resolver->_nameservers[0],
+ ldns_resolver_port(resolver));
/* Determine the address size.
*/
switch(ns->ss_family) {
case AF_INET:
- ns4 = (struct sockaddr_in*) ns;
- ns4->sin_port = htons(
- ldns_resolver_port(resolver));
ns_len = (socklen_t)sizeof(struct sockaddr_in);
break;
case AF_INET6:
- ns6 = (struct sockaddr_in6*) ns;
- ns6->sin6_port = htons(
- ldns_resolver_port(resolver));
ns_len = (socklen_t)sizeof(struct sockaddr_in6);
break;
default: