18 #ifdef HAVE_NETINET_IN_H
19 #include <netinet/in.h>
21 #ifdef HAVE_SYS_SOCKET_H
22 #include <sys/socket.h>
27 #ifdef HAVE_ARPA_INET_H
28 #include <arpa/inet.h>
63 static struct sockaddr_storage *
64 ldns_rdf2native_sockaddr_storage_port(
65 const ldns_rdf *rd, uint16_t port,
size_t *size)
67 struct sockaddr_storage *data;
68 struct sockaddr_in *data_in;
69 struct sockaddr_in6 *data_in6;
76 memset(data, 0,
sizeof(
struct sockaddr_storage));
81 data->ss_family = AF_INET;
83 data_in = (
struct sockaddr_in*) data;
84 data_in->sin_port = (in_port_t)htons(port);
86 *size =
sizeof(
struct sockaddr_in);
90 data->ss_family = AF_INET6;
92 data_in6 = (
struct sockaddr_in6*) data;
93 data_in6->sin6_port = (in_port_t)htons(port);
95 *size =
sizeof(
struct sockaddr_in6);
103 struct sockaddr_storage *
105 const ldns_rdf *rd, uint16_t port,
size_t *size)
107 return ldns_rdf2native_sockaddr_storage_port(
108 rd, (port == 0 ? (uint16_t)
LDNS_PORT : port), size);
113 ldns_sock_nonblock(
int sockfd)
117 if((flag = fcntl(sockfd, F_GETFL)) != -1) {
119 if(fcntl(sockfd, F_SETFL, flag) == -1) {
123 #elif defined(HAVE_IOCTLSOCKET)
124 unsigned long on = 1;
125 if(ioctlsocket(sockfd, FIONBIO, &on) != 0) {
133 ldns_sock_block(
int sockfd)
137 if((flag = fcntl(sockfd, F_GETFL)) != -1) {
139 if(fcntl(sockfd, F_SETFL, flag) == -1) {
143 #elif defined(HAVE_IOCTLSOCKET)
144 unsigned long off = 0;
145 if(ioctlsocket(sockfd, FIONBIO, &off) != 0) {
153 ldns_sock_wait(
int sockfd,
struct timeval timeout,
int write)
162 ret = select(sockfd+1, NULL, &fds, NULL, &timeout);
164 ret = select(sockfd+1, &fds, NULL, NULL, &timeout);
167 struct pollfd pfds[2];
169 memset(&pfds[0], 0,
sizeof(pfds[0]) * 2);
172 pfds[0].events = POLLIN|POLLERR;
175 pfds[0].events |= POLLOUT;
178 ret = poll(pfds, 1, (
int)(timeout.tv_sec * 1000
179 + timeout.tv_usec / 1000));
192 ldns_tcp_connect_from(
const struct sockaddr_storage *to, socklen_t tolen,
193 const struct sockaddr_storage *from, socklen_t fromlen,
194 struct timeval timeout)
199 if ((sockfd = socket((
int)((
struct sockaddr*)to)->sa_family, SOCK_STREAM,
204 if (from && bind(sockfd, (
const struct sockaddr*)from, fromlen) ==
SOCK_INVALID){
209 ldns_sock_nonblock(sockfd);
210 if (connect(sockfd, (
struct sockaddr*)to, tolen) ==
SOCK_INVALID) {
213 if(errno != EINPROGRESS) {
221 if(WSAGetLastError() != WSAEINPROGRESS &&
222 WSAGetLastError() != WSAEWOULDBLOCK) {
233 socklen_t len = (socklen_t)
sizeof(error);
235 if(!ldns_sock_wait(sockfd, timeout, 1)) {
241 if(getsockopt(sockfd, SOL_SOCKET, SO_ERROR, (
void*)&error,
246 error = WSAGetLastError();
250 #if defined(EINPROGRESS) && defined(EWOULDBLOCK)
251 if(error == EINPROGRESS || error == EWOULDBLOCK)
254 else if(error != 0) {
261 if(error == WSAEINPROGRESS)
263 else if(error == WSAEWOULDBLOCK)
265 else if(error != 0) {
276 ldns_sock_block(sockfd);
283 struct timeval timeout)
285 return ldns_tcp_connect_from(to, tolen, NULL, 0, timeout);
290 const struct sockaddr_storage *to, socklen_t tolen,
291 const struct sockaddr_storage *from, socklen_t fromlen,
292 struct timeval timeout)
296 sockfd = ldns_tcp_connect_from(to, tolen, from, fromlen, timeout);
312 const struct sockaddr_storage *to, socklen_t tolen,
313 struct timeval timeout)
315 return ldns_tcp_bgsend_from(qbin, to, tolen, NULL, 0, timeout);
323 ldns_tcp_send_from(uint8_t **result,
ldns_buffer *qbin,
324 const struct sockaddr_storage *to, socklen_t tolen,
325 const struct sockaddr_storage *from, socklen_t fromlen,
326 struct timeval timeout,
size_t *answer_size)
331 sockfd = ldns_tcp_bgsend_from(qbin, to, tolen, from, fromlen, timeout);
340 if (*answer_size == 0) {
346 *result =
LDNS_XREALLOC(answer, uint8_t, (
size_t)*answer_size);
356 const struct sockaddr_storage *to, socklen_t tolen,
357 struct timeval timeout,
size_t *answer_size)
359 return ldns_tcp_send_from(result, qbin,
360 to, tolen, NULL, 0, timeout, answer_size);
369 if ((sockfd = socket((
int)((
struct sockaddr*)to)->sa_family, SOCK_DGRAM,
380 const struct sockaddr_storage *to , socklen_t tolen,
381 const struct sockaddr_storage *from, socklen_t fromlen,
382 struct timeval timeout)
392 if (from && bind(sockfd, (
const struct sockaddr*)from, fromlen) == -1){
405 const struct sockaddr_storage *to , socklen_t tolen,
406 struct timeval timeout)
408 return ldns_udp_bgsend_from(qbin, to, tolen, NULL, 0, timeout);
413 ldns_sockaddr_cmp(
const struct sockaddr_storage* addr1, socklen_t len1,
414 const struct sockaddr_storage* addr2, socklen_t len2)
416 struct sockaddr_in* p1_in = (
struct sockaddr_in*)addr1;
417 struct sockaddr_in* p2_in = (
struct sockaddr_in*)addr2;
418 struct sockaddr_in6* p1_in6 = (
struct sockaddr_in6*)addr1;
419 struct sockaddr_in6* p2_in6 = (
struct sockaddr_in6*)addr2;
424 assert(len1 == len2);
425 if( p1_in->sin_family < p2_in->sin_family)
427 if( p1_in->sin_family > p2_in->sin_family)
429 assert( p1_in->sin_family == p2_in->sin_family );
431 if( p1_in->sin_family == AF_INET ) {
433 if(p1_in->sin_port < p2_in->sin_port)
435 if(p1_in->sin_port > p2_in->sin_port)
437 assert(p1_in->sin_port == p2_in->sin_port);
438 return memcmp(&p1_in->sin_addr, &p2_in->sin_addr,
439 sizeof(p1_in->sin_addr));
440 }
else if (p1_in6->sin6_family == AF_INET6) {
442 if(p1_in6->sin6_port < p2_in6->sin6_port)
444 if(p1_in6->sin6_port > p2_in6->sin6_port)
446 assert(p1_in6->sin6_port == p2_in6->sin6_port);
447 return memcmp(&p1_in6->sin6_addr, &p2_in6->sin6_addr,
448 sizeof(p1_in6->sin6_addr));
451 return memcmp(addr1, addr2, len1);
456 ldns_udp_send_from(uint8_t **result,
ldns_buffer *qbin,
457 const struct sockaddr_storage *to , socklen_t tolen,
458 const struct sockaddr_storage *from, socklen_t fromlen,
459 struct timeval timeout,
size_t *answer_size)
463 struct sockaddr_storage reply_addr;
464 socklen_t reply_addr_len;
466 sockfd = ldns_udp_bgsend_from(qbin, to, tolen, from, fromlen, timeout);
473 if(!ldns_sock_wait(sockfd, timeout, 0)) {
481 ldns_sock_nonblock(sockfd);
483 reply_addr_len =
sizeof(reply_addr);
484 memset(&reply_addr, 0, reply_addr_len);
489 if (*answer_size == 0) {
495 if(ldns_sockaddr_cmp(to, tolen, &reply_addr, reply_addr_len) != 0) {
506 const struct sockaddr_storage *to , socklen_t tolen,
507 struct timeval timeout,
size_t *answer_size)
509 return ldns_udp_send_from(result, qbin, to, tolen, NULL, 0,
510 timeout, answer_size);
518 struct sockaddr_storage *src = NULL;
520 struct sockaddr_storage *ns;
528 bool all_servers_rtt_inf;
531 uint8_t *reply_bytes = NULL;
532 size_t reply_size = 0;
543 all_servers_rtt_inf =
true;
550 src = ldns_rdf2native_sockaddr_storage_port(
571 if ((ns->ss_family == AF_INET) &&
578 if ((ns->ss_family == AF_INET6) &&
586 all_servers_rtt_inf =
false;
588 gettimeofday(&tv_s, NULL);
596 ldns_tcp_send_from(&reply_bytes, qb,
597 ns, (socklen_t)ns_len,
598 src, (socklen_t)src_len,
609 ldns_udp_send_from(&reply_bytes, qb,
610 ns, (socklen_t)ns_len,
611 src, (socklen_t)src_len,
622 status = send_status;
624 if(reply_bytes && ldns_buffer_limit(qb) >= 2) {
625 uint16_t txid = ldns_buffer_read_u16_at(qb, 0);
627 ldns_read_uint16(reply_bytes) != txid) {
655 gettimeofday(&tv_e, NULL);
659 ((tv_e.tv_sec - tv_s.tv_sec) * 1000) +
660 (tv_e.tv_usec - tv_s.tv_usec) / 1000);
681 if (all_servers_rtt_inf) {
686 if (tsig_mac && reply && reply_bytes) {
709 , ldns_buffer_begin(qb)
729 const struct sockaddr_storage *to, socklen_t tolen)
735 sendbuf =
LDNS_XMALLOC(uint8_t, ldns_buffer_position(qbin) + 2);
736 if(!sendbuf)
return 0;
737 ldns_write_uint16(sendbuf, ldns_buffer_position(qbin));
738 memcpy(sendbuf + 2, ldns_buffer_begin(qbin), ldns_buffer_position(qbin));
740 bytes = sendto(sockfd, (
void*)sendbuf,
741 ldns_buffer_position(qbin) + 2, 0, (
struct sockaddr *)to, tolen);
745 if (bytes == -1 || (
size_t) bytes != ldns_buffer_position(qbin) + 2 ) {
758 bytes = sendto(sockfd, (
void*)ldns_buffer_begin(qbin),
759 ldns_buffer_position(qbin), 0, (
struct sockaddr *)to, tolen);
761 if (bytes == -1 || (
size_t)bytes != ldns_buffer_position(qbin)) {
764 if ((
size_t) bytes != ldns_buffer_position(qbin)) {
774 uint8_t *wire, *wireout;
784 (
struct sockaddr *)from, fromlen);
787 if (wire_size == -1 || wire_size == 0) {
793 *size = (size_t)wire_size;
805 ssize_t bytes = 0, rc = 0;
814 if(!ldns_sock_wait(sockfd, timeout, 0)) {
819 rc = recv(sockfd, (
void*) (wire + bytes),
820 (
size_t) (2 - bytes), 0);
821 if (rc == -1 || rc == 0) {
829 wire_size = ldns_read_uint16(wire);
839 while (bytes < (ssize_t) wire_size) {
840 if(!ldns_sock_wait(sockfd, timeout, 0)) {
845 rc = recv(sockfd, (
void*) (wire + bytes),
846 (
size_t) (wire_size - bytes), 0);
847 if (rc == -1 || rc == 0) {
855 *size = (size_t) bytes;
864 ssize_t bytes = 0, rc = 0;
873 rc = recv(sockfd, (
void*) (wire + bytes),
874 (
size_t) (2 - bytes), 0);
875 if (rc == -1 || rc == 0) {
883 wire_size = ldns_read_uint16(wire);
893 while (bytes < (ssize_t) wire_size) {
894 rc = recv(sockfd, (
void*) (wire + bytes),
895 (
size_t) (wire_size - bytes), 0);
896 if (rc == -1 || rc == 0) {
904 *size = (size_t) bytes;
913 struct sockaddr_in *data_in;
914 struct sockaddr_in6 *data_in6;
916 switch(sock->ss_family) {
918 data_in = (
struct sockaddr_in*)sock;
920 *port = ntohs((uint16_t)data_in->sin_port);
926 data_in6 = (
struct sockaddr_in6*)sock;
928 *port = ntohs((uint16_t)data_in6->sin6_port);
950 struct sockaddr_storage *src = NULL;
952 struct sockaddr_storage *ns = NULL;
967 src = ldns_rdf2native_sockaddr_storage_port(
984 if ((ns->ss_family == AF_INET) &&
992 if ((ns->ss_family == AF_INET6) &&
1001 resolver->
_socket = ldns_tcp_connect_from(
1002 ns, (socklen_t)ns_len,
1003 src, (socklen_t)src_len,
1060 (socklen_t)ns_len) == 0) {