Go to the documentation of this file.
23 #ifdef HAVE_NETINET_IN_H
24 # include <netinet/in.h>
26 #ifdef HAVE_NETINET_TCP_H
27 # include <netinet/tcp.h>
32 #ifdef HAVE_ARPA_INET_H
33 # include <arpa/inet.h>
41 #ifdef HAVE_SYS_IOCTL_H
42 # include <sys/ioctl.h>
45 # include <sys/filio.h>
71 int alen,
int whichserver,
int tcp,
82 const unsigned char *abuf,
int alen);
84 static int has_opt_rr(
const unsigned char *abuf,
int alen);
86 unsigned char *abuf,
int alen);
92 long secs = (
now->tv_sec -
check->tv_sec);
100 return (
now->tv_usec -
check->tv_usec >= 0);
106 now->tv_sec += millisecs/1000;
107 now->tv_usec += (millisecs%1000)*1000;
109 if(
now->tv_usec >= 1000000) {
111 now->tv_usec -= 1000000;
160 #if !defined EWOULDBLOCK && !defined EAGAIN
161 #error "Neither EWOULDBLOCK nor EAGAIN defined"
169 #if defined EAGAIN && EAGAIN != EWOULDBLOCK
192 return channel->sock_funcs->asendv(s, &vec, 1,
channel->sock_func_cb_data);
227 if(!FD_ISSET(
server->tcp_socket, write_fds))
231 if(
server->tcp_socket != write_fd)
241 FD_CLR(
server->tcp_socket, write_fds);
245 for (sendreq =
server->qhead; sendreq; sendreq = sendreq->
next)
254 for (sendreq =
server->qhead; sendreq; sendreq = sendreq->
next)
297 while (num_bytes > 0) {
299 if ((
size_t)num_bytes >= sendreq->
len) {
300 num_bytes -= sendreq->
len;
305 if (
server->qhead == NULL) {
314 sendreq->
data += num_bytes;
315 sendreq->
len -= num_bytes;
326 struct sockaddr *
from,
327 ares_socklen_t *from_len)
330 return channel->sock_funcs->arecvfrom(s,
data, data_len,
337 return sread(s,
data, data_len);
347 return channel->sock_funcs->arecvfrom(s,
data, data_len, 0, 0, 0,
350 return sread(s,
data, data_len);
376 if(!FD_ISSET(
server->tcp_socket, read_fds))
380 if(
server->tcp_socket != read_fd)
390 FD_CLR(
server->tcp_socket, read_fds);
392 if (
server->tcp_lenbuf_pos != 2)
399 2 -
server->tcp_lenbuf_pos);
408 if (
server->tcp_lenbuf_pos == 2)
416 if (!
server->tcp_buffer) {
421 server->tcp_buffer_pos = 0;
446 server->tcp_buffer = NULL;
447 server->tcp_lenbuf_pos = 0;
448 server->tcp_buffer_pos = 0;
463 ares_socklen_t fromlen;
466 struct sockaddr_in sa4;
484 if(!FD_ISSET(
server->udp_socket, read_fds))
488 if(
server->udp_socket != read_fd)
498 FD_CLR(
server->udp_socket, read_fds);
507 if (
server->addr.family == AF_INET)
508 fromlen =
sizeof(
from.sa4);
510 fromlen =
sizeof(
from.sa6);
512 sizeof(
buf), 0, &
from.sa, &fromlen);
545 for (t =
channel->last_timeout_processed; t <= now->tv_sec; t++)
560 channel->last_timeout_processed =
now->tv_sec;
565 int alen,
int whichserver,
int tcp,
568 int tc, rcode, packetsz;
596 if ((q->qid ==
id) &&
same_questions(q->qbuf, q->qlen, abuf, alen))
645 if (alen > packetsz && !
tcp)
781 server->tcp_connection_generation)))
838 sendreq->
next = NULL;
840 server->qtail->next = sendreq;
848 server->tcp_connection_generation;
888 if(shift <= (
int)(
sizeof(
int) * CHAR_BIT - 1)
889 && (timeplus >> (
sizeof(
int) * CHAR_BIT - 1 - shift)) == 0)
911 &(
server->queries_to_server));
922 #if defined(USE_BLOCKING_SOCKETS)
926 #elif defined(HAVE_FCNTL_O_NONBLOCK)
930 flags = fcntl(sockfd, F_GETFL, 0);
931 if (
FALSE != nonblock)
932 return fcntl(sockfd, F_SETFL,
flags | O_NONBLOCK);
934 return fcntl(sockfd, F_SETFL,
flags & (~O_NONBLOCK));
936 #elif defined(HAVE_IOCTL_FIONBIO)
939 int flags = nonblock ? 1 : 0;
940 return ioctl(sockfd, FIONBIO, &
flags);
942 #elif defined(HAVE_IOCTLSOCKET_FIONBIO)
945 char flags = nonblock ? 1 : 0;
948 unsigned long flags = nonblock ? 1UL : 0UL;
950 return ioctlsocket(sockfd, FIONBIO, &
flags);
952 #elif defined(HAVE_IOCTLSOCKET_CAMEL_FIONBIO)
955 long flags = nonblock ? 1
L : 0
L;
956 return IoctlSocket(sockfd, FIONBIO,
flags);
958 #elif defined(HAVE_SETSOCKOPT_SO_NONBLOCK)
961 long b = nonblock ? 1
L : 0
L;
962 return setsockopt(sockfd, SOL_SOCKET, SO_NONBLOCK, &
b,
sizeof(
b));
965 # error "no non-blocking method was found/used/set"
973 struct sockaddr_in sa4;
983 #if defined(FD_CLOEXEC) && !defined(MSDOS)
985 if (fcntl(s, F_SETFD, FD_CLOEXEC) == -1)
990 if ((
channel->socket_send_buffer_size > 0) &&
991 setsockopt(s, SOL_SOCKET, SO_SNDBUF,
992 (
void *)&
channel->socket_send_buffer_size,
993 sizeof(
channel->socket_send_buffer_size)) == -1)
996 if ((
channel->socket_receive_buffer_size > 0) &&
997 setsockopt(s, SOL_SOCKET, SO_RCVBUF,
998 (
void *)&
channel->socket_receive_buffer_size,
999 sizeof(
channel->socket_receive_buffer_size)) == -1)
1002 #ifdef SO_BINDTODEVICE
1003 if (
channel->local_dev_name[0]) {
1004 if (setsockopt(s, SOL_SOCKET, SO_BINDTODEVICE,
1012 if (family == AF_INET) {
1015 local.sa4.sin_family = AF_INET;
1017 if (bind(s, &
local.sa,
sizeof(
local.sa4)) < 0)
1023 sizeof(
channel->local_ip6)) != 0) {
1028 if (bind(s, &
local.sa,
sizeof(
local.sa6)) < 0)
1040 ares_socklen_t salen;
1042 struct sockaddr_in sa4;
1045 struct sockaddr *sa;
1047 switch (
server->addr.family)
1050 sa = (
void *)&saddr.sa4;
1051 salen =
sizeof(saddr.sa4);
1053 saddr.sa4.sin_family = AF_INET;
1054 if (
server->addr.tcp_port) {
1060 sizeof(
server->addr.addrV4));
1063 sa = (
void *)&saddr.sa6;
1064 salen =
sizeof(saddr.sa6);
1067 if (
server->addr.tcp_port) {
1073 sizeof(
server->addr.addrV6));
1101 setsockopt(s, IPPROTO_TCP, TCP_NODELAY,
1102 (
void *)&opt,
sizeof(opt)) == -1)
1111 int err =
channel->sock_config_cb(s, SOCK_STREAM,
1112 channel->sock_config_cb_data);
1125 if (
err != EINPROGRESS &&
err != EWOULDBLOCK)
1134 int err =
channel->sock_create_cb(s, SOCK_STREAM,
1135 channel->sock_create_cb_data);
1144 server->tcp_buffer_pos = 0;
1146 server->tcp_connection_generation = ++
channel->tcp_connection_generation;
1153 ares_socklen_t salen;
1155 struct sockaddr_in sa4;
1158 struct sockaddr *sa;
1160 switch (
server->addr.family)
1163 sa = (
void *)&saddr.sa4;
1164 salen =
sizeof(saddr.sa4);
1166 saddr.sa4.sin_family = AF_INET;
1167 if (
server->addr.udp_port) {
1173 sizeof(
server->addr.addrV4));
1176 sa = (
void *)&saddr.sa6;
1177 salen =
sizeof(saddr.sa6);
1180 if (
server->addr.udp_port) {
1186 sizeof(
server->addr.addrV6));
1206 int err =
channel->sock_config_cb(s, SOCK_DGRAM,
1207 channel->sock_config_cb_data);
1220 if (
err != EINPROGRESS &&
err != EWOULDBLOCK)
1229 int err =
channel->sock_create_cb(s, SOCK_DGRAM,
1230 channel->sock_create_cb_data);
1245 const unsigned char *abuf,
int alen)
1248 const unsigned char *
p;
1263 if (q.qdcount !=
a.qdcount)
1268 for (
i = 0;
i < q.qdcount;
i++)
1286 for (j = 0; j <
a.qdcount; j++)
1307 if (
strcasecmp(q.name,
a.name) == 0 && q.type ==
a.type
1308 && q.dnsclass ==
a.dnsclass)
1328 if (sa->sa_family == aa->
family)
1333 addr1 = &aa->addrV4;
1335 if (memcmp(addr1, addr2,
sizeof(aa->addrV4)) == 0)
1339 addr1 = &aa->addrV6;
1341 if (memcmp(addr1, addr2,
sizeof(aa->addrV6)) == 0)
1354 unsigned int qdcount, ancount, nscount, arcount,
i;
1355 const unsigned char *aptr;
1370 for (
i = 0;
i < qdcount;
i++)
1384 for (
i = 0;
i < ancount + nscount;
i++)
1398 if (aptr + dlen > abuf + alen)
1404 for (
i = 0;
i < arcount;
i++)
1422 if (aptr + dlen > abuf + alen)
1431 unsigned char *abuf,
int alen)
1442 for (sendreq =
server->qhead; sendreq; sendreq = sendreq->
next)
1479 sendreq->
data = NULL;
1520 return channel->sock_funcs->asocket(af,
1530 const struct sockaddr *
addr,
1531 ares_socklen_t addrlen)
1534 return channel->sock_funcs->aconnect(sockfd,
1539 return connect(sockfd,
addr, addrlen);
struct list_node queries_by_qid
static void handle_error(ares_channel channel, int whichserver, struct timeval *now)
static void timeadd(struct timeval *now, int millisecs)
#define DNS_HEADER_SET_ARCOUNT(h, v)
static int same_address(struct sockaddr *sa, struct ares_addr *aa)
void ares__close_sockets(ares_channel channel, struct server_state *server)
int ares__connect_socket(ares_channel channel, ares_socket_t sockfd, const struct sockaddr *addr, ares_socklen_t addrlen)
return memset(p, 0, total)
static void process_timeouts(ares_channel channel, struct timeval *now)
static int open_tcp_socket(ares_channel channel, struct server_state *server)
#define DNS_HEADER_ARCOUNT(h)
static void skip_server(ares_channel channel, struct query *query, int whichserver)
static void write_tcp_data(ares_channel channel, fd_set *write_fds, ares_socket_t write_fd, struct timeval *now)
struct list_node queries_to_server
CARES_EXTERN void ares_free_string(void *str)
static int same_questions(const unsigned char *qbuf, int qlen, const unsigned char *abuf, int alen)
struct list_node queries_by_timeout
static void swap_lists(struct list_node *head_a, struct list_node *head_b)
#define ARES_FLAG_NOCHECKRESP
int tcp_connection_generation
#define DNS_HEADER_QID(h)
#define ARES_TIMEOUT_TABLE_SIZE
static void read_udp_packets(ares_channel channel, fd_set *read_fds, ares_socket_t read_fd, struct timeval *now)
int ares__is_list_empty(struct list_node *head)
static void advance_tcp_send_queue(ares_channel channel, int whichserver, ares_ssize_t num_bytes)
struct send_request * next
const unsigned char * data
static int try_again(int errnum)
CARES_EXTERN int ares_expand_name(const unsigned char *encoded, const unsigned char *abuf, int alen, char **s, long *enclen)
std::unique_ptr< Server > server
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
#define DNS_QUESTION_CLASS(q)
wrapped_grpc_channel * channel
void *(* ares_malloc)(size_t size)=default_malloc
static void process_answer(ares_channel channel, unsigned char *abuf, int alen, int whichserver, int tcp, struct timeval *now)
#define CARES_INADDR_CAST(type, var)
static ares_ssize_t socket_recv(ares_channel channel, ares_socket_t s, void *data, size_t data_len)
void ares__insert_in_list(struct list_node *new_node, struct list_node *old_node)
static ares_ssize_t socket_recvfrom(ares_channel channel, ares_socket_t s, void *data, size_t data_len, int flags, struct sockaddr *from, ares_socklen_t *from_len)
#define DNS_QUESTION_TYPE(q)
const unsigned char * qbuf
void ares__remove_from_list(struct list_node *node)
static void processfds(ares_channel channel, fd_set *read_fds, ares_socket_t read_fd, fd_set *write_fds, ares_socket_t write_fd)
void ares__send_query(ares_channel channel, struct query *query, struct timeval *now)
const struct ares_in6_addr ares_in6addr_any
#define DNS_HEADER_NSCOUNT(h)
#define writev(s, ptr, cnt)
unsigned char * data_storage
#define ARES_QID_TABLE_SIZE
#define SOCK_STATE_CALLBACK(c, s, r, w)
#define ARES_FLAG_STAYOPEN
static void process_broken_connections(ares_channel channel, struct timeval *now)
void ares_process(ares_channel channel, fd_set *read_fds, fd_set *write_fds)
#define DNS_HEADER_QDCOUNT(h)
#define DNS_HEADER_RCODE(h)
static void read_tcp_data(ares_channel channel, fd_set *read_fds, ares_socket_t read_fd, struct timeval *now)
void *(* ares_realloc)(void *ptr, size_t size)=default_realloc
void ares__init_list_head(struct list_node *head)
struct list_node all_queries
static ares_ssize_t socket_writev(ares_channel channel, ares_socket_t s, const struct iovec *vec, int len)
int ares__timedout(struct timeval *now, struct timeval *check)
struct timeval ares__tvnow(void)
ares_socket_t ares__open_socket(ares_channel channel, int af, int type, int protocol)
static ares_ssize_t socket_write(ares_channel channel, ares_socket_t s, const void *data, size_t len)
unsigned short aresx_sitous(int sinum)
static void end_query(ares_channel channel, struct query *query, int status, unsigned char *abuf, int alen)
void(* ares_free)(void *ptr)=default_free
void ares__close_socket(ares_channel channel, ares_socket_t s)
#define DNS_HEADER_ANCOUNT(h)
static void check(upb_inttable *t)
static void next_server(ares_channel channel, struct query *query, struct timeval *now)
void ares__free_query(struct query *query)
static int setsocknonblock(ares_socket_t sockfd, int nonblock)
static int configure_socket(ares_socket_t s, int family, ares_channel channel)
static int open_udp_socket(ares_channel channel, struct server_state *server)
CARES_TYPEOF_ARES_SSIZE_T ares_ssize_t
struct query * owner_query
if(p->owned &&p->wrapped !=NULL)
static int has_opt_rr(const unsigned char *abuf, int alen)
#define strcasecmp(p1, p2)
struct query_server_info * server_info
void ares_process_fd(ares_channel channel, ares_socket_t read_fd, ares_socket_t write_fd)
grpc
Author(s):
autogenerated on Thu Mar 13 2025 02:58:33