From: Miek Gieben Date: Tue, 23 Aug 2005 08:28:26 +0000 (+0000) Subject: convert sockaddr_storage to rdf and port number X-Git-Tag: release-1.0.0~266 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d0c8451b34391e8692424508c614bb8aadd1f701;p=thirdparty%2Fldns.git convert sockaddr_storage to rdf and port number --- diff --git a/ldns/rdata.h b/ldns/rdata.h index 242efef6..0f92ebee 100644 --- a/ldns/rdata.h +++ b/ldns/rdata.h @@ -299,7 +299,14 @@ uint32_t ldns_str2period(const char *nptr, const char **endptr); */ struct sockaddr_storage * ldns_rdf2native_sockaddr_storage(ldns_rdf *rd, uint16_t port, size_t *size); -/* misc */ +/** + * returns an rdf with the sockaddr info. works for ip4 and ip6 + * \param[in] sock the struct sockaddr_storage to convert + * \param[in] port what port was used. When NULL this is not set + * \return ldns_rdf* wth the address + */ +ldns_rdf * ldns_sockaddr_storage2rdf(struct sockaddr_storage *sock, uint16_t *port); + /** * removes \\DDD, \\[space] and other escapes from the input. * See RFC 1035, section 5.1. diff --git a/rdata.c b/rdata.c index 1611b3af..7b70a206 100644 --- a/rdata.c +++ b/rdata.c @@ -120,9 +120,12 @@ ldns_rdf2native_sockaddr_storage(ldns_rdf *rd, uint16_t port, size_t *size) struct sockaddr_storage *data; struct sockaddr_in *data_in; struct sockaddr_in6 *data_in6; + +/* + * DEAD CODE??? struct in_addr *b; - b = (struct in_addr*)rd->_data; +*/ data = LDNS_MALLOC(struct sockaddr_storage); if (!data) { @@ -153,49 +156,41 @@ ldns_rdf2native_sockaddr_storage(ldns_rdf *rd, uint16_t port, size_t *size) } } -/* the other way around - for lua-ldns, TODO Miek */ +/* the other way around - for lua-ldns */ ldns_rdf * -ldns_sockaddr_storage2rdf(struct sockaddr_storage *rd, uint16_t *port) +ldns_sockaddr_storage2rdf(struct sockaddr_storage *sock, uint16_t *port) { - rd = rd; - port = port; - return NULL; -/* - struct sockaddr_storage *data; - struct sockaddr_in *data_in; + + ldns_rdf *addr; + struct sockaddr_in *data_in; struct sockaddr_in6 *data_in6; - struct in_addr *b; - - b = (struct in_addr*)rd->_data; - - data = LDNS_MALLOC(struct sockaddr_storage); - if (!data) { - 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(port); - memcpy(&(data_in->sin_addr), ldns_rdf_data(rd), ldns_rdf_size(rd)); - *size = sizeof(struct sockaddr_in); - return data; - case LDNS_RDF_TYPE_AAAA: - data->ss_family = AF_INET6; - data_in6 = (struct sockaddr_in6*) data; - data_in6->sin6_port = htons(port); - memcpy(&data_in6->sin6_addr, ldns_rdf_data(rd), ldns_rdf_size(rd)); - *size = sizeof(struct sockaddr_in6); - return data; + switch(sock->ss_family) { + case AF_INET: + data_in = (struct sockaddr_in*)sock; + if (port) { + *port = ntohs(data_in->sin_port); + } + addr = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_A, + sizeof(struct sockaddr_in), + &data_in->sin_addr); + break; + case AF_INET6: + data_in6 = (struct sockaddr_in6*)sock; + if (port) { + *port = ntohs(data_in6->sin6_port); + } + addr = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_AAAA, + sizeof(struct sockaddr_in6), + &data_in6->sin6_addr); + break; default: - LDNS_FREE(data); + if (port) { + *port = 0; + } return NULL; } -*/ + return addr; } ldns_rdf *