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>
64 struct sockaddr_storage *ns;
72 bool all_servers_rtt_inf;
75 uint8_t *reply_bytes = NULL;
76 size_t reply_size = 0;
87 all_servers_rtt_inf =
true;
110 if ((ns->ss_family == AF_INET) &&
117 if ((ns->ss_family == AF_INET6) &&
125 all_servers_rtt_inf =
false;
127 gettimeofday(&tv_s, NULL);
158 status = send_status;
181 gettimeofday(&tv_e, NULL);
185 ((tv_e.tv_sec - tv_s.tv_sec) * 1000) +
186 (tv_e.tv_usec - tv_s.tv_usec) / 1000);
204 if (all_servers_rtt_inf) {
209 if (tsig_mac && reply && reply_bytes) {
232 ldns_sock_nonblock(
int sockfd)
236 if((flag = fcntl(sockfd, F_GETFL)) != -1) {
238 if(fcntl(sockfd, F_SETFL, flag) == -1) {
242 #elif defined(HAVE_IOCTLSOCKET)
243 unsigned long on = 1;
244 if(ioctlsocket(sockfd, FIONBIO, &on) != 0) {
252 ldns_sock_block(
int sockfd)
256 if((flag = fcntl(sockfd, F_GETFL)) != -1) {
258 if(fcntl(sockfd, F_SETFL, flag) == -1) {
262 #elif defined(HAVE_IOCTLSOCKET)
263 unsigned long off = 0;
264 if(ioctlsocket(sockfd, FIONBIO, &off) != 0) {
272 ldns_sock_wait(
int sockfd,
struct timeval timeout,
int write)
280 ret = select(sockfd+1, NULL, &fds, NULL, &timeout);
282 ret = select(sockfd+1, &fds, NULL, NULL, &timeout);
295 socklen_t tolen,
struct timeval timeout,
size_t *answer_size)
307 if(!ldns_sock_wait(sockfd, timeout, 0)) {
319 ldns_sock_nonblock(sockfd);
328 if (*answer_size == 0) {
339 struct timeval timeout)
366 if ((sockfd = socket((
int)((
struct sockaddr*)to)->sa_family, SOCK_DGRAM,
377 struct timeval timeout)
382 if ((sockfd = socket((
int)((
struct sockaddr*)to)->sa_family, SOCK_STREAM,
383 IPPROTO_TCP)) == -1) {
389 ldns_sock_nonblock(sockfd);
390 if (connect(sockfd, (
struct sockaddr*)to, tolen) == -1) {
393 if(errno != EINPROGRESS) {
401 if(WSAGetLastError() != WSAEINPROGRESS &&
402 WSAGetLastError() != WSAEWOULDBLOCK) {
413 socklen_t len = (socklen_t)
sizeof(error);
415 if(!ldns_sock_wait(sockfd, timeout, 1)) {
425 if(getsockopt(sockfd, SOL_SOCKET, SO_ERROR, (
void*)&error,
430 error = WSAGetLastError();
434 #if defined(EINPROGRESS) && defined(EWOULDBLOCK)
435 if(error == EINPROGRESS || error == EWOULDBLOCK)
438 else if(error != 0) {
445 if(error == WSAEINPROGRESS)
447 else if(error == WSAEWOULDBLOCK)
449 else if(error != 0) {
460 ldns_sock_block(sockfd);
467 const struct sockaddr_storage *to, socklen_t tolen)
473 sendbuf =
LDNS_XMALLOC(uint8_t, ldns_buffer_position(qbin) + 2);
474 if(!sendbuf)
return 0;
475 ldns_write_uint16(sendbuf, ldns_buffer_position(qbin));
476 memcpy(sendbuf + 2, ldns_buffer_begin(qbin), ldns_buffer_position(qbin));
478 bytes = sendto(sockfd, (
void*)sendbuf,
479 ldns_buffer_position(qbin) + 2, 0, (
struct sockaddr *)to, tolen);
483 if (bytes == -1 || (
size_t) bytes != ldns_buffer_position(qbin) + 2 ) {
496 bytes = sendto(sockfd, (
void*)ldns_buffer_begin(qbin),
497 ldns_buffer_position(qbin), 0, (
struct sockaddr *)to, tolen);
499 if (bytes == -1 || (
size_t)bytes != ldns_buffer_position(qbin)) {
502 if ((
size_t) bytes != ldns_buffer_position(qbin)) {
512 uint8_t *wire, *wireout;
522 (
struct sockaddr *)from, fromlen);
525 if (wire_size == -1 || wire_size == 0) {
531 *size = (size_t)wire_size;
543 ssize_t bytes = 0, rc = 0;
552 if(!ldns_sock_wait(sockfd, timeout, 0)) {
557 rc = recv(sockfd, (
void*) (wire + bytes),
558 (
size_t) (2 - bytes), 0);
559 if (rc == -1 || rc == 0) {
567 wire_size = ldns_read_uint16(wire);
577 while (bytes < (ssize_t) wire_size) {
578 if(!ldns_sock_wait(sockfd, timeout, 0)) {
583 rc = recv(sockfd, (
void*) (wire + bytes),
584 (
size_t) (wire_size - bytes), 0);
585 if (rc == -1 || rc == 0) {
593 *size = (size_t) bytes;
602 ssize_t bytes = 0, rc = 0;
611 rc = recv(sockfd, (
void*) (wire + bytes),
612 (
size_t) (2 - bytes), 0);
613 if (rc == -1 || rc == 0) {
621 wire_size = ldns_read_uint16(wire);
631 while (bytes < (ssize_t) wire_size) {
632 rc = recv(sockfd, (
void*) (wire + bytes),
633 (
size_t) (wire_size - bytes), 0);
634 if (rc == -1 || rc == 0) {
642 *size = (size_t) bytes;
651 socklen_t tolen,
struct timeval timeout,
size_t *answer_size)
669 if (*answer_size == 0) {
675 *result =
LDNS_XREALLOC(answer, uint8_t, (
size_t)*answer_size);
685 struct timeval timeout)
708 struct sockaddr_storage *
711 struct sockaddr_storage *data;
712 struct sockaddr_in *data_in;
713 struct sockaddr_in6 *data_in6;
720 memset(data, 0,
sizeof(
struct sockaddr_storage));
728 data->ss_family = AF_INET;
730 data_in = (
struct sockaddr_in*) data;
731 data_in->sin_port = (in_port_t)htons(port);
733 *size =
sizeof(
struct sockaddr_in);
737 data->ss_family = AF_INET6;
739 data_in6 = (
struct sockaddr_in6*) data;
740 data_in6->sin6_port = (in_port_t)htons(port);
742 *size =
sizeof(
struct sockaddr_in6);
755 struct sockaddr_in *data_in;
756 struct sockaddr_in6 *data_in6;
758 switch(sock->ss_family) {
760 data_in = (
struct sockaddr_in*)sock;
762 *port = ntohs((uint16_t)data_in->sin_port);
768 data_in6 = (
struct sockaddr_in6*)sock;
770 *port = ntohs((uint16_t)data_in6->sin6_port);
792 struct sockaddr_storage *ns = NULL;
842 closesocket(resolver->
_socket);
864 closesocket(resolver->
_socket);
881 closesocket(resolver->
_socket);
889 (socklen_t)ns_len) == 0) {
900 closesocket(resolver->
_socket);