MIRROR: javascript for 馃悳's, a tiny runtime with big ambitions
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at mir/inline-method 70 lines 1.9 kB view raw
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}