MIRROR: javascript for 馃悳's, a tiny runtime with big ambitions
1// stub: minimal node:dns implementation (dns.promises.lookup)
2// just enough for vite to resolve localhost addresses
3
4#include <string.h>
5
6#ifdef _WIN32
7#include <winsock2.h>
8#include <ws2tcpip.h>
9#else
10#include <sys/types.h>
11#include <sys/socket.h>
12#include <netdb.h>
13#include <arpa/inet.h>
14#endif
15
16#include "ant.h"
17#include "errors.h"
18
19static ant_value_t dns_promises_lookup(ant_t *js, ant_value_t *args, int nargs) {
20 if (nargs < 1) return js_mkerr(js, "hostname is required");
21
22 size_t len;
23 const char *hostname = js_getstr(js, args[0], &len);
24 if (!hostname) return js_mkerr(js, "hostname must be a string");
25
26 struct addrinfo hints = {0}, *res = NULL;
27 hints.ai_family = AF_UNSPEC;
28 hints.ai_socktype = SOCK_STREAM;
29
30 int err = getaddrinfo(hostname, NULL, &hints, &res);
31 if (err != 0 || !res) {
32 return js_mkerr(js, "getaddrinfo failed for '%s'", hostname);
33 }
34
35 char addr_str[INET6_ADDRSTRLEN];
36 int family = 0;
37
38 if (res->ai_family == AF_INET) {
39 struct sockaddr_in *sa = (struct sockaddr_in *)res->ai_addr;
40 inet_ntop(AF_INET, &sa->sin_addr, addr_str, sizeof(addr_str));
41 family = 4;
42 } else if (res->ai_family == AF_INET6) {
43 struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *)res->ai_addr;
44 inet_ntop(AF_INET6, &sa6->sin6_addr, addr_str, sizeof(addr_str));
45 family = 6;
46 } else {
47 freeaddrinfo(res);
48 return js_mkerr(js, "unsupported address family");
49 }
50
51 freeaddrinfo(res);
52
53 ant_value_t result = js_mkobj(js);
54 js_set(js, result, "address", js_mkstr(js, addr_str, strlen(addr_str)));
55 js_set(js, result, "family", js_mknum(family));
56
57 ant_value_t promise = js_mkpromise(js);
58 js_resolve_promise(js, promise, result);
59 return promise;
60}
61
62ant_value_t dns_library(ant_t *js) {
63 ant_value_t lib = js_mkobj(js);
64 ant_value_t promises = js_mkobj(js);
65
66 js_set(js, promises, "lookup", js_mkfun(dns_promises_lookup));
67 js_set(js, lib, "promises", promises);
68
69 return lib;
70}