| ▲ | frumplestlatz 4 days ago | |||||||
Even once you use the private `dns_config*()` APIs on macOS, you need to put in heavy lifting to correctly handle scoped, service-specific providers, supplemental matching rules, etc -- none of which is documented, and can change in the future. Since you're not using the system resolver, you won't benefit from mDNSResponder's built-in DNS caching and mDNS resolution/caching/service registration, so you're going to need to reimplement all of of that, too. And don't forget about nsswitch on BSD/Linux/Solaris/etc -- there's no generic API that let's you plug into that cleanly, so for a complete implementation there, you need to: - Reimplement built-in modules like `hosts` (for `/etc/hosts`), `cache` (query a local `nscd` cache, etc), and more. - Parse the nsswitch.conf configuration file, including the rule syntax for defining whether to continue/return on different status codes. - Reimplement rule-based dispatch to both the built-in modules and custom, dynamically loaded modules (like `nss_mdns` for mDNS resolution). Each OS has its own set of built-ins, and private/incompatible interfaces for interacting with things like the `nscd` cache daemon. Plus, the nsswitch APIs and config files themselves differ across operating systems. And we haven't even discussed Windows yet. Re-implementing all of this correctly, thoroughly, and keeping it working across OS changes is extremely non-trivial. The simplest and most correct solution is to just: - Use OS-specific async APIs when available; e.g. `CFHostStartInfoResolution()` on macOS, `DnsQueryEx()` on Windows, `getaddrinfo_a()` on glibc (although that spawns a thread, too), etc. - If you have a special use-case where you need absolutely need better performance, and do not need to support all the system resolver functionality above (i.e. server-side, controlled deployment environment), use an event-based async resolver library. - Otherwise, issue a blocking call to `getaddrinfo()` on a new thread. If you're very worried about unbounded resource consumption, use a size-limited thread pool. | ||||||||
| ▲ | dweekly 4 days ago | parent | next [-] | |||||||
Good points, all - there is a lot of subtlety here. CFHostStartInfoResolution is deprecated, no? https://developer.apple.com/documentation/cfnetwork/cfhostst...:) That leaves us with DNSServiceGetAddrInfo? https://developer.apple.com/documentation/dnssd/dnsservicege...:) or some kinda convoluted use of Network and NWEndpoint/NWconnection with continuations could do the same? | ||||||||
| ||||||||
| ▲ | cryptonector 3 days ago | parent | prev | next [-] | |||||||
Browsers don't care about the nsswitch though. There are apps where that complexity can be avoided. | ||||||||
| ▲ | GoblinSlayer 4 days ago | parent | prev [-] | |||||||
Doesn't linux run resolved locally? You just send request there and it handles hosts, cache and whatnot. | ||||||||