1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- //+build linux, darwin
- package net
- /*
- Package net implements cross-platform Berkeley Sockets, DNS resolution and associated procedures.
- For other protocols and their features, see subdirectories of this package.
- */
- /*
- Copyright 2022 Tetralux <[email protected]>
- Copyright 2022 Colin Davidson <[email protected]>
- Copyright 2022 Jeroen van Rijn <[email protected]>.
- Made available under Odin's BSD-3 license.
- List of contributors:
- Tetralux: Initial implementation
- Colin Davidson: Linux platform code, OSX platform code, Odin-native DNS resolver
- Jeroen van Rijn: Cross platform unification, code style, documentation
- */
- import "core:strings"
- @(private)
- _get_dns_records_os :: proc(hostname: string, type: DNS_Record_Type, allocator := context.allocator) -> (records: []DNS_Record, err: DNS_Error) {
- context.allocator = allocator
- if type != .SRV {
- // NOTE(tetra): 'hostname' can contain underscores when querying SRV records
- ok := validate_hostname(hostname)
- if !ok {
- return nil, .Invalid_Hostname_Error
- }
- }
- name_servers, resolve_ok := load_resolv_conf(dns_configuration.resolv_conf)
- defer delete(name_servers)
- if !resolve_ok {
- return nil, .Invalid_Resolv_Config_Error
- }
- if len(name_servers) == 0 {
- return
- }
- hosts, hosts_ok := load_hosts(dns_configuration.hosts_file)
- defer delete(hosts)
- if !hosts_ok {
- return nil, .Invalid_Hosts_Config_Error
- }
- host_overrides := make([dynamic]DNS_Record)
- for host in hosts {
- if strings.compare(host.name, hostname) != 0 {
- continue
- }
- if type == .IP4 && family_from_address(host.addr) == .IP4 {
- record := DNS_Record_IP4{
- base = {
- record_name = strings.clone(hostname),
- ttl_seconds = 0,
- },
- address = host.addr.(IP4_Address),
- }
- append(&host_overrides, record)
- } else if type == .IP6 && family_from_address(host.addr) == .IP6 {
- record := DNS_Record_IP6{
- base = {
- record_name = strings.clone(hostname),
- ttl_seconds = 0,
- },
- address = host.addr.(IP6_Address),
- }
- append(&host_overrides, record)
- }
- }
- if len(host_overrides) > 0 {
- return host_overrides[:], nil
- }
- return get_dns_records_from_nameservers(hostname, type, name_servers, host_overrides[:])
- }
|