visaljs 0.0.9 → 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.
Files changed (232) hide show
  1. package/README.md +12 -4
  2. package/THIRD_PARTY_LICENSES +31 -1
  3. package/cli.js +3745 -890
  4. package/node/include/js_node.h +12 -1
  5. package/node/prelude/_http_common.js +29 -0
  6. package/node/prelude/async_hooks.js +50 -11
  7. package/node/prelude/child_process.js +31 -4
  8. package/node/prelude/console.js +311 -143
  9. package/node/prelude/crypto.js +6 -4
  10. package/node/prelude/dgram.js +1169 -0
  11. package/node/prelude/diagnostics_channel.js +3 -1
  12. package/node/prelude/dns.js +250 -45
  13. package/node/prelude/dns_promises.js +8 -2
  14. package/node/prelude/fs_promises.js +9 -1
  15. package/node/prelude/http.js +405 -94
  16. package/node/prelude/https.js +13 -4
  17. package/node/prelude/internal/console_class.js +7 -0
  18. package/node/prelude/internal/console_global.js +25 -0
  19. package/node/prelude/internal/crypto/key_encryption.js +217 -0
  20. package/node/prelude/internal/crypto/keys.js +161 -26
  21. package/node/prelude/internal/crypto/random.js +24 -0
  22. package/node/prelude/internal/crypto/util.js +2 -1
  23. package/node/prelude/internal/crypto_x509.js +161 -0
  24. package/node/prelude/internal/dns_classes.js +6 -0
  25. package/node/prelude/internal/dns_resolver.js +371 -0
  26. package/node/prelude/internal/errors.js +9 -0
  27. package/node/prelude/internal/events_on.js +82 -37
  28. package/node/prelude/internal/features.js +8 -4
  29. package/node/prelude/internal/fs_filehandle.js +10 -4
  30. package/node/prelude/internal/http_chars.ts +22 -0
  31. package/node/prelude/internal/perf_histogram.js +1 -1
  32. package/node/prelude/internal/process_more.js +32 -17
  33. package/node/prelude/internal/process_signals.js +8 -2
  34. package/node/prelude/internal/punycode.ts +163 -0
  35. package/node/prelude/internal/readline.js +648 -274
  36. package/node/prelude/internal/readline_editor.js +1240 -0
  37. package/node/prelude/internal/string_width.js +43 -0
  38. package/node/prelude/internal/tls/common.js +145 -33
  39. package/node/prelude/internal/tls/wrap.js +182 -49
  40. package/node/prelude/internal/tls/x509.js +4 -1
  41. package/node/prelude/internal/udp.js +177 -0
  42. package/node/prelude/net.js +30 -14
  43. package/node/prelude/os.js +24 -6
  44. package/node/prelude/perf_hooks.js +37 -2
  45. package/node/prelude/punycode.js +2 -130
  46. package/node/prelude/readline.js +113 -4
  47. package/node/prelude/readline_promises.js +56 -32
  48. package/node/prelude/tls.js +21 -4
  49. package/node/prelude/util.js +3 -16
  50. package/node/src/host_dns.c +623 -0
  51. package/node/src/host_http.c +12 -0
  52. package/node/src/host_net.c +46 -0
  53. package/node/src/host_os.c +1 -6
  54. package/node/src/host_sys.c +79 -0
  55. package/node/src/host_udp.c +418 -0
  56. package/node/third_party/c-ares/LICENSE.md +24 -0
  57. package/node/third_party/c-ares/config/darwin/ares_config.h +573 -0
  58. package/node/third_party/c-ares/config/freebsd/ares_config.h +573 -0
  59. package/node/third_party/c-ares/config/linux/ares_config.h +573 -0
  60. package/node/third_party/c-ares/config/openbsd/ares_config.h +583 -0
  61. package/node/third_party/c-ares/include/ares.h +1237 -0
  62. package/node/third_party/c-ares/include/ares_build.h +202 -0
  63. package/node/third_party/c-ares/include/ares_dns.h +127 -0
  64. package/node/third_party/c-ares/include/ares_dns_record.h +1119 -0
  65. package/node/third_party/c-ares/include/ares_nameser.h +510 -0
  66. package/node/third_party/c-ares/include/ares_version.h +47 -0
  67. package/node/third_party/c-ares/src/lib/ares_addrinfo2hostent.c +305 -0
  68. package/node/third_party/c-ares/src/lib/ares_addrinfo_localhost.c +245 -0
  69. package/node/third_party/c-ares/src/lib/ares_android.c +496 -0
  70. package/node/third_party/c-ares/src/lib/ares_android.h +38 -0
  71. package/node/third_party/c-ares/src/lib/ares_cancel.c +87 -0
  72. package/node/third_party/c-ares/src/lib/ares_close_sockets.c +137 -0
  73. package/node/third_party/c-ares/src/lib/ares_conn.c +511 -0
  74. package/node/third_party/c-ares/src/lib/ares_conn.h +202 -0
  75. package/node/third_party/c-ares/src/lib/ares_cookie.c +461 -0
  76. package/node/third_party/c-ares/src/lib/ares_data.c +168 -0
  77. package/node/third_party/c-ares/src/lib/ares_data.h +92 -0
  78. package/node/third_party/c-ares/src/lib/ares_destroy.c +159 -0
  79. package/node/third_party/c-ares/src/lib/ares_free_hostent.c +54 -0
  80. package/node/third_party/c-ares/src/lib/ares_free_string.c +33 -0
  81. package/node/third_party/c-ares/src/lib/ares_freeaddrinfo.c +67 -0
  82. package/node/third_party/c-ares/src/lib/ares_getaddrinfo.c +806 -0
  83. package/node/third_party/c-ares/src/lib/ares_getenv.c +38 -0
  84. package/node/third_party/c-ares/src/lib/ares_getenv.h +34 -0
  85. package/node/third_party/c-ares/src/lib/ares_gethostbyaddr.c +229 -0
  86. package/node/third_party/c-ares/src/lib/ares_gethostbyname.c +341 -0
  87. package/node/third_party/c-ares/src/lib/ares_getnameinfo.c +437 -0
  88. package/node/third_party/c-ares/src/lib/ares_hosts_file.c +960 -0
  89. package/node/third_party/c-ares/src/lib/ares_inet_net_pton.h +31 -0
  90. package/node/third_party/c-ares/src/lib/ares_init.c +631 -0
  91. package/node/third_party/c-ares/src/lib/ares_ipv6.h +115 -0
  92. package/node/third_party/c-ares/src/lib/ares_library_init.c +190 -0
  93. package/node/third_party/c-ares/src/lib/ares_metrics.c +261 -0
  94. package/node/third_party/c-ares/src/lib/ares_options.c +492 -0
  95. package/node/third_party/c-ares/src/lib/ares_parse_into_addrinfo.c +179 -0
  96. package/node/third_party/c-ares/src/lib/ares_private.h +648 -0
  97. package/node/third_party/c-ares/src/lib/ares_process.c +1649 -0
  98. package/node/third_party/c-ares/src/lib/ares_qcache.c +442 -0
  99. package/node/third_party/c-ares/src/lib/ares_query.c +151 -0
  100. package/node/third_party/c-ares/src/lib/ares_search.c +623 -0
  101. package/node/third_party/c-ares/src/lib/ares_send.c +300 -0
  102. package/node/third_party/c-ares/src/lib/ares_set_socket_functions.c +590 -0
  103. package/node/third_party/c-ares/src/lib/ares_setup.h +224 -0
  104. package/node/third_party/c-ares/src/lib/ares_socket.c +427 -0
  105. package/node/third_party/c-ares/src/lib/ares_socket.h +163 -0
  106. package/node/third_party/c-ares/src/lib/ares_sortaddrinfo.c +447 -0
  107. package/node/third_party/c-ares/src/lib/ares_strerror.c +91 -0
  108. package/node/third_party/c-ares/src/lib/ares_sysconfig.c +642 -0
  109. package/node/third_party/c-ares/src/lib/ares_sysconfig_files.c +851 -0
  110. package/node/third_party/c-ares/src/lib/ares_sysconfig_mac.c +373 -0
  111. package/node/third_party/c-ares/src/lib/ares_sysconfig_win.c +673 -0
  112. package/node/third_party/c-ares/src/lib/ares_timeout.c +162 -0
  113. package/node/third_party/c-ares/src/lib/ares_update_servers.c +1376 -0
  114. package/node/third_party/c-ares/src/lib/ares_version.c +36 -0
  115. package/node/third_party/c-ares/src/lib/config-dos.h +114 -0
  116. package/node/third_party/c-ares/src/lib/config-win32.h +396 -0
  117. package/node/third_party/c-ares/src/lib/dsa/ares_array.c +409 -0
  118. package/node/third_party/c-ares/src/lib/dsa/ares_htable.c +451 -0
  119. package/node/third_party/c-ares/src/lib/dsa/ares_htable.h +174 -0
  120. package/node/third_party/c-ares/src/lib/dsa/ares_htable_asvp.c +224 -0
  121. package/node/third_party/c-ares/src/lib/dsa/ares_htable_dict.c +230 -0
  122. package/node/third_party/c-ares/src/lib/dsa/ares_htable_strvp.c +210 -0
  123. package/node/third_party/c-ares/src/lib/dsa/ares_htable_szvp.c +188 -0
  124. package/node/third_party/c-ares/src/lib/dsa/ares_htable_vpstr.c +186 -0
  125. package/node/third_party/c-ares/src/lib/dsa/ares_htable_vpvp.c +194 -0
  126. package/node/third_party/c-ares/src/lib/dsa/ares_llist.c +385 -0
  127. package/node/third_party/c-ares/src/lib/dsa/ares_slist.c +479 -0
  128. package/node/third_party/c-ares/src/lib/dsa/ares_slist.h +207 -0
  129. package/node/third_party/c-ares/src/lib/event/ares_event.h +191 -0
  130. package/node/third_party/c-ares/src/lib/event/ares_event_configchg.c +746 -0
  131. package/node/third_party/c-ares/src/lib/event/ares_event_epoll.c +192 -0
  132. package/node/third_party/c-ares/src/lib/event/ares_event_kqueue.c +248 -0
  133. package/node/third_party/c-ares/src/lib/event/ares_event_poll.c +140 -0
  134. package/node/third_party/c-ares/src/lib/event/ares_event_select.c +159 -0
  135. package/node/third_party/c-ares/src/lib/event/ares_event_thread.c +575 -0
  136. package/node/third_party/c-ares/src/lib/event/ares_event_wake_pipe.c +172 -0
  137. package/node/third_party/c-ares/src/lib/event/ares_event_win32.c +981 -0
  138. package/node/third_party/c-ares/src/lib/event/ares_event_win32.h +161 -0
  139. package/node/third_party/c-ares/src/lib/include/ares_array.h +276 -0
  140. package/node/third_party/c-ares/src/lib/include/ares_buf.h +732 -0
  141. package/node/third_party/c-ares/src/lib/include/ares_htable_asvp.h +130 -0
  142. package/node/third_party/c-ares/src/lib/include/ares_htable_dict.h +123 -0
  143. package/node/third_party/c-ares/src/lib/include/ares_htable_strvp.h +130 -0
  144. package/node/third_party/c-ares/src/lib/include/ares_htable_szvp.h +118 -0
  145. package/node/third_party/c-ares/src/lib/include/ares_htable_vpstr.h +111 -0
  146. package/node/third_party/c-ares/src/lib/include/ares_htable_vpvp.h +128 -0
  147. package/node/third_party/c-ares/src/lib/include/ares_llist.h +239 -0
  148. package/node/third_party/c-ares/src/lib/include/ares_mem.h +41 -0
  149. package/node/third_party/c-ares/src/lib/include/ares_str.h +261 -0
  150. package/node/third_party/c-ares/src/lib/inet_net_pton.c +451 -0
  151. package/node/third_party/c-ares/src/lib/inet_ntop.c +219 -0
  152. package/node/third_party/c-ares/src/lib/legacy/ares_create_query.c +78 -0
  153. package/node/third_party/c-ares/src/lib/legacy/ares_expand_name.c +99 -0
  154. package/node/third_party/c-ares/src/lib/legacy/ares_expand_string.c +107 -0
  155. package/node/third_party/c-ares/src/lib/legacy/ares_fds.c +80 -0
  156. package/node/third_party/c-ares/src/lib/legacy/ares_getsock.c +85 -0
  157. package/node/third_party/c-ares/src/lib/legacy/ares_parse_a_reply.c +107 -0
  158. package/node/third_party/c-ares/src/lib/legacy/ares_parse_aaaa_reply.c +109 -0
  159. package/node/third_party/c-ares/src/lib/legacy/ares_parse_caa_reply.c +137 -0
  160. package/node/third_party/c-ares/src/lib/legacy/ares_parse_mx_reply.c +110 -0
  161. package/node/third_party/c-ares/src/lib/legacy/ares_parse_naptr_reply.c +132 -0
  162. package/node/third_party/c-ares/src/lib/legacy/ares_parse_ns_reply.c +154 -0
  163. package/node/third_party/c-ares/src/lib/legacy/ares_parse_ptr_reply.c +213 -0
  164. package/node/third_party/c-ares/src/lib/legacy/ares_parse_soa_reply.c +115 -0
  165. package/node/third_party/c-ares/src/lib/legacy/ares_parse_srv_reply.c +114 -0
  166. package/node/third_party/c-ares/src/lib/legacy/ares_parse_txt_reply.c +144 -0
  167. package/node/third_party/c-ares/src/lib/legacy/ares_parse_uri_reply.c +113 -0
  168. package/node/third_party/c-ares/src/lib/record/ares_dns_mapping.c +982 -0
  169. package/node/third_party/c-ares/src/lib/record/ares_dns_multistring.c +309 -0
  170. package/node/third_party/c-ares/src/lib/record/ares_dns_multistring.h +72 -0
  171. package/node/third_party/c-ares/src/lib/record/ares_dns_name.c +736 -0
  172. package/node/third_party/c-ares/src/lib/record/ares_dns_parse.c +1360 -0
  173. package/node/third_party/c-ares/src/lib/record/ares_dns_private.h +273 -0
  174. package/node/third_party/c-ares/src/lib/record/ares_dns_record.c +1701 -0
  175. package/node/third_party/c-ares/src/lib/record/ares_dns_write.c +1229 -0
  176. package/node/third_party/c-ares/src/lib/str/ares_buf.c +1510 -0
  177. package/node/third_party/c-ares/src/lib/str/ares_str.c +562 -0
  178. package/node/third_party/c-ares/src/lib/str/ares_strsplit.c +90 -0
  179. package/node/third_party/c-ares/src/lib/str/ares_strsplit.h +51 -0
  180. package/node/third_party/c-ares/src/lib/thirdparty/apple/dnsinfo.h +122 -0
  181. package/node/third_party/c-ares/src/lib/util/ares_iface_ips.c +640 -0
  182. package/node/third_party/c-ares/src/lib/util/ares_iface_ips.h +140 -0
  183. package/node/third_party/c-ares/src/lib/util/ares_math.c +167 -0
  184. package/node/third_party/c-ares/src/lib/util/ares_math.h +58 -0
  185. package/node/third_party/c-ares/src/lib/util/ares_rand.c +389 -0
  186. package/node/third_party/c-ares/src/lib/util/ares_rand.h +36 -0
  187. package/node/third_party/c-ares/src/lib/util/ares_threads.c +613 -0
  188. package/node/third_party/c-ares/src/lib/util/ares_threads.h +60 -0
  189. package/node/third_party/c-ares/src/lib/util/ares_time.h +49 -0
  190. package/node/third_party/c-ares/src/lib/util/ares_timeval.c +95 -0
  191. package/node/third_party/c-ares/src/lib/util/ares_uri.c +1627 -0
  192. package/node/third_party/c-ares/src/lib/util/ares_uri.h +252 -0
  193. package/node/third_party/c-ares/src/lib/windows_port.c +29 -0
  194. package/package.json +1 -1
  195. package/prebuilt/darwin-arm64/cares-a6286c65ca9374a3.a +0 -0
  196. package/prebuilt/darwin-x64/cares-a6286c65ca9374a3.a +0 -0
  197. package/prebuilt/linux-arm64/cares-4ba05ac8e948af8e.a +0 -0
  198. package/prebuilt/linux-arm64-musl/cares-4ba05ac8e948af8e.a +0 -0
  199. package/prebuilt/linux-x64/cares-4ba05ac8e948af8e.a +0 -0
  200. package/prebuilt/linux-x64-musl/cares-4ba05ac8e948af8e.a +0 -0
  201. package/prebuilt/win32-x64/boringssl-ce573858472b7fc9.a +0 -0
  202. package/prebuilt/win32-x64/brotli-20d86a61f30baeb3.a +0 -0
  203. package/prebuilt/win32-x64/cares-49c9ec95162b912d.a +0 -0
  204. package/prebuilt/win32-x64/uv-b11bae65d7fced82.a +0 -0
  205. package/prebuilt/win32-x64/zlib-4ce2317a4c3f5fb5.a +0 -0
  206. package/prebuilt/win32-x64/zstd-015315ac7c784c73.a +0 -0
  207. package/runtime/include/js_buffer.h +185 -0
  208. package/runtime/include/js_builtins.h +58 -0
  209. package/runtime/include/js_crypto.h +11 -0
  210. package/runtime/include/js_exception.h +3 -0
  211. package/runtime/include/js_function.h +1 -1
  212. package/runtime/include/js_gc.h +13 -10
  213. package/runtime/include/js_jobs.h +2 -0
  214. package/runtime/include/js_object.h +79 -3
  215. package/runtime/include/js_ops.h +27 -0
  216. package/runtime/include/js_runtime.h +1 -0
  217. package/runtime/include/js_web.h +0 -3
  218. package/runtime/include/jscontext.h +8 -0
  219. package/runtime/src/builtins.c +17 -4
  220. package/runtime/src/crypto_internal.h +1 -0
  221. package/runtime/src/crypto_subtle.c +66 -7
  222. package/runtime/src/crypto_tls.c +265 -19
  223. package/runtime/src/function.c +37 -10
  224. package/runtime/src/gc.c +76 -93
  225. package/runtime/src/inspect.c +18 -1
  226. package/runtime/src/iterator.c +5 -1
  227. package/runtime/src/jobs.c +37 -22
  228. package/runtime/src/object.c +91 -8
  229. package/runtime/src/os.c +16 -6
  230. package/runtime/src/os.h +2 -0
  231. package/runtime/src/process.c +97 -10
  232. package/runtime/src/typedarray.c +23 -0
@@ -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
+ }