visaljs 0.0.10 → 0.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -4
- package/THIRD_PARTY_LICENSES +31 -1
- package/cli.js +962 -68
- package/node/include/js_node.h +11 -1
- package/node/prelude/_http_common.js +29 -0
- package/node/prelude/async_hooks.js +50 -11
- package/node/prelude/child_process.js +31 -4
- package/node/prelude/console.js +311 -143
- package/node/prelude/crypto.js +6 -4
- package/node/prelude/dgram.js +1169 -0
- package/node/prelude/diagnostics_channel.js +3 -1
- package/node/prelude/dns.js +250 -45
- package/node/prelude/dns_promises.js +8 -2
- package/node/prelude/fs_promises.js +9 -1
- package/node/prelude/http.js +395 -86
- package/node/prelude/https.js +13 -4
- package/node/prelude/internal/console_class.js +7 -0
- package/node/prelude/internal/console_global.js +25 -0
- package/node/prelude/internal/crypto/key_encryption.js +217 -0
- package/node/prelude/internal/crypto/keys.js +161 -26
- package/node/prelude/internal/crypto/random.js +24 -0
- package/node/prelude/internal/crypto/util.js +2 -1
- package/node/prelude/internal/crypto_x509.js +161 -0
- package/node/prelude/internal/dns_classes.js +6 -0
- package/node/prelude/internal/dns_resolver.js +371 -0
- package/node/prelude/internal/errors.js +9 -0
- package/node/prelude/internal/events_on.js +82 -37
- package/node/prelude/internal/features.js +8 -4
- package/node/prelude/internal/fs_filehandle.js +10 -4
- package/node/prelude/internal/perf_histogram.js +1 -1
- package/node/prelude/internal/process_more.js +32 -17
- package/node/prelude/internal/process_signals.js +8 -2
- package/node/prelude/internal/punycode.ts +163 -0
- package/node/prelude/internal/readline.js +648 -274
- package/node/prelude/internal/readline_editor.js +1240 -0
- package/node/prelude/internal/string_width.js +43 -0
- package/node/prelude/internal/tls/common.js +145 -33
- package/node/prelude/internal/tls/wrap.js +182 -49
- package/node/prelude/internal/tls/x509.js +4 -1
- package/node/prelude/internal/udp.js +177 -0
- package/node/prelude/net.js +13 -1
- package/node/prelude/os.js +24 -6
- package/node/prelude/perf_hooks.js +37 -2
- package/node/prelude/punycode.js +2 -130
- package/node/prelude/readline.js +113 -4
- package/node/prelude/readline_promises.js +56 -32
- package/node/prelude/tls.js +21 -4
- package/node/prelude/util.js +3 -16
- package/node/src/host_dns.c +623 -0
- package/node/src/host_http.c +12 -0
- package/node/src/host_net.c +46 -0
- package/node/src/host_os.c +1 -6
- package/node/src/host_sys.c +70 -0
- package/node/src/host_udp.c +418 -0
- package/node/third_party/c-ares/LICENSE.md +24 -0
- package/node/third_party/c-ares/config/darwin/ares_config.h +573 -0
- package/node/third_party/c-ares/config/freebsd/ares_config.h +573 -0
- package/node/third_party/c-ares/config/linux/ares_config.h +573 -0
- package/node/third_party/c-ares/config/openbsd/ares_config.h +583 -0
- package/node/third_party/c-ares/include/ares.h +1237 -0
- package/node/third_party/c-ares/include/ares_build.h +202 -0
- package/node/third_party/c-ares/include/ares_dns.h +127 -0
- package/node/third_party/c-ares/include/ares_dns_record.h +1119 -0
- package/node/third_party/c-ares/include/ares_nameser.h +510 -0
- package/node/third_party/c-ares/include/ares_version.h +47 -0
- package/node/third_party/c-ares/src/lib/ares_addrinfo2hostent.c +305 -0
- package/node/third_party/c-ares/src/lib/ares_addrinfo_localhost.c +245 -0
- package/node/third_party/c-ares/src/lib/ares_android.c +496 -0
- package/node/third_party/c-ares/src/lib/ares_android.h +38 -0
- package/node/third_party/c-ares/src/lib/ares_cancel.c +87 -0
- package/node/third_party/c-ares/src/lib/ares_close_sockets.c +137 -0
- package/node/third_party/c-ares/src/lib/ares_conn.c +511 -0
- package/node/third_party/c-ares/src/lib/ares_conn.h +202 -0
- package/node/third_party/c-ares/src/lib/ares_cookie.c +461 -0
- package/node/third_party/c-ares/src/lib/ares_data.c +168 -0
- package/node/third_party/c-ares/src/lib/ares_data.h +92 -0
- package/node/third_party/c-ares/src/lib/ares_destroy.c +159 -0
- package/node/third_party/c-ares/src/lib/ares_free_hostent.c +54 -0
- package/node/third_party/c-ares/src/lib/ares_free_string.c +33 -0
- package/node/third_party/c-ares/src/lib/ares_freeaddrinfo.c +67 -0
- package/node/third_party/c-ares/src/lib/ares_getaddrinfo.c +806 -0
- package/node/third_party/c-ares/src/lib/ares_getenv.c +38 -0
- package/node/third_party/c-ares/src/lib/ares_getenv.h +34 -0
- package/node/third_party/c-ares/src/lib/ares_gethostbyaddr.c +229 -0
- package/node/third_party/c-ares/src/lib/ares_gethostbyname.c +341 -0
- package/node/third_party/c-ares/src/lib/ares_getnameinfo.c +437 -0
- package/node/third_party/c-ares/src/lib/ares_hosts_file.c +960 -0
- package/node/third_party/c-ares/src/lib/ares_inet_net_pton.h +31 -0
- package/node/third_party/c-ares/src/lib/ares_init.c +631 -0
- package/node/third_party/c-ares/src/lib/ares_ipv6.h +115 -0
- package/node/third_party/c-ares/src/lib/ares_library_init.c +190 -0
- package/node/third_party/c-ares/src/lib/ares_metrics.c +261 -0
- package/node/third_party/c-ares/src/lib/ares_options.c +492 -0
- package/node/third_party/c-ares/src/lib/ares_parse_into_addrinfo.c +179 -0
- package/node/third_party/c-ares/src/lib/ares_private.h +648 -0
- package/node/third_party/c-ares/src/lib/ares_process.c +1649 -0
- package/node/third_party/c-ares/src/lib/ares_qcache.c +442 -0
- package/node/third_party/c-ares/src/lib/ares_query.c +151 -0
- package/node/third_party/c-ares/src/lib/ares_search.c +623 -0
- package/node/third_party/c-ares/src/lib/ares_send.c +300 -0
- package/node/third_party/c-ares/src/lib/ares_set_socket_functions.c +590 -0
- package/node/third_party/c-ares/src/lib/ares_setup.h +224 -0
- package/node/third_party/c-ares/src/lib/ares_socket.c +427 -0
- package/node/third_party/c-ares/src/lib/ares_socket.h +163 -0
- package/node/third_party/c-ares/src/lib/ares_sortaddrinfo.c +447 -0
- package/node/third_party/c-ares/src/lib/ares_strerror.c +91 -0
- package/node/third_party/c-ares/src/lib/ares_sysconfig.c +642 -0
- package/node/third_party/c-ares/src/lib/ares_sysconfig_files.c +851 -0
- package/node/third_party/c-ares/src/lib/ares_sysconfig_mac.c +373 -0
- package/node/third_party/c-ares/src/lib/ares_sysconfig_win.c +673 -0
- package/node/third_party/c-ares/src/lib/ares_timeout.c +162 -0
- package/node/third_party/c-ares/src/lib/ares_update_servers.c +1376 -0
- package/node/third_party/c-ares/src/lib/ares_version.c +36 -0
- package/node/third_party/c-ares/src/lib/config-dos.h +114 -0
- package/node/third_party/c-ares/src/lib/config-win32.h +396 -0
- package/node/third_party/c-ares/src/lib/dsa/ares_array.c +409 -0
- package/node/third_party/c-ares/src/lib/dsa/ares_htable.c +451 -0
- package/node/third_party/c-ares/src/lib/dsa/ares_htable.h +174 -0
- package/node/third_party/c-ares/src/lib/dsa/ares_htable_asvp.c +224 -0
- package/node/third_party/c-ares/src/lib/dsa/ares_htable_dict.c +230 -0
- package/node/third_party/c-ares/src/lib/dsa/ares_htable_strvp.c +210 -0
- package/node/third_party/c-ares/src/lib/dsa/ares_htable_szvp.c +188 -0
- package/node/third_party/c-ares/src/lib/dsa/ares_htable_vpstr.c +186 -0
- package/node/third_party/c-ares/src/lib/dsa/ares_htable_vpvp.c +194 -0
- package/node/third_party/c-ares/src/lib/dsa/ares_llist.c +385 -0
- package/node/third_party/c-ares/src/lib/dsa/ares_slist.c +479 -0
- package/node/third_party/c-ares/src/lib/dsa/ares_slist.h +207 -0
- package/node/third_party/c-ares/src/lib/event/ares_event.h +191 -0
- package/node/third_party/c-ares/src/lib/event/ares_event_configchg.c +746 -0
- package/node/third_party/c-ares/src/lib/event/ares_event_epoll.c +192 -0
- package/node/third_party/c-ares/src/lib/event/ares_event_kqueue.c +248 -0
- package/node/third_party/c-ares/src/lib/event/ares_event_poll.c +140 -0
- package/node/third_party/c-ares/src/lib/event/ares_event_select.c +159 -0
- package/node/third_party/c-ares/src/lib/event/ares_event_thread.c +575 -0
- package/node/third_party/c-ares/src/lib/event/ares_event_wake_pipe.c +172 -0
- package/node/third_party/c-ares/src/lib/event/ares_event_win32.c +981 -0
- package/node/third_party/c-ares/src/lib/event/ares_event_win32.h +161 -0
- package/node/third_party/c-ares/src/lib/include/ares_array.h +276 -0
- package/node/third_party/c-ares/src/lib/include/ares_buf.h +732 -0
- package/node/third_party/c-ares/src/lib/include/ares_htable_asvp.h +130 -0
- package/node/third_party/c-ares/src/lib/include/ares_htable_dict.h +123 -0
- package/node/third_party/c-ares/src/lib/include/ares_htable_strvp.h +130 -0
- package/node/third_party/c-ares/src/lib/include/ares_htable_szvp.h +118 -0
- package/node/third_party/c-ares/src/lib/include/ares_htable_vpstr.h +111 -0
- package/node/third_party/c-ares/src/lib/include/ares_htable_vpvp.h +128 -0
- package/node/third_party/c-ares/src/lib/include/ares_llist.h +239 -0
- package/node/third_party/c-ares/src/lib/include/ares_mem.h +41 -0
- package/node/third_party/c-ares/src/lib/include/ares_str.h +261 -0
- package/node/third_party/c-ares/src/lib/inet_net_pton.c +451 -0
- package/node/third_party/c-ares/src/lib/inet_ntop.c +219 -0
- package/node/third_party/c-ares/src/lib/legacy/ares_create_query.c +78 -0
- package/node/third_party/c-ares/src/lib/legacy/ares_expand_name.c +99 -0
- package/node/third_party/c-ares/src/lib/legacy/ares_expand_string.c +107 -0
- package/node/third_party/c-ares/src/lib/legacy/ares_fds.c +80 -0
- package/node/third_party/c-ares/src/lib/legacy/ares_getsock.c +85 -0
- package/node/third_party/c-ares/src/lib/legacy/ares_parse_a_reply.c +107 -0
- package/node/third_party/c-ares/src/lib/legacy/ares_parse_aaaa_reply.c +109 -0
- package/node/third_party/c-ares/src/lib/legacy/ares_parse_caa_reply.c +137 -0
- package/node/third_party/c-ares/src/lib/legacy/ares_parse_mx_reply.c +110 -0
- package/node/third_party/c-ares/src/lib/legacy/ares_parse_naptr_reply.c +132 -0
- package/node/third_party/c-ares/src/lib/legacy/ares_parse_ns_reply.c +154 -0
- package/node/third_party/c-ares/src/lib/legacy/ares_parse_ptr_reply.c +213 -0
- package/node/third_party/c-ares/src/lib/legacy/ares_parse_soa_reply.c +115 -0
- package/node/third_party/c-ares/src/lib/legacy/ares_parse_srv_reply.c +114 -0
- package/node/third_party/c-ares/src/lib/legacy/ares_parse_txt_reply.c +144 -0
- package/node/third_party/c-ares/src/lib/legacy/ares_parse_uri_reply.c +113 -0
- package/node/third_party/c-ares/src/lib/record/ares_dns_mapping.c +982 -0
- package/node/third_party/c-ares/src/lib/record/ares_dns_multistring.c +309 -0
- package/node/third_party/c-ares/src/lib/record/ares_dns_multistring.h +72 -0
- package/node/third_party/c-ares/src/lib/record/ares_dns_name.c +736 -0
- package/node/third_party/c-ares/src/lib/record/ares_dns_parse.c +1360 -0
- package/node/third_party/c-ares/src/lib/record/ares_dns_private.h +273 -0
- package/node/third_party/c-ares/src/lib/record/ares_dns_record.c +1701 -0
- package/node/third_party/c-ares/src/lib/record/ares_dns_write.c +1229 -0
- package/node/third_party/c-ares/src/lib/str/ares_buf.c +1510 -0
- package/node/third_party/c-ares/src/lib/str/ares_str.c +562 -0
- package/node/third_party/c-ares/src/lib/str/ares_strsplit.c +90 -0
- package/node/third_party/c-ares/src/lib/str/ares_strsplit.h +51 -0
- package/node/third_party/c-ares/src/lib/thirdparty/apple/dnsinfo.h +122 -0
- package/node/third_party/c-ares/src/lib/util/ares_iface_ips.c +640 -0
- package/node/third_party/c-ares/src/lib/util/ares_iface_ips.h +140 -0
- package/node/third_party/c-ares/src/lib/util/ares_math.c +167 -0
- package/node/third_party/c-ares/src/lib/util/ares_math.h +58 -0
- package/node/third_party/c-ares/src/lib/util/ares_rand.c +389 -0
- package/node/third_party/c-ares/src/lib/util/ares_rand.h +36 -0
- package/node/third_party/c-ares/src/lib/util/ares_threads.c +613 -0
- package/node/third_party/c-ares/src/lib/util/ares_threads.h +60 -0
- package/node/third_party/c-ares/src/lib/util/ares_time.h +49 -0
- package/node/third_party/c-ares/src/lib/util/ares_timeval.c +95 -0
- package/node/third_party/c-ares/src/lib/util/ares_uri.c +1627 -0
- package/node/third_party/c-ares/src/lib/util/ares_uri.h +252 -0
- package/node/third_party/c-ares/src/lib/windows_port.c +29 -0
- package/package.json +1 -1
- package/prebuilt/darwin-arm64/cares-a6286c65ca9374a3.a +0 -0
- package/prebuilt/darwin-x64/cares-a6286c65ca9374a3.a +0 -0
- package/prebuilt/linux-arm64/cares-4ba05ac8e948af8e.a +0 -0
- package/prebuilt/linux-arm64-musl/cares-4ba05ac8e948af8e.a +0 -0
- package/prebuilt/linux-x64/cares-4ba05ac8e948af8e.a +0 -0
- package/prebuilt/linux-x64-musl/cares-4ba05ac8e948af8e.a +0 -0
- package/prebuilt/win32-x64/boringssl-ce573858472b7fc9.a +0 -0
- package/prebuilt/win32-x64/brotli-20d86a61f30baeb3.a +0 -0
- package/prebuilt/win32-x64/cares-49c9ec95162b912d.a +0 -0
- package/prebuilt/win32-x64/uv-b11bae65d7fced82.a +0 -0
- package/prebuilt/win32-x64/zlib-4ce2317a4c3f5fb5.a +0 -0
- package/prebuilt/win32-x64/zstd-015315ac7c784c73.a +0 -0
- package/runtime/include/js_builtins.h +5 -0
- package/runtime/include/js_crypto.h +11 -0
- package/runtime/include/js_gc.h +13 -10
- package/runtime/include/js_jobs.h +2 -0
- package/runtime/include/js_object.h +58 -0
- package/runtime/include/jscontext.h +1 -0
- package/runtime/src/crypto_internal.h +1 -0
- package/runtime/src/crypto_subtle.c +66 -7
- package/runtime/src/crypto_tls.c +265 -19
- package/runtime/src/gc.c +73 -92
- package/runtime/src/inspect.c +18 -1
- package/runtime/src/jobs.c +37 -22
- package/runtime/src/object.c +49 -2
- package/runtime/src/os.c +16 -6
- package/runtime/src/os.h +2 -0
- package/runtime/src/process.c +97 -10
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
/* MIT License
|
|
2
|
+
*
|
|
3
|
+
* Copyright (c) 1998 Massachusetts Institute of Technology
|
|
4
|
+
* Copyright (c) The c-ares project and its contributors
|
|
5
|
+
*
|
|
6
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
8
|
+
* in the Software without restriction, including without limitation the rights
|
|
9
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
11
|
+
* furnished to do so, subject to the following conditions:
|
|
12
|
+
*
|
|
13
|
+
* The above copyright notice and this permission notice (including the next
|
|
14
|
+
* paragraph) shall be included in all copies or substantial portions of the
|
|
15
|
+
* Software.
|
|
16
|
+
*
|
|
17
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
23
|
+
* SOFTWARE.
|
|
24
|
+
*
|
|
25
|
+
* SPDX-License-Identifier: MIT
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
#include "ares_private.h"
|
|
29
|
+
|
|
30
|
+
#ifdef HAVE_NETINET_IN_H
|
|
31
|
+
# include <netinet/in.h>
|
|
32
|
+
#endif
|
|
33
|
+
#include "ares_nameser.h"
|
|
34
|
+
|
|
35
|
+
static unsigned short generate_unique_qid(ares_channel_t *channel)
|
|
36
|
+
{
|
|
37
|
+
unsigned short id;
|
|
38
|
+
|
|
39
|
+
do {
|
|
40
|
+
id = ares_generate_new_id(channel->rand_state);
|
|
41
|
+
} while (ares_htable_szvp_get(channel->queries_by_qid, id, NULL));
|
|
42
|
+
|
|
43
|
+
return id;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/* https://datatracker.ietf.org/doc/html/draft-vixie-dnsext-dns0x20-00 */
|
|
47
|
+
static ares_status_t ares_apply_dns0x20(ares_channel_t *channel,
|
|
48
|
+
ares_dns_record_t *dnsrec)
|
|
49
|
+
{
|
|
50
|
+
ares_status_t status = ARES_SUCCESS;
|
|
51
|
+
const char *name = NULL;
|
|
52
|
+
char dns0x20name[256];
|
|
53
|
+
unsigned char randdata[256 / 8];
|
|
54
|
+
size_t len;
|
|
55
|
+
size_t remaining_bits;
|
|
56
|
+
size_t total_bits;
|
|
57
|
+
size_t i;
|
|
58
|
+
|
|
59
|
+
status = ares_dns_record_query_get(dnsrec, 0, &name, NULL, NULL);
|
|
60
|
+
if (status != ARES_SUCCESS) {
|
|
61
|
+
goto done;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
len = ares_strlen(name);
|
|
65
|
+
if (len == 0) {
|
|
66
|
+
return ARES_SUCCESS;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (len >= sizeof(dns0x20name)) {
|
|
70
|
+
status = ARES_EBADNAME;
|
|
71
|
+
goto done;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
memset(dns0x20name, 0, sizeof(dns0x20name));
|
|
75
|
+
|
|
76
|
+
/* Fetch the minimum amount of random data we'd need for the string, which
|
|
77
|
+
* is 1 bit per byte */
|
|
78
|
+
total_bits = ((len + 7) / 8) * 8;
|
|
79
|
+
remaining_bits = total_bits;
|
|
80
|
+
ares_rand_bytes(channel->rand_state, randdata, total_bits / 8);
|
|
81
|
+
|
|
82
|
+
/* Randomly apply 0x20 to name */
|
|
83
|
+
for (i = 0; i < len; i++) {
|
|
84
|
+
size_t bit;
|
|
85
|
+
|
|
86
|
+
/* Only apply 0x20 to alpha characters */
|
|
87
|
+
if (!ares_isalpha(name[i])) {
|
|
88
|
+
dns0x20name[i] = name[i];
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/* coin flip */
|
|
93
|
+
bit = total_bits - remaining_bits;
|
|
94
|
+
if (randdata[bit / 8] & (1 << (bit % 8))) {
|
|
95
|
+
dns0x20name[i] = name[i] | 0x20; /* Set 0x20 */
|
|
96
|
+
} else {
|
|
97
|
+
dns0x20name[i] = (char)(((unsigned char)name[i]) & 0xDF); /* Unset 0x20 */
|
|
98
|
+
}
|
|
99
|
+
remaining_bits--;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
status = ares_dns_record_query_set_name(dnsrec, 0, dns0x20name);
|
|
103
|
+
|
|
104
|
+
done:
|
|
105
|
+
return status;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
ares_status_t ares_send_nolock(ares_channel_t *channel, ares_server_t *server,
|
|
109
|
+
ares_send_flags_t flags,
|
|
110
|
+
const ares_dns_record_t *dnsrec,
|
|
111
|
+
ares_callback_dnsrec callback, void *arg,
|
|
112
|
+
unsigned short *qid)
|
|
113
|
+
{
|
|
114
|
+
ares_query_t *query;
|
|
115
|
+
ares_timeval_t now;
|
|
116
|
+
ares_status_t status;
|
|
117
|
+
unsigned short id = generate_unique_qid(channel);
|
|
118
|
+
const ares_dns_record_t *dnsrec_resp = NULL;
|
|
119
|
+
|
|
120
|
+
ares_tvnow(&now);
|
|
121
|
+
|
|
122
|
+
if (ares_slist_len(channel->servers) == 0) {
|
|
123
|
+
callback(arg, ARES_ENOSERVER, 0, NULL);
|
|
124
|
+
return ARES_ENOSERVER;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if (!(flags & ARES_SEND_FLAG_NOCACHE)) {
|
|
128
|
+
/* Check query cache */
|
|
129
|
+
status = ares_qcache_fetch(channel, &now, dnsrec, &dnsrec_resp);
|
|
130
|
+
if (status != ARES_ENOTFOUND) {
|
|
131
|
+
/* ARES_SUCCESS means we retrieved the cache, anything else is a critical
|
|
132
|
+
* failure, all result in termination */
|
|
133
|
+
callback(arg, status, 0, dnsrec_resp);
|
|
134
|
+
return status;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/* Allocate space for query and allocated fields. */
|
|
139
|
+
query = ares_malloc(sizeof(ares_query_t));
|
|
140
|
+
if (!query) {
|
|
141
|
+
callback(arg, ARES_ENOMEM, 0, NULL); /* LCOV_EXCL_LINE: OutOfMemory */
|
|
142
|
+
return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */
|
|
143
|
+
}
|
|
144
|
+
memset(query, 0, sizeof(*query));
|
|
145
|
+
|
|
146
|
+
query->channel = channel;
|
|
147
|
+
query->qid = id;
|
|
148
|
+
query->timeout.sec = 0;
|
|
149
|
+
query->timeout.usec = 0;
|
|
150
|
+
query->using_tcp =
|
|
151
|
+
(channel->flags & ARES_FLAG_USEVC) ? ARES_TRUE : ARES_FALSE;
|
|
152
|
+
|
|
153
|
+
/* Duplicate Query */
|
|
154
|
+
status = ares_dns_record_duplicate_ex(&query->query, dnsrec);
|
|
155
|
+
if (status != ARES_SUCCESS) {
|
|
156
|
+
/* Sometimes we might get a EBADRESP response from duplicate due to
|
|
157
|
+
* the way it works (write and parse), rewrite it to EBADQUERY. */
|
|
158
|
+
if (status == ARES_EBADRESP) {
|
|
159
|
+
status = ARES_EBADQUERY;
|
|
160
|
+
}
|
|
161
|
+
ares_free(query);
|
|
162
|
+
callback(arg, status, 0, NULL);
|
|
163
|
+
return status;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
ares_dns_record_set_id(query->query, id);
|
|
167
|
+
|
|
168
|
+
if (channel->flags & ARES_FLAG_DNS0x20 && !query->using_tcp) {
|
|
169
|
+
status = ares_apply_dns0x20(channel, query->query);
|
|
170
|
+
if (status != ARES_SUCCESS) {
|
|
171
|
+
/* LCOV_EXCL_START: OutOfMemory */
|
|
172
|
+
callback(arg, status, 0, NULL);
|
|
173
|
+
ares_free_query(query);
|
|
174
|
+
return status;
|
|
175
|
+
/* LCOV_EXCL_STOP */
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/* Fill in query arguments. */
|
|
180
|
+
query->callback = callback;
|
|
181
|
+
query->arg = arg;
|
|
182
|
+
|
|
183
|
+
/* Initialize query status. */
|
|
184
|
+
query->try_count = 0;
|
|
185
|
+
|
|
186
|
+
if (flags & ARES_SEND_FLAG_NORETRY) {
|
|
187
|
+
query->no_retries = ARES_TRUE;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
query->error_status = ARES_SUCCESS;
|
|
191
|
+
query->timeouts = 0;
|
|
192
|
+
|
|
193
|
+
/* Initialize our list nodes. */
|
|
194
|
+
query->node_queries_by_timeout = NULL;
|
|
195
|
+
query->node_queries_to_conn = NULL;
|
|
196
|
+
|
|
197
|
+
/* Chain the query into the list of all queries. */
|
|
198
|
+
query->node_all_queries = ares_llist_insert_last(channel->all_queries, query);
|
|
199
|
+
if (query->node_all_queries == NULL) {
|
|
200
|
+
/* LCOV_EXCL_START: OutOfMemory */
|
|
201
|
+
callback(arg, ARES_ENOMEM, 0, NULL);
|
|
202
|
+
ares_free_query(query);
|
|
203
|
+
return ARES_ENOMEM;
|
|
204
|
+
/* LCOV_EXCL_STOP */
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/* Keep track of queries bucketed by qid, so we can process DNS
|
|
208
|
+
* responses quickly.
|
|
209
|
+
*/
|
|
210
|
+
if (!ares_htable_szvp_insert(channel->queries_by_qid, query->qid, query)) {
|
|
211
|
+
/* LCOV_EXCL_START: OutOfMemory */
|
|
212
|
+
callback(arg, ARES_ENOMEM, 0, NULL);
|
|
213
|
+
ares_free_query(query);
|
|
214
|
+
return ARES_ENOMEM;
|
|
215
|
+
/* LCOV_EXCL_STOP */
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/* Perform the first query action. */
|
|
219
|
+
|
|
220
|
+
status = ares_send_query(server, query, &now);
|
|
221
|
+
if (status == ARES_SUCCESS && qid) {
|
|
222
|
+
*qid = id;
|
|
223
|
+
}
|
|
224
|
+
return status;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
ares_status_t ares_send_dnsrec(ares_channel_t *channel,
|
|
228
|
+
const ares_dns_record_t *dnsrec,
|
|
229
|
+
ares_callback_dnsrec callback, void *arg,
|
|
230
|
+
unsigned short *qid)
|
|
231
|
+
{
|
|
232
|
+
ares_status_t status;
|
|
233
|
+
|
|
234
|
+
if (channel == NULL) {
|
|
235
|
+
return ARES_EFORMERR; /* LCOV_EXCL_LINE: DefensiveCoding */
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
ares_channel_lock(channel);
|
|
239
|
+
|
|
240
|
+
status = ares_send_nolock(channel, NULL, 0, dnsrec, callback, arg, qid);
|
|
241
|
+
|
|
242
|
+
ares_channel_unlock(channel);
|
|
243
|
+
|
|
244
|
+
return status;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
void ares_send(ares_channel_t *channel, const unsigned char *qbuf, int qlen,
|
|
248
|
+
ares_callback callback, void *arg)
|
|
249
|
+
{
|
|
250
|
+
ares_dns_record_t *dnsrec = NULL;
|
|
251
|
+
ares_status_t status;
|
|
252
|
+
void *carg = NULL;
|
|
253
|
+
|
|
254
|
+
if (channel == NULL) {
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/* Verify that the query is at least long enough to hold the header. */
|
|
259
|
+
if (qlen < HFIXEDSZ || qlen >= (1 << 16)) {
|
|
260
|
+
callback(arg, ARES_EBADQUERY, 0, NULL, 0);
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
status = ares_dns_parse(qbuf, (size_t)qlen, 0, &dnsrec);
|
|
265
|
+
if (status != ARES_SUCCESS) {
|
|
266
|
+
callback(arg, (int)status, 0, NULL, 0);
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
carg = ares_dnsrec_convert_arg(callback, arg);
|
|
271
|
+
if (carg == NULL) {
|
|
272
|
+
/* LCOV_EXCL_START: OutOfMemory */
|
|
273
|
+
status = ARES_ENOMEM;
|
|
274
|
+
ares_dns_record_destroy(dnsrec);
|
|
275
|
+
callback(arg, (int)status, 0, NULL, 0);
|
|
276
|
+
return;
|
|
277
|
+
/* LCOV_EXCL_STOP */
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
ares_send_dnsrec(channel, dnsrec, ares_dnsrec_convert_cb, carg, NULL);
|
|
281
|
+
|
|
282
|
+
ares_dns_record_destroy(dnsrec);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
size_t ares_queue_active_queries(const ares_channel_t *channel)
|
|
286
|
+
{
|
|
287
|
+
size_t len;
|
|
288
|
+
|
|
289
|
+
if (channel == NULL) {
|
|
290
|
+
return 0;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
ares_channel_lock(channel);
|
|
294
|
+
|
|
295
|
+
len = ares_llist_len(channel->all_queries);
|
|
296
|
+
|
|
297
|
+
ares_channel_unlock(channel);
|
|
298
|
+
|
|
299
|
+
return len;
|
|
300
|
+
}
|