ares_send.c
Go to the documentation of this file.
1 
2 /* Copyright 1998 by the Massachusetts Institute of Technology.
3  *
4  * Permission to use, copy, modify, and distribute this
5  * software and its documentation for any purpose and without
6  * fee is hereby granted, provided that the above copyright
7  * notice appear in all copies and that both that copyright
8  * notice and this permission notice appear in supporting
9  * documentation, and that the name of M.I.T. not be used in
10  * advertising or publicity pertaining to distribution of the
11  * software without specific, written prior permission.
12  * M.I.T. makes no representations about the suitability of
13  * this software for any purpose. It is provided "as is"
14  * without express or implied warranty.
15  */
16 
17 #include "ares_setup.h"
18 
19 #ifdef HAVE_NETINET_IN_H
20 # include <netinet/in.h>
21 #endif
22 
23 #include "ares_nameser.h"
24 
25 #include "ares.h"
26 #include "ares_dns.h"
27 #include "ares_private.h"
28 
29 void ares_send(ares_channel channel, const unsigned char *qbuf, int qlen,
30  ares_callback callback, void *arg)
31 {
32  struct query *query;
33  int i, packetsz;
34  struct timeval now;
35 
36  /* Verify that the query is at least long enough to hold the header. */
37  if (qlen < HFIXEDSZ || qlen >= (1 << 16))
38  {
39  callback(arg, ARES_EBADQUERY, 0, NULL, 0);
40  return;
41  }
42 
43  /* Allocate space for query and allocated fields. */
44  query = ares_malloc(sizeof(struct query));
45  if (!query)
46  {
47  callback(arg, ARES_ENOMEM, 0, NULL, 0);
48  return;
49  }
50  query->tcpbuf = ares_malloc(qlen + 2);
51  if (!query->tcpbuf)
52  {
54  callback(arg, ARES_ENOMEM, 0, NULL, 0);
55  return;
56  }
57  if (channel->nservers < 1)
58  {
60  callback(arg, ARES_ESERVFAIL, 0, NULL, 0);
61  return;
62  }
63  query->server_info = ares_malloc(channel->nservers *
64  sizeof(query->server_info[0]));
65  if (!query->server_info)
66  {
69  callback(arg, ARES_ENOMEM, 0, NULL, 0);
70  return;
71  }
72 
73  /* Compute the query ID. Start with no timeout. */
75  query->timeout.tv_sec = 0;
76  query->timeout.tv_usec = 0;
77 
78  /* Form the TCP query buffer by prepending qlen (as two
79  * network-order bytes) to qbuf.
80  */
81  query->tcpbuf[0] = (unsigned char)((qlen >> 8) & 0xff);
82  query->tcpbuf[1] = (unsigned char)(qlen & 0xff);
83  memcpy(query->tcpbuf + 2, qbuf, qlen);
84  query->tcplen = qlen + 2;
85 
86  /* Fill in query arguments. */
87  query->qbuf = query->tcpbuf + 2;
88  query->qlen = qlen;
90  query->arg = arg;
91 
92  /* Initialize query status. */
93  query->try_count = 0;
94 
95  /* Choose the server to send the query to. If rotation is enabled, keep track
96  * of the next server we want to use. */
97  query->server = channel->last_server;
98  if (channel->rotate == 1)
99  channel->last_server = (channel->last_server + 1) % channel->nservers;
100 
101  for (i = 0; i < channel->nservers; i++)
102  {
105  }
106 
107  packetsz = (channel->flags & ARES_FLAG_EDNS) ? channel->ednspsz : PACKETSZ;
108  query->using_tcp = (channel->flags & ARES_FLAG_USEVC) || qlen > packetsz;
109 
111  query->timeouts = 0;
112 
113  /* Initialize our list nodes. */
118 
119  /* Chain the query into the list of all queries. */
120  ares__insert_in_list(&(query->all_queries), &(channel->all_queries));
121  /* Keep track of queries bucketed by qid, so we can process DNS
122  * responses quickly.
123  */
125  &(query->queries_by_qid),
126  &(channel->queries_by_qid[query->qid % ARES_QID_TABLE_SIZE]));
127 
128  /* Perform the first query action. */
129  now = ares__tvnow();
131 }
query::queries_by_qid
struct list_node queries_by_qid
Definition: ares_private.h:209
query_server_info::skip_server
int skip_server
Definition: ares_private.h:235
ARES_ENOMEM
#define ARES_ENOMEM
Definition: ares.h:117
now
static double now(void)
Definition: test/core/fling/client.cc:130
ares__send_query
void ares__send_query(ares_channel channel, struct query *query, struct timeval *now)
Definition: ares_process.c:799
ares.h
ares_send
void ares_send(ares_channel channel, const unsigned char *qbuf, int qlen, ares_callback callback, void *arg)
Definition: ares_send.c:29
query::queries_to_server
struct list_node queries_to_server
Definition: ares_private.h:211
ARES_FLAG_USEVC
#define ARES_FLAG_USEVC
Definition: ares.h:142
ares_callback
void(* ares_callback)(void *arg, int status, int timeouts, unsigned char *abuf, int alen)
Definition: ares.h:290
query::queries_by_timeout
struct list_node queries_by_timeout
Definition: ares_private.h:210
ares_dns.h
query::error_status
int error_status
Definition: ares_private.h:229
query::tcplen
int tcplen
Definition: ares_private.h:216
query_server_info::tcp_connection_generation
int tcp_connection_generation
Definition: ares_private.h:236
DNS_HEADER_QID
#define DNS_HEADER_QID(h)
Definition: ares_dns.h:63
for
for(map_begin_internal(intern, &it);!map_done(&it);map_next(&it))
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/map.c:207
query::tcpbuf
unsigned char * tcpbuf
Definition: ares_private.h:215
query
Definition: ares_private.h:198
memcpy
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
channel
wrapped_grpc_channel * channel
Definition: src/php/ext/grpc/call.h:33
ares_malloc
void *(* ares_malloc)(size_t size)=default_malloc
Definition: ares_library_init.c:58
query::qlen
int qlen
Definition: ares_private.h:220
ares__insert_in_list
void ares__insert_in_list(struct list_node *new_node, struct list_node *old_node)
Definition: ares_llist.c:46
ARES_ESERVFAIL
#define ARES_ESERVFAIL
Definition: ares.h:103
qbuf
static uv_buf_t qbuf
Definition: test-shutdown-eof.c:32
query::qbuf
const unsigned char * qbuf
Definition: ares_private.h:219
query::arg
void * arg
Definition: ares_private.h:222
arg
Definition: cmdline.cc:40
query::timeouts
int timeouts
Definition: ares_private.h:230
ARES_QID_TABLE_SIZE
#define ARES_QID_TABLE_SIZE
Definition: ares_private.h:316
callback
static void callback(void *arg, int status, int timeouts, struct hostent *host)
Definition: acountry.c:224
ARES_ECONNREFUSED
#define ARES_ECONNREFUSED
Definition: ares.h:113
ares_setup.h
ARES_FLAG_EDNS
#define ARES_FLAG_EDNS
Definition: ares.h:150
query::all_queries
struct list_node all_queries
Definition: ares_private.h:212
PACKETSZ
#define PACKETSZ
Definition: ares_nameser.h:187
ares_channeldata
Definition: ares_private.h:266
timeval::tv_sec
long tv_sec
Definition: setup_once.h:121
timeval::tv_usec
long tv_usec
Definition: setup_once.h:122
ares__tvnow
struct timeval ares__tvnow(void)
Definition: ares__timeval.c:85
timeval
Definition: setup_once.h:113
ares_free
void(* ares_free)(void *ptr)=default_free
Definition: ares_library_init.c:60
arg
struct arg arg
ares_private.h
ARES_EBADQUERY
#define ARES_EBADQUERY
Definition: ares.h:109
query::try_count
int try_count
Definition: ares_private.h:225
ares_nameser.h
query::server
int server
Definition: ares_private.h:226
query::timeout
struct timeval timeout
Definition: ares_private.h:201
query::callback
ares_callback callback
Definition: ares_private.h:221
query::using_tcp
int using_tcp
Definition: ares_private.h:228
ares__init_list_node
void ares__init_list_node(struct list_node *node, void *d)
Definition: ares_llist.c:34
query::qid
unsigned short qid
Definition: ares_private.h:200
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
query::server_info
struct query_server_info * server_info
Definition: ares_private.h:227


grpc
Author(s):
autogenerated on Fri May 16 2025 02:57:43