// 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 "os"

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) {
	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, _, _ := dtoi(s, 6);
					if n < 1 {
						n = 1
					}
					conf.ndots = n;
				case len(s) >= 8 && s[0:8] == "timeout:":
					n, _, _ := dtoi(s, 8);
					if n < 1 {
						n = 1
					}
					conf.timeout = n;
				case len(s) >= 8 && s[0:9] == "attempts:":
					n, _, _ := dtoi(s, 9);
					if n < 1 {
						n = 1
					}
					conf.attempts = n;
				case s == "rotate":
					conf.rotate = true;
				}
			}
		}
	}
	file.close();

	return conf, nil
}

