From 554fd8c5195424bdbcabf5de30fdc183aba391bd Mon Sep 17 00:00:00 2001 From: upstream source tree Date: Sun, 15 Mar 2015 20:14:05 -0400 Subject: obtained gcc-4.6.4.tar.bz2 from upstream website; verified gcc-4.6.4.tar.bz2.sig; imported gcc-4.6.4 source tree from verified upstream tarball. downloading a git-generated archive based on the 'upstream' tag should provide you with a source tree that is binary identical to the one extracted from the above tarball. if you have obtained the source via the command 'git clone', however, do note that line-endings of files in your working directory might differ from line-endings of the respective files in the upstream repository. --- libgo/go/net/hosts.go | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 libgo/go/net/hosts.go (limited to 'libgo/go/net/hosts.go') diff --git a/libgo/go/net/hosts.go b/libgo/go/net/hosts.go new file mode 100644 index 000000000..8525f578d --- /dev/null +++ b/libgo/go/net/hosts.go @@ -0,0 +1,86 @@ +// 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 static host/IP entries from /etc/hosts. + +package net + +import ( + "os" + "sync" +) + +const cacheMaxAge = int64(300) // 5 minutes. + +// hostsPath points to the file with static IP/address entries. +var hostsPath = "/etc/hosts" + +// Simple cache. +var hosts struct { + sync.Mutex + byName map[string][]string + byAddr map[string][]string + time int64 + path string +} + +func readHosts() { + now, _, _ := os.Time() + hp := hostsPath + if len(hosts.byName) == 0 || hosts.time+cacheMaxAge <= now || hosts.path != hp { + hs := make(map[string][]string) + is := make(map[string][]string) + var file *file + if file, _ = open(hp); file == nil { + return + } + for line, ok := file.readLine(); ok; line, ok = file.readLine() { + if i := byteIndex(line, '#'); i >= 0 { + // Discard comments. + line = line[0:i] + } + f := getFields(line) + if len(f) < 2 || ParseIP(f[0]) == nil { + continue + } + for i := 1; i < len(f); i++ { + h := f[i] + hs[h] = append(hs[h], f[0]) + is[f[0]] = append(is[f[0]], h) + } + } + // Update the data cache. + hosts.time, _, _ = os.Time() + hosts.path = hp + hosts.byName = hs + hosts.byAddr = is + file.close() + } +} + +// lookupStaticHosts looks up the addresses for the given host from /etc/hosts. +func lookupStaticHost(host string) []string { + hosts.Lock() + defer hosts.Unlock() + readHosts() + if len(hosts.byName) != 0 { + if ips, ok := hosts.byName[host]; ok { + return ips + } + } + return nil +} + +// rlookupStaticHosts looks up the hosts for the given address from /etc/hosts. +func lookupStaticAddr(addr string) []string { + hosts.Lock() + defer hosts.Unlock() + readHosts() + if len(hosts.byAddr) != 0 { + if hosts, ok := hosts.byAddr[addr]; ok { + return hosts + } + } + return nil +} -- cgit v1.2.3