• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

c-ares / c-ares / 14332603483

08 Apr 2025 11:41AM UTC coverage: 92.278% (+0.004%) from 92.274%
14332603483

push

github

bradh352
variable set but never read

1 of 1 new or added line in 1 file covered. (100.0%)

4 existing lines in 2 files now uncovered.

21008 of 22766 relevant lines covered (92.28%)

99185.98 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

63.1
/src/lib/record/ares_dns_mapping.c
1
/* MIT License
2
 *
3
 * Copyright (c) 2023 Brad House
4
 *
5
 * Permission is hereby granted, free of charge, to any person obtaining a copy
6
 * of this software and associated documentation files (the "Software"), to deal
7
 * in the Software without restriction, including without limitation the rights
8
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
 * copies of the Software, and to permit persons to whom the Software is
10
 * furnished to do so, subject to the following conditions:
11
 *
12
 * The above copyright notice and this permission notice (including the next
13
 * paragraph) shall be included in all copies or substantial portions of the
14
 * Software.
15
 *
16
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
 * SOFTWARE.
23
 *
24
 * SPDX-License-Identifier: MIT
25
 */
26
#include "ares_private.h"
27

28
ares_bool_t ares_dns_opcode_isvalid(ares_dns_opcode_t opcode)
17,611✔
29
{
30
  switch (opcode) {
17,611✔
31
    case ARES_OPCODE_QUERY:
17,611✔
32
    case ARES_OPCODE_IQUERY:
33
    case ARES_OPCODE_STATUS:
34
    case ARES_OPCODE_NOTIFY:
35
    case ARES_OPCODE_UPDATE:
36
      return ARES_TRUE;
17,611✔
37
  }
38
  return ARES_FALSE;
×
39
}
40

41
ares_bool_t ares_dns_rcode_isvalid(ares_dns_rcode_t rcode)
28,865✔
42
{
43
  switch (rcode) {
28,865✔
44
    case ARES_RCODE_NOERROR:
28,865✔
45
    case ARES_RCODE_FORMERR:
46
    case ARES_RCODE_SERVFAIL:
47
    case ARES_RCODE_NXDOMAIN:
48
    case ARES_RCODE_NOTIMP:
49
    case ARES_RCODE_REFUSED:
50
    case ARES_RCODE_YXDOMAIN:
51
    case ARES_RCODE_YXRRSET:
52
    case ARES_RCODE_NXRRSET:
53
    case ARES_RCODE_NOTAUTH:
54
    case ARES_RCODE_NOTZONE:
55
    case ARES_RCODE_DSOTYPEI:
56
    case ARES_RCODE_BADSIG:
57
    case ARES_RCODE_BADKEY:
58
    case ARES_RCODE_BADTIME:
59
    case ARES_RCODE_BADMODE:
60
    case ARES_RCODE_BADNAME:
61
    case ARES_RCODE_BADALG:
62
    case ARES_RCODE_BADTRUNC:
63
    case ARES_RCODE_BADCOOKIE:
64
      return ARES_TRUE;
28,865✔
65
  }
66
  return ARES_FALSE;
×
67
}
68

69
ares_bool_t ares_dns_flags_arevalid(unsigned short flags)
17,611✔
70
{
71
  unsigned short allflags = ARES_FLAG_QR | ARES_FLAG_AA | ARES_FLAG_TC |
17,611✔
72
                            ARES_FLAG_RD | ARES_FLAG_RA | ARES_FLAG_AD |
73
                            ARES_FLAG_CD;
74

75
  if (flags & ~allflags) {
17,611✔
76
    return ARES_FALSE;
×
77
  }
78

79
  return ARES_TRUE;
17,611✔
80
}
81

82
ares_bool_t ares_dns_rec_type_isvalid(ares_dns_rec_type_t type,
96,468✔
83
                                      ares_bool_t         is_query)
84
{
85
  switch (type) {
96,468✔
86
    case ARES_REC_TYPE_A:
96,445✔
87
    case ARES_REC_TYPE_NS:
88
    case ARES_REC_TYPE_CNAME:
89
    case ARES_REC_TYPE_SOA:
90
    case ARES_REC_TYPE_PTR:
91
    case ARES_REC_TYPE_HINFO:
92
    case ARES_REC_TYPE_MX:
93
    case ARES_REC_TYPE_TXT:
94
    case ARES_REC_TYPE_SIG:
95
    case ARES_REC_TYPE_AAAA:
96
    case ARES_REC_TYPE_SRV:
97
    case ARES_REC_TYPE_NAPTR:
98
    case ARES_REC_TYPE_OPT:
99
    case ARES_REC_TYPE_TLSA:
100
    case ARES_REC_TYPE_SVCB:
101
    case ARES_REC_TYPE_HTTPS:
102
    case ARES_REC_TYPE_ANY:
103
    case ARES_REC_TYPE_URI:
104
    case ARES_REC_TYPE_CAA:
105
      return ARES_TRUE;
96,445✔
106
    case ARES_REC_TYPE_RAW_RR:
23✔
107
      return is_query ? ARES_FALSE : ARES_TRUE;
23✔
UNCOV
108
    default:
×
UNCOV
109
      break;
×
110
  }
UNCOV
111
  return is_query ? ARES_TRUE : ARES_FALSE;
×
112
}
113

114
ares_bool_t ares_dns_rec_type_allow_name_compression(ares_dns_rec_type_t type)
13,409✔
115
{
116
  /* Only record types defined in RFC1035 allow name compression within the
117
   * RDATA.  Otherwise nameservers that don't understand an RR may not be
118
   * able to pass along the RR in a proper manner */
119
  switch (type) {
13,409✔
120
    case ARES_REC_TYPE_A:
2,350✔
121
    case ARES_REC_TYPE_NS:
122
    case ARES_REC_TYPE_CNAME:
123
    case ARES_REC_TYPE_SOA:
124
    case ARES_REC_TYPE_PTR:
125
    case ARES_REC_TYPE_HINFO:
126
    case ARES_REC_TYPE_MX:
127
    case ARES_REC_TYPE_TXT:
128
      return ARES_TRUE;
2,350✔
129
    default:
11,059✔
130
      break;
11,059✔
131
  }
132
  return ARES_FALSE;
11,059✔
133
}
134

135
ares_bool_t ares_dns_class_isvalid(ares_dns_class_t    qclass,
26,863✔
136
                                   ares_dns_rec_type_t type,
137
                                   ares_bool_t         is_query)
138
{
139
  /* If we don't understand the record type, we shouldn't validate the class
140
   * as there are some instances like on RFC 2391 (SIG RR) the class is
141
   * meaningless, but since we didn't support that record type, we didn't
142
   * know it shouldn't be validated */
143
  if (type == ARES_REC_TYPE_RAW_RR) {
26,863✔
144
    return ARES_TRUE;
6✔
145
  }
146

147
  switch (qclass) {
26,857✔
148
    case ARES_CLASS_IN:
26,855✔
149
    case ARES_CLASS_CHAOS:
150
    case ARES_CLASS_HESOID:
151
    case ARES_CLASS_NONE:
152
      return ARES_TRUE;
26,855✔
153
    case ARES_CLASS_ANY:
2✔
154
      if (type == ARES_REC_TYPE_SIG) {
2✔
155
        return ARES_TRUE;
2✔
156
      }
157
      if (is_query) {
×
158
        return ARES_TRUE;
×
159
      }
160
      return ARES_FALSE;
×
161
  }
162
  return ARES_FALSE;
×
163
}
164

165
ares_bool_t ares_dns_section_isvalid(ares_dns_section_t sect)
125,953✔
166
{
167
  switch (sect) {
125,953✔
168
    case ARES_SECTION_ANSWER:
125,953✔
169
    case ARES_SECTION_AUTHORITY:
170
    case ARES_SECTION_ADDITIONAL:
171
      return ARES_TRUE;
125,953✔
172
  }
173
  return ARES_FALSE;
×
174
}
175

176
ares_dns_rec_type_t ares_dns_rr_key_to_rec_type(ares_dns_rr_key_t key)
62,593✔
177
{
178
  /* NOTE: due to the way we've numerated the keys, we can simply divide by
179
   *       100 to get the type rather than having to do a huge switch
180
   *       statement.  That said, we do then validate the type returned is
181
   *       valid in case something completely bogus is passed in */
182
  ares_dns_rec_type_t type = key / 100;
62,593✔
183
  if (!ares_dns_rec_type_isvalid(type, ARES_FALSE)) {
62,593✔
184
    return 0;
×
185
  }
186
  return type;
62,594✔
187
}
188

189
const char *ares_dns_rec_type_tostr(ares_dns_rec_type_t type)
5,301✔
190
{
191
  switch (type) {
5,301✔
192
    case ARES_REC_TYPE_A:
4,985✔
193
      return "A";
4,985✔
194
    case ARES_REC_TYPE_NS:
3✔
195
      return "NS";
3✔
196
    case ARES_REC_TYPE_CNAME:
2✔
197
      return "CNAME";
2✔
198
    case ARES_REC_TYPE_SOA:
12✔
199
      return "SOA";
12✔
200
    case ARES_REC_TYPE_PTR:
66✔
201
      return "PTR";
66✔
202
    case ARES_REC_TYPE_HINFO:
2✔
203
      return "HINFO";
2✔
204
    case ARES_REC_TYPE_MX:
6✔
205
      return "MX";
6✔
206
    case ARES_REC_TYPE_TXT:
2✔
207
      return "TXT";
2✔
208
    case ARES_REC_TYPE_SIG:
2✔
209
      return "SIG";
2✔
210
    case ARES_REC_TYPE_AAAA:
198✔
211
      return "AAAA";
198✔
212
    case ARES_REC_TYPE_SRV:
6✔
213
      return "SRV";
6✔
214
    case ARES_REC_TYPE_NAPTR:
2✔
215
      return "NAPTR";
2✔
216
    case ARES_REC_TYPE_OPT:
2✔
217
      return "OPT";
2✔
218
    case ARES_REC_TYPE_TLSA:
2✔
219
      return "TLSA";
2✔
220
    case ARES_REC_TYPE_SVCB:
2✔
221
      return "SVCB";
2✔
222
    case ARES_REC_TYPE_HTTPS:
2✔
223
      return "HTTPS";
2✔
224
    case ARES_REC_TYPE_ANY:
2✔
225
      return "ANY";
2✔
226
    case ARES_REC_TYPE_URI:
2✔
227
      return "URI";
2✔
228
    case ARES_REC_TYPE_CAA:
2✔
229
      return "CAA";
2✔
230
    case ARES_REC_TYPE_RAW_RR:
1✔
231
      return "RAWRR";
1✔
232
  }
233
  return "UNKNOWN";
×
234
}
235

236
const char *ares_dns_class_tostr(ares_dns_class_t qclass)
5,282✔
237
{
238
  switch (qclass) {
5,282✔
239
    case ARES_CLASS_IN:
5,281✔
240
      return "IN";
5,281✔
241
    case ARES_CLASS_CHAOS:
×
242
      return "CH";
×
243
    case ARES_CLASS_HESOID:
×
244
      return "HS";
×
245
    case ARES_CLASS_ANY:
1✔
246
      return "ANY";
1✔
247
    case ARES_CLASS_NONE:
×
248
      return "NONE";
×
249
  }
250
  return "UNKNOWN";
×
251
}
252

253
const char *ares_dns_opcode_tostr(ares_dns_opcode_t opcode)
5,262✔
254
{
255
  switch (opcode) {
5,262✔
256
    case ARES_OPCODE_QUERY:
5,262✔
257
      return "QUERY";
5,262✔
258
    case ARES_OPCODE_IQUERY:
×
259
      return "IQUERY";
×
260
    case ARES_OPCODE_STATUS:
×
261
      return "STATUS";
×
262
    case ARES_OPCODE_NOTIFY:
×
263
      return "NOTIFY";
×
264
    case ARES_OPCODE_UPDATE:
×
265
      return "UPDATE";
×
266
  }
267
  return "UNKNOWN";
×
268
}
269

270
const char *ares_dns_rr_key_tostr(ares_dns_rr_key_t key)
115✔
271
{
272
  switch (key) {
115✔
273
    case ARES_RR_A_ADDR:
2✔
274
      return "ADDR";
2✔
275

276
    case ARES_RR_NS_NSDNAME:
3✔
277
      return "NSDNAME";
3✔
278

279
    case ARES_RR_CNAME_CNAME:
2✔
280
      return "CNAME";
2✔
281

282
    case ARES_RR_SOA_MNAME:
2✔
283
      return "MNAME";
2✔
284

285
    case ARES_RR_SOA_RNAME:
2✔
286
      return "RNAME";
2✔
287

288
    case ARES_RR_SOA_SERIAL:
2✔
289
      return "SERIAL";
2✔
290

291
    case ARES_RR_SOA_REFRESH:
2✔
292
      return "REFRESH";
2✔
293

294
    case ARES_RR_SOA_RETRY:
2✔
295
      return "RETRY";
2✔
296

297
    case ARES_RR_SOA_EXPIRE:
2✔
298
      return "EXPIRE";
2✔
299

300
    case ARES_RR_SOA_MINIMUM:
2✔
301
      return "MINIMUM";
2✔
302

303
    case ARES_RR_PTR_DNAME:
2✔
304
      return "DNAME";
2✔
305

306
    case ARES_RR_AAAA_ADDR:
2✔
307
      return "ADDR";
2✔
308

309
    case ARES_RR_HINFO_CPU:
2✔
310
      return "CPU";
2✔
311

312
    case ARES_RR_HINFO_OS:
2✔
313
      return "OS";
2✔
314

315
    case ARES_RR_MX_PREFERENCE:
2✔
316
      return "PREFERENCE";
2✔
317

318
    case ARES_RR_MX_EXCHANGE:
2✔
319
      return "EXCHANGE";
2✔
320

321
    case ARES_RR_TXT_DATA:
2✔
322
      return "DATA";
2✔
323

324
    case ARES_RR_SIG_TYPE_COVERED:
2✔
325
      return "TYPE_COVERED";
2✔
326

327
    case ARES_RR_SIG_ALGORITHM:
2✔
328
      return "ALGORITHM";
2✔
329

330
    case ARES_RR_SIG_LABELS:
2✔
331
      return "LABELS";
2✔
332

333
    case ARES_RR_SIG_ORIGINAL_TTL:
2✔
334
      return "ORIGINAL_TTL";
2✔
335

336
    case ARES_RR_SIG_EXPIRATION:
2✔
337
      return "EXPIRATION";
2✔
338

339
    case ARES_RR_SIG_INCEPTION:
2✔
340
      return "INCEPTION";
2✔
341

342
    case ARES_RR_SIG_KEY_TAG:
2✔
343
      return "KEY_TAG";
2✔
344

345
    case ARES_RR_SIG_SIGNERS_NAME:
2✔
346
      return "SIGNERS_NAME";
2✔
347

348
    case ARES_RR_SIG_SIGNATURE:
2✔
349
      return "SIGNATURE";
2✔
350

351
    case ARES_RR_SRV_PRIORITY:
2✔
352
      return "PRIORITY";
2✔
353

354
    case ARES_RR_SRV_WEIGHT:
2✔
355
      return "WEIGHT";
2✔
356

357
    case ARES_RR_SRV_PORT:
2✔
358
      return "PORT";
2✔
359

360
    case ARES_RR_SRV_TARGET:
2✔
361
      return "TARGET";
2✔
362

363
    case ARES_RR_NAPTR_ORDER:
2✔
364
      return "ORDER";
2✔
365

366
    case ARES_RR_NAPTR_PREFERENCE:
2✔
367
      return "PREFERENCE";
2✔
368

369
    case ARES_RR_NAPTR_FLAGS:
2✔
370
      return "FLAGS";
2✔
371

372
    case ARES_RR_NAPTR_SERVICES:
2✔
373
      return "SERVICES";
2✔
374

375
    case ARES_RR_NAPTR_REGEXP:
2✔
376
      return "REGEXP";
2✔
377

378
    case ARES_RR_NAPTR_REPLACEMENT:
2✔
379
      return "REPLACEMENT";
2✔
380

381
    case ARES_RR_OPT_UDP_SIZE:
2✔
382
      return "UDP_SIZE";
2✔
383

384
    case ARES_RR_OPT_VERSION:
2✔
385
      return "VERSION";
2✔
386

387
    case ARES_RR_OPT_FLAGS:
2✔
388
      return "FLAGS";
2✔
389

390
    case ARES_RR_OPT_OPTIONS:
2✔
391
      return "OPTIONS";
2✔
392

393
    case ARES_RR_TLSA_CERT_USAGE:
2✔
394
      return "CERT_USAGE";
2✔
395

396
    case ARES_RR_TLSA_SELECTOR:
2✔
397
      return "SELECTOR";
2✔
398

399
    case ARES_RR_TLSA_MATCH:
2✔
400
      return "MATCH";
2✔
401

402
    case ARES_RR_TLSA_DATA:
2✔
403
      return "DATA";
2✔
404

405
    case ARES_RR_SVCB_PRIORITY:
2✔
406
      return "PRIORITY";
2✔
407

408
    case ARES_RR_SVCB_TARGET:
2✔
409
      return "TARGET";
2✔
410

411
    case ARES_RR_SVCB_PARAMS:
2✔
412
      return "PARAMS";
2✔
413

414
    case ARES_RR_HTTPS_PRIORITY:
2✔
415
      return "PRIORITY";
2✔
416

417
    case ARES_RR_HTTPS_TARGET:
2✔
418
      return "TARGET";
2✔
419

420
    case ARES_RR_HTTPS_PARAMS:
2✔
421
      return "PARAMS";
2✔
422

423
    case ARES_RR_URI_PRIORITY:
2✔
424
      return "PRIORITY";
2✔
425

426
    case ARES_RR_URI_WEIGHT:
2✔
427
      return "WEIGHT";
2✔
428

429
    case ARES_RR_URI_TARGET:
2✔
430
      return "TARGET";
2✔
431

432
    case ARES_RR_CAA_CRITICAL:
2✔
433
      return "CRITICAL";
2✔
434

435
    case ARES_RR_CAA_TAG:
2✔
436
      return "TAG";
2✔
437

438
    case ARES_RR_CAA_VALUE:
2✔
439
      return "VALUE";
2✔
440

441
    case ARES_RR_RAW_RR_TYPE:
1✔
442
      return "TYPE";
1✔
443

444
    case ARES_RR_RAW_RR_DATA:
1✔
445
      return "DATA";
1✔
446
  }
447

448
  return "UNKNOWN";
×
449
}
450

451
ares_dns_datatype_t ares_dns_rr_key_datatype(ares_dns_rr_key_t key)
69,836✔
452
{
453
  switch (key) {
69,836✔
454
    case ARES_RR_A_ADDR:
2,910✔
455
      return ARES_DATATYPE_INADDR;
2,910✔
456

457
    case ARES_RR_AAAA_ADDR:
243✔
458
      return ARES_DATATYPE_INADDR6;
243✔
459

460
    case ARES_RR_NS_NSDNAME:
1,527✔
461
    case ARES_RR_CNAME_CNAME:
462
    case ARES_RR_SOA_MNAME:
463
    case ARES_RR_SOA_RNAME:
464
    case ARES_RR_PTR_DNAME:
465
    case ARES_RR_MX_EXCHANGE:
466
    case ARES_RR_SIG_SIGNERS_NAME:
467
    case ARES_RR_SRV_TARGET:
468
    case ARES_RR_SVCB_TARGET:
469
    case ARES_RR_HTTPS_TARGET:
470
    case ARES_RR_NAPTR_REPLACEMENT:
471
    case ARES_RR_URI_TARGET:
472
      return ARES_DATATYPE_NAME;
1,527✔
473

474
    case ARES_RR_HINFO_CPU:
64✔
475
    case ARES_RR_HINFO_OS:
476
    case ARES_RR_NAPTR_FLAGS:
477
    case ARES_RR_NAPTR_SERVICES:
478
    case ARES_RR_NAPTR_REGEXP:
479
    case ARES_RR_CAA_TAG:
480
      return ARES_DATATYPE_STR;
64✔
481

482
    case ARES_RR_SOA_SERIAL:
234✔
483
    case ARES_RR_SOA_REFRESH:
484
    case ARES_RR_SOA_RETRY:
485
    case ARES_RR_SOA_EXPIRE:
486
    case ARES_RR_SOA_MINIMUM:
487
    case ARES_RR_SIG_ORIGINAL_TTL:
488
    case ARES_RR_SIG_EXPIRATION:
489
    case ARES_RR_SIG_INCEPTION:
490
      return ARES_DATATYPE_U32;
234✔
491

492
    case ARES_RR_MX_PREFERENCE:
33,878✔
493
    case ARES_RR_SIG_TYPE_COVERED:
494
    case ARES_RR_SIG_KEY_TAG:
495
    case ARES_RR_SRV_PRIORITY:
496
    case ARES_RR_SRV_WEIGHT:
497
    case ARES_RR_SRV_PORT:
498
    case ARES_RR_NAPTR_ORDER:
499
    case ARES_RR_NAPTR_PREFERENCE:
500
    case ARES_RR_OPT_UDP_SIZE:
501
    case ARES_RR_OPT_FLAGS:
502
    case ARES_RR_SVCB_PRIORITY:
503
    case ARES_RR_HTTPS_PRIORITY:
504
    case ARES_RR_URI_PRIORITY:
505
    case ARES_RR_URI_WEIGHT:
506
    case ARES_RR_RAW_RR_TYPE:
507
      return ARES_DATATYPE_U16;
33,878✔
508

509
    case ARES_RR_SIG_ALGORITHM:
13,752✔
510
    case ARES_RR_SIG_LABELS:
511
    case ARES_RR_OPT_VERSION:
512
    case ARES_RR_TLSA_CERT_USAGE:
513
    case ARES_RR_TLSA_SELECTOR:
514
    case ARES_RR_TLSA_MATCH:
515
    case ARES_RR_CAA_CRITICAL:
516
      return ARES_DATATYPE_U8;
13,752✔
517

518
    case ARES_RR_CAA_VALUE:
48✔
519
      return ARES_DATATYPE_BINP;
48✔
520

521
    case ARES_RR_TXT_DATA:
42✔
522
      return ARES_DATATYPE_ABINP;
42✔
523

524
    case ARES_RR_SIG_SIGNATURE:
47✔
525
    case ARES_RR_TLSA_DATA:
526
    case ARES_RR_RAW_RR_DATA:
527
      return ARES_DATATYPE_BIN;
47✔
528

529
    case ARES_RR_OPT_OPTIONS:
17,091✔
530
    case ARES_RR_SVCB_PARAMS:
531
    case ARES_RR_HTTPS_PARAMS:
532
      return ARES_DATATYPE_OPT;
17,091✔
533
  }
534

535
  return 0;
×
536
}
537

538
static const ares_dns_rr_key_t rr_a_keys[]     = { ARES_RR_A_ADDR };
539
static const ares_dns_rr_key_t rr_ns_keys[]    = { ARES_RR_NS_NSDNAME };
540
static const ares_dns_rr_key_t rr_cname_keys[] = { ARES_RR_CNAME_CNAME };
541
static const ares_dns_rr_key_t rr_soa_keys[]   = {
542
  ARES_RR_SOA_MNAME,   ARES_RR_SOA_RNAME, ARES_RR_SOA_SERIAL,
543
  ARES_RR_SOA_REFRESH, ARES_RR_SOA_RETRY, ARES_RR_SOA_EXPIRE,
544
  ARES_RR_SOA_MINIMUM
545
};
546
static const ares_dns_rr_key_t rr_ptr_keys[]   = { ARES_RR_PTR_DNAME };
547
static const ares_dns_rr_key_t rr_hinfo_keys[] = { ARES_RR_HINFO_CPU,
548
                                                   ARES_RR_HINFO_OS };
549
static const ares_dns_rr_key_t rr_mx_keys[]    = { ARES_RR_MX_PREFERENCE,
550
                                                   ARES_RR_MX_EXCHANGE };
551
static const ares_dns_rr_key_t rr_sig_keys[]   = {
552
  ARES_RR_SIG_TYPE_COVERED, ARES_RR_SIG_ALGORITHM,    ARES_RR_SIG_LABELS,
553
  ARES_RR_SIG_ORIGINAL_TTL, ARES_RR_SIG_EXPIRATION,   ARES_RR_SIG_INCEPTION,
554
  ARES_RR_SIG_KEY_TAG,      ARES_RR_SIG_SIGNERS_NAME, ARES_RR_SIG_SIGNATURE
555
};
556
static const ares_dns_rr_key_t rr_txt_keys[]  = { ARES_RR_TXT_DATA };
557
static const ares_dns_rr_key_t rr_aaaa_keys[] = { ARES_RR_AAAA_ADDR };
558
static const ares_dns_rr_key_t rr_srv_keys[]  = {
559
  ARES_RR_SRV_PRIORITY, ARES_RR_SRV_WEIGHT, ARES_RR_SRV_PORT, ARES_RR_SRV_TARGET
560
};
561
static const ares_dns_rr_key_t rr_naptr_keys[] = {
562
  ARES_RR_NAPTR_ORDER,    ARES_RR_NAPTR_PREFERENCE, ARES_RR_NAPTR_FLAGS,
563
  ARES_RR_NAPTR_SERVICES, ARES_RR_NAPTR_REGEXP,     ARES_RR_NAPTR_REPLACEMENT
564
};
565
static const ares_dns_rr_key_t rr_opt_keys[]    = { ARES_RR_OPT_UDP_SIZE,
566
                                                    ARES_RR_OPT_VERSION,
567
                                                    ARES_RR_OPT_FLAGS,
568
                                                    ARES_RR_OPT_OPTIONS };
569
static const ares_dns_rr_key_t rr_tlsa_keys[]   = { ARES_RR_TLSA_CERT_USAGE,
570
                                                    ARES_RR_TLSA_SELECTOR,
571
                                                    ARES_RR_TLSA_MATCH,
572
                                                    ARES_RR_TLSA_DATA };
573
static const ares_dns_rr_key_t rr_svcb_keys[]   = { ARES_RR_SVCB_PRIORITY,
574
                                                    ARES_RR_SVCB_TARGET,
575
                                                    ARES_RR_SVCB_PARAMS };
576
static const ares_dns_rr_key_t rr_https_keys[]  = { ARES_RR_HTTPS_PRIORITY,
577
                                                    ARES_RR_HTTPS_TARGET,
578
                                                    ARES_RR_HTTPS_PARAMS };
579
static const ares_dns_rr_key_t rr_uri_keys[]    = { ARES_RR_URI_PRIORITY,
580
                                                    ARES_RR_URI_WEIGHT,
581
                                                    ARES_RR_URI_TARGET };
582
static const ares_dns_rr_key_t rr_caa_keys[]    = { ARES_RR_CAA_CRITICAL,
583
                                                    ARES_RR_CAA_TAG,
584
                                                    ARES_RR_CAA_VALUE };
585
static const ares_dns_rr_key_t rr_raw_rr_keys[] = { ARES_RR_RAW_RR_TYPE,
586
                                                    ARES_RR_RAW_RR_DATA };
587

588
const ares_dns_rr_key_t       *ares_dns_rr_get_keys(ares_dns_rec_type_t type,
39✔
589
                                                    size_t             *cnt)
590
{
591
  if (cnt == NULL) {
39✔
592
    return NULL;
×
593
  }
594

595
  *cnt = 0;
39✔
596

597
  switch (type) {
39✔
598
    case ARES_REC_TYPE_A:
2✔
599
      *cnt = sizeof(rr_a_keys) / sizeof(*rr_a_keys);
2✔
600
      return rr_a_keys;
2✔
601
    case ARES_REC_TYPE_NS:
3✔
602
      *cnt = sizeof(rr_ns_keys) / sizeof(*rr_ns_keys);
3✔
603
      return rr_ns_keys;
3✔
604
    case ARES_REC_TYPE_CNAME:
2✔
605
      *cnt = sizeof(rr_cname_keys) / sizeof(*rr_cname_keys);
2✔
606
      return rr_cname_keys;
2✔
607
    case ARES_REC_TYPE_SOA:
2✔
608
      *cnt = sizeof(rr_soa_keys) / sizeof(*rr_soa_keys);
2✔
609
      return rr_soa_keys;
2✔
610
    case ARES_REC_TYPE_PTR:
2✔
611
      *cnt = sizeof(rr_ptr_keys) / sizeof(*rr_ptr_keys);
2✔
612
      return rr_ptr_keys;
2✔
613
    case ARES_REC_TYPE_HINFO:
2✔
614
      *cnt = sizeof(rr_hinfo_keys) / sizeof(*rr_hinfo_keys);
2✔
615
      return rr_hinfo_keys;
2✔
616
    case ARES_REC_TYPE_MX:
2✔
617
      *cnt = sizeof(rr_mx_keys) / sizeof(*rr_mx_keys);
2✔
618
      return rr_mx_keys;
2✔
619
    case ARES_REC_TYPE_TXT:
2✔
620
      *cnt = sizeof(rr_txt_keys) / sizeof(*rr_txt_keys);
2✔
621
      return rr_txt_keys;
2✔
622
    case ARES_REC_TYPE_SIG:
2✔
623
      *cnt = sizeof(rr_sig_keys) / sizeof(*rr_sig_keys);
2✔
624
      return rr_sig_keys;
2✔
625
    case ARES_REC_TYPE_AAAA:
2✔
626
      *cnt = sizeof(rr_aaaa_keys) / sizeof(*rr_aaaa_keys);
2✔
627
      return rr_aaaa_keys;
2✔
628
    case ARES_REC_TYPE_SRV:
2✔
629
      *cnt = sizeof(rr_srv_keys) / sizeof(*rr_srv_keys);
2✔
630
      return rr_srv_keys;
2✔
631
    case ARES_REC_TYPE_NAPTR:
2✔
632
      *cnt = sizeof(rr_naptr_keys) / sizeof(*rr_naptr_keys);
2✔
633
      return rr_naptr_keys;
2✔
634
    case ARES_REC_TYPE_OPT:
2✔
635
      *cnt = sizeof(rr_opt_keys) / sizeof(*rr_opt_keys);
2✔
636
      return rr_opt_keys;
2✔
637
    case ARES_REC_TYPE_TLSA:
2✔
638
      *cnt = sizeof(rr_tlsa_keys) / sizeof(*rr_tlsa_keys);
2✔
639
      return rr_tlsa_keys;
2✔
640
    case ARES_REC_TYPE_SVCB:
2✔
641
      *cnt = sizeof(rr_svcb_keys) / sizeof(*rr_svcb_keys);
2✔
642
      return rr_svcb_keys;
2✔
643
    case ARES_REC_TYPE_HTTPS:
2✔
644
      *cnt = sizeof(rr_https_keys) / sizeof(*rr_https_keys);
2✔
645
      return rr_https_keys;
2✔
646
    case ARES_REC_TYPE_ANY:
1✔
647
      /* Not real */
648
      break;
1✔
649
    case ARES_REC_TYPE_URI:
2✔
650
      *cnt = sizeof(rr_uri_keys) / sizeof(*rr_uri_keys);
2✔
651
      return rr_uri_keys;
2✔
652
    case ARES_REC_TYPE_CAA:
2✔
653
      *cnt = sizeof(rr_caa_keys) / sizeof(*rr_caa_keys);
2✔
654
      return rr_caa_keys;
2✔
655
    case ARES_REC_TYPE_RAW_RR:
1✔
656
      *cnt = sizeof(rr_raw_rr_keys) / sizeof(*rr_raw_rr_keys);
1✔
657
      return rr_raw_rr_keys;
1✔
658
  }
659

660
  return NULL;
1✔
661
}
662

663
ares_bool_t ares_dns_class_fromstr(ares_dns_class_t *qclass, const char *str)
×
664
{
665
  size_t i;
666

667
  static const struct {
668
    const char      *name;
669
    ares_dns_class_t qclass;
670
  } list[] = {
671
    { "IN",   ARES_CLASS_IN     },
672
    { "CH",   ARES_CLASS_CHAOS  },
673
    { "HS",   ARES_CLASS_HESOID },
674
    { "NONE", ARES_CLASS_NONE   },
675
    { "ANY",  ARES_CLASS_ANY    },
676
    { NULL,   0                 }
677
  };
678

679
  if (qclass == NULL || str == NULL) {
×
680
    return ARES_FALSE;
×
681
  }
682

683
  for (i = 0; list[i].name != NULL; i++) {
×
684
    if (strcasecmp(list[i].name, str) == 0) {
×
685
      *qclass = list[i].qclass;
×
686
      return ARES_TRUE;
×
687
    }
688
  }
689
  return ARES_FALSE;
×
690
}
691

692
ares_bool_t ares_dns_rec_type_fromstr(ares_dns_rec_type_t *qtype,
19✔
693
                                      const char          *str)
694
{
695
  size_t i;
696

697
  static const struct {
698
    const char         *name;
699
    ares_dns_rec_type_t type;
700
  } list[] = {
701
    { "A",      ARES_REC_TYPE_A      },
702
    { "NS",     ARES_REC_TYPE_NS     },
703
    { "CNAME",  ARES_REC_TYPE_CNAME  },
704
    { "SOA",    ARES_REC_TYPE_SOA    },
705
    { "PTR",    ARES_REC_TYPE_PTR    },
706
    { "HINFO",  ARES_REC_TYPE_HINFO  },
707
    { "MX",     ARES_REC_TYPE_MX     },
708
    { "TXT",    ARES_REC_TYPE_TXT    },
709
    { "SIG",    ARES_REC_TYPE_SIG    },
710
    { "AAAA",   ARES_REC_TYPE_AAAA   },
711
    { "SRV",    ARES_REC_TYPE_SRV    },
712
    { "NAPTR",  ARES_REC_TYPE_NAPTR  },
713
    { "OPT",    ARES_REC_TYPE_OPT    },
714
    { "TLSA",   ARES_REC_TYPE_TLSA   },
715
    { "SVCB",   ARES_REC_TYPE_SVCB   },
716
    { "HTTPS",  ARES_REC_TYPE_HTTPS  },
717
    { "ANY",    ARES_REC_TYPE_ANY    },
718
    { "URI",    ARES_REC_TYPE_URI    },
719
    { "CAA",    ARES_REC_TYPE_CAA    },
720
    { "RAW_RR", ARES_REC_TYPE_RAW_RR },
721
    { NULL,     0                    }
722
  };
723

724
  if (qtype == NULL || str == NULL) {
19✔
725
    return ARES_FALSE;
×
726
  }
727

728
  for (i = 0; list[i].name != NULL; i++) {
190✔
729
    if (strcasecmp(list[i].name, str) == 0) {
190✔
730
      *qtype = list[i].type;
19✔
731
      return ARES_TRUE;
19✔
732
    }
733
  }
734
  return ARES_FALSE;
×
735
}
736

737
const char *ares_dns_section_tostr(ares_dns_section_t section)
3✔
738
{
739
  switch (section) {
3✔
740
    case ARES_SECTION_ANSWER:
1✔
741
      return "ANSWER";
1✔
742
    case ARES_SECTION_AUTHORITY:
1✔
743
      return "AUTHORITY";
1✔
744
    case ARES_SECTION_ADDITIONAL:
1✔
745
      return "ADDITIONAL";
1✔
746
  }
747
  return "UNKNOWN";
×
748
}
749

750
static ares_dns_opt_datatype_t ares_dns_opt_get_type_opt(unsigned short opt)
×
751
{
752
  ares_opt_param_t param = (ares_opt_param_t)opt;
×
753
  switch (param) {
×
754
    case ARES_OPT_PARAM_LLQ:
×
755
      /* Really it is u16 version, u16 opcode, u16 error, u64 id, u32 lease */
756
      return ARES_OPT_DATATYPE_BIN;
×
757
    case ARES_OPT_PARAM_UL:
×
758
      return ARES_OPT_DATATYPE_U32;
×
759
    case ARES_OPT_PARAM_NSID:
×
760
      return ARES_OPT_DATATYPE_BIN;
×
761
    case ARES_OPT_PARAM_DAU:
×
762
      return ARES_OPT_DATATYPE_U8_LIST;
×
763
    case ARES_OPT_PARAM_DHU:
×
764
      return ARES_OPT_DATATYPE_U8_LIST;
×
765
    case ARES_OPT_PARAM_N3U:
×
766
      return ARES_OPT_DATATYPE_U8_LIST;
×
767
    case ARES_OPT_PARAM_EDNS_CLIENT_SUBNET:
×
768
      /* Really it is a u16 address family, u8 source prefix length,
769
       * u8 scope prefix length, address */
770
      return ARES_OPT_DATATYPE_BIN;
×
771
    case ARES_OPT_PARAM_EDNS_EXPIRE:
×
772
      return ARES_OPT_DATATYPE_U32;
×
773
    case ARES_OPT_PARAM_COOKIE:
×
774
      /* 8 bytes for client, 16-40 bytes for server */
775
      return ARES_OPT_DATATYPE_BIN;
×
776
    case ARES_OPT_PARAM_EDNS_TCP_KEEPALIVE:
×
777
      /* Timeout in 100ms intervals */
778
      return ARES_OPT_DATATYPE_U16;
×
779
    case ARES_OPT_PARAM_PADDING:
×
780
      /* Arbitrary padding */
781
      return ARES_OPT_DATATYPE_BIN;
×
782
    case ARES_OPT_PARAM_CHAIN:
×
783
      return ARES_OPT_DATATYPE_NAME;
×
784
    case ARES_OPT_PARAM_EDNS_KEY_TAG:
×
785
      return ARES_OPT_DATATYPE_U16_LIST;
×
786
    case ARES_OPT_PARAM_EXTENDED_DNS_ERROR:
×
787
      /* Really 16bit code followed by textual message */
788
      return ARES_OPT_DATATYPE_BIN;
×
789
  }
790
  return ARES_OPT_DATATYPE_BIN;
×
791
}
792

793
static ares_dns_opt_datatype_t ares_dns_opt_get_type_svcb(unsigned short opt)
×
794
{
795
  ares_svcb_param_t param = (ares_svcb_param_t)opt;
×
796
  switch (param) {
×
797
    case ARES_SVCB_PARAM_NO_DEFAULT_ALPN:
×
798
      return ARES_OPT_DATATYPE_NONE;
×
799
    case ARES_SVCB_PARAM_ECH:
×
800
      return ARES_OPT_DATATYPE_BIN;
×
801
    case ARES_SVCB_PARAM_MANDATORY:
×
802
      return ARES_OPT_DATATYPE_U16_LIST;
×
803
    case ARES_SVCB_PARAM_ALPN:
×
804
      return ARES_OPT_DATATYPE_STR_LIST;
×
805
    case ARES_SVCB_PARAM_PORT:
×
806
      return ARES_OPT_DATATYPE_U16;
×
807
    case ARES_SVCB_PARAM_IPV4HINT:
×
808
      return ARES_OPT_DATATYPE_INADDR4_LIST;
×
809
    case ARES_SVCB_PARAM_IPV6HINT:
×
810
      return ARES_OPT_DATATYPE_INADDR6_LIST;
×
811
  }
812
  return ARES_OPT_DATATYPE_BIN;
×
813
}
814

815
ares_dns_opt_datatype_t ares_dns_opt_get_datatype(ares_dns_rr_key_t key,
×
816
                                                  unsigned short    opt)
817
{
818
  switch (key) {
×
819
    case ARES_RR_OPT_OPTIONS:
×
820
      return ares_dns_opt_get_type_opt(opt);
×
821
    case ARES_RR_SVCB_PARAMS:
×
822
    case ARES_RR_HTTPS_PARAMS:
823
      return ares_dns_opt_get_type_svcb(opt);
×
824
    default:
×
825
      break;
×
826
  }
827
  return ARES_OPT_DATATYPE_BIN;
×
828
}
829

830
static const char *ares_dns_opt_get_name_opt(unsigned short opt)
×
831
{
832
  ares_opt_param_t param = (ares_opt_param_t)opt;
×
833
  switch (param) {
×
834
    case ARES_OPT_PARAM_LLQ:
×
835
      return "LLQ";
×
836
    case ARES_OPT_PARAM_UL:
×
837
      return "UL";
×
838
    case ARES_OPT_PARAM_NSID:
×
839
      return "NSID";
×
840
    case ARES_OPT_PARAM_DAU:
×
841
      return "DAU";
×
842
    case ARES_OPT_PARAM_DHU:
×
843
      return "DHU";
×
844
    case ARES_OPT_PARAM_N3U:
×
845
      return "N3U";
×
846
    case ARES_OPT_PARAM_EDNS_CLIENT_SUBNET:
×
847
      return "edns-client-subnet";
×
848
    case ARES_OPT_PARAM_EDNS_EXPIRE:
×
849
      return "edns-expire";
×
850
    case ARES_OPT_PARAM_COOKIE:
×
851
      return "COOKIE";
×
852
    case ARES_OPT_PARAM_EDNS_TCP_KEEPALIVE:
×
853
      return "edns-tcp-keepalive";
×
854
    case ARES_OPT_PARAM_PADDING:
×
855
      return "Padding";
×
856
    case ARES_OPT_PARAM_CHAIN:
×
857
      return "CHAIN";
×
858
    case ARES_OPT_PARAM_EDNS_KEY_TAG:
×
859
      return "edns-key-tag";
×
860
    case ARES_OPT_PARAM_EXTENDED_DNS_ERROR:
×
861
      return "extended-dns-error";
×
862
  }
863
  return NULL;
×
864
}
865

866
static const char *ares_dns_opt_get_name_svcb(unsigned short opt)
×
867
{
868
  ares_svcb_param_t param = (ares_svcb_param_t)opt;
×
869
  switch (param) {
×
870
    case ARES_SVCB_PARAM_NO_DEFAULT_ALPN:
×
871
      return "no-default-alpn";
×
872
    case ARES_SVCB_PARAM_ECH:
×
873
      return "ech";
×
874
    case ARES_SVCB_PARAM_MANDATORY:
×
875
      return "mandatory";
×
876
    case ARES_SVCB_PARAM_ALPN:
×
877
      return "alpn";
×
878
    case ARES_SVCB_PARAM_PORT:
×
879
      return "port";
×
880
    case ARES_SVCB_PARAM_IPV4HINT:
×
881
      return "ipv4hint";
×
882
    case ARES_SVCB_PARAM_IPV6HINT:
×
883
      return "ipv6hint";
×
884
  }
885
  return NULL;
×
886
}
887

888
const char *ares_dns_opt_get_name(ares_dns_rr_key_t key, unsigned short opt)
×
889
{
890
  switch (key) {
×
891
    case ARES_RR_OPT_OPTIONS:
×
892
      return ares_dns_opt_get_name_opt(opt);
×
893
    case ARES_RR_SVCB_PARAMS:
×
894
    case ARES_RR_HTTPS_PARAMS:
895
      return ares_dns_opt_get_name_svcb(opt);
×
896
    default:
×
897
      break;
×
898
  }
899
  return NULL;
×
900
}
901

902
const char *ares_dns_rcode_tostr(ares_dns_rcode_t rcode)
1✔
903
{
904
  switch (rcode) {
1✔
905
    case ARES_RCODE_NOERROR:
1✔
906
      return "NOERROR";
1✔
907
    case ARES_RCODE_FORMERR:
×
908
      return "FORMERR";
×
909
    case ARES_RCODE_SERVFAIL:
×
910
      return "SERVFAIL";
×
911
    case ARES_RCODE_NXDOMAIN:
×
912
      return "NXDOMAIN";
×
913
    case ARES_RCODE_NOTIMP:
×
914
      return "NOTIMP";
×
915
    case ARES_RCODE_REFUSED:
×
916
      return "REFUSED";
×
917
    case ARES_RCODE_YXDOMAIN:
×
918
      return "YXDOMAIN";
×
919
    case ARES_RCODE_YXRRSET:
×
920
      return "YXRRSET";
×
921
    case ARES_RCODE_NXRRSET:
×
922
      return "NXRRSET";
×
923
    case ARES_RCODE_NOTAUTH:
×
924
      return "NOTAUTH";
×
925
    case ARES_RCODE_NOTZONE:
×
926
      return "NOTZONE";
×
927
    case ARES_RCODE_DSOTYPEI:
×
928
      return "DSOTYPEI";
×
929
    case ARES_RCODE_BADSIG:
×
930
      return "BADSIG";
×
931
    case ARES_RCODE_BADKEY:
×
932
      return "BADKEY";
×
933
    case ARES_RCODE_BADTIME:
×
934
      return "BADTIME";
×
935
    case ARES_RCODE_BADMODE:
×
936
      return "BADMODE";
×
937
    case ARES_RCODE_BADNAME:
×
938
      return "BADNAME";
×
939
    case ARES_RCODE_BADALG:
×
940
      return "BADALG";
×
941
    case ARES_RCODE_BADTRUNC:
×
942
      return "BADTRUNC";
×
943
    case ARES_RCODE_BADCOOKIE:
×
944
      return "BADCOOKIE";
×
945
  }
946

947
  return "UNKNOWN";
×
948
}
949

950
/* Convert an rcode and ancount from a query reply into an ares_status_t
951
 * value. Used internally by ares_search() and ares_query().
952
 */
953
ares_status_t ares_dns_query_reply_tostatus(ares_dns_rcode_t rcode,
1,968✔
954
                                            size_t           ancount)
955
{
956
  ares_status_t status = ARES_SUCCESS;
1,968✔
957

958
  switch (rcode) {
1,968✔
959
    case ARES_RCODE_NOERROR:
1,620✔
960
      status = (ancount > 0) ? ARES_SUCCESS : ARES_ENODATA;
1,620✔
961
      break;
1,620✔
962
    case ARES_RCODE_FORMERR:
10✔
963
      status = ARES_EFORMERR;
10✔
964
      break;
10✔
965
    case ARES_RCODE_SERVFAIL:
24✔
966
      status = ARES_ESERVFAIL;
24✔
967
      break;
24✔
968
    case ARES_RCODE_NXDOMAIN:
260✔
969
      status = ARES_ENOTFOUND;
260✔
970
      break;
260✔
971
    case ARES_RCODE_NOTIMP:
20✔
972
      status = ARES_ENOTIMP;
20✔
973
      break;
20✔
974
    case ARES_RCODE_REFUSED:
24✔
975
      status = ARES_EREFUSED;
24✔
976
      break;
24✔
977
    default:
10✔
978
      break;
10✔
979
  }
980

981
  return status;
1,968✔
982
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc