github.com/spotify/syslog-redirector-golang@v0.0.0-20140320174030-4859f03d829a/src/pkg/net/port_unix.go (about) 1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // +build darwin dragonfly freebsd linux netbsd openbsd 6 7 // Read system port mappings from /etc/services 8 9 package net 10 11 import "sync" 12 13 var services map[string]map[string]int 14 var servicesError error 15 var onceReadServices sync.Once 16 17 func readServices() { 18 services = make(map[string]map[string]int) 19 var file *file 20 if file, servicesError = open("/etc/services"); servicesError != nil { 21 return 22 } 23 for line, ok := file.readLine(); ok; line, ok = file.readLine() { 24 // "http 80/tcp www www-http # World Wide Web HTTP" 25 if i := byteIndex(line, '#'); i >= 0 { 26 line = line[0:i] 27 } 28 f := getFields(line) 29 if len(f) < 2 { 30 continue 31 } 32 portnet := f[1] // "tcp/80" 33 port, j, ok := dtoi(portnet, 0) 34 if !ok || port <= 0 || j >= len(portnet) || portnet[j] != '/' { 35 continue 36 } 37 netw := portnet[j+1:] // "tcp" 38 m, ok1 := services[netw] 39 if !ok1 { 40 m = make(map[string]int) 41 services[netw] = m 42 } 43 for i := 0; i < len(f); i++ { 44 if i != 1 { // f[1] was port/net 45 m[f[i]] = port 46 } 47 } 48 } 49 file.close() 50 } 51 52 // goLookupPort is the native Go implementation of LookupPort. 53 func goLookupPort(network, service string) (port int, err error) { 54 onceReadServices.Do(readServices) 55 56 switch network { 57 case "tcp4", "tcp6": 58 network = "tcp" 59 case "udp4", "udp6": 60 network = "udp" 61 } 62 63 if m, ok := services[network]; ok { 64 if port, ok = m[service]; ok { 65 return 66 } 67 } 68 return 0, &AddrError{"unknown port", network + "/" + service} 69 }