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);
412 ldns_udp_send_from(uint8_t **result,
ldns_buffer *qbin,
413 const struct sockaddr_storage *to , socklen_t tolen,
414 const struct sockaddr_storage *from, socklen_t fromlen,
415 struct timeval timeout,
size_t *answer_size)
420 sockfd = ldns_udp_bgsend_from(qbin, to, tolen, from, fromlen, timeout);
427 if(!ldns_sock_wait(sockfd, timeout, 0)) {
435 ldns_sock_nonblock(sockfd);
440 if (*answer_size == 0) {
451 const struct sockaddr_storage *to , socklen_t tolen,
452 struct timeval timeout,
size_t *answer_size)
454 return ldns_udp_send_from(result, qbin, to, tolen, NULL, 0,
455 timeout, answer_size);
463 struct sockaddr_storage *src = NULL;
465 struct sockaddr_storage *ns;
473 bool all_servers_rtt_inf;
476 uint8_t *reply_bytes = NULL;
477 size_t reply_size = 0;
488 all_servers_rtt_inf =
true;
495 src = ldns_rdf2native_sockaddr_storage_port(
516 if ((ns->ss_family == AF_INET) &&
523 if ((ns->ss_family == AF_INET6) &&
531 all_servers_rtt_inf =
false;
533 gettimeofday(&tv_s, NULL);
541 ldns_tcp_send_from(&reply_bytes, qb,
542 ns, (socklen_t)ns_len,
543 src, (socklen_t)src_len,
554 ldns_udp_send_from(&reply_bytes, qb,
555 ns, (socklen_t)ns_len,
556 src, (socklen_t)src_len,
567 status = send_status;
590 gettimeofday(&tv_e, NULL);
594 ((tv_e.tv_sec - tv_s.tv_sec) * 1000) +
595 (tv_e.tv_usec - tv_s.tv_usec) / 1000);
616 if (all_servers_rtt_inf) {
621 if (tsig_mac && reply && reply_bytes) {
644 const struct sockaddr_storage *to, socklen_t tolen)
650 sendbuf =
LDNS_XMALLOC(uint8_t, ldns_buffer_position(qbin) + 2);
651 if(!sendbuf)
return 0;
652 ldns_write_uint16(sendbuf, ldns_buffer_position(qbin));
653 memcpy(sendbuf + 2, ldns_buffer_begin(qbin), ldns_buffer_position(qbin));
655 bytes = sendto(sockfd, (
void*)sendbuf,
656 ldns_buffer_position(qbin) + 2, 0, (
struct sockaddr *)to, tolen);
660 if (bytes == -1 || (
size_t) bytes != ldns_buffer_position(qbin) + 2 ) {
673 bytes = sendto(sockfd, (
void*)ldns_buffer_begin(qbin),
674 ldns_buffer_position(qbin), 0, (
struct sockaddr *)to, tolen);
676 if (bytes == -1 || (
size_t)bytes != ldns_buffer_position(qbin)) {
679 if ((
size_t) bytes != ldns_buffer_position(qbin)) {
689 uint8_t *wire, *wireout;
699 (
struct sockaddr *)from, fromlen);
702 if (wire_size == -1 || wire_size == 0) {
708 *size = (size_t)wire_size;
720 ssize_t bytes = 0, rc = 0;
729 if(!ldns_sock_wait(sockfd, timeout, 0)) {
734 rc = recv(sockfd, (
void*) (wire + bytes),
735 (
size_t) (2 - bytes), 0);
736 if (rc == -1 || rc == 0) {
744 wire_size = ldns_read_uint16(wire);
754 while (bytes < (ssize_t) wire_size) {
755 if(!ldns_sock_wait(sockfd, timeout, 0)) {
760 rc = recv(sockfd, (
void*) (wire + bytes),
761 (
size_t) (wire_size - bytes), 0);
762 if (rc == -1 || rc == 0) {
770 *size = (size_t) bytes;
779 ssize_t bytes = 0, rc = 0;
788 rc = recv(sockfd, (
void*) (wire + bytes),
789 (
size_t) (2 - bytes), 0);
790 if (rc == -1 || rc == 0) {
798 wire_size = ldns_read_uint16(wire);
808 while (bytes < (ssize_t) wire_size) {
809 rc = recv(sockfd, (
void*) (wire + bytes),
810 (
size_t) (wire_size - bytes), 0);
811 if (rc == -1 || rc == 0) {
819 *size = (size_t) bytes;
828 struct sockaddr_in *data_in;
829 struct sockaddr_in6 *data_in6;
831 switch(sock->ss_family) {
833 data_in = (
struct sockaddr_in*)sock;
835 *port = ntohs((uint16_t)data_in->sin_port);
841 data_in6 = (
struct sockaddr_in6*)sock;
843 *port = ntohs((uint16_t)data_in6->sin6_port);
865 struct sockaddr_storage *src = NULL;
867 struct sockaddr_storage *ns = NULL;
882 src = ldns_rdf2native_sockaddr_storage_port(
899 if ((ns->ss_family == AF_INET) &&
907 if ((ns->ss_family == AF_INET6) &&
916 resolver->
_socket = ldns_tcp_connect_from(
917 ns, (socklen_t)ns_len,
918 src, (socklen_t)src_len,
975 (socklen_t)ns_len) == 0) {