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;
483 if(ldns_buffer_limit(qb) < 6 || ldns_buffer_read_u16_at(qb, 4) != 1)
492 all_servers_rtt_inf =
true;
499 src = ldns_rdf2native_sockaddr_storage_port(
520 if ((ns->ss_family == AF_INET) &&
527 if ((ns->ss_family == AF_INET6) &&
535 all_servers_rtt_inf =
false;
537 gettimeofday(&tv_s, NULL);
545 ldns_tcp_send_from(&reply_bytes, qb,
546 ns, (socklen_t)ns_len,
547 src, (socklen_t)src_len,
558 ldns_udp_send_from(&reply_bytes, qb,
559 ns, (socklen_t)ns_len,
560 src, (socklen_t)src_len,
571 status = send_status;
594 gettimeofday(&tv_e, NULL);
598 ((tv_e.tv_sec - tv_s.tv_sec) * 1000) +
599 (tv_e.tv_usec - tv_s.tv_usec) / 1000);
620 if (all_servers_rtt_inf) {
625 if (tsig_mac && reply && reply_bytes) {
648 , ldns_buffer_begin(qb)
668 const struct sockaddr_storage *to, socklen_t tolen)
674 sendbuf =
LDNS_XMALLOC(uint8_t, ldns_buffer_position(qbin) + 2);
675 if(!sendbuf)
return 0;
676 ldns_write_uint16(sendbuf, ldns_buffer_position(qbin));
677 memcpy(sendbuf + 2, ldns_buffer_begin(qbin), ldns_buffer_position(qbin));
679 bytes = sendto(sockfd, (
void*)sendbuf,
680 ldns_buffer_position(qbin) + 2, 0, (
struct sockaddr *)to, tolen);
684 if (bytes == -1 || (
size_t) bytes != ldns_buffer_position(qbin) + 2 ) {
697 bytes = sendto(sockfd, (
void*)ldns_buffer_begin(qbin),
698 ldns_buffer_position(qbin), 0, (
struct sockaddr *)to, tolen);
700 if (bytes == -1 || (
size_t)bytes != ldns_buffer_position(qbin)) {
703 if ((
size_t) bytes != ldns_buffer_position(qbin)) {
713 uint8_t *wire, *wireout;
723 (
struct sockaddr *)from, fromlen);
726 if (wire_size == -1 || wire_size == 0) {
732 *size = (size_t)wire_size;
744 ssize_t bytes = 0, rc = 0;
753 if(!ldns_sock_wait(sockfd, timeout, 0)) {
758 rc = recv(sockfd, (
void*) (wire + bytes),
759 (
size_t) (2 - bytes), 0);
760 if (rc == -1 || rc == 0) {
768 wire_size = ldns_read_uint16(wire);
778 while (bytes < (ssize_t) wire_size) {
779 if(!ldns_sock_wait(sockfd, timeout, 0)) {
784 rc = recv(sockfd, (
void*) (wire + bytes),
785 (
size_t) (wire_size - bytes), 0);
786 if (rc == -1 || rc == 0) {
794 *size = (size_t) bytes;
803 ssize_t bytes = 0, rc = 0;
812 rc = recv(sockfd, (
void*) (wire + bytes),
813 (
size_t) (2 - bytes), 0);
814 if (rc == -1 || rc == 0) {
822 wire_size = ldns_read_uint16(wire);
832 while (bytes < (ssize_t) wire_size) {
833 rc = recv(sockfd, (
void*) (wire + bytes),
834 (
size_t) (wire_size - bytes), 0);
835 if (rc == -1 || rc == 0) {
843 *size = (size_t) bytes;
852 struct sockaddr_in *data_in;
853 struct sockaddr_in6 *data_in6;
855 switch(sock->ss_family) {
857 data_in = (
struct sockaddr_in*)sock;
859 *port = ntohs((uint16_t)data_in->sin_port);
865 data_in6 = (
struct sockaddr_in6*)sock;
867 *port = ntohs((uint16_t)data_in6->sin6_port);
889 struct sockaddr_storage *src = NULL;
891 struct sockaddr_storage *ns = NULL;
906 src = ldns_rdf2native_sockaddr_storage_port(
923 if ((ns->ss_family == AF_INET) &&
931 if ((ns->ss_family == AF_INET6) &&
940 resolver->
_socket = ldns_tcp_connect_from(
941 ns, (socklen_t)ns_len,
942 src, (socklen_t)src_len,
999 (socklen_t)ns_len) == 0) {