// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Read system DNS config from /etc/resolv.conf package net import ( "io"; "net"; "os"; "strconv"; ) type _DNS_Config struct { servers []string; // servers to use search []string; // suffixes to append to local name ndots int; // number of dots in name to trigger absolute lookup timeout int; // seconds before giving up on packet attempts int; // lost packets before giving up on server rotate bool; // round robin among servers } var _DNS_configError *os.Error; // See resolv.conf(5) on a Linux machine. // TODO(rsc): Supposed to call uname() and chop the beginning // of the host name to get the default search domain. // We assume it's in resolv.conf anyway. func _DNS_ReadConfig() (*_DNS_Config, *os.Error) { // TODO(rsc): 6g won't let me say file, err := var file *file; var err *os.Error; file, err = open("/etc/resolv.conf"); if err != nil { return nil, err } conf := new(_DNS_Config); conf.servers = make([]string, 3)[0:0]; // small, but the standard limit conf.search = make([]string, 0); conf.ndots = 1; conf.timeout = 1; conf.attempts = 1; conf.rotate = false; for line, ok := file.readLine(); ok; line, ok = file.readLine() { f := getFields(line); if len(f) < 1 { continue; } switch f[0] { case "nameserver": // add one name server a := conf.servers; n := len(a); if len(f) > 1 && n < cap(a) { // One more check: make sure server name is // just an IP address. Otherwise we need DNS // to look it up. name := f[1]; if len(ParseIP(name)) != 0 { a = a[0:n+1]; a[n] = name; conf.servers = a; } } case "domain": // set search path to just this domain if len(f) > 1 { conf.search = make([]string, 1); conf.search[0] = f[1]; } else { conf.search = make([]string, 0) } case "search": // set search path to given servers conf.search = make([]string, len(f) - 1); for i := 0; i < len(conf.search); i++ { conf.search[i] = f[i+1]; } case "options": // magic options for i := 1; i < len(f); i++ { s := f[i]; switch { case len(s) >= 6 && s[0:6] == "ndots:": n, i, ok := dtoi(s, 6); if n < 1 { n = 1 } conf.ndots = n; case len(s) >= 8 && s[0:8] == "timeout:": n, i, ok := dtoi(s, 8); if n < 1 { n = 1 } conf.timeout = n; case len(s) >= 8 && s[0:9] == "attempts:": n, i, ok := dtoi(s, 9); if n < 1 { n = 1 } conf.attempts = n; case s == "rotate": conf.rotate = true; } } } } file.close(); return conf, nil }